diff --git a/src/main/java/com/qs/serve/common/model/enums/BizType.java b/src/main/java/com/qs/serve/common/model/enums/BizType.java index 21ea78b2..deb1ddac 100644 --- a/src/main/java/com/qs/serve/common/model/enums/BizType.java +++ b/src/main/java/com/qs/serve/common/model/enums/BizType.java @@ -45,6 +45,7 @@ public enum BizType { LEAVE("离职"), EXPORT("导出"), + SUBMIT("提交"), RESET("重置"); diff --git a/src/main/java/com/qs/serve/modules/oms/controller/OmsOrderExpiredController.java b/src/main/java/com/qs/serve/modules/oms/controller/OmsOrderExpiredController.java new file mode 100644 index 00000000..dccad509 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/controller/OmsOrderExpiredController.java @@ -0,0 +1,40 @@ +package com.qs.serve.modules.oms.controller; + +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.enums.BizType; +import com.qs.serve.common.model.enums.SystemModule; +import com.qs.serve.modules.oms.entity.OmsOrder; +import com.qs.serve.modules.oms.service.OmsOrderOptionsService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author YenHex + * @since 2024/8/12 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("oms/orderExpired") +public class OmsOrderExpiredController { + + OmsOrderOptionsService omsOrderOptionsService; + + /** + * 提交临期订单 + * @param id 订单ID + * @return + */ + @PostMapping("submit") + @SysLog(module = SystemModule.BIZ, title = "临期订单", biz = BizType.SUBMIT) + public R submit(@PathVariable("id") Long id){ + omsOrderOptionsService.submitExpiredOrder(id+""); + return R.ok(); + } + +} diff --git a/src/main/java/com/qs/serve/modules/oms/entity/OmsOrder.java b/src/main/java/com/qs/serve/modules/oms/entity/OmsOrder.java index 775e5a78..7f5d35d0 100644 --- a/src/main/java/com/qs/serve/modules/oms/entity/OmsOrder.java +++ b/src/main/java/com/qs/serve/modules/oms/entity/OmsOrder.java @@ -45,6 +45,9 @@ public class OmsOrder implements Serializable { private String orderSource; + /** OA审批状态,订单审批状态 */ + private Integer orderCheckState; + /** 供应商ID */ @NotNull(message = "供应商ID不能为空") private Long supplierId; diff --git a/src/main/java/com/qs/serve/modules/oms/service/OmsOrderItemService.java b/src/main/java/com/qs/serve/modules/oms/service/OmsOrderItemService.java index 675ded42..13fbfda1 100644 --- a/src/main/java/com/qs/serve/modules/oms/service/OmsOrderItemService.java +++ b/src/main/java/com/qs/serve/modules/oms/service/OmsOrderItemService.java @@ -3,6 +3,8 @@ package com.qs.serve.modules.oms.service; import com.baomidou.mybatisplus.extension.service.IService; import com.qs.serve.modules.oms.entity.OmsOrderItem; +import java.util.List; + /** * 订单明细 服务接口 * @author YenHex @@ -10,5 +12,7 @@ import com.qs.serve.modules.oms.entity.OmsOrderItem; */ public interface OmsOrderItemService extends IService { + List listByOrderId(Long orderId); + } diff --git a/src/main/java/com/qs/serve/modules/oms/service/OmsOrderOptionsService.java b/src/main/java/com/qs/serve/modules/oms/service/OmsOrderOptionsService.java new file mode 100644 index 00000000..005e2045 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/service/OmsOrderOptionsService.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.oms.service; + +import com.qs.serve.modules.seeyon.service.SeeYonOperationService; + +/** + * @author YenHex + * @since 2024/8/12 + */ +public interface OmsOrderOptionsService extends SeeYonOperationService { + + /** + * 提交临期品订单 + * @param orderId + * @return + */ + Object submitExpiredOrder(String orderId); + +} diff --git a/src/main/java/com/qs/serve/modules/oms/service/OmsOrderService.java b/src/main/java/com/qs/serve/modules/oms/service/OmsOrderService.java index 6fb46b09..2f2169c6 100644 --- a/src/main/java/com/qs/serve/modules/oms/service/OmsOrderService.java +++ b/src/main/java/com/qs/serve/modules/oms/service/OmsOrderService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.qs.serve.common.model.dto.SimpleKeyValue; import com.qs.serve.modules.goods.entity.GoodsCategoryRule; import com.qs.serve.modules.oms.entity.OmsOrder; +import com.qs.serve.modules.oms.entity.OmsOrderItem; import com.qs.serve.modules.oms.entity.bo.*; import com.qs.serve.modules.oms.entity.vo.OmsConfirmOrderResult; import com.qs.serve.modules.oms.entity.vo.OmsSpuAssesInfo; @@ -88,5 +89,19 @@ public interface OmsOrderService extends IService { */ List handleCategoryRule(List skuIds,GoodsCategoryRule categoryRule); + + /** + * 拦截规则 + * @param categoryRule + * @param orderItems + */ + public void handleCategoryRule(GoodsCategoryRule categoryRule, List orderItems); + + /** + * 更新订单项特殊价 + * @param cusCode + * @param orderItemList + */ + public void updateCusPrice(String cusCode, List orderItemList); } diff --git a/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderItemServiceImpl.java b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderItemServiceImpl.java index ff9e502c..65424c12 100644 --- a/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderItemServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderItemServiceImpl.java @@ -1,5 +1,6 @@ package com.qs.serve.modules.oms.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -8,6 +9,8 @@ import com.qs.serve.modules.oms.entity.OmsOrderItem; import com.qs.serve.modules.oms.service.OmsOrderItemService; import com.qs.serve.modules.oms.mapper.OmsOrderItemMapper; +import java.util.List; + /** * 订单明细 服务实现类 * @author YenHex @@ -18,5 +21,10 @@ import com.qs.serve.modules.oms.mapper.OmsOrderItemMapper; @AllArgsConstructor public class OmsOrderItemServiceImpl extends ServiceImpl implements OmsOrderItemService { + @Override + public List listByOrderId(Long orderId) { + return this.list(new LambdaQueryWrapper().eq(OmsOrderItem::getOrderId,orderId)); + } + } diff --git a/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderOptionsServiceImpl.java b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderOptionsServiceImpl.java new file mode 100644 index 00000000..f1314f5d --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderOptionsServiceImpl.java @@ -0,0 +1,152 @@ +package com.qs.serve.modules.oms.service.impl; + +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.AuthContextUtils; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; +import com.qs.serve.modules.goods.entity.GoodsCategoryRule; +import com.qs.serve.modules.goods.entity.GoodsImminentBatch; +import com.qs.serve.modules.goods.mapper.GoodsCategoryRuleMapper; +import com.qs.serve.modules.goods.service.GoodsImminentBatchService; +import com.qs.serve.modules.oms.entity.OmsOrder; +import com.qs.serve.modules.oms.entity.OmsOrderItem; +import com.qs.serve.modules.oms.service.OmsOrderItemService; +import com.qs.serve.modules.oms.service.OmsOrderOptionsService; +import com.qs.serve.modules.oms.service.OmsOrderService; +import com.qs.serve.modules.oms.utils.OmsOrderUtil; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * 订单审批操作类 + * @author YenHex + * @since 2024/8/12 + */ +@Slf4j +@Service +@AllArgsConstructor +public class OmsOrderOptionsServiceImpl implements OmsOrderOptionsService { + + private final GoodsImminentBatchService goodsImminentBatchService; + private final OmsOrderService omsOrderService; + private final OmsOrderItemService omsOrderItemService; + + private final GoodsCategoryRuleMapper goodsCategoryRuleMapper; + private BmsSupplierAddressService bmsSupplierAddressService; + + private BmsSupplierMapper bmsSupplierMapper; + private BmsRegionMapper bmsRegionMapper; + + @Override + public Object submitExpiredOrder(String orderId) { + OmsOrder omsOrder = omsOrderService.getById(orderId); + String userId = AuthContextUtils.getSysUserId(); + if (omsOrder == null) { + Assert.throwEx("订单不存在或被移除"); + } + if (!omsOrder.getUserId().equals(userId)) { + Assert.throwEx("非制单人无法下单"); + } + // 非临期品不走当前流程 + if(!omsOrder.getOrderType().equals(3)){ + Assert.throwEx("该功能只针对临期品订单"); + } + omsOrderService.checkMsOrderStatus(omsOrder); + if (!omsOrder.getStatus().equals(0) && !omsOrder.getStatus().equals(6)) { + Assert.throwEx("订单状态不支持下单"); + } + List orderItemList = omsOrderItemService.listByOrderId(Long.parseLong(orderId)); + + // 加成订单项合法性 + OmsOrderUtil.checkOrderItemValues(orderItemList); + + //下单前规则拦截 + GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(omsOrder.getBrandRuleId()); + omsOrderService.handleCategoryRule(categoryRule, orderItemList); + + List imminentBatches = new ArrayList<>(); + if (omsOrder.getOrderType().equals(3)) { + //临期品相关拦截 + for (OmsOrderItem orderItem : orderItemList) { + if (orderItem.getSkuBatchId() == null) { + Assert.throwEx(orderItem.getSkuCode() + " 单品无效或过期"); + } + GoodsImminentBatch imminentBatch = goodsImminentBatchService.getById(orderItem.getSkuBatchId()); + if (imminentBatch == null) { + Assert.throwEx(orderItem.getSkuCode() + " 单品无效或过期"); + } + int spur = imminentBatch.getQuantity() - imminentBatch.getOrderQuantity(); + if (orderItem.getQuantity() > spur) { + Assert.throwEx(orderItem.getSkuCode() + " 单品库存不足"); + } + imminentBatch.setOrderQuantity(imminentBatch.getOrderQuantity() + orderItem.getQuantity()); + imminentBatches.add(imminentBatch); + } + } + //客户校验 + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(omsOrder.getSupplierAddrId()); + BmsSupplier supplier = bmsSupplierMapper.selectById(omsOrder.getSupplierId()); + if (supplier.getCdOrderFlag().equals(1) && !StringUtils.hasText(omsOrder.getCdOrderRemark())) { + Assert.throwEx("请补充CD单号"); + } + String lastRegionId = supplier.getRegionLast(); + BmsRegion bmsRegion = bmsRegionMapper.selectById(lastRegionId); + if (bmsRegion == null) { + Assert.throwEx("客户档案[" + supplier.getCode() + "]缺失销售区域数据,请联系管理员"); + } + + //更新最新的用户特殊价格 + omsOrderService.updateCusPrice(omsOrder.getSupplierCode(), orderItemList); + + if (imminentBatches.size() > 0) { + goodsImminentBatchService.updateBatchById(imminentBatches); + } + + return null; + } + + @Override + public String getSyFormIdByTargetInfo(TbsAffairCommitBo affairCommit) { + return null; + } + + @Override + public Object doBacked(TbsAffairCommitBo param) { + return null; + } + + @Override + public Object doFinished(TbsAffairCommitBo param) { + return null; + } + + @Override + public Object doRefuse(TbsAffairCommitBo param) { + return null; + } + + @Override + public boolean checkSyFormIdIsNotNull(String targetId) { + return false; + } + + @Override + public void doCommitBacked(String targetId) { + + } + + @Override + public String getTemplateCode() { + return null; + } +} diff --git a/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderServiceImpl.java b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderServiceImpl.java index 3849dfbc..988d7042 100644 --- a/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderServiceImpl.java @@ -31,6 +31,7 @@ import com.qs.serve.modules.oms.mapper.OmsOrderMapper; import com.qs.serve.modules.oms.service.OmsOrderItemService; import com.qs.serve.modules.oms.service.OmsOrderService; import com.qs.serve.modules.oms.service.OmsShoppingCartService; +import com.qs.serve.modules.oms.utils.OmsOrderUtil; import com.qs.serve.modules.sale.entity.SalePlan; import com.qs.serve.modules.sale.entity.SalePlanGoods; import com.qs.serve.modules.sale.mapper.SalePlanGoodsMapper; @@ -393,7 +394,8 @@ public class OmsOrderServiceImpl extends ServiceImpl i * @param categoryRule * @param orderItems */ - private void handleCategoryRule(GoodsCategoryRule categoryRule, List orderItems) { + @Override + public void handleCategoryRule(GoodsCategoryRule categoryRule, List orderItems) { if (categoryRule != null && orderItems.size() > 0) { List cids = Arrays.asList(categoryRule.getBrandIds()); List igcids = null; @@ -899,6 +901,10 @@ public class OmsOrderServiceImpl extends ServiceImpl i if (!omsOrder.getUserId().equals(userId)) { Assert.throwEx("非制单人无法下单"); } + // 非临期品不走当前流程 + if(omsOrder.getOrderType().equals(3)){ + Assert.throwEx("临期品需要审批方式下单"); + } this.checkMsOrderStatus(omsOrder); if (!omsOrder.getStatus().equals(0) && !omsOrder.getStatus().equals(6)) { Assert.throwEx("订单状态不支持下单"); @@ -907,46 +913,13 @@ public class OmsOrderServiceImpl extends ServiceImpl i iteLqw.eq(OmsOrderItem::getOrderId, id); List orderItemList = omsOrderItemService.list(iteLqw); - if (orderItemList.size() < 1) { - Assert.throwEx("空项目不支持下单"); - } - - List imminentBatches = new ArrayList<>(); - - if (omsOrder.getOrderType().equals(3)) { - //临期品相关拦截 - for (OmsOrderItem orderItem : orderItemList) { - if (orderItem.getSkuBatchId() == null) { - Assert.throwEx(orderItem.getSkuCode() + " 单品无效或过期"); - } - GoodsImminentBatch imminentBatch = goodsImminentBatchService.getById(orderItem.getSkuBatchId()); - if (imminentBatch == null) { - Assert.throwEx(orderItem.getSkuCode() + " 单品无效或过期"); - } - int spur = imminentBatch.getQuantity() - imminentBatch.getOrderQuantity(); - if (orderItem.getQuantity() > spur) { - Assert.throwEx(orderItem.getSkuCode() + " 单品库存不足"); - } - imminentBatch.setOrderQuantity(imminentBatch.getOrderQuantity() + orderItem.getQuantity()); - imminentBatches.add(imminentBatch); - } - - } - //拦截相同的skuItem - long countDistinct = orderItemList.stream().map(OmsOrderItem::getSkuId).distinct().count(); - if (orderItemList.size() != countDistinct) { - Assert.throwEx("有重复存货,请检查订单项"); - } - - for (OmsOrderItem orderItem : orderItemList) { - if (orderItem.getQuantity() == null || orderItem.getQuantity() < 1) { - Assert.throwEx("确认订单商品项数量不能为零"); - } - } + // 加成订单项合法性 + OmsOrderUtil.checkOrderItemValues(orderItemList); //下单前规则拦截 GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(omsOrder.getBrandRuleId()); this.handleCategoryRule(categoryRule, orderItemList); + String brands = Arrays.stream(categoryRule.getBrandNames()).collect(Collectors.joining(",")); //List spuIds = orderItemList.stream().map(OmsOrderItem::getSpuId).collect(Collectors.toList()); @@ -959,9 +932,8 @@ public class OmsOrderServiceImpl extends ServiceImpl i //SysDept dept = sysDeptService.getById(sysUser.getDeptId()); //this.toU8Api(omsOrder, sysUser, dept, orderItemList); - //加载关联数据 + //客户校验 BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(omsOrder.getSupplierAddrId()); - String brands = Arrays.stream(categoryRule.getBrandNames()).collect(Collectors.joining(",")); BmsSupplier supplier = bmsSupplierMapper.selectById(omsOrder.getSupplierId()); if (supplier.getCdOrderFlag().equals(1) && !StringUtils.hasText(omsOrder.getCdOrderRemark())) { Assert.throwEx("请补充CD单号"); @@ -972,26 +944,7 @@ public class OmsOrderServiceImpl extends ServiceImpl i Assert.throwEx("客户档案[" + supplier.getCode() + "]缺失销售区域数据,请联系管理员"); } //更新最新的用户特殊价格 - List codes = orderItemList.stream().map(OmsOrderItem::getSkuCode).distinct().collect(Collectors.toList()); - InventoryCusPriceQuery query = new InventoryCusPriceQuery(); - query.setCusCode(omsOrder.getSupplierCode()); - query.setInvCodes(codes); - R res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); - if(res.getStatus().equals(200)) { - List inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); - if(CollectionUtil.isNotEmpty(inventoryCusPrices)){ - assert inventoryCusPrices != null; - for (InventoryCusPrice cusPrice : inventoryCusPrices) { - for (OmsOrderItem orderItem : orderItemList) { - if(orderItem.getSkuCode().equals(cusPrice.getInvCode())){ - orderItem.setCusPrice(cusPrice.getPrice()); - orderItem.setSalesPrice(cusPrice.getPrice()); - omsOrderItemService.updateById(orderItem); - } - } - } - } - } + this.updateCusPrice(omsOrder.getSupplierCode(), orderItemList); //保存到临时表-主表 LocalDateTime nowTime = LocalDateTime.now(); @@ -1081,10 +1034,30 @@ public class OmsOrderServiceImpl extends ServiceImpl i omsOrder.setCheckUserId(AuthContextUtils.getSysUserId()); this.updateById(omsOrder); - if (imminentBatches.size() > 0) { - goodsImminentBatchService.updateBatchById(imminentBatches); - } + } + @Override + public void updateCusPrice(String cusCode, List orderItemList) { + List codes = orderItemList.stream().map(OmsOrderItem::getSkuCode).distinct().collect(Collectors.toList()); + InventoryCusPriceQuery query = new InventoryCusPriceQuery(); + query.setCusCode(cusCode); + query.setInvCodes(codes); + R res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); + if(res.getStatus().equals(200)) { + List inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); + if(CollectionUtil.isNotEmpty(inventoryCusPrices)){ + assert inventoryCusPrices != null; + for (InventoryCusPrice cusPrice : inventoryCusPrices) { + for (OmsOrderItem orderItem : orderItemList) { + if(orderItem.getSkuCode().equals(cusPrice.getInvCode())){ + orderItem.setCusPrice(cusPrice.getPrice()); + orderItem.setSalesPrice(cusPrice.getPrice()); + omsOrderItemService.updateById(orderItem); + } + } + } + } + } } @Override diff --git a/src/main/java/com/qs/serve/modules/oms/utils/OmsOrderUtil.java b/src/main/java/com/qs/serve/modules/oms/utils/OmsOrderUtil.java new file mode 100644 index 00000000..1c1371c3 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/utils/OmsOrderUtil.java @@ -0,0 +1,33 @@ +package com.qs.serve.modules.oms.utils; + +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.oms.entity.OmsOrderItem; +import lombok.experimental.UtilityClass; + +import java.util.List; + +/** + * 封装常用的订单工具类 + * @author YenHex + * @since 2024/8/12 + */ +@UtilityClass +public class OmsOrderUtil { + + public static void checkOrderItemValues(List orderItemList) { + if (orderItemList.size() < 1) { + Assert.throwEx("空项目不支持下单"); + } + //拦截相同的skuItem + long countDistinct = orderItemList.stream().map(OmsOrderItem::getSkuId).distinct().count(); + if (orderItemList.size() != countDistinct) { + Assert.throwEx("有重复存货,请检查订单项"); + } + for (OmsOrderItem orderItem : orderItemList) { + if (orderItem.getQuantity() == null || orderItem.getQuantity() < 1) { + Assert.throwEx("确认订单商品项数量不能为零"); + } + } + } + +} diff --git a/src/main/resources/mapper/seeyon/CommonCheckMapper.xml b/src/main/resources/mapper/seeyon/CommonCheckMapper.xml index 652e0fad..5cf0b779 100644 --- a/src/main/resources/mapper/seeyon/CommonCheckMapper.xml +++ b/src/main/resources/mapper/seeyon/CommonCheckMapper.xml @@ -143,6 +143,30 @@ + + select + 'CheckCostAgree' as target_type, + tbs_cost_todo.id as target_id, + tbs_cost_todo.todo_code as target_code, + tbs_cost_todo.pay_msg as title, + tbs_cost_todo.create_time as `time` + from tbs_cost_todo + where tbs_cost_todo.check_status = 3 + and tbs_cost_todo.create_by = #{query.userId} + and tbs_cost_todo.del_flag = 0 + + and tbs_cost_todo.pay_msg like concat('%',#{query.title},'%') + + + and tbs_cost_todo.todo_code like concat('%',#{query.targetCode},'%') + + + and tbs_cost_todo.create_time >= #{query.startDate} + + + and tbs_cost_todo.create_time <= #{query.endDate} + + select @@ -343,6 +367,28 @@ from vtb_verification_batch where vtb_verification_batch.vtb_batch_status = 3 and vtb_verification_batch.user_id = #{query.userId} and vtb_verification_batch.del_flag = 0 + + + select + 'CheckCostAgree' as target_type, + tbs_cost_todo.id as target_id + from tbs_cost_todo + where tbs_cost_todo.check_status = 3 + and tbs_cost_todo.create_by = #{query.userId} + and tbs_cost_todo.del_flag = 0 + + and tbs_cost_todo.pay_msg like concat('%',#{query.title},'%') + + + and tbs_cost_todo.todo_code like concat('%',#{query.targetCode},'%') + + + and tbs_cost_todo.create_time >= #{query.startDate} + + + and tbs_cost_todo.create_time <= #{query.endDate} + + select 'CostBill' as target_type,