feat: 添加AGV任务管理和托盘组功能
feat(task): 新增AGV任务页面和路由配置
feat(stock): 添加托盘组管理页面及进站出站操作
feat(task): 在任务历史页面添加操作类型列
refactor: 优化AGV任务查询条件及过滤逻辑
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | //æ¤jsæä»¶æ¯ç¨æ¥èªå®ä¹æ©å±ä¸å¡ä»£ç ï¼å¯ä»¥æ©å±ä¸äºèªå®ä¹é¡µé¢æè
éæ°é
ç½®çæç代ç
|
| | |
|
| | | let extension = {
|
| | | components: {
|
| | | //æ¥è¯¢ç颿©å±ç»ä»¶
|
| | | gridHeader: "",
|
| | | gridBody: "",
|
| | | gridFooter: "",
|
| | | //æ°å»ºãç¼è¾å¼¹åºæ¡æ©å±ç»ä»¶
|
| | | modelHeader: "",
|
| | | modelBody: "",
|
| | | modelFooter: "",
|
| | | },
|
| | | tableAction: "", //æå®æå¼ 表çæé(è¿éå¡«å表å,é»è®¤ä¸ç¨å¡«å)
|
| | | buttons: { view: [], box: [], detail: [] }, //æ©å±çæé®
|
| | | methods: {
|
| | | //ä¸é¢è¿äºæ¹æ³å¯ä»¥ä¿çä¹å¯ä»¥å é¤
|
| | | onInit() {},
|
| | | onInited() {
|
| | | //æ¡æ¶åå§åé
ç½®å
|
| | | //妿è¦é
ç½®æç»è¡¨,卿¤æ¹æ³æä½
|
| | | //this.detailOptions.columns.forEach(column=>{ });
|
| | | },
|
| | | searchBefore(param) {
|
| | | //ç颿¥è¯¢å,å¯ä»¥ç»param.wheresæ·»å æ¥è¯¢åæ°
|
| | | //è¿åfalseï¼åä¸ä¼æ§è¡æ¥è¯¢
|
| | | |
| | | // 第ä¸ä¸ªè¿æ»¤æ¡ä»¶
|
| | | const roadwayFilter1 = {
|
| | | name: "roadway",
|
| | | value: "ZJ1",
|
| | | displayType: "like",
|
| | | };
|
| | | |
| | | // 第äºä¸ªè¿æ»¤æ¡ä»¶
|
| | | const roadwayFilter2 = {
|
| | | name: "roadway",
|
| | | value: "FJ1",
|
| | | displayType: "like",
|
| | | };
|
| | |
|
| | | if (!param.wheres) {
|
| | | param.wheres = [];
|
| | | }
|
| | | |
| | | // å°ä¸¤ä¸ªè¿æ»¤æ¡ä»¶æ·»å å°æ¥è¯¢åæ°ä¸
|
| | | param.wheres.push(roadwayFilter1);
|
| | | param.wheres.push(roadwayFilter2);
|
| | | |
| | | return true;
|
| | | },
|
| | | searchAfter(result) {
|
| | | //æ¥è¯¢åï¼resultè¿åçæ¥è¯¢æ°æ®,å¯ä»¥å¨æ¾ç¤ºå°è¡¨æ ¼åå¤çè¡¨æ ¼çå¼
|
| | | return true;
|
| | | },
|
| | | addBefore(formData) {
|
| | | //æ°å»ºä¿ååformData为对象ï¼å
æ¬æç»è¡¨ï¼å¯ä»¥ç»ç»è¡¨å设置å¼ï¼èªå·±è¾åºçformDataçå¼
|
| | | return true;
|
| | | },
|
| | | updateBefore(formData) {
|
| | | //ç¼è¾ä¿ååformData为对象ï¼å
æ¬æç»è¡¨ãå é¤è¡çId
|
| | | return true;
|
| | | },
|
| | | rowClick({ row, column, event }) {
|
| | | //æ¥è¯¢çé¢ç¹å»è¡äºä»¶
|
| | | this.$refs.table.$refs.table.toggleRowSelection(row); //åå»è¡æ¶éä¸å½åè¡;
|
| | | },
|
| | | modelOpenAfter(row) {
|
| | | //ç¹å»ç¼è¾ãæ°å»ºæé®å¼¹åºæ¡åï¼å¯ä»¥å¨æ¤å¤åé»è¾ï¼å¦ï¼ä»åå°è·åæ°æ®
|
| | | //(1)夿æ¯ç¼è¾è¿æ¯æ°å»ºæä½ï¼ this.currentAction=='Add';
|
| | | //(2)ç»å¼¹åºæ¡è®¾ç½®é»è®¤å¼
|
| | | //(3)this.editFormFields.åæ®µ='xxx';
|
| | | //妿éè¦ç»ä¸ææ¡è®¾ç½®é»è®¤å¼ï¼è¯·éåthis.editFormOptionsæ¾å°å段é
置对åºdata屿§çkeyå¼
|
| | | //ç䏿就æè¾åºçï¼console.log(this.editFormOptions)
|
| | | },
|
| | | },
|
| | | };
|
| | | export default extension;
|
| | |
| | | path: '/task', |
| | | name: 'task', |
| | | component: () => import('@/views/taskinfo/task.vue') |
| | | },{ |
| | | path: '/agvTask', |
| | | name: 'agvTask', |
| | | component: () => import('@/views/taskinfo/agvTask.vue') |
| | | }, |
| | | { |
| | | path: '/taskHty', |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | |
|
| | | <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/agvTask.jsx";
|
| | | import { ref, defineComponent } from "vue";
|
| | | export default defineComponent({
|
| | | setup() {
|
| | | const table = ref({
|
| | | key: "taskId",
|
| | | footer: "Foots",
|
| | | cnName: "ä»»å¡ä¿¡æ¯",
|
| | | name: "task",
|
| | | url: "/Task/",
|
| | | sortName: "CreateDate",
|
| | | });
|
| | | const editFormFields = ref({});
|
| | | const editFormOptions = ref([]);
|
| | | const searchFormFields = ref({
|
| | | taskNum: "",
|
| | | palletCode: "",
|
| | | roadway: "",
|
| | | sourceAddress: "",
|
| | | targetAddress: "",
|
| | | currentAddress: "",
|
| | | nextAddress: "",
|
| | | creater: "",
|
| | | createDate: "",
|
| | | });
|
| | | const searchFormOptions = ref([
|
| | | [
|
| | | { title: "ä»»å¡å·", field: "taskNum", type: "int" },
|
| | | { title: "æçç¼å·", field: "palletCode", type: "like" },
|
| | | {
|
| | | title: "ä»»å¡ç±»å",
|
| | | field: "taskType",
|
| | | type: "selectList",
|
| | | dataKey: "taskType",
|
| | | data: [],
|
| | | },
|
| | | {
|
| | | title: "ä»»å¡ç¶æ",
|
| | | field: "taskStatus",
|
| | | type: "selectList",
|
| | | dataKey: "taskState",
|
| | | data: [],
|
| | | },
|
| | | ],
|
| | | [
|
| | | { title: "èµ·å§å°å", field: "sourceAddress", type: "like" },
|
| | | { title: "ç®æ å°å", field: "targetAddress", type: "like" },
|
| | | { title: "å½åä½ç½®", field: "currentAddress", type: "like" },
|
| | | { title: "ä¸ä¸ä½ç½®", field: "nextAddress", type: "like" },
|
| | | ],
|
| | | [
|
| | | { title: "å··éå·", field: "roadway", type: "like" },
|
| | | { title: "å建人", field: "creater", type: "like" },
|
| | | { title: "å建æ¶é´", field: "createDate", type: "datetime" },
|
| | | ],
|
| | | ]);
|
| | | const columns = ref([
|
| | | {
|
| | | field: "taskId",
|
| | | title: "TaskId",
|
| | | type: "int",
|
| | | width: 90,
|
| | | hidden: true,
|
| | | readonly: true,
|
| | | require: true,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "taskNum",
|
| | | title: "ä»»å¡å·",
|
| | | type: "int",
|
| | | width: 90,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "palletCode",
|
| | | title: "æçç¼å·",
|
| | | type: "string",
|
| | | width: 200,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "roadway",
|
| | | title: "å··éå·",
|
| | | type: "string",
|
| | | width: 90,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "taskType",
|
| | | title: "ä»»å¡ç±»å",
|
| | | type: "int",
|
| | | width: 90,
|
| | | align: "left",
|
| | | bind: { key: "taskType", data: [] },
|
| | | },
|
| | | {
|
| | | field: "taskStatus",
|
| | | title: "ä»»å¡ç¶æ",
|
| | | type: "int",
|
| | | width: 150,
|
| | | align: "left",
|
| | | bind: { key: "taskState", data: [] },
|
| | | },
|
| | | {
|
| | | field: "sourceAddress",
|
| | | title: "èµ·å§å°å",
|
| | | type: "int",
|
| | | width: 120,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "targetAddress",
|
| | | title: "ç®æ å°å",
|
| | | type: "string",
|
| | | width: 120,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "currentAddress",
|
| | | title: "å½åä½ç½®",
|
| | | type: "string",
|
| | | width: 120,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "nextAddress",
|
| | | title: "ä¸ä¸ä½ç½®",
|
| | | type: "string",
|
| | | width: 120,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "exceptionMessage",
|
| | | title: "å¼å¸¸ä¿¡æ¯",
|
| | | type: "string",
|
| | | width: 90,
|
| | | align: "left",
|
| | | hidden: true,
|
| | | },
|
| | | {
|
| | | field: "grade",
|
| | | title: "ä¼å
级",
|
| | | type: "int",
|
| | | width: 80,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "dispatchertime",
|
| | | title: "ä»»å¡ä¸åæ¶é´",
|
| | | type: "datetime",
|
| | | width: 150,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "wMSId",
|
| | | title: "WMSä»»å¡ä¸»é®",
|
| | | type: "int",
|
| | | width: 120,
|
| | | align: "left",
|
| | | hidden: true,
|
| | | },
|
| | | {
|
| | | field: "creater",
|
| | | title: "å建人",
|
| | | type: "string",
|
| | | width: 90,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "createDate",
|
| | | title: "å建æ¶é´",
|
| | | type: "datetime",
|
| | | width: 150,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "modifier",
|
| | | title: "ä¿®æ¹äºº",
|
| | | type: "string",
|
| | | width: 100,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "modifyDate",
|
| | | title: "ä¿®æ¹æ¶é´",
|
| | | type: "datetime",
|
| | | width: 160,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "remark",
|
| | | title: "夿³¨",
|
| | | type: "string",
|
| | | width: 100,
|
| | | align: "left",
|
| | | hidden: true,
|
| | | },
|
| | | ]);
|
| | | const detail = ref({
|
| | | cnName: "",
|
| | | table: "",
|
| | | columns: [],
|
| | | sortName: "",
|
| | | key: "",
|
| | | });
|
| | | return {
|
| | | table,
|
| | | extend,
|
| | | editFormFields,
|
| | | editFormOptions,
|
| | | searchFormFields,
|
| | | searchFormOptions,
|
| | | columns,
|
| | | detail,
|
| | | };
|
| | | },
|
| | | });
|
| | | </script>
|
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | //æ¤jsæä»¶æ¯ç¨æ¥èªå®ä¹æ©å±ä¸å¡ä»£ç ï¼å¯ä»¥æ©å±ä¸äºèªå®ä¹é¡µé¢æè
éæ°é
ç½®çæç代ç
|
| | |
|
| | | let extension = {
|
| | | components: {
|
| | | //æ¥è¯¢ç颿©å±ç»ä»¶
|
| | | gridHeader: '',
|
| | | gridBody: '',
|
| | | gridFooter: '',
|
| | | //æ°å»ºãç¼è¾å¼¹åºæ¡æ©å±ç»ä»¶
|
| | | modelHeader: '',
|
| | | modelBody: '',
|
| | | modelFooter: ''
|
| | | },
|
| | | tableAction: '',
|
| | | buttons: { view: [], box: [], detail: [] },
|
| | | methods: {
|
| | | onInit() {
|
| | | // æ·»å MESæä½å
|
| | | this.columns.push({
|
| | | title: 'æä½',
|
| | | field: 'æä½',
|
| | | align: 'center',
|
| | | width: 200,
|
| | | fixed: 'right',
|
| | | render: (h, { row, column, index }) => {
|
| | | return (
|
| | | <div>
|
| | | <el-button
|
| | | type="primary"
|
| | | size="small"
|
| | | onClick={($e) => { this.handleInbound(row); }}
|
| | | >è¿ç«</el-button>
|
| | | <el-button
|
| | | type="success"
|
| | | size="small"
|
| | | style="margin-left: 8px"
|
| | | onClick={($e) => { this.handleOutbound(row); }}
|
| | | >åºç«</el-button>
|
| | | </div>
|
| | | );
|
| | | }
|
| | | });
|
| | | },
|
| | |
|
| | | // æçè¿ç«æä½
|
| | | async handleInbound(row) {
|
| | | try {
|
| | | await this.$confirm(`确认æ§è¡æçè¿ç«æä½ï¼\næçç¼å·ï¼${row.palletCode}`, "è¿ç«ç¡®è®¤", {
|
| | | confirmButtonText: "确认",
|
| | | cancelButtonText: "åæ¶",
|
| | | type: "warning"
|
| | | });
|
| | |
|
| | | const result = await this.http.post("/api/StockInfo/inboundInContainer", {
|
| | | palletCode: row.palletCode,
|
| | | stockId: row.id
|
| | | }, "æ£å¨è°ç¨MESæ¥å£...");
|
| | |
|
| | | if (result.status) {
|
| | | this.$Message.success(result.message || "æçè¿ç«æå");
|
| | | this.$refs.table.load();
|
| | | } else {
|
| | | this.$error(result.message || "æçè¿ç«å¤±è´¥");
|
| | | }
|
| | | } catch (error) {
|
| | | if (error !== "cancel") {
|
| | | this.$error(error.message || "ç½ç»é误ï¼è¯·ç¨åéè¯");
|
| | | }
|
| | | }
|
| | | },
|
| | |
|
| | | // æçåºç«æä½
|
| | | async handleOutbound(row) {
|
| | | try {
|
| | | await this.$confirm(`确认æ§è¡æçåºç«æä½ï¼\næçç¼å·ï¼${row.palletCode}`, "åºç«ç¡®è®¤", {
|
| | | confirmButtonText: "确认",
|
| | | cancelButtonText: "åæ¶",
|
| | | type: "warning"
|
| | | });
|
| | |
|
| | | const result = await this.http.post("/api/StockInfo/outboundInContainer", {
|
| | | palletCode: row.palletCode,
|
| | | stockId: row.id
|
| | | }, "æ£å¨è°ç¨MESæ¥å£...");
|
| | |
|
| | | if (result.status) {
|
| | | this.$Message.success(result.message || "æçåºç«æå");
|
| | | this.$refs.table.load();
|
| | | } else {
|
| | | this.$error(result.message || "æçåºç«å¤±è´¥");
|
| | | }
|
| | | } catch (error) {
|
| | | if (error !== "cancel") {
|
| | | this.$error(error.message || "ç½ç»é误ï¼è¯·ç¨åéè¯");
|
| | | }
|
| | | }
|
| | | },
|
| | |
|
| | | onInited() {
|
| | | // æ¡æ¶åå§åé
ç½®å
|
| | | },
|
| | | searchBefore(param) {
|
| | | const locationCodeFilter = {
|
| | | name: "stockStatus",
|
| | | value: "1",
|
| | | displayType: "int"
|
| | | };
|
| | | if (!param.wheres) {
|
| | | param.wheres = [];
|
| | | }
|
| | | // å°è¿æ»¤æ¡ä»¶æ·»å å°æ¥è¯¢åæ°ä¸
|
| | | param.wheres.push(locationCodeFilter);
|
| | | return true;
|
| | | },
|
| | | searchAfter(result) {
|
| | | return true;
|
| | | },
|
| | | addBefore(formData) {
|
| | | return true;
|
| | | },
|
| | | updateBefore(formData) {
|
| | | return true;
|
| | | },
|
| | | rowClick({ row, column, event }) {
|
| | | this.$refs.table.$refs.table.toggleRowSelection(row);
|
| | | },
|
| | | modelOpenAfter(row) {
|
| | | // ç¹å»ç¼è¾ãæ°å»ºæé®å¼¹åºæ¡å
|
| | | }
|
| | | }
|
| | | };
|
| | |
|
| | | export default extension;
|
| | |
| | | return true; |
| | | }, |
| | | searchAfter(result) { |
| | | return true; |
| | | return result; |
| | | }, |
| | | addBefore(formData) { |
| | | return true; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | //æ¤jsæä»¶æ¯ç¨æ¥èªå®ä¹æ©å±ä¸å¡ä»£ç ï¼å¯ä»¥æ©å±ä¸äºèªå®ä¹é¡µé¢æè
éæ°é
ç½®çæç代ç
|
| | |
|
| | | let extension = {
|
| | | components: {
|
| | | //æ¥è¯¢ç颿©å±ç»ä»¶
|
| | | gridHeader: "",
|
| | | gridBody: "",
|
| | | gridFooter: "",
|
| | | //æ°å»ºãç¼è¾å¼¹åºæ¡æ©å±ç»ä»¶
|
| | | modelHeader: "",
|
| | | modelBody: "",
|
| | | modelFooter: "",
|
| | | },
|
| | | tableAction: "", //æå®æå¼ 表çæé(è¿éå¡«å表å,é»è®¤ä¸ç¨å¡«å)
|
| | | buttons: { view: [], box: [], detail: [] }, //æ©å±çæé®
|
| | | methods: {
|
| | | //ä¸é¢è¿äºæ¹æ³å¯ä»¥ä¿çä¹å¯ä»¥å é¤
|
| | | onInit() {},
|
| | | onInited() {
|
| | | //æ¡æ¶åå§åé
ç½®å
|
| | | //妿è¦é
ç½®æç»è¡¨,卿¤æ¹æ³æä½
|
| | | //this.detailOptions.columns.forEach(column=>{ });
|
| | | },
|
| | | searchBefore(param) {
|
| | | //ç颿¥è¯¢å,å¯ä»¥ç»param.wheresæ·»å æ¥è¯¢åæ°
|
| | | //è¿åfalseï¼åä¸ä¼æ§è¡æ¥è¯¢
|
| | | |
| | | // 第ä¸ä¸ªè¿æ»¤æ¡ä»¶
|
| | | const roadwayFilter1 = {
|
| | | name: "roadway",
|
| | | value: "ZJ1",
|
| | | displayType: "like",
|
| | | };
|
| | | |
| | | // 第äºä¸ªè¿æ»¤æ¡ä»¶
|
| | | const roadwayFilter2 = {
|
| | | name: "roadway",
|
| | | value: "FJ1",
|
| | | displayType: "like",
|
| | | };
|
| | |
|
| | | if (!param.wheres) {
|
| | | param.wheres = [];
|
| | | }
|
| | | |
| | | // å°ä¸¤ä¸ªè¿æ»¤æ¡ä»¶æ·»å å°æ¥è¯¢åæ°ä¸
|
| | | param.wheres.push(roadwayFilter1);
|
| | | param.wheres.push(roadwayFilter2);
|
| | | |
| | | return true;
|
| | | },
|
| | | searchAfter(result) {
|
| | | //æ¥è¯¢åï¼resultè¿åçæ¥è¯¢æ°æ®,å¯ä»¥å¨æ¾ç¤ºå°è¡¨æ ¼åå¤çè¡¨æ ¼çå¼
|
| | | return true;
|
| | | },
|
| | | addBefore(formData) {
|
| | | //æ°å»ºä¿ååformData为对象ï¼å
æ¬æç»è¡¨ï¼å¯ä»¥ç»ç»è¡¨å设置å¼ï¼èªå·±è¾åºçformDataçå¼
|
| | | return true;
|
| | | },
|
| | | updateBefore(formData) {
|
| | | //ç¼è¾ä¿ååformData为对象ï¼å
æ¬æç»è¡¨ãå é¤è¡çId
|
| | | return true;
|
| | | },
|
| | | rowClick({ row, column, event }) {
|
| | | //æ¥è¯¢çé¢ç¹å»è¡äºä»¶
|
| | | this.$refs.table.$refs.table.toggleRowSelection(row); //åå»è¡æ¶éä¸å½åè¡;
|
| | | },
|
| | | modelOpenAfter(row) {
|
| | | //ç¹å»ç¼è¾ãæ°å»ºæé®å¼¹åºæ¡åï¼å¯ä»¥å¨æ¤å¤åé»è¾ï¼å¦ï¼ä»åå°è·åæ°æ®
|
| | | //(1)夿æ¯ç¼è¾è¿æ¯æ°å»ºæä½ï¼ this.currentAction=='Add';
|
| | | //(2)ç»å¼¹åºæ¡è®¾ç½®é»è®¤å¼
|
| | | //(3)this.editFormFields.åæ®µ='xxx';
|
| | | //妿éè¦ç»ä¸ææ¡è®¾ç½®é»è®¤å¼ï¼è¯·éåthis.editFormOptionsæ¾å°å段é
置对åºdata屿§çkeyå¼
|
| | | //ç䏿就æè¾åºçï¼console.log(this.editFormOptions)
|
| | | },
|
| | | },
|
| | | };
|
| | | export default extension;
|
| | |
| | | path: '/task_hty', |
| | | name: 'task_hty', |
| | | component: () => import('@/views/taskinfo/task_hty.vue') |
| | | }, { |
| | | },{ |
| | | path: '/task_agv', |
| | | name: 'task_agv', |
| | | component: () => import('@/views/taskinfo/task_agv.vue') |
| | | }, |
| | | { |
| | | path: '/groupPalle', |
| | | name: 'groupPalle', |
| | | component: () => import('@/views/stock/groupPalle.vue') |
| | | }, |
| | | { |
| | | path: '/stockView', |
| | | name: 'stockView', |
| | | component: () => import('@/views/stock/stockView.vue') |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <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>
|
| | | </template>
|
| | |
|
| | | <script>
|
| | | import extend from "@/extension/stock/groupPalle.jsx";
|
| | | import {
|
| | | defineComponent,
|
| | | getCurrentInstance,
|
| | | h,
|
| | | reactive,
|
| | | ref,
|
| | | resolveComponent,
|
| | | } from "vue";
|
| | |
|
| | | const TEXT = {
|
| | | pageName: "åºåä¿¡æ¯",
|
| | | palletCode: "æçç¼å·",
|
| | | stockStatus: "åºåç¶æ",
|
| | | locationCode: "è´§ä½ç¼å·",
|
| | | warehouse: "ä»åº",
|
| | | creator: "å建人",
|
| | | createDate: "å建æ¶é´",
|
| | | modifier: "ä¿®æ¹äºº",
|
| | | modifyDate: "ä¿®æ¹æ¶é´",
|
| | | detailName: "åºåæç»",
|
| | | materielName: "ç©æåç§°",
|
| | | serialNumber: "çµè¯ç ",
|
| | | stockQuantity: "åºåæ°é",
|
| | | status: "ç¶æ",
|
| | | inboundOrderRowNo: "ééå·",
|
| | | detailLoading: "åºåæç»å è½½ä¸...",
|
| | | detailLoadFailed: "åºåæç»å 载失败",
|
| | | detailEmpty: "å½ååºåå¤´ææ æç»æ°æ®",
|
| | | expandPrefix: "æçï¼",
|
| | | expandMiddle: " / ",
|
| | | expandLocation: "è´§ä½ï¼",
|
| | | };
|
| | |
|
| | | export default defineComponent({
|
| | | setup() {
|
| | | const { proxy } = getCurrentInstance();
|
| | | const ElTable = resolveComponent("el-table");
|
| | | const ElTableColumn = resolveComponent("el-table-column");
|
| | |
|
| | | const table = ref({
|
| | | key: "id",
|
| | | footer: "Foots",
|
| | | cnName: TEXT.pageName,
|
| | | name: "stockInfo",
|
| | | url: "/StockInfo/",
|
| | | sortName: "id",
|
| | | });
|
| | |
|
| | | const editFormFields = ref({
|
| | | palletCode: "",
|
| | | locationCode: "",
|
| | | });
|
| | |
|
| | | const editFormOptions = ref([
|
| | | [
|
| | | { field: "palletCode", title: TEXT.palletCode, type: "string" },
|
| | | { field: "locationCode", title: TEXT.locationCode, type: "string" },
|
| | | ],
|
| | | ]);
|
| | |
|
| | | const searchFormFields = ref({
|
| | | palletCode: "",
|
| | | locationCode: "",
|
| | | });
|
| | |
|
| | | const searchFormOptions = ref([
|
| | | [
|
| | | { title: TEXT.palletCode, field: "palletCode", type: "like" },
|
| | | { title: TEXT.locationCode, field: "locationCode", type: "like" },
|
| | | ],
|
| | | ]);
|
| | |
|
| | | const columns = ref([
|
| | | {
|
| | | field: "id",
|
| | | title: "Id",
|
| | | type: "int",
|
| | | width: 90,
|
| | | hidden: true,
|
| | | readonly: true,
|
| | | require: true,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "palletCode",
|
| | | title: TEXT.palletCode,
|
| | | type: "string",
|
| | | width: 120,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "stockStatus",
|
| | | title: TEXT.stockStatus,
|
| | | type: "int",
|
| | | width: 120,
|
| | | align: "left",
|
| | | bind: { key: "stockStatusEmun", data: [] },
|
| | | },
|
| | | // {
|
| | | // field: "locationCode",
|
| | | // title: TEXT.locationCode,
|
| | | // type: "string",
|
| | | // width: 150,
|
| | | // align: "left",
|
| | | // },
|
| | | {
|
| | | field: "warehouseId",
|
| | | title: TEXT.warehouse,
|
| | | type: "select",
|
| | | width: 100,
|
| | | align: "left",
|
| | | bind: { key: "warehouseEnum", data: [] },
|
| | | },
|
| | | {
|
| | | field: "creater",
|
| | | title: TEXT.creator,
|
| | | type: "string",
|
| | | width: 90,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "createDate",
|
| | | title: TEXT.createDate,
|
| | | type: "datetime",
|
| | | width: 160,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "modifier",
|
| | | title: TEXT.modifier,
|
| | | type: "string",
|
| | | width: 100,
|
| | | align: "left",
|
| | | hidden: true,
|
| | | },
|
| | | {
|
| | | field: "modifyDate",
|
| | | title: TEXT.modifyDate,
|
| | | type: "datetime",
|
| | | width: 160,
|
| | | align: "left",
|
| | | hidden: true,
|
| | | },
|
| | | ]);
|
| | |
|
| | | const detail = ref({
|
| | | cnName: "#detailCnName",
|
| | | table: "",
|
| | | columns: [],
|
| | | sortName: "",
|
| | | });
|
| | |
|
| | | const detailState = reactive({
|
| | | rowsMap: {},
|
| | | loadingMap: {},
|
| | | errorMap: {},
|
| | | });
|
| | |
|
| | | const stockStatusOptions = ref([]);
|
| | |
|
| | | const detailColumns = [
|
| | | { field: "materielName", title: TEXT.materielName, minWidth: 160 },
|
| | | { field: "serialNumber", title: TEXT.serialNumber, minWidth: 160 },
|
| | | { field: "stockQuantity", title: TEXT.stockQuantity, minWidth: 120 },
|
| | | { field: "status", title: TEXT.status, minWidth: 120 },
|
| | | { field: "inboundOrderRowNo", title: TEXT.inboundOrderRowNo, minWidth: 120 },
|
| | | ];
|
| | |
|
| | | const normalizeValue = (value) => {
|
| | | return value === null || value === undefined || value === "" ? "--" : value;
|
| | | };
|
| | |
|
| | | const formatStatusText = (value) => {
|
| | | const matched = stockStatusOptions.value.find((item) => `${item.key}` === `${value}`);
|
| | | return matched ? matched.value || matched.label : normalizeValue(value);
|
| | | };
|
| | |
|
| | | const getDetailRows = (stockId) => {
|
| | | return detailState.rowsMap[stockId] || [];
|
| | | };
|
| | |
|
| | | const loadDetailRows = async (row) => {
|
| | | if (!row || !row.id || detailState.loadingMap[row.id]) {
|
| | | return;
|
| | | }
|
| | | if (detailState.rowsMap[row.id]) {
|
| | | return;
|
| | | }
|
| | |
|
| | | detailState.loadingMap[row.id] = true;
|
| | | detailState.errorMap[row.id] = "";
|
| | | try {
|
| | | const result = await proxy.http.post("/api/StockInfoDetail/getPageData", {
|
| | | page: 1,
|
| | | rows: 200,
|
| | | sort: "id",
|
| | | order: "asc",
|
| | | wheres: JSON.stringify([
|
| | | {
|
| | | name: "stockId",
|
| | | value: String(row.id),
|
| | | displayType: "int",
|
| | | },
|
| | | ]),
|
| | | });
|
| | | detailState.rowsMap[row.id] = (result && result.rows) || [];
|
| | | } catch (error) {
|
| | | detailState.rowsMap[row.id] = null;
|
| | | detailState.errorMap[row.id] = error?.message || TEXT.detailLoadFailed;
|
| | | } finally {
|
| | | detailState.loadingMap[row.id] = false;
|
| | | }
|
| | | };
|
| | |
|
| | | const loadStockStatusOptions = async () => {
|
| | | try {
|
| | | const result = await proxy.http.post("/api/Sys_Dictionary/GetVueDictionary", ["stockStatusEmun"]);
|
| | | const matched = (result || []).find((item) => item.dicNo === "stockStatusEmun");
|
| | | stockStatusOptions.value = matched ? matched.data || [] : [];
|
| | | } catch (error) {
|
| | | stockStatusOptions.value = [];
|
| | | }
|
| | | };
|
| | |
|
| | | loadStockStatusOptions();
|
| | |
|
| | | const renderStatus = (row) => {
|
| | | if (detailState.loadingMap[row.id]) {
|
| | | return h("div", { class: "stock-detail-status" }, TEXT.detailLoading);
|
| | | }
|
| | | if (detailState.errorMap[row.id]) {
|
| | | return h(
|
| | | "div",
|
| | | { class: "stock-detail-status stock-detail-status--error" },
|
| | | detailState.errorMap[row.id]
|
| | | );
|
| | | }
|
| | | return null;
|
| | | };
|
| | |
|
| | | const renderDetailTable = (row) => {
|
| | | const statusNode = renderStatus(row);
|
| | | if (statusNode) {
|
| | | return statusNode;
|
| | | }
|
| | |
|
| | | const rows = getDetailRows(row.id);
|
| | | if (!rows.length) {
|
| | | return h("div", { class: "stock-detail-status" }, TEXT.detailEmpty);
|
| | | }
|
| | |
|
| | | return h("div", { class: "stock-detail-table-wrapper" }, [
|
| | | h("div", { class: "stock-detail-toolbar" }, [
|
| | | h("div", { class: "stock-detail-toolbar__left" }, TEXT.detailName),
|
| | | h("div", { class: "stock-detail-toolbar__right" }, [
|
| | | h("span", { class: "stock-detail-count" }, `${rows.length} æ¡`),
|
| | | ]),
|
| | | ]),
|
| | | h(
|
| | | ElTable,
|
| | | {
|
| | | data: rows,
|
| | | border: true,
|
| | | stripe: true,
|
| | | size: "small",
|
| | | class: "stock-detail-el-table",
|
| | | maxHeight: 420,
|
| | | emptyText: TEXT.detailEmpty,
|
| | | },
|
| | | () =>
|
| | | detailColumns.map((column) =>
|
| | | h(ElTableColumn, {
|
| | | key: column.field,
|
| | | prop: column.field,
|
| | | label: column.title,
|
| | | minWidth: column.minWidth,
|
| | | showOverflowTooltip: true,
|
| | | formatter: (detailRow) =>
|
| | | column.field === "status"
|
| | | ? formatStatusText(detailRow[column.field])
|
| | | : normalizeValue(detailRow[column.field]),
|
| | | })
|
| | | )
|
| | | ),
|
| | | ]);
|
| | | };
|
| | |
|
| | | const tableExpand = ref({
|
| | | width: 55,
|
| | | onChange(row, expandedRows) {
|
| | | const isExpanded = expandedRows.some((item) => item.id === row.id);
|
| | | if (isExpanded) {
|
| | | loadDetailRows(row);
|
| | | }
|
| | | },
|
| | | render(render, { row }) {
|
| | | return render("div", { class: "stock-detail-panel" }, [
|
| | | render("div", { class: "stock-detail-header" }, [
|
| | | render("div", { class: "stock-detail-header__main" }, [
|
| | | render("div", { class: "stock-detail-title" }, TEXT.detailName),
|
| | | render(
|
| | | "div",
|
| | | { class: "stock-detail-subtitle" },
|
| | | `${TEXT.expandPrefix}${normalizeValue(row.palletCode)}${TEXT.expandMiddle}${TEXT.expandLocation}${normalizeValue(row.locationCode)}`
|
| | | ),
|
| | | ]),
|
| | | // render("div", { class: "stock-detail-tags" }, [
|
| | | // render("span", { class: "stock-detail-tag" }, normalizeValue(row.palletCode)),
|
| | | // render(
|
| | | // "span",
|
| | | // { class: "stock-detail-tag stock-detail-tag--muted" },
|
| | | // normalizeValue(row.locationCode)
|
| | | // ),
|
| | | // ]),
|
| | | ]),
|
| | | renderDetailTable(row),
|
| | | ]);
|
| | | },
|
| | | });
|
| | |
|
| | | return {
|
| | | table,
|
| | | extend,
|
| | | editFormFields,
|
| | | editFormOptions,
|
| | | searchFormFields,
|
| | | searchFormOptions,
|
| | | columns,
|
| | | detail,
|
| | | tableExpand,
|
| | | };
|
| | | },
|
| | | });
|
| | | </script>
|
| | |
|
| | | <style scoped>
|
| | | .stock-detail-panel {
|
| | | margin: 4px 8px 12px;
|
| | | padding: 14px 16px 16px;
|
| | | background: linear-gradient(180deg, #ffffff 0%, #fafbfc 100%);
|
| | | border: 1px solid #e8edf3;
|
| | | border-radius: 10px;
|
| | | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7);
|
| | | }
|
| | |
|
| | | .stock-detail-header {
|
| | | display: flex;
|
| | | align-items: flex-start;
|
| | | justify-content: space-between;
|
| | | gap: 12px;
|
| | | margin-bottom: 12px;
|
| | | padding-bottom: 12px;
|
| | | border-bottom: 1px solid #edf1f5;
|
| | | }
|
| | |
|
| | | .stock-detail-header__main {
|
| | | min-width: 0;
|
| | | }
|
| | |
|
| | | .stock-detail-title {
|
| | | margin-bottom: 4px;
|
| | | font-size: 15px;
|
| | | font-weight: 700;
|
| | | color: #303133;
|
| | | }
|
| | |
|
| | | .stock-detail-subtitle {
|
| | | font-size: 13px;
|
| | | color: #606266;
|
| | | line-height: 1.6;
|
| | | }
|
| | |
|
| | | .stock-detail-tags {
|
| | | display: flex;
|
| | | flex-wrap: wrap;
|
| | | justify-content: flex-end;
|
| | | gap: 8px;
|
| | | }
|
| | |
|
| | | .stock-detail-tag {
|
| | | display: inline-flex;
|
| | | align-items: center;
|
| | | height: 28px;
|
| | | padding: 0 10px;
|
| | | color: #1f5eff;
|
| | | background: #edf4ff;
|
| | | border: 1px solid #d8e6ff;
|
| | | border-radius: 999px;
|
| | | font-size: 12px;
|
| | | font-weight: 600;
|
| | | }
|
| | |
|
| | | .stock-detail-tag--muted {
|
| | | color: #4e5969;
|
| | | background: #f4f6f8;
|
| | | border-color: #e5e9ef;
|
| | | }
|
| | |
|
| | | .stock-detail-status {
|
| | | padding: 14px 12px;
|
| | | color: #606266;
|
| | | background: #f8fafc;
|
| | | border: 1px dashed #d9e2ec;
|
| | | border-radius: 8px;
|
| | | }
|
| | |
|
| | | .stock-detail-status--error {
|
| | | color: #f56c6c;
|
| | | background: #fef0f0;
|
| | | border-color: #fde2e2;
|
| | | }
|
| | |
|
| | | .stock-detail-table-wrapper {
|
| | | overflow-x: auto;
|
| | | border: 1px solid #ebeef5;
|
| | | border-radius: 8px;
|
| | | background: #fff;
|
| | | }
|
| | |
|
| | | .stock-detail-toolbar {
|
| | | display: flex;
|
| | | align-items: center;
|
| | | justify-content: space-between;
|
| | | gap: 12px;
|
| | | padding: 12px 14px;
|
| | | background: #f8fafc;
|
| | | border-bottom: 1px solid #edf1f5;
|
| | | }
|
| | |
|
| | | .stock-detail-toolbar__left {
|
| | | font-size: 13px;
|
| | | font-weight: 600;
|
| | | color: #303133;
|
| | | }
|
| | |
|
| | | .stock-detail-count {
|
| | | display: inline-flex;
|
| | | align-items: center;
|
| | | height: 24px;
|
| | | padding: 0 10px;
|
| | | color: #606266;
|
| | | background: #fff;
|
| | | border: 1px solid #e5e9ef;
|
| | | border-radius: 999px;
|
| | | font-size: 12px;
|
| | | }
|
| | |
|
| | | :deep(.stock-detail-el-table) {
|
| | | border-top: none;
|
| | | }
|
| | |
|
| | | :deep(.stock-detail-el-table .el-table__inner-wrapper::before) {
|
| | | display: none;
|
| | | }
|
| | |
|
| | | :deep(.stock-detail-el-table th.el-table__cell) {
|
| | | background: #f5f7fa;
|
| | | color: #303133;
|
| | | font-weight: 600;
|
| | | }
|
| | |
|
| | | :deep(.stock-detail-el-table td.el-table__cell) {
|
| | | color: #606266;
|
| | | }
|
| | |
|
| | | :deep(.stock-detail-el-table .el-table__body tr:hover > td.el-table__cell) {
|
| | | background: #f0f7ff;
|
| | | }
|
| | | </style>
|
| ¶Ô±ÈÐÂÎļþ |
| | |
| | |
|
| | | <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/agvTask.jsx";
|
| | | import { ref, defineComponent } from "vue";
|
| | | export default defineComponent({
|
| | | setup() {
|
| | | const table = ref({
|
| | | key: "taskId",
|
| | | footer: "Foots",
|
| | | cnName: "ä»»å¡ä¿¡æ¯",
|
| | | name: "task",
|
| | | url: "/Task/",
|
| | | sortName: "CreateDate",
|
| | | });
|
| | | const editFormFields = ref({});
|
| | | const editFormOptions = ref([]);
|
| | | const searchFormFields = ref({
|
| | | taskNum: "",
|
| | | palletCode: "",
|
| | | roadway: "",
|
| | | taskStatus: "",
|
| | | taskType: "",
|
| | | sourceAddress: "",
|
| | | targetAddress: "",
|
| | | currentAddress: "",
|
| | | nextAddress: "",
|
| | | creater: "",
|
| | | createDate: "",
|
| | | });
|
| | | const searchFormOptions = ref([
|
| | | [
|
| | | { title: "ä»»å¡å·", field: "taskNum", type: "int" },
|
| | | { title: "æçç¼å·", field: "palletCode", type: "like" },
|
| | | { title: "å建人", field: "creater", type: "like" },
|
| | | ],
|
| | | [
|
| | | { title: "ä»»å¡ç±»å",field: "taskType",type: "selectList",dataKey: "taskTypeEnum",data: [],},
|
| | | { title: "ä»»å¡ç¶æ",field: "taskStatus",type: "selectList",dataKey: "taskStatusEnum",data: [],},
|
| | | { title: "å··éå·", field: "roadway", type: "like" },
|
| | | ],
|
| | | [
|
| | | { title: "èµ·å§å°å", field: "sourceAddress", type: "like" },
|
| | | { title: "ç®æ å°å", field: "targetAddress", type: "like" },
|
| | | { title: "å建æ¶é´", field: "createDate", type: "datetime" },
|
| | | ],
|
| | | ]);
|
| | | const columns = ref([
|
| | | {
|
| | | field: "taskId",
|
| | | title: "taskId",
|
| | | type: "int",
|
| | | width: 90,
|
| | | hidden: true,
|
| | | readonly: true,
|
| | | require: true,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "taskNum",
|
| | | title: "ä»»å¡å·",
|
| | | type: "int",
|
| | | width: 120,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "palletCode",
|
| | | title: "æçç¼å·",
|
| | | type: "string",
|
| | | width: 160,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "roadway",
|
| | | title: "å··éå·",
|
| | | type: "string",
|
| | | width: 120,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "taskType",
|
| | | title: "ä»»å¡ç±»å",
|
| | | type: "int",
|
| | | width: 120,
|
| | | align: "left",
|
| | | bind: { key: "taskTypeEnum", data: [] },
|
| | | },
|
| | | {
|
| | | field: "taskStatus",
|
| | | title: "ä»»å¡ç¶æ",
|
| | | type: "int",
|
| | | width: 150,
|
| | | align: "left",
|
| | | bind: { key: "taskStatusEnum", data: [] },
|
| | | },
|
| | | {
|
| | | field: "sourceAddress",
|
| | | title: "èµ·å§å°å",
|
| | | type: "int",
|
| | | width: 120,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "targetAddress",
|
| | | title: "ç®æ å°å",
|
| | | type: "string",
|
| | | width: 120,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "currentAddress",
|
| | | title: "å½åä½ç½®",
|
| | | type: "string",
|
| | | width: 120,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "nextAddress",
|
| | | title: "ä¸ä¸ä½ç½®",
|
| | | type: "string",
|
| | | width: 120,
|
| | | align: "left",
|
| | | },
|
| | | {
|
| | | field: "exceptionMessage",
|
| | | title: "å¼å¸¸ä¿¡æ¯",
|
| | | type: "string",
|
| | | width: 90,
|
| | | align: "left",
|
| | | },
|
| | | // {
|
| | | // field: "grade",
|
| | | // title: "ä¼å
级",
|
| | | // type: "int",
|
| | | // width: 80,
|
| | | // align: "left",
|
| | | // },
|
| | | {
|
| | | field: "depth",
|
| | | title: "深度",
|
| | | type: "int",
|
| | | width: 80,
|
| | | align: "left",
|
| | | bind: { key: "locationDepth", data: [] },
|
| | | },
|
| | | {
|
| | | field: "dispatchertime",
|
| | | title: "ä»»å¡ä¸åæ¶é´",
|
| | | type: "datetime",
|
| | | width: 160,
|
| | | align: "left",
|
| | | // hidden:true,
|
| | | },
|
| | | {
|
| | | field: "wMSId",
|
| | | title: "WMSä»»å¡ä¸»é®",
|
| | | type: "int",
|
| | | width: 120,
|
| | | align: "left",
|
| | | hidden: true,
|
| | | },
|
| | | {
|
| | | field: "creater",
|
| | | title: "å建人",
|
| | | type: "string",
|
| | | width: 90,
|
| | | 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",
|
| | | },
|
| | | {
|
| | | field: "remark",
|
| | | title: "夿³¨",
|
| | | type: "string",
|
| | | width: 100,
|
| | | align: "left",
|
| | | hidden: true,
|
| | | },
|
| | | ]);
|
| | | const detail = ref({
|
| | | cnName: "#detailCnName",
|
| | | table: "",
|
| | | columns: [],
|
| | | sortName: "",
|
| | | });
|
| | | return {
|
| | | table,
|
| | | extend,
|
| | | editFormFields,
|
| | | editFormOptions,
|
| | | searchFormFields,
|
| | | searchFormOptions,
|
| | | columns,
|
| | | detail,
|
| | | };
|
| | | },
|
| | | });
|
| | | </script>
|
| | | |
| | |
| | | type: "string", |
| | | width: 120, |
| | | align: "left", |
| | | },{ |
| | | field: "operateType", |
| | | title: "æä½ç±»å", |
| | | type: "string", |
| | | width: 120, |
| | | align: "left" |
| | | }, |
| | | { |
| | | field: "taskType", |