diff --git a/klp-crm/src/main/java/com/klp/crm/domain/bo/CrmOrderBo.java b/klp-crm/src/main/java/com/klp/crm/domain/bo/CrmOrderBo.java index 12080ca4..8f8bc759 100644 --- a/klp-crm/src/main/java/com/klp/crm/domain/bo/CrmOrderBo.java +++ b/klp-crm/src/main/java/com/klp/crm/domain/bo/CrmOrderBo.java @@ -249,5 +249,20 @@ public class CrmOrderBo extends BaseEntity { private List orderIds; + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date signDateStart; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date signDateEnd; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date deliveryDateStart; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date deliveryDateEnd; } diff --git a/klp-crm/src/main/java/com/klp/crm/domain/bo/CrmOrderItemBo.java b/klp-crm/src/main/java/com/klp/crm/domain/bo/CrmOrderItemBo.java index 10bca66f..966fbe97 100644 --- a/klp-crm/src/main/java/com/klp/crm/domain/bo/CrmOrderItemBo.java +++ b/klp-crm/src/main/java/com/klp/crm/domain/bo/CrmOrderItemBo.java @@ -6,6 +6,10 @@ import lombok.EqualsAndHashCode; import javax.validation.constraints.*; import java.math.BigDecimal; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; /** * 正式订单明细业务对象 crm_order_item @@ -143,4 +147,30 @@ public class CrmOrderItemBo extends BaseEntity { */ private String purpose; + /** + * 筛选:合同号(模糊,按订单主表 crm_order.contract_code) + */ + private String contractCode; + + /** + * 筛选:需方(模糊,按订单主表 crm_order.customer) + */ + private String customer; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date signDateStart; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date signDateEnd; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date deliveryDateStart; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date deliveryDateEnd; + } diff --git a/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java b/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java index 426cb201..e8e5a5cd 100644 --- a/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java +++ b/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java @@ -1,6 +1,7 @@ package com.klp.crm.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; import com.klp.common.core.page.TableDataInfo; import com.klp.common.core.domain.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -35,7 +36,6 @@ import com.klp.mapper.WmsReceivableMapper; import com.klp.mapper.WmsDeliveryWaybillMapper; import com.klp.mapper.WmsDeliveryWaybillDetailMapper; import com.klp.service.IWmsMaterialCoilService; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import java.util.*; import java.util.stream.Collectors; @@ -72,26 +72,19 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { */ @Override public TableDataInfo queryPageList(CrmOrderItemBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - List records = result.getRecords(); - if (records != null && !records.isEmpty()) { - List orderIds = records.stream() - .map(CrmOrderItemVo::getOrderId) - .filter(Objects::nonNull) - .distinct() - .collect(Collectors.toList()); - if (!orderIds.isEmpty()) { - CrmOrderBo crmOrder = new CrmOrderBo(); - crmOrder.setOrderIds(orderIds); - List orderList = crmOrderService.queryList(crmOrder); - Map orderMap = orderList.stream() - .collect(Collectors.toMap(CrmOrderVo::getOrderId, o -> o, (a, b) -> a)); - for (CrmOrderItemVo item : records) { - item.setOrderInfo(orderMap.get(item.getOrderId())); - } - } + List orderIdScope = resolveOrderIdScope(bo); + if (orderIdScope != null && orderIdScope.isEmpty()) { + Page emptyPage = new Page<>(ObjectUtil.defaultIfNull(pageQuery.getPageNum(), 1), + ObjectUtil.defaultIfNull(pageQuery.getPageSize(), 10), 0); + emptyPage.setRecords(Collections.emptyList()); + return TableDataInfo.build(emptyPage); } + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + if (orderIdScope != null) { + lqw.in(CrmOrderItem::getOrderId, orderIdScope); + } + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + fillOrderInfoOnItems(result.getRecords()); return TableDataInfo.build(result); } @@ -100,8 +93,72 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { */ @Override public List queryList(CrmOrderItemBo bo) { + List orderIdScope = resolveOrderIdScope(bo); + if (orderIdScope != null && orderIdScope.isEmpty()) { + return Collections.emptyList(); + } LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); + if (orderIdScope != null) { + lqw.in(CrmOrderItem::getOrderId, orderIdScope); + } + List list = baseMapper.selectVoList(lqw); + fillOrderInfoOnItems(list); + return list; + } + + /** + * 按合同号/需方筛选时,解析为订单 ID 列表;无此类筛选返回 null(不按订单 ID 限制)。 + * 若同时传 orderId,则仅在匹配集合内保留该订单。 + */ + private List resolveOrderIdScope(CrmOrderItemBo bo) { + boolean hasContractFilter = StringUtils.isNotBlank(bo.getContractCode()); + boolean hasCustomerFilter = StringUtils.isNotBlank(bo.getCustomer()); + boolean hasSignDateFilter = bo.getSignDateStart() != null || bo.getSignDateEnd() != null; + boolean hasDeliveryDateFilter = bo.getDeliveryDateStart() != null || bo.getDeliveryDateEnd() != null; + + if (!hasContractFilter && !hasCustomerFilter && !hasSignDateFilter && !hasDeliveryDateFilter) { + return null; + } + LambdaQueryWrapper ow = Wrappers.lambdaQuery(); + ow.eq(CrmOrder::getDelFlag, 0L); + ow.like(hasContractFilter, CrmOrder::getContractCode, bo.getContractCode()); + ow.like(hasCustomerFilter, CrmOrder::getCustomer, bo.getCustomer()); + // 日期范围查询:开始日期 >= 开始,结束日期 < 结束+1天(处理带时间的字段) + ow.ge(bo.getSignDateStart() != null, CrmOrder::getSignTime, bo.getSignDateStart()); + ow.lt(bo.getSignDateEnd() != null, CrmOrder::getSignTime, addOneDay(bo.getSignDateEnd())); + ow.ge(bo.getDeliveryDateStart() != null, CrmOrder::getDeliveryDate, bo.getDeliveryDateStart()); + ow.lt(bo.getDeliveryDateEnd() != null, CrmOrder::getDeliveryDate, addOneDay(bo.getDeliveryDateEnd())); + List orders = crmOrderMapper.selectList(ow); + List matched = orders.stream().map(CrmOrder::getOrderId).collect(Collectors.toList()); + if (bo.getOrderId() != null) { + if (!matched.contains(bo.getOrderId())) { + return Collections.emptyList(); + } + return Collections.singletonList(bo.getOrderId()); + } + return matched; + } + + private void fillOrderInfoOnItems(List records) { + if (records == null || records.isEmpty()) { + return; + } + List orderIds = records.stream() + .map(CrmOrderItemVo::getOrderId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + if (orderIds.isEmpty()) { + return; + } + CrmOrderBo crmOrder = new CrmOrderBo(); + crmOrder.setOrderIds(orderIds); + List orderList = crmOrderService.queryList(crmOrder); + Map orderMap = orderList.stream() + .collect(Collectors.toMap(CrmOrderVo::getOrderId, o -> o, (a, b) -> a)); + for (CrmOrderItemVo item : records) { + item.setOrderInfo(orderMap.get(item.getOrderId())); + } } private LambdaQueryWrapper buildQueryWrapper(CrmOrderItemBo bo) { @@ -114,7 +171,7 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { lqw.eq(StringUtils.isNotBlank(bo.getSpecialRequire()), CrmOrderItem::getSpecialRequire, bo.getSpecialRequire()); lqw.eq(bo.getItemAmount() != null, CrmOrderItem::getItemAmount, bo.getItemAmount()); lqw.eq(StringUtils.isNotBlank(bo.getFinishedProductSpec()), CrmOrderItem::getFinishedProductSpec, bo.getFinishedProductSpec()); - lqw.eq(StringUtils.isNotBlank(bo.getMaterial()), CrmOrderItem::getMaterial, bo.getMaterial()); + lqw.like(StringUtils.isNotBlank(bo.getMaterial()), CrmOrderItem::getMaterial, bo.getMaterial()); lqw.eq(StringUtils.isNotBlank(bo.getGrade()), CrmOrderItem::getGrade, bo.getGrade()); lqw.eq(bo.getWeight() != null, CrmOrderItem::getWeight, bo.getWeight()); lqw.eq(StringUtils.isNotBlank(bo.getWidthTolerance()), CrmOrderItem::getWidthTolerance, bo.getWidthTolerance()); @@ -176,6 +233,17 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { return baseMapper.deleteBatchIds(ids) > 0; } + /** + * 日期加一天(用于处理带时间的日期字段范围查询) + */ + private Date addOneDay(Date date) { + if (date == null) return null; + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.DATE, 1); + return calendar.getTime(); + } + @Override public CrmContractOrderFinanceVo queryFinanceAndObjectionByContractId(Long contractId) { CrmContractOrderFinanceVo result = new CrmContractOrderFinanceVo(); diff --git a/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderServiceImpl.java b/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderServiceImpl.java index ede36ad8..6ba1abf6 100644 --- a/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderServiceImpl.java +++ b/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderServiceImpl.java @@ -238,6 +238,11 @@ public class CrmOrderServiceImpl implements ICrmOrderService { qw.eq(bo.getContractId() != null, "co.contract_id", bo.getContractId()); qw.like(StringUtils.isNotBlank(bo.getAnnexFiles()), "co.annex_files", bo.getAnnexFiles()); qw.eq(bo.getIsTop() != null, "co.is_top", bo.getIsTop()); + // 日期范围查询:开始日期 >= 开始,结束日期 < 结束+1天(处理带时间的字段) + qw.ge(bo.getSignDateStart() != null, "co.sign_time", bo.getSignDateStart()); + qw.lt(bo.getSignDateEnd() != null, "co.sign_time", addOneDay(bo.getSignDateEnd())); + qw.ge(bo.getDeliveryDateStart() != null, "co.delivery_date", bo.getDeliveryDateStart()); + qw.lt(bo.getDeliveryDateEnd() != null, "co.delivery_date", addOneDay(bo.getDeliveryDateEnd())); if(bo.getOrderIds() !=null){ qw.in(!bo.getOrderIds().isEmpty(), "co.order_id", bo.getOrderIds()); } @@ -304,4 +309,15 @@ public class CrmOrderServiceImpl implements ICrmOrderService { } return baseMapper.deleteBatchIds(ids) > 0; } + + /** + * 日期加一天(用于处理带时间的日期字段范围查询) + */ + private Date addOneDay(Date date) { + if (date == null) return null; + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.DATE, 1); + return calendar.getTime(); + } } diff --git a/klp-ui/src/api/wms/category.js b/klp-ui/src/api/wms/category.js new file mode 100644 index 00000000..0e8c5be3 --- /dev/null +++ b/klp-ui/src/api/wms/category.js @@ -0,0 +1,53 @@ +import request from '@/utils/request' + +// 查询通用分类列表 +export function listCategory(query) { + return request({ + url: '/wms/category/list', + method: 'get', + params: query + }) +} + +// 查询通用分类详细 +export function getCategory(categoryId) { + return request({ + url: '/wms/category/' + categoryId, + method: 'get' + }) +} + +// 新增通用分类 +export function addCategory(data) { + return request({ + url: '/wms/category', + method: 'post', + data: data + }) +} + +// 修改通用分类 +export function updateCategory(data) { + return request({ + url: '/wms/category', + method: 'put', + data: data + }) +} + +// 删除通用分类 +export function delCategory(categoryId) { + return request({ + url: '/wms/category/' + categoryId, + method: 'delete' + }) +} + +// 导出通用分类 +export function exportCategory(query) { + return request({ + url: '/wms/category/export', + method: 'get', + params: query + }) +} diff --git a/klp-ui/src/views/crm/contract/components/ContractList.vue b/klp-ui/src/views/crm/contract/components/ContractList.vue index bd2e2e4e..84360c58 100644 --- a/klp-ui/src/views/crm/contract/components/ContractList.vue +++ b/klp-ui/src/views/crm/contract/components/ContractList.vue @@ -3,21 +3,43 @@
-
+
+ @keyup.enter.native="handleQuery" style="width: 160px;" /> + 筛选 - -
+
+ 共 {{ total }} 条记录 +
+
+ + +
+
+ 签订日期: + + ~ + +
+
+ 交货日期: + + ~ + +
+ style="margin-top: 8px; padding-top: 10px; border-top: 1px dashed #e4e7ed;"> - - - - - - - - @@ -107,6 +119,7 @@
{{ row.isTop ? '取消置顶' : '置顶' }} + 详情编辑 导出 修改 删除 @@ -155,8 +168,10 @@ export default { contractCode: undefined, supplier: undefined, customer: undefined, - signTime: undefined, - deliveryDate: undefined, + signDateStart: undefined, + signDateEnd: undefined, + deliveryDateStart: undefined, + deliveryDateEnd: undefined, signLocation: undefined, status: undefined, }, @@ -204,6 +219,10 @@ export default { /** 重置按钮操作 */ resetQuery() { this.$refs["queryForm"].resetFields(); + this.queryParams.signDateStart = undefined; + this.queryParams.signDateEnd = undefined; + this.queryParams.deliveryDateStart = undefined; + this.queryParams.deliveryDateEnd = undefined; this.handleQuery(); }, diff --git a/klp-ui/src/views/crm/contract/detail/index.vue b/klp-ui/src/views/crm/contract/detail/index.vue new file mode 100644 index 00000000..5c302d6e --- /dev/null +++ b/klp-ui/src/views/crm/contract/detail/index.vue @@ -0,0 +1,782 @@ + + + + + diff --git a/klp-ui/src/views/crm/contract/index.vue b/klp-ui/src/views/crm/contract/index.vue index 388cc6ce..9fda273b 100644 --- a/klp-ui/src/views/crm/contract/index.vue +++ b/klp-ui/src/views/crm/contract/index.vue @@ -3,7 +3,8 @@
+ @export="handleExport" @exportContract="handleExportContract" @rowClick="handleRowClick" + @detailEdit="handleDetailEdit" />
@@ -357,6 +358,31 @@ export default { this.open = false; this.reset(); }, + /** 跳转合同详情编辑页(与列表路由同级,末段为 contractDetail;query.id 为 orderId) */ + handleDetailEdit(row) { + const orderId = row && row.orderId; + if (!orderId) { + this.$message.warning("缺少订单ID,无法打开详情编辑"); + return; + } + const segments = this.$route.path.split("/").filter(Boolean); + if (!segments.length) { + console.error("handleDetailEdit: 当前路由 path 为空", this.$route.path); + this.$message.error("路由异常,无法跳转"); + return; + } + segments[segments.length - 1] = "contractDetail"; + const path = `/${segments.join("/")}`; + this.$router + .push({ path, query: { id: String(orderId) } }) + .catch((err) => { + if (err && err.name === "NavigationDuplicated") { + return; + } + console.error("跳转合同详情编辑失败:", err); + this.$message.error("跳转失败,请确认菜单里详情页路由地址为 contractDetail,且与列表页同级"); + }); + }, /** 行点击事件 */ handleRowClick(row) { this.form = row; diff --git a/klp-ui/src/views/crm/orderItem/all.vue b/klp-ui/src/views/crm/orderItem/all.vue new file mode 100644 index 00000000..877da9dd --- /dev/null +++ b/klp-ui/src/views/crm/orderItem/all.vue @@ -0,0 +1,388 @@ + + + + + diff --git a/klp-ui/src/views/crm/orderItem/index.vue b/klp-ui/src/views/crm/orderItem/index.vue new file mode 100644 index 00000000..166c8b71 --- /dev/null +++ b/klp-ui/src/views/crm/orderItem/index.vue @@ -0,0 +1,667 @@ + + + + +