From d12ea44bbe77f424b17e32abf03b573edee92370 Mon Sep 17 00:00:00 2001 From: qb <1191961160@qq.com> Date: Tue, 2 Apr 2024 14:31:43 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=80=83=E6=A0=B8?= =?UTF-8?q?=E5=92=8C=E6=96=B0=E5=A2=9E=E6=8C=89=E8=BD=A6=E6=AC=A1=E5=85=A5?= =?UTF-8?q?=E5=BA=93=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../distribution/WarehousingByTrainNumber.js | 23 ++ src/option/supervise/supervise.js | 11 +- src/views/supervise/IndicatorList.vue | 47 ++-- .../waybill/WarehousingByTrainNumber.vue | 210 ++++++------------ 4 files changed, 115 insertions(+), 176 deletions(-) create mode 100644 src/api/distribution/WarehousingByTrainNumber.js diff --git a/src/api/distribution/WarehousingByTrainNumber.js b/src/api/distribution/WarehousingByTrainNumber.js new file mode 100644 index 00000000..753a4efc --- /dev/null +++ b/src/api/distribution/WarehousingByTrainNumber.js @@ -0,0 +1,23 @@ +import request from '@/axios'; + +/** + * 根据类型获取需要入库的暂存单 + */ +export const postFindIncomingOrderList = (data = {}) => { + return request({ + url: '/api/logpm-trunkline/incoming/findIncomingOrderList', + method: 'post', + data, + }); +}; + +/** + * 入库 + */ +export const postIncomingBatchOrder = (data = {}) => { + return request({ + url: '/api/logpm-trunkline/incoming/incomingBatchOrder', + method: 'post', + data, + }); +}; diff --git a/src/option/supervise/supervise.js b/src/option/supervise/supervise.js index e49ed6cb..53b28e60 100644 --- a/src/option/supervise/supervise.js +++ b/src/option/supervise/supervise.js @@ -155,8 +155,6 @@ export const managementColumnList = [ head: false, }, - - { prop: 'createTime', label: '创建时间', @@ -242,7 +240,7 @@ export const IndicatorColumnList = [ head: false, }, { - prop: 'examineDeptName', + prop: 'rangeDeptName', label: '考核范围', type: 1, values: '', @@ -253,7 +251,6 @@ export const IndicatorColumnList = [ head: false, }, - { prop: 'point', label: '考核分数', @@ -267,8 +264,8 @@ export const IndicatorColumnList = [ isshowSummary: true, }, { - prop: 'createDeptName', - label: '考核归属部门', + prop: 'examineDeptName', + label: '指标归属部门', type: 1, values: '', width: '130', @@ -335,7 +332,7 @@ export const IndicatorColumnList = [ // { // prop: 'isObjection', - // label: '是否存在异议', + // label: '是否存在异议', // type: 1, // values: '', // width: '130', diff --git a/src/views/supervise/IndicatorList.vue b/src/views/supervise/IndicatorList.vue index 07b5c03a..13391cda 100644 --- a/src/views/supervise/IndicatorList.vue +++ b/src/views/supervise/IndicatorList.vue @@ -112,10 +112,15 @@ <el-button text @click="ClassificationIndicatorView(slotProps.scope)" >查看</el-button > - <el-button v-if="slotProps.scope.row.isEdit != '0'" text @click="ClassificationDditing(slotProps.scope)">编辑</el-button> <el-button v-if="slotProps.scope.row.isEdit != '0'" text + @click="ClassificationDditing(slotProps.scope)" + >编辑</el-button + > + <el-button + v-if="slotProps.scope.row.isEdit == '1'" + text type="primary" @click="CategoryDeletion(slotProps.scope)" >删除</el-button @@ -157,11 +162,7 @@ </el-form-item> <el-form-item label="指标分类"> - <el-input - v-model="lassificationform.parentClassifyName" - - placeholder="暂无" - /> + <el-input v-model="lassificationform.parentClassifyName" placeholder="暂无" /> </el-form-item> <el-form-item label="考核部门"> @@ -173,8 +174,12 @@ </el-form-item> <el-form-item label="整改结果"> - <el-input :rows="2" - type="textarea" v-model="lassificationform.objectionRemark" placeholder="暂无" /> + <el-input + :rows="2" + type="textarea" + v-model="lassificationform.objectionRemark" + placeholder="暂无" + /> </el-form-item> <el-form-item label="考核人"> @@ -200,13 +205,11 @@ 暂无 " /> - - </el-form-item> <el-form-item label="意见反馈"> <el-input - :rows="2" - type="textarea" + :rows="2" + type="textarea" v-model="lassificationform.appealReason" placeholder="暂无" /> @@ -439,7 +442,7 @@ const pageSize = ref(50); const lassificationform = ref({}); //分类表单 const lassificationformedit = ref({}); //编辑分类表单 const title = ref(true); //标题 -const EditEnable = ref(true);//是否可以编辑 +const EditEnable = ref(true); //是否可以编辑 const EditID = ref(true); //编辑需要的ID const currentPage = ref(1); const newlyAdded = ref(false); //新增弹窗 @@ -815,10 +818,10 @@ const selectionChange = list => { console.log(selectionList.value, '已经选中的数据'); }; function ProhibitSelection(val, index) { - if (val.isEdit == '0') { - return false; - } else { + if (val.isEdit == '1') { return true; + } else { + return false; } } const searchHide = () => { @@ -888,9 +891,9 @@ const ClassificationIndicatorView = val => { } // 是否存在异议 0 表示没有1表示存在 - if (res.data.data.isObjection=='0') { + if (res.data.data.isObjection == '0') { lassificationform.value.isObjection = '没有'; - } else if(res.data.data.isObjection=='1') { + } else if (res.data.data.isObjection == '1') { lassificationform.value.isObjection = '存在'; } console.log(res.data.data.pictures, '图片列表'); @@ -953,10 +956,10 @@ const ClassificationIndicatorView = val => { // 编辑弹窗展开 const ClassificationDditing = async val => { console.log(val, '编辑弹窗展开'); - if(val.row.isEdit ==1){ - EditEnable.value=false; - }else if(val.row.isEdit == 2){ - EditEnable.value=true; + if (val.row.isEdit == 1) { + EditEnable.value = false; + } else if (val.row.isEdit == 2) { + EditEnable.value = true; } srcList.value = []; fileList.value = []; diff --git a/src/views/waybill/WarehousingByTrainNumber.vue b/src/views/waybill/WarehousingByTrainNumber.vue index 12058f13..90085b95 100644 --- a/src/views/waybill/WarehousingByTrainNumber.vue +++ b/src/views/waybill/WarehousingByTrainNumber.vue @@ -5,8 +5,19 @@ <div v-h5uShow="!search"> <!-- 查询模块 --> <el-form :inline="true" :model="query" class="header_search"> - <el-form-item label="车次号"> - <el-input v-model="query.trainNumber" placeholder="请输入车次号" clearable></el-input> + <el-form-item label="搜索模式"> + <el-radio-group v-model="details.searchType" class="ml-4"> + <el-radio label="orderCode">订单号</el-radio> + <el-radio label="carsNo">车次号</el-radio> + </el-radio-group> + </el-form-item> + + <el-form-item :label="details.searchType === 'orderCode' ? '订单号' : '车次号'"> + <el-input + v-model="query.incomingCode" + :placeholder="'请输入' + details.searchType === 'orderCode' ? '订单号' : '车次号'" + clearable + ></el-input> </el-form-item> <!-- 查询按钮 --> <el-form-item class="el-btn"> @@ -36,6 +47,7 @@ <el-row> <!-- 列表模块 --> <tablecmt + ref="tableNodeRef" :columnList="details.columnList" :tableData="details.data" :loading="loadingObj.packageListLoading" @@ -55,19 +67,6 @@ <el-row class="el-fy"> <div class="avue-crud__pagination flex-c-sb" style="width: 100%"> <div style="font-size: 14px">勾选数量: {{ selectionList.length }}</div> - <!-- 分页模块 --> - <el-pagination - align="right" - background - @size-change="sizeChange" - @current-change="currentChange" - :current-page="page.currentPage" - :page-sizes="[30, 50, 80, 120]" - :page-size="page.pageSize" - layout="total, sizes, prev, pager, next, jumper" - :total="page.total" - > - </el-pagination> </div> </el-row> </div> @@ -89,18 +88,26 @@ import dayjs from 'dayjs'; import { mapGetters } from 'vuex'; /** 获取字典 */ import { getDictionaryBiz } from '@/api/system/dict'; -import { getopenOrderAdvancePageList } from '@/api/waybill/TemporaryStorageList'; -import { showOrderPackgeCode } from '@/api/distribution/distributionStockArticle'; +import { + postFindIncomingOrderList, + postIncomingBatchOrder, +} from '@/api/distribution/WarehousingByTrainNumber'; import { downloadXls, setNodeHeight, getHtmls } from '@/utils/util'; import { columnList } from '@/option/waybill/WarehousingByTrainNumber'; import { useRouter } from 'vue-router'; import print from '@/utils/print'; import { ElMessage, ElMessageBox } from 'element-plus'; +import { submit } from '@/api/base/region'; // 获取路由实例 const $router = useRouter(); +// 表格实例 +const tableNodeRef = ref(); + const details = reactive<any>({ + /** 搜索模式 */ + searchType: 'orderCode', /** 是否开启搜索 */ search: false, /** 表格搜索条件 */ @@ -140,7 +147,7 @@ const details = reactive<any>({ /** 包明细表头 */ columnList, /** 包明细数据 */ - data: [{}], + data: [], /** 页面loading */ loadingObj: { /** 列表加载loading */ @@ -172,44 +179,44 @@ const details = reactive<any>({ form: {}, }); -const { - search, - query, - shortcuts, - stockupDate, - data, - loadingObj, - selectionList, - drawerShow, - page, - popUpShow, -} = toRefs(details); +const { search, query, loadingObj, selectionList, drawerShow } = toRefs(details); /** vuex */ const permission = computed(() => mapGetters(['permission', 'tagWel', 'tagList'])); console.log('permission :>> ', permission); -onMounted(() => { - const timer = setTimeout(() => { - details.listNode = document.querySelector('.maboxhi'); - console.log('details.listNode :>> ', details.listNode); - details.listNode.style.transition = 'all .5s ease-out'; - console.log('details.listNode :>> ', details.listNode); - clearTimeout(timer); - }, 100); -}); - /** 请求页面数据 */ -const onLoad = async (page: any, params = {}) => { - // 获取暂存单列表 - details.data = await getopenOrderAdvancePageList(page, { ...details.query, ...params }); +const onLoad = async (params = {}) => { + try { + details.loadingObj.list = true; + + // 获取暂存单列表 + const submitData = { + ...details.query, + ...params, + }; + + // 按订单是5, 车次是4 + submitData.incomingType = details.searchType === 'orderCode' ? 5 : 4; + + const res = await postFindIncomingOrderList(submitData); + + const { code, data } = res.data; + if (code !== 200) return; + details.data = data; + } catch (error) { + console.log('error :>> ', error); + } finally { + details.loadingObj.list = false; + } }; -onLoad(details.page); - /** 搜索 */ const searchChange = () => { - onLoad(details.page); + if (!details.searchType) return ElMessage.error('请选择搜索模式'); + if (!details.query.incomingCode) return ElMessage.error('请输入搜索内容'); + + onLoad(); }; /** 清空表单 */ @@ -217,7 +224,7 @@ const searchReset = () => { details.query = {}; details.stockupDate = []; details.page.currentPage = 1; - onLoad(details.page); + onLoad(); }; /** 展开列表控件 */ @@ -229,13 +236,13 @@ const showdrawer = (_flag?: boolean) => { const searchHide = () => { details.search = !details.search; - setNodeHeight(details.listNode, '', true); + setNodeHeight(tableNodeRef.value.$el, '', true); }; /** 表格表头输入框搜索 */ const inputsc = (index, row) => { details.query[row.prop] = index; - onLoad(details.page); + onLoad(); }; /** 表格表头时间选择 */ @@ -248,7 +255,7 @@ const timesc = (index, row) => { if (!index) { delete details.query[row.prop]; } - onLoad(details.page); + onLoad(); }; /** 表格表头输入框搜索 */ @@ -256,13 +263,12 @@ const btnsc = () => {}; /** 表格表头下拉框选择 */ const selectsc = (index, row) => { - details.query[row.prop] = index; - if (!index) delete details.query[row.prop]; - if (row.prop === 'certificateTypeName') { - details.query['certificateType'] = index; - if (!index) delete details.query['certificateType']; - } - onLoad(details.page); + const _prop = row.prop.replace('Name', ''); + + details.query[_prop] = index; + if (!index) delete details.query[_prop]; + + onLoad(); }; /** 表格表头复选框选择 */ @@ -270,15 +276,6 @@ const selectionChange = (list: any) => { details.selectionList = list; }; -/** 每页数量改变执行的回调 */ -const sizeChange = (pageSize: number) => { - details.page.pageSize = pageSize; - onLoad(details.page); -}; - -/** 页码改变执行的回调 */ -const currentChange = () => {}; - /** * 设置列表 -- 固定函数 * 弹窗的勾选回调,用于更改头部数组 @@ -297,46 +294,6 @@ const setnewcolum = (newarr, headarr, type) => { } }; -/** 弹出层开启前清除数据 */ -const beforeClose = done => { - done(); - details.form = {}; - details.selectionList = []; - details.view = false; -}; - -/** - * 是否开启全屏 - * @params(_type) 开启或关闭 - */ -const handleFullScrean = (_type: 'open' | 'close', _name: string) => { - let _node = ''; - if (_name) _node = document.querySelector(`.${_name} .maboxhi`); - - switch (_name) { - // 包内产品 - case 'packageDetailColumnListVisited': - details.fullscreenObj.packageDetailColumnListVisited = - !details.fullscreenObj.packageDetailColumnListVisited; - - if (_type === 'close') { - if (_node) setNodeHeight(_node, '500px'); - } else { - if (_node) setNodeHeight(_node); - } - break; - - default: - details.fullscreenObj[_name] = !details.fullscreenObj[_name]; - if (_type === 'close') { - if (_node) setNodeHeight(_node, '500px'); - } else { - if (_node) setNodeHeight(_node); - } - break; - } -}; - /** 入库 */ const handlePutInStorage = row => { ElMessageBox.confirm('确认批量入库吗?', '警告', { @@ -371,19 +328,6 @@ const handlePutInStorage = row => { height: 100% !important; } -// 新增行 -.add_row { - display: flex; - justify-content: space-between; -} - -.add_row_title { - text-align: center; - margin-bottom: 10px; - font-size: 18px; - font-weight: bold; -} - // 统计行 .statistics_row { margin: 10px 0; @@ -395,32 +339,4 @@ const handlePutInStorage = row => { margin-right: 20px; } } - -// 卡片容器 -.crad_container { - display: flex; - - .card_container_item { - flex: 1; - // padding: 10px; - border-radius: 5px; - box-shadow: 0 0 5px #ccc; - - &:first-child { - margin-right: 20px; - } - - .card_container_item_title { - padding: 10px; - border-bottom: 1px solid #ccc; - display: flex; - justify-content: space-between; - align-items: center; - } - - .card_container_item_box { - padding: 10px; - } - } -} </style> From 1b9ad4b2ed8557572f2475502e2e4dc44beab1c3 Mon Sep 17 00:00:00 2001 From: qb <1191961160@qq.com> Date: Tue, 2 Apr 2024 18:20:16 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E5=AE=A2=E6=88=B7=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E4=BB=98=E6=AC=BE=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/option/distribution/BookingNote.js | 10 +- .../waybill/WarehousingByTrainNumber.js | 2 +- src/views/basicdata/brand/basicClient.vue | 286 ++++++++++-------- src/views/waybill/CreateZeroOrder.vue | 22 +- src/views/waybill/TemporaryStorageList.vue | 113 +++---- .../waybill/WarehousingByTrainNumber.vue | 104 ++++++- 6 files changed, 331 insertions(+), 206 deletions(-) diff --git a/src/option/distribution/BookingNote.js b/src/option/distribution/BookingNote.js index 6d424c95..cc547aa9 100644 --- a/src/option/distribution/BookingNote.js +++ b/src/option/distribution/BookingNote.js @@ -136,7 +136,7 @@ export const ChangeOrderColumnList = [ head: false, }, { - prop: 'unloadNumber', + prop: 'operationRemark', label: '修改内容', type: 1, values: '', @@ -146,7 +146,7 @@ export const ChangeOrderColumnList = [ sortable: true, }, { - prop: 'NumberOfPiecesInTheCar', + prop: 'createTime', label: '申请时间', type: 1, values: '', @@ -156,7 +156,7 @@ export const ChangeOrderColumnList = [ sortable: true, }, { - prop: 'unloadNumber', + prop: 'warehouseName', label: '申请网点', type: 1, values: '', @@ -166,7 +166,7 @@ export const ChangeOrderColumnList = [ sortable: true, }, { - prop: 'NumberOfPiecesInTheCar', + prop: 'createUserName', label: '申请人', type: 1, values: '', @@ -176,7 +176,7 @@ export const ChangeOrderColumnList = [ sortable: true, }, { - prop: 'unloadNumber', + prop: 'aaa', label: '修改原因', type: 1, values: '', diff --git a/src/option/waybill/WarehousingByTrainNumber.js b/src/option/waybill/WarehousingByTrainNumber.js index 433db9b6..9b0fd507 100644 --- a/src/option/waybill/WarehousingByTrainNumber.js +++ b/src/option/waybill/WarehousingByTrainNumber.js @@ -16,7 +16,7 @@ export const columnList = [ fixed: true, }, { - prop: 'billladingCode', + prop: 'orderCode', label: '订单自编号', type: 1, values: '', diff --git a/src/views/basicdata/brand/basicClient.vue b/src/views/basicdata/brand/basicClient.vue index fcd9534b..0ccaedbc 100644 --- a/src/views/basicdata/brand/basicClient.vue +++ b/src/views/basicdata/brand/basicClient.vue @@ -287,6 +287,16 @@ <el-form-item label="详细地址" prop="detailedly"> <el-input v-model="form.detailedly" placeholder="请填写详细地址" style="width: 100%" /> </el-form-item> + <el-form-item label="默认付款方式" prop="defaultPaymentMethods"> + <el-select v-model="form.defaultPaymentMethods" placeholder="请选择默认付款方式"> + <el-option + v-for="item in defaultPaymentMethodsOptions" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + </el-form-item> <!-- <el-form-item label="三方商城" prop="tripartiteMall">--> <!-- <el-input v-model="form.tripartiteMall" placeholder="请填写三方商城" style="width: 100%" />--> <!-- </el-form-item>--> @@ -319,7 +329,7 @@ :limit="3" :on-exceed="handleExceed" > - <el-button>上传</el-button> + <el-button type="Primary" icon="Position">上传</el-button> <template #tip> <div class="el-upload__tip">大小不超过500KB的jpg/png文件。</div> </template> @@ -333,35 +343,23 @@ /> </el-form-item> <el-form-item label="合同开始时间" prop="contractStartTime" label-width="120px"> - <!-- <el-input v-model="form.contractStartTime" placeholder="请输入合同开始时间"/>--> - <div class="demo-date-picker" style="width: 60%"> - <div class="block"> - <!-- <span class="demonstration">Default</span>--> - <el-date-picker - v-model="form.contractStartTime" - type="date" - placeholder="选择时间" - format="YYYY/MM/DD HH:mm:ss" - value-format="YYYY-MM-DD HH:mm:ss" - /> - </div> - </div> + <el-date-picker + v-model="form.contractStartTime" + type="date" + placeholder="选择时间" + format="YYYY/MM/DD HH:mm:ss" + value-format="YYYY-MM-DD HH:mm:ss" + /> </el-form-item> <el-form-item label="合同结束时间" prop="contractEntTime" label-width="120px"> - <!-- <el-input v-model="form.contractEntTime" placeholder="请输入合同结束时间"/>--> - <div class="demo-date-picker"> - <div class="block"> - <!-- <span class="demonstration">Default</span>--> - <el-date-picker - v-model="form.contractEntTime" - type="date" - placeholder="选择时间" - format="YYYY/MM/DD HH:mm:ss" - value-format="YYYY-MM-DD HH:mm:ss" - /> - </div> - </div> + <el-date-picker + v-model="form.contractEntTime" + type="date" + placeholder="选择时间" + format="YYYY/MM/DD HH:mm:ss" + value-format="YYYY-MM-DD HH:mm:ss" + /> </el-form-item> </el-form> <!-- 表单按钮 --> @@ -756,24 +754,26 @@ export default { { required: true, message: '请输入客户名称', trigger: 'blur' }, // { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' } ], - typeService: [{ required: true, message: '请选择客户端类型', trigger: 'blur' }], + typeService: [{ required: true, message: '请选择客户端类型', trigger: ['blur', 'change'] }], businessType: [ { required: true, message: '请选择配送业务类型', trigger: 'change' }, - // { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' } + // { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: ['blur', 'change'] } ], clientType: [{ required: true, message: '请选择客户类型', trigger: 'change' }], typeServiceList: [{ required: true, message: '请选择服务类型', trigger: 'change' }], - linkman: [{ required: true, message: '请填写联系人', trigger: 'blur' }], - detailedly: [{ required: true, message: '请填写详细地址', trigger: 'blur' }], - phone: [{ required: true, message: '请填写联系电话', trigger: 'blur' }], - contractEntTime: [ - { type: 'date', required: true, message: '请选择合同结束时间', trigger: 'change' }, - ], - contractStartTime: [ - { type: 'date', required: true, message: '请选择合同开始时间', trigger: 'change' }, - ], + linkman: [{ required: true, message: '请填写联系人', trigger: ['blur', 'change'] }], + detailedly: [{ required: true, message: '请填写详细地址', trigger: ['blur', 'change'] }], + phone: [{ required: true, message: '请填写联系电话', trigger: ['blur', 'change'] }], + // contractEntTime: [ + // { type: 'date', required: true, message: '请选择合同结束时间', trigger: 'change' }, + // ], + // contractStartTime: [ + // { type: 'date', required: true, message: '请选择合同开始时间', trigger: 'change' }, + // ], bladeRegionProvinceId: [{ required: true, message: '请选择地址', trigger: 'change' }], - // leaseAccessories: [{ required: true, message: '请上传合同文件', trigger: 'blur' }], + defaultPaymentMethods: [ + { required: true, message: '请选择默认付款方式', trigger: 'change' }, + ], }, bianji: false, @@ -782,6 +782,29 @@ export default { name: '', phone: '', }, + /** 付款方式 */ + defaultPaymentMethodsOptions: [ + { + value: '1', + label: '现付', + }, + { + value: '2', + label: '到付', + }, + { + value: '3', + label: '月结', + }, + { + value: '4', + label: '回付', + }, + { + value: '5', + label: '内部结算', + }, + ], }; }, created() {}, @@ -1218,6 +1241,10 @@ export default { this.box = true; this.distriType = false; this.viewClientEntd = false; + this.$nextTick(() => { + this.$refs.form.resetFields(); + this.form.defaultPaymentMethods = '1'; + }); }, handleAddSon(row) { console.log(row); @@ -1455,102 +1482,104 @@ export default { this.query.bladeRegionAreaId = this.query.bladeRegionProvinceId[2]; this.query.bladeRegionProvinceId = this.query.bladeRegionProvinceId[0]; } - getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => { - const data = res.data.data; - console.log(data); + getList(page.currentPage, page.pageSize, Object.assign(params, this.query)) + .then(res => { + const data = res.data.data; + console.log(data); - data.records.forEach(i => { - let ke = this.clientType.find(kh => parseInt(kh.dictKey) == parseInt(i.clientType)); - // console.log("客户类型<><><>",ke); - if (!!ke) { - i.clientTypeName = ke.dictValue; - // console.log('==-=-=', i.clientType, ke.dictKey, ke.dictValue); - } - if (!i.clientType) { - i.clientTypeName = '无'; - } - let typeServiceName = []; + data.records.forEach(i => { + let ke = this.clientType.find(kh => parseInt(kh.dictKey) == parseInt(i.clientType)); + // console.log("客户类型<><><>",ke); + if (!!ke) { + i.clientTypeName = ke.dictValue; + // console.log('==-=-=', i.clientType, ke.dictKey, ke.dictValue); + } + if (!i.clientType) { + i.clientTypeName = '无'; + } + let typeServiceName = []; - if (!i.typeServiceBusiness) { - i.typeServiceName = '无'; - } else { - i.typeServiceBusiness.forEach(ty => { - let fuw = this.freightType.find( - fw => parseInt(fw.dictKey) == parseInt(ty.typeService) - ); - if (!!fuw) { - // console.log("fuw",fuw); - typeServiceName.push(fuw.dictValue); - // console.log('==-=-=', i.typeService, fuw.dictKey, fuw.dictValue); - } - }); - i.typeServiceNameFy = typeServiceName.join(','); - } - }); - // 缺少判断 - // let dz = ''; - // data.records.forEach(it => { - // let arrsheng = this.optioner.filter(i => { - // return it.bladeRegionProvinceId == i.value; - // }); - // if (arrsheng.length == 0) return; - // // console.log("========",JSON.parse(JSON.stringify(arrsheng)) ); - // let arrshi = arrsheng[0].children.filter(i => { - // return it.bladeRegionCityId == i.value; - // }); - // // console.log("========",JSON.parse(JSON.stringify(arrsheng)) ); - // let arrqu = arrshi[0].children.filter(i => { - // return it.bladeRegionAreaId == i.value; - // }); - - // // console.log("========",JSON.parse(JSON.stringify(arrsheng)) ); - // dz = - // arrsheng[0].label + - // (arrshi[0].label ? `/${arrshi[0].label}` : ``) + - // (arrqu[0]?.label ? `/${arrqu[0]?.label}` : ''); - // it.bladeRegionProvinceId = dz; - // }); - // 修改后 - let dz = ''; - data.records.forEach(it => { - let arrsheng = this.optioner.filter(i => { - return it.bladeRegionProvinceId == i.value; + if (!i.typeServiceBusiness) { + i.typeServiceName = '无'; + } else { + i.typeServiceBusiness.forEach(ty => { + let fuw = this.freightType.find( + fw => parseInt(fw.dictKey) == parseInt(ty.typeService) + ); + if (!!fuw) { + // console.log("fuw",fuw); + typeServiceName.push(fuw.dictValue); + // console.log('==-=-=', i.typeService, fuw.dictKey, fuw.dictValue); + } + }); + i.typeServiceNameFy = typeServiceName.join(','); + } }); - let shengLabel = arrsheng.length > 0 ? arrsheng[0].label : ''; // 保存省级地址 + // 缺少判断 + // let dz = ''; + // data.records.forEach(it => { + // let arrsheng = this.optioner.filter(i => { + // return it.bladeRegionProvinceId == i.value; + // }); + // if (arrsheng.length == 0) return; + // // console.log("========",JSON.parse(JSON.stringify(arrsheng)) ); + // let arrshi = arrsheng[0].children.filter(i => { + // return it.bladeRegionCityId == i.value; + // }); + // // console.log("========",JSON.parse(JSON.stringify(arrsheng)) ); + // let arrqu = arrshi[0].children.filter(i => { + // return it.bladeRegionAreaId == i.value; + // }); - if (arrsheng.length === 0) { - it.bladeRegionProvinceId = shengLabel; // 若未找到省数据,直接将省级地址作为结果 - return; - } + // // console.log("========",JSON.parse(JSON.stringify(arrsheng)) ); + // dz = + // arrsheng[0].label + + // (arrshi[0].label ? `/${arrshi[0].label}` : ``) + + // (arrqu[0]?.label ? `/${arrqu[0]?.label}` : ''); + // it.bladeRegionProvinceId = dz; + // }); + // 修改后 + let dz = ''; + data.records.forEach(it => { + let arrsheng = this.optioner.filter(i => { + return it.bladeRegionProvinceId == i.value; + }); + let shengLabel = arrsheng.length > 0 ? arrsheng[0].label : ''; // 保存省级地址 - let arrshi = arrsheng[0].children.filter(i => { - return it.bladeRegionCityId == i.value; - }); - let shiLabel = arrshi.length > 0 ? arrshi[0].label : ''; // 保存市级地址 + if (arrsheng.length === 0) { + it.bladeRegionProvinceId = shengLabel; // 若未找到省数据,直接将省级地址作为结果 + return; + } - if (arrshi.length === 0) { - dz = shengLabel; // 若未找到市数据,直接将省级地址作为结果 - } else { - let arrqu = arrshi[0].children.filter(i => { - return it.bladeRegionAreaId == i.value; + let arrshi = arrsheng[0].children.filter(i => { + return it.bladeRegionCityId == i.value; }); + let shiLabel = arrshi.length > 0 ? arrshi[0].label : ''; // 保存市级地址 - let quLabel = arrqu.length > 0 ? arrqu[0].label : ''; // 保存区级地址 + if (arrshi.length === 0) { + dz = shengLabel; // 若未找到市数据,直接将省级地址作为结果 + } else { + let arrqu = arrshi[0].children.filter(i => { + return it.bladeRegionAreaId == i.value; + }); - dz = shengLabel + (shiLabel ? `/${shiLabel}` : '') + (quLabel ? `/${quLabel}` : ''); - } + let quLabel = arrqu.length > 0 ? arrqu[0].label : ''; // 保存区级地址 - it.bladeRegionProvinceId = dz; + dz = shengLabel + (shiLabel ? `/${shiLabel}` : '') + (quLabel ? `/${quLabel}` : ''); + } + + it.bladeRegionProvinceId = dz; + }); + this.page.total = data.total; + this.data = data.records; + this.data = this.$functions.newdatas(this.columnList, this.data); + this.loading = false; + this.selectionClear(); + }) + .catch(() => { + this.data = []; + this.loading = false; }); - this.page.total = data.total; - this.data = data.records; - this.data = this.$functions.newdatas(this.columnList, this.data); - this.loading = false; - this.selectionClear(); - }).catch(()=>{ - this.data =[] - this.loading = false; - }); }, }, }; @@ -1577,4 +1606,13 @@ export default { :deep(.el-cascader) { width: 100%; } + +:deep(.el-date-editor.el-input) { + height: 100% !important; + width: 100% !important; +} + +:deep(.el-select) { + width: 100% !important; +} </style> diff --git a/src/views/waybill/CreateZeroOrder.vue b/src/views/waybill/CreateZeroOrder.vue index acf96e80..ed35c0aa 100644 --- a/src/views/waybill/CreateZeroOrder.vue +++ b/src/views/waybill/CreateZeroOrder.vue @@ -1764,22 +1764,22 @@ let _ant1 = null; const remoteMethod = val => { if (_ant1) clearTimeout(_ant1); _ant1 = setTimeout(async () => { - if (val) { - try { - details.loadingObj.loading = true; - const res = await getOpenOrderAdvanceFindWarehouseList({ warehouseName: val }); - const { data, code } = res.data; - if (code !== 200) return; - details.options = data || []; - } catch (error) { - } finally { - details.loadingObj.loading = false; - } + try { + details.loadingObj.loading = true; + const res = await getOpenOrderAdvanceFindWarehouseList({ warehouseName: val }); + const { data, code } = res.data; + if (code !== 200) return; + details.options = data || []; + } catch (error) { + } finally { + details.loadingObj.loading = false; } clearTimeout(_ant1); }, 1000); }; +remoteMethod(''); + /** 目的仓选择时给目的仓名称赋值 */ const destinationWarehouseNameChange = val => { details.query.destinationWarehouseName = details.options.find( diff --git a/src/views/waybill/TemporaryStorageList.vue b/src/views/waybill/TemporaryStorageList.vue index b9ac67de..d43e1980 100644 --- a/src/views/waybill/TemporaryStorageList.vue +++ b/src/views/waybill/TemporaryStorageList.vue @@ -311,27 +311,25 @@ </el-form> </div> - <template #footer> - <div class="flex-c-c dialog-footer"> - <el-button - icon="Position" - type="primary" - :loading="details.loadingObj.addTagLoading" - @click="handleSubmitAddTag(ruleFormRef)" - > - 提 交 - </el-button> - <el-button - icon="Refresh" - type="primary" - :loading="details.loadingObj.addTagLoading" - @click="handleRefreshAddTag(ruleFormRef)" - > - 重 置 - </el-button> - <el-button icon="Close" @click="details.popUpShow.addTagVisited = false"> 取 消 </el-button> - </div> - </template> + <div class="flex-c-c dialog-footer"> + <el-button icon="Close" @click="details.popUpShow.addTagVisited = false"> 取 消 </el-button> + <el-button + icon="Refresh" + type="primary" + :loading="details.loadingObj.addTagLoading" + @click="() => handleRefreshAddTag(ruleFormRef)" + > + 重 置 + </el-button> + <el-button + icon="Position" + type="primary" + :loading="details.loadingObj.addTagLoading" + @click="() => handleSubmitAddTag(ruleFormRef)" + > + 提 交 + </el-button> + </div> </el-dialog> <!-- 导入 -- 批量开标签 --> @@ -1237,50 +1235,63 @@ const handleClose = res => { }; /** 开标签提交 */ -const handleSubmitAddTag = async (formEl: FormInstance | undefined) => { +const handleSubmitAddTag = (formEl: FormInstance | undefined) => { if (!formEl) return; - await formEl.validate(async (valid, fields) => { - if (valid) { - console.log('submit!'); - - console.log('details.addTagForm :>> ', details.addTagForm); - try { - if (details.addTagForm.area.length < 2) return ElMessage.warning('区域最少选择到市'); - - details.loadingObj.addTagLoading = true; - - const res = await postOpenLabel({ - ...details.addTagForm, - area: details.addTagForm.area.join(','), - }); - const { code } = res.data; - - if (code !== 200) return; - ElMessage.success('添加成功'); - details.popUpShow.addTagVisited = false; - initOnLoad({}, true); - } catch (error) { - console.log('error :>> ', error); - } finally { - details.loadingObj.addTagLoading = false; + formEl.validate((valid, fields) => { + ElMessageBox.confirm('确认提交吗?', '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning', + }).then(async () => { + if (valid) { + console.log('submit!'); + + console.log('details.addTagForm :>> ', details.addTagForm); + try { + if (details.addTagForm.area.length < 2) return ElMessage.warning('区域最少选择到市'); + + details.loadingObj.addTagLoading = true; + + const res = await postOpenLabel({ + ...details.addTagForm, + area: details.addTagForm.area.join(','), + }); + const { code } = res.data; + + if (code !== 200) return; + ElMessage.success('添加成功'); + details.popUpShow.addTagVisited = false; + initOnLoad({}, true); + } catch (error) { + console.log('error :>> ', error); + } finally { + details.loadingObj.addTagLoading = false; + } + } else { + console.log('error submit!', fields); } - } else { - console.log('error submit!', fields); - } + }); }); }; /** 开标签重置 */ const handleRefreshAddTag = (formEl: FormInstance | undefined) => { + console.log('123123 :>> ', 123123); if (!formEl) return; - formEl.resetFields(); + ElMessageBox.confirm('确认重置吗?', '提示', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + formEl.resetFields(); + }); }; /** 开启开标签弹窗 */ const handleOpenAddTagDlog = () => { details.popUpShow.addTagVisited = true; - handleRefreshAddTag(ruleFormRef.value); + ruleFormRef.value.resetFields(); }; onActivated(() => { diff --git a/src/views/waybill/WarehousingByTrainNumber.vue b/src/views/waybill/WarehousingByTrainNumber.vue index 90085b95..c9fee6a9 100644 --- a/src/views/waybill/WarehousingByTrainNumber.vue +++ b/src/views/waybill/WarehousingByTrainNumber.vue @@ -1,6 +1,6 @@ <template> <basic-container> - <div class="avue-crud"> + <div class="avue-crud" v-loading="details.loadingObj.pageLoading"> <!-- 搜索模块 --> <div v-h5uShow="!search"> <!-- 查询模块 --> @@ -32,7 +32,9 @@ <div class="avue-crud__header"> <!-- 头部左侧按钮模块 --> <div class="avue-crud__left"> - <el-button type="primary" icon="Van" @click="handlePutInStorage">批量入库</el-button> + <el-button type="primary" icon="Van" @click="handleBatchPutInStorage" + >批量入库</el-button + > </div> <!-- 头部右侧按钮模块 --> <div class="avue-crud__right"> @@ -50,15 +52,24 @@ ref="tableNodeRef" :columnList="details.columnList" :tableData="details.data" - :loading="loadingObj.packageListLoading" + :loading="loadingObj.list" @inputTxt="inputsc" @timeCheck="timesc" @btnCheck="btnsc" @selectCheck="selectsc" @selection="selectionChange" + :isselectfun="handleIsSelect" > <template #default="slotProps"> - <template v-if="slotProps.scope.column.label === '操作'"> </template> + <template v-if="slotProps.scope.column.label === '操作'"> + <el-text + v-if="Number(slotProps.scope.row.isIncoming) === 1" + @click="handlePutInStorage(slotProps.scope)" + > + 入库 + </el-text> + <el-text @click="handleGoDetails(slotProps.scope)">包明细</el-text> + </template> </template> </tablecmt> </el-row> @@ -152,7 +163,7 @@ const details = reactive<any>({ loadingObj: { /** 列表加载loading */ list: false, - packageListLoading: false, + pageLoading: false, }, /** 列表复选框选中的数据 */ selectionList: [], @@ -222,9 +233,10 @@ const searchChange = () => { /** 清空表单 */ const searchReset = () => { details.query = {}; - details.stockupDate = []; - details.page.currentPage = 1; - onLoad(); + details.data = []; + for (let i = 0; i < details.columnList.length; i++) { + details.columnList[i].values = ''; + } }; /** 展开列表控件 */ @@ -242,6 +254,7 @@ const searchHide = () => { /** 表格表头输入框搜索 */ const inputsc = (index, row) => { details.query[row.prop] = index; + if (!index) delete details.query[row.prop]; onLoad(); }; @@ -295,20 +308,83 @@ const setnewcolum = (newarr, headarr, type) => { }; /** 入库 */ -const handlePutInStorage = row => { +const handlePutInStorage = ({ row }) => { + ElMessageBox.confirm('确认批量入库吗?', '警告', { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning', + }) + .then(async () => { + try { + details.loadingObj.pageLoading = true; + + const res = await postIncomingBatchOrder({ + advanceIds: [row.id], + incomingType: details.searchType === 'orderCode' ? 5 : 4, + }); + + const { code, msg } = res.data; + if (code !== 200) return; + ElMessage.success(msg); + onLoad(); + } catch (error) { + console.log('error :>> ', error); + } finally { + details.loadingObj.pageLoading = false; + } + }) + .catch(() => {}); +}; + +/** 批量入库 */ +const handleBatchPutInStorage = () => { + if (!details.selectionList.length) return ElMessage.error('请选择需要入库的数据'); + ElMessageBox.confirm('确认批量入库吗?', '警告', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }) - .then(() => { - ElMessage({ - type: 'success', - message: '入库成功', - }); + .then(async () => { + try { + details.loadingObj.pageLoading = true; + + const res = await postIncomingBatchOrder({ + advanceIds: details.selectionList.map(val => val.id), + incomingType: details.searchType === 'orderCode' ? 5 : 4, + }); + + const { code, msg } = res.data; + if (code !== 200) return; + ElMessage.success(msg); + onLoad(); + } catch (error) { + console.log('error :>> ', error); + } finally { + details.loadingObj.pageLoading = false; + } }) .catch(() => {}); }; + +/** 详情 */ +const handleGoDetails = ({ row }) => { + $router.push({ + path: '/waybill/orderPackageListDetails?name=包明细', + query: { + id: row.id, + name: `订单 -- ${row.orderCode} 包明细`, + }, + }); +}; + +const handleIsSelect = val => { + if (Number(val.isIncoming) === 1) { + return true; + } else { + return false; + } +}; </script> <style scoped lang="scss"> From 759994dbb873ba79f3f14f3380fceda1652358d6 Mon Sep 17 00:00:00 2001 From: qb <1191961160@qq.com> Date: Tue, 2 Apr 2024 18:44:18 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E5=AE=A2=E6=88=B7=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E6=96=B0=E5=A2=9Eloading?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/basicdata/brand/basicClient.vue | 417 ++++++++++++---------- 1 file changed, 221 insertions(+), 196 deletions(-) diff --git a/src/views/basicdata/brand/basicClient.vue b/src/views/basicdata/brand/basicClient.vue index 0ccaedbc..8247b55d 100644 --- a/src/views/basicdata/brand/basicClient.vue +++ b/src/views/basicdata/brand/basicClient.vue @@ -60,7 +60,7 @@ <el-button type="danger" icon="el-icon-delete" @click="handleDelete" plain >删 除</el-button > - <el-button type="danger" icon="el-icon-delete" @click="handleImport">导 入 </el-button> + <el-button type="danger" icon="Upload" @click="handleImport">导 入 </el-button> </div> <!-- 头部右侧按钮模块 --> <div class="avue-crud__right"> @@ -184,193 +184,201 @@ :close-on-click-modal="false" append-to-body > - <el-form :disabled="view" ref="form" :model="form" :rules="rules" label-width="120px"> - <!-- 表单字段 --> - <el-form-item label="客户编码" prop="clientCode"> - <el-input - v-model="form.clientCode" - :validate-method="validateInput" - placeholder="请输入客户编码" - style="width: 100%" - :disabled="viewClientEntd" - /> - </el-form-item> - <el-form-item label="客户名称" prop="clientName"> - <el-input v-model="form.clientName" placeholder="请输入客户名称" style="width: 100%" /> - </el-form-item> - <el-form-item label="客户类型" prop="clientType"> - <!-- <el-input v-model="form.clientName" placeholder="请输入客户名称" style="width: 100%"/>--> - <!-- <el-select v-model="form.clientType" class="m-2" placeholder="请选择客户类型" style="width: 100%">--> - <!-- <el-option label="发货方" value="1"/>--> - <!-- <el-option label="收货方" value="2"/>--> - <!-- </el-select>--> - <el-select - v-model="form.clientType" - class="m-2" - placeholder="请选择客户端类型" - style="width: 100%" - > - <el-option - v-for="item in clientType" - :key="item.dictKey" - :label="item.dictValue" - :value="item.dictKey" + <div v-loading="loadingObj.submitLoading"> + <el-form :disabled="view" ref="form" :model="form" :rules="rules" label-width="120px"> + <!-- 表单字段 --> + <el-form-item label="客户编码" prop="clientCode"> + <el-input + v-model="form.clientCode" + :validate-method="validateInput" + placeholder="请输入客户编码" + style="width: 100%" + :disabled="viewClientEntd" /> - </el-select> - </el-form-item> - <el-form-item label="服务类型" prop="typeServiceList"> - <el-select - v-model="form.typeServiceList" - multiple - placeholder="请选择" - style="width: 100%" - @change="coverCharge" - > - <el-option - v-for="item in freightType" - :key="item.dictKey" - :label="item.dictValue" - :value="item.dictKey" + </el-form-item> + <el-form-item label="客户名称" prop="clientName"> + <el-input + v-model="form.clientName" + placeholder="请输入客户名称" + style="width: 100%" + /> + </el-form-item> + <el-form-item label="客户类型" prop="clientType"> + <!-- <el-input v-model="form.clientName" placeholder="请输入客户名称" style="width: 100%"/>--> + <!-- <el-select v-model="form.clientType" class="m-2" placeholder="请选择客户类型" style="width: 100%">--> + <!-- <el-option label="发货方" value="1"/>--> + <!-- <el-option label="收货方" value="2"/>--> + <!-- </el-select>--> + <el-select + v-model="form.clientType" + class="m-2" + placeholder="请选择客户端类型" + style="width: 100%" > - </el-option> - </el-select> - </el-form-item> - <el-form-item label="配送类型" prop="businessType" v-if="distriType"> - <el-radio-group - v-model="form.businessType" - class="ml-4" - v-for="item in distributionType" - > - <el-radio :label="item.dictKey" size="large" style="margin-right: 25px">{{ - item.dictValue - }}</el-radio> - <!-- <el-radio label="2" size="large">Option 2</el-radio>--> - </el-radio-group> - <!-- </div>--> - </el-form-item> - <!-- <el-form-item label="客户端类型" prop="typeService"> - <!– <el-input v-model="form.typeService" placeholder="请输入客户类型"/>–> - <!– <el-input v-model="form.typeService" placeholder="请输入客户类型;1 C端 2 B端"/>–> - <el-select v-model="form.typeService" class="m-2" placeholder="请选择客户端类型" style="width: 100%"> - <el-option - v-for="item in clientType" - :key="item.dictKey" - :label="item.dictValue" - :value="item.dictKey" - - /> - </el-select> - </el-form-item>--> - <el-form-item label="联系人" prop="linkman" v-if="viewEntd"> - <el-input v-model="form.linkman" placeholder="请输入联系人" style="width: 100%" /> - </el-form-item> - <el-form-item label="联系电话" prop="phone" v-if="viewEntd"> - <el-input v-model="form.phone" placeholder="请输入联系电话" style="width: 100%" /> - </el-form-item> - <el-form-item label="地址" prop="bladeRegionProvinceId"> - <!-- <el-input v-model="form.bladeRegionProvinceId" placeholder="请输入省份"/>--> - <el-cascader - :options="optioner" - style="width: 100%" - v-model="form.bladeRegionProvinceId" - :props="{ - checkStrictly: false, - }" - filterable - > - <template #default="{ node, data }"> - <span>{{ data.label }}</span> - <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span> - </template> - </el-cascader> - </el-form-item> - <el-form-item label="详细地址" prop="detailedly"> - <el-input v-model="form.detailedly" placeholder="请填写详细地址" style="width: 100%" /> - </el-form-item> - <el-form-item label="默认付款方式" prop="defaultPaymentMethods"> - <el-select v-model="form.defaultPaymentMethods" placeholder="请选择默认付款方式"> - <el-option - v-for="item in defaultPaymentMethodsOptions" - :key="item.value" - :label="item.label" - :value="item.value" + <el-option + v-for="item in clientType" + :key="item.dictKey" + :label="item.dictValue" + :value="item.dictKey" + /> + </el-select> + </el-form-item> + <el-form-item label="服务类型" prop="typeServiceList"> + <el-select + v-model="form.typeServiceList" + multiple + placeholder="请选择" + style="width: 100%" + @change="coverCharge" + > + <el-option + v-for="item in freightType" + :key="item.dictKey" + :label="item.dictValue" + :value="item.dictKey" + > + </el-option> + </el-select> + </el-form-item> + <el-form-item label="配送类型" prop="businessType" v-if="distriType"> + <el-radio-group + v-model="form.businessType" + class="ml-4" + v-for="item in distributionType" + > + <el-radio :label="item.dictKey" size="large" style="margin-right: 25px">{{ + item.dictValue + }}</el-radio> + <!-- <el-radio label="2" size="large">Option 2</el-radio>--> + </el-radio-group> + <!-- </div>--> + </el-form-item> + <!-- <el-form-item label="客户端类型" prop="typeService"> + <!– <el-input v-model="form.typeService" placeholder="请输入客户类型"/>–> + <!– <el-input v-model="form.typeService" placeholder="请输入客户类型;1 C端 2 B端"/>–> + <el-select v-model="form.typeService" class="m-2" placeholder="请选择客户端类型" style="width: 100%"> + <el-option + v-for="item in clientType" + :key="item.dictKey" + :label="item.dictValue" + :value="item.dictKey" + + /> + </el-select> + </el-form-item>--> + <el-form-item label="联系人" prop="linkman" v-if="viewEntd"> + <el-input v-model="form.linkman" placeholder="请输入联系人" style="width: 100%" /> + </el-form-item> + <el-form-item label="联系电话" prop="phone" v-if="viewEntd"> + <el-input v-model="form.phone" placeholder="请输入联系电话" style="width: 100%" /> + </el-form-item> + <el-form-item label="地址" prop="bladeRegionProvinceId"> + <!-- <el-input v-model="form.bladeRegionProvinceId" placeholder="请输入省份"/>--> + <el-cascader + :options="optioner" + style="width: 100%" + v-model="form.bladeRegionProvinceId" + :props="{ + checkStrictly: false, + }" + filterable + > + <template #default="{ node, data }"> + <span>{{ data.label }}</span> + <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span> + </template> + </el-cascader> + </el-form-item> + <el-form-item label="详细地址" prop="detailedly"> + <el-input + v-model="form.detailedly" + placeholder="请填写详细地址" + style="width: 100%" /> - </el-select> - </el-form-item> - <!-- <el-form-item label="三方商城" prop="tripartiteMall">--> - <!-- <el-input v-model="form.tripartiteMall" placeholder="请填写三方商城" style="width: 100%" />--> - <!-- </el-form-item>--> - <!-- <el-form-item label="开票信息" prop="billingInformation">--> - <!-- <el-input v-model="form.billingInformation" placeholder="请填写开票信息" style="width: 100%" />--> - <!-- </el-form-item>--> - <!-- <el-form-item label="市" prop="bladeRegionCityId">--> - <!-- <el-input v-model="form.bladeRegionCityId" placeholder="请输入市"/>--> - <!-- </el-form-item>--> - <!-- <el-form-item label="区/县" prop="bladeRegionAreaId">--> - <!-- <el-input v-model="form.bladeRegionAreaId" placeholder="请输入区/县"/>--> - <!-- </el-form-item>--> - <el-form-item label="合同附件" prop="leaseAccessories" style="width: 100%"> - <!-- <el-input v-model="form.leaseAccessories" placeholder="请输入合同附件"/>--> - <el-upload - v-model:file-list="fileList" - class="upload-demo" - :action="action" - :headers="headers" - multiple - :on-preview="handlePreview" - :on-success=" - (response, file, fileList) => { - uploadSuccess(fileList); - } - " - :on-remove="handleRemove" - :before-remove="beforeRemove" - :before-upload="beforeUploadFn" - :limit="3" - :on-exceed="handleExceed" - > - <el-button type="Primary" icon="Position">上传</el-button> - <template #tip> - <div class="el-upload__tip">大小不超过500KB的jpg/png文件。</div> - </template> - </el-upload> - <el-image-viewer - v-if="showImgViewer" - :url-list="imgPreviewUrl" - @close="handleCo" - :z-index="300" - fit="cover" - /> - </el-form-item> - <el-form-item label="合同开始时间" prop="contractStartTime" label-width="120px"> - <el-date-picker - v-model="form.contractStartTime" - type="date" - placeholder="选择时间" - format="YYYY/MM/DD HH:mm:ss" - value-format="YYYY-MM-DD HH:mm:ss" - /> - </el-form-item> + </el-form-item> + <el-form-item label="默认付款方式" prop="defaultPaymentMethods"> + <el-select v-model="form.defaultPaymentMethods" placeholder="请选择默认付款方式"> + <el-option + v-for="item in defaultPaymentMethodsOptions" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + </el-form-item> + <!-- <el-form-item label="三方商城" prop="tripartiteMall">--> + <!-- <el-input v-model="form.tripartiteMall" placeholder="请填写三方商城" style="width: 100%" />--> + <!-- </el-form-item>--> + <!-- <el-form-item label="开票信息" prop="billingInformation">--> + <!-- <el-input v-model="form.billingInformation" placeholder="请填写开票信息" style="width: 100%" />--> + <!-- </el-form-item>--> + <!-- <el-form-item label="市" prop="bladeRegionCityId">--> + <!-- <el-input v-model="form.bladeRegionCityId" placeholder="请输入市"/>--> + <!-- </el-form-item>--> + <!-- <el-form-item label="区/县" prop="bladeRegionAreaId">--> + <!-- <el-input v-model="form.bladeRegionAreaId" placeholder="请输入区/县"/>--> + <!-- </el-form-item>--> + <el-form-item label="合同附件" prop="leaseAccessories" style="width: 100%"> + <!-- <el-input v-model="form.leaseAccessories" placeholder="请输入合同附件"/>--> + <el-upload + v-model:file-list="fileList" + class="upload-demo" + :action="action" + :headers="headers" + multiple + :on-preview="handlePreview" + :on-success=" + (response, file, fileList) => { + uploadSuccess(fileList); + } + " + :on-remove="handleRemove" + :before-remove="beforeRemove" + :before-upload="beforeUploadFn" + :limit="3" + :on-exceed="handleExceed" + > + <el-button type="Primary" icon="Position">上传</el-button> + <template #tip> + <div class="el-upload__tip">大小不超过500KB的jpg/png文件。</div> + </template> + </el-upload> + <el-image-viewer + v-if="showImgViewer" + :url-list="imgPreviewUrl" + @close="handleCo" + :z-index="300" + fit="cover" + /> + </el-form-item> + <el-form-item label="合同开始时间" prop="contractStartTime" label-width="120px"> + <el-date-picker + v-model="form.contractStartTime" + type="date" + placeholder="选择时间" + format="YYYY/MM/DD HH:mm:ss" + value-format="YYYY-MM-DD HH:mm:ss" + /> + </el-form-item> - <el-form-item label="合同结束时间" prop="contractEntTime" label-width="120px"> - <el-date-picker - v-model="form.contractEntTime" - type="date" - placeholder="选择时间" - format="YYYY/MM/DD HH:mm:ss" - value-format="YYYY-MM-DD HH:mm:ss" - /> - </el-form-item> - </el-form> - <!-- 表单按钮 --> - <template #footer> - <span v-if="!view" class="dialog-footer"> + <el-form-item label="合同结束时间" prop="contractEntTime" label-width="120px"> + <el-date-picker + v-model="form.contractEntTime" + type="date" + placeholder="选择时间" + format="YYYY/MM/DD HH:mm:ss" + value-format="YYYY-MM-DD HH:mm:ss" + /> + </el-form-item> + </el-form> + <!-- 表单按钮 --> + <div v-if="!view" class="flex-c-c"> <el-button type="primary" icon="el-icon-circle-check" @click="handleSubmit('form')" >提 交</el-button > <el-button icon="el-icon-circle-close" @click="box = false">取 消</el-button> - </span> - </template> + </div> + </div> </el-dialog> <!-- 账号绑定弹出框页面 @@ -805,6 +813,9 @@ export default { label: '内部结算', }, ], + loadingObj: { + submitLoading: false, + }, }; }, created() {}, @@ -1191,42 +1202,56 @@ export default { if (!this.form.id) { console.log('添加提交的数据:', this.form); - this.$refs[from].validate(valid => { + this.$refs[from].validate(async valid => { if (valid) { - // this.form.typeService = !!this.form.typeService ? parseInt(this.form.typeService) : undefined; - this.form.bladeRegionCityId = this.form.bladeRegionProvinceId[1]; - this.form.bladeRegionAreaId = this.form.bladeRegionProvinceId[2]; - this.form.bladeRegionProvinceId = this.form.bladeRegionProvinceId[0]; - console.log('上传llll>>>', this.form); - add(this.form).then(() => { + try { + this.loadingObj.submitLoading = true; + + // this.form.typeService = !!this.form.typeService ? parseInt(this.form.typeService) : undefined; + this.form.bladeRegionCityId = this.form.bladeRegionProvinceId[1]; + this.form.bladeRegionAreaId = this.form.bladeRegionProvinceId[2]; + this.form.bladeRegionProvinceId = this.form.bladeRegionProvinceId[0]; + console.log('上传llll>>>', this.form); + await add(this.form); this.box = false; this.onLoad(this.page); this.$message({ type: 'success', message: '操作成功!', }); - }); + } catch (error) { + console.log('error :>> ', error); + } finally { + this.loadingObj.submitLoading = false; + } } else { console.log('error submit!!'); return false; } }); } else { - this.$refs[from].validate(valid => { + this.$refs[from].validate(async valid => { if (valid) { - console.log('修改提交的数据:', this.form); - // this.form.typeService = !!this.form.typeService ? parseInt(this.form.typeService) : undefined; - this.form.bladeRegionCityId = this.form.bladeRegionProvinceId[1]; - this.form.bladeRegionAreaId = this.form.bladeRegionProvinceId[2]; - this.form.bladeRegionProvinceId = this.form.bladeRegionProvinceId[0]; - update(this.form).then(() => { + try { + this.loadingObj.submitLoading = true; + + console.log('修改提交的数据:', this.form); + // this.form.typeService = !!this.form.typeService ? parseInt(this.form.typeService) : undefined; + this.form.bladeRegionCityId = this.form.bladeRegionProvinceId[1]; + this.form.bladeRegionAreaId = this.form.bladeRegionProvinceId[2]; + this.form.bladeRegionProvinceId = this.form.bladeRegionProvinceId[0]; + await update(this.form); this.box = false; this.onLoad(this.page); this.$message({ type: 'success', message: '操作成功!', }); - }); + } catch (error) { + console.log('error :>> ', error); + } finally { + this.loadingObj.submitLoading = false; + } } else { console.log('error submit!!'); return false; From 31041752017b73d280a6457795875fd42b064537 Mon Sep 17 00:00:00 2001 From: qb <1191961160@qq.com> Date: Tue, 2 Apr 2024 19:12:00 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E6=9A=82=E5=AD=98=E5=8D=95=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=B1=87=E9=80=9A=E5=95=86=E5=9F=8E=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/option/waybill/TemporaryStorageList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/option/waybill/TemporaryStorageList.js b/src/option/waybill/TemporaryStorageList.js index 7226745e..7b1f1a7b 100644 --- a/src/option/waybill/TemporaryStorageList.js +++ b/src/option/waybill/TemporaryStorageList.js @@ -28,7 +28,7 @@ export const columnList = [ { prop: 'htMallName', label: '汇通商场', - type: 1, + type: 2, values: '', width: '150', checkarr: [], From 658f862650d63e242076448132201de04868fc3b Mon Sep 17 00:00:00 2001 From: qb <1191961160@qq.com> Date: Tue, 2 Apr 2024 21:51:28 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/distribution/createTask.js | 51 +++++----- .../checkInventoryTask/createTask.vue | 98 +++++++------------ 2 files changed, 61 insertions(+), 88 deletions(-) diff --git a/src/api/distribution/createTask.js b/src/api/distribution/createTask.js index 4edb7355..026b35da 100644 --- a/src/api/distribution/createTask.js +++ b/src/api/distribution/createTask.js @@ -63,32 +63,32 @@ export const $_postBatchDelete = params => { }); }; // 新增盘点任务 -export const $_submit = (data) => { +export const $_submit = data => { return request({ url: '/api/logpm-basic/material/submit', method: 'post', - data - }) -} + data, + }); +}; /** * 盘点详情 */ export const $_getDetailInfo = params => { return request({ url: '/api/logpm-warehouse/blade-taskQuest/taskQuest/getDetailInfo', - method:'get', + method: 'get', params, }); }; // 查询货位信息 -export const $_getList = ( params) => { +export const $_getList = params => { return request({ url: '/api/logpm-basicdata/goodsAllocation/list', method: 'get', - params - }) -} + params, + }); +}; /** * 盘点状态修改 @@ -96,7 +96,7 @@ export const $_getList = ( params) => { export const $_updateQuestChildInfo = data => { return request({ url: '/api/logpm-warehouse/blade-taskQuest/taskQuest/updateQuestChildInfo', - method:'put', + method: 'put', data, }); }; @@ -107,42 +107,33 @@ export const $_updateQuestChildInfo = data => { export const $_getQuestChildInfo = params => { return request({ url: '/api/logpm-warehouse/blade-taskQuest/taskQuest/getQuestChildInfo', - method:'get', + method: 'get', params, }); }; - /** * 盘点查询 */ export const $_materialList = params => { return request({ url: '/api/logpm-basic/material/list', - method:'get', + method: 'get', params, }); }; - - - - - /** * 删除盘点数据接口 */ export const $_deleteQuestChild = params => { return request({ url: '/api/logpm-warehouse/blade-taskQuest/taskQuest/deleteQuestChild', - method:'get', + method: 'get', params, }); }; - - - /** * 盘点详情保存 */ @@ -154,8 +145,6 @@ export const $_updateDetailInfo = data => { }); }; - - /** * 盘点日期延期 */ @@ -167,7 +156,6 @@ export const $_updateDate = data => { }); }; - /** * 盘点对比数据 */ @@ -205,7 +193,6 @@ export const $_exportGetContrastInfo = params => { }); }; - // 盘点任务库存品 export const $_QuestSelectInventory = params => { return request({ @@ -216,7 +203,6 @@ export const $_QuestSelectInventory = params => { }; // 盘点任务零担 - export const $_taskQuestSelectZreo = params => { return request({ url: '/api/logpm-warehouse/blade-taskQuest/taskQuest/SelectZreo', @@ -224,3 +210,14 @@ export const $_taskQuestSelectZreo = params => { params, }); }; + +/** + * 未盘点数据导出 + */ +export const postExportContrastStockInfo = params => { + return request({ + url: '/api/logpm-warehouse/blade-taskQuest/taskQuest/exportContrastStockInfo', + method: 'get', + params, + }); +}; diff --git a/src/views/distribution/checkInventoryTask/createTask.vue b/src/views/distribution/checkInventoryTask/createTask.vue index b205aa11..a95bb18c 100644 --- a/src/views/distribution/checkInventoryTask/createTask.vue +++ b/src/views/distribution/checkInventoryTask/createTask.vue @@ -1,5 +1,5 @@ <template> - <div class="maxContent"> + <div class="maxContent" v-loading="loadingObj.pageLoading"> <!-- 搜索功能 --> <div> <!-- <div class="SoInput" v-show="searchSo"> @@ -158,6 +158,9 @@ <el-button type="primary" @click="TcAddData" v-if="Statusjudgment">新 增</el-button> <el-button type="primary" @click="InventoryModification">提交修改</el-button> <el-button type="primary" @click="ModifyingStatus">修改状态</el-button> + <el-button icon="Download" type="primary" @click="handleUncountedExport"> + 导出 + </el-button> </div> <div style="margin-left: 10px"> <!-- v-if="NotCounted" --> @@ -211,7 +214,7 @@ > <template #header> <el-input - @change="InputSo(item)" + @change="() => InputSo(item)" clearable v-if="item.type == 5 || item.prop == 'categoryName' || item.prop == 'materialCode'" v-model="item.values" @@ -668,12 +671,13 @@ import { $_exportGetContrastInfo, $_getList, $_postBatchDelete, + postExportContrastStockInfo, } from '@/api/distribution/createTask'; import { ElMessageBox } from 'element-plus'; import { ElMessage } from 'element-plus'; import { downloadXls } from '@/utils/util'; import { getDictionaryBiz } from '@/api/system/dict'; -import { ref } from 'vue'; +import { ref, reactive } from 'vue'; import { off } from 'dom7'; const wLinput = ref(null); //物料编码搜索框 const wLinputState = ref(false); //标记是否显示下拉框 @@ -730,6 +734,13 @@ const Statusjudgment = ref(false); //新增按钮 const DbEx = ref(null); //对比明细导出 const fullScreen = ref(false); //是否全屏 const BatchAbandonment = ref([]); //首页废弃 +/** loading */ +const loadingObj = reactive({ + /** 页面loading */ + pageLoading: false, +}); +/** 未盘点query */ +const uncountedQuery = reactive({}); const radioList = ref([ { label: 0, txt: '在库', input: 'stockNum', disabled: true }, { label: 1, txt: '破损', input: 'wornNum', disabled: true }, @@ -1450,57 +1461,7 @@ const InputSo = val => { console.log(row.value, 'row.value'); data.current = TccurrentPage.value; data.size = TcpageSize.value; - // if (val.prop == 'categoryName') { - // //查询产品名称 - // data.name = val.values; - // $_materialList(data).then(res => { - // console.log(res, '查询的返回值'); - // if (res.data.data.records.length) { - // Tctotal.value = res.data.data.total; - // res.data.data.records.forEach(item => { - // item.Checkbox = true; - // }); - // TcPdloading.value = false; - // console.log(res, '明细返回值'); - // TcPD.value = res.data.data.records; - // } else { - // Statusjudgment.value = true; //显示新增按钮 - // TcPD.value = res.data.data.records; - // ElMessage({ - // message: '暂未查询到内容', - // type: 'warning', - // }); - // } - // }); - // return; - // } - // if (val.prop == 'materialCode') { - // //查询物料编码 - // data.sku = val.values; - // $_materialList(data).then(res => { - // console.log(res, '查询的返回值'); - // if (res.data.data.records.length) { - // Tctotal.value = res.data.data.total; - // res.data.data.records.forEach(item => { - // item.Checkbox = true; - // }); - // TcPdloading.value = false; - // console.log(res, '明细返回值'); - // TcPD.value = res.data.data.records; - // } else { - // Statusjudgment.value = true; //显示新增按钮 - // TcPD.value = res.data.data.records; - // ElMessage({ - // message: '暂未查询到内容', - // type: 'warning', - // }); - // } - // }); - // return; - // } - - // if (val.prop != 'categoryName' || val.prop != 'materialCode') { let dataS = { questNum: UncountedDetails.value.questNum, questId: UncountedDetails.value.id, @@ -2463,7 +2424,6 @@ const InventorySubmit = () => { loading.value = true; //开启表格加载 console.log(SubData, '处理好的数据'); postAddtaskQuest(SubData).then(res => { - if ((res.data.code = 200)) { ElMessage({ message: res.data.msg, @@ -2498,14 +2458,13 @@ const InventorySubmit = () => { loading.value = true; //开启表格加载 postAddtaskQuest(SubData).then(res => { if ((res.data.code = 200)) { - ElMessage({ - message: res.data.msg, - type: 'success', - }); - onLoad(); //体积之后初始化页面 - } + ElMessage({ + message: res.data.msg, + type: 'success', + }); + onLoad(); //体积之后初始化页面 + } console.log(res, '盘点计划提交成功'); - }); }; // 顶部废弃按钮 @@ -2555,6 +2514,23 @@ const DelayButton = () => { console.log('延期'); dialogTabData.value = true; }; + +/** 未盘点数据导出 */ +const handleUncountedExport = () => { + ElMessageBox.confirm('是否导出未盘点数据?').then(async () => { + try { + TcPdloading.value = true; + const res = await postExportContrastStockInfo({ questNum: UncountedDetails.value.questNum }); + if (res.status !== 200) return; + + downloadXls(res.data, '未盘点数据.xlsx'); + } catch (error) { + console.log('error :>> ', error); + } finally { + TcPdloading.value = false; + } + }); +}; </script> <style lang="scss" scoped> From eb41ae9400cb657659332e3cb387da11c5e8d7e8 Mon Sep 17 00:00:00 2001 From: "pref_mail@163.com" <pref_mail@163.com> Date: Tue, 2 Apr 2024 23:54:43 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/distribution/inventory/distrilbutionBillLading.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/views/distribution/inventory/distrilbutionBillLading.vue b/src/views/distribution/inventory/distrilbutionBillLading.vue index 616f3370..7fb5ea7c 100644 --- a/src/views/distribution/inventory/distrilbutionBillLading.vue +++ b/src/views/distribution/inventory/distrilbutionBillLading.vue @@ -2907,7 +2907,6 @@ export default { } params.genre = 1; params.typeService = 3; - params.reservation = '30'; params.isAll = 0; getListOne(page.currentPage, page.pageSize, Object.assign(params, this.queryOrder)).then( res => { From b61ae8314f1b9e0e52981b1c0671d3f5baa6c999 Mon Sep 17 00:00:00 2001 From: qb <1191961160@qq.com> Date: Wed, 3 Apr 2024 17:57:51 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/static/icon_box.png | Bin 0 -> 323 bytes src/static/icon_box_file.png | Bin 0 -> 348 bytes src/static/icon_box_green.png | Bin 0 -> 569 bytes src/static/icon_box_green1.png | Bin 0 -> 513 bytes src/static/icon_box_red.png | Bin 0 -> 571 bytes src/static/icon_box_yellow.png | Bin 0 -> 233 bytes src/static/icon_car.png | Bin 0 -> 460 bytes src/static/icon_car_blue.png | Bin 0 -> 563 bytes src/static/icon_car_green.png | Bin 0 -> 425 bytes src/static/icon_city.png | Bin 0 -> 513 bytes src/static/icon_data.png | Bin 0 -> 580 bytes src/static/icon_day.png | Bin 0 -> 832 bytes src/static/icon_head.png | Bin 0 -> 564 bytes src/static/icon_home.png | Bin 0 -> 495 bytes src/static/icon_home1.png | Bin 0 -> 620 bytes src/static/icon_home2.png | Bin 0 -> 442 bytes src/static/icon_home_data.png | Bin 0 -> 498 bytes src/static/icon_home_storage.png | Bin 0 -> 649 bytes src/static/icon_message.png | Bin 0 -> 697 bytes src/static/icon_message_red.png | Bin 0 -> 639 bytes src/static/icon_money.png | Bin 0 -> 516 bytes src/static/icon_money1.png | Bin 0 -> 1045 bytes src/static/icon_money_day.png | Bin 0 -> 1275 bytes src/static/icon_money_month.png | Bin 0 -> 1294 bytes src/static/icon_month.png | Bin 0 -> 726 bytes src/static/icon_storage.png | Bin 0 -> 1163 bytes src/static/listOfLoadedWagons.html | 1247 -------- .../checkInventoryTask/createTask.vue | 7 +- .../checkInventoryTask/createTask2.vue | 2697 +++++++++++++++++ .../distributionDeliveryListedt.vue | 64 +- src/views/wel/index.vue | 381 +-- src/views/wel/index2.vue | 369 +++ 32 files changed, 3114 insertions(+), 1651 deletions(-) create mode 100644 src/static/icon_box.png create mode 100644 src/static/icon_box_file.png create mode 100644 src/static/icon_box_green.png create mode 100644 src/static/icon_box_green1.png create mode 100644 src/static/icon_box_red.png create mode 100644 src/static/icon_box_yellow.png create mode 100644 src/static/icon_car.png create mode 100644 src/static/icon_car_blue.png create mode 100644 src/static/icon_car_green.png create mode 100644 src/static/icon_city.png create mode 100644 src/static/icon_data.png create mode 100644 src/static/icon_day.png create mode 100644 src/static/icon_head.png create mode 100644 src/static/icon_home.png create mode 100644 src/static/icon_home1.png create mode 100644 src/static/icon_home2.png create mode 100644 src/static/icon_home_data.png create mode 100644 src/static/icon_home_storage.png create mode 100644 src/static/icon_message.png create mode 100644 src/static/icon_message_red.png create mode 100644 src/static/icon_money.png create mode 100644 src/static/icon_money1.png create mode 100644 src/static/icon_money_day.png create mode 100644 src/static/icon_money_month.png create mode 100644 src/static/icon_month.png create mode 100644 src/static/icon_storage.png delete mode 100644 src/static/listOfLoadedWagons.html create mode 100644 src/views/distribution/checkInventoryTask/createTask2.vue create mode 100644 src/views/wel/index2.vue diff --git a/src/static/icon_box.png b/src/static/icon_box.png new file mode 100644 index 0000000000000000000000000000000000000000..ea5df03c953e92798f55ccb9e6089bb769685c51 GIT binary patch literal 323 zcmV-J0lfZ+P)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px#{YgYYR5(v#WS}x&q_TMoU;{-u|MLoPGGs9^GH{S%!N30uKR$eCnD(Ze@iW*! zmC678m>3u~l4BT5&p!qR|2w&io4^LDPx<fv|3AY9N(^LVWC*yK!?=+)2C7Z^Z^ppL zP)Ugk8U8c0-^yb=MVnX#xlC>H|8NEdh6plUx#CtX<4TZTxC_-L|E~uMG>~av!>wG# zMq&(vD}-5u!(!qL{LjF!;{QK}709k;WMYV5#0(nZ3?#w(qXsfCFsM%YU&F}A&`d(O z!Il31&ro|ikFf<M*(go;FUQQp5C=4rnG{2ThW-8fk73ch0>(!u29jb3KDAWO%K#%Y VXB9gelD_}|002ovPDHLkV1msOhlBtC literal 0 HcmV?d00001 diff --git a/src/static/icon_box_file.png b/src/static/icon_box_file.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d6782dbb36513c7dedfada272d567afe2dbc12 GIT binary patch literal 348 zcmV-i0i*tjP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px$7D+@wR5(w))FDU%Q5?td@Bf{GVwr})44WF4Eh54#D8e|qNvlO>GcGQ9YgUUe zu-FZ|ps=dRw9R60=@3*<`5T6^jk{xyoxA+I&-=YUf1Z%?Cn<YO0c@VFgJ~c*$?f%l z*Ki-N`ZkywZg^A6GdtG;a$}C7#plN^+o$1gei#h=4aDq>iS=VfuGu=ij|T6~v+zA{ z1>(H3dGr#~u-*n%?La!Xm9;pq1FTqrUEIoFiIExB<G=>!0*DuJm?fxkN$>UmiVoS# z70BKQY6U*xXqm6@8FU7-ltVQDmIqKPu>YTG31bSVUQB-Fe*wV<7J<Wb8Yb^i!VH^! ufJnh=4^^Kiow(79Z6!sAr|=$5*zyOGdR-N3*+Po|0000<MNUMnLSTY%%a;lO literal 0 HcmV?d00001 diff --git a/src/static/icon_box_green.png b/src/static/icon_box_green.png new file mode 100644 index 0000000000000000000000000000000000000000..189ec9ec82643156712e795935d595600e52bf92 GIT binary patch literal 569 zcmV-90>=G`P)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px$^GQTOR5(w?ls#w^K@`V-Z+0)n6dFlmrNLN;BHCD~+(scbHVTR$f}jXNVwM== zN5GsQ5*4|%5o}Ueq=+DrfG9*RU=S3+*1{%2Oh}<NLF8`d$=+^`nEQr+Q_j5k&Hw%1 zn<uREl6B_sAAq@xi)p_A{37j709q@n+6rHdY@%(;G;kn>=sU#eCw=8}HE3nvban@> zjDmh4ug^(I2IOP{wZIsu)?p6zF0BQZ19K0yLdz^dS1d~BF){?Yh!TM8O~4=dQ#iu0 zYs;&l<-nQX4z8UbG-pt*0vnSH??DGq-G^~DV3@_KN7{c>4;cBg3p9%s#*x%*;1o)T z@D!tW31tMhh%klcpJ)WQKMDGda1*g}ge-#`LW;2V<oso`z~r7>2RcD}OKM`pV|f0h zW)#M;A{kUWf%9>pcuPV1aLsmH{mEhf!wR%gQ6djlQZ5Io&Jo%kT<1-!y12&i{IkWk z%NjHn+(3wYYAv0uR;b(uTtxdoS`bE2cH?j_Qd*<2d01-Ze^S<4V0ME2gtCB<HZ0FT zj?>-$y7t$bdE5;eAo3#iP`k+MWnAe%m_+3XFo^JtCA){y1HbD}n`k(Mo3~-}4n0F( zOT!_T^$>Fou|Ftiz|n#E${tqx^$qUVSJ)t^dfPM!SR4KqA<?Q8!HOrx00000NkvXX Hu0mjfpiBS0 literal 0 HcmV?d00001 diff --git a/src/static/icon_box_green1.png b/src/static/icon_box_green1.png new file mode 100644 index 0000000000000000000000000000000000000000..77a966f0251ec1a35e861e8d9088d7bfbc4d93b4 GIT binary patch literal 513 zcmV+c0{;DpP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px$yGcYrR5(wy)G=riaTLe#@9!=dEJbt_9ZLu~!AYUuCMN3AL9`@7Q5<v-aS*qH z)X~9N(xph7K<J<yOpA((AcBI!6@yY#&{YUhDDnPJlC)>4hqM>{kAL3#{NKBKJn@f@ z2EFp*{5ZaM7L&h|cVxES@wwkPx%zo4J_gS{%^l4A$h;TYvlA?iF<J{R!veQ)-Mbj9 zEEjHq?(PcP3^q7XD}~RtgUujB6w-hg4;D^^Q!#kqNpRF6UZujiNyfU|#)0`WAKJZ^ zE6v~-o*PdM0xq(L_0#V@_Q3K=zAWbzhXLhjcD@+C=!46_J;9A(K!c05QaJbD!8M@$ zN2SInV(f1nBvxp$s}{M|?}?JeB(ItX%H6@dD+aexv}|qA-YwW<GjhBE7EQXG09wP) zmtU2b54t26?G3FsZjNb0$)M_qIdiNaMv_~Gs;~hNVY-gkzxl{o$0%iSQxV>xFP;PY z`m>$#FB`nYvulb}LmZ0R9|SASU<NTg%p5u~Q7?v%`g6FH%PX6G-TfA+P_s{+HisMM zSHH*WYqFU;;wdx9uJ@sRvyEuBKGFKRZGEMxEFtM9>HD@7c>O!100000NkvXXu0mjf Dh<@$* literal 0 HcmV?d00001 diff --git a/src/static/icon_box_red.png b/src/static/icon_box_red.png new file mode 100644 index 0000000000000000000000000000000000000000..499ddb21d6cf4f56cb5e2bcc77dc72312f85894f GIT binary patch literal 571 zcmV-B0>u4^P)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px$^+`lQR5(w?lsjlsVHk#=_s_+25wRd5Qj4|VBD%PULv#?lEU6a6wjwBkh&U)( zFW3qWiipL{r9+Q&NH9_CprztqQQD<z2bT^?b*MT7iQ$~j=BCxe(-w-J@ju`H{O|kS z#0q~}VIKb;Xvt)hjcZTh_`*;&EwC_Gp$e^Q|7z4UhS*t#n7zii^BQ_Q^*3lkpdCB7 znMnLLrfJO2;9NhbqY4Qy8$?`_m;3Z5xDIHY2iB8Fj00`e;P=2Kuvv@&q-~XRo8)7D zuSQ4n3!(MEp43g8OB2{pj0=dS%6;D8>>|c?%&j8u$BDS4yzISjV0UT?X)AD_?}cIF z@f)B{z{hw9+?vPt0jChp<YiM!0q&?4;RA35F#~>{Ai5i8eV{c}$dly(e?5H}qZM&x zff^rdP+soz(iPSsjebNcaH6XGB}L8=V-pHK%X>Oe3#~6oC5IKujey1sMcYSQX|Q(C zSKyVrY*#6~QI&f^rKBes1MLn{blz?Y@PHtgLy<A$r%Fo08vE|gX8zssRj@7P>9OJ= zh?T%EFb?Zc?s@p=9q-svZe}A}$)U9o1ZPpK8T{+OI>a<aJB8U@%Dnxy=(Z^@hYigw zP>3)*@~*ZVtouk3`8^nO6p91NjFcwoKdi5?Rn_R<qL!Bn`~ln0xD@~rH9!CW002ov JPDHLkV1hM<2p|9e literal 0 HcmV?d00001 diff --git a/src/static/icon_box_yellow.png b/src/static/icon_box_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..a63726dbb4730b4986e1b1d99b9665846858148e GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1Ig#hxyXAr}70 zDGQ7emTaozNnrl(U;5Xdw^?#?xp7|%bL^{?!fn-34>$g)-{ft;{J36j6VJc%KUxjT z&qqy&YiSIQeQ#`FpfMp;f%!1=u{U?STqJ({XJ=-9%pKzW&)dMjplCs)&yvRf|K$_T z+<e@z=I4Kr>3?~8dia`;IIv|^&-@{wWW>|HvoSbky0JmSB?-%hkF3e(-g!)E@$ECb f@g-pI5jKVcH&a9f57)i`I+wxI)z4*}Q$iB}iws(~ literal 0 HcmV?d00001 diff --git a/src/static/icon_car.png b/src/static/icon_car.png new file mode 100644 index 0000000000000000000000000000000000000000..0d25f360782e1e717cae5ba31e6ca0dac7f1e242 GIT binary patch literal 460 zcmV;-0W<!IP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px$hDk(0R5(w?)XytKQ53-O?|EYe$=HyEr6eh3Y2%r)ure0@16fF#M>Z(2AS@WN zvX<=p+9?fE>}03NLXswg#gt#~>X{ib?lnlc%lpp#+;h*l?+SlB<c~ex!L4XLNGSUT zY9HHKHN_>toylq*tpfyKb`TK8u$?|#Y!cj_4&$ojZ(->m18M+O9OOJ>0}DkZLhjqV z2GxU4iDDZ2uRdkG8EpsVKFnvJda%I}R>lh{%IiSL2X%z)EEr28gwu^OgWEGUuDhAc zM#X99E;WNPgdG|7BF&)pb$y}&zrO&U&j|Hi{vNbwMXcjbHGFnE0k4i9hh)p}NB74& z=l_A~0b~T+3zQ5ZQl?G*+ZhV8*iP3g5}Rs4WJwDuE`USs?wgZc_PQDH&w~U~3oM`p zJ$MRSYv3Dh)1YqKSac6jwTLx}a^oll5K4HWipK5}Q{T+*;l@NczQ7t#m0FxYNgJWa z;#Zg8>jySAl!FB8up~%A?b6hvJ8H(S{nI;_CH@6Ei>aeU_31_c0000<MNUMnLSTZm C5X#B` literal 0 HcmV?d00001 diff --git a/src/static/icon_car_blue.png b/src/static/icon_car_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..933f7c59bc093bcd40c82bff6cca2a507d6a9a5c GIT binary patch literal 563 zcmV-30?hr1P)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px$?MXyIR5(wiluw9^aU8}!&pVUVCR?;pE{a)6a&eG@IN5{4T=wF^Rd)6d;vmiJ z!C`H(%_Jp?IB<|`Np22`1BDCCOelr?YiVulH1A_)vfDJ?nSFP?r(bVRpPujcdHRa1 zm!-Pd;R*pUzweVg`8=YjD7jJvX9W3}th&r_rj*f%NMKLFSwmKE5145SHoFk3Y{p9i z8g2;$PFnN}elGw#3T%x7%q?o<7!Gqb`&{K`GdKw7B;ao2|5y%fULk%(IPDN@UOW&U z2qyo=C`2#N5w(iA4o@lIUA-0|5{x0b43`BT8^IwwE@yPVUCPm+m=}nLHv8L!W^tgL z(L_z7S`TL*tx|plyam#2TObY=`*pP?aJJ}1T*SN-?EY^caKjMF?6g=T=v=ZxQ?Jgj zpf9X25F{xe_AD8Q8MWxGhV;E2RH>)n+Y5~RBZR}{jIKxT&>TaY#(bz(sA*(FtuBrI zd?VOvbEou`p?^|#$dCfYfuhY3iA%uRxsgM2HV_-4RuGCSwR?D6Fgho&8APm;*;E`* zI+gb$!%eExDg+5WNn8_bvANI)R)SmVKJOJ>A?ZLQ=AjjylVk!jBQah4!gfY9e=FDL zyga#@L*<OlH9J+S^fu<bGJtJU-+1~yr|G!o?GJtC=#^idS?vG-002ovPDHLkV1hvY B_vZir literal 0 HcmV?d00001 diff --git a/src/static/icon_car_green.png b/src/static/icon_car_green.png new file mode 100644 index 0000000000000000000000000000000000000000..17fe5cc9453de57e5b8debfc3e2561ee48d3932c GIT binary patch literal 425 zcmV;a0apHrP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px$V@X6oR5(w~l)EoOaTLct=Ux)8MIu5IVG)TKY$QT!Vl+tOZ!oAfOqN<05XEdU z*+gRS7}}MjBTFL~L{b9@N~-OVd#^`sJg!HZ_)Wi)ob&m8&+j~hA|EL-j}ig5W^1Xb zTm`QOWQ{;*<EyM3h4IA}L{2=@7m4BzP5*OXUbjISUR9bL;SZ%=?4PHsIt0`MX;2fS z3BwqmZ|uN={tjqJl)liWttt^4MRkTtZ6p}E|2xouDyp^ghp+z$(5b-bb0I2#!M`bl z&Ud}|Y09dHh*)3I{w~OBY^TbdD8~pl_T4&e;CvlYwhP)!#`M_^RfP-S%mr0lLZlxU z=JCPDRq~elo)oGXvbin>Chy$KA+eakG)8PlzOYUp-1^~|C1OdC3C!F%d2@&KRU5(S z>{}ncM8%i8k-~y)nndUw-~SL8pX)%%SAc3@iop1udr~~N!uK6Yv=6^8z|->y>)MzV T1Qfi)00000NkvXXu0mjfxAMBH literal 0 HcmV?d00001 diff --git a/src/static/icon_city.png b/src/static/icon_city.png new file mode 100644 index 0000000000000000000000000000000000000000..f86b88802a5852da1bc0bb8c919ec1f3916968fd GIT binary patch literal 513 zcmV+c0{;DpP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px$yGcYrR5(w?l)p<=VHn3h&%Ng!8$=T!#L4d9pf<D=<Z=s<pdnkE?&P3D@3B8X zNLoE71ve=d=fDEdz(8DdupwL$2M2Ldi<{<q@;q^F_d<Hl^<L?M&-lL2^Wppa6dG*O zU>=tOHHQ=4WmuIlfi8p%f$@ybQZ*q}fuYAh1c5;B#bAX67skYA`{G{(P(891CIz0> zD2G)gD4g-SeVQL--*Z6wg8K-c5Sp)0+pV8Ue_Oy&9CIG%u?9RyNO4h=eS{(4W<r{; zGCt##K*Mi@v?_Z7Ps)KO!fvb2!7q<&N@<DTqlnH_nvX>vW!ViFOj4*NNCd2FtO`h{ zm~|%kaOyFE(pU5mdIY*lz|U^L!^?p2U*7eZ3k^9(*cG3h(9rKhe3vP{TEkm}{FQ;$ zu!-=_^?73rE5H{wz`G`3sVSv2Mlwyzhn7`fHdc6Qc<&0MxD-Om4Dh^GQxeA}ZV<|r z3XcUk>K>b8k9&@?jQkyqI<5L($AA+<S4xVj_pH|Hi4q)ICT`78NL;;t0iofM3IT8@ zVRIJrjF&g2_?D1<bsgpN1$Zd8|Lc6!S-%RmhF|PIL{zvHfgsQ800000NkvXXu0mjf DlB?s& literal 0 HcmV?d00001 diff --git a/src/static/icon_data.png b/src/static/icon_data.png new file mode 100644 index 0000000000000000000000000000000000000000..3915ea372fc52bb6f2a47bee689b3253cf54f277 GIT binary patch literal 580 zcmV-K0=xZ*P)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px${z*hZR5(wqmA`8fVHn3h&n31{oOE+jlFR0gNzg$z9R%y9=%8R1+e@H-fVSY^ zqQ-lzgASsTPIXY|SPKqz(NU7vE`oy!1uda%a$obNO^k4jHu_A*-Sd9#zR&Y~pR<C~ z{sf)?#|$zI5P~M~CV<P9cUtf;V9sD;03L!}z-bTlz=nraBRew)taB!GdL=kzp_70Y zmB`NhEims?La5&0(WgnP`*WewEHL^TFpM=O<60Li){_huKaN`sWcirLU<Jd!d{nSl z-{7Q&rUUQmDq_6nOV=9-mzGLa&BeMN7}Kq1Q!Pb@J<#V#l&VFGQ-S>?hq1n4?D4<^ z)&e-{^AqEBZNkc_z(QFEm1)aqhoHXll?Pv@?MLYJ9oQ|HH<;f_SgsW9>Gm~rnt`4g zdZ=-tI$;Yrr-uQI^{VK|-4>XOHQY=nWJTbUngOf6e*SvjltxDOQV!q(P#3sr#7!_i zCFx!Ez{Ci<zznOK9sYBqce#(`G-U3c&IZQkO3@b6fwy&tq0MnfY03@YLnX53J?`k5 zV&`MC<tX4;3w(YJCWm3E<FXw)rDM_7K)?61s0K$Y%e(%-K28}3*w-mevkANnV7W)~ z9e=MD*{!bR|FypIPA~mV{Iy`koY`Ot78vrou)SczyE>pOkAdU=`U|iISAGKGn_w(3 SKZIQX0000<MNUMnLSTYz(h}4F literal 0 HcmV?d00001 diff --git a/src/static/icon_day.png b/src/static/icon_day.png new file mode 100644 index 0000000000000000000000000000000000000000..d88ea4ad37164c4fa73744a65220df6594ca0e49 GIT binary patch literal 832 zcmV-G1Hb%<P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px%`bk7VR9Hvtmt9B{Q5462XI9GuF(VD4BziCkB7}&<%Gt7qDCkpPg6zSJ2y|8- z%%bRnDEn|%sfUOl>ZK%#ih{~=vWOmndaa)NASw$H%WYHVgu7yG>F%s;NzlCAnREW< zcmFf@+&jW3Uoy(|i49-}8i7jS45n4)8uo5eK2F~~gb+QF&r<8<aJlgSS^*Pyf@$Tu z2WTuq^>jF1)r;3>{{sNFzX0U`NG8G?OlvuIAliY}z&T(>Oee(Ig?J`JIUt&W8hgWe zqK|m5m6TQo!^1%_JMaR?jg0jbrZ4wb0RIz2=EMe&jX2tea5fz0I3^y?v_YUqauuf4 z^fQ2d7uH_7gOf=gR}4}La)qvr^JHYc1<8mFz(IoAM4B80LUe{I89#PA%C^BgAwZGk zivbXJ;SL^W3kz$WbNg5>p56vvjf)R4h)_<dbBR!vLdPn^I0d992;idBNJHE?Fj93F zdH(^D;(+RBMA{>(mZ=CH7v@Jok^m4yjm3B?A9CwpCMju85hnc|040PtC79J$X*rrl zam_PsHOwZ}xD8~xg7^&wUZX}yc;;<Q^KklF5b7!N?We^*ofNqM#NV_M2hd*NB%i+Q zU`1UAZH-G%Ek>|$xCk7<w03i%B89w}RS2~p6NhypVF00wBI^vzB_6U1>kxLKvH@?^ zIa>Ye5NQUkkw!W5t#{b|Wgyp+2cUe!U@MN+4Q@vLtH96#)bIlJKpLu@i1fGYO~91o z0YsGUqq;Ln)G)r{IAfyjiR=Rw#M!XiY(_sxs9vKtef^NaS@bY>b9eZe9k>dtNIt;u zii+W^W>NKJ+Wdt$*dQr?5kL=N`f9mxIES&RkAcZ?dqKjhU^qq9%d|gO3$r}rWZf7z zz{ahgj8+^eqPmB6ttUqUAQkZ|4@4x*fe6Kim`!IWs^kK=p7-~_p#l8u3D0B%wFll^ z4W_TZVf}C{zuQoX%JDx7p$^DRIzy$btnG>h81Za=FLBiWj=uq2Fi|i|5v^7L0000< KMNUMnLSTY?Bz5@! literal 0 HcmV?d00001 diff --git a/src/static/icon_head.png b/src/static/icon_head.png new file mode 100644 index 0000000000000000000000000000000000000000..a3f93d06ddb56c93cf350269bd1ac916c186ddf3 GIT binary patch literal 564 zcmV-40?Yl0P)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px$?ny*JR5(wql+8<2VHC!H&u|r@8l*o!2wLby2%|--phXd6P7zT};j#&WAQB>o zR?!z0v~ediYKseVC!`N((V|?mmV$N_1VUMYK~p*Ri96OfjaMDTyLq|1=lsrd&ilNt z*x*ka%%dfsL7Y0Whxqq9J)HQml86<7?(5r1Hj_s>59$X0#DrMG8Y@kvftLk3pSyu5 zfU>EI>?y=K6{A;;`>8;mIMhWD6fj200i6v=G4Krh8avQv`ReMxeE(jQc>#RHo<w{A z_0(1~0~`Q$f#0hbZEqcDUjlzZ8X@L784UmpfVBc^r9Feyfw&JOz>Y;l>jKu(?=1n^ zQyPtWR&Tktw~g-3#4dwC*WZLip!r@?JQv?mxjefn@Lzx-L%u%;x{UM^a}qI5rE*i@ zlj$}2usPVr_HUytu*M&MYw4yqu?o72bX&#JxCf4QG4JExEanaE!GuP_&r1sB`*xt< zO5#-&OZ)1^_L<yatTNUGh<75LCTV%G|0?p_!mncRS<pf3WYz)pkVd16=|K5flRbuk zDrob9lh}gX3EB;b(Opn63Tvh60vZ)A0j5qZxq=U<{1{aDv_6XU0B5ly9N*E{qqoha z(t)0Tj@ABOuw3O=^($<eRv1>7JL#4l*p+P3y!QtzGSC%Tw4rhU0000<MNUMnLSTZZ CF98(* literal 0 HcmV?d00001 diff --git a/src/static/icon_home.png b/src/static/icon_home.png new file mode 100644 index 0000000000000000000000000000000000000000..d62889100cf609d757b290f010faa83ea8b54e58 GIT binary patch literal 495 zcmV<L0TBL)P)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px$sYygZR5(x7lrd;iQ5c2Kd3{l7Vk4<bp}07>2riEDHn9{07sU{QkAh;8sDz4B z!S03<8l$aP49Su<ZiRr8kYsRI+(gJy4I&yzLRxx%?W@YuCO2u~;$83gKh8b><q$p2 zt<bAUWo|`8NK^QDDR-`_8=>xU)-GK#fK>p2J)L|J#p{o<*7I(29f7v}@`zW=1SrwY zgIuXKHsgiDmDb<)`+&1El~aaNYXHvlNaM9ZTunW*-nw;v0Hbz!2BMZgdV6K-1OPOt za3`I$p8nE1z)+|-<~M!IB!c~bI%x9SjrPqah4Wt-3s=sHq4FS34hZ|XFT4|~AS2gG zA4wbnaBLW$0N)^JGaP>5JvuUamym^FfIkc+>pQJ^C&P$czW*<P>5LWsPk~Aq(=@g> zb(xCtOc;hLx-?1Mlkb62(*tpwWTIc-APevAP(<F4{G@d#vg`14Uk>X#EnhBop`iob zxVSOu8TY$2nhXV1p?uaBsW1TIgiEuS&RBEKKaAPs%K}*+Bsf>g+<us`QorkKubpKI l;Nb&<1@CLk4-a+=_d9`Ay2zUhx~%{J002ovPDHLkV1i+S+{^#~ literal 0 HcmV?d00001 diff --git a/src/static/icon_home1.png b/src/static/icon_home1.png new file mode 100644 index 0000000000000000000000000000000000000000..d5a1116b5e90683f1c37ec440e4f08760120ec92 GIT binary patch literal 620 zcmV-y0+aoTP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px%CP_p=R5(wqluKw+Q4of|KS>KseV}f%K0r+(3W^ICRZ(1s=td}_2)c0>DzOy= z1yNI9;6|mXx>4xDotvU4bSEm<jffyZ+gOT-qSQW+q^)i4=nXe%(npdO&+42r|9s5M znK`0@weG$xb7fx|HB?Tna)NNeP6-}h$Ptanm>!k#DG3ZG>=Mu-$m<-4Cu3@v3pzXS zsQJTtX%j?eb99V{$=5`AqRe#r3}9W{g0(AnENCc|ni<bhgB<@BSGrJF1YC35mIteN z3hXXdTi0&zR^uG*Ij4b~J`db@&(``JIt806f#o$u_n!<0`_HQ1y~_gE-?eR3eqI2p z=LO4&jqkvro-_KOP{Q^JIs{9n!wiN5*&YObVf^;?b%^Rhy}^jY5k=bUhB*X*dWrg+ z$bpXWG^cBVyaQGardcv@URhu`VbN@FddrM1pi5#bU&BbkuKcsdy<-2&q=@ug&`7A& z4){c;89xN0Cay|280`fS#(TWpoC|2c^Gu49fm*%-i>As&v&8VcfL@d@CnjmA4p20| z#(xAFbWUbya#Q#FxG8bMi@bEoxd?k-u|K?vty!l4cQCda?3f%QRb9h-_pvGlVx$~s z7fc`|;}~L<!6)1nft?jU$^x2uX3F7&T@+kj0L-1~%e^sO%a5MB3ANf5i8lq4Q4!mW zVaM3>xk(?3fbL<_En93gY_QDKhgym%Kc-Roy1fZ<wSNH{Gu%*?;9}MQ0000<MNUMn GLSTZn8x^hq literal 0 HcmV?d00001 diff --git a/src/static/icon_home2.png b/src/static/icon_home2.png new file mode 100644 index 0000000000000000000000000000000000000000..d2af9c2e7530dfd47b787d14f2770dc34e973761 GIT binary patch literal 442 zcmV;r0Y(0aP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px$bV)=(R5(xVk}*hIQ5c246Df9Z5iArsC^Rp06$d+rLpO1;pe}{dsZ$cGh*Lqq zO}dz;;;N%Kh!h+|I=DNOQi?vQLkB0fDoXNBeN}^LHO4sVo$kH=Ip1*pBWgIA(0!$t zXm?28Zj!62V89JQH*<pbhQk=%?B=vm&2ugA$+(-ETUY{mE&zs-#ZZ*h>~+v9fo)TM z`sgvAB|5G$8b0mh7z6p=`G3Gn=ogqZL|fH3%u)<*qr8qU>nebmS$8>RRnUA>_{rR6 z^QcJQuMr(w=*z(Lv<Fiu7J<fEV3#yMPKxyG4Qns?`wI+0j{;LVf8P?A$oFH>8)dbn zpx{Y~k99yQE#^1yN<ru?LHnJ7XPJ&EUGVb;(Q4SJ7iw6?%pVn5D=#Gz`m9sp-F8+B zwZKn3<EOd_U}Za}*X5-omj~c|$S^3lB$2A8Ha5#Uc@0$5CS7p9#50@qD6j9e^e~ul kC+20b#Fw8R^fmGP0q-8R-$Bc=mjD0&07*qoM6N<$f>C(G;s5{u literal 0 HcmV?d00001 diff --git a/src/static/icon_home_data.png b/src/static/icon_home_data.png new file mode 100644 index 0000000000000000000000000000000000000000..62c9d9e65253501021bd670d65895edc1f4f8530 GIT binary patch literal 498 zcmV<O0S*3%P)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px$tVu*cR5(x7l0QgWQ5eO~c`u?32rVL=TGT<4)ISKNARS7FcGif9B6SeDbZ}D? zjUmxN1h+1QLZ?z4+Bk}XlY<}#Mx!{0c9o+2qXtRd5gxv%N%TGK<lXM~o%6f*eD@L_ z)>gc(&Z3bHjco3@$>}Co9}l$4GQI#frPy6RwlRN`=UU)w2h31oa6-TUKwBp$YY5T$ z$mWE-EwYLNmxlrsem}ngd|T8c%%zXgz0W6ie&_cKfa|f^CJSbQWYta4ByF2u_*o>i zaanf-n2d#bM13Ooz-_j6U-$>0uOX6}b@VoH<vmJDp9H4>_Im>5i6l(_vQmSuqsTBh zT>V&OWiupS-36BO2#ZLcbTJtZegoK<yRtAX;?E`FI}kPA4$};i@z4(dt&Sm+J$}?2 z-92>n`F$5~;vNEFDV&iGoM=ANm;~^`+YC_{8PI15e=q(O!yukQ_$lanu1=H#?8`go zRx?aAjHcQgz-qMWq0jW^lAPD?BT&#AL)m>Nn&A5g;w6M7BJ;tiTQn;PF1XIn<7-|g oOK>d~XfX`b{wK(`TNbv@02qqWOk|E=(EtDd07*qoM6N<$g3E;3JOBUy literal 0 HcmV?d00001 diff --git a/src/static/icon_home_storage.png b/src/static/icon_home_storage.png new file mode 100644 index 0000000000000000000000000000000000000000..d36a6deb00fad8260b32f4feeb7bab0e8badc952 GIT binary patch literal 649 zcmV;40(Sk0P)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px%LrFwIR5(xVls#xuQ547j=iZmbG~y>H29=1RHeW^^oD|F=LL3x|gM+$=4i$@3 z1>xD3v{i!@w7BTfK}Ar4AA`_A9CQ*PHi<8#7AzIJh$1dc)0cZ}o{gGkj1De>cf0qT z`#b0U|My<PUmo;3ULm<5u1KB)fh6Nx_^kP~*`9_#!+_|Z_Ps2`DF9m?fM){KAJ$(D z17Ih-4*2L;z`b^b`+#EAO+;;WGGh{iL4cP6I112mdzq0X!Rd@uylWUxHLwlL8vZ3x zdX5lq9H3QSImm+5zy~#YCvL#1uDvjPt!}yaATzqY6$D-boF<EIM3QEia;adNs+EZr zRqHZnSSk#Jd(6kb(#n=Z3n!S>34nIY=e-5^66JeCRUOI<zAY4IKx(o)t){k|AAes+ zwZ-h@idHO@N}dH?%`Y`E9XvBSmhW4?hLl`Jtof9{egOLbwAdZ0nabd%{;_xY-q1Y& zdjRf=>cuPb#b8y`x)x2u6yyF}{AE-(Hy8RsL(DidSI>y*W^$w_uv%)a&N@@R1M!?0 zCXv0N9?1B}z(WGIfe@$x>rAOlegM|V=jhNWt=-{23LNQP=~W9oF6WsZVB+)cDM;z_ zd!4aQKq+oalo}p6mkM12cqfQb8+CIimkPeIFL`BlyAZA*6Rs1%jOxWiKGlAaK^;W6 zT)h!ZH6+H>S*0?X6i*tsJZ>p<SW0o4fL;GxhV!M|1dwn#Ib)S#t(rSh0p0rf|Kkf0 jy_jxjO0%E%Ph(#ISQI6hSYQV300000NkvXXu0mjf)!-i} literal 0 HcmV?d00001 diff --git a/src/static/icon_message.png b/src/static/icon_message.png new file mode 100644 index 0000000000000000000000000000000000000000..af2431eb85400de2d7b6037b60350fcf836f9f05 GIT binary patch literal 697 zcmV;q0!ICbP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px%b4f%&R5(wqlubxfVHAen_ue~7Hd?rdb`_0(cg7!F1g*ldm8F|j!5B6zf*>s_ zqOgK~AgCa8;UdvdTeY#NRv|>T$YnFvq3MrSW)T_c7~VVgJ2i?rrDJ3HZO{8Y-}yN2 zcZhX9TxT9u1YS1Hyb^=QL{LZIvoO^Wj3yGfT)qq#uB@mh^bQi`3jhHeh}@oX<@$+u ze0nwTA~0NCUP{q#5j>dHAo59s?H??w=L(=!(#-(}0_IVrX<Y<7i(Lu6X^@B_OoF>I z%>o&AW>XEJL}KbsD0@tEtFH4S$$SyF!F42_7AX-slt_#X_<Ti<VH7VI4Uhf=qzRF$ z!Pw}fWx)PGpaB{l&lN->fD8s>@t(d)^Dw~u0KPQGM$d<<%^E761kgyb7?7c0bhLgM z@P4J)q^J$f7i0vGv%zS5I6di|y1v_W-9$?~K7P;d_vPzs0dQenif6%?RktdTkW<cN zvdbvk*qRcK=v1W??G31Qkj7Kjwtr}O#@C#I0NN%~s=H9fAzLw$ufYOwTom7e+~Vp} zuMFj#SQ9W9weI!>0u><6kWvf5cL;C1x2&OUHQS5+3jA#-K-<jpOmBg=;9M|jUF`S! zt0!h>UvJuA)N0gAQd%;y2+TH=%-E!#oYJPlhVmXsciLYSXm!MXL`PGeJbjO&B_A$z zm?buu!G_2Kk}m*h1o(0(<g%FpFNjHyry+Q5+s=U%gS}wtt|}|@h;fr-Q}(|qV^nN^ zXIZ_ge!Wb<K$W>qiPo999DZfb7LhxkeyuqgP3E*5GDYc7`!p>C%3c8DHdCFUe_da> f?7TI1_&?B}MqDQ(aPwq)00000NkvXXu0mjf|Bg7e literal 0 HcmV?d00001 diff --git a/src/static/icon_message_red.png b/src/static/icon_message_red.png new file mode 100644 index 0000000000000000000000000000000000000000..c18d51487c1ebbe4dc93eca5c76455b619235ed7 GIT binary patch literal 639 zcmV-_0)YLAP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px%IY~r8R5(wyl|5)vVHAd+_oiw=QR-q96zfpLp{q-ws7nVeCaVc34uTHt;?Llu zgV;`1MRZVX`X_;;P5eOzks@|*aM8(9)GBSUXlS8-N$#<?iA_@4UR&_nzK?UB`<`>& z@4K={umSW4sA2u<C*)cb?eG4ZDvN}MHweo!j2R}gyOc~$d0P)?>ld~xBjeVnx9`h; z2j(y?;Mkb2VwY`5?ZD2(*i{t%BAwZ*RBGA}Xy6bDeE{m#0)p8%FzN?fQ0FPzw-mRb z9-0}_E1(ybPbfQyQ?UnVAd|hPo}?${U#Dy%<P=tSe83_nYG6}6*mhhSW`6vQVuLfK zJ}lVArf_Eusq4k}l}fg7XgA_MX2+3KjIlIuRnf%Va)q8jT^fO}OTmG8Q}pS#Jj~vK z_UFxPx0sv0M&;H)ptf+<rq0AAKV!dCG~Q_8U_VmR(uZWH)sc8?kx&9SS)%rsAMgx0 z4dA##Wo51kB()sqd8=6Ryj^Cq4g(!!eO+B)x(GCzV6LKCu~@D&*-nMd<FMFp|B`V_ zf!?%R!HULKE{OsMG3R;t<Sn*v?b<P(AbDQQFXQvtJv8?^bK^JIQvCy|ssuU;_7)TZ z0ww3IK0~n)0>5j?Rh<RhDN%Axo$&`23B3l66wb$(ovHJGV9jo-GjYYj!B(V;h0;EP zJws{+DuFTFOq04&@3r^~Fg-*ZSn*Nt?y#d~b;NI5BzP3mf>}M%4qyoABb#YcPin%; Z{{uk%Cn`Up&bR;o002ovPDHLkV1i%kDAxc0 literal 0 HcmV?d00001 diff --git a/src/static/icon_money.png b/src/static/icon_money.png new file mode 100644 index 0000000000000000000000000000000000000000..9f4fc28da3cc939b23b0e8075503a33292a004c9 GIT binary patch literal 516 zcmV+f0{i`mP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00001b5ch_0Itp) z=>Px$zDYzuR5(wql)Y<HVHC!H&&~C_sDp}e6NfA!4lW8hxi|<-qy=jmi$f9r1L@=- zxH$?PN=+hy#U$V)I4S6=A`}NfK`eejI!LYDn@4(MYa;o^cRW1j_de&m=RM*-A2stl zF?yUpd8C$j$2)BUcU7vq+R(HDr?L+~V}qIYqKcLA4!~Rm7;OU9z#l<J8!<0|(!ky( zO;yEmwm+a*A&xSH;XGy!Q8Z4NT0+`A956BE0`*@vNNwE-x(-bI(~<!k;x|~cd|!Rc z$Op3}bB;i_5r>C#==WF);3|<<2!qRrtH8lwfi=ua6x<??KPT?c3B<^dz|FKOPy?ph zjMN}K>}w+X0eT(>ue;(@KL)x2^Z~S=A-(Ggw2vU2?g;c`E{!MvXR$v4UwRaL0O=6$ z1d~^(yu7YY{<6nT?qGZRE3m8a!<dEo^X|al6yoL|%@2Mq@7Lms)dp}KJej+LJPq2` z*HdhYyq3&rseDaPZ{0Q*&+j7@<`FZXOn0!~V&;gWg6=>1)^<5;1QW+o*)yOS@P)sw zy#{&+o}*ZKs-(Eq({qtJah<x9q{Z>QW;g9B=m{LGpYR*TMY$F1j)W5c0000<MNUMn GLSTZALF6<5 literal 0 HcmV?d00001 diff --git a/src/static/icon_money1.png b/src/static/icon_money1.png new file mode 100644 index 0000000000000000000000000000000000000000..422c486df0303e980797058e59103843e8175e7f GIT binary patch literal 1045 zcmV+w1nT>VP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px&&q+i<R9HvFmtAOEWf;eQ|C4rY_hsv-Vx3oBbShI2hOi12HwzWk^#lsmq^yXa zxCx4&?#>&b17U13cA+wxgesv)*NQ`78j)={=Y_jaC|+4Nl+CTIqifpcJd!m1NNrBi zROq>U-{<4^KF|OCIAWbYt#f`V2C%Ny&D3sd!OIxa<L4Dm-L7OYWdRsCgn~_YvojhP z{@X&G?Kp~nw#_BAf4~VTGWfN1cif9pRZT2$Rp6C^@&&N2t^hTe!-zvbV?Nm^upP9q zFt|-(j3G7W$FE@=B^~HfJf0~A;tvoG9!DH3wTcq+#}!Guv1$O@w{Ii$)#E_*8Ubb) zyRlWN)YM9GidMkd+BR{|rg5aIH3N*#)N5p9a#a91Y4x}tfnHxDKxHk+0c1s3oB0^% ztq|fAQ-K#N7h#Y466hFETM>Y92eX5UB|lx22n|HoJ%aRhMTwU?ne`D(z9+EdQ!9$l z!tRGiZ~ZUH7lRy8B=Js301LS<;OLX$$?at(EY23^d*IQ$-4!xZEd**F1f4DFE9+H% z^0TG$1r@MR`*u|K8)9?OAZ7;?P4-*ZeGKs<MgUW*Vu^DW-oG0K&K39NHtFddihp@! z-lh;B?4Cq=#kcgv@BDe=A*E8Y7It$bRW#X`yD!4QpAe7x`+Fx89a`Ah3jo&JTFdO+ z*L+ux{eqEVh7<ZCIhxz1@wk^2mxVi;A@CaTG}2C=7EW+|s!?aoq;v4|hSuXg3Hrg8 z-pf3q*y&&WY%H{YCr;q9e-$z<ik?1S2oQEdNYN6?AHlpikx6Mqk|*;g=Bt?1%#Ay3 zz_b2wtXq-f=Y;^F&M=M>DY^BGLBtpycN9w;&H;piAK*}j*~3U#fD-w==M^0qSYCl= zkiIG5c~Oz%6UA(D2Uw4L1$3W(E4{sn4dp7isDbA?ny9W?*d8kfur%2Fc)E&gdVUoa z?(D|20Y}Z4y^B=*ondCA(@lzh^;ZGFTrYz^Ly2v)NH(rWq9N~h6R0m$`TYDPMH0K_ zZI>NH?g1Q~Dl3pNjqCwT0kA*Hem8htk77d$VlM>99wt5Rx1guWg1{!`?6jpkd%h!* z*t7If`cJQ{tG$uB+OwG7VNzzgLbJ=v&g{{^$n~YeE8m7)d+(xV>#?jVd<9hwM^<#u z&#lZM4G-rlw&>{pDh>sA5wJJ$)QPAoC*PutO@fl3qlye(D&||>k4g50+^}IcW?A*_ z!0did1DKQ7fCqLHX$%;}^Dc5LbD`Knv}6lbx6-v)msNqarSSJ&cYuEZ9~WUTdYlQr P00000NkvXXu0mjfQO)lm literal 0 HcmV?d00001 diff --git a/src/static/icon_money_day.png b/src/static/icon_money_day.png new file mode 100644 index 0000000000000000000000000000000000000000..185ccbb7bf27e93a077a8b595ad70f7aa6ccbbba GIT binary patch literal 1275 zcmV<X1O)quP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px(wMj%lR9HvFmwRkebri=x=eFAzDs;x7hKNx?gBl5tVC1p(I#hxNBuK<Wh#176 zxVC^IhOo{=5FG2Bim$|XM1nyy^2j3Cb`WAB5&uD>K#1~if?=D$V6S`RuHDvc?b<2{ z_ut<+-{0q+dtO(#%#U2=`^gNjsXU({o<%56B0P^TxPx~W<Z;``*@$s7%4tOQ;4Rz# zUtT6PK&>?soB1f$Aq)kI6XK`P`kRrWHNZ1HE);znZ}78RA^HMDLT<#<2n<Xk=128q zL<aXf*D8F$C6@*O&sl_mlwwLdf~)VD%*E&b^#21m3eoTekjHWmYoM`t7}J-X$-$?? zG<6Q_s=N`G`zOGYm7vN(O#eGs+4eF@Uj?;QUTj$jV)QF4e2+Kq5}=nBAY#1;JepZl z+n{9z=CWg%ZBt}UTBoS>6fi!ssJ3D7HYLFyGuvhZu)TZ`1B*TaW@Im@ZHTPE8*utV zPEXGq*uJWm!oqJ68I_Ytr?K!R-oSIY_;v$CLIV)buI$3z&lSpY%)qPJLUaSf!eLYb z**d1T(>7G^!CbsA8?87%ZFmeeKcp@>Sq=6GkVm=%oo;CG21*GqCh4M9&~i>TtfTm< zK^U%S*o*}7Fyts=?4YFV=VY)rKqR~skq1)}8#0*^|93>I*Mlwunh=?V*T0>p^#L$1 z;n##A)2KVWn;}KzKoBVGqp7-$0)3kCi;p{JLd|P8QQ$t*Ps2Hd%DtHW1H{5>X|uOb zx@0dgYc-0~E8>qbhx5i46x!PmN;8DN4mUm~27VQymP1<AuY>Aw@?BmglpXG{i&`r$ z!dE0+UV|B!Le#1T%Ch<Ppuf=M8tnjl4NS|zX)nIO1Zu4Zu-S;Jbd6-g@NvHR4+`AB zfw+^jj-j>*jdh4;KgjT2_dF{^tV0O5qyacVQ~gM$R{WFlyrWy{Dx!_o;wxGTn%syY zX!Bf*yi(K{M{{ch`R?}+ncl6XyPXJ}2L_}Da7s!(2F`#U#|%~ydwn!&C&H{_fxqwt z?;~n$06Itb0xsB_8DLam=w{lD8xVUYdF}IQb&mr!#q&nbIRO1kF=x=ohZlFjbJz)h z-RnkSyPilS-Z+$_n1R_utu4UAi5EGDunon7P>15oiK(D1AX9*0ovG^poJ`vJdIrKt zzC0;K+!ttXZJ{LiC*Onya`iRw9kHd=nHQ5WgAWn2oW8KAOF()xwN~ATOA8S>(w)5e zyATc6fZU%k2~`hZ2Ja+NJsZ)_lPcgaW?(qA)zh){t28=qq4mqav!}<LQQmg|=74;X z5g@*BI2Ge`zRnQF-9&E1u0Mi!oGv$_msSIYmSVF8WO7mh+9+d%_!b-iCT0PVCRcSm zW^fVFs!1R_LGm+dslI|4ToG@@TUQrxW#N|>TZ}KGV@iXLrR468r6g8872Dp>cWqDl zXv$j5z;dS!x~E|%WMF#cVQUbPJ8}onLukWj%!;$@sv3%m7r>YWT%XWt0%{Pc#OvSN zsh@f&-C21%dG1LlcLC1tS23c4ySkjx3^X8|06hq@4{eKJF8#X?xD(wgTm{6MP7(^) lz0WiM8|EI0oIEZ&z`yu&m~kZ{-!uRK002ovPDHLkV1j*XR22XK literal 0 HcmV?d00001 diff --git a/src/static/icon_money_month.png b/src/static/icon_money_month.png new file mode 100644 index 0000000000000000000000000000000000000000..c1dcaafb6bd42c7e9733d0f346cdfd1e3ff8fbc5 GIT binary patch literal 1294 zcmV+p1@ZccP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px($Vo&&R9HvFmuqYkRTRg6XLfcLix!BfN=g79Xb=Jv5{VC_5qty<TD1`k7&H+= zpmZ0(fD%v>MG1BXD`<>@kBBBDA_+){4?aMMi3Eue6on9|MFBMhO6$(d&M`A?mu<W4 z?!pJ|$GPYH?{ChWd(Ii*5-+*L=Ti{ir&_F=Dw(e^(||>$&9*(Wh>q&Z6QT@N_y>bs zRs%m=$jjsf@DkLdVU{S@0F?+8p}2CY#o@aC7Aq0v<Q}NX^q9>jr9yNA&{`tyAkG4p z<rNd^QC<f6b=p@NESqO99-tc2t)dl(^&sX0M%O(<dD67`_@V&<0VmD|gvUz|YdL+I z!4>Pm$d$D6=0N*ghD0p(0sV_qn`0$;r%2mQW<A~lH^D?zmgNg~r{oj9vywb7L5g0$ z>J4DADvuSR>3L~t${P8-2-|KZJpwrOJcDps5uzUOwq>)o2;0H{f7eldxyc6tH6;jo z;<Gfmn%7J42~9gi;A|ZgF_W)=(WMGy?BBAI)Rp3!1voO3K9vLb28s%Mk7o!hi6(ii zScoiu6DNrfFV?XayC5fSwUX>9Mk@qx;*3T3KHrs7WrZOOQ+PBhsHA~L;7)|GInP}& zSbngHH%1Jm+)Xo8VYmoUfhN;qn>2DD7c2xw#n~dl{rQMRm~1xits7@e*npHa!=Tn| z;7cdLI^e0$PiYf_sRx_bIcyNi1rquCi7HzyVYVb`4wJBb9@j>q9O|*)D5s((cd?57 zPMno#pG{?NvO87J3NcvR0j<J}V=fzqm}~_m^%j1GKP{hXS<OLl5+P|r0f%PGW1=*2 zIIwdQEK_(Xd$_VaW^<pDU^Os56Oo{yb;|>Vp&|?gem?3^C2pL}DoiaRVRl<dZg=as zR}DVPT;Z@K3sie9$0AXF1<VY<KFg-6Jx+CpcG}^Wn8j=rUd%k3E2%h#M7Ta5fGWpZ z(+t0|ku&-B!)j^pYBb5!UYvz0IfY0G0h~DNJA4J+119GH><m6ZJJ6?x2n1K^LzJ@u z%~6|GP90T5GGP|R0Vk{^cXw;y82~TAgB{utVXx=&bPm9|0HC)n767bAIhO@kz-WAC zhN8kPC{32lG&jyB6&}jDlKY~~jCU(LMP-8sQ?dYxiWBE#cIN9628CwJXA&m=lEx96 zKaS6$Y~U6D&xmfC8imO*n+KdkSQqAH6B9O{In9iI{dl<JS=3{f7h!q_fWlEpCD<-- zPr)Qq_FFb1QwgRCe429u4##Y62tw_{7nuaq;7vt|_`()oKgtOV7K+a!D!h>Ke?N%8 z41|x008oX^z*rFm=h{cp+{lj{amH{!gkeB?P#45!3Bovmji$jO$ERF09QQ^7zN3s2 z4TjJ$>_E7qAVg0F${NdNo||BT!q<RRNK2GgqBcvzQrt3!0c9~hN6z2bLIPd(J(Tgm zP~t6MiXXgX*RlP4a;OR`tt3l=F)rH;6%02K*7cw=jwlfzFhA6iqUx%(w6-OvG~qdg zT7iL?yl4|)JHo1H1G{r-L-(Unb=)il6EGO1aGfX>D&dbvN0mznw1{xrSAL5a>}hLd zNBO(_)m1Hst|`R&uH~da@K4cc75q26fJl_&a>)Vy1OG0mEyTU!N&o-=07*qoM6N<$ Ef|g-6MF0Q* literal 0 HcmV?d00001 diff --git a/src/static/icon_month.png b/src/static/icon_month.png new file mode 100644 index 0000000000000000000000000000000000000000..468d50db2ebf86e12337d3d77c5aedebd933ee08 GIT binary patch literal 726 zcmV;{0xA88P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px%kV!;AR9HvtmrY1iQ5462XC~iBk`@)Ai@qR`5K4l+AfiPp30#!h2ui3$zBf_} zm$fix@tzK$L`j?46ttQ}(JI<RU_#QOFAK`3pvbXk-W%U3$8mTX^PG=HU37OB&i|g@ z{l9zexldT)AxoT}PypBBDsT#Az;HNIEUXu2zbX$<Cey!YSvAP#LfUWulcxwfQAP}h z)?xu%i{rqJY`oHHIE*ZR0MBHf3cV-|DvZZ$+T3{#q%D%7G=(`KV5zVv=s-l+?knfA zI^ofa_jI@1#+{kwM%v_^2peZy<891li)%3qw4w|f4!hD8V*;DQ03y)t!|EUa!a=|Z z=uR6pgL42}YdUX!{77YJYKU?~;i$l!6eR0}k3emx14@tQb8|(6O9+#nplbv40$l-} zZP>)a08k}q2xrCSjaqDVm3|T0ia3a=h;SlWPm*yWULD6ETTMn@t2l;(6$(&9qVhwQ zB|!PxsZ1HHg0ae$DoH&QbGZ2b43zAE!hL~TVP>mxVfI2R7*}=`1cZea&tKo6l;z$7 zIRMY(t_tn*a+roq-{JtoIixz%H)e-scoIwSd{F?jla;KYCJ6BAC%?8ONG}S&l6?YI zdSebfuEp*MGzJ~WWEibY@VdGVz)8dAx|%c+4Rkl)tIM~w2_~uuknuA#Pwz5q@<HUU zmr-@AK;d%C=Dfz);c5PnIgIiULH#KPYWsQVnmj{j3GEDJT|_>eHGN$B^LD(4a5$Sl zd2BfB&6i>~&E6EF2+@BJkV}ZLC-AcI6q31ljlcnf`UU%9Sq?0?Y6$@a0KNe0N?4|n z(70h^&*_F4iw+;IR2jmb?x+*r=~zERY7Rgp+o?pm<bTJ%0c;OfFfV`-+yDRo07*qo IM6N<$f=pXOasU7T literal 0 HcmV?d00001 diff --git a/src/static/icon_storage.png b/src/static/icon_storage.png new file mode 100644 index 0000000000000000000000000000000000000000..7bbade6103008502ee07806592289afa16a5392c GIT binary patch literal 1163 zcmV;61a$j}P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px(MM*?KR9HvFmtAa=WfaGMr|TMrBoG)9gTe+|A;gf7NTL@;6HUBTqVWR3cq76- zU{eyh&3(xj3CdvICU|3X;llWNYobQtg(jE~qe194m?$yAAebOv*S>#w-|=>B_jc=+ z5qi}==Q;oLf6jM}d;GC`Y@az3h#uA^O4#o`AWc(Zx1F5JV`fbt8rM3YQ}BW@@c@Ag zJ_TA6b#`VpM2aS`re6=2IJ6;N!3YN$5h;uh(;+%WYV40<h|EY}MW2?IImFDUF}SZ7 zP{A#U{+l7XFV@<X>2wMbSk|wFiyaz(Hw+dPV>thg;2+@KYax0r*Vy$Sj41@xw<(fZ z%4;&-GI(Gvh69LPGVyl!3h$rpuw=G;lE8~9i9W%W+rswSajcvV!&5NCc^5zNJ;(XP z(yly1AR3ojQn9;Ycq(XjqRyIf2)IA0`t-Otber+y-5?@yLLp+qwf2LLADDzyaXo9$ zZLo1ZhzL#zV#9UzRX$$fGL$UZ&r5RXG^2VhL?nhRL~Ejkk1<nGRWRk!F_l)2^Qwtf zU`3HcF3RW}D&+&V+xRT{fUG*sW}sGLaQG@8(QYXh;Gsh*TTsd_U=OgQ0O(cV;Ei#P z{Ml$Xy*up+S1n<i8CwzYp?bc6NpDP6L7$$+p&MgU7Wi)xE!j#HJz5+oWe@Vm+<)ip zzZgf7;~X4quxk@%vg%%*H=_%1=f|C6P7)%PsI_l$%P^QgMk#IV9jUW#eVkQ2dN309 z!a_1d=kE>nmoJOXfE7q!TGl>!@pamWovX8-f<mx5u18DcmGLtH@-q_61w)Xd;Kr?- zZRXHs#>#A&J9-hHrNXqF-)U!ES>=G%hSQ#_H~S+x<8g68Av%V~Ci5v9Z`x_-C0>Lb zIK(i@b4cD9y%XUM7|~+PG4|gY=V&G&1KbiwVC{f5oZZPUezvYYphe*YG-5OY3ky_$ ze|#NrD0PEF=k}UA4ZVbn_Oc;SZ$Ibj<`Agr)njH}2YgE6lq|P<RUX#zaEK;@*D)e_ z9!Uz0I{(o%vd1p@GOw#n<i$q8cM`GTdi&9rX9!fswa=hApJ9+vMUN^XVLBvU_DabZ zOr~fbZLrad;jG65V0I1FSxZhC(ymanoGmzXVpIgU`AbJM57*miU$*9m9&x{q?6P08 z46hGO)c$i*FvKWsYaZh`?dIeX@Nc&%QeDn=M6(&ob1FbM7=!6Ft><>zg=|@6pH_uM z2V$!kp*+36F}jAvI7Y#RB#-X0HZ5FSUSK5?Ng3}+-b>vOG@ICwpBI^xY>b}E9YwBW z`EHB8qjD$0UW1)xl;z3&Jujy+ByI`@LP-uJ-n6mls%FNm*jHYCSS!ONv=+0Lr_yxh zho}&Vq6zo_6>+UAg?-sw&+Crx`8c$U-mO0-`7dz$epqz7=c#Gt!*uQsu7a5~=2<@L d5X`fE{s;GksxUnLJ%0cI002ovPDHLkV1i-*A5H)O literal 0 HcmV?d00001 diff --git a/src/static/listOfLoadedWagons.html b/src/static/listOfLoadedWagons.html deleted file mode 100644 index b8b86bba..00000000 --- a/src/static/listOfLoadedWagons.html +++ /dev/null @@ -1,1247 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="UTF-8" /> - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <title>Document</title> - </head> - <body> - <!-- 主体部分 --> - - <style> - .table_div { - padding: 30px; - } - .table { - margin-top: 10px; - } - .table tr { - height: 40px; - text-align: center; - } - .table td { - } - .tableLine { - border-top: 1px solid #000000 !important; - border-right: 1px solid #000000 !important; - border-collapse: collapse !important; - } - .tdLine { - border-left: 1px solid #000000 !important; - border-bottom: 1px solid #000000 !important; - border-collapse: collapse !important; - } - #top_title { - display: flex; - justify-content: space-between; - } - #top_title > div { - } - .head_01 th { - border: none; - } - .head_02 th { - border-top: 1px solid grey; - } - </style> - <script type="text/javascript" src="/admin_static/js/jquery.min.js"></script> - <script type="text/javascript" src="/admin_static/js/JsBarcode.all.js"></script> - <div class="table_div"> - <div> - <button onclick="printFun()">打印</button> - <button onclick="method5('print')">Excel导出</button> - </div> - <script> - var parent; - function doTests(p) { - parent = p; - var data = [ - { - id: 'LQWBZZ230516001', - text: 'LQWBZZ230516001', - }, - ]; - createTests(newTest, data); - } - function newTest(text, options) { - var testbox = document.createElement('div'); - testbox.className = 'testbox'; - var format = (typeof options !== 'undefined' && options.aaa) || '车次号'; - testbox.innerHTML = '<img class="barcode"/>' + '<p class="span">' + format + '<p></p>'; - try { - $('.barcode', testbox).JsBarcode(text, options); - } catch (e) { - testbox.className = 'errorbox'; - testbox.onclick = function () { - throw e; - }; - } - // parent.appendChild(testbox); - $(parent).html(testbox); - } - function createTests(newTest, data) { - for (var i = 0; i < data.length; i++) { - newTest(data[i].id, { - aaa: data[i].text, - width: 1.3, - height: 20, - displayValue: false, - font: 'cursive', - textAlign: 'center', - fontSize: 14, - }); - } - } - </script> - <div id="print"> - <table - class="table tableLine" - id="printcontent" - style="width: 100%" - border="1" - cellpadding="0" - cellspacing="0" - > - <tbody> - <tr style="height: 60px; text-align: center"> - <th colspan="4" class="tdLine"> - <img class="logo_op" src="/admin_resource/ueditor/image/20200428/huitong.png" /> - </th> - <th colspan="6" class="tdLine"><h1>汇通运输中转装载清单</h1></th> - <!-- <th colspan="2">车次号:LQWBZZ230516001</th>--> - <th colspan="4" class="tdLine"> - <div id="content" data-type="1"> - <div class="testbox"> - <img - class="barcode" - src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAO4AAAAoCAYAAAD5X8aLAAAAAXNSR0IArs4c6QAAAvhJREFUeF7tnE+KwjAUh19XrgR3oi4FwZ2geAp16w30ForewiO4VU8hCu4EwaWKO8EDOCSdlLYTOxkYpIGvq/nTmJfvvdfEX14avF6vl3BBAAJeEQhIXK/8hbEQ0ARIXAIBAh4SIHE9dBomQ4DEJQYg4CEBEtdDp2EyBEhcYgACHhIgcT10GiZDgMQlBiDgIQES10OnYTIEnBM3CALpdrvSarVkOp1KrVaT3W4n7XZb9vu9dDoduVwuUq1WE1QHg4FUKhVZLBbR32ezmSyXSzkej7qN+v1wOMh2u9X3rFYrud1uMplM5H6/6342m42s12v9s7nU7+rz1ZW2rdlsSrlclufzqdsoe5Xdo9Eoaq/aPh4POZ/P2g41hn6/r+8z13g81rYom+IM3o1H9Tmfz/WYjW2qrfpcc5l+er2e7lO1aTQaUiqVfu3HMFDjqdfrURv12WY8p9Mp4pb2j2KdHk+hUEgwKBaLur3yz7vx2PwT92k8Dmyx8xf/xMej4sD0Y+Nmi504gyz/XK9XHSfKtuFwKL/5x8bNxJtLjJq4fsct6/FE4pK4QuKGD1YSN/aoYMYNVxDMuMnVGjNuuGKNryBsK9Z3sy4zLjMuM+73g5UZlxmX77gxrYPvuHYdhhkXcUo/KhGnAquwiTiFqhyp16jKP1V/VOVitIuBqsx2UGIbje0gtoNUQCBOIU4hTiFOUYBBAUZYVEMBRrhQyioSQpxCnEKc+q5so3IqtfNLySMlj/ESTkoeu9avGJQ8Uqus68LT6jXiFOIU4hSHDPT2FrXK1CpzOojTQYhTjifYEKcQpxCnEKfs5xEQpxCnEKeS56U5j8tBeg7SZ7zogIP0PydTKqeonEKconKKyikqp6iccn290kfEqaz33/A/CEDgswScl8qfNYveIACBf3lZHBghAIH8EGDGzY8vsAQCzgRIXGdU3AiB/BAgcfPjCyyBgDMBEtcZFTdCID8ESNz8+AJLIOBMgMR1RsWNEMgPARI3P77AEgg4E/gCABF8xMakUbYAAAAASUVORK5CYII=" - /> - <p class="span">LQWBZZ230516001</p> - <p></p> - </div> - </div> - </th> - </tr> - <tr style="height: 40px; text-align: center" class="head_01"> - <th colspan="3" class="tdLine">始发站:龙泉仓</th> - <th colspan="11" class="tdLine"></th> - </tr> - <tr style="height: 40px; text-align: center" class="head_01 head_02"> - <th contenteditable="true" colspan="3" class="tdLine"> - 承运商:顺丰快递(成都XX营业部) - </th> - <th contenteditable="true" colspan="4" class="tdLine"> - 承运商联系电话:028-678920001 - </th> - <th contenteditable="true" colspan="2" class="tdLine">承运单号:21</th> - <th contenteditable="true" colspan="3" class="tdLine">卸车完成时间: 年 月 日</th> - <th contenteditable="true" colspan="2" class="tdLine">卸车人员签字:</th> - </tr> - <tr style="height: 20px; text-align: center"> - <td rowspan="2" class="tdLine">序号</td> - <td rowspan="2" class="tdLine">发货单位</td> - <td rowspan="2" class="tdLine">开单时间</td> - <td rowspan="2" class="tdLine">收货单位</td> - <td rowspan="2" class="tdLine">收货人</td> - <td rowspan="2" class="tdLine">收货电话</td> - <td rowspan="2" class="tdLine">物流单号</td> - <td rowspan="2" class="tdLine">合同号</td> - <td rowspan="2" class="tdLine">计划件数</td> - <td rowspan="2" class="tdLine">货位</td> - <td colspan="1" class="tdLine">装车产品明细</td> - <td rowspan="2" class="tdLine">合计计数</td> - <td rowspan="2" class="tdLine">卸车件数</td> - <td rowspan="2" class="tdLine">异常备注</td> - </tr> - <tr style="text-align: center"> - <td class="tdLine">小计</td> - </tr> - <tr style="text-align: center"> - <td class="tdLine">1</td> - <td rowspan="1" contenteditable="true" style="min-width: 60px" class="tdLine"> - 双流欧派 - </td> - <td rowspan="2" contenteditable="true" style="min-width: 60px" class="tdLine"> - 2023-05-09 - </td> - <td rowspan="1" contenteditable="true" class="tdLine">成都欧派衣柜</td> - <td rowspan="1" contenteditable="true" class="tdLine">杨林 郑三丰</td> - <td rowspan="2" contenteditable="true" class="tdLine">15730097068</td> - <td rowspan="1" class="tdLine">SL23050788</td> - <td class="tdLine">OPLYA成都市230400025YA4-1</td> - <td contenteditable="true" class="tdLine">10</td> - <td class="tdLine"></td> - <!--明细--> - <td contenteditable="true" class="tdLine">0</td> - <td contenteditable="true" rowspan="1" class="tdLine">0</td> - <td contenteditable="true" class="tdLine"></td> - <td contenteditable="true" style="min-width: 80px" class="tdLine"></td> - </tr> - <tr style="text-align: center"> - <td class="tdLine">2</td> - <td rowspan="1" contenteditable="true" style="min-width: 60px" class="tdLine"> - 成都欧派 - </td> - <td rowspan="1" contenteditable="true" class="tdLine">成都欧派衣柜</td> - <td rowspan="1" contenteditable="true" class="tdLine">杨林</td> - <td rowspan="1" class="tdLine">LQ23050050</td> - <td class="tdLine">OPLYC成都市23030508</td> - <td contenteditable="true" class="tdLine">3</td> - <td class="tdLine">E区-E14-2-2</td> - <!--明细--> - <td contenteditable="true" class="tdLine">0</td> - <td contenteditable="true" rowspan="1" class="tdLine">0</td> - <td contenteditable="true" class="tdLine"></td> - <td contenteditable="true" style="min-width: 80px" class="tdLine"></td> - </tr> - <tr style="text-align: center"> - <td colspan="8" class="tdLine">合计</td> - <td contenteditable="true" class="tdLine">13</td> - <td class="tdLine"></td> - <td class="tdLine"></td> - <td contenteditable="true" class="tdLine"></td> - <td contenteditable="true" class="tdLine"></td> - <td contenteditable="true" class="tdLine"></td> - </tr> - <tr> - <td colspan="14" contenteditable="true" style="text-align: center" class="tdLine"> - 投诉电话:4000184668 - <sapn style="width: 15px; display: inline-block"></sapn> 营业部售后电话: ******* - <sapn style="width: 15px; display: inline-block"></sapn> 系统派单调度: - </td> - </tr> - </tbody> - </table> - </div> - </div> - - <script type="text/javascript" src="/admin_static/layui/layui.all.js"></script> - <script type="text/javascript" src="/admin_static/xm-select/dist/xm-select.js?vs2021"></script> - - <!-- js 的一些配置 --> - <script> - layui.config({ - base: '/admin_static/layui/dist/', - }); - let local = window.localStorage['layuiAdmin']; - let alias = 'default'; - if (local != '{}') { - alias = eval('(' + window.localStorage['layuiAdmin'] + ')').theme.color.alias; - alias = alias === 'default' ? 'default' : alias; - } - layer.config({ - extend: alias + '/style.css', - skin: 'demo-class', - }); - - layui.use('notice', function () { - window.layNotice = layui.notice; - }); - </script> - - <script type="text/javascript" src="/admin_static/js/custom.js"></script> - <script type="text/javascript" src="/admin_static/js/tableInput.js?vs2021"></script> - - <!-- js 部分--> - - <script> - let print_data = ''; - - layui.laydate.render({ - elem: '#test5', - type: 'date', - done: function (value, date, endDate) { - layui.jquery('#test5').parent('td').html(value); - }, - }); - - function getExplorer() { - var explorer = window.navigator.userAgent; - //ie - if (explorer.indexOf('MSIE') >= 0) { - return 'IE'; - } - //firefox - else if (explorer.indexOf('Firefox') >= 0) { - return 'Firefox'; - } - //Chrome - else if (explorer.indexOf('Chrome') >= 0) { - return 'Chrome'; - } - //Opera - else if (explorer.indexOf('Opera') >= 0) { - return 'Opera'; - } - //Safari - else if (explorer.indexOf('Safari') >= 0) { - return 'Safari'; - } - } - function printFun() { - if (getExplorer() == 'IE') { - pagesetup_null(); - } - //根据div标签ID拿到div中的局部内容 - let $ = layui.jquery; - $('td').addClass('tdLine'); - $('table').addClass('tableLine'); - $('th').addClass('tdLine'); - let bdhtml = $('body').html(); - var jubuData = $('#print').html(); - $('body').html(jubuData); - //调用打印功能 - window.print(); - $('body').html(bdhtml); - - save_print(); - - return false; - } - function pagesetup_null() { - var hkey_root, hkey_path, hkey_key; - hkey_root = 'HKEY_CURRENT_USER'; - hkey_path = '\\Software\\Microsoft\\Internet Explorer\\PageSetup\\'; - try { - var RegWsh = new ActiveXObject('WScript.Shell'); - hkey_key = 'header'; - RegWsh.RegWrite(hkey_root + hkey_path + hkey_key, ''); - hkey_key = 'footer'; - RegWsh.RegWrite(hkey_root + hkey_path + hkey_key, ''); - } catch (e) {} - } - - function save_print() { - layui.jquery.ajax({ - url: '/admin/goods/printRecord.html', - type: 'post', - data: print_data, - }); - } - - // 以下为excel导出 - var idTmr; - function getExplorer() { - var explorer = window.navigator.userAgent; - //ie - if (explorer.indexOf('MSIE') >= 0) { - return 'ie'; - } - //firefox - else if (explorer.indexOf('Firefox') >= 0) { - return 'Firefox'; - } - //Chrome - else if (explorer.indexOf('Chrome') >= 0) { - return 'Chrome'; - } - //Opera - else if (explorer.indexOf('Opera') >= 0) { - return 'Opera'; - } - //Safari - else if (explorer.indexOf('Safari') >= 0) { - return 'Safari'; - } - } - function method5(tableid) { - if (getExplorer() == 'ie') { - var curTbl = document.getElementById(tableid); - var oXL = new ActiveXObject('Excel.Application'); - var oWB = oXL.Workbooks.Add(); - var xlsheet = oWB.Worksheets(1); - var sel = document.body.createTextRange(); - sel.moveToElementText(curTbl); - sel.select(); - sel.execCommand('Copy'); - xlsheet.Paste(); - oXL.Visible = true; - - try { - var fname = oXL.Application.GetSaveAsFilename( - 'Excel.xls', - 'Excel Spreadsheets (*.xls), *.xls' - ); - } catch (e) { - print('Nested catch caught ' + e); - } finally { - oWB.SaveAs(fname); - oWB.Close((savechanges = false)); - oXL.Quit(); - oXL = null; - idTmr = window.setInterval('Cleanup();', 1); - } - } else { - tableToExcel(tableid); - } - } - function Cleanup() { - window.clearInterval(idTmr); - CollectGarbage(); - } - var tableToExcel = (function () { - var uri = 'data:application/vnd.ms-excel;base64,', - template = - '<html><head><meta charset="UTF-8"></head><body><table>{table}</table></body></html>', - base64 = function (s) { - return window.btoa(unescape(encodeURIComponent(s))); - }, - format = function (s, c) { - return s.replace(/{(\w+)}/g, function (m, p) { - return c[p]; - }); - }; - return function (table, name) { - if (!table.nodeType) table = document.getElementById(table); - var ctx = { worksheet: name || 'Worksheet', table: table.innerHTML }; - window.location.href = uri + base64(format(template, ctx)); - }; - })(); - </script> - - <script> - // layui.jquery('#search-sd').removeClass('layui-hide'); - </script> - - <script> - localStorage.setItem('search', JSON.stringify({})); // 搜索重置为空 - localStorage.setItem('_M', JSON.stringify({})); // 搜索重置为空 - - /** - * 日期 - */ - let tableTime11 = function (param, renderName = 'test') { - let el = param['el'] ? param['el'] : 'timeXm', - id = param['id'] ? param['id'] : 'laydate', - key = param['key'] ? param['key'] : 'i.create_time_>'; - let search = localStorage.getItem('search'); - search = search ? JSON.parse(search) : {}; - let dataTime = search[key] ? search[key] : search[key], - data = []; - - if (dataTime) { - dataTime.split('~').forEach(function (val) { - data.push({ - name: val, - val: val, - selected: true, - }); - }); - } - - var timeXm = xmSelect.render({ - el: '#' + el, - content: '<div id="' + id + '" ></div>', - showBottom: false, - calendar: true, - format: 'yyyy-MM-dd', - data: data, - clickClose: true, - on: function (data) { - let search = localStorage.getItem('search'); - search = search ? JSON.parse(search) : {}; - search[key] = ''; - localStorage.setItem('search', JSON.stringify(search)); - searchSubmitHandle(renderName); - }, - hide: function () { - hideRepeatSubmit(key); - }, - }); - layui.laydate.render({ - elem: '#' + id, - position: 'static', - showBottom: false, - format: 'yyyy-MM-dd', - clickClose: true, - change: function () { - dateSelect(timeXm.getValue('value')); - }, - done: function (value) { - var values = timeXm.getValue('value'); - var index = values.findIndex(function (val) { - return val === value; - }); - if (values.length) { - values.shift(values); - } - values.push(value); - let search = localStorage.getItem('search'); - search = search ? JSON.parse(search) : {}; - search[key] = values.join(' ~ '); - localStorage.setItem('search', JSON.stringify(search)); - timeXm.update({ - data: values.map(function (val) { - return { - name: val, - value: val, - selected: true, - }; - }), - }); - }, - ready: removeAll, - }); - /** 下拉框隐藏时刷新 **/ - function hideRepeatSubmit(key) { - let search = localStorage.getItem('search'); - search = search ? JSON.parse(search) : {}; - if (search[key]) { - searchSubmitHandle(); - } - } - /** 搜索提交 **/ - function searchSubmitHandle(renderName = 'test') { - let search = localStorage.getItem('search'); - search = search ? JSON.parse(search) : {}; - console.log(search, 321); - table.reload('' + renderName + '', { - where: { - search: search, - }, - page: { - curr: 1, - }, - }); - return false; - } - function removeAll() { - document.querySelectorAll('#' + id + ' td[lay-ymd].layui-this').forEach(function (dom) { - dom.classList.remove('layui-this'); - }); - } - function dateSelect(values) { - // removeAll(); - let search = localStorage.getItem('search'); - search = search ? JSON.parse(search) : {}; - values = values[0] ? values : search[key] ? search[key].split('~') : []; - if (values) { - values.forEach(function (val) { - var dom = document.querySelector( - '#' + id + ' td[lay-ymd="' + val.replace(/-0([1-9])/g, '-$1') + '"]' - ); - dom && dom.classList.add('layui-this'); - }); - } - } - }; - - /** - * 日期时间段筛选 - */ - let tableTime = function (param, renderName = 'test') { - let el = param['el'] ? param['el'] : 'timeXm', - id = param['id'] ? param['id'] : 'laydate', - key = param['key'] ? param['key'] : 'i.create_time_>'; - let search = localStorage.getItem('search'); - search = search ? JSON.parse(search) : {}; - let dataTime = search[key] ? search[key] : search[key], - data = []; - - if (dataTime) { - dataTime.split('~').forEach(function (val) { - data.push({ - name: val, - val: val, - selected: true, - }); - }); - } - - var timeXm = xmSelect.render({ - el: '#' + el, - content: '<div id="' + id + '" style="position: relative;"></div>', - // showBottom: false, - // calendar: true, - // format: 'yyyy-MM-dd', - data: data, - // clickClose: true, - on: function (data) { - console.log(55555); - let search = localStorage.getItem('search'); - search = search ? JSON.parse(search) : {}; - search[key] = ''; - localStorage.setItem('search', JSON.stringify(search)); - searchSubmitHandle(renderName); - }, - hide: function () { - console.log(3333); - hideRepeatSubmit(key); - }, - }); - - layui.laydate.render({ - elem: '#' + id, - position: 'static', - // showBottom: false, - // format: 'yyyy-MM-dd', - type: 'datetime', - range: '~', - clickClose: true, - change: function () { - dateSelect(timeXm.getValue('value')); - }, - done: function (value) { - var values = timeXm.getValue('value'); - var index = values.findIndex(function (val) { - return val === value; - }); - if (values.length) { - values.shift(values); - } - values.push(value); - let search = localStorage.getItem('search'); - search = search ? JSON.parse(search) : {}; - search[key] = values.join(' ~ '); - localStorage.setItem('search', JSON.stringify(search)); - timeXm.update({ - data: values.map(function (val) { - return { - name: val, - value: val, - selected: true, - }; - }), - }); - }, - ready: removeAll, - }); - /** 下拉框隐藏时刷新 **/ - function hideRepeatSubmit(key) { - let search = localStorage.getItem('search'); - search = search ? JSON.parse(search) : {}; - if (search[key]) { - searchSubmitHandle(); - } - } - /** 搜索提交 **/ - function searchSubmitHandle(renderName = 'test') { - let search = localStorage.getItem('search'); - search = search ? JSON.parse(search) : {}; - console.log(search, 321); - table.reload('' + renderName + '', { - where: { - search: search, - }, - page: { - curr: 1, - }, - }); - return false; - } - function removeAll() { - document.querySelectorAll('#' + id + ' td[lay-ymd].layui-this').forEach(function (dom) { - dom.classList.remove('layui-this'); - dom.classList.add('laydate-selected'); - }); - } - function dateSelect(values) { - // removeAll(); - let search = localStorage.getItem('search'); - search = search ? JSON.parse(search) : {}; - values = values[0] ? values : search[key] ? search[key].split('~') : []; - if (values) { - values.forEach(function (val) { - var dom = document.querySelector( - '#' + id + ' td[lay-ymd="' + val.replace(/-0([1-9])/g, '-$1') + '"]' - ); - dom && dom.classList.add('layui-this'); - }); - } - } - }; - - /*** - * 输入框 - */ - function inputChange(obj) { - let value = obj.value, - key = obj.name; - let search = localStorage.getItem('search'); - let renderName = obj.getAttribute('type') ? obj.getAttribute('type') : 'test'; - search = search ? JSON.parse(search) : {}; - if (key.indexOf('_M') !== -1) { - moreSearchLocal(key, value); - } else { - search[key] = value; - } - localStorage.setItem('search', JSON.stringify(search)); - searchSubmitHandle(renderName); - /** 搜索提交 **/ - function searchSubmitHandle(renderName = 'test') { - let search = localStorage.getItem('search'); - search = search ? JSON.parse(search) : {}; - let more = moreSearchAssemble(); - let where = {}; - if (more) { - where = more; - } - where.search = search; - table.reload('' + renderName + '', { - where: where, - page: { - curr: 1, - }, - }); - return false; - } - } - - /** 下拉 **/ - let downSelect = function (param, radio = true, renderName = 'test') { - let data = param['data'] ? param['data'] : [], - key = param['key'] ? param['key'] : 'i.type', - id = param['id'] ? param['id'] : 'type'; - let search = localStorage.getItem('search'); - search = search ? JSON.parse(search) : {}; - - if (search[key]) { - search[key] = search[key].split(','); - data.forEach(function (item, i) { - search[key].forEach(function (it) { - if (item['value'] == it) { - data[i].selected = true; - } - }); - }); - } - - xmSelect.render({ - el: '#' + id, - radio: radio, - clickClose: radio, - filterable: true, - data: data, - on: function (data) { - if (key.indexOf('_M') !== -1) { - moreSearchLocal(key, value); - } else { - if (data['arr'].length) { - let searchArr = []; - data['arr'].forEach(function (item) { - searchArr.push(item['value']); - }); - let strSearch = searchArr.join(','); - localSearch(key, strSearch); - } else { - localSearch(key, ''); - searchSubmitHandle(renderName); - } - } - }, - hide() { - hideRepeatSubmit(key); - }, - }); - - /** 存储搜索条件 **/ - function localSearch(key, value) { - let search = localStorage.getItem('search'); - search = search ? JSON.parse(search) : {}; - search[key] = value; - console.log(search, 11); - localStorage.setItem('search', JSON.stringify(search)); - } - - /** 搜索提交 **/ - function searchSubmitHandle(renderName = 'test') { - let search = localStorage.getItem('search'); - search = search ? JSON.parse(search) : {}; - console.log(search, 123); - table.reload('' + renderName + '', { - where: { - search: search, - }, - page: { - curr: 1, - }, - }); - return false; - } - - /** 下拉框隐藏时刷新 **/ - function hideRepeatSubmit(key) { - let search = localStorage.getItem('search'); - search = search ? JSON.parse(search) : {}; - if (search[key]) { - searchSubmitHandle(renderName); - } - } - }; - - /** - * 存储额外搜索条件 - * @param key - * @param value - * @param more - */ - function moreSearchLocal(key, value, more = '_M') { - let _M = localStorage.getItem(more); - _M = _M ? JSON.parse(_M) : {}; - let _K = key.substr(key, key.indexOf('_M')); - _M[_K] = value; - localStorage.setItem(more, JSON.stringify(_M)); - } - - /** - * @param more - * @returns {any} - */ - function moreSearchAssemble(more = '_M') { - let _M = localStorage.getItem(more); - _M = _M ? JSON.parse(_M) : {}; - return _M; - } - </script> - <style type="text/css"> - .toast-title { - font-weight: bold; - } - .toast-message { - -ms-word-wrap: break-word; - word-wrap: break-word; - } - .toast-message a, - .toast-message label { - color: #fff; - } - .toast-message a:hover { - color: #ccc; - text-decoration: none; - } - .toast-close-button { - position: relative; - right: -0.3em; - top: -0.3em; - float: right; - font-size: 20px; - font-weight: bold; - color: #fff; - -webkit-text-shadow: 0 1px 0 #fff; - text-shadow: 0 1px 0 #fff; - opacity: 0.8; - -ms-filter: alpha(opacity=80); - filter: alpha(opacity=80); - line-height: 1; - } - .toast-close-button:hover, - .toast-close-button:focus { - color: #000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - -ms-filter: alpha(opacity=40); - filter: alpha(opacity=40); - } - .rtl .toast-close-button { - left: -0.3em; - float: left; - right: 0.3em; - } - button.toast-close-button { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; - } - .toast-top-center { - top: 0; - right: 0; - width: 100%; - } - .toast-bottom-center { - bottom: 0; - right: 0; - width: 100%; - } - .toast-top-full-width { - top: 0; - right: 0; - width: 100%; - } - .toast-bottom-full-width { - bottom: 0; - right: 0; - width: 100%; - } - .toast-top-left { - top: 12px; - left: 12px; - } - .toast-top-right { - top: 12px; - right: 12px; - } - .toast-bottom-right { - right: 12px; - bottom: 12px; - } - .toast-bottom-left { - bottom: 12px; - left: 12px; - } - #toast-container { - position: fixed; - z-index: 999999; - pointer-events: none; - } - #toast-container * { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - } - #toast-container > div { - position: relative; - pointer-events: auto; - overflow: hidden; - margin: 0 0 6px; - padding: 15px 15px 15px 50px; - width: 300px; - -moz-border-radius: 3px 3px 3px 3px; - -webkit-border-radius: 3px 3px 3px 3px; - border-radius: 3px 3px 3px 3px; - background-position: 15px center; - background-repeat: no-repeat; - -moz-box-shadow: 0 0 12px #999; - -webkit-box-shadow: 0 0 12px #999; - box-shadow: 0 0 12px #999; - color: #fff; - opacity: 0.8; - -ms-filter: alpha(opacity=80); - filter: alpha(opacity=80); - } - #toast-container > div.rtl { - direction: rtl; - padding: 15px 50px 15px 15px; - background-position: right 15px center; - } - #toast-container > div:hover { - -moz-box-shadow: 0 0 12px #000; - -webkit-box-shadow: 0 0 12px #000; - box-shadow: 0 0 12px #000; - opacity: 1; - -ms-filter: alpha(opacity=100); - filter: alpha(opacity=100); - cursor: pointer; - } - #toast-container > .toast-info { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=') !important; - } - #toast-container > .toast-error { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=') !important; - } - #toast-container > .toast-success { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==') !important; - } - #toast-container > .toast-warning { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=') !important; - } - #toast-container.toast-top-center > div, - #toast-container.toast-bottom-center > div { - width: 300px; - margin-left: auto; - margin-right: auto; - } - #toast-container.toast-top-full-width > div, - #toast-container.toast-bottom-full-width > div { - width: 96%; - margin-left: auto; - margin-right: auto; - } - .toast { - background-color: #030303; - } - .toast-success { - background-color: #51a351; - } - .toast-error { - background-color: #bd362f; - } - .toast-info { - background-color: #2f96b4; - } - .toast-warning { - background-color: #f89406; - } - .toast-progress { - position: absolute; - left: 0; - bottom: 0; - height: 4px; - background-color: #000; - opacity: 0.4; - -ms-filter: alpha(opacity=40); - filter: alpha(opacity=40); - } - @media all and (max-width: 240px) { - #toast-container > div { - padding: 8px 8px 8px 50px; - width: 11em; - } - #toast-container > div.rtl { - padding: 8px 50px 8px 8px; - } - #toast-container .toast-close-button { - right: -0.2em; - top: -0.2em; - } - #toast-container .rtl .toast-close-button { - left: -0.2em; - right: 0.2em; - } - } - @media all and (min-width: 241px) and (max-width: 480px) { - #toast-container > div { - padding: 8px 8px 8px 50px; - width: 18em; - } - #toast-container > div.rtl { - padding: 8px 50px 8px 8px; - } - #toast-container .toast-close-button { - right: -0.2em; - top: -0.2em; - } - #toast-container .rtl .toast-close-button { - left: -0.2em; - right: 0.2em; - } - } - @media all and (min-width: 481px) and (max-width: 768px) { - #toast-container > div { - padding: 15px 15px 15px 50px; - width: 25em; - } - #toast-container > div.rtl { - padding: 15px 50px 15px 15px; - } - } - </style> - <style type="text/css"> - .toast-title { - font-weight: bold; - } - .toast-message { - -ms-word-wrap: break-word; - word-wrap: break-word; - } - .toast-message a, - .toast-message label { - color: #fff; - } - .toast-message a:hover { - color: #ccc; - text-decoration: none; - } - .toast-close-button { - position: relative; - right: -0.3em; - top: -0.3em; - float: right; - font-size: 20px; - font-weight: bold; - color: #fff; - -webkit-text-shadow: 0 1px 0 #fff; - text-shadow: 0 1px 0 #fff; - opacity: 0.8; - -ms-filter: alpha(opacity=80); - filter: alpha(opacity=80); - line-height: 1; - } - .toast-close-button:hover, - .toast-close-button:focus { - color: #000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - -ms-filter: alpha(opacity=40); - filter: alpha(opacity=40); - } - .rtl .toast-close-button { - left: -0.3em; - float: left; - right: 0.3em; - } - button.toast-close-button { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; - } - .toast-top-center { - top: 0; - right: 0; - width: 100%; - } - .toast-bottom-center { - bottom: 0; - right: 0; - width: 100%; - } - .toast-top-full-width { - top: 0; - right: 0; - width: 100%; - } - .toast-bottom-full-width { - bottom: 0; - right: 0; - width: 100%; - } - .toast-top-left { - top: 12px; - left: 12px; - } - .toast-top-right { - top: 12px; - right: 12px; - } - .toast-bottom-right { - right: 12px; - bottom: 12px; - } - .toast-bottom-left { - bottom: 12px; - left: 12px; - } - #toast-container { - position: fixed; - z-index: 999999; - pointer-events: none; - } - #toast-container * { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - } - #toast-container > div { - position: relative; - pointer-events: auto; - overflow: hidden; - margin: 0 0 6px; - padding: 15px 15px 15px 50px; - width: 300px; - -moz-border-radius: 3px 3px 3px 3px; - -webkit-border-radius: 3px 3px 3px 3px; - border-radius: 3px 3px 3px 3px; - background-position: 15px center; - background-repeat: no-repeat; - -moz-box-shadow: 0 0 12px #999; - -webkit-box-shadow: 0 0 12px #999; - box-shadow: 0 0 12px #999; - color: #fff; - opacity: 0.8; - -ms-filter: alpha(opacity=80); - filter: alpha(opacity=80); - } - #toast-container > div.rtl { - direction: rtl; - padding: 15px 50px 15px 15px; - background-position: right 15px center; - } - #toast-container > div:hover { - -moz-box-shadow: 0 0 12px #000; - -webkit-box-shadow: 0 0 12px #000; - box-shadow: 0 0 12px #000; - opacity: 1; - -ms-filter: alpha(opacity=100); - filter: alpha(opacity=100); - cursor: pointer; - } - #toast-container > .toast-info { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=') !important; - } - #toast-container > .toast-error { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=') !important; - } - #toast-container > .toast-success { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==') !important; - } - #toast-container > .toast-warning { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=') !important; - } - #toast-container.toast-top-center > div, - #toast-container.toast-bottom-center > div { - width: 300px; - margin-left: auto; - margin-right: auto; - } - #toast-container.toast-top-full-width > div, - #toast-container.toast-bottom-full-width > div { - width: 96%; - margin-left: auto; - margin-right: auto; - } - .toast { - background-color: #030303; - } - .toast-success { - background-color: #51a351; - } - .toast-error { - background-color: #bd362f; - } - .toast-info { - background-color: #2f96b4; - } - .toast-warning { - background-color: #f89406; - } - .toast-progress { - position: absolute; - left: 0; - bottom: 0; - height: 4px; - background-color: #000; - opacity: 0.4; - -ms-filter: alpha(opacity=40); - filter: alpha(opacity=40); - } - @media all and (max-width: 240px) { - #toast-container > div { - padding: 8px 8px 8px 50px; - width: 11em; - } - #toast-container > div.rtl { - padding: 8px 50px 8px 8px; - } - #toast-container .toast-close-button { - right: -0.2em; - top: -0.2em; - } - #toast-container .rtl .toast-close-button { - left: -0.2em; - right: 0.2em; - } - } - @media all and (min-width: 241px) and (max-width: 480px) { - #toast-container > div { - padding: 8px 8px 8px 50px; - width: 18em; - } - #toast-container > div.rtl { - padding: 8px 50px 8px 8px; - } - #toast-container .toast-close-button { - right: -0.2em; - top: -0.2em; - } - #toast-container .rtl .toast-close-button { - left: -0.2em; - right: 0.2em; - } - } - @media all and (min-width: 481px) and (max-width: 768px) { - #toast-container > div { - padding: 15px 15px 15px 50px; - width: 25em; - } - #toast-container > div.rtl { - padding: 15px 50px 15px 15px; - } - } - </style> - </body> -</html> diff --git a/src/views/distribution/checkInventoryTask/createTask.vue b/src/views/distribution/checkInventoryTask/createTask.vue index a95bb18c..338f0865 100644 --- a/src/views/distribution/checkInventoryTask/createTask.vue +++ b/src/views/distribution/checkInventoryTask/createTask.vue @@ -158,7 +158,12 @@ <el-button type="primary" @click="TcAddData" v-if="Statusjudgment">新 增</el-button> <el-button type="primary" @click="InventoryModification">提交修改</el-button> <el-button type="primary" @click="ModifyingStatus">修改状态</el-button> - <el-button icon="Download" type="primary" @click="handleUncountedExport"> + <el-button + icon="Download" + v-if="InventoryState" + type="primary" + @click="handleUncountedExport" + > 导出 </el-button> </div> diff --git a/src/views/distribution/checkInventoryTask/createTask2.vue b/src/views/distribution/checkInventoryTask/createTask2.vue new file mode 100644 index 00000000..72b71e7c --- /dev/null +++ b/src/views/distribution/checkInventoryTask/createTask2.vue @@ -0,0 +1,2697 @@ +<template> + <div class="maxContent" v-loading="loadingObj.pageLoading"> + <!-- 搜索功能 --> + <div> + <div class="avue-crud__right"> + <div> + <el-button type="primary" @click="InventoryTask" + ><el-icon> + <Plus /> + </el-icon> + 创建盘点任务</el-button + > + <el-button type="primary" @click="discard"> 废弃</el-button> + <el-button type="primary" @click="DelayButton"> 延期</el-button> + </div> + <div> + <el-button icon="el-icon-refresh" @click="Refresh" circle></el-button> + <el-button icon="el-icon-search" @click="searchSo = !searchSo" circle></el-button> + </div> + </div> + + <tablecmt + :columnList="menuData" + :tableData="details.data" + :loading="loading" + @inputTxt="inputsc" + @selectCheck="selectsc" + @selection="selectionChange" + > + <template #default="slotProps"> + <template v-if="slotProps.scope.column.label === '盘点任务编号'"> + <span class="mr10" @click="ViewEvent(slotProps.scope.row)">{{ + slotProps.scope.row.questNum + }}</span> + <el-text @click="ExportDC(slotProps.scope.row)">导出</el-text> + </template> + + <template v-else-if="slotProps.scope.column.label === '操作'"> + <el-text @click="ViewEvent(slotProps.scope.row)">已盘点明细</el-text> + <el-text @click="DetailsNotCounted(slotProps.scope.row)">未盘点明细</el-text> + <el-text @click="comparativeData(slotProps.scope.row)">对比数据</el-text> + </template> + </template> + </tablecmt> + </div> + <!-- 表格翻页功能 --> + <div class="demo-pagination-block TCdemo-pagination-block"> + <el-pagination + v-model:current-page="currentPage" + v-model:page-size="pageSize" + :page-sizes="pageList" + :disabled="disabled" + :background="background" + layout="total, sizes, prev, pager, next, jumper" + :total="total" + @size-change="PageSizeChange" + @current-change="SizeChange" + /> + </div> + <!-- 弹窗详情 --> + + <el-dialog + v-model="PopupDetails" + :title="!InventoryState ? '盘点数据' : '未盘点数据'" + width="80%" + :before-close="handleClose" + :fullscreen="fullScreen" + > + <div style="margin-bottom: 10px"> + <div style="display: flex"> + <!-- v-if="TcMInventoryStatus" --> + <div> + <!-- v-if="!NotCounted" --> + <el-button type="primary" @click="BatchdeletePackages">删 除</el-button> + <el-button type="primary" @click="TcAddData" v-if="Statusjudgment">新 增</el-button> + <el-button type="primary" @click="InventoryModification">提交修改</el-button> + <el-button type="primary" @click="ModifyingStatus">修改状态</el-button> + <el-button + icon="Download" + v-if="InventoryState" + type="primary" + @click="handleUncountedExport" + > + 导出 + </el-button> + </div> + <div style="margin-left: 10px"> + <!-- v-if="NotCounted" --> + <el-button type="primary" @click="NotInventoried">盘点</el-button> + </div> + + <div class="fullScreen" @click="BtnfullScreen"> + <el-icon><FullScreen /></el-icon> + </div> + </div> + </div> + <!-- 表格开始 --> + <el-table + v-loading="TcPdloading" + element-loading-text="数据正在更新中..." + :data="TcPD" + row-key="name" + border + :height="eightyPercentHeight + 'px'" + style="width: 100%" + @select-all="TcselectAll" + @select="TcselectChange" + > + <el-table-column type="selection" width="55" fixed /> + <el-table-column type="index" fixed width="50" height="100" label="#" align="center" /> + <el-table-column + :prop="item.prop" + :label="item.label" + :width="item.width" + :fixed="item.fixed" + align="center" + v-for="(item, index) in InventoryDetails" + :key="item.label" + > + <el-table-column + :prop="item.prop" + :label="item.label" + :width="item.width" + :fixed="item.fixed" + align="center" + > + <template #header> + <el-input + @change="() => InputSo(item)" + clearable + v-if="item.type == 5 || item.prop == 'categoryName' || item.prop == 'materialCode'" + v-model="item.values" + :placeholder="`请输入${item.label}`" + /> + + <el-select + v-model="TcFrom[item.prop]" + class="m-2" + placeholder="请选择" + size="large" + v-if="item.type == 6" + @change="TcChenge($event, item)" + :clearable="true" + > + <el-option + v-for="item in item.checkarr" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + + <!-- 日期搜索 --> + <el-date-picker + v-if="item.type == 8" + v-model="TcFrom[item.prop]" + type="datetimerange" + format="YYYY-MM-DD HH:mm:ss" + value-format="YYYY-MM-DD HH:mm:ss" + range-separator="至" + start-placeholder="开始时间" + end-placeholder="结束时间" + @change="TcChenge($event, item)" + /> + </template> + <template #default="props"> + <span v-if="item.type == 1 && item.prop == 'questStatus'"> + {{ + props.row[item.prop] == 0 + ? '待盘点' + : props.row[item.prop] == 1 + ? '已盘' + : props.row[item.prop] == 2 + ? '未盘点' + : props.row[item.prop] == 3 + ? '已排除' + : '/' + }} + </span> + + <span v-if="item.type == 6 && item.prop === 'questTarget'"> + {{ + props.row[item.prop] == 1 + ? '定制品' + : props.row[item.prop] == 2 + ? '零担' + : props.row[item.prop] == 3 + ? '库存品' + : '/' + }}</span + > + + <span v-if="item.type == 10 && item.prop != 'materialCode'"> + <el-input + clearable + :disabled="props.row.Checkbox" + v-model="props.row[item.prop]" + :placeholder="`请输入${item.label}`" + /> + </span> + + <span v-if="item.type == 10 && item.prop == 'materialCode'"> + <!-- 下拉搜索 --> + <el-select + v-if="props.row.wLinputState" + v-model="props.row.Input" + filterable + placeholder="请输入物料编码" + > + <el-option + v-for="item in Wloptions" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + <el-input + v-else + @change="wLcheng(props.row, props.row)" + clearable + :disabled="props.row.Checkbox" + v-model="props.row.Input" + :placeholder="`请输入${item.label}`" + /> + </span> + <div :class="ElBtnClass" v-if="item.type == 3 && !NotCounted"> + <el-button + :link="ElButtonS[2].link" + :class="ElButtonS[2].class" + :auto-insert-space="ElButtonS[2].space" + :size="ElButtonS[2].size" + :icon="ElButtonS[2].icon" + @click="InventoryEditing(props.row)" + >编辑</el-button + > + </div> + + <span v-if="item.type == 4">{{ + props.row[item.prop] ? props.row[item.prop] : '/' + }}</span> + </template> + </el-table-column> + </el-table-column> + </el-table> + <template #footer> + <!-- 表格翻页功能 --> + <div class="demo-pagination-blockPD demo-pagination-block TCdemo-pagination-block"> + <el-pagination + v-model:current-page="TccurrentPage" + v-model:page-size="TcpageSize" + :page-sizes="pageList" + :disabled="disabled" + :background="background" + layout="total, sizes, prev, pager, next, jumper" + :total="Tctotal" + @size-change="TcPageSizeChange" + @current-change="TcSizeChange" + /> + </div> + <span class="dialog-footer"> + <el-button @click="PopupDetails = false">取消</el-button> + <el-button type="primary">确定</el-button> + </span> + </template> + </el-dialog> + + <!-- 弹窗里面的详情 --> + + <!-- 状态选择 --> + <el-dialog + v-model="InventoryStatus" + title="状态选择" + width="70%" + style="display: flex; flex-direction: column" + > + <!-- 定制品单选框 --> + <el-radio-group v-model="WrapBarEditing.radio" class="tcradiogroup" v-if="!TcStateSwitching"> + <template v-for="(item, index) in radioList" :key="item.label"> + <div class="Tcstate"> + <el-radio @change="TcReac" :label="item.label">{{ item.txt }} </el-radio> + <el-input-number + v-model="counting[item.input]" + :disabled="item.disabled" + placeholder="数量" + :min="0" + /> + </div> + </template> + </el-radio-group> + + <!-- 多选框 --> + <el-checkbox-group v-model="readList" @change="Tcmultiple" v-else> + <template v-for="(item, index) in radioList" :key="item.label"> + <div class="Tcstate TcstateS"> + <el-checkbox :label="item.txt" @change="Tclist(index + 1)" /><el-input-number + v-model="counting[item.input]" + :disabled="item.disabled" + placeholder="数量" + :min="0" + /> + </div> + </template> + </el-checkbox-group> + + <span class="Tcstdialog-footer"> + <el-button @click="InventoryStatus = false">取消</el-button> + <el-button type="primary" @click="StatusDetermination">确定</el-button> + </span> + </el-dialog> + + <el-dialog v-model="PopupEditing" title="信息编辑" width="60%" @close="closeInformationediting"> + <el-form :model="WrapBarEditing" label-position="right" label-width="100px"> + <el-form-item label="包条:"> + <el-input v-model="WrapBarEditing.orderPackageCode" disabled placeholder="包条" /> + </el-form-item> + <el-form-item label="订单自编号:"> + <el-input v-model="WrapBarEditing.orderCode" placeholder="请输入订单自编号" /> + </el-form-item> + + <el-form-item label="异常状态:"> + <!-- 定制品单选框 --> + <el-radio-group + v-model="WrapBarEditing.radio" + class="tcradiogroup" + v-if="!TcStateSwitching" + > + <template v-for="(item, index) in radioList" :key="item.label"> + <div class="Tcstate"> + <el-radio @change="TcReac" :label="item.label">{{ item.txt }} </el-radio> + <el-input-number + v-model="counting[item.input]" + :disabled="item.disabled" + placeholder="数量" + :min="0" + /> + </div> + </template> + </el-radio-group> + + <!-- 多选框 --> + <el-checkbox-group v-model="readList" @change="Tcmultiple" v-else> + <template v-for="(item, index) in radioList" :key="item.label"> + <div class="Tcstate TcstateS"> + <el-checkbox :label="item.txt" @change="Tclist(index + 1)" /><el-input-number + v-model="counting[item.input]" + :disabled="item.disabled" + placeholder="数量" + :min="0" + /> + </div> + </template> + </el-checkbox-group> + </el-form-item> + + <el-form-item label="新的货位"> + <el-select-v2 + v-model="WrapBarEditing.groundingPositionCode" + style="width: 240px" + filterable + remote + :remote-method="remoteMethod" + clearable + :options="optionss" + placeholder="请输入货位" + /> + </el-form-item> + </el-form> + + <template #footer> + <span class="dialog-footer"> + <el-button @click="PopupEditing = false">取消</el-button> + <el-button type="primary" @click="InformationEditing">提交</el-button> + </span> + </template> + </el-dialog> + + <!-- 新增弹窗 --> + <el-dialog + v-model="TcDataaddition" + title="新增" + width="70%" + style="display: flex; flex-direction: column" + > + <el-form + :model="Fromnewlyadded" + label-position="right" + label-width="100px" + style="margin-top: 40px" + > + <el-form-item label="SKU:"> + <el-input v-model="Fromnewlyadded.sku" placeholder="请输入SKU" /> + </el-form-item> + <el-form-item label="货物名称:"> + <el-input v-model="Fromnewlyadded.name" placeholder="请输入货物名称" /> + </el-form-item> + <el-form-item label="货物单位:"> + <el-select v-model="Fromnewlyadded.logpmUnit" class="m-2" placeholder="选择货物单位"> + <el-option + v-for="item in classification" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + </el-form-item> + + <el-form-item label="规格:"> + <el-input v-model="Fromnewlyadded.specification" placeholder="请输入规格" /> + </el-form-item> + <el-form-item label="物料编码:"> + <el-input v-model="Fromnewlyadded.packingSpecification" placeholder="请输入物料编码" /> + </el-form-item> + + <el-form-item label="产品编码:"> + <el-input v-model="Fromnewlyadded.productCode" placeholder="请输入产品编码" /> + </el-form-item> + <el-form-item label="包装数量:"> + <el-input v-model="Fromnewlyadded.packageNum" placeholder="请输入包装数量" /> + </el-form-item> + </el-form> + + <span class="Tcstdialog-footer"> + <el-button @click="TcDataaddition = false">取消</el-button> + <el-button type="primary" @click="TcDataadditionsubmit">确定</el-button> + </span> + </el-dialog> + <!-- 创建盘点弹窗 --> + <el-dialog v-model="InventoryPopup" title="创建盘点任务" width="30%"> + <el-form :model="formInventory" label-width="120px"> + <el-form-item label="商场名称"> + <el-select + multiple + v-model="formInventory.scname" + filterable + placeholder="请选择商场" + @change="formInventoryChange" + > + <el-option + v-for="item in formInventory.select" + :key="item.id" + :label="item.clientName" + :value="item.id" + /> + </el-select> + </el-form-item> + + <el-form-item label="品牌"> + <el-input v-model="formInventory.brandName" disabled placeholder="品牌名称" /> + </el-form-item> + + <el-form-item label="盘点时间" class="pdsj"> + <el-date-picker + v-model="formInventory.time" + type="datetimerange" + range-separator="至" + start-placeholder="盘点开始时间" + format="YYYY-MM-DD HH:mm:ss" + date-format="YYYY/MM/DD ddd" + value-format="YYYY/MM/DD HH:mm:ss" + end-placeholder="盘点结束时间" + > + </el-date-picker> + </el-form-item> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="InventoryPopup = false">取消</el-button> + <el-button type="primary" @click="InventorySubmit"> 提交 </el-button> + </span> + </template> + </el-dialog> + + <!-- 延期弹窗 --> + <el-dialog v-model="dialogTabData" width="780px" title="选择延期时间"> + <el-date-picker + class="w100" + v-model="TcData" + type="date" + placeholder="请选择延期时间" + value-format="YYYY-MM-DD HH:mm:ss" + /> + <template #footer> + <span class="dialog-footer"> + <el-button @click="dialogTabData = false">取消</el-button> + <el-button type="primary" @click="InventoryDate"> 提交 </el-button> + </span> + </template> + </el-dialog> + + <!-- 对比信息弹窗 --> + <el-dialog v-model="dialogcontrast" title="对比信息" width="70%"> + <div class="dbExPo"> + <el-button type="primary" @click="MXexport">导出</el-button> + </div> + <!-- 表格开始 --> + <el-table + v-loading="contrastloading" + element-loading-text="数据正在更新中..." + :data="contrastData" + row-key="name" + border + height="600" + style="width: 100%" + @select-all="contrastselectAll" + @select="contrastselectChange" + > + <el-table-column type="selection" width="55" fixed /> + <el-table-column type="index" fixed width="50" height="100" label="#" align="center" /> + <!-- + Type ===1 普通文本 + Type ===2 图片显示 + Type ===3 操作功能 + label: 标题 + width: 宽度 + prop: 数据字段 + --> + <el-table-column + :prop="item.prop" + :label="item.label" + :width="item.width" + :fixed="item.fixed" + align="center" + v-for="(item, index) in contrast" + :key="item.label" + > + <el-table-column + :prop="item.prop" + :label="item.label" + :width="item.width" + :fixed="item.fixed" + align="center" + > + <template #header> + <!-- <el-input + @change="InputSo(item)" + clearable + v-if="item.type == 4" + v-model="item.values" + :placeholder="`请输入${item.label}`" + /> --> + </template> + + <template #default="props"> + <div :class="ElBtnClass" v-if="item.type == 3"> + <!-- 按钮 --> + </div> + <span v-if="item.type == 4">{{ + props.row[item.prop] != null ? props.row[item.prop] : '/' + }}</span> + <span v-if="item.type == 6">{{ + props.row[item.prop] == null ? 0 : props.row[item.prop] + }}</span> + </template> + </el-table-column> + </el-table-column> + </el-table> + </el-dialog> + <!-- 数据对比结束 --> + </div> +</template> + +<script setup> +import { + $_getContrastInfo, + $_getDetailInfo, + $_updateDate, + $_updateDetailInfo, + $_updateQuestChildInfo, + $_getQuestChildInfo, + getDictList, + getTaskQuestPage, + postAddtaskQuest, + $_materialList, + $_submit, + $_questDetailIds, + $_exportGetContrastInfo, + $_getList, + $_postBatchDelete, + postExportContrastStockInfo, +} from '@/api/distribution/createTask'; +import { ElMessageBox } from 'element-plus'; +import { ElMessage } from 'element-plus'; +import { downloadXls } from '@/utils/util'; +import { getDictionaryBiz } from '@/api/system/dict'; +import { ref, reactive } from 'vue'; +import { off } from 'dom7'; +const wLinput = ref(null); //物料编码搜索框 +const wLinputState = ref(false); //标记是否显示下拉框 +const SoInfoData = ref({}); //搜索框参数 +const searchSo = ref(false); //搜索框 +const ElData = ref([]); //表格的值 +const TcPD = ref([]); //弹窗盘点表格得值 +const currentPage = ref(1); // 默认页码 +const pageSize = ref(40); // 默认每一页几条 +const dialogTabData = ref(false); //延期弹窗 +const TccurrentPage = ref(1); // 默认页码 +const TcpageSize = ref(50); // 默认每一页几条 +const Tctotal = ref(null); //明细页码总数 +const TcData = ref(null); //延期时间 +const pageList = ref([50, 100, 200, 500, 1000]); // 选择每页显示多少条 +const background = ref(true); // 是否开启背景颜色 +const disabled = ref(false); // 是否禁止使用页码功能 +const total = ref(0); //页码总数 +const loading = ref(false); //表格加载Load +const PopupDetails = ref(false); //弹窗详情是否展示 +const InventoryPopup = ref(false); //创建判断任务弹窗 +const formInventory = ref({}); //盘点任务表单_ +const TcPdloading = ref(false); //弹窗盘点数据 +const PdRow = ref(null); //盘点任务选中 +const TcFrom = ref({}); //弹窗搜索 +const row = ref({}); //选择当前列 +const Tcrow = ref(); //弹窗当前行 +const WrapBarEditing = ref({}); //弹窗数据编辑 +const PopupEditing = ref(false); //弹窗编辑 +const ElBtnClass = ref(null); +const DiskStatus = ref(true); //已盘、未盘状态 +const UncountedDetails = ref(); //未盘点明细盘点必须参数 +const contrastData = ref([]); //对比数据表格 +const dialogcontrast = ref(false); //对比数据弹窗 +const contrastloading = ref(false); //对比数据表格加载 +const Inventoryrow = ref({}); //详情编辑响应式临时数据 +const NotCounted = ref(false); //为盘点信息 +const UncheckedRow = ref({}); //未盘点当前行存储数据 +const InventoryStatus = ref(false); //盘点中的状态修改 +const InventoryInput = ref(null); //用来存储盘点状态定制品选怎的第几个input +const InventoryState = ref(false); //盘带状态修改保存的数据 +const TcMInventoryStatus = ref(true); //盘点弹窗按钮权限控制 +const TcStatusModification = ref(false); //表示当前在修改状态 +const TcStateSwitching = ref(false); //默认表示定制品状态 +const TcnumStatu = ref(false); //表示零担,库存品,初始化状态 +const readList = ref([]); //多选框 +const TcReaJoin = ref([]); //零担库存品状态10,20,30... +const TcDataaddition = ref(false); //数据新增弹唱 +const Fromnewlyadded = ref({}); //数据新增 +const screenHeight = ref(0); // 屏幕高度 +const HomepageDelay = ref(null); //首页延期 +const eightyPercentHeight = ref(0); // 80% 高度 +const Statusjudgment = ref(false); //新增按钮 +const DbEx = ref(null); //对比明细导出 +const fullScreen = ref(false); //是否全屏 +const BatchAbandonment = ref([]); //首页废弃 +/** loading */ +const loadingObj = reactive({ + /** 页面loading */ + pageLoading: false, +}); +/** 未盘点query */ +const uncountedQuery = reactive({}); +const radioList = ref([ + { label: 0, txt: '在库', input: 'stockNum', disabled: true }, + { label: 1, txt: '破损', input: 'wornNum', disabled: true }, + { label: 2, txt: '丢失', input: 'lossNum', disabled: true }, + { label: 3, txt: '不可修复', input: 'noRepairNum', disabled: true }, + { label: 4, txt: '已配送', input: 'deliveNum', disabled: true }, + { label: 5, txt: '未入库', input: 'noReceivedNum', disabled: true }, +]); +const counting = ref({}); +const options = [ + { + value: 1, + label: '定制品', + }, + { + value: 2, + label: '零担', + }, + { + value: 3, + label: '库存品', + }, +]; +// 新增物品分类 +const classification = ref([]); +// 菜单表头 +const menuData = ref([ + { + prop: '', + label: '复选框', + type: 0, + values: '', + width: 55, + checkarr: [], + fixed: true, + }, + { + prop: '', + label: '序号', + type: 12, + values: '', + width: 55, + checkarr: [], + fixed: true, + }, + { + prop: 'questNum', + label: '盘点任务编号', + type: 13, + values: '', + width: '250', + checkarr: [], + fixed: false, + sortable: true, + }, + { + prop: 'warehouseName', + label: '仓库名称', + type: 1, + values: '', + width: '130', + checkarr: [], + fixed: false, + sortable: true, + }, + { + prop: 'marketName', + label: '商城名称', + type: 1, + values: '', + width: '150', + checkarr: [], + fixed: false, + sortable: true, + }, + { + prop: 'marketName', + label: '收货单位', + type: 1, + values: '', + width: '200', + checkarr: [], + fixed: false, + sortable: true, + }, + { + prop: 'brandName', + label: '品牌名称', + type: 1, + values: '', + width: '200', + checkarr: [], + fixed: false, + sortable: true, + }, + { + prop: 'startTime', + label: '任务开始时间', + type: 1, + values: '', + width: '150', + checkarr: [], + fixed: false, + sortable: true, + }, + { + prop: 'endTime', + label: '任务结束时间', + type: 1, + values: '', + width: '150', + checkarr: [], + fixed: false, + sortable: true, + }, + { + prop: 'stockNum', + label: '数量', + type: 2, + values: '', + width: '260', + checkarr: [], + fixed: false, + sortable: true, + }, + { + prop: 'questTypeName', + label: '类型', + type: 3, + values: '', + width: '150', + checkarr: [ + { + value: 1, + label: '全部', + }, + { + value: 2, + label: '全仓', + }, + ], + fixed: false, + sortable: true, + }, + { + prop: 'questStatusName', + label: '状态', + type: 3, + values: '', + width: '150', + checkarr: [ + { + value: 0, + label: '创建全部', + }, + { + value: 1, + label: '开始', + }, + { + value: 2, + label: '暂停', + }, + { + value: 3, + label: '结束', + }, + ], + fixed: false, + sortable: true, + }, + { + prop: '', + label: '操作', + type: 6, + values: '', + width: '230', + checkarr: [], + fixed: 'right', + sortable: true, + }, +]); //表头结构 + +// 弹窗盘点 +const InventoryDetails = ref([ + { + prop: 'orderCode', + label: '订单自编号', + type: 5, + values: '', + width: '230', + checkarr: [], + fixed: true, + search: true, + head: true, + }, + { + prop: 'orderPackageCode', + label: '包条', + type: 5, + values: '', + width: '200', + checkarr: [], + fixed: true, + search: true, + head: true, + }, + + { + prop: 'questTarget', + label: '品类', + type: 6, + values: '', + width: '100', + checkarr: [ + { + value: 1, + label: '定制品', + }, + { + value: 2, + label: '零担', + }, + { + value: 3, + label: '库存品', + }, + ], + fixed: false, + search: true, + head: true, + }, + { + prop: 'questStatus', + label: '盘点状态', + type: 1, + values: '', + width: '100', + checkarr: [ + { + value: 0, + label: '待盘点', + }, + { + value: 1, + label: '已盘', + }, + { + value: 2, + label: '未盘点', + }, + { + value: 3, + label: '已排除', + }, + ], + fixed: false, + search: true, + head: true, + }, + { + prop: 'positionCode', + label: '货位', + type: 5, + values: '', + width: '150', + checkarr: [], + fixed: false, + search: true, + head: true, + }, + { + prop: 'materialName', + label: '物料名称', + type: 5, + values: '', + width: '260', + checkarr: [], + fixed: false, + search: true, + head: true, + }, + { + prop: 'stockNum', + label: '数量', + type: 5, + values: '', + width: '260', + checkarr: [], + fixed: false, + search: true, + head: true, + }, + { + prop: 'trayCode', + label: '托盘码', + type: 5, + values: '', + width: '260', + checkarr: [], + fixed: false, + search: true, + head: true, + }, + { + prop: 'trayName', + label: '托盘名称', + type: 5, + values: '', + width: '150', + checkarr: [], + fixed: false, + search: false, + head: true, + }, + { + prop: 'inventoryPerson', + label: '盘点人', + type: 5, + values: '', + width: '150', + checkarr: [], + fixed: false, + search: false, + head: true, + }, + { + prop: 'inventoryDate', + label: '盘点时间', + type: 8, + values: '', + width: '350', + checkarr: [], + fixed: false, + search: false, + head: true, + }, + { + prop: 'firsts', + label: '一级品类', + type: 10, + values: '', + width: '260', + checkarr: [], + fixed: false, + search: true, + head: true, + }, + { + prop: 'second', + label: '二级品类', + type: 10, + values: '', + width: '260', + checkarr: [], + fixed: false, + search: true, + head: true, + }, + { + prop: 'thirdProduct', + label: '三级品类', + type: 10, + values: '', + width: '260', + checkarr: [], + fixed: false, + search: true, + head: true, + }, + + { + prop: 'categoryName', + label: '产品名称', + type: 10, + values: '', + width: '260', + checkarr: [], + fixed: false, + search: true, + head: true, + }, + { + prop: 'materialCode', + label: '物料编码', + type: 10, + values: '', + width: '260', + checkarr: [], + fixed: false, + search: true, + head: true, + }, + { + prop: 'brandName', + label: '品牌', + type: 5, + values: '', + width: '250', + checkarr: [], + fixed: false, + search: true, + head: true, + }, + { + prop: '', + label: '操作', + type: 3, + values: '', + width: '120', + checkarr: [], + fixed: 'right', + search: false, + head: true, + }, +]); +// 对比数据表格结构 +const contrast = ref([ + { + prop: 'orderCode', + label: '订单自编号', + type: 4, + values: '', + width: '260', + checkarr: [], + fixed: true, + search: true, + head: true, + }, + { + prop: 'orderPackageCode', + label: '包条', + type: 5, + values: '', + width: '260', + checkarr: [], + fixed: true, + search: true, + head: true, + }, + { + prop: 'trayCode', + label: '托盘码', + type: 4, + values: '', + width: '150', + checkarr: [], + fixed: false, + search: false, + head: true, + }, + { + prop: 'trayName', + label: '托盘名称', + type: 4, + values: '', + width: '150', + checkarr: [], + fixed: false, + search: false, + head: true, + }, + { + prop: 'brandName', + label: '品牌', + type: 4, + values: '', + width: '250', + checkarr: [], + fixed: false, + search: true, + head: true, + }, + { + prop: 'mallName', + label: '商场名称', + type: 4, + values: '', + width: '250', + checkarr: [], + fixed: false, + search: true, + head: true, + }, + { + prop: 'customerName', + label: '客户名称', + type: 4, + values: '', + width: '150', + checkarr: [], + fixed: false, + search: false, + head: true, + }, + { + prop: 'thirdProduct', + label: '三级品', + type: 4, + values: '', + width: '350', + checkarr: [], + fixed: false, + search: false, + head: true, + }, + { + prop: 'materialName', + label: '物料名称', + type: 4, + values: '', + width: '200', + checkarr: [], + fixed: false, + search: false, + head: true, + }, + { + prop: 'totalNumber', + label: '总件数', + type: 4, + values: '', + width: '150', + checkarr: [], + fixed: false, + search: false, + head: true, + }, + { + prop: 'handQuantity', + label: '在库件数', + type: 4, + values: '', + width: '150', + checkarr: [], + fixed: false, + search: false, + head: true, + }, + { + prop: 'positionCode', + label: '货区-货架-货位', + type: 4, + values: '', + width: '150', + checkarr: [], + fixed: false, + search: false, + head: true, + }, + { + prop: 'inventoryPerson', + label: '盘点人', + type: 4, + values: '', + width: '150', + checkarr: [], + fixed: false, + search: false, + head: true, + }, + { + prop: 'inventoryDate', + label: '盘点时间', + type: 8, + values: '', + width: '350', + checkarr: [], + fixed: false, + search: false, + head: true, + }, + { + prop: 'questNum', + label: '盘点件数', + type: 6, + values: '', + width: '150', + checkarr: [], + fixed: false, + search: false, + head: true, + }, + { + prop: 'differenceNum', + label: '差异数', + type: 4, + values: '', + width: '150', + checkarr: [], + fixed: false, + search: false, + head: true, + }, + + { + prop: 'groundingPositionCode', + label: '新货位', + type: 4, + values: '', + width: '150', + checkarr: [], + fixed: false, + search: false, + head: true, + }, + { + prop: 'questStatusName', + label: '货物状态', + type: 4, + values: '', + width: '150', + checkarr: [], + fixed: false, + search: false, + head: true, + }, +]); +// 按钮配置 +const ElButtonS = ref([ + // 1.link 切换按钮样式(文本模式-false ,按钮模式-tre) + // 2.class 按钮样式名(用于切换按钮样式) + // 3.space 是否开启按钮文子直接间距(true开启 ,false关闭) + // 4.size 按钮尺寸默认小尺寸('large'| 'default'| 'small') + // 5.icon 按钮图标 + // 6.table 按钮名称 + { + link: false, + class: 'el-btn-view', + space: true, + size: 'small', + icon: 'el-icon-view', + table: '详情', + }, + { + link: false, + class: 'el-btn-view', + space: true, + size: 'small', + icon: 'el-icon-view', + table: '延期', + }, + { + link: false, + class: 'el-btn-view', + space: true, + size: 'small', + icon: 'el-icon-view', + table: '编辑', + }, + { + link: false, + class: 'el-btn-view', + space: true, + size: 'small', + icon: 'el-icon-view', + table: '对比数据', + }, +]); + +const details = reactive({ + /** 盘点数据 */ + data: [], + /** 被选中数据 */ + selectionList: [], + query: {}, +}); +// 页面初始化请求 + +const IndexPd = val => { + let Data = { + current: currentPage.value, //页码 + size: pageSize.value, //条数 + ...val, + }; + getTaskQuestPage(Data).then(res => { + console.log(res, '获取盘点列表'); + if (res.data.code == 200) { + total.value = res.data.data.total; + loading.value = false; //关闭表格加载 + res.data.data.records; //初始化盘点列表 + if (res.data.data.records) { + res.data.data.records.forEach(items => { + items.marketName = items.list.map(item => item.refName).join(','); //商场名称 + items.brandName = items.list.map(item => item.brandName).join(','); //品牌名称 + }); + console.log(ElData.value, 'ElData.value'); + } + ElData.value = res.data.data.records; + details.data = res.data.data.records; + } + }); +}; +// 弹窗全屏 +const BtnfullScreen = () => { + fullScreen.value = !fullScreen.value; +}; + +function onLoad() { + // 在组件挂载后获取屏幕高度 + screenHeight.value = window.innerHeight; + // 计算80%的高度 + eightyPercentHeight.value = screenHeight.value * 0.8; + getDictionaryBiz('logpm_unit').then(res => { + //异常类型 + console.log(res, '字典返回值'); + + if (res.data.data.length) { + res.data.data.forEach(item => { + classification.value.push({ + value: item.dictKey, + label: item.dictValue, + }); + }); + } + }); + + // loading.value = true; //开启表格加载 + // IndexPd(); +} +// 调用页面初始化获取数据 +onLoad(); + +async function initTableData(params = {}) { + try { + loading.value = true; // 开启加载 + + let submitData = { + current: currentPage.value, //页码 + size: pageSize.value, //条数 + ...details.query, + }; + const res = await getTaskQuestPage(submitData); + const { code, data } = res.data; + console.log(res, '获取盘点列表'); + if (code !== 200) return; + + total.value = data.total; + data.records; //初始化盘点列表 + if (!data.records) return (details.data = []); + const _typeArr = menuData.value.filter(item => item.type === 3); + + for (let i = 0; i < data.records.length; i++) { + const value = data.records[i]; + + const _marketNameArr = []; + const _brandNameArr = []; + + for (let j = 0; j < value.list.length; j++) { + const item = value.list[j]; + + _marketNameArr.push(item.refName); + _brandNameArr.push(item.brandName); + } + value.marketName = _marketNameArr.join(','); //商场名称 + value.brandName = _brandNameArr.join(','); //品牌名称 + + // 转译码值 + for (let j = 0; j < _typeArr.length; j++) { + const item = _typeArr[j]; + + const _prop = item.prop.replace('Name', ''); + + for (let index = 0; index < item.checkarr.length; index++) { + const val = item.checkarr[index]; + + if (Number(val.value) !== Number(value[_prop])) continue; + value[item.prop] = val.label || '/'; + break; + } + } + } + details.data = data.records; + } catch (error) { + console.log('error :>> ', error); + } finally { + loading.value = false; // 关闭表格加载 + } +} + +initTableData(); + +/** 盘点任务表头输入框 */ +const inputsc = (value, row) => { + console.log('value :>> ', value); + console.log('row :>> ', row); +}; + +/** 复选框勾选变化 */ +const selectionChange = list => { + details.selectionList = list; +}; + +// 首页搜索框 +const InInputSo = (values, val) => { + console.log(values, val); + let data = { + [val.prop]: values, + }; + console.log(data); + IndexPd(data); +}; + +// 搜索框 +const InputSo = val => { + TcPdloading.value = true; + console.log(val, '搜索框接收的值'); + let data = {}; + console.log(row.value, 'row.value'); + data.current = TccurrentPage.value; + data.size = TcpageSize.value; + + let dataS = { + questNum: UncountedDetails.value.questNum, + questId: UncountedDetails.value.id, + current: TccurrentPage.value, //页码 + size: TcpageSize.value, //条数 + [val.prop]: val.values, + }; + if (DiskStatus.value) { + dataS.questStatus = 1; + } else { + dataS.questStatus = 0; + } + console.log(dataS, '要提交的数据'); + $_getDetailInfo(dataS).then(res => { + Tctotal.value = res.data.data.total; + res.data.data.records.forEach(item => { + item.Checkbox = true; + item.wLinputState = false; + item.Input = null; + }); + TcPdloading.value = false; + console.log(res, '明细返回值222'); + TcPD.value = res.data.data.records; + }); + // } +}; +// 点击新增按钮 +const TcAddData = () => { + TcDataaddition.value = true; //新增弹窗显示 +}; +// 对比数据导出公共函数 +const DbExTc = async data => { + try { + loading.value = true; + + const res = await $_exportGetContrastInfo({ + id: data.id, + questNum: data.questNum, + }); + if (res.status !== 200) return; + console.log(res, '导出'); + downloadXls(res.data, `${data.questNum}对比明细.xlsx`); + } catch (error) { + console.log('error :>> ', error); + } finally { + loading.value = false; + } +}; +// 盘点对比导出 +const ExportDC = val => { + // 触发下载函数 + console.log(val); + DbExTc(val); +}; +// 对比数据导出 +const MXexport = () => { + // 触发下载函数 + DbExTc(DbEx.value); +}; + +// 新增任务按钮(搜索不到出现此按钮) +const TcDataadditionsubmit = () => { + console.log(Fromnewlyadded.value); + const validations = [ + { property: 'sku', message: 'SKU为空' }, + { property: 'name', message: '货物名称为空' }, + { property: 'logpmUnit', message: '货物单位为空' }, + { property: 'specification', message: '规格为空' }, + { property: 'packingSpecification', message: '物料编码为空' }, + { property: 'productCode', message: '产品编码为空' }, + { property: 'packageNum', message: '包装数量为空' }, + ]; + + for (const validation of validations) { + if (!Fromnewlyadded.value[validation.property]) { + ElMessage({ + message: validation.message, + type: 'warning', + }); + return; + } + } + TcDataaddition.value = false; //关闭弹窗 + $_submit({ ...Fromnewlyadded.value }).then(res => { + console.log(res, '添加物品返回值'); + if (res.data.code == 200) { + ElMessage({ + message: res.data.msg, + type: 'success', + }); + } + }); + Statusjudgment.value = false; //点击确定之后关闭按钮 +}; + +// 盘点任务单选 +const selectChange = (select, val) => { + HomepageDelay.value = val; //首页延期 + console.log('首页触发了选择'); + BatchAbandonment.value = select; //批量废弃 + console.log(select, val); + PdRow.value = select; +}; +// 表格筛选 +const selectAll = val => { + console.log(val, '触发了选择'); +}; +// 弹窗详情选中(全选) +const TcselectAll = (selectAll, val) => { + Tcrow.value = selectAll; + if (!selectAll.length) { + TcPD.value.forEach(item => { + item.Checkbox = !item.Checkbox; + }); + } else { + selectAll.forEach(item => { + item.Checkbox = !item.Checkbox; + }); + } + console.log(Tcrow.value, '全选复选框'); + // 状态修改 +}; +// 弹窗详情单选 +const TcselectChange = (selectAll, val) => { + console.log(val, '当前选中的'); + console.log(Tcrow.value); + val.Checkbox = !val.Checkbox; //开启修改 + Tcrow.value = selectAll; +}; + +// 批量删除盘点任务 +const BatchDelete = () => {}; + +// 延期提交 +const InventoryDate = async () => { + try { + if (!TcData.value) return ElMessage.warning('请选择延期时间'); + + loadingObj.pageLoading = true; + dialogTabData.value = false; + + const _value = details.selectionList[0]; + + const res = await $_updateDate({ + id: _value.id, + startTime: _value.startTime, + endTime: TcData.value, + }); + + const { code, msg } = res.data; + + if (code !== 200) return; + ElMessage.success(msg); + initTableData(); + } catch (error) { + console.log('error :>> ', error); + } finally { + loadingObj.pageLoading = false; + } +}; + +// 提交修改 +const InventoryModification = () => { + console.log(Tcrow.value, 'Tcrow.value'); + if (!Tcrow.value) { + ElMessage({ + showClose: true, + message: '暂未选择信息', + type: 'warning', + }); + return; + } + let data = []; + Tcrow.value.forEach(item => { + data.push({ + id: item.id, + firsts: item.firsts, + second: item.second, + thirdProduct: item.thirdProduct, + categoryName: item.categoryName, + questId: item.questId, + questNum: row.value.questNum, + name: item.Input, + questStatus: 1, + }); + }); + console.log(data, '要提交的数据'); + $_updateDetailInfo(data).then(res => { + TcViewEvent(row.value); //修改之后刷新页面 + console.log(res, '修改成功之后的返回值'); + if (res.data.code == 200) { + ElMessage({ + showClose: true, + message: res.data.msg, + type: 'success', + }); + } + }); +}; +// 对比数据按钮 +const comparativeData = val => { + dialogcontrast.value = true; //显示对比数据表格 + contrastloading.value = true; //开启表格加载 + console.log(val, '对比数据当前行'); + DbEx.value = val; //存储当前行数据用于导出 + let data = {}; + data.questNum = val.questNum; + data.questId = val.id; + $_getContrastInfo(data).then(res => { + console.log(res, '对比数据返回值'); + contrastData.value = res.data.data; + contrastloading.value = false; //关闭表格加载 + }); +}; +// 重置搜索表单 +const searchReset = () => { + SoInfoData.value = {}; +}; + +const TcViewEvent = (val, Inso) => { + Statusjudgment.value = false; //关闭新增按钮 + TcPdloading.value = true; + console.log(val, '要传递的对象'); + let data = { + questNum: val.questNum, + questId: val.id, + current: TccurrentPage.value, //页码 + size: TcpageSize.value, //条数 + questStatus: 1, + ...Inso, + }; + console.log(data, '要提交的数据'); + + $_getDetailInfo(data).then(res => { + Tctotal.value = res.data.data.total; + res.data.data.records.forEach(item => { + item.Checkbox = true; + item.wLinputState = false; + item.Input = null; + }); + TcPdloading.value = false; + console.log(res, '明细返回值'); + TcPD.value = res.data.data.records; + }); +}; +// 点击详情按钮 +const ViewEvent = val => { + DiskStatus.value = true; //表示当前在已盘点列表 + InventoryDetails.value.forEach(item => { + item.values = null; + }); + InventoryState.value = false; //修改标题(盘点数据) + TccurrentPage.value = 1; //重置页码 + NotCounted.value = false; //关闭未盘点 + row.value = val; + PopupDetails.value = true; + TcPdloading.value = true; + console.log(val, '明细'); + if (val.questStatus != 1) { + TcMInventoryStatus.value = false; //表示当前盘点任务不属于盘点中,关闭所有按钮权限 + } else { + TcMInventoryStatus.value = true; + } + TcViewEvent(row.value); +}; +// 废弃按钮 +const Discard = val => { + console.log(val); + let data = []; + data.push(val.id); + let ids = data.join(','); + console.log(data); + ElMessageBox.confirm('是否废弃该盘点任务?') + .then(() => { + $_postBatchDelete({ ids }).then(res => { + console.log(res, '删除成功'); + if (res.data.code == 200) { + ElMessage({ + message: '删除成功.', + type: 'success', + }); + } + IndexPd(); + }); + }) + .catch(() => { + // catch error + }); +}; +// 未盘点数据请求 +const NotCountedFn = (row, Inso, type = 0) => { + TcPdloading.value = true; + let dataInfo = { + ...Inso, + }; + dataInfo.questStatus = type; + dataInfo.questNum = row.questNum; + dataInfo.questId = row.id; + dataInfo.current = TccurrentPage.value; //页码 + dataInfo.size = TcpageSize.value; //条数 + if (!DiskStatus.value) { + dataInfo.questStatus = 0; + } //表示当前在未盘点列表) + $_getDetailInfo(dataInfo).then(res => { + TcPdloading.value = false; + console.log(res, '未盘点明细返回值'); + res.data.data.records.forEach(item => { + item.Checkbox = true; + item.wLinputState = false; + item.Input = null; + }); + TcPD.value = res.data.data.records; + Tctotal.value = res.data.data.total; //总页码 + }); +}; + +// 未盘点明细 +const DetailsNotCounted = row => { + DiskStatus.value = false; //表示当前在未盘点列表 + InventoryDetails.value.forEach(item => { + item.values = null; + }); + + UncountedDetails.value = row; + row.value = row; + InventoryState.value = true; //修改弹窗标题(未盘点数据), + TcFrom.value = {}; //重置搜索 + TccurrentPage.value = 1; //重置页码 + UncheckedRow.value = row; //存储当前点击行的数据 + console.log(row.value, '存储好的数据'); + NotCounted.value = true; //展开未盘点 + TcPdloading.value = true; + PopupDetails.value = true; + NotCountedFn(row); + + console.log(row.value, '未盘点明细存储值'); +}; + +// 未盘点转已盘点按钮 +const NotInventoried = val => { + if (!Tcrow.value) { + ElMessage({ + showClose: true, + message: '暂未选择信息', + type: 'warning', + }); + return; + } + let data = []; + console.log(UncheckedRow.value, '提交盘点了'); + Tcrow.value.forEach(item => { + data.push({ + id: item.id, + questStatus: (item.questStatus = 1), + questId: item.questId, + questNum: UncheckedRow.value.questNum, + }); + }); + console.log(data, '未盘点处理好的值'); + $_updateDetailInfo(data).then(res => { + console.log(res, '未盘点转为已盘点'); + if (res.data.code == 200) { + ElMessage({ + showClose: true, + message: res.data.msg, + type: 'success', + }); + NotCountedFn(UncheckedRow.value); + } + }); +}; +// 对盘点中的参数,修改状态 +const ModifyingStatus = () => { + if (!Tcrow.value) { + ElMessage({ + showClose: true, + message: '暂未选择信息', + type: 'warning', + }); + return; + } + counting.value = {}; //重置数据值对象 + // 修改过的参数回显 + $_getQuestChildInfo({ + questNum: row.value.questNum, + id: Tcrow.value[0].id, + }).then(res => { + console.log(res, '数量回显'); + if (res.data.data.length) { + res.data.data.forEach((item, index) => { + counting.value[radioList.value[index].input] = item.questNum; + }); + } + }); + + InventoryStatus.value = true; //展开状态选择 + if (Tcrow.value[0].questTarget == 1) { + //表示当前是定制品 + TcStateSwitching.value = false; + } else { + TcStateSwitching.value = true; //表示当前是零担,库存品 + } +}; + +// 删除盘点任务包件(只能删除已盘) +const BatchdeletePackages = () => { + const invalidQuestStatusIndex = Tcrow.value.findIndex(item => item.questStatus !== 1); + if (invalidQuestStatusIndex !== -1) { + // 存在状态不为1的元素 + ElMessage({ + message: '只能删除已盘', + type: 'warning', + }); + return; + } + + const data = { + questDetailIds: Tcrow.value.map(item => item.id), + questId: Tcrow.value[0]?.questId, + questNum: row.value.questNum, + }; + console.log(data, '要删除处理好的数据'); + $_questDetailIds(data).then(res => { + TcViewEvent(row.value); + console.log(res, '删除后的返回值'); + if (res.data.code === 200) { + ElMessage({ + message: res.data.msg, + type: 'success', + }); + } + }); +}; + +// 信息编辑弹窗关闭的时候重置保存的数据 +const closeInformationediting = () => { + Tcrow.value = null; +}; +// 盘点状态选择 +const TcReac = val => { + console.log(val); + InventoryInput.value = val; //存储当前选择的是第几个input + if (!TcStateSwitching.value) { + //定制品规则 可以批量操作 + radioList.value.forEach(item => { + item.disabled = true; + counting.value[item.input] = 0; + }); + radioList.value[val].disabled = false; + counting.value[radioList.value[val].input] = 1; //定制品选中的值默认为1 + } else { + //零担,库存品规则 + if (!TcnumStatu.value) { + radioList.value.forEach(item => { + item.disabled = true; + counting.value[item.input] = 0; + }); + TcnumStatu.value = true; //表示当前零担库存品已经初始化了 + } else { + radioList.value[val].disabled = false; + } + } +}; +// 零担,库存品多选处理 +function updateFlag(ids, contents, newFlag) { + contents.forEach((content, index) => { + if (ids.includes(content.txt)) { + content.disabled = newFlag; + counting.value[content.input] = 1; + } else { + content.disabled = !newFlag; + counting.value[content.input] = 0; + } + }); + console.log(radioList.value); +} +// 状态多选操作 +const Tcmultiple = val => { + updateFlag(val, radioList.value, false); //吧选中的状态设为可以修改 +}; + +// 盘点状态确认修改 +const StatusDetermination = () => { + console.log(row.value, 'row.value'); + if (!TcStateSwitching.value) { + //为假表示当前走定制品规则 + //定制品规则 + let InputMax = counting.value[radioList.value[InventoryInput.value].input]; //存储当前输入框最大值 + if (InputMax > Tcrow.value[0].questTarget) { + ElMessage({ + showClose: true, + message: `总数[${InputMax}]不能超过在库数量[${Tcrow.value[0].questTarget}]`, + type: 'warning', + }); + return; + } + console.log(counting.value, '状态输入框的值'); + let start = Tcrow.value.questTarget; + let data = []; + const filteredData = Tcrow.value.filter(item => item.name == start); // + filteredData.forEach(item => { + console.log(item); + data.push({ + stockNum: counting.value.stockNum, //在库数量 + lossNum: counting.value.lossNum, //丢失数量 + deliveNum: counting.value.deliveNum, //配送数量 + wornNum: counting.value.wornNum, //破损数量 + noRepairNum: counting.value.noRepairNum, //不可修复数量 + noReceivedNum: counting.value.noReceivedNum, //未入库数量 + questNum: row.value.questNum, //任务编号 + questId: item.questId, + allocationId: item.allocationId, //上架后的库位id + id: item.id, + cargoName: Number(InventoryInput.value + 1 + '0'), //状态 + }); + }); + console.log(data, '处理好的数据'); + + $_updateQuestChildInfo(data).then(res => { + console.log(res, '盘点状态修改完成的返回值'); + if (res.data.code == 200) { + ElMessage({ + showClose: true, + message: res.data.msg, + type: 'success', + }); + InventoryStatus.value = false; //关闭状态选择 + TcViewEvent(row.value); + } + }); + } else { + // 零担,库存品规则 + console.log(counting.value, 'input输入框的数据'); + console.log(Tcrow.value, 'questId'); + let data = [ + { + stockNum: counting.value.stockNum, //在库数量 + wornNum: counting.value.wornNum, //破损数量 + lossNum: counting.value.lossNum, //丢失数量 + noRepairNum: counting.value.noRepairNum, //不可修复数量 + deliveNum: counting.value.deliveNum, //配送数量 + noReceivedNum: counting.value.noReceivedNum, //未入库数量 + questNum: row.value.questNum, //任务编号 + questId: Tcrow.value[0].questId, //零担和库存品一次只能操作第一条数据,这里暂取第一个选中的数据,后续的数据无效操作 + allocationId: Tcrow.value[0].allocationId, //上架后的库位id + id: Tcrow.value[0].id, + cargoName: TcReaJoin.value.join(), //状态 + }, + ]; + let sum = + data[0].stockNum + + data[0].wornNum + + data[0].lossNum + + data[0].noRepairNum + + data[0].deliveNum + + data[0].noReceivedNum; + if (sum > Tcrow.value[0].stockNum) { + ElMessage({ + showClose: true, + message: `总数[${sum}]不能超过在库数量[${Tcrow.value[0].stockNum}]`, + type: 'error', + }); + return; + } + console.log(data, '处理好的数据'); + $_updateQuestChildInfo(data).then(res => { + console.log(res, '盘点状态修改完成的返回值'); + if (res.data.code == 200) { + ElMessage({ + showClose: true, + message: res.data.msg, + type: 'success', + }); + InventoryStatus.value = false; //关闭状态选择 + TcViewEvent(row.value); + } + }); + } +}; + +const optionss = ref([]); +const list = ref([]); +const remoteMethod = query => { + if (query !== '') { + optionss.value = list.value.filter(item => { + return item.label.toLowerCase().includes(query.toLowerCase()); + }); + } else { + optionss.value = []; + } +}; +// 多选数据状态处理 +const Tclist = val => { + console.log(val); + if (val >= 1 && val <= 6 && !radioList.value[val - 1].disabled) { + if (!TcReaJoin.value.includes(val * 10)) { + TcReaJoin.value.push(val * 10); + } + } else { + const index = TcReaJoin.value.indexOf(val * 10); + if (index !== -1) { + TcReaJoin.value.splice(index, 1); + } + } + console.log(TcReaJoin.value, '处理好的数据'); +}; +// 物料编码 + +const Wllist = ref([]); +const WLCode = query => { + if (query !== '') { + optionss.value = Wllist.value.filter(item => { + return item.label.toLowerCase().includes(query.toLowerCase()); + }); + } else { + optionss.value = []; + } +}; +// 物料列表 +const Wloptions = ref([]); +// 物料信息搜索 +const wLcheng = (val, info) => { + console.log(val.undefined); + console.log(info, '信息'); + $_materialList({ + name: val.undefined, + }).then(res => { + console.log(res, '物料查询'); + if (!res.data.data.records.length) { + ElMessageBox.confirm('暂无数据是否新增?') + .then(() => { + TcDataaddition.value = true; + }) + .catch(() => { + // catch error + }); + } else { + // productCode + // wLinputState.value=true;//开启下拉选择 + + info.wLinputState = true; + // Wloptions.value 下拉选择变量 + res.data.data.records.forEach(item => { + Wloptions.value.push({ + label: item.name, + value: item.name, + }); + }); + } + }); +}; + +// 盘点详情编辑 +const InventoryEditing = val => { + $_getList({ + current: 1, //页码 + size: 10000, //条数 + warehouseId: val.warehouseId, + }).then(res => { + console.log(res); + + if (res.data.data.records) { + list.value = res.data.data.records.map(item => { + return { value: `${item.id}`, label: `${item.qrCode}` }; + }); + console.log(list.value); + } + }); + + counting.value = {}; //重置数据值对象 + WrapBarEditing.value.radio = null; + readList.value = []; + // 修改过的参数回显 + $_getQuestChildInfo({ + questNum: row.value.questNum, + id: val.id, + }).then(res => { + console.log(res, '数量回显'); + if (res.data.data.length) { + res.data.data.forEach((item, index) => { + counting.value[radioList.value[index].input] = item.questNum; + }); + } + }); + + Tcrow.value = val; + if (val.questTarget == 1) { + TcStateSwitching.value = false; //定制品规则 + } else { + TcStateSwitching.value = true; //库存品,零担规则 + } + PopupEditing.value = true; + Inventoryrow.value = val; //存一份响应式数据 + const copiedObject = Object.assign({}, val); + console.log(val, '盘点详情编辑'); + WrapBarEditing.value.orderPackageCode = copiedObject.orderPackageCode; //包条 + WrapBarEditing.value.orderCode = copiedObject.orderCode; //订单自编号 + WrapBarEditing.value.positionCode = copiedObject.positionCode; //货位 +}; +// 信息编辑弹窗提交 +const InformationEditing = () => { + TcPdloading.value = true; + console.log(WrapBarEditing.value, 'WrapBarEditing.value'); + let data = [ + { + orderCode: WrapBarEditing.value.orderCode, //订单编号 + groundingPositionCode: WrapBarEditing.value.groundingPositionCode, //新的货位 + stockNum: counting.value.stockNum, //在库数量 + lossNum: counting.value.lossNum, //丢失数量 + deliveNum: counting.value.deliveNum, //配送数量 + wornNum: counting.value.wornNum, //破损数量 + noRepairNum: counting.value.noRepairNum, //不可修复数量 + noReceivedNum: counting.value.noReceivedNum, //未入库数量 + allocationId: Tcrow.value.allocationId, //上架后的库位id + questId: Tcrow.value.questId, + questNum: row.value.questNum, //任务编号 + id: Tcrow.value.id, + }, + ]; + if (WrapBarEditing.value.groundingPositionCode) { + let val = list.value.find(obj => obj.value == WrapBarEditing.value.groundingPositionCode); + console.log(data, '货位处理好的数据'); + data[0].groundingAllocationId = val.value; + data[0].groundingPositionCode = val.label; + } + if (!TcStateSwitching.value) { + //为假表示当前走定制品规则 + let InputMax = counting.value[radioList.value[InventoryInput.value].input]; //存储当前输入框最大值 + if (InputMax > Tcrow.value.questTarget) { + ElMessage({ + showClose: true, + message: `总数[${InputMax}]不能超过在库数量[${Tcrow.value.questTarget}]`, + type: 'warning', + }); + return; + } + + console.log(data, '处理好的数据'); + } else { + let sum = + data[0].stockNum + + data[0].wornNum + + data[0].lossNum + + data[0].noRepairNum + + data[0].deliveNum + + data[0].noReceivedNum; + if (sum > Tcrow.value.stockNum) { + ElMessage({ + showClose: true, + message: `总数[${sum}]不能超过在库数量[${Tcrow.value.stockNum}]`, + type: 'error', + }); + return; + } + (data[0].cargoName = TcReaJoin.value.join()), //状态 //状态 + console.log(data, '处理好的数据d'); + } + $_updateQuestChildInfo(data).then(res => { + console.log(res, '盘点状态修改完成的返回值'); + if (res.data.code == 200) { + ElMessage({ + showClose: true, + message: res.data.msg, + type: 'success', + }); + WrapBarEditing.value = {}; //重置提交表单 + InventoryStatus.value = false; //关闭状态选择 + TcViewEvent(row.value); + } + }); + PopupEditing.value = false; //关闭弹窗 + TcFrom.value = {}; //重置搜索对象 +}; + +// 弹窗品类搜索 +const TcChenge = (event, val) => { + // 开始时间 startTime + // 结束时间 endTime + console.log(event, val); + TcPdloading.value = true; + console.log(row.value, '必须参数'); + console.log(UncountedDetails.value.questNum, 'questNum'); + let quest = UncountedDetails.value.questNum; + let qstId = UncountedDetails.value.id; + let data = { + current: TccurrentPage.value, //页码 + size: TcpageSize.value, //条数 + ...TcFrom.value, + questNum: quest, + questId: qstId, + }; + console.log(event, 'event'); + if (event) { + if (event.length == 2) { + //时间 + data.startTime = event[0]; + data.endTime = event[1]; + delete data.inventoryDate; + } + } + console.log(DiskStatus.value, 'DiskStatus.value'); + if (DiskStatus.value) { + data.questStatus = 1; + } else { + data.questStatus = 0; + } + $_getDetailInfo(data).then(res => { + Tctotal.value = res.data.data.total; + res.data.data.records.forEach(item => { + item.Checkbox = true; + item.wLinputState = false; + item.Input = null; + }); + TcPdloading.value = false; + console.log(res, '明细返回值'); + TcPD.value = res.data.data.records; + }); +}; +// 弹窗明细,每一页多少条 +const TcPageSizeChange = val => { + console.log('每一页多少条'); + TcpageSize.value = val; + if (NotCounted.value) { + //表示当前是未盘点翻页 + NotCountedFn(UncheckedRow.value, TcFrom.value); + } else { + console.log(val); + TcViewEvent(row.value, TcFrom.value); + } +}; + +// 弹窗明细,选择了多少页 +const TcSizeChange = val => { + console.log('翻页'); + TccurrentPage.value = val; + if (NotCounted.value) { + //表示当前是未盘点翻页 + + NotCountedFn(UncheckedRow.value, TcFrom.value); + } else { + console.log(val); + TcViewEvent(row.value, TcFrom.value); + } +}; +// 弹窗翻页 +const TcpageList = val => { + console.log(val, '弹窗翻页'); +}; +// 条数 +const SizeChange = val => { + console.log(val, '条数'); + currentPage.value = val; + onLoad(); +}; +// 翻页··························· +const PageSizeChange = val => { + console.log(val, '每页50条'); + pageSize.value = val; + onLoad(); +}; +// 对比数据单选按钮 +const contrastselectChange = (select, val) => { + console.log(select, val, '对比数据1'); +}; +// 对比数据全选按钮 +const contrastselectAll = (select, val) => { + console.log(select, val, '对比数据2'); +}; + +// 关闭弹窗关闭回调 +const handleClose = () => { + PopupDetails.value = false; +}; +// 刷新页面按钮(初始化页面参数) +const Refresh = () => { + onLoad(); //初始化表格数据 +}; + +// 获取盘点列表 +// 搜索盘点任务 +// const searchChange=()=>{ +// console.log('触发搜索'); +// $_getDetailInfo({...SoInfoData.value}).then(res=>{ +// console.log(res,'搜索框的值'); +// }) +// } + +// 创建盘点任务 +const InventoryTask = () => { + formInventory.value = {}; + formInventory.value.scname = []; + let select = []; + InventoryPopup.value = true; //开启创建盘点任务弹窗 + getDictList().then(res => { + console.log('创建盘点返回值', res); + if (res.data.code == 200) { + res.data.data.forEach(item => { + console.log(item, '盘点任务返回值'); + select.push({ + clientName: item.clientName, // 商城名称 + id: item.id, // 商场id + brandName: item.brandName, // 商场下品牌名 + }); + }); + formInventory.value.select = select; + console.log(formInventory.value, '处理好的商场名称'); + } + }); +}; + +// 处理商场名称函数根据传入ID读取列表中的商场 +function matchInfoById(idArray, infoArray) { + const matchedInfo = []; + idArray.forEach(id => { + const matchedItem = infoArray.find(item => item.id === id); + if (matchedItem) { + matchedInfo.push(matchedItem); + } + }); + return matchedInfo; +} + +// 商场名称选择回调 +const formInventoryChange = val => { + console.log('选择了商场名称'); + formInventory.value.id = val; + const matchedInfo = matchInfoById(val, formInventory.value.select); + console.log(matchedInfo, '处理好的参数'); + formInventory.value.brandName; + let name = []; + matchedInfo.forEach(item => { + name.push(item.brandName); + }); + formInventory.value.brandName = name.join(','); //处理品牌名称显示 +}; + +// 创建盘点任务弹窗关闭回调 +const InventoryPopupClose = () => { + console.log('创建盘点任务关闭弹窗回调'); +}; +// 盘点提交 +const InventorySubmit = async () => { + try { + loadingObj.pageLoading = true; + + if (!formInventory.value.time) { + ElMessage({ + message: '请选择盘点任务时间', + type: 'warning', + }); + return; + } + console.log(formInventory.value, '盘点选择好的参数'); + // 创建提交表单 + let SubData = {}; + SubData.list = []; + console.log(formInventory.value.scname, 'formInventory.value.scname.length'); + if (!formInventory.value.scname.length && !formInventory.value.brandName) { + // + SubData.list = []; + // 结束时间 + SubData.endTime = formInventory.value.time[1]; + // 开始时间 + SubData.startTime = formInventory.value.time[0]; + InventoryPopup.value = false; //关闭创建盘点任务弹窗 + console.log(SubData, '处理好的数据'); + const res = await postAddtaskQuest(SubData); + if (res.data.code !== 200) return; + + ElMessage.success(res.data.msg); + initTableData(); //体积之后初始化页面 + + console.log(res, '盘点计划提交成功'); + + return; + } + + // 处理商场名称和商场ID + const matchedInfo = matchInfoById(formInventory.value.id, formInventory.value.select); + console.log(matchedInfo, 'matchedInfo'); + console.log(matchedInfo, 'matchedInfo提交处理数据'); + if (matchedInfo) { + matchedInfo.forEach(item => { + SubData.list.push({ + refId: item.id, + refName: item.clientName, + }); + }); + } + + // 结束时间 + SubData.endTime = formInventory.value.time[1]; + // 开始时间 + SubData.startTime = formInventory.value.time[0]; + console.log(SubData, '处理好要提交的数据'); + InventoryPopup.value = false; //关闭创建盘点任务弹窗 + const res = await postAddtaskQuest(SubData); + if (res.data.code !== 200) return; + + ElMessage.success(res.data.msg); + initTableData(); //体积之后初始化页面 + } catch (error) { + console.log('error :>> ', error); + } finally { + loadingObj.pageLoading = false; + } +}; +// 顶部废弃按钮 +const discard = () => { + if (details.selectionList.length === 0) return ElMessage.warning('请选择需要废弃的盘点任务'); + + const ids = details.selectionList.map(val => val.id).join(','); + ElMessageBox.confirm('是否废弃该盘点任务?') + .then(async () => { + try { + loadingObj.pageLoading = true; + + const res = await $_postBatchDelete({ ids }); + const { code, msg } = res.data; + if (code !== 200) return; + ElMessage.success(msg || '废弃成功'); + + initTableData(); + } catch (error) { + console.log('error :>> ', error); + } finally { + loadingObj.pageLoading = false; + } + }) + .catch(() => { + // catch error + }); +}; + +// 顶部延期(延期只能单个延期) +const DelayButton = () => { + console.log('延期'); + const _length = details.selectionList.length; + if (_length === 0) return ElMessage.warning('请选择需要延期的数据(单选操作)'); + else if (_length > 1) return ElMessage.warning('暂不支持批量操作'); + TcData.value = details.selectionList[0].endTime; + dialogTabData.value = true; +}; + +/** 未盘点数据导出 */ +const handleUncountedExport = () => { + ElMessageBox.confirm('是否导出未盘点数据?').then(async () => { + try { + TcPdloading.value = true; + const res = await postExportContrastStockInfo({ questNum: UncountedDetails.value.questNum }); + if (res.status !== 200) return; + + downloadXls(res.data, '未盘点数据.xlsx'); + } catch (error) { + console.log('error :>> ', error); + } finally { + TcPdloading.value = false; + } + }); +}; +</script> + +<style lang="scss" scoped> +.maxContent { + width: 100%; + box-sizing: border-box; + height: 100%; + display: flex; + flex-direction: column; +} + +.SoInput { + display: flex; + justify-content: space-between; + padding: 0 10px; + margin-top: 10px; + + form { + display: flex; + flex-wrap: wrap; + margin-top: 5px; + + :deep(.el-form-item) { + margin-bottom: 0; + } + } + + .SoBtn { + display: flex; + align-items: center; + justify-content: center; + } +} + +.avue-crud__right { + margin-top: 5px; + display: flex; + justify-content: space-between; + margin-bottom: 5px; + padding: 0 10px; +} + +.demo-pagination-block { + flex: 1; + display: flex; + align-items: flex-end; + margin-bottom: 8px; + justify-content: flex-end; + margin-right: 6px; +} + +.demo-pagination-blockPD { + justify-content: space-between; +} + +:deep(.el-table-column--selection) { + text-align: center; +} + +:deep(.el-dialog__footer) { + display: flex; +} + +:deep(.el-dialog__body) { + padding-top: 0; +} + +:deep(.el-dialog) { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + margin-top: 0; +} + +.Tcstdialog-footer { + display: flex; + justify-content: flex-end; + margin-top: 80px; +} + +.Tcstate { + display: flex; + margin-bottom: 20px; + + .el-radio { + width: 54px; + } +} + +.TcstateS { + margin: 0 2%; + margin-bottom: 30px; + + label { + width: 80px; + } +} + +.tcradiogroup { + display: inline-flex; + align-items: flex-start; + font-size: 0; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; +} + +.el-checkbox-group { + display: flex; + flex-wrap: wrap; + justify-content: space-between; +} + +.el-input__inner { + text-align: center; +} + +.dbExPo { + display: flex; + justify-content: flex-end; + margin-bottom: 10px; +} +.el-exDc { + margin-left: 20px; + color: #10d070; + cursor: pointer; +} +:deep(.el-dialog) { + display: flex; + flex-direction: column; + justify-content: flex-start; + .el-dialog__footer { + flex: 1; + } + .dialog-footer { + display: flex; + align-items: flex-end; + } +} +.fullScreen { + display: flex; + margin-left: auto; + align-items: center; + justify-content: center; + i { + width: 20px; + height: 20px; + svg { + height: 100%; + width: 100%; + } + } +} +:deep(.el-input__wrapper) { + height: 30px; +} +:deep(.el-input__inner) { + height: 100% !important; +} +.pdsj { + :deep(.el-input__wrapper) { + height: 30px !important; + } +} +.ElBtnClass { + .el-button { + padding: 0; + border: none; + background-color: transparent; + } +} + +.w100 { + width: 100% !important; +} +</style> diff --git a/src/views/distribution/deliverylist/distributionDeliveryListedt.vue b/src/views/distribution/deliverylist/distributionDeliveryListedt.vue index f9488ead..8454a660 100644 --- a/src/views/distribution/deliverylist/distributionDeliveryListedt.vue +++ b/src/views/distribution/deliverylist/distributionDeliveryListedt.vue @@ -4339,9 +4339,8 @@ export default { this.getReservationInventoryPackageListInfo(this.page); } }) - .catch(res => { - - }).finally(()=>{ + .catch(res => {}) + .finally(() => { this.loading = false; }); }) @@ -4467,40 +4466,27 @@ export default { // 零担批量计划取消 LdBatchcancellation() { return; - if (!this.selectionList.length) { - ElMessage({ - message: '请勾选需要计划取消的数据', - type: 'warning', - }); - return; - } - this.$confirm('是否进行批量计划取消?') - .then(() => { - this.loading = true; //开启加载 - if (res.data.code == 200) { - this.truckload(this.page); - } - }) - .catch(() => {}); }, -// 客户包件批量取消 -PackBatchcancellation(){ - if (!this.selectionList.length) { + // 客户包件批量取消 + PackBatchcancellation() { + if (!this.selectionList.length) { ElMessage({ message: '请勾选需要计划取消的数据', type: 'warning', }); return; } - let result = this.selectionList.every(item => item.orderPackageStatus == !70 || item.orderPackageLoadingStatus !=20); - console.log(result,'result'); - if(!result){ + let result = this.selectionList.every( + item => item.orderPackageStatus == !70 || item.orderPackageLoadingStatus != 20 + ); + console.log(result, 'result'); + if (!result) { ElMessage({ message: '有已经存在签收的订单或已装车,不满足批量签收条件', type: 'warning', }); - return + return; } this.$confirm('是否进行批量计划取消?') .then(() => { @@ -4521,15 +4507,13 @@ PackBatchcancellation(){ this.selectionList = []; //清空选择 this.loading = false; }) - .catch(res => { - - }).finally(()=>{ + .catch(res => {}) + .finally(() => { this.loading = false; }); }) .catch(() => {}); -}, - + }, // 批量签收 Batchsigning() { @@ -4565,13 +4549,15 @@ PackBatchcancellation(){ }); return; } - let result = this.selectionList.every(item => item.stockSignfoStatus == 10 && item.stockLockingStatus==10); - if(!result){ + let result = this.selectionList.every( + item => item.stockSignfoStatus == 10 && item.stockLockingStatus == 10 + ); + if (!result) { ElMessage({ message: '有已经存在签收的订单,不满足批量签收条件', type: 'warning', }); - return + return; } this.$confirm('是否进行批量计划取消?') .then(() => { @@ -4598,10 +4584,6 @@ PackBatchcancellation(){ }); }) .catch(() => {}); - - - - }, /**printTemplate * 打印 @@ -5355,7 +5337,7 @@ PackBatchcancellation(){ this.deliverydata = data; // this.deliverydata.outboundDate = data.stockupInfo.outboundDate; - if (data.stockupInfo.forkliftName) { + if (data.stockupInfo && data.stockupInfo.forkliftName) { this.deliverydata.forkliftName = data.stockupInfo.forkliftName; } @@ -5464,9 +5446,9 @@ PackBatchcancellation(){ height: 500px !important; } } -:deep(.el-upload-dragger){ +:deep(.el-upload-dragger) { display: flex; - align-items: center; - justify-content: center; + align-items: center; + justify-content: center; } </style> diff --git a/src/views/wel/index.vue b/src/views/wel/index.vue index 3be044ab..80394da6 100644 --- a/src/views/wel/index.vue +++ b/src/views/wel/index.vue @@ -134,53 +134,49 @@ <div class="info"> <div class="name">{{ name }}</div> <div class="slogan">您好!欢迎使用货无忧</div> - <div class="title"> 成都数联物科信息技术有限公司</div> - <div class="time">{{currentTime}}</div> - - + <div class="title">成都数联物科信息技术有限公司</div> + <div class="time">{{ currentTime }}</div> </div> </div> </div> </template> <script setup> -import { ref ,onMounted } from 'vue'; +import { ref, onMounted } from 'vue'; const indexState = ref(false); const currentTime = ref('0000年00月00日00时00分00秒'); const name = ref(''); name.value = JSON.parse(localStorage.getItem('TWMS-userInfo')).content.real_name; - setInterval(() => { - const now = new Date(); - const year = now.getFullYear(); - const month = String(now.getMonth() + 1).padStart(2, '0'); - const day = String(now.getDate()).padStart(2, '0'); - const hours = String(now.getHours()).padStart(2, '0'); - const minutes = String(now.getMinutes()).padStart(2, '0'); - const seconds = String(now.getSeconds()).padStart(2, '0'); - currentTime.value = `${year}年${month}月${day}日${hours}时${minutes}分${seconds}秒`; - }, 1000); - +setInterval(() => { + const now = new Date(); + const year = now.getFullYear(); + const month = String(now.getMonth() + 1).padStart(2, '0'); + const day = String(now.getDate()).padStart(2, '0'); + const hours = String(now.getHours()).padStart(2, '0'); + const minutes = String(now.getMinutes()).padStart(2, '0'); + const seconds = String(now.getSeconds()).padStart(2, '0'); + currentTime.value = `${year}年${month}月${day}日${hours}时${minutes}分${seconds}秒`; +}, 1000); </script> <style scoped lang="scss"> - .info { display: flex; display: flex; flex-direction: column; justify-content: center; - .name{ + .name { font-size: 40px; color: #d3832a; font-weight: bold; } - .slogan{ + .slogan { font-size: 3em; } - .time{ + .time { display: flex; margin-top: 10px; justify-content: flex-end; } - .title{ + .title { display: flex; margin-top: 10px; justify-content: flex-end; @@ -190,8 +186,8 @@ name.value = JSON.parse(localStorage.getItem('TWMS-userInfo')).content.real_name width: 100%; height: 100%; display: flex; - align-items: center; - justify-content: center; + align-items: center; + justify-content: center; span { color: #d3832a; } @@ -226,345 +222,6 @@ name.value = JSON.parse(localStorage.getItem('TWMS-userInfo')).content.real_name <style lang="scss" scope> @import '../../styles/flowStyle.scss'; -// .bx { -// position: relative; -// .ztjk { -// display: flex; -// flex-direction: column; -// align-items: center; -// position: absolute; -// font-size: 14px; -// font-size: #747474; -// top: 235px; -// left: 680px; -// > img { -// width: 62px; -// height: 62px; -// } -// } -// .left { -// width: 640px !important; -// height: 500px; -// background: #ffffff; -// box-shadow: 0px 0px 16px 0px rgba(211, 131, 42, 0.1); -// border-radius: 32px; -// opacity: 1; -// box-sizing: border-box; -// position: absolute; -// left: 20px; -// top: 10px; -// padding: 30px 44px; -// .tptitl { -// display: flex; -// align-items: center; -// > img { -// width: 32px; -// height: 22px; -// margin-right: 8px; -// } -// } -// .onebx1 { -// width: 100%; -// height: 100%; -// position: relative; -// margin-top: 30px; -// > div { -// display: flex; -// flex-direction: column; -// align-items: center; -// position: absolute; -// font-size: 14px; -// font-size: #747474; -// > img { -// width: 62px; -// height: 62px; -// } -// } -// .item1 { -// top: 10px; -// left: 0px; -// } -// .item2 { -// top: 140px; -// left: 0px; -// } -// .item3 { -// top: 10px; -// left: 140px; -// } -// .item4 { -// top: 140px; -// left: 140px; -// } -// .item5 { -// top: 270px; -// left: 140px; -// } -// .item6 { -// top: 10px; -// left: 330px; -// } -// .item7 { -// top: 140px; -// left: 330px; -// } -// .item8 { -// top: 140px; -// left: 450px; -// } -// .upimg { -// width: 15px; -// height: 40px; -// position: absolute; -// left: 355px; -// top: 100px; -// } -// .rigth1 { -// width: 40px; -// height: 15px; -// position: absolute; -// left: 80px; -// top: 40px; -// } -// .rigth2 { -// width: 40px; -// height: 15px; -// position: absolute; -// left: 80px; -// top: 180px; -// } -// .rigth3 { -// width: 40px; -// height: 15px; -// position: absolute; -// left: 400px; -// top: 180px; -// } -// .rigth4 { -// width: 40px; -// height: 15px; -// position: absolute; -// left: 530px; -// top: 180px; -// } -// .rigthall { -// width: 40px; -// height: 270px; -// position: absolute; -// left: 250px; -// top: 50px; -// } -// } -// } -// .rigth { -// width: 640px; -// height: 500px; -// background: #ffffff; -// box-shadow: 0px 0px 16px 0px rgba(58, 216, 188, 0.102); -// border-radius: 32px; -// opacity: 1; -// box-sizing: border-box; -// position: absolute; -// left: 760px; -// top: 10px; -// padding: 30px 44px; -// .tptitl { -// display: flex; -// align-items: center; -// > img { -// width: 32px; -// height: 22px; -// margin-right: 8px; -// } -// } -// .onebx1 { -// width: 100%; -// height: 100%; -// position: relative; -// margin-top: 30px; -// > div { -// display: flex; -// flex-direction: column; -// align-items: center; -// position: absolute; -// font-size: 14px; -// font-size: #747474; -// > img { -// width: 62px; -// height: 62px; -// } -// } -// .item1 { -// top: 140px; -// left: 50px; -// } -// .item2 { -// top: 140px; -// left: 170px; -// } -// .item3 { -// top: 270px; -// left: 170px; -// } -// .item4 { -// top: 10px; -// left: 300px; -// } -// .item5 { -// top: 140px; -// left: 300px; -// } -// .item6 { -// top: 10px; -// left: 430px; -// } -// .item7 { -// top: 140px; -// left: 430px; -// } -// .item8 { -// top: 270px; -// left: 430px; -// } -// .upimg { -// width: 15px; -// height: 40px; -// position: absolute; -// left: 190px; -// top: 230px; -// } -// .rigth1 { -// width: 40px; -// height: 15px; -// position: absolute; -// left: 0px; -// top: 180px; -// } -// .rigth2 { -// width: 40px; -// height: 15px; -// position: absolute; -// left: 120px; -// top: 180px; -// } -// .rigth3 { -// width: 40px; -// height: 15px; -// position: absolute; -// left: 375px; -// top: 180px; -// } -// .rigth4 { -// width: 40px; -// height: 15px; -// position: absolute; -// left: 375px; -// top: 50px; -// } -// .leftall { -// width: 182px; -// height: 540px; -// position: absolute; -// left: 350px; -// top: 50px; -// z-index: 99; -// } -// .rigthall { -// width: 165px; -// height: 270px; -// position: absolute; -// left: 250px; -// top: 50px; -// } -// } -// } -// .buts { -// width: 1380px; -// height: 234px; -// background: #ffffff; -// box-shadow: 0 0 16px 0 rgba(0, 134, 241, 0.102); -// border-radius: 32px; -// opacity: 1; -// position: absolute; -// box-sizing: border-box; -// left: 20px; -// top: 540px; -// padding: 30px 44px; -// .tptitl { -// display: flex; -// align-items: center; -// > img { -// width: 32px; -// height: 22px; -// margin-right: 8px; -// } -// } -// .onebx1{ -// width: 100%; -// height: 100%; -// position: relative; -// margin-top: 30px; -// > div { -// display: flex; -// flex-direction: column; -// align-items: center; -// position: absolute; -// font-size: 14px; -// font-size: #747474; -// > img { -// width: 62px; -// height: 62px; -// } -// } -// .item1{ -// left: 1000px; -// top:10px; -// } -// .item2{ -// left: 800px; -// top:10px; -// } -// .item3{ -// left: 600px; -// top:10px; -// } -// .item4{ -// left: 400px; -// top:10px; -// } -// .left1{ -// width: 60px; -// height: 15px; -// position: absolute; -// left: 900px; -// top: 50px; -// transform: rotate(180deg); -// } -// .left2{ -// width: 60px; -// height: 15px; -// position: absolute; -// left: 700px; -// top: 50px; -// transform: rotate(180deg); -// } -// .left3{ -// width: 60px; -// height: 15px; -// position: absolute; -// left: 500px; -// top: 50px; -// transform: rotate(180deg); -// } -// } -// } -// } -// .tptitl{ -// color: #172E60; -// } -// .bx{ -// user-select: none; -// } #avue-view { background-color: #fff; } diff --git a/src/views/wel/index2.vue b/src/views/wel/index2.vue new file mode 100644 index 00000000..ea5f332a --- /dev/null +++ b/src/views/wel/index2.vue @@ -0,0 +1,369 @@ +<template> + <div class="bx" v-if="indexState"> + <div class="left"> + <div class="tptitl"> + <img src="./static/topicon.png" /> + <span>发货操作</span> + </div> + <div class="onebx1"> + <div class="item1"> + <img src="./static/1.png" /> + <span>提货</span> + </div> + <div class="item2"> + <img src="./static/2.png" /> + <span>预开单</span> + </div> + <div class="item3"> + <img src="./static/3.png" /> + <span>创建运单</span> + </div> + <div class="item4"> + <img src="./static/4.png" /> + <span>补录运单</span> + </div> + <div class="item5"> + <img src="./static/5.png" /> + <span>短驳发车</span> + </div> + <div class="item6"> + <img src="./static/6.png" /> + <span>外部中转</span> + </div> + <div class="item7"> + <img src="./static/7.png" /> + <span>库存管理</span> + </div> + <div class="item8"> + <img src="./static/8.png" /> + <span>车辆配载</span> + </div> + <img class="upimg" src="./static/up.png" /> + <img class="rigth1" src="./static/rigth.png" /> + <img class="rigth2" src="./static/rigth.png" /> + <img class="rigth3" src="./static/rigth.png" /> + <img class="rigth4" src="./static/rigth.png" /> + <img class="rigthall" src="./static/rigthall.png" /> + </div> + </div> + <div class="ztjk"> + <img src="./static/9.png" /> + <span>到货操作</span> + </div> + <div class="rigth"> + <div class="tptitl"> + <img src="./static/topicon.png" /> + <span>到货操作</span> + </div> + <div class="onebx1"> + <div class="item1"> + <img src="./static/10.png" /> + <span>到站卸车</span> + </div> + <div class="item2"> + <img src="./static/11.png" /> + <span>库存管理</span> + </div> + <div class="item3"> + <img src="./static/12.png" /> + <span>短驳接收</span> + </div> + <div class="item4"> + <img src="./static/13.png" /> + <span>外部中转</span> + </div> + <div class="item5"> + <img src="./static/14.png" /> + <span>送货</span> + </div> + <div class="item6"> + <img src="./static/15.png" /> + <span>中转签收</span> + </div> + <div class="item7"> + <img src="./static/16.png" /> + <span>送货签收</span> + </div> + <div class="item8"> + <img src="./static/17.png" /> + <span>自提签收</span> + </div> + <img class="upimg" src="./static/down.png" /> + <img class="rigth1" src="./static/rigth.png" /> + <img class="rigth2" src="./static/rigth.png" /> + <img class="rigth3" src="./static/rigth.png" /> + <img class="rigth4" src="./static/rigth.png" /> + <img class="rigthall" src="./static/rigthall2.png" /> + <img class="leftall" src="./static/leftall.png" /> + </div> + </div> + <div class="buts"> + <div class="tptitl"> + <img src="./static/topicon.png" /> + <span>回单管理</span> + </div> + <div class="onebx1"> + <div class="item1"> + <img src="./static/18.png" /> + <span>回单回收</span> + </div> + <div class="item2"> + <img src="./static/19.png" /> + <span>回单寄出</span> + </div> + <div class="item3"> + <img src="./static/20.png" /> + <span>回单接收</span> + </div> + <div class="item4"> + <img src="./static/21.png" /> + <span>回单发放</span> + </div> + <img class="left1" src="./static/rigth.png" /> + <img class="left2" src="./static/rigth.png" /> + <img class="left3" src="./static/rigth.png" /> + </div> + </div> + <div class="el-gl"> + <div>公告栏</div> + </div> + </div> + + <div class="main_container"> + <!-- 开单数据 && 开单收入 --> + <div class="flex mb5pt row_first"> + <!-- 开单数据 --> + <div class="mr5pt box1 view_box"> + <!-- 标题 --> + <div class="align_center mb10pt"> + <img class="mr5pt img_13pt" src="@/static/icon_data.png" alt="" /> + + <div class="title">开单数据</div> + </div> + + <!-- 数据 --> + <div class="border padding5pt"> + <div class="height40pt flex-c-sb border-bottom"> + <div class="align_center"> + <img class="mr5pt img_16pt" src="@/static/icon_storage.png" alt="" /> + + <div>总计</div> + </div> + + <div class="align_center"> + <span class="data mr5pt">123</span> + <span>件</span> + </div> + </div> + + <div class="height40pt flex-c-sb border-bottom"> + <div class="align_center"> + <img class="mr5pt img_16pt" src="@/static/icon_month.png" alt="" /> + + <div>当月</div> + </div> + + <div class="align_center"> + <span class="data mr5pt">123</span> + <span>件</span> + </div> + </div> + + <div class="height40pt flex-c-sb"> + <div class="align_center"> + <img class="mr5pt img_16pt" src="@/static/icon_day.png" alt="" /> + + <div>当日</div> + </div> + + <div class="align_center"> + <span class="data mr5pt">123</span> + <span>件</span> + </div> + </div> + </div> + </div> + + <!-- 开单收入 --> + <div class="flex1 box2 view_box"> + <!-- 标题 --> + <div class="align_center mb10pt"> + <img class="mr5pt img_13pt" src="@/static/icon_money.png" alt="" /> + + <div class="title">开单收入</div> + </div> + + <div class="border padding5pt"> + <div class="height40pt flex-c-sb border-bottom"> + <div class="align_center"> + <img class="mr5pt img_16pt" src="@/static/icon_storage.png" alt="" /> + + <div>总计</div> + </div> + + <div class="align_center"> + <span class="data mr5pt">123</span> + <span>件</span> + </div> + </div> + + <div class="height40pt flex-c-sb border-bottom"> + <div class="align_center"> + <img class="mr5pt img_16pt" src="@/static/icon_month.png" alt="" /> + + <div>当月</div> + </div> + + <div class="align_center"> + <span class="data mr5pt">123</span> + <span>件</span> + </div> + </div> + </div> + </div> + </div> + </div> +</template> +<script setup> +import { ref, onMounted } from 'vue'; +const indexState = ref(false); +</script> + +<style scoped lang="scss"> +.info { + display: flex; + display: flex; + flex-direction: column; + justify-content: center; + .name { + font-size: 40px; + color: #d3832a; + font-weight: bold; + } + .slogan { + font-size: 3em; + } + .time { + display: flex; + margin-top: 10px; + justify-content: flex-end; + } + .title { + display: flex; + margin-top: 10px; + justify-content: flex-end; + } +} + +.el-gl { + font-weight: 500; + text-align: center; + position: absolute; + right: 10px; + top: 10px; + width: 15%; + background-color: #fff; + border-radius: 32px; + padding: 5px; + box-sizing: border-box; + border: 1px solid #f1eeee69; + box-shadow: 4px 6px 0 #d3dff6, 1px 1px 9px #d3dff6; + height: 762px; +} + +.main_container { + background: #f5f5f6; + padding: 0 5pt; +} + +.view_box { + padding: 10pt; + padding-top: 8pt; + background: #fff; + border-radius: 2.5pt; + + .title { + font-weight: bold; + font-size: 12pt; + line-height: 12pt; + } + + .img_10pt { + width: 12pt; + height: 12pt; + } + + .img_16pt { + width: 16pt; + height: 16pt; + } +} + +.mb10pt { + margin-bottom: 10pt; +} + +.mb5pt { + margin-bottom: 5pt; +} + +.mr5pt { + margin-right: 5pt; +} + +.padding5pt { + padding: 0 5pt; +} + +.align_center { + display: flex; + align-items: center; +} + +// 开单数据 +.height40pt { + height: 40pt; + + font-size: 12pt; +} + +// 数据样式 +.data { + font-weight: bold; + color: #000; + font-family: DIN-Bold; + font-size: 15pt; +} + +.border { + border: 1pt solid #f5f5f6; + border-radius: 2.5pt; + box-sizing: border-box; +} + +.border-bottom { + border-bottom: 1pt solid #f5f5f6; +} + +// 第一排 +.row_first { + height: 160pt; + .box1 { + height: 100%; + width: 170pt; + box-sizing: border-box; + flex: none; + } + + .box2 { + height: 100%; + } +} +</style> +<style lang="scss" scope> +@import '../../styles/flowStyle.scss'; + +#avue-view { + background-color: #fff; +} +</style>