diff --git a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/saledelivery/vo/SaleDeliverySaveReqVO.java b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/saledelivery/vo/SaleDeliverySaveReqVO.java index 6877896..feca7a2 100644 --- a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/saledelivery/vo/SaleDeliverySaveReqVO.java +++ b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/controller/admin/saledelivery/vo/SaleDeliverySaveReqVO.java @@ -1,13 +1,19 @@ package com.ningxia.yunxi.chemmes.module.biz.controller.admin.saledelivery.vo; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.ningxia.yunxi.chemmes.module.biz.controller.admin.saledeliverydetail.vo.SaleDeliveryDetailSaveReqVO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDate; import java.util.List; +import static com.ningxia.yunxi.chemmes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; + @Schema(description = "管理后台 - 销售出库单主新增/修改 Request VO") @Data public class SaleDeliverySaveReqVO { @@ -18,7 +24,10 @@ public class SaleDeliverySaveReqVO { @Schema(description = "销售出库单号(SC+年份+月份+3位流水号)") private String saleDeliveryNo; - @Schema(description = "单据日期") + @Schema(description = "单据日期", example = "2026-01-01") + @JsonFormat(pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + @JsonSerialize(using = LocalDateSerializer.class) private LocalDate deliveryDate; @Schema(description = "客户id", example = "11842") diff --git a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/mysql/saledelivery/SaleDeliveryMapper.java b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/mysql/saledelivery/SaleDeliveryMapper.java index 116bf5b..a9c53c2 100644 --- a/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/mysql/saledelivery/SaleDeliveryMapper.java +++ b/mes-module-chemmes/mes-module-chemmes-biz/src/main/java/com/ningxia/yunxi/chemmes/module/biz/dal/mysql/saledelivery/SaleDeliveryMapper.java @@ -18,30 +18,14 @@ public interface SaleDeliveryMapper extends BaseMapperX { default PageResult selectPage(SaleDeliveryPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .betweenIfPresent(SaleDeliveryDO::getCreateTime, reqVO.getCreateTime()) - .eqIfPresent(SaleDeliveryDO::getSaleDeliveryNo, reqVO.getSaleDeliveryNo()) + .likeIfPresent(SaleDeliveryDO::getSaleDeliveryNo, reqVO.getSaleDeliveryNo()) .betweenIfPresent(SaleDeliveryDO::getDeliveryDate, reqVO.getDeliveryDate()) - .eqIfPresent(SaleDeliveryDO::getCustId, reqVO.getCustId()) - .likeIfPresent(SaleDeliveryDO::getCustName, reqVO.getCustName()) - .eqIfPresent(SaleDeliveryDO::getContact, reqVO.getContact()) - .eqIfPresent(SaleDeliveryDO::getConPhone, reqVO.getConPhone()) - .eqIfPresent(SaleDeliveryDO::getConAddress, reqVO.getConAddress()) .eqIfPresent(SaleDeliveryDO::getDeliveryStatus, reqVO.getDeliveryStatus()) .eqIfPresent(SaleDeliveryDO::getDeliveryType, reqVO.getDeliveryType()) - .eqIfPresent(SaleDeliveryDO::getRemark, reqVO.getRemark()) .eqIfPresent(SaleDeliveryDO::getSaleOrdId, reqVO.getSaleOrdId()) - .eqIfPresent(SaleDeliveryDO::getSaleOrdNo, reqVO.getSaleOrdNo()) - .eqIfPresent(SaleDeliveryDO::getDeliveryEmpId, reqVO.getDeliveryEmpId()) - .likeIfPresent(SaleDeliveryDO::getDeliveryEmpName, reqVO.getDeliveryEmpName()) - .eqIfPresent(SaleDeliveryDO::getTwmStorageId, reqVO.getTwmStorageId()) - .eqIfPresent(SaleDeliveryDO::getMaterialId, reqVO.getMaterialId()) + .likeIfPresent(SaleDeliveryDO::getSaleOrdNo, reqVO.getSaleOrdNo()) .eqIfPresent(SaleDeliveryDO::getMaterialCode, reqVO.getMaterialCode()) .likeIfPresent(SaleDeliveryDO::getMaterialName, reqVO.getMaterialName()) - .eqIfPresent(SaleDeliveryDO::getSpec, reqVO.getSpec()) - .eqIfPresent(SaleDeliveryDO::getUnit, reqVO.getUnit()) - .eqIfPresent(SaleDeliveryDO::getOrdQty, reqVO.getOrdQty()) - .eqIfPresent(SaleDeliveryDO::getRemaimQty, reqVO.getRemaimQty()) - .eqIfPresent(SaleDeliveryDO::getSaleOrdDetailId, reqVO.getSaleOrdDetailId()) - .eqIfPresent(SaleDeliveryDO::getDeliveriedQty, reqVO.getDeliveriedQty()) .orderByDesc(SaleDeliveryDO::getId)); } diff --git a/mes-ui/mes-ui-admin-vue3/src/types/auto-components.d.ts b/mes-ui/mes-ui-admin-vue3/src/types/auto-components.d.ts index 367ea4b..86f9267 100644 --- a/mes-ui/mes-ui-admin-vue3/src/types/auto-components.d.ts +++ b/mes-ui/mes-ui-admin-vue3/src/types/auto-components.d.ts @@ -93,6 +93,7 @@ declare module 'vue' { RouterLink: typeof import('vue-router')['RouterLink'] RouterSearch: typeof import('./../components/RouterSearch/index.vue')['default'] RouterView: typeof import('vue-router')['RouterView'] + SaleDeliveryDetail: typeof import('./../views/biz/saledelivery/SaleDeliveryDetail.vue')['default'] ScriptTask: typeof import('./../components/bpmnProcessDesigner/package/penal/task/task-components/ScriptTask.vue')['default'] Search: typeof import('./../components/Search/src/Search.vue')['default'] ShortcutDateRangePicker: typeof import('./../components/ShortcutDateRangePicker/index.vue')['default'] diff --git a/mes-ui/mes-ui-admin-vue3/src/views/biz/components/MoneyInput.vue b/mes-ui/mes-ui-admin-vue3/src/views/biz/components/MoneyInput.vue index b9ec4c0..1503074 100644 --- a/mes-ui/mes-ui-admin-vue3/src/views/biz/components/MoneyInput.vue +++ b/mes-ui/mes-ui-admin-vue3/src/views/biz/components/MoneyInput.vue @@ -225,6 +225,14 @@ const handleInput = (value: string) => { if (props.decimalPlaces === 0) { inputValue = inputValue.replace(/\./g, '') displayValue.value = inputValue + + // 发出更新事件 + if (inputValue === '') { + emit('update:modelValue', undefined) + } else { + const num = Number(inputValue) + emit('update:modelValue', isNaN(num) ? undefined : num) + } return } 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 d3d7da2..443d667 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 @@ -85,9 +85,11 @@ - @@ -171,12 +173,25 @@ @@ -220,6 +235,7 @@ import * as CustomerApi from '@/api/biz/customer' import { watch } from 'vue' import OrderSelectDialog from './OrderSelectDialog.vue' import ProStorageInventorySelectDialog from '../prostorageinventory/ProStorageInventorySelectDialog.vue' +import MoneyInput from '@/views/biz/components/MoneyInput.vue' const { t } = useI18n() const message = useMessage() @@ -252,7 +268,7 @@ const formData = reactive({ saleDeliveryNo: '自动生成', deliveryDate: getToday(), deliveryStatus: '1', - deliveryType: undefined, + deliveryType: '1', custId: undefined, custName: undefined, contact: undefined, @@ -339,7 +355,7 @@ watch(dialogVisible, (val) => { const formRules = reactive({ saleOrdId: [{ required: true, message: '销售订单不能为空', trigger: 'change' }], - ordDate: [{ required: true, message: '单据日期不能为空', trigger: 'change' }], + deliveryDate: [{ required: true, message: '单据日期不能为空', trigger: 'change' }], deliveryStatus: [{ required: true, message: '单据状态不能为空', trigger: 'change' }], deliveriedQty: [ { required: true, message: '发货数量不能为空', trigger: 'change' }, @@ -597,10 +613,35 @@ const validateDeliveryQty = () => { const remaimQty = parseInt(formData.remaimQty) || 0 const totalDeliveriedQty = totalQty.value + // 验证每个产品项的发货袋数和发货数量不能为空且必须大于0 + for (let i = 0; i < productList.value.length; i++) { + const item = productList.value[i] + const deliveriedBag = parseInt(item.deliveriedBag) || 0 + const deliveriedQty = parseInt(item.deliveriedQty) || 0 + + if (!item.deliveriedBag || deliveriedBag <= 0) { + message.warning(`第${i + 1}行:发货袋数不能为空且必须大于0`) + return false + } + + if (!item.deliveriedQty || deliveriedQty <= 0) { + message.warning(`第${i + 1}行:发货数量不能为空且必须大于0`) + return false + } + } + if (totalDeliveriedQty > remaimQty) { message.warning(`发货总数量(${totalDeliveriedQty})不能超过剩余数量(${remaimQty})`) return false } + + // 验证明细表发货合计数量必须等于表单发货数量 + const formDeliveriedQty = parseInt(formData.deliveriedQty) || 0 + if (totalDeliveriedQty !== formDeliveriedQty) { + message.warning(`明细表发货合计(${totalDeliveriedQty})必须等于表单发货数量(${formDeliveriedQty})`) + return false + } + return true } @@ -707,7 +748,7 @@ const resetForm = () => { saleDeliveryNo: '自动生成', deliveryDate: getToday(), deliveryStatus: '1', - deliveryType: undefined, + deliveryType: '1', custId: undefined, custName: undefined, contact: undefined, @@ -733,3 +774,9 @@ const resetForm = () => { formRef.value?.resetFields() } + + 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 5437f3a..d7f027f 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 @@ -116,6 +116,7 @@ @@ -124,6 +125,7 @@ @@ -132,7 +134,7 @@ 详情 @@ -173,15 +175,19 @@ - + + + +