diff --git a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/order/TsoOrderController.java b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/order/TsoOrderController.java
index 0bb895e..dc3d8a2 100644
--- a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/order/TsoOrderController.java
+++ b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/order/TsoOrderController.java
@@ -7,9 +7,11 @@ import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult;
import com.ningxia.yunxi.chemmes.framework.common.util.object.BeanUtils;
import com.ningxia.yunxi.chemmes.framework.excel.core.util.ExcelUtils;
import com.ningxia.yunxi.chemmes.framework.operatelog.core.annotations.OperateLog;
-import com.ningxia.yunxi.chemmes.module.biz.controller.admin.order.vo.*;
+import com.ningxia.yunxi.chemmes.module.biz.controller.admin.order.vo.OrderItemWithOrderRespVO;
+import com.ningxia.yunxi.chemmes.module.biz.controller.admin.order.vo.OrderPageReqVO;
+import com.ningxia.yunxi.chemmes.module.biz.controller.admin.order.vo.OrderRespVO;
+import com.ningxia.yunxi.chemmes.module.biz.controller.admin.order.vo.OrderSaveReqVO;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.order.OrderDO;
-import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.orderitem.OrderItemDO;
import com.ningxia.yunxi.chemmes.module.biz.service.order.OrderService;
import com.ningxia.yunxi.chemmes.module.biz.service.orderitem.OrderItemService;
import com.ningxia.yunxi.chemmes.module.system.dal.dataobject.user.AdminUserDO;
@@ -105,6 +107,7 @@ public class TsoOrderController {
}
return success(respPageResult);
}
+
// 分页查询子表(关联主表)
@GetMapping("/page-item")
@Operation(summary = "获得销售订单子项分页(关联主表)")
diff --git a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/order/vo/OrderItemWithOrderRespVO.java b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/order/vo/OrderItemWithOrderRespVO.java
index be4a71f..78a23ad 100644
--- a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/order/vo/OrderItemWithOrderRespVO.java
+++ b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/order/vo/OrderItemWithOrderRespVO.java
@@ -2,6 +2,7 @@ package com.ningxia.yunxi.chemmes.module.biz.controller.admin.order.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -15,7 +16,7 @@ import java.time.LocalDateTime;
public class OrderItemWithOrderRespVO {
// ==================== 子表字段 (tso_order_item) ====================
-
+
@Schema(description = "子表自增字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "26357")
@ExcelProperty("子表ID")
private Integer itemId;
@@ -84,6 +85,7 @@ public class OrderItemWithOrderRespVO {
@Schema(description = "下单日期")
@ExcelProperty("下单日期")
+ @JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate ordDate;
@Schema(description = "客户id", example = "23476")
@@ -128,6 +130,7 @@ public class OrderItemWithOrderRespVO {
@Schema(description = "要求交货日期")
@ExcelProperty("要求交货日期")
+ @JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate reqDeliveryDate;
@Schema(description = "是否急单(0 是 1 否)")
@@ -164,6 +167,7 @@ public class OrderItemWithOrderRespVO {
@Schema(description = "审核时间")
@ExcelProperty("审核时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime auditTime;
@Schema(description = "附件信息")
diff --git a/mes-ui/mes-ui-admin-vue3/src/utils/dict.ts b/mes-ui/mes-ui-admin-vue3/src/utils/dict.ts
index 0a9f501..bb488bf 100644
--- a/mes-ui/mes-ui-admin-vue3/src/utils/dict.ts
+++ b/mes-ui/mes-ui-admin-vue3/src/utils/dict.ts
@@ -251,13 +251,6 @@ export enum DICT_TYPE {
KEEP_TYPE='keep_type', // 保管类型
KEEP_MARK='keep_mark', // 保管标识
PLAN_STATUS='plan_status', // 计划状态
- CHECK_STATUS='check_status', // 原材料单据状态
- CHECK_RESULT='check_result', // 原材料检验结果
- BILL_TYPE='bill_type', // 采购订单单据类型
- STOCK_OUT_TYPE='stock_out_type', // 出库类型
- STOCK_OUT_STATUS='stock_out_status', // 出库状态
- DELIVERY_METHOD='delivery_method', // 配送方式
- BILL_STATUS='bill_status', // 单据状态
diff --git a/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/OrderSelectDialog.vue b/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/OrderSelectDialog.vue
index 2af171a..497eb4e 100644
--- a/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/OrderSelectDialog.vue
+++ b/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/OrderSelectDialog.vue
@@ -28,64 +28,83 @@
-
-
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
-
-
-
-
+
+
+ {{ (scope.row.ordQty || 0) - (scope.row.deliveriedQty || 0) }}
-
-
+
+
+
+
+ -
+
+
-
+
- 保存
+ 保存
取消
+
+
diff --git a/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/SaleDeliveryForm.vue b/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/SaleDeliveryForm.vue
index e3705ea..428208c 100644
--- a/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/SaleDeliveryForm.vue
+++ b/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/SaleDeliveryForm.vue
@@ -11,35 +11,20 @@
-
-
+
-
-
-
- 选择订单
-
+ class="cursor-pointer"
+ />
-
+
-
+
@@ -66,40 +51,46 @@
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
@@ -122,38 +113,17 @@
-
-
-
+
-
-
-
+
-
-
-
+
@@ -165,7 +135,7 @@
新增
-
+
@@ -197,12 +167,12 @@
-
+
-
+
@@ -224,12 +194,6 @@
-
-
- 合计:
- 发货袋数: {{ totalBag }}
- 发货数量: {{ totalQty }}
-
@@ -247,6 +211,7 @@
import { ref, reactive, computed } from 'vue'
import * as SaleDeliveryApi from '@/api/biz/saledelivery'
import * as OrderApi from '@/api/biz/tsoorder'
+import * as CustomerApi from '@/api/biz/customer'
import { watch } from 'vue'
import OrderSelectDialog from './OrderSelectDialog.vue'
@@ -264,23 +229,6 @@ const saleOrderOptions = ref([])
// 订单选择弹窗
const orderSelectRef = ref()
-// 联系人选项
-const contactOptions = ref([
- { label: '联系人1', value: '联系人1' },
- { label: '联系人2', value: '联系人2' },
-])
-
-// 联系电话选项
-const phoneOptions = ref([
- { label: '13800138001', value: '13800138001' },
- { label: '13800138002', value: '13800138002' },
-])
-
-// 联系地址选项
-const addressOptions = ref([
- { label: '地址1', value: '地址1' },
- { label: '地址2', value: '地址2' },
-])
// 获取今日日期
const getToday = () => {
@@ -297,6 +245,7 @@ const formData = reactive({
deliveryDate: getToday(),
deliveryStatus: '1',
deliveryType: undefined,
+ ordDate: undefined,
custId: undefined,
custName: undefined,
contact: undefined,
@@ -341,6 +290,26 @@ const totalQty = computed(() => {
return productList.value.reduce((sum, item) => sum + (parseInt(item.deliveriedQty) || 0), 0)
})
+/** 表格合计方法 */
+const getSummary = (param: any) => {
+ const { columns, data } = param
+ const sums: any[] = []
+ columns.forEach((column: any, index: number) => {
+ if (index === 0) {
+ sums[index] = '合计'
+ } else if (column.prop === 'deliveriedBag') {
+ const total = data.reduce((sum: number, item: any) => sum + (parseInt(item.deliveriedBag) || 0), 0)
+ sums[index] = total
+ } else if (column.prop === 'deliveriedQty') {
+ const total = data.reduce((sum: number, item: any) => sum + (parseInt(item.deliveriedQty) || 0), 0)
+ sums[index] = total
+ } else {
+ sums[index] = ''
+ }
+ })
+ return sums
+}
+
// 监听弹窗关闭
watch(dialogVisible, (val) => {
if (!val) {
@@ -352,7 +321,19 @@ const formRules = reactive({
saleOrdId: [{ required: true, message: '销售订单不能为空', trigger: 'change' }],
deliveryDate: [{ required: true, message: '单据日期不能为空', trigger: 'change' }],
deliveryStatus: [{ required: true, message: '单据状态不能为空', trigger: 'change' }],
- deliveriedQty: [{ required: true, message: '发货数量不能为空', trigger: 'change' }],
+ deliveriedQty: [
+ { required: true, message: '发货数量不能为空', trigger: 'change' },
+ {
+ validator: (rule, value, callback) => {
+ if (value && formData.remaimQty !== undefined && Number(value) > Number(formData.remaimQty)) {
+ callback(new Error(`发货数量不能大于剩余数量(${formData.remaimQty})`))
+ } else {
+ callback()
+ }
+ },
+ trigger: ['change', 'blur']
+ }
+ ],
})
const formRef = ref()
@@ -415,22 +396,59 @@ const handleSaleOrderChange = async (value: number) => {
}
}
+// 防止重复点击
+let isOpeningOrderSelect = false
+
/** 打开订单选择弹窗 */
const openOrderSelect = () => {
- orderSelectRef.value.open()
+ if (isOpeningOrderSelect) return
+ isOpeningOrderSelect = true
+ try {
+ orderSelectRef.value.open()
+ } finally {
+ setTimeout(() => {
+ isOpeningOrderSelect = false
+ }, 300)
+ }
}
/** 处理订单选择 */
-const handleOrderSelect = (data: any) => {
+const handleOrderSelect = async (data: any) => {
+ console.log('handleOrderSelect data:', data)
formData.saleOrdId = data.saleOrdId
formData.saleOrdNo = data.saleOrdNo
+ formData.custId = data.custId
formData.custName = data.custName
formData.materialName = data.materialName
+ formData.materialId = data.materialId
+ formData.materialCode = data.materialCode
formData.spec = data.spec
formData.ordQty = data.ordQty
formData.remaimQty = data.remaimQty
formData.deliveriedQty = data.remaimQty
formData.unit = data.unit
+
+ // 将订单日期带入到单据日期
+ if (data.ordDate) {
+ // 确保日期格式为 YYYY-MM-DD 字符串类型
+ const ordDateStr = String(data.ordDate).trim()
+ if (/^\d{4}-\d{2}-\d{2}$/.test(ordDateStr)) {
+ formData.ordDate = ordDateStr
+ } else {
+ try {
+ const date = new Date(data.ordDate)
+ if (!isNaN(date.getTime())) {
+ formData.ordDate = date.toISOString().split('T')[0]
+ }
+ } catch (e) {
+ console.warn('日期转换失败:', e)
+ }
+ }
+ } else {
+ // 如果没有订单日期,清空单据日期
+ formData.ordDate = null
+ }
+ console.log('formData after set:', formData)
// 添加到选项列表以便显示
if (!saleOrderOptions.value.find(item => item.id === data.saleOrdId)) {
@@ -442,8 +460,29 @@ const handleOrderSelect = (data: any) => {
spec: data.spec,
ordQty: data.ordQty,
remaimQty: data.remaimQty,
+ deliveriedQty: data.deliveriedQty,
})
}
+
+ // 如果有客户ID,查询客户联系人信息
+ if (data.custId) {
+ await loadCustomerContact(data.custId)
+ }
+}
+
+/** 根据客户ID查询客户联系人信息 */
+const loadCustomerContact = async (custId: number) => {
+ try {
+ const customer = await CustomerApi.getCustomer(custId)
+ if (customer) {
+ // 优先使用contact1,如果为空则使用contact2
+ formData.contact = customer.contact1 || customer.contact2
+ formData.conPhone = customer.conPhone1 || customer.conPhone2
+ formData.conAddress = customer.conAddress1 || customer.conAddress2
+ }
+ } catch (error) {
+ console.error('查询客户联系人信息失败', error)
+ }
}
/** 添加产品项 */
@@ -551,6 +590,7 @@ const resetForm = () => {
ordQty: undefined,
remaimQty: undefined,
deliveriedQty: undefined,
+ ordDate: null,
})
productList.value = [{
diff --git a/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/index.vue b/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/index.vue
index e9da32e..550eeee 100644
--- a/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/index.vue
+++ b/mes-ui/mes-ui-admin-vue3/src/views/biz/saledelivery/index.vue
@@ -77,7 +77,7 @@
-
+
diff --git a/mes-ui/mes-ui-admin-vue3/src/views/biz/tsoorder/OrderForm.vue b/mes-ui/mes-ui-admin-vue3/src/views/biz/tsoorder/OrderForm.vue
index bbfcac7..1e5c6f7 100644
--- a/mes-ui/mes-ui-admin-vue3/src/views/biz/tsoorder/OrderForm.vue
+++ b/mes-ui/mes-ui-admin-vue3/src/views/biz/tsoorder/OrderForm.vue
@@ -260,8 +260,8 @@
-
-
+
+
@@ -286,6 +286,7 @@
:headers="uploadHeaders"
:auto-upload="true"
:limit="10"
+ :show-file-list="false"
:on-success="handleUploadSuccess"
:on-error="handleUploadError"
:on-remove="handleRemoveFile"
@@ -311,10 +312,10 @@
size="small"
class="mt-20px"
>
-
+
-
-
+
+
@@ -418,7 +419,7 @@ const formData = reactive({
saleManName: undefined,
saleDeptId: undefined,
saleDeptName: undefined,
- ordType: undefined,
+ ordType: '2',
paymentTerms: undefined,
taxRate: undefined,
totalAmount: undefined,
@@ -720,7 +721,7 @@ const resetForm = () => {
formData.saleManName = undefined
formData.saleDeptId = undefined
formData.saleDeptName = undefined
- formData.ordType = undefined
+ formData.ordType = '2'
formData.paymentTerms = undefined
formData.taxRate = undefined
formData.totalAmount = undefined
@@ -912,16 +913,18 @@ const handleUploadSuccess = (response: any, file: any, fileList: any) => {
if (response.code === 0) {
const fileUrl = response.data
// 计算上传耗时(秒)
- const startTime = uploadStartTime.value.get(file.name) || Date.now()
- const uploadDuration = ((Date.now() - startTime) / 1000).toFixed(2) + 's'
uploadStartTime.value.delete(file.name)
const fileId = fileUrl.split('/').pop() || Date.now().toString()
+
+ // 获取当前时间作为上传时间
+ const now = new Date()
+ const uploadTime = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}`
uploadedFiles.value.push({
id: fileId,
name: file.name,
- uploadTime: uploadDuration, // 显示上传耗时,如 "2.35s"
+ uploadTime: uploadTime, // 显示上传的当前时间
url: fileUrl
})
// ...
diff --git a/mes-ui/mes-ui-admin-vue3/src/views/biz/tsoorder/index.vue b/mes-ui/mes-ui-admin-vue3/src/views/biz/tsoorder/index.vue
index b978a46..3f6b7dd 100644
--- a/mes-ui/mes-ui-admin-vue3/src/views/biz/tsoorder/index.vue
+++ b/mes-ui/mes-ui-admin-vue3/src/views/biz/tsoorder/index.vue
@@ -59,7 +59,7 @@
-
+
-
+
-
+