feat(WMS/WCS): 增加机器人历史信息记录
fix(WMS/WCS): 修复前端bug
| | |
| | | let loadingInstance; |
| | | let loadingStatus = false; |
| | | if (process.env.NODE_ENV == 'development') { |
| | | axios.defaults.baseURL = window.webConfig.webApiProduction; |
| | | axios.defaults.baseURL = window.webConfig.webApiBaseUrl; |
| | | } |
| | | else if (process.env.NODE_ENV == 'debug') { |
| | | axios.defaults.baseURL = window.webConfig.webApiBaseUrl; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // 该æ©å±æä»¶ç¨äºä»»å¡åå²é¡µé¢çä¸å¡æ©å±ã
|
| | | // æ¹æ³ç®çï¼ç»ä¸é¢çå表æ¥è¯¢ãä¿ååååå¼¹çªæå¼æ¶çæ©å±å
¥å£ï¼ä¿æä¸é¡¹ç®å
task 页é¢ä¸è´çæ©å±ç¹ã
|
| | | // åæ°å«ä¹ï¼ç±æ¡æ¶æçå½å¨æä¼ å
¥ï¼å
嫿¥è¯¢åæ°ãè¡¨åæ°æ®ãè¡æ°æ®çä¸ä¸æã
|
| | | // è¿åå¼è¯´æï¼è¿å true 代表继ç»é»è®¤è¡ä¸ºï¼è¿å false ä»£è¡¨ä¸æé»è®¤è¡ä¸ºã
|
| | | // å¼å¸¸å¤ç说æï¼å½åæªå¼å
¥å¤é¨è°ç¨ï¼è¥åç»æ°å¢æ¥å£è°ç¨ï¼é卿¹æ³å
è¡¥å
try-catch å¹¶è®°å½å
³é®ä¸å¡åæ°ã
|
| | |
|
| | | let extension = {
|
| | | components: {
|
| | | gridHeader: "",
|
| | | gridBody: "",
|
| | | gridFooter: "",
|
| | | modelHeader: "",
|
| | | modelBody: "",
|
| | | modelFooter: "",
|
| | | },
|
| | | tableAction: "",
|
| | | buttons: { view: [], box: [], detail: [] },
|
| | | methods: {
|
| | | // æ¹æ³ç®çï¼é¡µé¢åå§åæ¶æ§è¡èªå®ä¹é»è¾ã
|
| | | // åæ°ï¼æ ã
|
| | | // è¿åå¼ï¼æ ã
|
| | | onInit() {},
|
| | |
|
| | | // æ¹æ³ç®çï¼é¡µé¢åå§å宿忧è¡èªå®ä¹é»è¾ã
|
| | | // åæ°ï¼æ ã
|
| | | // è¿åå¼ï¼æ ã
|
| | | onInited() {},
|
| | |
|
| | | // æ¹æ³ç®çï¼æ¥è¯¢åå¤çæ¥è¯¢æ¡ä»¶ã
|
| | | // åæ°ï¼param æ¥è¯¢åæ°å¯¹è±¡ã
|
| | | // è¿åå¼ï¼true ç»§ç»æ¥è¯¢ï¼false ç»æ¢æ¥è¯¢ã
|
| | | searchBefore(param) {
|
| | | return true;
|
| | | },
|
| | |
|
| | | // æ¹æ³ç®çï¼æ¥è¯¢åå¤çè¿åç»æã
|
| | | // åæ°ï¼result å端è¿åæ°æ®ã
|
| | | // è¿åå¼ï¼true ç»§ç»æ¸²æï¼false ç»æ¢åç»å¤çã
|
| | | searchAfter(result) {
|
| | | return true;
|
| | | },
|
| | |
|
| | | // æ¹æ³ç®çï¼æ°å¢åæ ¡éªæè¡¥å
æäº¤å段ã
|
| | | // åæ°ï¼formData 表åæäº¤å¯¹è±¡ã
|
| | | // è¿åå¼ï¼true ç»§ç»æäº¤ï¼false ç»æ¢æäº¤ã
|
| | | addBefore(formData) {
|
| | | return true;
|
| | | },
|
| | |
|
| | | // æ¹æ³ç®çï¼ç¼è¾åæ ¡éªæè¡¥å
æäº¤å段ã
|
| | | // åæ°ï¼formData 表åæäº¤å¯¹è±¡ã
|
| | | // è¿åå¼ï¼true ç»§ç»æäº¤ï¼false ç»æ¢æäº¤ã
|
| | | updateBefore(formData) {
|
| | | return true;
|
| | | },
|
| | |
|
| | | // æ¹æ³ç®çï¼ç¹å»è¡æ¶æ©å±å¤çã
|
| | | // åæ°ï¼row è¡æ°æ®ï¼column åé
ç½®ï¼event åå§äºä»¶ã
|
| | | // è¿åå¼ï¼æ ã
|
| | | rowClick({ row, column, event }) {},
|
| | |
|
| | | // æ¹æ³ç®çï¼ç¼è¾å¼¹çªæå¼åæ§è¡æ©å±é»è¾ã
|
| | | // åæ°ï¼row å½åè¡æ°æ®ã
|
| | | // è¿åå¼ï¼æ ã
|
| | | modelOpenAfter(row) {},
|
| | | },
|
| | | };
|
| | |
|
| | | export default extension;
|
| | |
| | | let viewgird = [ |
| | | { |
| | | path: '/Sys_Log', |
| | | name: 'sys_Log', |
| | | component: () => import('@/views/system/Sys_Log.vue') |
| | | path: "/Sys_Log", |
| | | name: "sys_Log", |
| | | component: () => import("@/views/system/Sys_Log.vue"), |
| | | }, |
| | | { |
| | | path: '/Sys_User', |
| | | name: 'Sys_User', |
| | | component: () => import('@/views/system/Sys_User.vue') |
| | | path: "/Sys_User", |
| | | name: "Sys_User", |
| | | component: () => import("@/views/system/Sys_User.vue"), |
| | | }, |
| | | { |
| | | path: '/permission', |
| | | name: 'permission', |
| | | component: () => import('@/views/system/Permission.vue') |
| | | path: "/permission", |
| | | name: "permission", |
| | | component: () => import("@/views/system/Permission.vue"), |
| | | }, |
| | | { |
| | | path: '/Sys_Dictionary', |
| | | name: 'Sys_Dictionary', |
| | | component: () => import('@/views/system/Sys_Dictionary.vue') |
| | | path: "/Sys_Dictionary", |
| | | name: "Sys_Dictionary", |
| | | component: () => import("@/views/system/Sys_Dictionary.vue"), |
| | | }, |
| | | { |
| | | path: '/Sys_Role', |
| | | name: 'Sys_Role', |
| | | component: () => import('@/views/system/Sys_Role.vue') |
| | | path: "/Sys_Role", |
| | | name: "Sys_Role", |
| | | component: () => import("@/views/system/Sys_Role.vue"), |
| | | }, |
| | | { |
| | | path: '/Sys_Role1', |
| | | name: 'Sys_Role1', |
| | | component: () => import('@/views/system/Sys_Role1.vue') |
| | | path: "/Sys_Role1", |
| | | name: "Sys_Role1", |
| | | component: () => import("@/views/system/Sys_Role1.vue"), |
| | | }, |
| | | { |
| | | path: '/Sys_DictionaryList', |
| | | name: 'Sys_DictionaryList', |
| | | component: () => import('@/views/system/Sys_DictionaryList.vue') |
| | | path: "/Sys_DictionaryList", |
| | | name: "Sys_DictionaryList", |
| | | component: () => import("@/views/system/Sys_DictionaryList.vue"), |
| | | }, |
| | | { |
| | | path: '/Sys_Tenant', |
| | | name: 'Sys_Tenant', |
| | | component: () => import('@/views/system/Sys_Tenant.vue') |
| | | path: "/Sys_Tenant", |
| | | name: "Sys_Tenant", |
| | | component: () => import("@/views/system/Sys_Tenant.vue"), |
| | | }, |
| | | { |
| | | path: '/deviceInfo', |
| | | name: 'deviceInfo', |
| | | component: () => import('@/views/quartzJob/deviceInfo.vue') |
| | | path: "/deviceInfo", |
| | | name: "deviceInfo", |
| | | component: () => import("@/views/quartzJob/deviceInfo.vue"), |
| | | }, |
| | | { |
| | | path: '/deviceProtocol', |
| | | name: 'deviceProtocol', |
| | | component: () => import('@/views/quartzJob/deviceProtocol.vue') |
| | | path: "/deviceProtocol", |
| | | name: "deviceProtocol", |
| | | component: () => import("@/views/quartzJob/deviceProtocol.vue"), |
| | | }, |
| | | { |
| | | path: '/deviceProtocolDetail', |
| | | name: 'deviceProtocolDetail', |
| | | component: () => import('@/views/quartzJob/deviceProtocolDetail.vue') |
| | | path: "/deviceProtocolDetail", |
| | | name: "deviceProtocolDetail", |
| | | component: () => import("@/views/quartzJob/deviceProtocolDetail.vue"), |
| | | }, |
| | | { |
| | | path: '/dispatchInfo', |
| | | name: 'dispatchInfo', |
| | | component: () => import('@/views/quartzJob/dispatchInfo.vue') |
| | | path: "/dispatchInfo", |
| | | name: "dispatchInfo", |
| | | component: () => import("@/views/quartzJob/dispatchInfo.vue"), |
| | | }, |
| | | { |
| | | path: '/scheduler', |
| | | name: 'scheduler', |
| | | component: () => import('@/views/quartzJob/scheduler.vue') |
| | | },{ |
| | | path: '/robotTask', |
| | | name: 'robotTask', |
| | | component: () => import('@/views/taskinfo/robotTask.vue') |
| | | path: "/scheduler", |
| | | name: "scheduler", |
| | | component: () => import("@/views/quartzJob/scheduler.vue"), |
| | | }, |
| | | { |
| | | path: '/robotState', |
| | | name: 'robotState', |
| | | component: () => import('@/views/taskinfo/robotState.vue') |
| | | path: "/robotTask", |
| | | name: "robotTask", |
| | | component: () => import("@/views/taskinfo/robotTask.vue"), |
| | | }, |
| | | { |
| | | path: '/task', |
| | | name: 'task', |
| | | component: () => import('@/views/taskinfo/task.vue') |
| | | },{ |
| | | path: '/agvTask', |
| | | name: 'agvTask', |
| | | component: () => import('@/views/taskinfo/agvTask.vue') |
| | | path: "/robotTaskHty", |
| | | name: "robotTaskHty", |
| | | component: () => import("@/views/taskinfo/robotTaskHty.vue"), |
| | | }, |
| | | { |
| | | path: '/taskHty', |
| | | name: 'taskHty', |
| | | component: () => import('@/views/taskinfo/taskHty.vue') |
| | | path: "/robotState", |
| | | name: "robotState", |
| | | component: () => import("@/views/taskinfo/robotState.vue"), |
| | | }, |
| | | { |
| | | path: '/router', |
| | | name: 'router', |
| | | component: () => import('@/views/basicinfo/router.vue') |
| | | } |
| | | path: "/task", |
| | | name: "task", |
| | | component: () => import("@/views/taskinfo/task.vue"), |
| | | }, |
| | | { |
| | | path: "/agvTask", |
| | | name: "agvTask", |
| | | component: () => import("@/views/taskinfo/agvTask.vue"), |
| | | }, |
| | | { |
| | | path: "/taskHty", |
| | | name: "taskHty", |
| | | component: () => import("@/views/taskinfo/taskHty.vue"), |
| | | }, |
| | | { |
| | | path: "/router", |
| | | name: "router", |
| | | component: () => import("@/views/basicinfo/router.vue"), |
| | | }, |
| | | ]; |
| | | |
| | | export default viewgird; |
| | |
| | | export default defineComponent({ |
| | | setup() { |
| | | const table = ref({ |
| | | key: "Id", |
| | | key: "id", |
| | | footer: "Foots", |
| | | cnName: "æºæ¢°æç¶æç®¡ç", |
| | | name: "robotState", |
| | | url: "/robotState/", |
| | | sortName: "IPAddress", |
| | | url: "/RobotState/", |
| | | sortName: "CreateDate", |
| | | }); |
| | | |
| | | // ç¼è¾è¡¨ååæ®µ |
| | | const editFormFields = ref({ |
| | | IPAddress: "", |
| | | Version: "", |
| | | IsEventSubscribed: false, |
| | | RobotRunMode: "", |
| | | RobotControlMode: "", |
| | | RobotArmObject: "", |
| | | Homed: "", |
| | | CurrentAction: "", |
| | | OperStatus: "", |
| | | RobotTaskTotalNum: 0, |
| | | IsSplitPallet: false, |
| | | IsGroupPallet: false, |
| | | IsInFakeBatteryMode: false, |
| | | CurrentBatchIndex: 1, |
| | | ChangePalletPhase: 0, |
| | | IsScanNG: false, |
| | | BatteryArrived: false, |
| | | id: "", |
| | | ipAddress: "", |
| | | version: "", |
| | | isEventSubscribed: false, |
| | | robotRunMode: "", |
| | | robotControlMode: "", |
| | | robotArmObject: "", |
| | | homed: "", |
| | | currentAction: "", |
| | | operStatus: "", |
| | | robotTaskTotalNum: 0, |
| | | isSplitPallet: false, |
| | | isGroupPallet: false, |
| | | isInFakeBatteryMode: false, |
| | | currentBatchIndex: 1, |
| | | changePalletPhase: 0, |
| | | isScanNG: false, |
| | | batteryArrived: false, |
| | | }); |
| | | |
| | | // ç¼è¾è¡¨åé
ç½® |
| | | const editFormOptions = ref([ |
| | | [ |
| | | { title: "IPå°å", field: "ipAddress", type: "string", readonly: true }, |
| | | { title: "çæ¬å·", field: "version", type: "int", readonly: true }, |
| | | ], |
| | | // [ |
| | | // { title: "IPå°å", field: "ipAddress", type: "string", readonly: true }, |
| | | // { title: "çæ¬å·", field: "version", type: "int", readonly: true }, |
| | | // ], |
| | | [ |
| | | { |
| | | title: "è¿è¡æ¨¡å¼", |
| | |
| | | { key: 2, value: "èªå¨æ¨¡å¼" }, |
| | | ], |
| | | }, |
| | | // { |
| | | // title: "æ§å¶æ¨¡å¼", |
| | | // field: "robotControlMode", |
| | | // type: "select", |
| | | // data: [ |
| | | // { key: 1, value: "客æ·ç«¯æ§å¶" }, |
| | | // { key: 2, value: "å
¶ä»" }, |
| | | // ], |
| | | // }, |
| | | // { |
| | | // title: "æèç¶æ", |
| | | // field: "robotArmObject", |
| | | // type: "select", |
| | | // data: [ |
| | | // { key: 0, value: "空é²" }, |
| | | // { key: 1, value: "æç©æ" }, |
| | | // ], |
| | | // }, |
| | | { |
| | | title: "æ§å¶æ¨¡å¼", |
| | | field: "robotControlMode", |
| | | type: "select", |
| | | title: "åé¶ç¶æ", field: "homed", type: "select", |
| | | data: [ |
| | | { key: 1, value: "客æ·ç«¯æ§å¶" }, |
| | | { key: 2, value: "å
¶ä»" }, |
| | | ], |
| | | { key: "Homed", value: "å·²ç»åé¶" }, |
| | | { key: "Homing", value: "æ£å¨åé¶" }, |
| | | ] |
| | | }, |
| | | { |
| | | title: "æèç¶æ", |
| | | field: "robotArmObject", |
| | | type: "select", |
| | | title: "å½åå¨ä½", field: "currentAction", type: "select", |
| | | data: [ |
| | | { key: 0, value: "空é²" }, |
| | | { key: 1, value: "æç©æ" }, |
| | | ], |
| | | { key: "Picking", value: "æ£å¨åè´§" }, |
| | | { key: "Putting", value: "æ£å¨æ¾è´§" }, |
| | | { key: "AllPickFinished", value: "å
¨é¨åè´§å®æ" }, |
| | | { key: "AllPutFinished", value: "å
¨é¨æ¾è´§å®æ" }, |
| | | { key: "PickFinished", value: "åè´§å®æ" }, |
| | | { key: "PutFinished", value: "æ¾è´§å®æ" }, |
| | | ] |
| | | }, |
| | | ], |
| | | [ |
| | | { title: "åé¶ç¶æ", field: "homed", type: "string" }, |
| | | { title: "å½åå¨ä½", field: "currentAction", type: "string" }, |
| | | { title: "è¿è¡ç¶æ", field: "operStatus", type: "string" }, |
| | | // ], |
| | | // [ |
| | | |
| | | // { title: "è¿è¡ç¶æ", field: "operStatus", type: "string" }, |
| | | ], |
| | | [ |
| | | { title: "任塿»æ°", field: "robotTaskTotalNum", type: "int" }, |
| | |
| | | dataKey: "isTrue", |
| | | data: [], |
| | | }, |
| | | { |
| | | title: "æ¶æ¯å·²è®¢é
", |
| | | field: "isEventSubscribed", |
| | | type: "select", |
| | | dataKey: "isTrue", |
| | | data: [], |
| | | }, |
| | | // { |
| | | // title: "æ¶æ¯å·²è®¢é
", |
| | | // field: "isEventSubscribed", |
| | | // type: "select", |
| | | // dataKey: "isTrue", |
| | | // data: [], |
| | | // }, |
| | | ], |
| | | ]); |
| | | |
| | | // æç´¢è¡¨ååæ®µ |
| | | const searchFormFields = ref({ |
| | | IPAddress: "", |
| | | CurrentAction: "", |
| | | OperStatus: "", |
| | | ipAddress: "", |
| | | currentAction: "", |
| | | operStatus: "", |
| | | }); |
| | | |
| | | // æç´¢è¡¨åé
ç½® |
| | | const searchFormOptions = ref([ |
| | | [ |
| | | { title: "IPå°å", field: "ipAddress", type: "string" }, |
| | | { title: "IPå°å", field: "ipAddress", type: "like" }, |
| | | { title: "å½åå¨ä½", field: "currentAction", type: "string" }, |
| | | { title: "è¿è¡ç¶æ", field: "operStatus", type: "string" }, |
| | | { |
| | | title: "è¿è¡ç¶æ", field: "operStatus", type: "select", |
| | | data: [ |
| | | { key: "Picking", value: "æ£å¨åè´§" }, |
| | | { key: "Putting", value: "æ£å¨æ¾è´§" }, |
| | | { key: "AllPickFinished", value: "å
¨é¨åè´§å®æ" }, |
| | | { key: "AllPutFinished", value: "å
¨é¨æ¾è´§å®æ" }, |
| | | { key: "PickFinished", value: "åè´§å®æ" }, |
| | | { key: "PutFinished", value: "æ¾è´§å®æ" }, |
| | | ] |
| | | }, |
| | | ], |
| | | ]); |
| | | |
| | | // åå®ä¹ |
| | | const columns = ref([ |
| | | { field: "ipAddress", title: "IPå°å", type: "string", width: 140, align: "left" }, |
| | | { field: "id", title: "Id", type: "int", width: 90, hidden: true, readonly: true, require: true, align: "left" }, |
| | | { field: "ipAddress", title: "IPå°å", type: "string", width: 160, align: "left" }, |
| | | { field: "version", title: "çæ¬", type: "int", width: 80, align: "left" }, |
| | | { field: "robotRunMode", title: "è¿è¡æ¨¡å¼", type: "int", width: 100, bind: { key: "robotRunMode", data: [{ key: 1, value: "æå¨æ¨¡å¼" }, { key: 2, value: "èªå¨æ¨¡å¼" }] }, align: "center" }, |
| | | { field: "robotControlMode", title: "æ§å¶æ¨¡å¼", type: "int", width: 100, bind: { key: "robotControlMode", data: [{ key: 1, value: "客æ·ç«¯æ§å¶" }, { key: 2, value: "å
¶ä»" }] }, align: "center" }, |
| | | { field: "robotArmObject", title: "æèç¶æ", type: "int", width: 90, bind: { key: "robotArmObject", data: [{ key: 0, value: "空é²" }, { key: 1, value: "æç©æ" }] }, align: "center" }, |
| | | // { field: "robotControlMode", title: "æ§å¶æ¨¡å¼", type: "int", width: 100, bind: { key: "robotControlMode", data: [{ key: 1, value: "客æ·ç«¯æ§å¶" }, { key: 2, value: "å
¶ä»" }] }, align: "center" }, |
| | | // { field: "robotArmObject", title: "æèç¶æ", type: "int", width: 90, bind: { key: "robotArmObject", data: [{ key: 0, value: "空é²" }, { key: 1, value: "æç©æ" }] }, align: "center" }, |
| | | { field: "homed", title: "åé¶ç¶æ", type: "string", width: 100, align: "center", bind: { key: "homed", data: [{ key: "Homed", value: "åé¶" }, { key: "Homing", value: "åé¶ä¸" }] }, }, |
| | | { field: "currentAction", title: "å½åå¨ä½", type: "string", width: 100, align: "center", bind: { key: "currentAction", data: [{ key: "Picking", value: "æ£å¨åè´§" }, { key: "Putting", value: "æ£å¨æ¾è´§" }, { key: "AllPickFinished", value: "å
¨é¨åè´§å®æ" }, { key: "AllPutFinished", value: "å
¨é¨æ¾è´§å®æ" }, { key: "PickFinished", value: "åè´§å®æ" }, { key: "PutFinished", value: "æ¾è´§å®æ" }] }, }, |
| | | { field: "operStatus", title: "è¿è¡ç¶æ", type: "string", width: 100, align: "center", hidden: true }, |
| | | // { field: "operStatus", title: "è¿è¡ç¶æ", type: "string", width: 100, align: "center", hidden: true }, |
| | | { field: "robotTaskTotalNum", title: "任塿»æ°", type: "int", width: 90, align: "center" }, |
| | | { field: "isSplitPallet", title: "æç", type: "byte", width: 60, align: "center", bind: { key: "isTrue", data: [] }, }, |
| | | { field: "isGroupPallet", title: "ç»ç", type: "byte", width: 60, align: "center" , bind: { key: "isTrue", data: [] }, }, |
| | |
| | | { field: "changePalletPhase", title: "æ¢çé¶æ®µ", type: "int", width: 80, align: "center" }, |
| | | { field: "isScanNG", title: "æ«ç NG", type: "byte", width: 80, align: "center" , bind: { key: "isTrue", data: [] }, }, |
| | | { field: "batteryArrived", title: "çµè¯å°ä½", type: "byte", width: 80, align: "center" , bind: { key: "isTrue", data: [] }, }, |
| | | { field: "isEventSubscribed", title: "已订é
", type: "byte", width: 70, align: "center", bind: { key: "isTrue", data: [] }, }, |
| | | // { field: "isEventSubscribed", title: "已订é
", type: "byte", width: 70, align: "center", bind: { key: "isTrue", data: [] }, }, |
| | | ]); |
| | | |
| | | const detail = ref({ |
| | |
| | | field: "robotRoadway", |
| | | title: "å··é", |
| | | type: "string", |
| | | width: 100, |
| | | width: 120, |
| | | align: "left", |
| | | }, |
| | | { |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template>
|
| | | <view-grid
|
| | | ref="grid"
|
| | | :columns="columns"
|
| | | :detail="detail"
|
| | | :editFormFields="editFormFields"
|
| | | :editFormOptions="editFormOptions"
|
| | | :searchFormFields="searchFormFields"
|
| | | :searchFormOptions="searchFormOptions"
|
| | | :table="table"
|
| | | :extend="extend"
|
| | | >
|
| | | </view-grid>
|
| | | </template>
|
| | |
|
| | | <script>
|
| | | import extend from "@/extension/taskinfo/robotTaskHty.jsx";
|
| | | import { ref, defineComponent } from "vue";
|
| | |
|
| | | export default defineComponent({
|
| | | setup() {
|
| | | const table = ref({
|
| | | key: "robotTaskId", // 主é®å段å
|
| | | footer: "Foots",
|
| | | cnName: "æºå¨äººåå²ä»»å¡", // 䏿åç§°
|
| | | name: "robotTaskHty", // 表å
|
| | | url: "/RobotTask_Hty/", // APIè·¯å¾
|
| | | sortName: "insertTime", // é»è®¤æåºåæ®µï¼æç§»å
¥æ¶é´æåºï¼
|
| | | });
|
| | |
|
| | | // ç¼è¾è¡¨ååæ®µï¼åå²è¡¨é常åªè¯»ï¼ä½ä¿çç»æï¼
|
| | | const editFormFields = ref({});
|
| | |
|
| | | // ç¼è¾è¡¨åé
ç½®ï¼åå²è¡¨é常åªè¯»ï¼
|
| | | const editFormOptions = ref([]);
|
| | |
|
| | | // æç´¢è¡¨ååæ®µ
|
| | | const searchFormFields = ref({
|
| | | robotTaskNum: "",
|
| | | robotRoadway: "",
|
| | | robotTaskType: "",
|
| | | robotTaskState: "",
|
| | | robotSourceAddress: "",
|
| | | robotTargetAddress: "",
|
| | | operateType: "",
|
| | | insertTime: "",
|
| | | creater: "",
|
| | | createDate: "",
|
| | | });
|
| | |
|
| | | // æç´¢è¡¨åé
ç½®ï¼ä¸è¡å¸å±ï¼
|
| | | const searchFormOptions = ref([
|
| | | [
|
| | | { title: "ä»»å¡ç¼å·", field: "robotTaskNum", type: "int" },
|
| | | { title: "å··é", field: "robotRoadway", type: "like" },
|
| | | {
|
| | | title: "ä»»å¡ç±»å",
|
| | | field: "robotTaskType",
|
| | | type: "selectList",
|
| | | dataKey: "taskType",
|
| | | data: [],
|
| | | },
|
| | | {
|
| | | title: "ä»»å¡ç¶æ",
|
| | | field: "robotTaskState",
|
| | | type: "selectList",
|
| | | dataKey: "taskState",
|
| | | data: [],
|
| | | },
|
| | | ],
|
| | | [
|
| | | { title: "æ¥æºå°å", field: "robotSourceAddress", type: "like" },
|
| | | { title: "ç®æ å°å", field: "robotTargetAddress", type: "like" },
|
| | | { title: "æä½ç±»å", field: "operateType", type: "like" },
|
| | | { title: "ç§»å
¥å岿¶é´", field: "insertTime", type: "datetime" },
|
| | | ],
|
| | | [
|
| | | { title: "æ¥æºçº¿ä»£ç ", field: "robotSourceAddressLineCode", type: "like" },
|
| | | { title: "ç®æ 线代ç ", field: "robotTargetAddressLineCode", type: "like" },
|
| | | { title: "å建人", field: "creater", type: "like" },
|
| | | { title: "å建æ¶é´", field: "createDate", type: "datetime" },
|
| | | ],
|
| | | ]);
|
| | |
|
| | | // åé
ç½®
|
| | | const columns = ref([
|
| | | {
|
| | | field: "robotTaskId",
|
| | | title: "åå²ID",
|
| | | type: "int",
|
| | | width: 90,
|
| | | hidden: true, // éèåå²è¡¨ä¸»é®
|
| | | readonly: true,
|
| | | require: true,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "sourceId",
|
| | | title: "ä»»å¡å·",
|
| | | type: "int",
|
| | | width: 100,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "robotTaskNum",
|
| | | title: "ä»»å¡ç¼å·",
|
| | | type: "int",
|
| | | width: 100,
|
| | | align: "left",
|
| | | sortable: true,
|
| | | },
|
| | | {
|
| | | field: "robotRoadway",
|
| | | title: "å··é",
|
| | | type: "string",
|
| | | width: 120,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "robotTaskType",
|
| | | title: "ä»»å¡ç±»å",
|
| | | type: "int",
|
| | | width: 100,
|
| | | align: "left",
|
| | | bind: { key: "taskType", data: [] },
|
| | | },
|
| | | {
|
| | | field: "robotTaskState",
|
| | | title: "ä»»å¡ç¶æ",
|
| | | type: "int",
|
| | | width: 120,
|
| | | align: "left",
|
| | | bind: { key: "taskState", data: [] },
|
| | | },
|
| | | {
|
| | | field: "robotTaskTotalNum",
|
| | | title: "任塿»æ°",
|
| | | type: "int",
|
| | | width: 90,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "robotSourceAddress",
|
| | | title: "æ¥æºå°å",
|
| | | type: "string",
|
| | | width: 120,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "robotTargetAddress",
|
| | | title: "ç®æ å°å",
|
| | | type: "string",
|
| | | width: 120,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "robotSourceAddressLineCode",
|
| | | title: "æ¥æºçº¿ä½å°å",
|
| | | type: "string",
|
| | | width: 130,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "robotTargetAddressLineCode",
|
| | | title: "ç®æ 线ä½å°å",
|
| | | type: "string",
|
| | | width: 130,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "robotSourceAddressPalletCode",
|
| | | title: "æ¥æºæç",
|
| | | type: "string",
|
| | | width: 130,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "robotTargetAddressPalletCode",
|
| | | title: "ç®æ æç",
|
| | | type: "string",
|
| | | width: 130,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "robotExceptionMessage",
|
| | | title: "å¼å¸¸ä¿¡æ¯",
|
| | | type: "string",
|
| | | width: 200,
|
| | | align: "left",
|
| | | overflow: "ellipsis",
|
| | | tooltip: true, // é¼ æ æ¬åæ¾ç¤ºå®æ´å
容
|
| | | },
|
| | | {
|
| | | field: "robotGrade",
|
| | | title: "ä¼å
级",
|
| | | type: "int",
|
| | | width: 80,
|
| | | align: "left",
|
| | | bind: {
|
| | | key: "robotGrade",
|
| | | data: [
|
| | | { id: 1, name: "ä½" },
|
| | | { id: 2, name: "æ®é" },
|
| | | { id: 3, name: "é«" },
|
| | | { id: 4, name: "ç´§æ¥" },
|
| | | ],
|
| | | },
|
| | | },
|
| | | {
|
| | | field: "operateType",
|
| | | title: "æä½ç±»å",
|
| | | type: "string",
|
| | | width: 120,
|
| | | align: "left",
|
| | | sortable: true,
|
| | | },
|
| | | {
|
| | | field: "insertTime",
|
| | | title: "ç§»å
¥å岿¶é´",
|
| | | type: "datetime",
|
| | | width: 170,
|
| | | align: "left",
|
| | | sortable: true,
|
| | | },
|
| | | {
|
| | | field: "robotDispatchertime",
|
| | | title: "è°åº¦æ¶é´",
|
| | | type: "datetime",
|
| | | width: 160,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "robotRemark",
|
| | | title: "夿³¨",
|
| | | type: "string",
|
| | | width: 150,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "creater",
|
| | | title: "å建人",
|
| | | type: "string",
|
| | | width: 100,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "createDate",
|
| | | title: "å建æ¶é´",
|
| | | type: "datetime",
|
| | | width: 160,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "modifier",
|
| | | title: "ä¿®æ¹äºº",
|
| | | type: "string",
|
| | | width: 100,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "modifyDate",
|
| | | title: "ä¿®æ¹æ¶é´",
|
| | | type: "datetime",
|
| | | width: 160,
|
| | | align: "left",
|
| | | },
|
| | | ]);
|
| | |
|
| | | // 详æ
å¼¹çªé
ç½®
|
| | | const detail = ref({
|
| | | cnName: "æºå¨äººåå²ä»»å¡è¯¦æ
",
|
| | | table: "robotTaskHty",
|
| | | key: "robotTaskId",
|
| | | sortName: "insertTime",
|
| | | columns: columns.value.filter(col => !col.hidden), // 使ç¨ééèåæ®µ
|
| | | });
|
| | |
|
| | | return {
|
| | | table,
|
| | | extend,
|
| | | editFormFields,
|
| | | editFormOptions,
|
| | | searchFormFields,
|
| | | searchFormOptions,
|
| | | columns,
|
| | | detail,
|
| | | };
|
| | | },
|
| | | });
|
| | | </script> |
| | |
| | | case HtmlElementType.notequal: |
| | | linqExpression = LinqExpressionType.NotEqual; |
| | | break; |
| | | case HtmlElementType.notequal: |
| | | linqExpression = LinqExpressionType.NotEqual; |
| | | break; |
| | | default: |
| | | linqExpression = LinqExpressionType.Equal; |
| | | break; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using System;
|
| | | using System.Collections.Generic;
|
| | | using System.Linq;
|
| | | using System.Text;
|
| | | using System.Threading.Tasks;
|
| | | using WIDESEAWCS_Core.BaseRepository;
|
| | | using WIDESEAWCS_Model.Models;
|
| | |
|
| | | namespace WIDESEAWCS_IRobotTaskInfoRepository
|
| | | {
|
| | | public interface IRobotTask_HtyRepository : IRepository<Dt_RobotTask_Hty>
|
| | | {
|
| | |
|
| | | }
|
| | | } |
| | |
| | | /// </summary> |
| | | public List<int> TaskRobotTypes { get; } |
| | | |
| | | public bool DeleteRobotTask(int id); |
| | | |
| | | public Dt_RobotTask? QueryRobotCraneTask(string deviceCode); |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using System;
|
| | | using System.Collections.Generic;
|
| | | using System.Linq;
|
| | | using System.Text;
|
| | | using System.Threading.Tasks;
|
| | | using WIDESEAWCS_Core.BaseServices;
|
| | | using WIDESEAWCS_Model.Models;
|
| | |
|
| | | namespace WIDESEAWCS_ITaskInfoService
|
| | | {
|
| | | public interface IRobotTask_HtyService : IService<Dt_RobotTask_Hty>
|
| | | {
|
| | | }
|
| | | }
|
| | |
| | | /// æºæ¢°æ IP å°åï¼å¯ä¸ç´¢å¼ |
| | | /// </summary> |
| | | [SugarColumn(Length = 50, ColumnDescription = "æºæ¢°æIPå°å")] |
| | | public string IPAddress { get; set; } = string.Empty; |
| | | public string IpAddress { get; set; } |
| | | |
| | | /// <summary> |
| | | /// çæ¬å·ï¼ç¨äºä¹è§å¹¶åæ§å¶ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using SqlSugar;
|
| | | using System;
|
| | | using System.Collections.Generic;
|
| | | using System.Linq;
|
| | | using System.Text;
|
| | | using System.Threading.Tasks;
|
| | | using Magicodes.ExporterAndImporter.Core;
|
| | | using WIDESEAWCS_Core.DB.Models;
|
| | |
|
| | | namespace WIDESEAWCS_Model.Models
|
| | | {
|
| | | /// <summary>
|
| | | /// æºå¨äººåå²ä»»å¡è¡¨å®ä½
|
| | | /// </summary>
|
| | | [SugarTable(nameof(Dt_RobotTask_Hty), "æºå¨äººåå²ä»»å¡ä¿¡æ¯")]
|
| | | public class Dt_RobotTask_Hty : Dt_RobotTask, IBaseHistoryEntity
|
| | | {
|
| | | /// <summary>
|
| | | /// å表主é®
|
| | | /// </summary>
|
| | | [ImporterHeader(Name = "å表主é®")]
|
| | | [ExporterHeader(DisplayName = "å表主é®")]
|
| | | [SugarColumn(IsNullable = false, DefaultValue = "0", ColumnDescription = "å表主é®")]
|
| | | public int SourceId { get; set; }
|
| | |
|
| | | /// <summary>
|
| | | /// æä½ç±»å
|
| | | /// </summary>
|
| | | [ImporterHeader(Name = "æä½ç±»å")]
|
| | | [ExporterHeader(DisplayName = "æä½ç±»å")]
|
| | | [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "æä½ç±»å")]
|
| | | public string OperateType { get; set; }
|
| | |
|
| | | /// <summary>
|
| | | /// ç§»å
¥å岿¶é´
|
| | | /// </summary>
|
| | | [ImporterHeader(Name = "ç§»å
¥å岿¶é´")]
|
| | | [ExporterHeader(DisplayName = "ç§»å
¥å岿¶é´")]
|
| | | [SugarColumn(IsNullable = false, ColumnDescription = "ç§»å
¥å岿¶é´")]
|
| | | public DateTime InsertTime { get; set; }
|
| | | }
|
| | | } |
| | |
| | | using Microsoft.AspNetCore.Mvc; |
| | | using Microsoft.AspNetCore.Authorization; |
| | | using Microsoft.AspNetCore.Mvc; |
| | | using System.Threading.Tasks; |
| | | using WIDESEAWCS_Core; |
| | | using WIDESEAWCS_Core.BaseController; |
| | | using WIDESEAWCS_Core.Enums; |
| | | using WIDESEAWCS_DTO.TaskInfo; |
| | | using WIDESEAWCS_ISystemServices; |
| | | using WIDESEAWCS_ITaskInfoService; |
| | | using WIDESEAWCS_Model.Models; |
| | | |
| | | namespace WIDESEAWCS_Server.Controllers.Task |
| | | { |
| | | [Route("api/robotTask")] |
| | | [Route("api/RobotTask")] |
| | | [ApiController] |
| | | public class RobotTaskController : ApiBaseController<IRobotTaskService, Dt_RobotTask> |
| | | { |
| | | public RobotTaskController(IRobotTaskService service) : base(service) |
| | | { |
| | | |
| | | } |
| | | [HttpGet, HttpPost, Route("DeleteRobotTask"), AllowAnonymous] |
| | | public WebResponseContent DeleteRobotTask(int id) |
| | | { |
| | | if (Service.DeleteRobotTask(id)){
|
| | | return WebResponseContent.Instance.OK();
|
| | | } |
| | | return WebResponseContent.Instance.Error(); |
| | | } |
| | | |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using Microsoft.AspNetCore.Mvc;
|
| | | using WIDESEAWCS_Core.BaseController;
|
| | | using WIDESEAWCS_ITaskInfoService;
|
| | | using WIDESEAWCS_Model.Models;
|
| | |
|
| | | namespace WIDESEAWCS_Server.Controllers.Task
|
| | | {
|
| | | namespace WIDESEAWCS_WCSServer.Controllers.Task
|
| | | {
|
| | | [Route("api/RobotTask_Hty")]
|
| | | [ApiController]
|
| | | public class RobotTask_HtyController : ApiBaseController<IRobotTask_HtyService, Dt_RobotTask_Hty>
|
| | | {
|
| | | private readonly IHttpContextAccessor _httpContextAccessor;
|
| | |
|
| | | public RobotTask_HtyController(
|
| | | IRobotTask_HtyService service,
|
| | | IHttpContextAccessor httpContextAccessor) : base(service)
|
| | | {
|
| | | _httpContextAccessor = httpContextAccessor;
|
| | | }
|
| | | }
|
| | | }
|
| | | }
|
| | |
| | | public Dt_RobotState? GetByIp(string ipAddress) |
| | | { |
| | | return Db.Queryable<Dt_RobotState>() |
| | | .Where(x => x.IPAddress == ipAddress) |
| | | .Where(x => x.IpAddress == ipAddress) |
| | | .First(); |
| | | } |
| | | |
| | |
| | | |
| | | var newState = new Dt_RobotState |
| | | { |
| | | IPAddress = ipAddress, |
| | | IpAddress = ipAddress, |
| | | Version = DateTime.UtcNow.Ticks, |
| | | RobotCraneJson = JsonConvert.SerializeObject(robotCrane), |
| | | CreateDate = DateTime.Now, |
| | |
| | | |
| | | // ä¹è§éï¼WHERE IPAddress = @ip AND Version = @expectedVersionï¼çæ¬å¹é
ææ´æ° |
| | | var affectedRows = Db.Updateable<Dt_RobotState>(newState) |
| | | .Where(x => x.IPAddress == ipAddress) |
| | | .Where(x => x.IpAddress == ipAddress) |
| | | .ExecuteCommand(); |
| | | |
| | | return affectedRows > 0; |
| | |
| | | { |
| | | var state = new RobotSocketState |
| | | { |
| | | IPAddress = entity.IPAddress, |
| | | IPAddress = entity.IpAddress, |
| | | Version = entity.Version, |
| | | IsEventSubscribed = entity.IsEventSubscribed, |
| | | RobotRunMode = entity.RobotRunMode, |
| | |
| | | { |
| | | var entity = new Dt_RobotState |
| | | { |
| | | IPAddress = state.IPAddress, |
| | | IpAddress = state.IPAddress, |
| | | IsEventSubscribed = state.IsEventSubscribed, |
| | | RobotRunMode = state.RobotRunMode, |
| | | RobotControlMode = state.RobotControlMode, |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using System;
|
| | | using System.Collections.Generic;
|
| | | using System.Linq;
|
| | | using System.Text;
|
| | | using System.Threading.Tasks;
|
| | | using WIDESEAWCS_Core.BaseRepository;
|
| | | using WIDESEAWCS_IRobotTaskInfoRepository;
|
| | | using WIDESEAWCS_Model.Models;
|
| | |
|
| | | namespace WIDESEAWCS_RobotTaskInfoRepository
|
| | | {
|
| | | public class RobotTask_HtyRepository : RepositoryBase<Dt_RobotTask_Hty>, IRobotTask_HtyRepository
|
| | | {
|
| | | public RobotTask_HtyRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
|
| | | {
|
| | | }
|
| | | }
|
| | | } |
| | |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEAWCS_Core; |
| | | using WIDESEAWCS_Core.BaseServices; |
| | | using WIDESEAWCS_Core.Enums; |
| | | using WIDESEAWCS_Core.Helper; |
| | | using WIDESEAWCS_Core.Utilities; |
| | | using WIDESEAWCS_DTO.Stock; |
| | |
| | | _taskExecuteDetailService = taskExecuteDetailService; |
| | | _logger = logger; |
| | | } |
| | | public override WebResponseContent DeleteData(object[] keys)
|
| | | {
|
| | | List<int> taskKeys = new List<int>();
|
| | | for (int i = 0; i < keys.Length; i++)
|
| | | {
|
| | | taskKeys.Add(Convert.ToInt32(keys[i]));
|
| | | }
|
| | | List<Dt_RobotTask> tasks = BaseDal.QueryData(x => taskKeys.Contains(x.RobotTaskId));
|
| | | BaseDal.DeleteAndMoveIntoHty(tasks, OperateTypeEnum.人工å é¤);
|
| | | return WebResponseContent.Instance.OK($"æåå é¤{tasks.Count}æ¡æ°æ®");
|
| | |
|
| | | }
|
| | | public bool DeleteRobotTask(int id) |
| | | { |
| | | Dt_RobotTask task = BaseDal.QueryFirst(x => x.RobotTaskId == id); |
| | | return BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.èªå¨å®æ); |
| | | } |
| | | |
| | | public WebResponseContent ReceiveWMSTask([NotNull] WMSTaskDTO taskDTO, StockDTO stockDTO) |
| | | { |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using MapsterMapper;
|
| | | using System;
|
| | | using System.Collections.Generic;
|
| | | using System.Linq;
|
| | | using System.Text;
|
| | | using System.Threading.Tasks;
|
| | | using WIDESEAWCS_Core.BaseServices;
|
| | | using WIDESEAWCS_IRobotTaskInfoRepository;
|
| | | using WIDESEAWCS_ITaskInfoService;
|
| | | using WIDESEAWCS_Model.Models;
|
| | | using WIDESEAWCS_QuartzJob.Service;
|
| | |
|
| | | namespace WIDESEAWCS_TaskInfoService
|
| | | {
|
| | | public class RobotTask_HtyService : ServiceBase<Dt_RobotTask_Hty, IRobotTask_HtyRepository>, IRobotTask_HtyService
|
| | | {
|
| | | private readonly IRouterService _routerService;
|
| | | private readonly IMapper _mapper;
|
| | |
|
| | | public RobotTask_HtyService(
|
| | | IRobotTask_HtyRepository BaseDal,
|
| | | IRouterService routerService,
|
| | | IMapper mapper) : base(BaseDal)
|
| | | {
|
| | | _routerService = routerService;
|
| | | _mapper = mapper;
|
| | | }
|
| | | }
|
| | | }
|
| | |
| | | /// <returns>å 餿¯å¦æå</returns> |
| | | public bool? DeleteTask(int ID) |
| | | { |
| | | return _robotTaskService.Repository.DeleteDataById(ID); |
| | | return _robotTaskService.DeleteRobotTask(ID); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | <div v-if="selectedLocation.details && selectedLocation.details.length > 0" class="detail-table"> |
| | | <h4>åºåæç»</h4> |
| | | <el-table :data="selectedLocation.details" border size="small" max-height="400"> |
| | | <el-table-column prop="materielName" label="ç©æåç§°" min-width="140" show-overflow-tooltip /> |
| | | <el-table-column prop="serialNumber" label="çµè¯æ¡ç " min-width="160" show-overflow-tooltip /> |
| | | <el-table-column prop="materielName" label="ç©æåç§°" min-width="90" show-overflow-tooltip /> |
| | | <el-table-column prop="serialNumber" label="çµè¯æ¡ç " min-width="180" show-overflow-tooltip /> |
| | | <el-table-column prop="inboundOrderRowNo" label="ééå·" min-width="100" show-overflow-tooltip /> |
| | | </el-table> |
| | | </div> |
| | |
| | | selectedLocation.value = null |
| | | |
| | | // æ¸
空ææç鿡件 |
| | | filterStockStatus.value = null |
| | | filterMaterielCode.value = null |
| | | filterBatchNo.value = null |
| | | // filterStockStatus.value = null |
| | | // filterMaterielCode.value = null |
| | | // filterBatchNo.value = null |
| | | |
| | | // æ¸
空çéé项å表 |
| | | materielCodeList.value = [] |
| | | batchNoList.value = [] |
| | | // // æ¸
空çéé项å表 |
| | | // materielCodeList.value = [] |
| | | // batchNoList.value = [] |
| | | |
| | | // å è½½æ°ä»åºæ°æ® |
| | | await loadWarehouseData(warehouseId) |
| | |
| | | } |
| | | |
| | | .detail-content { |
| | | padding: 20px; |
| | | padding: 10px; |
| | | } |
| | | |
| | | .detail-table { |
| | |
| | | <template> |
| | | <view-grid |
| | | ref="grid" |
| | | :columns="columns" |
| | | :detail="detail" |
| | | :editFormFields="editFormFields" |
| | | :editFormOptions="editFormOptions" |
| | | :searchFormFields="searchFormFields" |
| | | :searchFormOptions="searchFormOptions" |
| | | :table="table" |
| | | :tableExpand="tableExpand" |
| | | :extend="extend" |
| | | > |
| | | <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields" |
| | | :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions" |
| | | :table="table" :tableExpand="tableExpand" :extend="extend"> |
| | | </view-grid> |
| | | </template> |
| | | |
| | |
| | | palletCode: "æçç¼å·", |
| | | stockStatus: "åºåç¶æ", |
| | | locationCode: "è´§ä½ç¼å·", |
| | | outboundDate: "åºåºæ¶é´", |
| | | warehouse: "ä»åº", |
| | | creator: "å建人", |
| | | createDate: "å建æ¶é´", |
| | |
| | | field: "palletCode", |
| | | title: TEXT.palletCode, |
| | | type: "string", |
| | | width: 120, |
| | | width: 150, |
| | | align: "left", |
| | | }, |
| | | { |
| | |
| | | bind: { key: "mesUploadStatusEnum", data: [] }, |
| | | }, |
| | | { |
| | | field: "outboundDate", |
| | | title: TEXT.outboundDate, |
| | | type: "string", |
| | | width: 150, |
| | | align: "left", |
| | | }, |
| | | { |
| | | field: "locationCode", |
| | | title: TEXT.locationCode, |
| | | type: "string", |
| | | width: 150, |
| | | width: 120, |
| | | align: "left", |
| | | }, |
| | | { |
| | |
| | | if (stockInfo.Details != null && stockInfo.Details.Any()) |
| | | { |
| | | item.StockQuantity = stockInfo.Details.Sum(d => d.StockQuantity); |
| | | |
| | | item.OutboundDate = stockInfo.OutboundDate; |
| | | // è·å第ä¸ä¸ªæç»çç©æä¿¡æ¯ï¼å¦æåå¨ï¼ |
| | | var firstDetail = stockInfo.Details.FirstOrDefault(); |
| | | if (firstDetail != null) |
| | |
| | | Id = d.Id, |
| | | MaterielCode = d.MaterielCode, |
| | | MaterielName = d.MaterielName, |
| | | SerialNumber = d.SerialNumber, |
| | | BatchNo = d.BatchNo, |
| | | StockQuantity = d.StockQuantity, |
| | | Unit = d.Unit, |