123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742 |
- <template>
- <el-card class="box-card">
- <byTable
- :source="sourceList.data"
- :pagination="sourceList.pagination"
- :config="config"
- :loading="loading"
- :searchConfig="searchConfig"
- highlight-current-row
- :defaultExpandAll="true"
- :table-events="{
- select: selectRow,
- 'select-all': selectRow,
- }"
- :action-list="[
- {
- text: '拆分包裹',
- action: () => clickUnpack(),
- },
- {
- text: '合并订单',
- action: () => clickMerge(),
- },
- {
- text: '取消合并',
- action: () => clickUnMerge(),
- },
- {
- text: '修改收件信息',
- action: () => clickModifyInformation(),
- },
- {
- text: '修改快递',
- action: () => clickModifiedExpress(),
- },
- {
- text: '打印快递单',
- action: () => clickPrint(),
- type: 'warning',
- },
- {
- text: '填写线下快递单号',
- action: () => clickFillInExpressCode(),
- },
- ]"
- @get-list="getList"
- @clickReset="clickReset">
- <template #typeExpand="{ item }">
- <div class="remark" v-html="item.remark"></div>
- </template>
- <template #code="{ item }">
- <div>
- <a style="color: #409eff; cursor: pointer; word-break: break-all" @click="clickCode(item)">{{ item.code }}</a>
- </div>
- </template>
- <template #groupOrderCodeList="{ item }">
- <div>
- <div v-if="item.groupOrderCodeList && item.groupOrderCodeList.length > 0">{{ item.groupOrderCodeList.join(",") }}</div>
- </div>
- </template>
- <template #total="{ item }">
- <div>
- <a style="color: #409eff; cursor: pointer; word-break: break-all" @click="clickTotal(item)">{{ item.total }}</a>
- </div>
- </template>
- <template #address="{ item }">
- <div>{{ item.province }},{{ item.city }},{{ item.county }},{{ item.detailedAddress }}</div>
- </template>
- </byTable>
- <el-dialog title="包裹规格数据" v-if="openTotal" v-model="openTotal" width="90%">
- <PackTotal :rowData="rowData" @clickCancel="clickCancel"></PackTotal>
- </el-dialog>
- <el-dialog title="包裹图片" v-if="openPackagePicture" v-model="openPackagePicture" width="70%">
- <div v-loading="loadingPackagePicture">
- <el-upload
- v-model:file-list="fileList"
- action="https://winfaster.obs.cn-south-1.myhuaweicloud.com"
- list-type="picture-card"
- multiple
- :data="uploadData"
- :before-upload="beforeUpload"
- :on-preview="onPreview">
- <el-icon><Plus /></el-icon>
- </el-upload>
- </div>
- <template #footer>
- <el-button @click="openPackagePicture = false" size="large">取 消</el-button>
- <el-button type="primary" @click="submitPicture()" size="large" v-preReClick>提 交</el-button>
- </template>
- </el-dialog>
- <el-dialog title="合并订单" v-if="openMerge" v-model="openMerge" width="500">
- <el-form :model="formMerge.data" :rules="rulesMerge" label-width="100px" ref="refMerge">
- <el-form-item label="主订单号" prop="id">
- <el-select v-model="formMerge.data.id" placeholder="请选择" style="width: 100%">
- <el-option v-for="item in selectData" :key="item.id" :label="item.code" :value="item.id"> </el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="合并订单号" prop="mergeIdList">
- <el-select v-model="formMerge.data.mergeIdList" placeholder="请选择" style="width: 100%" multiple :disabled="!formMerge.data.id">
- <el-option v-for="item in selectData.filter((item) => item.id !== formMerge.data.id)" :key="item.id" :label="item.code" :value="item.id" />
- </el-select>
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="openMerge = false" size="large">取 消</el-button>
- <el-button type="primary" @click="submitMerge()" size="large" v-preReClick>提 交</el-button>
- </template>
- </el-dialog>
- <el-dialog title="修改收件信息" v-if="openInformation" v-model="openInformation" width="600">
- <el-form :model="formInformation.data" :rules="rulesInformation" label-width="120px" ref="refInformation">
- <el-form-item label="省" prop="province">
- <el-input v-model="formInformation.data.province" placeholder="请输入省" />
- </el-form-item>
- <el-form-item label="市" prop="city">
- <el-input v-model="formInformation.data.city" placeholder="请输入市" />
- </el-form-item>
- <el-form-item label="区/县" prop="county">
- <el-input v-model="formInformation.data.county" placeholder="请输入区/县" />
- </el-form-item>
- <el-form-item label="详细地址" prop="detailedAddress">
- <el-input v-model="formInformation.data.detailedAddress" placeholder="请输入详细地址" />
- </el-form-item>
- <el-form-item label="收货人" prop="consignee">
- <el-input v-model="formInformation.data.consignee" placeholder="请输入收货人" />
- </el-form-item>
- <el-form-item label="收货人电话" prop="consigneeNumber">
- <el-input v-model="formInformation.data.consigneeNumber" placeholder="请输入收货人电话" />
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="openInformation = false" size="large">取 消</el-button>
- <el-button type="primary" @click="submitInformation()" size="large" v-preReClick>保 存</el-button>
- </template>
- </el-dialog>
- <el-dialog title="修改快递" v-if="openExpress" v-model="openExpress" width="500">
- <el-form :model="formExpress.data" :rules="rulesExpress" label-width="100px" ref="refExpress">
- <el-form-item label="快递" prop="expressDeliveryId">
- <el-select v-model="formExpress.data.expressDeliveryId" placeholder="请选择快递" style="width: 100%">
- <el-option v-for="item in expressDeliveryList.value" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" />
- </el-select>
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="openExpress = false" size="large">取 消</el-button>
- <el-button type="primary" @click="submitExpress()" size="large" v-preReClick>保 存</el-button>
- </template>
- </el-dialog>
- <el-dialog title="修改快递" v-if="openExpressCode" v-model="openExpressCode" width="500">
- <el-form :model="formExpressCode.data" :rules="rulesExpressCode" label-width="100px" ref="refExpressCode">
- <el-form-item label="快递单号" prop="expressDeliveryCode">
- <el-input v-model="formExpressCode.data.expressDeliveryCode" placeholder="请输入快递单号" />
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="openExpressCode = false" size="large">取 消</el-button>
- <el-button type="primary" @click="submitExpressCode()" size="large" v-preReClick>保 存</el-button>
- </template>
- </el-dialog>
- </el-card>
- </template>
- <script setup>
- import byTable from "/src/components/byTable/index";
- import { ElMessage } from "element-plus";
- import PackTotal from "/src/views/production/shipment/print-order/packTotal.vue";
- const { proxy } = getCurrentInstance();
- const departmentList = ref([{ dictKey: "0", dictValue: "胜德体育" }]);
- const expressDeliveryList = ref([]);
- const sourceList = ref({
- data: [],
- pagination: {
- total: 0,
- pageNum: 1,
- pageSize: 10,
- code: "",
- departmentId: "",
- expressDeliveryCode: "",
- printStatus: "",
- beginTime: "",
- endTime: "",
- },
- });
- const loading = ref(false);
- const searchConfig = computed(() => {
- return [
- {
- type: "input",
- prop: "code",
- label: "订单号",
- },
- {
- type: "select",
- prop: "departmentId",
- data: departmentList.value,
- label: "事业部",
- },
- {
- type: "input",
- prop: "expressDeliveryCode",
- label: "快递单号",
- },
- {
- type: "select",
- prop: "printStatus",
- data: [
- {
- dictKey: "1",
- dictValue: "是",
- },
- {
- dictKey: "0",
- dictValue: "否",
- },
- ],
- label: "打印状态",
- },
- {
- type: "date",
- propList: ["beginTime", "endTime"],
- label: "交期",
- },
- ];
- });
- const config = computed(() => {
- return [
- {
- type: "expand",
- attrs: {
- label: " ",
- slot: "typeExpand",
- width: 50,
- },
- },
- {
- type: "selection",
- attrs: {
- checkAtt: "isCheck",
- },
- },
- // {
- // attrs: {
- // label: "日期",
- // slot: "backupDateStr",
- // width: 220,
- // align: "center",
- // },
- // },
- {
- attrs: {
- label: "主订单号",
- slot: "code",
- width: 160,
- },
- },
- {
- attrs: {
- label: "合并订单号",
- slot: "groupOrderCodeList",
- width: 160,
- },
- },
- {
- attrs: {
- label: "总包裹数",
- slot: "total",
- width: 90,
- },
- },
- {
- attrs: {
- label: "事业部",
- prop: "departmentName",
- width: 130,
- },
- },
- {
- attrs: {
- label: "快递",
- prop: "expressDeliveryName",
- width: 130,
- },
- },
- {
- attrs: {
- label: "快递单号",
- prop: "expressDeliveryCode",
- width: 130,
- },
- },
- {
- attrs: {
- label: "店铺来源",
- prop: "sourcePlatform",
- width: 120,
- },
- },
- {
- attrs: {
- label: "店铺名称",
- prop: "shopName",
- width: 140,
- },
- },
- {
- attrs: {
- label: "下单时间",
- prop: "createTime",
- width: 160,
- align: "center",
- },
- },
- {
- attrs: {
- label: "交期",
- prop: "deliveryTime",
- width: 160,
- align: "center",
- },
- },
- {
- attrs: {
- label: "收货人",
- prop: "consignee",
- width: 120,
- },
- },
- {
- attrs: {
- label: "收货人电话",
- prop: "consigneeNumber",
- width: 160,
- },
- },
- {
- attrs: {
- label: "收货地址",
- slot: "address",
- width: 300,
- },
- },
- {
- attrs: {
- label: "总净重(kg)",
- prop: "totalNetWeight",
- width: 120,
- fixed: "right",
- },
- },
- {
- attrs: {
- label: "总体积(m³)",
- prop: "totalVolume",
- width: 120,
- fixed: "right",
- },
- },
- {
- attrs: {
- label: "操作",
- width: 100,
- align: "center",
- fixed: "right",
- },
- renderHTML(row) {
- return [
- {
- attrs: {
- label: "包裹图片",
- type: "primary",
- text: true,
- },
- el: "button",
- click() {
- clickPackagePicture(row);
- },
- },
- ];
- },
- },
- ];
- });
- const getDemandData = () => {
- proxy.post("/department/page", { pageNum: 1, pageSize: 999 }).then((res) => {
- if (res.rows && res.rows.length > 0) {
- departmentList.value = departmentList.value.concat(
- res.rows.map((item) => {
- return {
- dictKey: item.id,
- dictValue: item.name,
- };
- })
- );
- }
- });
- proxy.post("/expressDelivery/page", { pageNum: 1, pageSize: 999 }).then((res) => {
- if (res.rows && res.rows.length > 0) {
- expressDeliveryList.value = res.rows.map((item) => {
- return {
- dictKey: item.id,
- dictValue: item.expressage,
- };
- });
- }
- });
- };
- getDemandData();
- const getList = async (req, status) => {
- if (status) {
- sourceList.value.pagination = {
- pageNum: sourceList.value.pagination.pageNum,
- pageSize: sourceList.value.pagination.pageSize,
- };
- } else {
- sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
- }
- loading.value = true;
- proxy.post("/issueBill/page", sourceList.value.pagination).then((res) => {
- if (res.rows && res.rows.length > 0) {
- sourceList.value.data = res.rows.map((item) => {
- return {
- ...item,
- isCheck: true,
- };
- });
- } else {
- sourceList.value.data = [];
- }
- sourceList.value.pagination.total = res.total;
- setTimeout(() => {
- loading.value = false;
- }, 200);
- });
- };
- getList();
- const clickReset = () => {
- getList("", true);
- };
- const selectData = ref([]);
- const selectRow = (data) => {
- selectData.value = data;
- };
- const clickCode = (row) => {
- proxy.$router.replace({
- path: "/order-detail",
- query: {
- detailId: row.id,
- text: "订单详情",
- random: proxy.random(),
- },
- });
- };
- const openTotal = ref(false);
- const rowData = ref({});
- const clickTotal = (item) => {
- rowData.value = item;
- openTotal.value = true;
- };
- const clickCancel = () => {
- openTotal.value = false;
- };
- const openPackagePicture = ref(false);
- const loadingPackagePicture = ref(false);
- const fileList = ref([]);
- const clickPackagePicture = (item) => {
- fileList.value = [];
- rowData.value = item;
- openPackagePicture.value = true;
- loadingPackagePicture.value = true;
- proxy.post("/fileInfo/getList", { businessIdList: [item.id] }).then(
- (fileObj) => {
- if (fileObj[item.id] && fileObj[item.id].length > 0) {
- let file = fileObj[item.id].filter((item) => item.businessType == "2");
- if (file && file.length > 0) {
- fileList.value = file.map((item) => {
- return {
- raw: item,
- name: item.fileName,
- url: item.fileUrl,
- };
- });
- } else {
- fileList.value = [];
- }
- }
- loadingPackagePicture.value = false;
- },
- (err) => {
- console.log(err);
- loadingPackagePicture.value = false;
- }
- );
- };
- const uploadData = ref({});
- const beforeUpload = async (file) => {
- const res = await proxy.post("/fileInfo/getSing", { fileName: file.name });
- uploadData.value = res.uploadBody;
- file.id = res.id;
- file.fileName = res.fileName;
- file.fileUrl = res.fileUrl;
- return true;
- };
- const onPreview = (file) => {
- window.open(file.raw.fileUrl, "_blank");
- };
- const submitPicture = () => {
- let packagePictureList = [];
- if (fileList.value && fileList.value.length > 0) {
- packagePictureList = fileList.value.map((item) => {
- return {
- id: item.raw.id,
- fileName: item.raw.fileName,
- fileUrl: item.raw.fileUrl,
- };
- });
- }
- loadingPackagePicture.value = true;
- proxy.post("/issueBill/editPackagePicture", { id: rowData.value.id, packagePictureList: packagePictureList }).then(
- () => {
- openPackagePicture.value = false;
- loadingPackagePicture.value = false;
- ElMessage({ message: "提交成功", type: "success" });
- },
- (err) => {
- console.log(err);
- loadingPackagePicture.value = false;
- }
- );
- };
- const clickUnpack = () => {
- if (selectData.value && selectData.value.length > 0) {
- if (selectData.value.length > 1) {
- return ElMessage("每次只能选一个");
- }
- proxy.$router.replace({
- path: "/production/shipment/unpack",
- query: {
- id: selectData.value[0].id,
- },
- });
- } else {
- return ElMessage("请先选择需要拆分包裹的订单");
- }
- };
- const openMerge = ref(false);
- const formMerge = reactive({
- data: {
- id: "",
- mergeIdList: [],
- },
- });
- const rulesMerge = ref({
- id: [{ required: true, message: "请选择主订单", trigger: "change" }],
- mergeIdList: [{ required: true, message: "请选择合并订单", trigger: "change" }],
- });
- const clickMerge = () => {
- if (selectData.value && selectData.value.length > 1) {
- for (let i = 0; i < selectData.value.length; i++) {
- if (selectData.value[i].groupOrderCodeList && selectData.value[i].groupOrderCodeList.length > 0) {
- return ElMessage("请选择未合并订单进行合并");
- }
- }
- formMerge.data = {
- id: "",
- mergeIdList: [],
- };
- openMerge.value = true;
- } else {
- return ElMessage("请选择需要合并的订单");
- }
- };
- const submitMerge = () => {
- proxy.$refs.refMerge.validate((valid) => {
- if (valid) {
- proxy.post("/issueBill/merge", formMerge.data).then(() => {
- openMerge.value = false;
- ElMessage({ message: "提交成功", type: "success" });
- getList();
- });
- }
- });
- };
- const clickUnMerge = () => {
- if (selectData.value && selectData.value.length > 0) {
- if (selectData.value.length > 1) {
- return ElMessage("每次只能选一个");
- }
- if (!(selectData.value[0].groupOrderCodeList && selectData.value[0].groupOrderCodeList.length > 0)) {
- return ElMessage("该订单没有合并");
- }
- proxy.post("/issueBill/unmerge", { id: selectData.value[0].id }).then(() => {
- ElMessage({ message: "取消合并成功", type: "success" });
- getList();
- });
- } else {
- return ElMessage("请先选择需要取消合并的订单");
- }
- };
- const openInformation = ref(false);
- const formInformation = reactive({
- data: {
- id: "",
- province: "",
- city: "",
- county: "",
- detailedAddress: "",
- consignee: "",
- consigneeNumber: "",
- },
- });
- const rulesInformation = ref({
- province: [{ required: true, message: "请输入省", trigger: "blur" }],
- city: [{ required: true, message: "请输入市", trigger: "blur" }],
- county: [{ required: true, message: "请输入县", trigger: "blur" }],
- detailedAddress: [{ required: true, message: "请输入详细地址", trigger: "blur" }],
- consignee: [{ required: true, message: "请输入收货人", trigger: "blur" }],
- consigneeNumber: [{ required: true, message: "请输入收货人电话", trigger: "blur" }],
- });
- const clickModifyInformation = () => {
- if (selectData.value && selectData.value.length > 0) {
- if (selectData.value.length > 1) {
- return ElMessage("每次只能选一个");
- }
- formInformation.data = {
- id: selectData.value[0].id,
- province: selectData.value[0].province,
- city: selectData.value[0].city,
- county: selectData.value[0].county,
- detailedAddress: selectData.value[0].detailedAddress,
- consignee: selectData.value[0].consignee,
- consigneeNumber: selectData.value[0].consigneeNumber,
- };
- openInformation.value = true;
- } else {
- return ElMessage("请先选择需要修改收件信息的订单");
- }
- };
- const submitInformation = () => {
- proxy.$refs.refInformation.validate((valid) => {
- if (valid) {
- proxy.post("/issueBill/editAddress", formInformation.data).then(() => {
- openInformation.value = false;
- ElMessage({ message: "保存成功", type: "success" });
- getList();
- });
- }
- });
- };
- const openExpress = ref(false);
- const formExpress = reactive({
- data: {
- id: "",
- expressDeliveryId: "",
- },
- });
- const rulesExpress = ref({
- expressDeliveryId: [{ required: true, message: "请选择快递", trigger: "change" }],
- });
- const clickModifiedExpress = () => {
- if (selectData.value && selectData.value.length > 0) {
- if (selectData.value.length > 1) {
- return ElMessage("每次只能选一个");
- }
- formExpress.data = {
- id: selectData.value[0].id,
- expressDeliveryId: selectData.value[0].expressDeliveryId,
- };
- openExpress.value = true;
- } else {
- return ElMessage("请先选择需要修改快递的订单");
- }
- };
- const submitExpress = () => {
- proxy.$refs.refExpress.validate((valid) => {
- if (valid) {
- proxy.post("/issueBill/editExpressDeliveryId", formExpress.data).then(() => {
- openExpress.value = false;
- ElMessage({ message: "保存成功", type: "success" });
- getList();
- });
- }
- });
- };
- const clickPrint = () => {
- console.log("打印快递单");
- };
- const openExpressCode = ref(false);
- const formExpressCode = reactive({
- data: {
- id: "",
- expressDeliveryCode: "",
- },
- });
- const rulesExpressCode = ref({
- expressDeliveryCode: [{ required: true, message: "请输入快递单号", trigger: "blur" }],
- });
- const clickFillInExpressCode = () => {
- if (selectData.value && selectData.value.length > 0) {
- if (selectData.value.length > 1) {
- return ElMessage("每次只能选一个");
- }
- formExpressCode.data = {
- id: selectData.value[0].id,
- expressDeliveryCode: selectData.value[0].expressDeliveryCode,
- };
- openExpressCode.value = true;
- } else {
- return ElMessage("请先选择需要填写快递单号的订单");
- }
- };
- const submitExpressCode = () => {
- proxy.$refs.refExpressCode.validate((valid) => {
- if (valid) {
- proxy.post("/issueBill/editExpressDeliveryCode", formExpressCode.data).then(() => {
- openExpressCode.value = false;
- ElMessage({ message: "保存成功", type: "success" });
- getList();
- });
- }
- });
- };
- </script>
- <style lang="scss" scoped>
- ::v-deep(.remark) {
- margin: 0 16px;
- p {
- margin-block-start: 0 !important;
- margin-block-end: 0 !important;
- }
- }
- :deep(.el-dialog) {
- margin-top: 10px !important;
- margin-bottom: 10px !important;
- }
- </style>
|