diff --git a/klp-aps/src/main/java/com/klp/aps/domain/bo/ApsPlanDetailBo.java b/klp-aps/src/main/java/com/klp/aps/domain/bo/ApsPlanDetailBo.java index 2a5e634a..53f882cb 100644 --- a/klp-aps/src/main/java/com/klp/aps/domain/bo/ApsPlanDetailBo.java +++ b/klp-aps/src/main/java/com/klp/aps/domain/bo/ApsPlanDetailBo.java @@ -7,6 +7,7 @@ import javax.validation.constraints.*; import java.math.BigDecimal; import java.util.Date; +import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.format.annotation.DateTimeFormat; @@ -31,6 +32,11 @@ public class ApsPlanDetailBo extends BaseEntity { */ private Long planSheetId; + /** + * 关联排产单ID列表(用于批量查询) + */ + private List planSheetIds; + /** * 内容序号 */ diff --git a/klp-aps/src/main/java/com/klp/aps/mapper/ApsPlanSheetMapper.java b/klp-aps/src/main/java/com/klp/aps/mapper/ApsPlanSheetMapper.java index 00fe2920..c821be94 100644 --- a/klp-aps/src/main/java/com/klp/aps/mapper/ApsPlanSheetMapper.java +++ b/klp-aps/src/main/java/com/klp/aps/mapper/ApsPlanSheetMapper.java @@ -18,5 +18,5 @@ import java.util.List; */ public interface ApsPlanSheetMapper extends BaseMapperPlus { - List selectList(ApsPlanSheetQueryReq req); + List selectListByReq(ApsPlanSheetQueryReq req); } diff --git a/klp-aps/src/main/java/com/klp/aps/service/IApsPlanDetailService.java b/klp-aps/src/main/java/com/klp/aps/service/IApsPlanDetailService.java index eca63cdd..07dfd9b9 100644 --- a/klp-aps/src/main/java/com/klp/aps/service/IApsPlanDetailService.java +++ b/klp-aps/src/main/java/com/klp/aps/service/IApsPlanDetailService.java @@ -31,6 +31,11 @@ public interface IApsPlanDetailService { */ List queryList(ApsPlanDetailBo bo); + /** + * 根据排产单ID列表查询明细 + */ + List queryListByPlanSheetIds(List planSheetIds); + /** * 新增排产单明细 */ diff --git a/klp-aps/src/main/java/com/klp/aps/service/impl/ApsPlanDetailServiceImpl.java b/klp-aps/src/main/java/com/klp/aps/service/impl/ApsPlanDetailServiceImpl.java index 16fe3858..1bb3fecc 100644 --- a/klp-aps/src/main/java/com/klp/aps/service/impl/ApsPlanDetailServiceImpl.java +++ b/klp-aps/src/main/java/com/klp/aps/service/impl/ApsPlanDetailServiceImpl.java @@ -105,6 +105,19 @@ public class ApsPlanDetailServiceImpl implements IApsPlanDetailService { return baseMapper.selectVoList(lqw); } + /** + * 根据排产单ID列表查询明细 + */ + @Override + public List queryListByPlanSheetIds(List planSheetIds) { + if (planSheetIds == null || planSheetIds.isEmpty()) { + return new java.util.ArrayList<>(); + } + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.in(ApsPlanDetail::getPlanSheetId, planSheetIds); + return baseMapper.selectVoList(lqw); + } + private LambdaQueryWrapper buildQueryWrapper(ApsPlanDetailBo bo) { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); diff --git a/klp-aps/src/main/java/com/klp/aps/service/impl/ApsPlanSheetServiceImpl.java b/klp-aps/src/main/java/com/klp/aps/service/impl/ApsPlanSheetServiceImpl.java index d3cd2cc8..960b0f5f 100644 --- a/klp-aps/src/main/java/com/klp/aps/service/impl/ApsPlanSheetServiceImpl.java +++ b/klp-aps/src/main/java/com/klp/aps/service/impl/ApsPlanSheetServiceImpl.java @@ -318,7 +318,7 @@ public class ApsPlanSheetServiceImpl implements IApsPlanSheetService { } private List queryListAll(ApsPlanSheetQueryReq req) { - return baseMapper.selectList(req); + return baseMapper.selectListByReq(req); } private String nvl(Object v, Object fallback) { diff --git a/klp-aps/src/main/resources/mapper/aps/ApsPlanSheetMapper.xml b/klp-aps/src/main/resources/mapper/aps/ApsPlanSheetMapper.xml index 28386431..b9ee4796 100644 --- a/klp-aps/src/main/resources/mapper/aps/ApsPlanSheetMapper.xml +++ b/klp-aps/src/main/resources/mapper/aps/ApsPlanSheetMapper.xml @@ -19,7 +19,7 @@ - SELECT d.plan_detail_id AS detailSheetId, s.plan_date AS planDate, diff --git a/klp-crm/pom.xml b/klp-crm/pom.xml index 18c99afe..3a6896ea 100644 --- a/klp-crm/pom.xml +++ b/klp-crm/pom.xml @@ -12,7 +12,7 @@ 8 UTF-8 - + org.projectlombok lombok @@ -43,5 +43,9 @@ com.klp klp-wms + + com.klp + klp-aps + diff --git a/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderController.java b/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderController.java index 7c799c5f..d85b8652 100644 --- a/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderController.java +++ b/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderController.java @@ -1,12 +1,17 @@ package com.klp.crm.controller; +import java.util.ArrayList; import java.util.List; import java.util.Arrays; +import java.util.Date; +import com.klp.aps.domain.bo.ApsPlanDetailBo; +import com.klp.aps.domain.bo.ApsPlanSheetBo; import lombok.RequiredArgsConstructor; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.*; import org.springframework.web.bind.annotation.*; +import org.springframework.format.annotation.DateTimeFormat; import org.springframework.validation.annotation.Validated; import com.klp.common.annotation.RepeatSubmit; import com.klp.common.annotation.Log; @@ -21,6 +26,10 @@ import com.klp.crm.domain.vo.CrmOrderVo; import com.klp.crm.domain.bo.CrmOrderBo; import com.klp.crm.service.ICrmOrderService; import com.klp.common.core.page.TableDataInfo; +import com.klp.aps.domain.vo.ApsPlanSheetVo; +import com.klp.aps.domain.vo.ApsPlanDetailVo; +import com.klp.aps.service.IApsPlanSheetService; +import com.klp.aps.service.IApsPlanDetailService; /** * 正式订单主 @@ -35,6 +44,8 @@ import com.klp.common.core.page.TableDataInfo; public class CrmOrderController extends BaseController { private final ICrmOrderService iCrmOrderService; + private final IApsPlanSheetService iApsPlanSheetService; + private final IApsPlanDetailService iApsPlanDetailService; /** * 查询正式订单主列表 @@ -96,4 +107,54 @@ public class CrmOrderController extends BaseController { @PathVariable String[] orderIds) { return toAjax(iCrmOrderService.deleteWithValidByIds(Arrays.asList(orderIds), true)); } + + /** + * 查询每日订单(根据排产计划获取今天的订单) + * + * @param planDate 排产日期,默认今天 + */ + @GetMapping("/daily") + public R> getDailyOrders( + @RequestParam(value = "planDate", required = false) + @DateTimeFormat(pattern = "yyyy-MM-dd") Date planDate) { + if (planDate == null) { + planDate = new Date(); + } + // 将日期设置为当天的开始时间 00:00:00 + java.util.Calendar calendar = java.util.Calendar.getInstance(); + calendar.setTime(planDate); + calendar.set(java.util.Calendar.HOUR_OF_DAY, 0); + calendar.set(java.util.Calendar.MINUTE, 0); + calendar.set(java.util.Calendar.SECOND, 0); + calendar.set(java.util.Calendar.MILLISECOND, 0); + planDate = calendar.getTime(); + + ApsPlanSheetBo bo = new ApsPlanSheetBo(); + bo.setPlanDate(planDate); + List planSheetList = iApsPlanSheetService.queryList(bo); + if (planSheetList == null || planSheetList.isEmpty()) { + return R.ok(new ArrayList<>()); + } + List planSheetIds = new ArrayList<>(); + for (ApsPlanSheetVo sheet : planSheetList) { + planSheetIds.add(sheet.getPlanSheetId()); + } + ApsPlanDetailBo detailBo = new ApsPlanDetailBo(); + detailBo.setPlanSheetIds(planSheetIds); + List detailList = iApsPlanDetailService.queryListByPlanSheetIds(planSheetIds); + if (detailList == null || detailList.isEmpty()) { + return R.ok(new ArrayList<>()); + } + List orderIds = new ArrayList<>(); + for (ApsPlanDetailVo detail : detailList) { + if (detail.getOrderId() != null) { + orderIds.add(detail.getOrderId()); + } + } + if (orderIds.isEmpty()) { + return R.ok(new ArrayList<>()); + } + List orders = iCrmOrderService.queryByIds(orderIds); + return R.ok(orders); + } } diff --git a/klp-crm/src/main/java/com/klp/crm/domain/CrmOrder.java b/klp-crm/src/main/java/com/klp/crm/domain/CrmOrder.java index aab3c578..d41ff19a 100644 --- a/klp-crm/src/main/java/com/klp/crm/domain/CrmOrder.java +++ b/klp-crm/src/main/java/com/klp/crm/domain/CrmOrder.java @@ -85,6 +85,131 @@ public class CrmOrder extends BaseEntity { */ private String contractCode; + /** + * 合同名称 + */ + private String contractName; + + /** + * 供方 + */ + private String supplier; + + /** + * 需方 + */ + private String customer; + + /** + * 签订时间 + */ + private Date signTime; + + /** + * 签订地点 + */ + private String signLocation; + + /** + * 产品内容 + */ + private String productContent; + + /** + * 合同内容 + */ + private String contractContent; + + /** + * 供方地址 + */ + private String supplierAddress; + + /** + * 供方电话 + */ + private String supplierPhone; + + /** + * 供方开户行 + */ + private String supplierBank; + + /** + * 供方账号 + */ + private String supplierAccount; + + /** + * 供方税号 + */ + private String supplierTaxNo; + + /** + * 需方地址 + */ + private String customerAddress; + + /** + * 需方电话 + */ + private String customerPhone; + + /** + * 需方开户行 + */ + private String customerBank; + + /** + * 需方账号 + */ + private String customerAccount; + + /** + * 需方税号 + */ + private String customerTaxNo; + + /** + * 技术附件 + */ + private String techAnnex; + + /** + * 商务附件 + */ + private String businessAnnex; + + /** + * 排产函 + */ + private String productionSchedule; + + /** + * 算单价备注 + */ + private String unitPriceRemark; + + /** + * 应付定金(万元) + */ + private BigDecimal depositPayable; + + /** + * 已付定金(万元) + */ + private BigDecimal depositPaid; + + /** + * 定金比例(%) + */ + private BigDecimal depositRatio; + + /** + * 合同状态 0=草稿 1=生效 2=作废 3=已完成 + */ + private Long status; + /** * 关联合同ID(wms_contract.contract_id) */ diff --git a/klp-crm/src/main/java/com/klp/crm/domain/CrmOrderItem.java b/klp-crm/src/main/java/com/klp/crm/domain/CrmOrderItem.java index 132a83dd..886336f4 100644 --- a/klp-crm/src/main/java/com/klp/crm/domain/CrmOrderItem.java +++ b/klp-crm/src/main/java/com/klp/crm/domain/CrmOrderItem.java @@ -93,6 +93,30 @@ public class CrmOrderItem extends BaseEntity { * 排产批次 */ private String productionBatch; + /** + * 表面处理 + */ + private String surfaceTreatment; + /** + * 切边要求 + */ + private String edgeCuttingReq; + /** + * 包装要求 + */ + private String packagingReq; + /** + * 宽度 + */ + private BigDecimal width; + /** + * 厚度 + */ + private BigDecimal thickness; + /** + * 用途 + */ + private String purpose; /** * 删除标识 0正常 2删除 */ 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 98311cc9..b07e18a1 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 @@ -8,6 +8,7 @@ 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 @@ -53,6 +54,8 @@ public class CrmOrderBo extends BaseEntity { /** * 交货日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") private Date deliveryDate; /** @@ -95,6 +98,133 @@ public class CrmOrderBo extends BaseEntity { */ private String contractCode; + /** + * 合同名称 + */ + private String contractName; + + /** + * 供方 + */ + private String supplier; + + /** + * 需方 + */ + private String customer; + + /** + * 签订时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date signTime; + + /** + * 签订地点 + */ + private String signLocation; + + /** + * 产品内容 + */ + private String productContent; + + /** + * 合同内容 + */ + private String contractContent; + + /** + * 供方地址 + */ + private String supplierAddress; + + /** + * 供方电话 + */ + private String supplierPhone; + + /** + * 供方开户行 + */ + private String supplierBank; + + /** + * 供方账号 + */ + private String supplierAccount; + + /** + * 供方税号 + */ + private String supplierTaxNo; + + /** + * 需方地址 + */ + private String customerAddress; + + /** + * 需方电话 + */ + private String customerPhone; + + /** + * 需方开户行 + */ + private String customerBank; + + /** + * 需方账号 + */ + private String customerAccount; + + /** + * 需方税号 + */ + private String customerTaxNo; + + /** + * 技术附件 + */ + private String techAnnex; + + /** + * 商务附件 + */ + private String businessAnnex; + + /** + * 排产函 + */ + private String productionSchedule; + + /** + * 算单价备注 + */ + private String unitPriceRemark; + + /** + * 应付定金(万元) + */ + private BigDecimal depositPayable; + + /** + * 已付定金(万元) + */ + private BigDecimal depositPaid; + + /** + * 定金比例(%) + */ + private BigDecimal depositRatio; + + /** + * 合同状态 0=草稿 1=生效 2=作废 3=已完成 + */ + private Long status; + /** * 关联合同ID(wms_contract.contract_id) */ 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 49896a75..1aabe0a8 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 @@ -108,5 +108,34 @@ public class CrmOrderItemBo extends BaseEntity { */ private String productionBatch; + /** + * 表面处理 + */ + private String surfaceTreatment; + + /** + * 切边要求 + */ + private String edgeCuttingReq; + + /** + * 包装要求 + */ + private String packagingReq; + + /** + * 宽度 + */ + private BigDecimal width; + + /** + * 厚度 + */ + private BigDecimal thickness; + + /** + * 用途 + */ + private String purpose; } diff --git a/klp-crm/src/main/java/com/klp/crm/domain/vo/CrmOrderItemVo.java b/klp-crm/src/main/java/com/klp/crm/domain/vo/CrmOrderItemVo.java index 07b05e32..5692b149 100644 --- a/klp-crm/src/main/java/com/klp/crm/domain/vo/CrmOrderItemVo.java +++ b/klp-crm/src/main/java/com/klp/crm/domain/vo/CrmOrderItemVo.java @@ -131,5 +131,40 @@ public class CrmOrderItemVo { @ExcelProperty(value = "排产批次") private String productionBatch; + /** + * 表面处理 + */ + @ExcelProperty(value = "表面处理") + private String surfaceTreatment; + + /** + * 切边要求 + */ + @ExcelProperty(value = "切边要求") + private String edgeCuttingReq; + + /** + * 包装要求 + */ + @ExcelProperty(value = "包装要求") + private String packagingReq; + + /** + * 宽度 + */ + @ExcelProperty(value = "宽度") + private BigDecimal width; + + /** + * 厚度 + */ + @ExcelProperty(value = "厚度") + private BigDecimal thickness; + + /** + * 用途 + */ + @ExcelProperty(value = "用途") + private String purpose; } diff --git a/klp-crm/src/main/java/com/klp/crm/domain/vo/CrmOrderVo.java b/klp-crm/src/main/java/com/klp/crm/domain/vo/CrmOrderVo.java index 6904667e..af1db5d6 100644 --- a/klp-crm/src/main/java/com/klp/crm/domain/vo/CrmOrderVo.java +++ b/klp-crm/src/main/java/com/klp/crm/domain/vo/CrmOrderVo.java @@ -2,12 +2,15 @@ package com.klp.crm.domain.vo; import java.math.BigDecimal; import java.util.Date; +import java.util.List; + import com.fasterxml.jackson.annotation.JsonFormat; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import com.klp.common.annotation.ExcelDictFormat; import com.klp.common.convert.ExcelDictConvert; import com.klp.common.core.domain.BaseEntity; +import com.klp.domain.vo.WmsMaterialCoilVo; import lombok.Data; @@ -114,6 +117,156 @@ public class CrmOrderVo extends BaseEntity { @ExcelProperty(value = "合同号") private String contractCode; + /** + * 合同名称 + */ + @ExcelProperty(value = "合同名称") + private String contractName; + + /** + * 供方 + */ + @ExcelProperty(value = "供方") + private String supplier; + + /** + * 需方 + */ + @ExcelProperty(value = "需方") + private String customer; + + /** + * 签订时间 + */ + @ExcelProperty(value = "签订时间") + private Date signTime; + + /** + * 签订地点 + */ + @ExcelProperty(value = "签订地点") + private String signLocation; + + /** + * 产品内容 + */ + @ExcelProperty(value = "产品内容") + private String productContent; + + /** + * 合同内容 + */ + @ExcelProperty(value = "合同内容") + private String contractContent; + + /** + * 供方地址 + */ + @ExcelProperty(value = "供方地址") + private String supplierAddress; + + /** + * 供方电话 + */ + @ExcelProperty(value = "供方电话") + private String supplierPhone; + + /** + * 供方开户行 + */ + @ExcelProperty(value = "供方开户行") + private String supplierBank; + + /** + * 供方账号 + */ + @ExcelProperty(value = "供方账号") + private String supplierAccount; + + /** + * 供方税号 + */ + @ExcelProperty(value = "供方税号") + private String supplierTaxNo; + + /** + * 需方地址 + */ + @ExcelProperty(value = "需方地址") + private String customerAddress; + + /** + * 需方电话 + */ + @ExcelProperty(value = "需方电话") + private String customerPhone; + + /** + * 需方开户行 + */ + @ExcelProperty(value = "需方开户行") + private String customerBank; + + /** + * 需方账号 + */ + @ExcelProperty(value = "需方账号") + private String customerAccount; + + /** + * 需方税号 + */ + @ExcelProperty(value = "需方税号") + private String customerTaxNo; + + /** + * 技术附件 + */ + @ExcelProperty(value = "技术附件") + private String techAnnex; + + /** + * 商务附件 + */ + @ExcelProperty(value = "商务附件") + private String businessAnnex; + + /** + * 排产函 + */ + @ExcelProperty(value = "排产函") + private String productionSchedule; + + /** + * 算单价备注 + */ + @ExcelProperty(value = "算单价备注") + private String unitPriceRemark; + + /** + * 应付定金(万元) + */ + @ExcelProperty(value = "应付定金(万元)") + private BigDecimal depositPayable; + + /** + * 已付定金(万元) + */ + @ExcelProperty(value = "已付定金(万元)") + private BigDecimal depositPaid; + + /** + * 定金比例(%) + */ + @ExcelProperty(value = "定金比例(%)") + private BigDecimal depositRatio; + + /** + * 合同状态 0=草稿 1=生效 2=作废 3=已完成 + */ + @ExcelProperty(value = "合同状态") + private Long status; + /** * 关联合同ID(wms_contract.contract_id) */ @@ -142,4 +295,8 @@ public class CrmOrderVo extends BaseEntity { private String createByName; //更新人 private String updateByName; + /** + * 关联的钢卷列表 + */ + private List coilList; } diff --git a/klp-crm/src/main/java/com/klp/crm/service/ICrmOrderService.java b/klp-crm/src/main/java/com/klp/crm/service/ICrmOrderService.java index da7f397e..c9f1bbbd 100644 --- a/klp-crm/src/main/java/com/klp/crm/service/ICrmOrderService.java +++ b/klp-crm/src/main/java/com/klp/crm/service/ICrmOrderService.java @@ -22,6 +22,11 @@ public interface ICrmOrderService { */ CrmOrderVo queryById(String orderId); + /** + * 根据ID列表查询正式订单 + */ + List queryByIds(List orderIds); + /** * 查询正式订单主列表 */ 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 24121b16..95fee509 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 @@ -101,6 +101,12 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { lqw.eq(StringUtils.isNotBlank(bo.getCustomizer()), CrmOrderItem::getCustomizer, bo.getCustomizer()); lqw.eq(StringUtils.isNotBlank(bo.getShipper()), CrmOrderItem::getShipper, bo.getShipper()); lqw.eq(StringUtils.isNotBlank(bo.getProductionBatch()), CrmOrderItem::getProductionBatch, bo.getProductionBatch()); + lqw.eq(StringUtils.isNotBlank(bo.getSurfaceTreatment()), CrmOrderItem::getSurfaceTreatment, bo.getSurfaceTreatment()); + lqw.eq(StringUtils.isNotBlank(bo.getEdgeCuttingReq()), CrmOrderItem::getEdgeCuttingReq, bo.getEdgeCuttingReq()); + lqw.eq(StringUtils.isNotBlank(bo.getPackagingReq()), CrmOrderItem::getPackagingReq, bo.getPackagingReq()); + lqw.eq(bo.getWidth() != null, CrmOrderItem::getWidth, bo.getWidth()); + lqw.eq(bo.getThickness() != null, CrmOrderItem::getThickness, bo.getThickness()); + lqw.eq(StringUtils.isNotBlank(bo.getPurpose()), CrmOrderItem::getPurpose, bo.getPurpose()); return lqw; } 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 f3544b77..71877a71 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 @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.klp.common.utils.StringUtils; import com.klp.crm.domain.vo.CrmOrderOperationTraceVo; +import com.klp.mapper.WmsCoilContractRelMapper; import com.klp.system.service.ISysUserService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -17,6 +18,11 @@ import com.klp.crm.domain.vo.CrmOrderVo; import com.klp.crm.domain.CrmOrder; import com.klp.crm.mapper.CrmOrderMapper; import com.klp.crm.service.ICrmOrderService; +import com.klp.domain.WmsCoilContractRel; +import com.klp.domain.bo.WmsMaterialCoilBo; +import com.klp.domain.vo.WmsMaterialCoilVo; +import com.klp.service.IWmsCoilContractRelService; +import com.klp.service.IWmsMaterialCoilService; import java.util.*; import java.util.stream.Collectors; @@ -35,6 +41,10 @@ public class CrmOrderServiceImpl implements ICrmOrderService { private final ISysUserService userService; + private final WmsCoilContractRelMapper coilContractRelMapper; + + private final IWmsMaterialCoilService materialCoilService; + /** * 查询正式订单主 */ @@ -43,6 +53,19 @@ public class CrmOrderServiceImpl implements ICrmOrderService { return baseMapper.selectVoById(orderId); } + /** + * 根据ID列表查询正式订单 + */ + @Override + public List queryByIds(List orderIds) { + if (orderIds == null || orderIds.isEmpty()) { + return new ArrayList<>(); + } + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.in(CrmOrder::getOrderId, orderIds); + return baseMapper.selectVoList(lqw); + } + /** * 查询正式订单主列表 */ @@ -76,6 +99,57 @@ public class CrmOrderServiceImpl implements ICrmOrderService { } } } + + // 查询订单关联的钢卷ID列表 + List contractIds = records.stream() + .map(CrmOrderVo::getOrderId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + + if (!contractIds.isEmpty()) { + // 批量查询钢卷与合同关联关系 + LambdaQueryWrapper coilQw = Wrappers.lambdaQuery(); + coilQw.in(WmsCoilContractRel::getContractId, contractIds); + coilQw.eq(WmsCoilContractRel::getDelFlag, 0); + List coilRels = coilContractRelMapper.selectList(coilQw); + + // 按contractId分组,收集coilId列表 + Map> coilIdMap = coilRels.stream() + .filter(rel -> rel.getContractId() != null && rel.getCoilId() != null) + .collect(Collectors.groupingBy( + WmsCoilContractRel::getContractId, + Collectors.mapping(WmsCoilContractRel::getCoilId, Collectors.toList()) + )); + + // 查询所有相关钢卷的详细信息 + Set allCoilIds = coilIdMap.values().stream() + .flatMap(List::stream) + .collect(Collectors.toSet()); + + Map coilVoMap = Collections.emptyMap(); + if (!allCoilIds.isEmpty()) { + WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + coilBo.setCoilIds(allCoilIds.stream().map(String::valueOf).collect(Collectors.joining(","))); + List allCoils = materialCoilService.queryList(coilBo); + coilVoMap = allCoils.stream() + .collect(Collectors.toMap(WmsMaterialCoilVo::getCoilId, c -> c, (a, b) -> a)); + } + + // 设置到每个订单的coilIds和coilList字段 + for (CrmOrderVo vo : records) { + if (vo.getOrderId() != null && coilIdMap.containsKey(vo.getOrderId())) { + List coilIdList = coilIdMap.get(vo.getOrderId()); + // 设置coilList(钢卷详细信息列表) + List coilList = coilIdList.stream() + .map(coilVoMap::get) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + vo.setCoilList(coilList); + } + } + } + return TableDataInfo.build(result); } @@ -89,7 +163,10 @@ public class CrmOrderServiceImpl implements ICrmOrderService { .or().like("co.audit_user", bo.getKeyword()) .or().like("co.contract_code", bo.getKeyword()) .or().like("co.annex_files", bo.getKeyword()) - .or().like("co.remark", bo.getKeyword())); + .or().like("co.remark", bo.getKeyword()) + .or().like("co.contract_name", bo.getKeyword()) + .or().like("co.supplier", bo.getKeyword()) + .or().like("co.customer", bo.getKeyword())); } qw.eq(StringUtils.isNotBlank(bo.getOrderCode()), "co.order_code", bo.getOrderCode()); qw.eq(bo.getOrderType() != null, "co.order_type", bo.getOrderType()); @@ -104,6 +181,31 @@ public class CrmOrderServiceImpl implements ICrmOrderService { qw.eq(bo.getFinanceStatus() != null, "co.finance_status", bo.getFinanceStatus()); qw.eq(bo.getUnpaidAmount() != null, "co.unpaid_amount", bo.getUnpaidAmount()); qw.like(StringUtils.isNotBlank(bo.getContractCode()), "co.contract_code", bo.getContractCode()); + qw.like(StringUtils.isNotBlank(bo.getContractName()), "co.contract_name", bo.getContractName()); + qw.like(StringUtils.isNotBlank(bo.getSupplier()), "co.supplier", bo.getSupplier()); + qw.like(StringUtils.isNotBlank(bo.getCustomer()), "co.customer", bo.getCustomer()); + qw.eq(bo.getSignTime() != null, "co.sign_time", bo.getSignTime()); + qw.like(StringUtils.isNotBlank(bo.getSignLocation()), "co.sign_location", bo.getSignLocation()); + qw.eq(StringUtils.isNotBlank(bo.getProductContent()), "co.product_content", bo.getProductContent()); + qw.eq(StringUtils.isNotBlank(bo.getContractContent()), "co.contract_content", bo.getContractContent()); + qw.like(StringUtils.isNotBlank(bo.getSupplierAddress()), "co.supplier_address", bo.getSupplierAddress()); + qw.like(StringUtils.isNotBlank(bo.getSupplierPhone()), "co.supplier_phone", bo.getSupplierPhone()); + qw.like(StringUtils.isNotBlank(bo.getSupplierBank()), "co.supplier_bank", bo.getSupplierBank()); + qw.like(StringUtils.isNotBlank(bo.getSupplierAccount()), "co.supplier_account", bo.getSupplierAccount()); + qw.like(StringUtils.isNotBlank(bo.getSupplierTaxNo()), "co.supplier_tax_no", bo.getSupplierTaxNo()); + qw.like(StringUtils.isNotBlank(bo.getCustomerAddress()), "co.customer_address", bo.getCustomerAddress()); + qw.like(StringUtils.isNotBlank(bo.getCustomerPhone()), "co.customer_phone", bo.getCustomerPhone()); + qw.like(StringUtils.isNotBlank(bo.getCustomerBank()), "co.customer_bank", bo.getCustomerBank()); + qw.like(StringUtils.isNotBlank(bo.getCustomerAccount()), "co.customer_account", bo.getCustomerAccount()); + qw.like(StringUtils.isNotBlank(bo.getCustomerTaxNo()), "co.customer_tax_no", bo.getCustomerTaxNo()); + qw.like(StringUtils.isNotBlank(bo.getTechAnnex()), "co.tech_annex", bo.getTechAnnex()); + qw.like(StringUtils.isNotBlank(bo.getBusinessAnnex()), "co.business_annex", bo.getBusinessAnnex()); + qw.like(StringUtils.isNotBlank(bo.getProductionSchedule()), "co.production_schedule", bo.getProductionSchedule()); + qw.like(StringUtils.isNotBlank(bo.getUnitPriceRemark()), "co.unit_price_remark", bo.getUnitPriceRemark()); + qw.eq(bo.getDepositPayable() != null, "co.deposit_payable", bo.getDepositPayable()); + qw.eq(bo.getDepositPaid() != null, "co.deposit_paid", bo.getDepositPaid()); + qw.eq(bo.getDepositRatio() != null, "co.deposit_ratio", bo.getDepositRatio()); + qw.eq(bo.getStatus() != null, "co.status", bo.getStatus()); qw.eq(bo.getContractId() != null, "co.contract_id", bo.getContractId()); qw.like(StringUtils.isNotBlank(bo.getAnnexFiles()), "co.annex_files", bo.getAnnexFiles()); //逻辑删除 @@ -139,6 +241,31 @@ public class CrmOrderServiceImpl implements ICrmOrderService { lqw.eq(bo.getFinanceStatus() != null, CrmOrder::getFinanceStatus, bo.getFinanceStatus()); lqw.eq(bo.getUnpaidAmount() != null, CrmOrder::getUnpaidAmount, bo.getUnpaidAmount()); lqw.like(StringUtils.isNotBlank(bo.getContractCode()), CrmOrder::getContractCode, bo.getContractCode()); + lqw.like(StringUtils.isNotBlank(bo.getContractName()), CrmOrder::getContractName, bo.getContractName()); + lqw.like(StringUtils.isNotBlank(bo.getSupplier()), CrmOrder::getSupplier, bo.getSupplier()); + lqw.like(StringUtils.isNotBlank(bo.getCustomer()), CrmOrder::getCustomer, bo.getCustomer()); + lqw.eq(bo.getSignTime() != null, CrmOrder::getSignTime, bo.getSignTime()); + lqw.like(StringUtils.isNotBlank(bo.getSignLocation()), CrmOrder::getSignLocation, bo.getSignLocation()); + lqw.eq(StringUtils.isNotBlank(bo.getProductContent()), CrmOrder::getProductContent, bo.getProductContent()); + lqw.eq(StringUtils.isNotBlank(bo.getContractContent()), CrmOrder::getContractContent, bo.getContractContent()); + lqw.like(StringUtils.isNotBlank(bo.getSupplierAddress()), CrmOrder::getSupplierAddress, bo.getSupplierAddress()); + lqw.like(StringUtils.isNotBlank(bo.getSupplierPhone()), CrmOrder::getSupplierPhone, bo.getSupplierPhone()); + lqw.like(StringUtils.isNotBlank(bo.getSupplierBank()), CrmOrder::getSupplierBank, bo.getSupplierBank()); + lqw.like(StringUtils.isNotBlank(bo.getSupplierAccount()), CrmOrder::getSupplierAccount, bo.getSupplierAccount()); + lqw.like(StringUtils.isNotBlank(bo.getSupplierTaxNo()), CrmOrder::getSupplierTaxNo, bo.getSupplierTaxNo()); + lqw.like(StringUtils.isNotBlank(bo.getCustomerAddress()), CrmOrder::getCustomerAddress, bo.getCustomerAddress()); + lqw.like(StringUtils.isNotBlank(bo.getCustomerPhone()), CrmOrder::getCustomerPhone, bo.getCustomerPhone()); + lqw.like(StringUtils.isNotBlank(bo.getCustomerBank()), CrmOrder::getCustomerBank, bo.getCustomerBank()); + lqw.like(StringUtils.isNotBlank(bo.getCustomerAccount()), CrmOrder::getCustomerAccount, bo.getCustomerAccount()); + lqw.like(StringUtils.isNotBlank(bo.getCustomerTaxNo()), CrmOrder::getCustomerTaxNo, bo.getCustomerTaxNo()); + lqw.like(StringUtils.isNotBlank(bo.getTechAnnex()), CrmOrder::getTechAnnex, bo.getTechAnnex()); + lqw.like(StringUtils.isNotBlank(bo.getBusinessAnnex()), CrmOrder::getBusinessAnnex, bo.getBusinessAnnex()); + lqw.like(StringUtils.isNotBlank(bo.getProductionSchedule()), CrmOrder::getProductionSchedule, bo.getProductionSchedule()); + lqw.like(StringUtils.isNotBlank(bo.getUnitPriceRemark()), CrmOrder::getUnitPriceRemark, bo.getUnitPriceRemark()); + lqw.eq(bo.getDepositPayable() != null, CrmOrder::getDepositPayable, bo.getDepositPayable()); + lqw.eq(bo.getDepositPaid() != null, CrmOrder::getDepositPaid, bo.getDepositPaid()); + lqw.eq(bo.getDepositRatio() != null, CrmOrder::getDepositRatio, bo.getDepositRatio()); + lqw.eq(bo.getStatus() != null, CrmOrder::getStatus, bo.getStatus()); lqw.eq(bo.getContractId() != null, CrmOrder::getContractId, bo.getContractId()); lqw.like(StringUtils.isNotBlank(bo.getAnnexFiles()), CrmOrder::getAnnexFiles, bo.getAnnexFiles()); return lqw; diff --git a/klp-crm/src/main/resources/mapper/CrmOrderItemMapper.xml b/klp-crm/src/main/resources/mapper/CrmOrderItemMapper.xml index dfeb51b2..5cbed499 100644 --- a/klp-crm/src/main/resources/mapper/CrmOrderItemMapper.xml +++ b/klp-crm/src/main/resources/mapper/CrmOrderItemMapper.xml @@ -23,6 +23,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + + @@ -50,6 +56,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" customizer, shipper, production_batch, + surface_treatment, + edge_cutting_req, + packaging_req, + width, + thickness, + purpose, create_by, create_time, update_by, diff --git a/klp-crm/src/main/resources/mapper/CrmOrderMapper.xml b/klp-crm/src/main/resources/mapper/CrmOrderMapper.xml index ffc1b182..ae849e39 100644 --- a/klp-crm/src/main/resources/mapper/CrmOrderMapper.xml +++ b/klp-crm/src/main/resources/mapper/CrmOrderMapper.xml @@ -20,6 +20,31 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + + + + + + + + + + + + + + + + + + + + + @@ -45,6 +70,31 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" co.unpaid_amount AS unpaidAmount, co.remark, co.contract_code AS contractCode, + co.contract_name AS contractName, + co.supplier, + co.customer, + co.sign_time AS signTime, + co.sign_location AS signLocation, + co.product_content AS productContent, + co.contract_content AS contractContent, + co.supplier_address AS supplierAddress, + co.supplier_phone AS supplierPhone, + co.supplier_bank AS supplierBank, + co.supplier_account AS supplierAccount, + co.supplier_tax_no AS supplierTaxNo, + co.customer_address AS customerAddress, + co.customer_phone AS customerPhone, + co.customer_bank AS customerBank, + co.customer_account AS customerAccount, + co.customer_tax_no AS customerTaxNo, + co.tech_annex AS techAnnex, + co.business_annex AS businessAnnex, + co.production_schedule AS productionSchedule, + co.unit_price_remark AS unitPriceRemark, + co.deposit_payable AS depositPayable, + co.deposit_paid AS depositPaid, + co.deposit_ratio AS depositRatio, + co.status, co.contract_id AS contractId, co.annex_files AS annexFiles, co.create_by AS createBy, @@ -79,6 +129,31 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" co.unpaid_amount AS unpaidAmount, co.remark, co.contract_code AS contractCode, + co.contract_name AS contractName, + co.supplier, + co.customer, + co.sign_time AS signTime, + co.sign_location AS signLocation, + co.product_content AS productContent, + co.contract_content AS contractContent, + co.supplier_address AS supplierAddress, + co.supplier_phone AS supplierPhone, + co.supplier_bank AS supplierBank, + co.supplier_account AS supplierAccount, + co.supplier_tax_no AS supplierTaxNo, + co.customer_address AS customerAddress, + co.customer_phone AS customerPhone, + co.customer_bank AS customerBank, + co.customer_account AS customerAccount, + co.customer_tax_no AS customerTaxNo, + co.tech_annex AS techAnnex, + co.business_annex AS businessAnnex, + co.production_schedule AS productionSchedule, + co.unit_price_remark AS unitPriceRemark, + co.deposit_payable AS depositPayable, + co.deposit_paid AS depositPaid, + co.deposit_ratio AS depositRatio, + co.status, co.contract_id AS contractId, co.annex_files AS annexFiles, co.create_by AS createBy, diff --git a/klp-ui/src/api/crm/order.js b/klp-ui/src/api/crm/order.js index b8a918d1..5e80b519 100644 --- a/klp-ui/src/api/crm/order.js +++ b/klp-ui/src/api/crm/order.js @@ -52,3 +52,14 @@ export function listOrderPackaging(orderId) { method: 'get', }) } + +/** + * 查询今日订单 + */ +export function listTodayOrder(query) { + return request({ + url: '/crm/order/daily', + method: 'get', + params: query + }) +} diff --git a/klp-ui/src/api/wms/annealOperateEvent.js b/klp-ui/src/api/wms/annealOperateEvent.js new file mode 100644 index 00000000..0768be8b --- /dev/null +++ b/klp-ui/src/api/wms/annealOperateEvent.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询退火操作事件列表 +export function listAnnealOperateEvent(query) { + return request({ + url: '/wms/annealOperateEvent/list', + method: 'get', + params: query + }) +} + +// 查询退火操作事件详细 +export function getAnnealOperateEvent(eventId) { + return request({ + url: '/wms/annealOperateEvent/' + eventId, + method: 'get' + }) +} + +// 新增退火操作事件 +export function addAnnealOperateEvent(data) { + return request({ + url: '/wms/annealOperateEvent', + method: 'post', + data: data + }) +} + +// 修改退火操作事件 +export function updateAnnealOperateEvent(data) { + return request({ + url: '/wms/annealOperateEvent', + method: 'put', + data: data + }) +} + +// 删除退火操作事件 +export function delAnnealOperateEvent(eventId) { + return request({ + url: '/wms/annealOperateEvent/' + eventId, + method: 'delete' + }) +} diff --git a/klp-ui/src/api/wms/coil.js b/klp-ui/src/api/wms/coil.js index 2decfe64..1c64a98e 100644 --- a/klp-ui/src/api/wms/coil.js +++ b/klp-ui/src/api/wms/coil.js @@ -389,4 +389,12 @@ export function listTypeErrorCoil() { method: 'get', timeout: 600000 }) +} + +export function getCoilStatisticsList(params) { + return request({ + url: '/wms/materialCoil/statisticsList', + method: 'get', + params, + }) } \ No newline at end of file diff --git a/klp-ui/src/api/wms/coilContractRel.js b/klp-ui/src/api/wms/coilContractRel.js new file mode 100644 index 00000000..c1ddfae3 --- /dev/null +++ b/klp-ui/src/api/wms/coilContractRel.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询钢卷与合同关联关系列表 +export function listCoilContractRel(query) { + return request({ + url: '/wms/coilContractRel/list', + method: 'get', + params: query + }) +} + +// 查询钢卷与合同关联关系详细 +export function getCoilContractRel(relId) { + return request({ + url: '/wms/coilContractRel/' + relId, + method: 'get' + }) +} + +// 新增钢卷与合同关联关系 +export function addCoilContractRel(data) { + return request({ + url: '/wms/coilContractRel', + method: 'post', + data: data + }) +} + +// 修改钢卷与合同关联关系 +export function updateCoilContractRel(data) { + return request({ + url: '/wms/coilContractRel', + method: 'put', + data: data + }) +} + +// 删除钢卷与合同关联关系 +export function delCoilContractRel(relId) { + return request({ + url: '/wms/coilContractRel/' + relId, + method: 'delete' + }) +} diff --git a/klp-ui/src/api/wms/pendingAction.js b/klp-ui/src/api/wms/pendingAction.js index d6d17579..bd07b494 100644 --- a/klp-ui/src/api/wms/pendingAction.js +++ b/klp-ui/src/api/wms/pendingAction.js @@ -122,10 +122,13 @@ export function startProcess(actionId) { } // 完成操作 -export function completeAction(actionId) { +export function completeAction(actionId, newCoilIds) { return request({ url: `/wms/coilPendingAction/complete/${actionId}`, - method: 'put' + method: 'put', + params: { + newCoilIds: newCoilIds || '-' + } }) } diff --git a/klp-ui/src/components/CoilSelector/index.vue b/klp-ui/src/components/CoilSelector/index.vue index 14309f0e..ddde3b6b 100644 --- a/klp-ui/src/components/CoilSelector/index.vue +++ b/klp-ui/src/components/CoilSelector/index.vue @@ -21,13 +21,7 @@ @close="handleClose" append-to-body :fullscreen="orderBy"> - - + @@ -35,23 +29,29 @@ - - + + + + + + + - + - + - + - + @@ -68,8 +68,8 @@ - + 搜索 重置 显示钢卷地图 + 显示订单详情 @@ -115,8 +117,15 @@ - +
+ + 总净重:{{ coilTrimStatistics.total_net_weight || 0 }}t + + + +
+
@@ -163,12 +172,18 @@ :id="selectedNodeId" :canToggle="false" :canRelease="false" />
+ + +
+ +
+
\ No newline at end of file diff --git a/klp-ui/src/components/KLPService/Renderer/CoilCard.vue b/klp-ui/src/components/KLPService/Renderer/CoilCard.vue index 7cf97a37..e14ad7ef 100644 --- a/klp-ui/src/components/KLPService/Renderer/CoilCard.vue +++ b/klp-ui/src/components/KLPService/Renderer/CoilCard.vue @@ -35,6 +35,10 @@
+
+ 实际库区: + {{ coil.actualWarehouseName }} +
质量状态: {{ coil.qualityStatus }} @@ -136,8 +140,8 @@ {{ coil.warehouseName || '—' }}
- 库区: - {{ coil.actualWarehouseName || '—' + 规格: + {{ coil.specification || '—' }}
diff --git a/klp-ui/src/components/KLPService/WarehouseSelect/index.vue b/klp-ui/src/components/KLPService/WarehouseSelect/index.vue index fba1f5da..20a6f59e 100644 --- a/klp-ui/src/components/KLPService/WarehouseSelect/index.vue +++ b/klp-ui/src/components/KLPService/WarehouseSelect/index.vue @@ -74,8 +74,10 @@ export default { console.log('仓库API返回数据:', response); const data = response.data || []; console.log('处理后的数据:', data); - this.warehouseOptions = this.buildTreeOptions(data); - console.log('构建的树形选项:', this.warehouseOptions); + let options = this.buildTreeOptions(data); + options = this.sortOptionsByUsage(options); + this.warehouseOptions = options; + console.log('构建并排序后的树形选项:', this.warehouseOptions); }).catch(error => { console.error("加载仓库选项失败:", error); this.warehouseOptions = []; @@ -106,7 +108,36 @@ export default { return options; }, + getWarehouseUsage() { + try { + const usage = localStorage.getItem('warehouseUsage'); + return usage ? JSON.parse(usage) : {}; + } catch (error) { + console.error('获取仓库使用记录失败:', error); + return {}; + } + }, + updateWarehouseUsage(warehouseId) { + try { + const usage = this.getWarehouseUsage(); + usage[warehouseId] = (usage[warehouseId] || 0) + 1; + localStorage.setItem('warehouseUsage', JSON.stringify(usage)); + } catch (error) { + console.error('更新仓库使用记录失败:', error); + } + }, + sortOptionsByUsage(options) { + const usage = this.getWarehouseUsage(); + return options.sort((a, b) => { + const usageA = usage[a.warehouseId] || 0; + const usageB = usage[b.warehouseId] || 0; + return usageB - usageA; + }); + }, onChange(val) { + if (val) { + this.updateWarehouseUsage(val); + } this.$emit('input', val); this.$emit('change', val); } diff --git a/klp-ui/src/components/KLPService/WarehouseTree/index.vue b/klp-ui/src/components/KLPService/WarehouseTree/index.vue index 0f57bf4d..a15e8610 100644 --- a/klp-ui/src/components/KLPService/WarehouseTree/index.vue +++ b/klp-ui/src/components/KLPService/WarehouseTree/index.vue @@ -7,7 +7,6 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/klp-ui/src/views/crm/contract/components/OrderDetail.vue b/klp-ui/src/views/crm/contract/components/OrderDetail.vue new file mode 100644 index 00000000..910192c0 --- /dev/null +++ b/klp-ui/src/views/crm/contract/components/OrderDetail.vue @@ -0,0 +1,307 @@ + + + + + \ No newline at end of file diff --git a/klp-ui/src/views/crm/contract/index.vue b/klp-ui/src/views/crm/contract/index.vue index 01a7a656..66c6958c 100644 --- a/klp-ui/src/views/crm/contract/index.vue +++ b/klp-ui/src/views/crm/contract/index.vue @@ -2,13 +2,12 @@
- +
-
+
@@ -24,17 +23,12 @@
- +
- +
@@ -48,8 +42,8 @@ - - + + @@ -59,13 +53,27 @@ - + + + + + + + + + + + + + + @@ -73,9 +81,9 @@ - + @@ -107,7 +115,8 @@ - + @@ -142,6 +151,10 @@ + + +