diff --git a/src/main/java/com/qs/serve/common/framework/mvc/HttpServletRequestFilter.java b/src/main/java/com/qs/serve/common/framework/mvc/HttpServletRequestFilter.java index db032b96..6492549d 100644 --- a/src/main/java/com/qs/serve/common/framework/mvc/HttpServletRequestFilter.java +++ b/src/main/java/com/qs/serve/common/framework/mvc/HttpServletRequestFilter.java @@ -1,15 +1,18 @@ package com.qs.serve.common.framework.mvc; import com.qs.serve.common.config.DevEnvironmentConfig; +import com.qs.serve.common.framework.redis.RedisService; import com.qs.serve.common.framework.security.model.LoginUser; import com.qs.serve.common.util.AuthContextUtils; import com.qs.serve.common.util.DateUtils; import com.qs.serve.common.util.ServletUtils; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; +import javax.annotation.Resource; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; @@ -36,6 +39,8 @@ import java.time.format.DateTimeFormatter; @Order(10000) public class HttpServletRequestFilter implements Filter{ + @Resource + RedisService redisService; @Override public void init(FilterConfig filterConfig) throws ServletException { @@ -92,12 +97,19 @@ public class HttpServletRequestFilter implements Filter{ } } catch (Exception e) {} if(diffTime< 1D){ - log.debug(buffer.toString()); + log.info(buffer.toString()); }else if (diffTime< 20D){ log.warn(buffer.toString()); }else { log.error(buffer.toString()); } + String themeKey = AuthContextUtils.getLockTheme(); + if(StringUtils.hasText(themeKey)){ + log.warn("释放资源key:{}",themeKey); + redisService.remove(themeKey); + } + //释放资源 防止线程池重复利用出现脏数据 + AuthContextUtils.removeThreadLocal(); } @Override diff --git a/src/main/java/com/qs/serve/common/framework/redis/RedisService.java b/src/main/java/com/qs/serve/common/framework/redis/RedisService.java index e054ec96..b4f51e8f 100644 --- a/src/main/java/com/qs/serve/common/framework/redis/RedisService.java +++ b/src/main/java/com/qs/serve/common/framework/redis/RedisService.java @@ -1,5 +1,7 @@ package com.qs.serve.common.framework.redis; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.AuthContextUtils; import lombok.AllArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Primary; @@ -34,6 +36,39 @@ public class RedisService { private StringRedisTemplate stringRedisTemplate; + /** + * 加锁 + * @param theme + * @param id + * @return 是否在锁 + */ + public void throwResLock(String theme,String id){ + String key = "LOCK_RES:"+theme+":"+id; + String value = this.getString(key); + System.out.println("throwResLock:"+value); + String newVal = "lock"; + if(newVal.equals(value)){ + Assert.throwEx("服务正在处理,请稍后再试"); + } + this.set(key,newVal,10,TimeUnit.MINUTES); + String value2 = this.getString(key); + if(!newVal.equals(value2)){ + Assert.throwEx("锁失效"); + } + AuthContextUtils.setLockTheme(key); + } + + /** + * 释放锁 + * @param theme + * @param id + * @return 是否在锁 + */ + public void removeResLock(String theme,String id){ + String key = "LOCK_RES:"+theme+":"+id; + this.remove(key); + } + /** * 写入缓存 diff --git a/src/main/java/com/qs/serve/common/util/AuthContextUtils.java b/src/main/java/com/qs/serve/common/util/AuthContextUtils.java index 9fdcf7fe..c8cd5cb2 100644 --- a/src/main/java/com/qs/serve/common/util/AuthContextUtils.java +++ b/src/main/java/com/qs/serve/common/util/AuthContextUtils.java @@ -26,6 +26,13 @@ public class AuthContextUtils { private final static ThreadLocal THREAD_TENANT = new ThreadLocal<>(); private final static ThreadLocal THREAD_SUPPLIER = new ThreadLocal<>(); + private final static ThreadLocal RES_THEME_LOCK = new ThreadLocal<>(); + + public static void removeThreadLocal(){ + THREAD_TENANT.remove(); + THREAD_SUPPLIER.remove(); + RES_THEME_LOCK.remove(); + } public static String getAppId(){ return getAppId(true); @@ -69,6 +76,11 @@ public class AuthContextUtils { public static String getTenant(){return THREAD_TENANT.get();} + + public static void setLockTheme(String value){RES_THEME_LOCK.set(value);} + + public static String getLockTheme(){return RES_THEME_LOCK.get();} + public static void setSupplierId(String value){ if(value!=null){ try { diff --git a/src/main/java/com/qs/serve/modules/bir/controller/BirActivityCenterGoodsController.java b/src/main/java/com/qs/serve/modules/bir/controller/BirActivityCenterGoodsController.java index c3a7aaf7..47a0ebb9 100644 --- a/src/main/java/com/qs/serve/modules/bir/controller/BirActivityCenterGoodsController.java +++ b/src/main/java/com/qs/serve/modules/bir/controller/BirActivityCenterGoodsController.java @@ -91,7 +91,7 @@ public class BirActivityCenterGoodsController { @GetMapping("/toSyncBirToday") public R toSyncBirEcro2(){ - Long[] ids = new Long[]{0L}; + Long[] ids = new Long[]{}; //List ids = tbsActivityMapper.selectReleaseCostIds(); //Set ids = tbsActivityCenterGoodsMapper.selectUpdateCostApplyIds(); List errIds = new ArrayList<>(); @@ -155,12 +155,12 @@ public class BirActivityCenterGoodsController { public R syncBir(Integer idType){ LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw - .select(TbsCostApply::getId).ne(TbsCostApply::getChargeState,0) - .eq(TbsCostApply::getCancelFlag,0) - .gt(TbsCostApply::getTotalActivity,0) - .ne(TbsCostApply::getTmpState,11) - .le(TbsCostApply::getCreateTime, LocalDate.of(2024,1,1).atStartOfDay()) - .ge(TbsCostApply::getCreateTime, LocalDate.of(2024,2,1).atStartOfDay()) ; + .select(TbsCostApply::getId).in(TbsCostApply::getChargeState,1,2,3,7) + //.eq(TbsCostApply::getCancelFlag,0) + //.ne(TbsCostApply::getTotalActivity,0) + .ne(TbsCostApply::getTmpState,20) + .ge(TbsCostApply::getCreateTime, LocalDate.of(2023,9,1).atStartOfDay()) + .le(TbsCostApply::getCreateTime, LocalDate.of(2024,1,1).atStartOfDay()) ; boolean ex = extracted(lqw); while (!ex){ ex = extracted(lqw); @@ -173,11 +173,13 @@ public class BirActivityCenterGoodsController { if(CollectionUtil.isEmpty(costIds)){ return true; } - for (Long costId : costIds) { + for (int i = 0; i < costIds.size(); i++) { + Long costId = costIds.get(i); centerGoodsService.rebuildBir(Arrays.asList(costId)); tbsCostApplyService.update(new LambdaUpdateWrapper() .eq(TbsCostApply::getId,costId) - .set(TbsCostApply::getTmpState,11)); + .set(TbsCostApply::getTmpState,20)); + log.info("{}/{} {}",i,costIds.size(),costId); } return costIds.size()<100; } diff --git a/src/main/java/com/qs/serve/modules/bir/controller/BirBudgetScheduleController.java b/src/main/java/com/qs/serve/modules/bir/controller/BirBudgetScheduleController.java index dd38e72c..09c5fb49 100644 --- a/src/main/java/com/qs/serve/modules/bir/controller/BirBudgetScheduleController.java +++ b/src/main/java/com/qs/serve/modules/bir/controller/BirBudgetScheduleController.java @@ -2,10 +2,12 @@ package com.qs.serve.modules.bir.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qs.serve.common.model.dto.PageVo; import com.qs.serve.common.model.dto.R; import com.qs.serve.common.util.CollectionUtil; import com.qs.serve.modules.tbs.entity.TbsSchedule; import com.qs.serve.modules.tbs.entity.TbsScheduleItem; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCheckingWithAmount; import com.qs.serve.modules.tbs.entity.dto.TbsBudgetWithAmount; import com.qs.serve.modules.tbs.entity.dto.TbsScheduleItemBudgetIdDto; import com.qs.serve.modules.tbs.entity.dto.TbsScheduleItemWithAmount; @@ -49,6 +51,17 @@ public class BirBudgetScheduleController { return R.ok(scheduleItemWithAmounts); } + /** + * 查询预算审批中的使用情况 + * @param query + * @return + */ + @PostMapping("/budgetCheckingList") + public R> queryBudgetUsingList(@RequestBody TbsScheduleItemSearch query){ + query.initCenterCombo(); + return R.byPageHelperList(scheduleItemBudgetService.listBudgetCheckingAmount(query)); + } + /** * 查询周期使用情况 * @param query diff --git a/src/main/java/com/qs/serve/modules/bir/controller/BirRoiRateController.java b/src/main/java/com/qs/serve/modules/bir/controller/BirRoiRateController.java index 6dc4ae65..20c9cad5 100644 --- a/src/main/java/com/qs/serve/modules/bir/controller/BirRoiRateController.java +++ b/src/main/java/com/qs/serve/modules/bir/controller/BirRoiRateController.java @@ -1,15 +1,11 @@ package com.qs.serve.modules.bir.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.qs.serve.common.model.annotation.RepeatSubmit; -import com.qs.serve.common.model.annotation.SysLog; -import com.qs.serve.common.model.dto.PageVo; 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.common.util.*; -import com.qs.serve.modules.bir.entity.BirBaseActivity; +import com.qs.serve.modules.bir.entity.so.BirBudgetTargetSo; +import com.qs.serve.modules.bir.entity.vo.BirBudgetTargetVo; import com.qs.serve.modules.bir.entity.so.BirCostRoiSo; import com.qs.serve.modules.bir.entity.vo.*; import com.qs.serve.modules.bir.service.*; @@ -18,7 +14,6 @@ import com.qs.serve.modules.sys.service.SysDictDataService; import com.qs.serve.modules.tbs.common.TbsCenterType; import com.qs.serve.modules.tbs.entity.TbsActivity; import com.qs.serve.modules.tbs.entity.TbsActivityCenter; -import com.qs.serve.modules.tbs.entity.TbsCostApply; import com.qs.serve.modules.tbs.entity.dto.TbsCostSubItem; import com.qs.serve.modules.tbs.mapper.TbsActivityCenterMapper; import com.qs.serve.modules.tbs.mapper.TbsActivityMapper; @@ -26,15 +21,10 @@ import com.qs.serve.modules.tbs.service.TbsBudgetService; import com.qs.serve.modules.tbs.service.TbsCostApplyService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.bind.annotation.*; -import java.math.BigDecimal; -import java.time.LocalDate; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; /** * BI报表 ROI费率 @@ -58,6 +48,7 @@ public class BirRoiRateController { private TbsActivityMapper tbsActivityMapper; private TbsActivityCenterMapper tbsActivityCenterMapper; private BirBaseActivityService birBaseActivityService; + private BirBudgetTargetService birBudgetTargetService; /** * 测试 @@ -149,6 +140,18 @@ public class BirRoiRateController { return R.ok(vo); } + /** + * 获取费率 + * @param query + * @return + */ + @RepeatSubmit + @PostMapping("/costYearMonthV2") + public R> getCostRoiOfYearMonthV2(@RequestBody BirBudgetTargetSo query){ + List list = birBudgetTargetService.listVo(query); + return R.ok(list); + } + /** * 获取成本中心费率 * @param costApplyId diff --git a/src/main/java/com/qs/serve/modules/bir/entity/BirBudgetTarget.java b/src/main/java/com/qs/serve/modules/bir/entity/BirBudgetTarget.java new file mode 100644 index 00000000..ec0764fa --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bir/entity/BirBudgetTarget.java @@ -0,0 +1,92 @@ +package com.qs.serve.modules.bir.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; + +/** + * 实体类 + * @author YenHex + * @since 2024-06-05 + */ +@Data +@TableName("bir_budget_target") +public class BirBudgetTarget implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 搜索维度:0-客户;1-城市;2-省级经理;3-大区经理 */ + private Integer searchType; + + /** 年份 */ + private Integer yearNum; + + /** 季度 */ + private Integer quarterNum; + + /** 月份 */ + private Integer monthNum; + + /** 销售目标 */ + private BigDecimal targetAmt; + + /** 预算金额 */ + private BigDecimal budgetAmt; + + /** 实际发货 */ + private BigDecimal dispatchAmt; + + /** 去年同期发货 */ + private BigDecimal lastYearDispatchAmt; + + /** 城+省费用 */ + private BigDecimal provinceCityAmt; + + /** 城+省+区费用 */ + private BigDecimal provinceCityRegionAmt; + + /** 实际总费用 */ + private BigDecimal totalRealAmt; + + private String brandId; + + /** 品牌编码 */ + @Length(max = 255,message = "品牌编码长度不能超过255字") + private String brandCode; + + /** 品牌 */ + @Length(max = 255,message = "品牌长度不能超过255字") + private String brandName; + + /** 成本中心类型:saleRegion; bizRegion; costCenter; supplier */ + @Length(max = 255,message = "成本中心类型:saleRegion; bizRegion; costCenter; supplier长度不能超过255字") + private String centerType; + + private String centerId; + + /** 成本中心编码 */ + @Length(max = 255,message = "成本中心编码长度不能超过255字") + private String centerCode; + + /** 成本中心名 */ + @Length(max = 255,message = "成本中心名长度不能超过255字") + private String centerName; + +} + diff --git a/src/main/java/com/qs/serve/modules/bir/entity/so/BirBudgetTargetSo.java b/src/main/java/com/qs/serve/modules/bir/entity/so/BirBudgetTargetSo.java new file mode 100644 index 00000000..e5c1c1a6 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bir/entity/so/BirBudgetTargetSo.java @@ -0,0 +1,71 @@ +package com.qs.serve.modules.bir.entity.so; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author YenHex + * @since 2024/6/4 + */ +@Data +public class BirBudgetTargetSo { + + /** 搜索维度:0-客户;1-城市;2-省级经理;3-大区经理 */ + private Integer loadType; + + /** + * 开始时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime yearMonthStart; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime yearMonthEnd; + + /** + * 业务待定 + */ + private String supplierId; + + /** + * 成本中心 + */ + private List centerList; + + /**品牌 */ + private List brandIds; + + /** + * 减少xml条件 + */ + private Integer selectCenterFlag; + + /**成本中心编码 */ + private List centerIds; + + /**行政区域-成本中心编码 */ + private List bizRegionIds; + + /**销售区域-成本中心编码 */ + private List saleRegionIds; + + /**客户-成本中心编码 */ + private List supplierIds; + + @Data + public static class CostInfo{ + /** + * center,saleRegion,bizRegion,supplier + */ + private String costType; + + private String costId; + } + +} diff --git a/src/main/java/com/qs/serve/modules/bir/entity/vo/BirBudgetTargetVo.java b/src/main/java/com/qs/serve/modules/bir/entity/vo/BirBudgetTargetVo.java new file mode 100644 index 00000000..01297892 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bir/entity/vo/BirBudgetTargetVo.java @@ -0,0 +1,61 @@ +package com.qs.serve.modules.bir.entity.vo; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2024/6/4 + */ +@Data +public class BirBudgetTargetVo { + + /** 年份 */ + private Integer yearNum; + + /** 月份 */ + private Integer monthNum; + + /** 销售目标 */ + private BigDecimal targetAmt; + + /** 预算金额 */ + private BigDecimal budgetAmt; + + /** 实际发货 */ + private BigDecimal dispatchAmt; + + /** 实际总费用 */ + private BigDecimal totalRealAmt; + + /** 去年同期发货 */ + private BigDecimal lastYearDispatchAmt; + + /** 城+省费用 */ + private BigDecimal provinceCityAmt; + + /** 城+省+区费用 */ + private BigDecimal provinceCityRegionAmt; + + + /** 预算费用率 */ + private BigDecimal budgetRate; + + /** 发货达成率 */ + private BigDecimal dispatchRate; + + /** 同期成长率*/ + private BigDecimal lastYearGrowRate; + + /** 城+省费用率 */ + private BigDecimal provinceCityRate; + + /** 城+省+区费用率 */ + private BigDecimal provinceCityRegionRate; + + /** 实际总费用率 */ + private BigDecimal totalRealRate; + +} diff --git a/src/main/java/com/qs/serve/modules/bir/mapper/BirBudgetTargetMapper.java b/src/main/java/com/qs/serve/modules/bir/mapper/BirBudgetTargetMapper.java new file mode 100644 index 00000000..b057cc21 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bir/mapper/BirBudgetTargetMapper.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.bir.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bir.entity.BirBudgetTarget; +import com.qs.serve.modules.bir.entity.so.BirBudgetTargetSo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Mapper + * @author YenHex + * @date 2024-06-04 + */ +public interface BirBudgetTargetMapper extends BaseMapper { + + @InterceptorIgnore(tenantLine = "1") + List selectBirBudgetTargetList(@Param("query") BirBudgetTargetSo budgetTargetSo); + +} + diff --git a/src/main/java/com/qs/serve/modules/bir/service/BirBudgetTargetService.java b/src/main/java/com/qs/serve/modules/bir/service/BirBudgetTargetService.java new file mode 100644 index 00000000..2a577710 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bir/service/BirBudgetTargetService.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.bir.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bir.entity.BirBudgetTarget; +import com.qs.serve.modules.bir.entity.so.BirBudgetTargetSo; +import com.qs.serve.modules.bir.entity.vo.BirBudgetTargetVo; + +import java.util.List; + +/** + * 服务接口 + * @author YenHex + * @date 2024-06-04 + */ +public interface BirBudgetTargetService extends IService { + + List listVo(BirBudgetTargetSo query); + +} + diff --git a/src/main/java/com/qs/serve/modules/bir/service/impl/BirActivityCenterGoodsServiceImpl.java b/src/main/java/com/qs/serve/modules/bir/service/impl/BirActivityCenterGoodsServiceImpl.java index a983ece0..b51d4b3d 100644 --- a/src/main/java/com/qs/serve/modules/bir/service/impl/BirActivityCenterGoodsServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/bir/service/impl/BirActivityCenterGoodsServiceImpl.java @@ -139,19 +139,22 @@ public class BirActivityCenterGoodsServiceImpl extends ServiceImpl supplierLqw = new LambdaQueryWrapper<>(); - supplierLqw.in(BmsSupplier::getId,activityCenterGoodsAllList.stream().map(a->a.getSupplierId()).distinct().collect(Collectors.toList())); + supplierLqw.in(BmsSupplier::getCode,activityCenterGoodsAllList.stream().map(TbsActivityCenterGoods::getSupplierCode).distinct().collect(Collectors.toList())); List bmsSupplierList = bmsSupplierMapper.selectList(supplierLqw); Map supplierMap = bmsSupplierList.stream().collect(Collectors.toMap(BmsSupplier::getId,a->a)); - LambdaQueryWrapper regionLqw = new LambdaQueryWrapper<>(); - regionLqw.in(BmsRegion::getId,bmsSupplierList.stream().map(a->a.getRegionLast()).collect(Collectors.toList())); - List saleRegionList = regionMapper.selectList(regionLqw); - Map saleRegionMap = saleRegionList.stream().collect(Collectors.toMap(BmsRegion::getId,a->a)); - - LambdaQueryWrapper region2Lqw = new LambdaQueryWrapper<>(); - region2Lqw.in(BmsRegion2::getId,bmsSupplierList.stream().map(a->a.getRegion2Last()).collect(Collectors.toList())); - List bizRegionList = region2Mapper.selectList(region2Lqw); - Map bizRegionMap = bizRegionList.stream().collect(Collectors.toMap(BmsRegion2::getId,a->a)); + Map saleRegionMap = null; + Map bizRegionMap = null; + if(CollUtil.isNotEmpty(bmsSupplierList)) { + LambdaQueryWrapper regionLqw = new LambdaQueryWrapper<>(); + regionLqw.in(BmsRegion::getId,bmsSupplierList.stream().map(BmsSupplier::getRegionLast).collect(Collectors.toList())); + List saleRegionList = regionMapper.selectList(regionLqw); + saleRegionMap = saleRegionList.stream().collect(Collectors.toMap(BmsRegion::getId, a->a)); + LambdaQueryWrapper region2Lqw = new LambdaQueryWrapper<>(); + region2Lqw.in(BmsRegion2::getId,bmsSupplierList.stream().map(BmsSupplier::getRegion2Last).collect(Collectors.toList())); + List bizRegionList = region2Mapper.selectList(region2Lqw); + bizRegionMap = bizRegionList.stream().collect(Collectors.toMap(BmsRegion2::getId, a->a)); + } //过滤无效的费用申请 LambdaQueryWrapper costLqw = new LambdaQueryWrapper<>(); @@ -225,8 +228,10 @@ public class BirActivityCenterGoodsServiceImpl extends ServiceImpl0){ + LocalDateTime nowTime = LocalDateTime.now(); for (BirActivityCenterGoods bir : bacgList) { bir.setId(IdUtil.getSnowflakeNextId()); + bir.setUpdateTime(nowTime); super.getBaseMapper().insert(bir); } } diff --git a/src/main/java/com/qs/serve/modules/bir/service/impl/BirBaseActivityServiceImpl.java b/src/main/java/com/qs/serve/modules/bir/service/impl/BirBaseActivityServiceImpl.java index c64004fb..ca94df19 100644 --- a/src/main/java/com/qs/serve/modules/bir/service/impl/BirBaseActivityServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/bir/service/impl/BirBaseActivityServiceImpl.java @@ -24,6 +24,7 @@ import com.qs.serve.modules.bir.mapper.BirBaseActivityMapper; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.Period; import java.util.ArrayList; import java.util.List; @@ -52,9 +53,11 @@ public class BirBaseActivityServiceImpl extends ServiceImpl ids = activityList.stream().filter(a->a.getId()!=null) .map(TbsActivity::getId).collect(Collectors.toList()); LambdaQueryWrapper birBaseActivityLqw = new LambdaQueryWrapper<>(); - birBaseActivityLqw.in(BirBaseActivity::getCostApplyId,costId); + birBaseActivityLqw.eq(BirBaseActivity::getCostApplyId,costId); super.baseMapper.delete(birBaseActivityLqw); + //防空指针 + ids.add(0L); LambdaQueryWrapper activityLqw = new LambdaQueryWrapper<>(); activityLqw.in(TbsActivity::getId,ids); activityList = tbsActivityMapper.selectList(activityLqw); @@ -174,8 +177,10 @@ public class BirBaseActivityServiceImpl extends ServiceImpl implements BirBudgetTargetService { + + @Override + public List listVo(BirBudgetTargetSo query) { + query.setLoadType(query.getLoadType()+1); + LocalDateTime endMonth = query.getYearMonthEnd(); + LocalDateTime startMonth = query.getYearMonthStart(); + //格式化 + startMonth = startMonth.withDayOfMonth(1).toLocalDate().atTime(0,0,0); + endMonth = endMonth.with(TemporalAdjusters.lastDayOfMonth()).toLocalDate().atTime(23,59,59); + query.setYearMonthStart(startMonth); + query.setYearMonthEnd(endMonth); + query.setSelectCenterFlag(0); + if(CollUtil.isNotEmpty(query.getCenterList())){ + query.setSelectCenterFlag(1); + } + + List birBudgetTargets = baseMapper.selectBirBudgetTargetList(query); + + Map> listMap = birBudgetTargets.stream() + .collect(Collectors.groupingBy(obj->obj.getYearNum()+"_"+obj.getMonthNum())); + + List budgetTargetVoList = new ArrayList<>(); + + + //12个月 + final int TOTAL_MONTH = 12; + for (int y = startMonth.getYear(); y <= endMonth.getYear(); y++) { + for (int m = 1; m <= TOTAL_MONTH; m++) { + //防止多空白行 + if(y == startMonth.getYear() && m < startMonth.getMonthValue()){ + continue; + } + if(y == endMonth.getYear() && m > endMonth.getMonthValue()){ + continue; + } + budgetTargetVoList.add(getBudgetTargetVo(listMap, m, y)); + } + } + return budgetTargetVoList; + } + + private BirBudgetTargetVo getBudgetTargetVo(Map> listMap, int month, int year) { + List mList = listMap.get(year +"_"+ month); + BirBudgetTargetVo targetVo = new BirBudgetTargetVo(); + targetVo.setYearNum(year); + targetVo.setMonthNum(month); + targetVo.setTargetAmt(BigDecimal.ZERO); + targetVo.setBudgetAmt(BigDecimal.ZERO); + targetVo.setDispatchAmt(BigDecimal.ZERO); + targetVo.setTotalRealAmt(BigDecimal.ZERO); + targetVo.setLastYearDispatchAmt(BigDecimal.ZERO); + targetVo.setProvinceCityAmt(BigDecimal.ZERO); + targetVo.setProvinceCityRegionAmt(BigDecimal.ZERO); + if(CollUtil.isNotEmpty(mList)){ + for (BirBudgetTarget target : mList) { + targetVo.setTargetAmt(targetVo.getTargetAmt().add(target.getTargetAmt())); + targetVo.setBudgetAmt(targetVo.getBudgetAmt().add(target.getBudgetAmt())); + targetVo.setDispatchAmt(targetVo.getDispatchAmt().add(target.getDispatchAmt())); + targetVo.setTotalRealAmt(targetVo.getTotalRealAmt().add(target.getTotalRealAmt())); + targetVo.setLastYearDispatchAmt(targetVo.getLastYearDispatchAmt().add(target.getLastYearDispatchAmt())); + targetVo.setProvinceCityAmt(targetVo.getProvinceCityAmt().add(target.getProvinceCityAmt())); + targetVo.setProvinceCityRegionAmt(targetVo.getProvinceCityRegionAmt().add(target.getProvinceCityRegionAmt())); + } + //预算费率 = 预算费用/销售目标 + targetVo.setBudgetRate(targetVo.getBudgetAmt().divide(targetVo.getTargetAmt(),2, RoundingMode.DOWN)); + //发货达成率 = 实际发货/销售目标 + targetVo.setDispatchRate(targetVo.getDispatchAmt().divide(targetVo.getTargetAmt(),2, RoundingMode.DOWN)); + //(当前发货-去年同期发货)/去年同期发货 + targetVo.setLastYearGrowRate( + targetVo.getDispatchAmt() + .subtract(targetVo.getLastYearDispatchAmt()) + .divide(targetVo.getLastYearDispatchAmt(),2, RoundingMode.DOWN) + ); + //实际费用率=实际费用/实际发货 + targetVo.setProvinceCityRate(targetVo.getProvinceCityAmt().divide(targetVo.getDispatchAmt(),2, RoundingMode.DOWN)); + targetVo.setProvinceCityRegionRate(targetVo.getProvinceCityRate().divide(targetVo.getDispatchAmt(),2, RoundingMode.DOWN)); + targetVo.setTotalRealRate(targetVo.getTotalRealAmt().divide(targetVo.getDispatchAmt(),2, RoundingMode.DOWN)); + } + return targetVo; + } + +} + diff --git a/src/main/java/com/qs/serve/modules/bms/controller/BmsChannelController.java b/src/main/java/com/qs/serve/modules/bms/controller/BmsChannelController.java index 386dbc57..bb643a1f 100644 --- a/src/main/java/com/qs/serve/modules/bms/controller/BmsChannelController.java +++ b/src/main/java/com/qs/serve/modules/bms/controller/BmsChannelController.java @@ -194,6 +194,13 @@ public class BmsChannelController { param.setHeadChannel(""); param.setHeadChannelCode(""); } + //编码不可重复 + Long count = bmsChannelService.count(new LambdaQueryWrapper() + .ne(BmsChannel::getId,param.getId()) + .eq(BmsChannel::getChannelCode,param.getChannelCode())); + if(count > 0){ + return R.error("编码不可重复"); + } boolean result = bmsChannelService.updateById(param); if(!ori.getChannelName().equals(param.getChannelName())){ List channelPoints = bmsChannelPointService.listByChannelId(param.getId()); diff --git a/src/main/java/com/qs/serve/modules/bms/controller/BmsRegionController.java b/src/main/java/com/qs/serve/modules/bms/controller/BmsRegionController.java index 46395e53..a90d2c64 100644 --- a/src/main/java/com/qs/serve/modules/bms/controller/BmsRegionController.java +++ b/src/main/java/com/qs/serve/modules/bms/controller/BmsRegionController.java @@ -110,8 +110,9 @@ public class BmsRegionController { BmsSupplier supplier = bmsSupplierService.getById(supplierId); regionIds.addAll(supplier.listSaleRegionIds()); } - List hisUserSuppliers = hisUserSupplierService.selectHisSupplier(null,false); - List supplierIds = hisUserSuppliers.stream().map(HisUserSupplier::getSupplierId).collect(Collectors.toList()); + //List hisUserSuppliers = hisUserSupplierService.selectHisSupplier(null,false); + //List supplierIds = hisUserSuppliers.stream().map(HisUserSupplier::getSupplierId).collect(Collectors.toList()); + List supplierIds = hisUserSupplierService.selectHisSupplier(null,false); supplierIds.add(0L); List supplierList = bmsSupplierService.listByIds(supplierIds); List firstRegionIds = supplierList.stream().map(a->a.getRegionFirst()).collect(Collectors.toList()); diff --git a/src/main/java/com/qs/serve/modules/bms/controller/BmsSubjectController.java b/src/main/java/com/qs/serve/modules/bms/controller/BmsSubjectController.java index c7339876..f1282f86 100644 --- a/src/main/java/com/qs/serve/modules/bms/controller/BmsSubjectController.java +++ b/src/main/java/com/qs/serve/modules/bms/controller/BmsSubjectController.java @@ -106,7 +106,7 @@ public class BmsSubjectController { List subjectIds2 = subjectRegionList.stream().map(a->a.getSubjectId().toString()) .distinct().collect(Collectors.toList()); subjectIds.addAll(subjectIds2); - recursionToSetSelectAble(treeVoList, subjectIds); + recursionToSetSelectAble(treeVoList, subjectIds,null); } } @@ -123,30 +123,42 @@ public class BmsSubjectController { findParentVoAndAddToList(treeVoList,newTreeVoList,pVo); } } + /** * 递归设置可选 * @param treeVoList * @param subjectIds + * @param parentNode */ - private void recursionToSetSelectAble(List treeVoList, List subjectIds) { + private void recursionToSetSelectAble(List treeVoList, List subjectIds,BmsSubjectTreeVo parentNode) { if(CollectionUtil.isEmpty(treeVoList)){ return; } for (Object object : treeVoList) { BmsSubjectTreeVo subjectTreeVo = (BmsSubjectTreeVo)object; - if(CollectionUtil.isEmpty(subjectTreeVo.getChildren())){ - if(subjectTreeVo.getBizRegionFlag().equals(0)||subjectTreeVo.getSaleRegionFlag().equals(0)){ - subjectTreeVo.setApiSelectAble(1); - }else { - for (String subjectId : subjectIds) { - if(subjectTreeVo.getId().equals(subjectId)){ + if(subjectTreeVo.getPid().equals(0L)){ + for (String subjectId : subjectIds) { + if(subjectTreeVo.getId().equals(subjectId)){ + subjectTreeVo.setApiSelectAble(1); + break; + } + } + parentNode = subjectTreeVo; + }else { + if(parentNode.getApiSelectAble().equals(1)){ + if(subjectTreeVo.getBizRegionFlag().equals(0)||subjectTreeVo.getSaleRegionFlag().equals(0)){ + if(!parentNode.getApiSelectAble().equals(0)){ subjectTreeVo.setApiSelectAble(1); - break; } } } - }else { - recursionToSetSelectAble(subjectTreeVo.getChildren(),subjectIds); + } + if(CollectionUtil.isNotEmpty(subjectTreeVo.getChildren())){ + if(parentNode.getApiSelectAble().equals(0)){ + recursionToSetSelectAble(subjectTreeVo.getChildren(),subjectIds,subjectTreeVo); + }else { + recursionToSetSelectAble(subjectTreeVo.getChildren(),subjectIds,subjectTreeVo); + } } } } diff --git a/src/main/java/com/qs/serve/modules/bms/controller/my/BmsSupplierContactsMyController.java b/src/main/java/com/qs/serve/modules/bms/controller/my/BmsSupplierContactsMyController.java index 7fc0c9cf..1cbc0599 100644 --- a/src/main/java/com/qs/serve/modules/bms/controller/my/BmsSupplierContactsMyController.java +++ b/src/main/java/com/qs/serve/modules/bms/controller/my/BmsSupplierContactsMyController.java @@ -50,8 +50,9 @@ public class BmsSupplierContactsMyController { */ @GetMapping("/page") public R> getPage(BmsSupplierContactsSo param){ - List hisUserSuppliers = hisUserSupplierService.selectHisSupplier(null,false); - List supplierIds = hisUserSuppliers.stream().map(HisUserSupplier::getSupplierId).collect(Collectors.toList()); + //List hisUserSuppliers = hisUserSupplierService.selectHisSupplier(null,false); + //List supplierIds = hisUserSuppliers.stream().map(HisUserSupplier::getSupplierId).collect(Collectors.toList()); + List supplierIds = hisUserSupplierService.selectHisSupplier(null,false); PageUtil.startPage(); BmsSupplierContacts query = CopierUtil.copy(param,new BmsSupplierContacts()); LambdaQueryWrapper contactsLambdaQueryWrapper = new LambdaQueryWrapper<>(query); diff --git a/src/main/java/com/qs/serve/modules/bms/entity/BmsSubject.java b/src/main/java/com/qs/serve/modules/bms/entity/BmsSubject.java index 1461f36f..978357b1 100644 --- a/src/main/java/com/qs/serve/modules/bms/entity/BmsSubject.java +++ b/src/main/java/com/qs/serve/modules/bms/entity/BmsSubject.java @@ -61,6 +61,9 @@ public class BmsSubject implements Serializable { private Integer level; + /** 应用与发布费用时,必选网点拦截 */ + private Integer pointSelectFlag; + /** 备注 */ @Length(max = 255,message = "备注长度不能超过255字") private String remark; diff --git a/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplier.java b/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplier.java index ed3e9ac4..182479bf 100644 --- a/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplier.java +++ b/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplier.java @@ -75,13 +75,11 @@ public class BmsSupplier implements Serializable { /** 名称 */ @NotBlank(message = "名称不能为空") - @Length(max = 20,message = "名称长度不能超过20字") @TableField(condition = SqlCondition.LIKE) private String name; /** 客户编码 */ @NotBlank(message = "客户编码不能为空") - @Length(max = 20,message = "客户编码长度不能超过20字") @TableField(condition = SqlCondition.LIKE) private String code; @@ -211,6 +209,18 @@ public class BmsSupplier implements Serializable { /** 线下下单 */ private Integer orderOfflineFlag; + /** 统计维护的地址数量 */ + @TableField(exist = false) + private Integer countAddr; + + /** + * 查询维护的地址 + * countAddrFlag=0 表示未维护的收货地址 + * countAddrFlag=1 表示已维护的收货地址 + */ + @TableField(exist = false) + private Integer countAddrFlag; + /** 当前用户ID */ @TableField(exist = false) private String currUserId; @@ -364,7 +374,7 @@ public class BmsSupplier implements Serializable { /*-------------- ----------------- */ @TableField(exist = false) - private List searchInIds; + private List searchInIds; /*-------------- ----------------- */ @TableField(exist = false) @@ -396,6 +406,7 @@ public class BmsSupplier implements Serializable { public HisUserSupplier toHisUserSupplier(String userId,Integer type){ HisUserSupplier userSupplier = new HisUserSupplier(); + userSupplier.setQueryValue(this.keyword); userSupplier.setUserId(userId); if(this.getUserId()!=null){ userSupplier.setSupplierId(Long.parseLong(this.getId())); @@ -403,6 +414,7 @@ public class BmsSupplier implements Serializable { if(this.getId()!=null){ userSupplier.setSupplierId(Long.parseLong(this.getId())); } + userSupplier.setSelectSupplierTypes(this.getSelectSupplierTypes()); userSupplier.setSupplierName(this.getName()); userSupplier.setSupplierCode(this.getCode()); userSupplier.setSaleRegionFirst(this.getRegionFirst()); @@ -415,6 +427,8 @@ public class BmsSupplier implements Serializable { userSupplier.setBizRegionFourthly(this.getRegion2Fourthly()); userSupplier.setSupplierFlag(this.getSupplierFlag()); userSupplier.setType(type); + userSupplier.setCountAddr(this.getCountAddr()); + userSupplier.setCountAddrFlag(this.getCountAddrFlag()); userSupplier.setCostFlag(this.costFlag); return userSupplier; } @@ -440,6 +454,8 @@ public class BmsSupplier implements Serializable { userSupplier.setBizRegionFourthly(this.getRegion2Fourthly()); userSupplier.setSupplierFlag(this.getSupplierFlag()); userSupplier.setType(type); + userSupplier.setCountAddr(this.getCountAddr()); + userSupplier.setCountAddrFlag(this.getCountAddrFlag()); userSupplier.setCostFlag(this.costFlag); userSupplier.setStopFlag(this.stopFlag); userSupplier.setStopFlagDate(this.stopFlagDate); diff --git a/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierBo.java b/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierBo.java index 765911b2..6871b7d9 100644 --- a/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierBo.java +++ b/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierBo.java @@ -37,12 +37,10 @@ public class BmsSupplierBo { /** 名称 */ @NotBlank(message = "名称不能为空") - @Length(max = 20,message = "名称长度不能超过20字") private String name; /** 客户编码 */ @NotBlank(message = "客户编码不能为空") - @Length(max = 20,message = "客户编码长度不能超过20字") private String code; /** 父级id,0表总公司无上级 */ diff --git a/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsSubjectTreeVo.java b/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsSubjectTreeVo.java index b950ec07..ce3ed1f1 100644 --- a/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsSubjectTreeVo.java +++ b/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsSubjectTreeVo.java @@ -49,4 +49,8 @@ public class BmsSubjectTreeVo extends TreeNode { /** 是否进场费用 */ private Integer slottingFlag; + + /** 应用与发布费用时,必选网点拦截 */ + private Integer pointSelectFlag; + } diff --git a/src/main/java/com/qs/serve/modules/bms/service/impl/BmsChannelPointServiceImpl.java b/src/main/java/com/qs/serve/modules/bms/service/impl/BmsChannelPointServiceImpl.java index da6f35c9..2d4203e9 100644 --- a/src/main/java/com/qs/serve/modules/bms/service/impl/BmsChannelPointServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/bms/service/impl/BmsChannelPointServiceImpl.java @@ -3,6 +3,7 @@ package com.qs.serve.modules.bms.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.R; import com.qs.serve.common.model.dto.RowParam; import com.qs.serve.common.util.Assert; import com.qs.serve.common.util.AuthContextUtils; @@ -98,6 +99,14 @@ public class BmsChannelPointServiceImpl extends ServiceImpl() + .ne(BmsChannelPoint::getId,channelPoint.getId()) + .eq(BmsChannelPoint::getPointCode,channelPoint.getPointCode())); + if(count > 0){ + Assert.throwEx("编码不可重复"); + } + BmsChannelPoint orgData = this.getById(channelPoint.getId()); sysBusinessLogService.buildLog4Change(BusinessLogType.Point, channelPoint.getId()+"",channelPoint.getPointCode(),channelPoint.getPointName(),null,orgData,channelPoint); diff --git a/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierServiceImpl.java b/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierServiceImpl.java index 2e48570d..b93f370f 100644 --- a/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierServiceImpl.java @@ -254,6 +254,8 @@ public class BmsSupplierServiceImpl extends ServiceImpl> getAllList(GoodsAccreditQuery query){ + List data = goodsAccreditService.queryList(query); + return R.ok(data); + } + /** * ID查询 * @param cateId diff --git a/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuController.java b/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuController.java index 3053a2c1..522444ba 100644 --- a/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuController.java +++ b/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuController.java @@ -350,7 +350,7 @@ public class GoodsSkuController { }else if (SAVE.equals(opt)){ //保存 if(sku!=null){ - skuItem.setErrMsg(skuItem.getErrMsg()==null?"已保存,新增失败;":skuItem.getErrMsg()+"\n已保存,新增失败;"); + skuItem.setErrMsg(skuItem.getErrMsg()==null?"编码重复,新增失败;":skuItem.getErrMsg()+"\n编码重复,新增失败;"); throwEx = true; continue; } diff --git a/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuController.java b/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuController.java index 7db95307..09e89917 100644 --- a/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuController.java +++ b/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuController.java @@ -3,6 +3,7 @@ package com.qs.serve.modules.goods.controller; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.qs.serve.common.config.DevEnvironmentConfig; import com.qs.serve.common.model.annotation.SysLog; import com.qs.serve.common.model.dto.PageVo; @@ -123,6 +124,21 @@ public class GoodsSpuController { return R.ok(result); } + + /** + * 更新spu下单状态 + * @param spuCode + * @param state + * @return + */ + @PutMapping("/orderState/{spuCode}/{state}") + public R updateOrderState(@PathVariable("spuCode")String spuCode, + @PathVariable("state") Integer state){ + boolean ok = goodsSpuService.update(new LambdaUpdateWrapper() + .eq(GoodsSpu::getSpuCode,spuCode).set(GoodsSpu::getOrderFlag,state)); + return R.isTrue(ok); + } + /** * spu下单查询 * @param param @@ -627,7 +643,14 @@ public class GoodsSpuController { isError = true; item.setErrMsg("SKU编码不存在"); } - + long count = goodsSpuService.count(new LambdaQueryWrapper() + .eq(GoodsSpu::getName,item.getName()) + .ne(GoodsSpu::getSpuCode,spuCode) + ); + if(count>0){ + isError = true; + item.setErrMsg("SKU名称已存在"); + } } if(isError){ diff --git a/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpu.java b/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpu.java index 890323c9..f6ba100b 100644 --- a/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpu.java +++ b/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpu.java @@ -209,6 +209,9 @@ public class GoodsSpu implements Serializable { @TableField(exist = false) private String skuName; + @TableField(exist = false) + private String skuBelong; + @TableField(exist = false) private String belong; diff --git a/src/main/java/com/qs/serve/modules/goods/service/GoodsAccreditService.java b/src/main/java/com/qs/serve/modules/goods/service/GoodsAccreditService.java index 435ee14d..4db28118 100644 --- a/src/main/java/com/qs/serve/modules/goods/service/GoodsAccreditService.java +++ b/src/main/java/com/qs/serve/modules/goods/service/GoodsAccreditService.java @@ -24,6 +24,8 @@ public interface GoodsAccreditService extends IService { PageVo queryPage(GoodsAccreditQuery query); + List queryList(GoodsAccreditQuery query); + void modify(GoodsAccreditBo param); GoodsAccreditVo getById(String cateId, String spuId, String skuId); diff --git a/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsAccreditServiceImpl.java b/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsAccreditServiceImpl.java index 4699fa1c..e7d6bfe9 100644 --- a/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsAccreditServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsAccreditServiceImpl.java @@ -59,6 +59,98 @@ public class GoodsAccreditServiceImpl extends ServiceImpl queryPage(GoodsAccreditQuery query) { + initAccreditQuery(query); + PageUtil.startPage(); + List list = super.baseMapper.queryUnionPage(query); + List results = getGoodsAccreditResults(list); + + return R.byPageHelperList(list,results).getData(); + } + + + + @Override + public List queryList(GoodsAccreditQuery query) { + initAccreditQuery(query); + List list = super.baseMapper.queryUnionPage(query); + List results = getGoodsAccreditResults(list); + return results; + } + + private List getGoodsAccreditResults(List list) { + List results = list.stream().map(ext->{ + if (ext.getUnionType().equals("accredit")){ + GoodsAccreditResult result = new GoodsAccreditResult(); + result.setId("goods"+ext.getId()); + result.setRuleType("goods"); + if(ext.getCategoryId()!=null){ + result.setGoodType("category"); + }else if (ext.getSpuId()!=null){ + result.setGoodType("spu"); + }else { + result.setGoodType("sku"); + } + result.setCode(ext.getCode()); + result.setName(ext.getName()); + result.setAccType(ext.getAccType().equals(0)?"in":"notIn"); + if(ext.getTargetType().equals("0")){ + result.setTargetType("supplier"); + }else if (ext.getTargetType().equals("1")){ + result.setTargetType("bizRegion"); + }else if (ext.getTargetType().equals("2")){ + result.setTargetType("saleRegion"); + }else { + result.setTargetType(ext.getTargetType()); + } + result.setTargetCode(ext.getTargetCode()); + result.setTargetName(ext.getTargetName()); + result.setTargetId(ext.getTargetId()); + result.setCreateTime(ext.getCreateTime()); + result.setCreateUser(ext.getCreateUser()); + result.setCreateUserCode(ext.getCreateUserCode()); + return result; + }else { + GoodsAccreditResult result = new GoodsAccreditResult(); + result.setId("supplier"+ext.getId()); + result.setRuleType("supplier"); + if(ext.getUserId()!=null) { + result.setTargetType("user"); + }else if(ext.getSaleRegionId()!=null){ + result.setTargetType("saleRegion"); + }else if (ext.getBizRegionId()!=null){ + result.setTargetType("bizRegion"); + }else { + result.setTargetType("supplier"); + } + result.setCode(ext.getCode()); + result.setName(ext.getName()); + if(ext.getTargetType().equals("1")){ + result.setAccType("in"); + result.setGoodType("category"); + }else if (ext.getTargetType().equals("2")){ + result.setAccType("notIn"); + result.setGoodType("category"); + }else if (ext.getTargetType().equals("3")){ + result.setAccType("in"); + result.setGoodType("spu"); + }else { + result.setAccType("notIn"); + result.setGoodType("spu"); + } + result.setTargetId(ext.getId()+""); + //result.setTargetType(ext.getTargetType()); + result.setTargetCode(ext.getTargetCode()); + result.setTargetName(ext.getTargetName()); + result.setCreateTime(ext.getCreateTime()); + result.setCreateUser(ext.getCreateUser()); + result.setCreateUserCode(ext.getCreateUserCode()); + return result; + } + }).collect(Collectors.toList()); + return results; + } + + private void initAccreditQuery(GoodsAccreditQuery query) { String productCode = query.getCode(); String productName = query.getName(); String targetCode = query.getTargetCode(); @@ -175,81 +267,6 @@ public class GoodsAccreditServiceImpl extends ServiceImpl list = super.baseMapper.queryUnionPage(query); - List results = list.stream().map(ext->{ - if (ext.getUnionType().equals("accredit")){ - GoodsAccreditResult result = new GoodsAccreditResult(); - result.setId("goods"+ext.getId()); - result.setRuleType("goods"); - if(ext.getCategoryId()!=null){ - result.setGoodType("category"); - }else if (ext.getSpuId()!=null){ - result.setGoodType("spu"); - }else { - result.setGoodType("sku"); - } - result.setCode(ext.getCode()); - result.setName(ext.getName()); - result.setAccType(ext.getAccType().equals(0)?"in":"notIn"); - if(ext.getTargetType().equals("0")){ - result.setTargetType("supplier"); - }else if (ext.getTargetType().equals("1")){ - result.setTargetType("bizRegion"); - }else if (ext.getTargetType().equals("2")){ - result.setTargetType("saleRegion"); - }else { - result.setTargetType(ext.getTargetType()); - } - result.setTargetCode(ext.getTargetCode()); - result.setTargetName(ext.getTargetName()); - result.setTargetId(ext.getTargetId()); - result.setCreateTime(ext.getCreateTime()); - result.setCreateUser(ext.getCreateUser()); - result.setCreateUserCode(ext.getCreateUserCode()); - return result; - }else { - GoodsAccreditResult result = new GoodsAccreditResult(); - result.setId("supplier"+ext.getId()); - result.setRuleType("supplier"); - if(ext.getUserId()!=null) { - result.setTargetType("user"); - }else if(ext.getSaleRegionId()!=null){ - result.setTargetType("saleRegion"); - }else if (ext.getBizRegionId()!=null){ - result.setTargetType("bizRegion"); - }else { - result.setTargetType("supplier"); - } - result.setCode(ext.getCode()); - result.setName(ext.getName()); - if(ext.getTargetType().equals("1")){ - result.setAccType("in"); - result.setGoodType("category"); - }else if (ext.getTargetType().equals("2")){ - result.setAccType("notIn"); - result.setGoodType("category"); - }else if (ext.getTargetType().equals("3")){ - result.setAccType("in"); - result.setGoodType("spu"); - }else { - result.setAccType("notIn"); - result.setGoodType("spu"); - } - result.setTargetId(ext.getId()+""); - //result.setTargetType(ext.getTargetType()); - result.setTargetCode(ext.getTargetCode()); - result.setTargetName(ext.getTargetName()); - result.setCreateTime(ext.getCreateTime()); - result.setCreateUser(ext.getCreateUser()); - result.setCreateUserCode(ext.getCreateUserCode()); - return result; - } - }).collect(Collectors.toList()); - - return R.byPageHelperList(list,results).getData(); } @Override diff --git a/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSkuServiceImpl.java b/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSkuServiceImpl.java index c63a24dc..a97cc956 100644 --- a/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSkuServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSkuServiceImpl.java @@ -273,6 +273,19 @@ public class GoodsSkuServiceImpl extends ServiceImpl im goodsSku.setId(dbGoodSku.getId()); } + //code必须唯一 + Long goodsSkuId = null; + if(dbGoodSku!=null){ + goodsSkuId = dbGoodSku.getId(); + } + Long countCode = super.getBaseMapper().selectCount(new LambdaQueryWrapper() + .ne(GoodsSku::getId,goodsSkuId) + .eq(GoodsSku::getSkuCode,goodSkuVo.getSkuCode()) + ); + if(countCode>0L){ + Assert.throwEx("编码必须唯一"); + } + //拓展spu GoodsSpu goodsSpu = goodsSpuMapper.selectById(goodsSku.getSpuId()); if(goodsSpu==null){ diff --git a/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSpuServiceImpl.java b/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSpuServiceImpl.java index 5e0f793a..7f820e9e 100644 --- a/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSpuServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSpuServiceImpl.java @@ -167,13 +167,24 @@ public class GoodsSpuServiceImpl extends ServiceImpl im @Transactional(rollbackFor = Exception.class) public GoodsSpu editTasteSpu(GoodsSpuBo param) { GoodsSpu spu = CopierUtil.copy(param,new GoodsSpu()); - if(param.getId()!=null){ - spu.setSpuCode(null); - } if(StringUtils.hasText(param.getCategoryId())){ GoodsCategory category = goodsCategoryService.getById(param.getCategoryId()); relateCate(spu,category); } + Long count = super.baseMapper.selectCount(new LambdaQueryWrapper() + .ne(param.getId()!=null,GoodsSpu::getId,param.getId()) + .eq(GoodsSpu::getSpuCode,param.getSpuCode()) + ); + if(count>0){ + Assert.throwEx("编码不可重复"); + } + Long count2 = super.baseMapper.selectCount(new LambdaQueryWrapper() + .ne(param.getId()!=null,GoodsSpu::getId,param.getId()) + .eq(GoodsSpu::getName,param.getName()) + ); + if(count2>0){ + Assert.throwEx("名称不可重复"); + } this.saveOrUpdate(spu); insertSpuSpec(spu.getId()); return spu; diff --git a/src/main/java/com/qs/serve/modules/his/entity/HisUserSupplier.java b/src/main/java/com/qs/serve/modules/his/entity/HisUserSupplier.java index a9abf94b..993da4fd 100644 --- a/src/main/java/com/qs/serve/modules/his/entity/HisUserSupplier.java +++ b/src/main/java/com/qs/serve/modules/his/entity/HisUserSupplier.java @@ -125,6 +125,17 @@ public class HisUserSupplier implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private LocalDateTime cooperatePauseFlagDate; + /** 统计维护的地址数量 */ + @TableField(exist = false) + private Integer countAddr; + + /** + * 查询维护的地址 + * countAddrFlag=0 表示未维护的收货地址 + * countAddrFlag=1 表示已维护的收货地址 + */ + @TableField(exist = false) + private Integer countAddrFlag; @TableField(exist = false) private String queryAddress; @@ -135,6 +146,12 @@ public class HisUserSupplier implements Serializable { @TableField(exist = false) private List selectUserIds; + /** + * 对应是supplierFlag + */ + @TableField(exist = false) + private List selectSupplierTypes; + @TableField(exist = false) private String addressId; diff --git a/src/main/java/com/qs/serve/modules/his/entity/HisUserSupplierTemp.java b/src/main/java/com/qs/serve/modules/his/entity/HisUserSupplierTemp.java index 2d9db50b..ed44f216 100644 --- a/src/main/java/com/qs/serve/modules/his/entity/HisUserSupplierTemp.java +++ b/src/main/java/com/qs/serve/modules/his/entity/HisUserSupplierTemp.java @@ -111,6 +111,19 @@ public class HisUserSupplierTemp implements Serializable { /** 闭户 */ private Integer stopFlag; + + /** 统计维护的地址数量 */ + @TableField(exist = false) + private Integer countAddr; + + /** + * 查询维护的地址 + * countAddrFlag=0 表示未维护的收货地址 + * countAddrFlag=1 表示已维护的收货地址 + */ + @TableField(exist = false) + private Integer countAddrFlag; + /** 闭户日期 */ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") diff --git a/src/main/java/com/qs/serve/modules/his/mapper/HisUserSupplierMapper.java b/src/main/java/com/qs/serve/modules/his/mapper/HisUserSupplierMapper.java index 14088f6a..aae64a93 100644 --- a/src/main/java/com/qs/serve/modules/his/mapper/HisUserSupplierMapper.java +++ b/src/main/java/com/qs/serve/modules/his/mapper/HisUserSupplierMapper.java @@ -1,6 +1,8 @@ package com.qs.serve.modules.his.mapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; import com.qs.serve.modules.bms.entity.so.BmsSupplierVisitSo; import com.qs.serve.modules.his.entity.HisUserSupplier; import com.qs.serve.modules.his.entity.dto.HisUserSupplierAddressVo; @@ -15,5 +17,8 @@ public interface HisUserSupplierMapper extends BaseMapper { List selectHisUserSupplierAddressList(@Param("query") HisUserSupplier param); + + List selectSupplierIdByQuery(@Param("query") HisUserSupplier param,@Param(Constants.WRAPPER) QueryWrapper lqw); + } diff --git a/src/main/java/com/qs/serve/modules/his/service/HisUserSupplierService.java b/src/main/java/com/qs/serve/modules/his/service/HisUserSupplierService.java index 170e15b5..2b1602ec 100644 --- a/src/main/java/com/qs/serve/modules/his/service/HisUserSupplierService.java +++ b/src/main/java/com/qs/serve/modules/his/service/HisUserSupplierService.java @@ -14,7 +14,7 @@ import java.util.List; */ public interface HisUserSupplierService extends IService { - List selectHisSupplier(BmsSupplier param,boolean usePage); + List selectHisSupplier(BmsSupplier param,boolean usePage); List selectListSupplier(BmsSupplier param); diff --git a/src/main/java/com/qs/serve/modules/his/service/impl/HisUserSupplierServiceImpl.java b/src/main/java/com/qs/serve/modules/his/service/impl/HisUserSupplierServiceImpl.java index 08286954..404da77d 100644 --- a/src/main/java/com/qs/serve/modules/his/service/impl/HisUserSupplierServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/his/service/impl/HisUserSupplierServiceImpl.java @@ -51,7 +51,7 @@ public class HisUserSupplierServiceImpl extends ServiceImpl selectHisSupplier(BmsSupplier param, boolean usePage) { + public List selectHisSupplier(BmsSupplier param, boolean usePage) { if(param==null){ param = new BmsSupplier(); } @@ -69,27 +69,29 @@ public class HisUserSupplierServiceImpl extends ServiceImpl(); } HisUserSupplier userSupplier = param.toHisUserSupplier(null,null); + userSupplier.setSelectUserIds(userIds); QueryWrapper lqw = new QueryWrapper<>(userSupplier); - lqw.select("distinct his_user_supplier.supplier_id"); - if(StringUtils.hasText(param.getKeyword())){ - lqw.lambda().like(HisUserSupplier::getSupplierCode,param.getKeyword()); - lqw.lambda().like(HisUserSupplier::getSupplierName,param.getKeyword()); - } - if(CollectionUtil.isNotEmpty(param.getSelectSupplierTypes())){ - lqw.lambda().in(HisUserSupplier::getSupplierFlag,param.getSelectSupplierTypes()); - } - lqw.lambda().in(HisUserSupplier::getUserId,userIds) - .ne(HisUserSupplier::getSupplierId,0); +// lqw.select("distinct his_user_supplier.supplier_id"); +// if(StringUtils.hasText(param.getKeyword())){ +// lqw.lambda().like(HisUserSupplier::getSupplierCode,param.getKeyword()); +// lqw.lambda().like(HisUserSupplier::getSupplierName,param.getKeyword()); +// } +// if(CollectionUtil.isNotEmpty(param.getSelectSupplierTypes())){ +// lqw.lambda().in(HisUserSupplier::getSupplierFlag,param.getSelectSupplierTypes()); +// } +// lqw.lambda().in(HisUserSupplier::getUserId,userIds) +// .ne(HisUserSupplier::getSupplierId,0); if(usePage){ PageUtil.startPage(); } - return this.list(lqw); + return baseMapper.selectSupplierIdByQuery(userSupplier,lqw); + //return this.list(lqw).stream().map(a->a.getSupplierId()).collect(Collectors.toList()); } @Override public List selectListSupplier(BmsSupplier param) { - List hisUserSuppliers = selectHisSupplier(param,false); - List supplierIds = hisUserSuppliers.stream().map(a->a.getSupplierId().toString()).collect(Collectors.toList()); + List supplierIds = selectHisSupplier(param,false); + //List supplierIds = hisUserSuppliers.stream().map(a->a.getSupplierId().toString()).collect(Collectors.toList()); if(supplierIds.size()>0) { param.setSearchInIds(supplierIds); List supplierList = bmsSupplierService.selectSupplierList(param); @@ -101,12 +103,12 @@ public class HisUserSupplierServiceImpl extends ServiceImpl selectPageSupplier(BmsSupplier param) { - List hisUserSuppliers = selectHisSupplier(param,true); - List supplierIds = hisUserSuppliers.stream().map(a->a.getSupplierId().toString()).collect(Collectors.toList()); + List supplierIds = selectHisSupplier(param,true); + //List supplierIds = hisUserSuppliers.stream().map(a->a.getSupplierId().toString()).collect(Collectors.toList()); if(supplierIds.size()>0) { param.setSearchInIds(supplierIds); List supplierList = bmsSupplierService.selectSupplierList(param); - return R.buildPageHelperList(hisUserSuppliers,supplierList); + return R.buildPageHelperList(supplierIds,supplierList); }else{ return R.buildPageHelperList(new ArrayList<>()); } diff --git a/src/main/java/com/qs/serve/modules/oms/controller/api/OmsOrderApi.java b/src/main/java/com/qs/serve/modules/oms/controller/api/OmsOrderApi.java index 0a99d811..f13ac039 100644 --- a/src/main/java/com/qs/serve/modules/oms/controller/api/OmsOrderApi.java +++ b/src/main/java/com/qs/serve/modules/oms/controller/api/OmsOrderApi.java @@ -40,6 +40,7 @@ import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import static com.qs.serve.modules.tbs.common.TbsSeeYonConst.ERP_ORDER_STATUS; @@ -170,6 +171,14 @@ public class OmsOrderApi { addrIds.add(0L); List supplierAddressList = bmsSupplierAddressService.listByIds(addrIds); + List orderIds = list.stream().map(OmsOrder::getId).collect(Collectors.toList()); + orderIds.add(0L); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(OmsOrderItem::getOrderId,orderIds); + List allItems = omsOrderItemService.list(lqw); + + Map> itemsMap = allItems.stream().collect(Collectors.groupingBy(OmsOrderItem::getOrderId)); + for (OmsOrder order : list) { omsOrderService.checkMsOrderStatus(order); @@ -185,10 +194,7 @@ public class OmsOrderApi { } } - LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - lqw.eq(OmsOrderItem::getOrderId,order.getId()); - List items = omsOrderItemService.list(lqw); - order.setOrderItems(items); + order.setOrderItems(itemsMap.get(order.getId())); } return R.byPageHelperList(list); @@ -254,6 +260,8 @@ public class OmsOrderApi { GoodsSku goodsSku = goodsSkuService.getById(orderItem.getSkuId()); if(goodsSku!=null){ orderItem.setSkuSpecialFlag(goodsSku.getSpecialFlag()); + orderItem.setSkuBelong(goodsSku.getBelong()); + orderItem.setSkuAddCode(goodsSku.getSkuAddCode()); } } omsOrder.setOrderItems(list); diff --git a/src/main/java/com/qs/serve/modules/oms/entity/OmsOrderItem.java b/src/main/java/com/qs/serve/modules/oms/entity/OmsOrderItem.java index 60c9334e..7e7db682 100644 --- a/src/main/java/com/qs/serve/modules/oms/entity/OmsOrderItem.java +++ b/src/main/java/com/qs/serve/modules/oms/entity/OmsOrderItem.java @@ -129,6 +129,14 @@ public class OmsOrderItem implements Serializable { @TableField(exist = false) private Object spuInfo; + /** skuBelong */ + @TableField(exist = false) + private Object skuBelong; + + /** skuBelong */ + @TableField(exist = false) + private Object skuAddCode; + /** 分类 */ @TableField(exist = false) private Object categoryInfo; diff --git a/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderBo.java b/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderBo.java index 653b444f..21f5154c 100644 --- a/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderBo.java +++ b/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderBo.java @@ -26,6 +26,9 @@ public class OmsOrderBo { /** 品牌规则ID */ private Long brandRuleId; + /** CD单据备注 */ + private String cdOrderRemark; + /** 购物车ID(购物车方式下单) */ private List shoppingCartIds; diff --git a/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderSkuBo.java b/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderSkuBo.java index 416a0344..3865ed77 100644 --- a/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderSkuBo.java +++ b/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderSkuBo.java @@ -33,6 +33,9 @@ public class OmsOrderSkuBo { /** 立刻下单标识 */ private Integer instantFlag; + + /** CD单据备注 */ + private String cdOrderRemark; /** 收货地址 */ private Long addressId; 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 8944d204..01ad0f0e 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 @@ -445,6 +445,7 @@ public class OmsOrderServiceImpl extends ServiceImpl im confirmOrder.setLatitudeFrom("SPU"); confirmOrder.setOrderSource(omsOrderBo.getOrderSource()); CreateOrderParam createOrderParam = omsOrderBo.getCreateOrderParam(); + createOrderParam.setCdOrderRemark(omsOrderBo.getCdOrderRemark()); OmsOrder order = this.buildOmsOrder(confirmOrder, createOrderParam); if(omsOrderBo.getInstantFlag()!=null&&omsOrderBo.getInstantFlag().equals(1)){ this.buildPriceOrder(order.getId()+"",null); diff --git a/src/main/java/com/qs/serve/modules/pay/controller/PayPaymentController.java b/src/main/java/com/qs/serve/modules/pay/controller/PayPaymentController.java index b104aa7f..d8303465 100644 --- a/src/main/java/com/qs/serve/modules/pay/controller/PayPaymentController.java +++ b/src/main/java/com/qs/serve/modules/pay/controller/PayPaymentController.java @@ -25,9 +25,13 @@ import com.qs.serve.modules.pay.entity.vo.PaySupplierVo; import com.qs.serve.modules.pay.mapper.PaySupplierMapper; import com.qs.serve.modules.pay.service.PayPaymentItemService; import com.qs.serve.modules.sys.entity.SysConfig; +import com.qs.serve.modules.sys.entity.SysSyncLog; import com.qs.serve.modules.sys.service.SysConfigService; import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.service.SysSyncLogService; import com.qs.serve.modules.tbs.mapper.TbsCostApplySumAmountMapper; +import com.qs.serve.modules.third.ThirdTokenUtil; +import com.qs.serve.modules.third.entity.ProcessCreateCostApplyBo; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; @@ -39,6 +43,7 @@ import com.qs.serve.modules.pay.entity.bo.PayPaymentBo; import com.qs.serve.modules.pay.entity.PayPayment; import com.qs.serve.modules.pay.service.PayPaymentService; +import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.math.BigDecimal; import java.time.LocalDate; @@ -63,6 +68,7 @@ public class PayPaymentController { private PaySupplierMapper paySupplierMapper; private DateCheckApplyService dateCheckApplyService; private SysConfigService configService; + private SysSyncLogService sysSyncLogService; /** * 客户费用列表 @@ -228,9 +234,27 @@ public class PayPaymentController { @PostMapping("/unPayment") @SysLog(module = SystemModule.Payment, title = "支付", biz = BizType.INSERT) @PreAuthorize("hasRole('pay:payment:pay')") - public R unPayment(@RequestBody @Valid PayPaymentBo param){ - PayPayment payPayment = payPaymentService.unpayment(param); - return R.ok(payPayment); + public R unPayment(@RequestBody @Valid PayPaymentBo param, HttpServletRequest request){ + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("新增不再支付"); + syncLog.setUrl(request.getRequestURI()); + syncLog.setRequestJson(JsonUtil.objectToJson(param)); + syncLog.setEntityClass(ProcessCreateCostApplyBo.class.getName()); + PayPayment payPayment = null; + try { + payPayment = payPaymentService.unpayment(param); + syncLog.setSuccessStatus(1); + } catch (Exception e) { + syncLog.setFailReason(e.getMessage()); + sysSyncLogService.save(syncLog); + return R.error(e.getMessage()); + } + sysSyncLogService.save(syncLog); + if(syncLog.getSuccessStatus()!=null&&syncLog.getSuccessStatus().equals(1)){ + return R.ok(payPayment); + } + return R.error("新增不再支付异常"); + } @@ -242,9 +266,25 @@ public class PayPaymentController { @PostMapping("/cancelUnPayment") @SysLog(module = SystemModule.Payment, title = "支付", biz = BizType.INSERT) @PreAuthorize("hasRole('pay:payment:pay')") - public R cancelUnPayment(@RequestBody String verificationCode){ - payPaymentService.cancelUnPayment(verificationCode); - return R.ok(); + public R cancelUnPayment(@RequestBody String verificationCode, HttpServletRequest request){ + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("取消不再支付"); + syncLog.setUrl(request.getRequestURI()); + syncLog.setRemark(verificationCode); + syncLog.setEntityClass(ProcessCreateCostApplyBo.class.getName()); + try { + payPaymentService.cancelUnPayment(verificationCode); + syncLog.setSuccessStatus(1); + } catch (Exception e) { + syncLog.setFailReason(e.getMessage()); + sysSyncLogService.save(syncLog); + return R.error(e.getMessage()); + } + sysSyncLogService.save(syncLog); + if(syncLog.getSuccessStatus()!=null&&syncLog.getSuccessStatus().equals(1)){ + return R.ok(); + } + return R.error("取消不再支付异常"); } /** @@ -255,9 +295,26 @@ public class PayPaymentController { @PostMapping("/save") @SysLog(module = SystemModule.Payment, title = "支付", biz = BizType.INSERT) @PreAuthorize("hasRole('pay:payment:pay')") - public R save(@RequestBody @Valid PayPaymentBo param){ - PayPayment payPayment = payPaymentService.payment(param); - return R.ok(payPayment); + public R save(@RequestBody @Valid PayPaymentBo param, HttpServletRequest request){ + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("新增支付"); + syncLog.setUrl(request.getRequestURI()); + syncLog.setRequestJson(JsonUtil.objectToJson(param)); + syncLog.setEntityClass(ProcessCreateCostApplyBo.class.getName()); + PayPayment payPayment = null; + try { + payPayment = payPaymentService.payment(param); + syncLog.setSuccessStatus(1); + } catch (Exception e) { + syncLog.setFailReason(e.getMessage()); + sysSyncLogService.save(syncLog); + return R.error(e.getMessage()); + } + sysSyncLogService.save(syncLog); + if(syncLog.getSuccessStatus()!=null&&syncLog.getSuccessStatus().equals(1)){ + return R.ok(payPayment); + } + return R.error("新增支付异常"); } /** @@ -268,9 +325,24 @@ public class PayPaymentController { @RequestMapping(value = "/cancel/{id}",method = {RequestMethod.GET,RequestMethod.DELETE}) @SysLog(module = SystemModule.Payment, title = "取消支付", biz = BizType.DELETE) @PreAuthorize("hasRole('pay:payment:cancel')") - public R cancelById(@PathVariable("id") String erpId){ - payPaymentService.cancel(erpId); - return R.ok(); + public R cancelById(@PathVariable("id") String erpId, HttpServletRequest request){ + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("取消支付"); + syncLog.setUrl(request.getRequestURI()); + syncLog.setEntityClass(ProcessCreateCostApplyBo.class.getName()); + try { + payPaymentService.cancel(erpId); + syncLog.setSuccessStatus(1); + } catch (Exception e) { + syncLog.setFailReason(e.getMessage()); + sysSyncLogService.save(syncLog); + return R.error(e.getMessage()); + } + sysSyncLogService.save(syncLog); + if(syncLog.getSuccessStatus()!=null&&syncLog.getSuccessStatus().equals(1)){ + return R.ok(); + } + return R.error("取消支付异常"); } } diff --git a/src/main/java/com/qs/serve/modules/pay/service/impl/PayPaymentServiceImpl.java b/src/main/java/com/qs/serve/modules/pay/service/impl/PayPaymentServiceImpl.java index bdd18f91..35aa9419 100644 --- a/src/main/java/com/qs/serve/modules/pay/service/impl/PayPaymentServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/pay/service/impl/PayPaymentServiceImpl.java @@ -135,7 +135,7 @@ public class PayPaymentServiceImpl extends ServiceImpl lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(PayPaymentItem::getVerificationId,vtb.getId()); List payPaymentItemList = paymentItemService.list(lambdaQueryWrapper); - BigDecimal usedAmount = payPaymentItemList.stream().map(a->a.getItemPayAmount()).reduce(BigDecimal.ZERO,BigDecimal::add); + BigDecimal usedAmount = payPaymentItemList.stream().map(PayPaymentItem::getItemPayAmount).reduce(BigDecimal.ZERO,BigDecimal::add); if(usedAmount==null){ usedAmount = BigDecimal.ZERO; } diff --git a/src/main/java/com/qs/serve/modules/seeyon/service/SeeYonRequestService.java b/src/main/java/com/qs/serve/modules/seeyon/service/SeeYonRequestService.java index 76efa25c..e5402e7e 100644 --- a/src/main/java/com/qs/serve/modules/seeyon/service/SeeYonRequestService.java +++ b/src/main/java/com/qs/serve/modules/seeyon/service/SeeYonRequestService.java @@ -84,6 +84,14 @@ public interface SeeYonRequestService { */ SyAffairStateResult checkAffairState(String targetId,String templateCode); + /** + * 检验协议类编码是否存在 + * @param templateCode + * @return + */ + Boolean checkConstCodeExist(String templateCode); + + /** * 校验OA节点状态(用于调整校验) * @param key diff --git a/src/main/java/com/qs/serve/modules/seeyon/service/impl/SeeYonRequestServiceImpl.java b/src/main/java/com/qs/serve/modules/seeyon/service/impl/SeeYonRequestServiceImpl.java index e8903e0d..36a94cf0 100644 --- a/src/main/java/com/qs/serve/modules/seeyon/service/impl/SeeYonRequestServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/seeyon/service/impl/SeeYonRequestServiceImpl.java @@ -25,6 +25,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static com.qs.serve.modules.tbs.common.TbsSeeYonConst.API_PROCESS_GET_CONST; + /** * @author YenHex * @since 2022/11/30 @@ -164,6 +166,18 @@ public class SeeYonRequestServiceImpl implements SeeYonRequestService { return getSyAffairStateResult(title, param); } + @Override + public Boolean checkConstCodeExist(String templateCode) { + R result = seeYonRequestBaseService.getBase(API_PROCESS_GET_CONST+"?costCode="+templateCode,"API_PROCESS_GET_CONST"); + if(result.getStatus()==200){ + String resultString = result.getData(); + if(resultString.contains("ok")){ + return true; + } + } + return false; + } + @Override public SyAffairStateResult checkAffairState(String key, String memberId, String templateCode) { String title = "【校验OA节点状态】"; diff --git a/src/main/java/com/qs/serve/modules/sys/service/impl/SysDeleteLogServiceImpl.java b/src/main/java/com/qs/serve/modules/sys/service/impl/SysDeleteLogServiceImpl.java index 4b116396..60fd6e16 100644 --- a/src/main/java/com/qs/serve/modules/sys/service/impl/SysDeleteLogServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/sys/service/impl/SysDeleteLogServiceImpl.java @@ -3,13 +3,11 @@ import java.time.LocalDateTime; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.qs.serve.common.util.Assert; -import com.qs.serve.common.util.HttpUtil; -import com.qs.serve.common.util.IdUtil; -import com.qs.serve.common.util.JsonUtil; +import com.qs.serve.common.util.*; import com.qs.serve.modules.bir.consts.BirActivityCenterGoodsUtil; import com.qs.serve.modules.bms.entity.BmsSupplier; import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; import com.qs.serve.modules.sys.entity.dto.CostDeletion; import com.qs.serve.modules.tbs.entity.TbsCostApply; import com.qs.serve.modules.tbs.entity.TbsCostTodo; @@ -45,11 +43,16 @@ public class SysDeleteLogServiceImpl extends ServiceImpl impl post.setPathIds(pPathId +"_"+post.getId()); post.setPathNames(pPathName+"_"+post.getPostName()); } + this.updateById(post); this.toFlushPathIds(post.getId(),post.getPathIds(),post.getPostName()); } } diff --git a/src/main/java/com/qs/serve/modules/sys/service/impl/SysPostUserServiceImpl.java b/src/main/java/com/qs/serve/modules/sys/service/impl/SysPostUserServiceImpl.java index e79ce4ac..f15e5227 100644 --- a/src/main/java/com/qs/serve/modules/sys/service/impl/SysPostUserServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/sys/service/impl/SysPostUserServiceImpl.java @@ -44,7 +44,7 @@ public class SysPostUserServiceImpl extends ServiceImpl lqw = new LambdaQueryWrapper<>(); lqw.likeRight(SysPostUser::getPathIds,postUser.getPathIds()+"_"); - lqw.select(SysPostUser::getUserId,SysPostUser::getId); + //lqw.select(SysPostUser::getUserId,SysPostUser::getId); List sysPostUsers = this.list(lqw); for (SysPostUser childUser : sysPostUsers) { userIdSet.add(childUser.getUserId()); diff --git a/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java b/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java index fb9a9d70..dc44797a 100644 --- a/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java +++ b/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java @@ -68,6 +68,7 @@ public interface TbsSeeYonConst { String API_TEST = "/testConnection"; String API_PROCESS_CREATE = "/process/create"; + String API_PROCESS_GET_CONST = "/process/getConst"; String API_PROCESS_CREATE_NEW = "/process/newCreate"; String API_PROCESS_CREATE_CALLBACK = "/process/createCallback"; String API_PROCESS_COMMIT = "/process/commit"; diff --git a/src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetLogBuildUtil.java b/src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetLogBuildUtil.java index ff8e2a9c..3a9815b1 100644 --- a/src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetLogBuildUtil.java +++ b/src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetLogBuildUtil.java @@ -62,7 +62,8 @@ public class TbsBudgetLogBuildUtil { * @param activity * @return */ - public static TbsBudgetLog buildTbsBudgetLog(BudgetLogOptFlag optType, SysUser sysUser, TbsCostApply costApply, TbsBudgetCostItem item, TbsBudget budget, BigDecimal amount, TbsActivity activity) { + public static TbsBudgetLog buildTbsBudgetLog(BudgetLogOptFlag optType, SysUser sysUser, TbsCostApply costApply, + TbsBudgetCostItem item, TbsBudget budget, BigDecimal amount, TbsActivity activity) { TbsBudgetLog budgetLog = new TbsBudgetLog(); budgetLog.setBudgetId(item.getBudgetId()); budgetLog.setBudgetCode(budget.getBudgetCode()); diff --git a/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController.java b/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController.java index 84de8b65..7c5c04ab 100644 --- a/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController.java +++ b/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController.java @@ -99,6 +99,23 @@ public class TbsActivityController { private final TbsCostApplyPart1Service tbsCostApplyPart1Service; private SysAttachService attachService; + TbsActivityDebugApplicationService tbsActivityDebugApplicationService; + + @GetMapping("/reset/{id}") + public R reset(@PathVariable("id") Long id){ + tbsActivityDebugApplicationService.reset(id); + return R.ok(); + } + + @GetMapping("/resetList") + public R reset(){ + Long[] ids = new Long[]{ + }; + for (Long id : ids) { + System.out.println(tbsActivityDebugApplicationService.reset(id)); + } + return R.ok(); + } /** * 列表 @@ -518,6 +535,7 @@ public class TbsActivityController { public R getDefaultCenter(@RequestBody TbsActivityDefaultCenterBo defaultCenterBo){ String goodsType = defaultCenterBo.getActivityGoodsType(); List goodsIds = defaultCenterBo.getGoodsIds(); + goodsIds = goodsIds.stream().filter(Objects::nonNull).collect(Collectors.toList()); Long subjectId = defaultCenterBo.getSubjectId(); Long supplierId = defaultCenterBo.getSupplierId(); BmsSupplier supplier = bmsSupplierService.getById(supplierId); @@ -555,7 +573,7 @@ public class TbsActivityController { } } } - List budgetIds = budgetList.stream().map(a->a.getId()).collect(Collectors.toList()); + List budgetIds = budgetList.stream().map(TbsBudget::getId).collect(Collectors.toList()); LambdaQueryWrapper lqwCon = new LambdaQueryWrapper<>(); lqwCon.in(TbsBudgetCondition::getBudgetId,budgetIds); List budgetConditionsAll = tbsBudgetConditionService.list(lqwCon); diff --git a/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetLogController.java b/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetLogController.java index 8845b540..024df3fc 100644 --- a/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetLogController.java +++ b/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetLogController.java @@ -17,6 +17,7 @@ import com.qs.serve.modules.tbs.entity.so.TbsBudgetSo; import com.qs.serve.modules.tbs.entity.vo.TbsBudgetVo; import com.qs.serve.modules.tbs.mapper.TbsBudgetLogMapper; import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; +import com.qs.serve.modules.tbs.service.TbsBudgetReleaseApplicationService; import com.qs.serve.modules.tbs.service.TbsBudgetService; import com.qs.serve.modules.tbs.service.TbsScheduleItemBudgetService; import lombok.AllArgsConstructor; @@ -46,6 +47,7 @@ import java.util.stream.Collectors; @RequestMapping("tbs/budgetLog") public class TbsBudgetLogController { + private TbsBudgetReleaseApplicationService tbsBudgetReleaseApplicationService; private TbsBudgetLogService tbsBudgetLogService; private TbsBudgetService tbsBudgetService; private TbsBudgetLogMapper tbsBudgetLogMapper; @@ -53,6 +55,27 @@ public class TbsBudgetLogController { private TbsScheduleItemBudgetService tbsScheduleItemBudgetService; private TbsBudgetLogService budgetLogService; + /** + * 修复释放费用 + * @return + */ + @GetMapping("/debug") + public R debug(){ + //tbsBudgetReleaseApplicationService.check(); + return R.ok(); + } + + /** + * 初始化活动申请费用 + * @param activityId + * @return + */ + @GetMapping("/debugActivity") + public R debugActivity(Long activityId){ + //tbsBudgetReleaseApplicationService.initHis(activityId); + return R.ok(); + } + /** * 翻页 * @param param diff --git a/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostContractController.java b/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostContractController.java index 2b2b9395..56c1bc1b 100644 --- a/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostContractController.java +++ b/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostContractController.java @@ -15,6 +15,7 @@ import com.qs.serve.modules.bms.service.BmsDutyInfoService; import com.qs.serve.modules.sys.entity.SysAttach; import com.qs.serve.modules.sys.service.SysAttachService; import com.qs.serve.modules.tbs.entity.bo.TbsCostContractBo; +import com.qs.serve.modules.tbs.service.TbsCostContractApplication; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.security.access.prepost.PreAuthorize; @@ -41,6 +42,14 @@ public class TbsCostContractController { private TbsCostContractService tbsCostContractService; private SysAttachService attachService; private BmsDutyInfoService bmsDutyInfoService; + private TbsCostContractApplication tbsCostContractApplication; + + + @GetMapping("resetRelease") + public R getById(){ + tbsCostContractApplication.resetState(); + return R.ok(); + } /** * 列表 diff --git a/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetCheckingWithAmount.java b/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetCheckingWithAmount.java new file mode 100644 index 00000000..ceefa93c --- /dev/null +++ b/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetCheckingWithAmount.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.Data; + +/** + * @author YenHex + * @since 2024/6/3 + */ +@Data +public class TbsBudgetCheckingWithAmount { + + private String type; + private String tarId; + private String tarCode; + private String tarTitle; + private String totalAmount; + private String supplierCode; + private String supplierName; + private String userCode; + private String userName; + +} diff --git a/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsScheduleItemSearch.java b/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsScheduleItemSearch.java index a2590144..c85128ba 100644 --- a/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsScheduleItemSearch.java +++ b/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsScheduleItemSearch.java @@ -28,6 +28,11 @@ public class TbsScheduleItemSearch { */ private List scheduleItemIds; + /** + * 周期项的预算ID(用于查询`审批中`的使用情况) + */ + private List scheduleItemBudgetIds; + /** * 品牌ID */ @@ -56,4 +61,20 @@ public class TbsScheduleItemSearch { } } + private Integer pageNum; + + private Integer pageSize; + + /** + * 用于查询预算审批中的数据 + */ + private String type; + private String tarCode; + private String tarTitle; + private String supplierCode; + private String supplierName; + private String userCode; + private String userName; + + } diff --git a/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityChannelPointMapper.java b/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityChannelPointMapper.java index a1d0970a..0f19be1e 100644 --- a/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityChannelPointMapper.java +++ b/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityChannelPointMapper.java @@ -1,7 +1,10 @@ package com.qs.serve.modules.tbs.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.qs.serve.modules.tbs.entity.TbsActivityChannelPoint; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; /** * 活动网点项 Mapper @@ -10,5 +13,26 @@ import com.qs.serve.modules.tbs.entity.TbsActivityChannelPoint; */ public interface TbsActivityChannelPointMapper extends BaseMapper { + /** + * 检查科目必选网点拦截 + * @param activityId + * @return activityId表示被拦截,空表示ok + */ + @InterceptorIgnore(tenantLine = "1") + @Select("select tbs_activity_subject.activity_id from tbs_activity_subject " + + "left join bms_subject on subject_id = bms_subject.id " + + "left join ( " + + " select count(1) as count_point,activity_id from tbs_activity_channel_point " + + " where del_flag = 0 and activity_id = #{activityId} " + + " group by activity_id " + + ") t1 on t1.activity_id = tbs_activity_subject.activity_id " + + "where " + + " bms_subject.del_flag = 0 " + + "and tbs_activity_subject.del_flag = 0 " + + "and bms_subject.point_select_flag = 1 " + + "and (t1.activity_id is null or t1.count_point = 0) " + + "and tbs_activity_subject.activity_id = #{activityId}") + Long checkSubjectPoint(@Param("activityId") Long activityId); + } diff --git a/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityPayConditionMapper.java b/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityPayConditionMapper.java index 1fdb9333..33ad7dcc 100644 --- a/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityPayConditionMapper.java +++ b/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityPayConditionMapper.java @@ -1,10 +1,14 @@ package com.qs.serve.modules.tbs.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.qs.serve.modules.tbs.entity.TbsActivityPayCondition; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; +import java.util.List; + /** * 活动支付条件 Mapper * @author YenHex @@ -13,6 +17,27 @@ import org.apache.ibatis.annotations.Update; public interface TbsActivityPayConditionMapper extends BaseMapper { + @InterceptorIgnore(tenantLine = "1") + @Select("select " + + "tbs_cost_apply.id " + + " from tbs_cost_apply " + + "left join ( " + + " select cost_apply_id,count(*) as total_contract from tbs_activity_pay_condition " + + " where del_flag = 0 " + + " group by cost_apply_id " + + ") t1 on t1.cost_apply_id = tbs_cost_apply.id " + + "left join ( " + + " select cost_apply_id,count(*) as total_vtb from vtb_verification " + + " where del_flag = 0 " + + " group by cost_apply_id " + + ") t2 on t2.cost_apply_id = tbs_cost_apply.id " + + "where " + + "tbs_cost_apply.del_flag = 0 " + + "and tbs_cost_apply.charge_state !=3 " + + "and tbs_cost_apply.contract_flag = 1 " + + "and t1.total_contract = t2.total_vtb") + List getFinishedCostId(); + @Update("update `tbs_activity_pay_condition` set pre_notify_time = null where id = #{id}") void updateSetNotifyTimeNull(@Param("id")String id); diff --git a/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivitySubjectMapper.java b/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivitySubjectMapper.java index af9d510b..db35a273 100644 --- a/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivitySubjectMapper.java +++ b/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivitySubjectMapper.java @@ -2,6 +2,8 @@ package com.qs.serve.modules.tbs.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.qs.serve.modules.tbs.entity.TbsActivitySubject; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; /** * 活动科目项 Mapper @@ -10,5 +12,24 @@ import com.qs.serve.modules.tbs.entity.TbsActivitySubject; */ public interface TbsActivitySubjectMapper extends BaseMapper { + @Select("select \n" + + " count(1) " + + "from tbs_activity \n" + + "left join tbs_cost_apply on tbs_activity.cost_apply_id = tbs_cost_apply.id\n" + + "left join (\n" + + "\tselect activity_id,sum(used_amount) as tal_used,count(1) as count_subject from tbs_activity_subject \n" + + "\twhere del_flag = 0 and activity_id = #{activityId} " + + "\tgroup by activity_id\n" + + ") act_info on act_info.activity_id = tbs_activity.id\n" + + "where tbs_activity.del_flag = 0 \n" + + "and tbs_cost_apply.del_flag = 0\n" + + "and tbs_cost_apply.charge_state in (1,2,3,7)\n" + + "and tbs_cost_apply.cancel_flag = 0\n" + + "and tbs_activity.cancel_flag = 0\n" + + "and tbs_activity.release_flag = 1\n" + + "and tbs_activity.id = #{activityId} " + + "and act_info.tal_used != tbs_activity.used_amount ") + Long checkActAndSubjectAmt(@Param("activityId") Long activityId); + } diff --git a/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetLog2Mapper.java b/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetLog2Mapper.java index 7fd7f6b1..85b88a2f 100644 --- a/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetLog2Mapper.java +++ b/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetLog2Mapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.qs.serve.modules.tbs.entity.TbsBudgetLog; import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCheckingWithAmount; import com.qs.serve.modules.tbs.entity.dto.TbsBudgetLogWithAmount; import com.qs.serve.modules.tbs.entity.dto.TbsScheduleItemBudgetIdDto; import com.qs.serve.modules.tbs.entity.so.TbsScheduleItemSearch; @@ -70,5 +71,21 @@ public interface TbsBudgetLog2Mapper extends BaseMapper { @InterceptorIgnore(tenantLine = "true") List getCostCheckingList(@Param("selectIds") List ids,@Param("optNumbers")List optNumbers); + /** + * 统计审批中的费用,占用多少的logs + * @param ids + * @param policyNumbers + * @param costNumbers + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List getBudgetLogCheckingList( + @Param("query")TbsScheduleItemSearch param, + @Param("selectIds") List ids + ,@Param("scheduleItemBudgetIds") List scheduleItemBudgetIds + , @Param("policyNumbers")List policyNumbers + , @Param("costNumbers")List costNumbers + ); + } diff --git a/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetLogMapper.java b/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetLogMapper.java index 5900b809..3e0ce5be 100644 --- a/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetLogMapper.java +++ b/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetLogMapper.java @@ -1,5 +1,6 @@ package com.qs.serve.modules.tbs.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.qs.serve.modules.tbs.entity.TbsBudgetLog; import com.qs.serve.modules.tbs.entity.TbsCostApply; @@ -67,7 +68,5 @@ public interface TbsBudgetLogMapper extends BaseMapper { " and (total_activity_amount-sum_budget>1 or sum_budget - total_activity_amount>1 )") List selectErrorThirtyCostId(); - - } diff --git a/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostApplyRemoveMapper.java b/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostApplyRemoveMapper.java index b6554638..4679bf06 100644 --- a/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostApplyRemoveMapper.java +++ b/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostApplyRemoveMapper.java @@ -56,6 +56,9 @@ public interface TbsCostApplyRemoveMapper { @Update("update tbs_budget_log set del_flag = 1 where cost_apply_id = #{costApplyId}") int tbs_budget_log(@Param("costApplyId") Long costId); + @Update("update tbs_budget_log set del_flag = 1 where create_cost_id = #{costApplyId}") + int tbs_budget_log_policy(@Param("costApplyId") Long costId); + @Update("update tbs_budget_cost_item set del_flag = 1 where cost_apply_id = #{costApplyId}") int tbs_budget_cost_item(@Param("costApplyId") Long costId); diff --git a/src/main/java/com/qs/serve/modules/tbs/mapper/TbsScheduleItemBudgetMapper.java b/src/main/java/com/qs/serve/modules/tbs/mapper/TbsScheduleItemBudgetMapper.java index c447d038..6ead8ca8 100644 --- a/src/main/java/com/qs/serve/modules/tbs/mapper/TbsScheduleItemBudgetMapper.java +++ b/src/main/java/com/qs/serve/modules/tbs/mapper/TbsScheduleItemBudgetMapper.java @@ -226,7 +226,6 @@ public interface TbsScheduleItemBudgetMapper extends BaseMapper0){ + log.warn("活动自身金额异常"); + return "活动自身金额异常"; + } + + Long unMatchNum = activitySubjectMapper.checkActAndSubjectAmt(activityId); + if(unMatchNum!=null&&unMatchNum>0){ + log.warn("活动科目金额异常"); + return "活动科目金额异常"; + } + + //校验核销金额,错误则不执行 + BigDecimal totalVerificationAmt = verificationMapper.getActivityVerificationAmt(activityId); + if(totalVerificationAmt==null){ + totalVerificationAmt = BigDecimal.ZERO; + } + if(activity.getUsedAmount().compareTo(BigDecimal.ZERO)!=0 + &&activity.getUsedAmount().compareTo(totalVerificationAmt)!=0){ + return "核销金额异常"; + } + + // subject是和activity的 申请金额和核销金额一致,不进行更新 + List activitySubjectList = activitySubjectService.list(wrapper); + List activityCenterList = activityCenterService.list(wrapper); + List activityCenterGoodsList = activityCenterGoodsService.list(wrapper); + + Map> activityCenterGoodsListMap = activityCenterGoodsList.stream() + .collect(Collectors.groupingBy(TbsActivityCenterGoods::getSubjectId)); + + Map> activityCenterListMap = activityCenterList.stream() + .collect(Collectors.groupingBy(TbsActivityCenter::getSubjectId)); + + boolean updateSubject = false; + for (TbsActivitySubject activitySubject : activitySubjectList) { + Long subjectId = activitySubject.getSubjectId(); + List subjectCenterList = activityCenterListMap.get(subjectId); + BigDecimal totalCenterRate = BigDecimal.ZERO; + BigDecimal totalCenterAmt = BigDecimal.ZERO; + BigDecimal totalCenterUsedAmt = BigDecimal.ZERO; + + BigDecimal subjectUsedAmt = activitySubject.getUsedAmount(); + BigDecimal subjectAmt = activitySubject.getAmount(); + for (TbsActivityCenter activityCenter : subjectCenterList) { + if(activityCenter.getCenterRate().compareTo(BigDecimal.ZERO)>=0){ + totalCenterRate = totalCenterRate.add(activityCenter.getCenterRate()); + } + if(activityCenter.getCenterAmount().compareTo(BigDecimal.ZERO)>=0){ + totalCenterAmt = totalCenterAmt.add(activityCenter.getCenterAmount()); + } + totalCenterUsedAmt = totalCenterUsedAmt.add(activityCenter.getUsedAmount()); + } + if(n100.compareTo(totalCenterRate)!=0){ + log.info("重新分配TbsActivityCenter的比例"); + BigDecimal centerRate = n100; + for (int i = 0; i < subjectCenterList.size(); i++) { + TbsActivityCenter activityCenter = subjectCenterList.get(i); + if(i+1 == subjectCenterList.size()){ + activityCenter.setCenterRate(centerRate); + }else { + if(activityCenter.getCenterRate().compareTo(BigDecimal.ZERO)<0){ + activityCenter.setCenterRate(BigDecimal.ZERO); + } + centerRate = centerRate.subtract(activityCenter.getCenterRate()); + } + } + } + + // 更新subject的已用金额 + if(subjectUsedAmt==null || totalCenterUsedAmt.compareTo(subjectUsedAmt)!=0){ + log.info("成本中心和科目已用金额不匹配"); + BigDecimal totalUsedOnCenter = BigDecimal.ZERO; + for (TbsActivityCenter center : activityCenterList) { + totalUsedOnCenter = totalUsedOnCenter.add(center.getUsedAmount()); + } + if(0 == totalUsedOnCenter.compareTo(activity.getUsedAmount())){ + log.info("通过center更新subject金额"); + subjectUsedAmt = BigDecimal.ZERO; + for (TbsActivityCenter center : subjectCenterList) { + subjectUsedAmt = subjectUsedAmt.add(center.getUsedAmount()); + } + activitySubject.setUsedAmount(subjectUsedAmt); + updateSubject = true; + }else if (activitySubjectList.size()==1){ + subjectUsedAmt = activity.getUsedAmount(); + activitySubject.setUsedAmount(subjectUsedAmt); + log.info("更新TbsActivityCenter的已用金额"); + BigDecimal totalCenterSubjectRate = BigDecimal.ZERO; + for (TbsActivityCenter center : subjectCenterList) { + totalCenterSubjectRate = totalCenterSubjectRate.add(center.getCenterRate()); + } + if(totalCenterSubjectRate.compareTo(n100)!=0){ + log.info("更新TbsActivityCenter的比率"); + BigDecimal avgRate = n100.divide(new BigDecimal(subjectCenterList.size()),2,RoundingMode.DOWN); + BigDecimal addRate = BigDecimal.ZERO; + for (int i = 0; i < subjectCenterList.size(); i++) { + TbsActivityCenter center = subjectCenterList.get(i); + if(i+1 == subjectCenterList.size()){ + center.setCenterRate(n100.subtract(addRate)); + }else { + center.setCenterRate(avgRate); + addRate = avgRate.add(avgRate); + } + } + } + BigDecimal totalUsed11 = BigDecimal.ZERO; + for (int i = 0; i < subjectCenterList.size(); i++) { + log.info("更新TbsActivityCenter的已用"); + TbsActivityCenter center = subjectCenterList.get(i); + if(i+1 == subjectCenterList.size()){ + center.setUsedAmount(subjectUsedAmt.subtract(totalUsed11)); + }else { + BigDecimal curAmt = subjectUsedAmt.multiply(center.getCenterRate()).divide(n100,2,RoundingMode.DOWN); + center.setUsedAmount(curAmt); + totalUsed11 = totalUsed11.add(curAmt); + } + } + }else { + log.info("成本中心和科目已用金额不匹配,而且活动金额也不匹配"); + return "成本中心和科目已用金额不匹配,而且活动金额也不匹配"; + } + } + + // 分配center的占用金额和已用金额 + if(totalCenterAmt.compareTo(activitySubject.getAmount())!=0){ + log.info("重新分配TbsActivityCenter的CenterAmount"); + BigDecimal centerAmt = subjectAmt; + BigDecimal centerUsedAmt = subjectUsedAmt; + for (int i = 0; i < subjectCenterList.size(); i++) { + TbsActivityCenter activityCenter = subjectCenterList.get(i); + if(i+1 == subjectCenterList.size()){ + activityCenter.setCenterAmount(centerAmt); + }else { + BigDecimal currAmt = subjectAmt + .multiply(activityCenter.getCenterRate()) + .divide(n100, 2,RoundingMode.DOWN); + centerAmt = centerAmt.subtract(currAmt); + activityCenter.setCenterAmount(currAmt); + } + //设置已用金额 + if(subjectAmt.compareTo(subjectUsedAmt)==0){ + activityCenter.setUsedAmount(activityCenter.getCenterAmount()); + }else { + if(i+1 == subjectCenterList.size()){ + activityCenter.setUsedAmount(centerUsedAmt); + }else { + BigDecimal currAmt = subjectUsedAmt + .multiply(activityCenter.getCenterRate()) + .divide(n100, 2,RoundingMode.DOWN); + centerUsedAmt = centerUsedAmt.subtract(currAmt); + activityCenter.setUsedAmount(centerAmt); + } + } + } + } + + List activityCenterGoodsListOfSubject = activityCenterGoodsListMap.get(subjectId); + + for (TbsActivityCenter center : subjectCenterList) { + List goodsList = activityCenterGoodsListOfSubject.stream() + .filter(a->a.getCenterId().equals(center.getCenterId())&&a.getCenterType().equals(center.getCenterType())) + .collect(Collectors.toList()); + if(goodsList.size()==0){ + if(subjectCenterList.size()==1 && activityCenterGoodsListOfSubject.size()==1){ + TbsActivityCenterGoods centerGoods = activityCenterGoodsListOfSubject.get(0); + centerGoods.setCenterType(center.getCenterType()); + centerGoods.setCenterId(center.getCenterId()); + centerGoods.setCenterName(center.getCenterName()); + goodsList = new ArrayList<>(); + goodsList.add(centerGoods); + }else { + log.error("商品数据缺失"); + return "商品数据缺失"; + } + } + final BigDecimal centerUsed = center.getUsedAmount(); + final BigDecimal centerAmt = center.getCenterAmount(); + + BigDecimal totalGoodRate = BigDecimal.ZERO; + for (TbsActivityCenterGoods goods : goodsList) { + BigDecimal rate = goods.getCenterGoodsRate(); + if(rate.compareTo(BigDecimal.ZERO)>0){ + totalGoodRate = totalGoodRate.add(rate); + } + } + //重新分配比率 + if(totalGoodRate.compareTo(n100)!=0){ + log.info("重新分配申请Rate"); + BigDecimal avgRate = n100.divide(new BigDecimal(goodsList.size()),2,RoundingMode.DOWN); + BigDecimal addRate = BigDecimal.ZERO; + for (int i = 0; i < goodsList.size(); i++) { + TbsActivityCenterGoods goods = goodsList.get(i); + if(i+1 == goodsList.size()){ + goods.setCenterGoodsRate(n100.subtract(addRate)); + }else { + goods.setCenterGoodsRate(avgRate); + addRate = addRate.add(avgRate); + } + } + } + + //分配申请金额 + BigDecimal centerAmt3 = centerAmt; + log.info("重新分配申请金额"); + for (int i = 0; i < goodsList.size(); i++) { + TbsActivityCenterGoods goods = goodsList.get(i); + if(i+1 == goodsList.size()){ + goods.setCenterGoodsAmount(centerAmt3); + }else { + BigDecimal currentAmt = centerAmt + .multiply(goods.getCenterGoodsRate()) + .divide(n100,2,RoundingMode.DOWN); + goods.setCenterGoodsAmount(currentAmt); + centerAmt3 = centerAmt3.subtract(currentAmt); + } + } + + //分配TbsActivityCenterGoods已用金额 + BigDecimal centerUsed2 = centerUsed; + log.info("重新分配已用金额"); + for (int i = 0; i < goodsList.size(); i++) { + TbsActivityCenterGoods goods = goodsList.get(i); + if(i+1 == goodsList.size()){ + goods.setUsedAmount(centerUsed2); + }else { + BigDecimal currentAmt = centerUsed + .multiply(goods.getCenterGoodsRate()) + .divide(n100,2,RoundingMode.DOWN); + goods.setUsedAmount(currentAmt); + centerUsed2 = centerUsed2.subtract(currentAmt); + } + } + } + + } + + //二次校验 + BigDecimal totalSubjectAmt = BigDecimal.ZERO; + BigDecimal totalSubjectUsedAmt = BigDecimal.ZERO; + BigDecimal totalAllCenterUsedAmt = BigDecimal.ZERO; + for (TbsActivitySubject activitySubject : activitySubjectList) { + Long subjectId = activitySubject.getSubjectId(); + List subjectCenterList = activityCenterListMap.get(subjectId); + BigDecimal totalCenterRate = BigDecimal.ZERO; + BigDecimal totalCenterAmt = BigDecimal.ZERO; + BigDecimal totalCenterUsedAmt = BigDecimal.ZERO; + + BigDecimal subjectUsedAmt = activitySubject.getUsedAmount(); + BigDecimal subjectAmt = activitySubject.getAmount(); + totalSubjectAmt = totalSubjectAmt.add(subjectAmt); + totalSubjectUsedAmt = totalSubjectUsedAmt.add(activitySubject.getUsedAmount()); + + for (TbsActivityCenter activityCenter : subjectCenterList) { + totalCenterRate = totalCenterRate.add(activityCenter.getCenterRate()); + totalCenterAmt = totalCenterAmt.add(activityCenter.getCenterAmount()); + totalCenterUsedAmt = totalCenterUsedAmt.add(activityCenter.getUsedAmount()); + } + totalAllCenterUsedAmt = totalAllCenterUsedAmt.add(totalCenterUsedAmt); + if(totalCenterAmt.compareTo(subjectAmt)!=0){ + log.error("合计totalCenterAmt金额异常:{}",activityId); + return "合计totalCenterAmt金额异常"; + } + if(totalCenterUsedAmt.compareTo(subjectUsedAmt)!=0){ + log.error("合计totalCenterUsedAmt金额异常,将重新分配活动的成本中心金额:{}",activityId); + return "合计totalCenterUsedAmt金额异常"; + } + if(n100.compareTo(totalCenterRate)!=0){ + log.error("centerRate不为100:{}",activityId); + return "centerRate不为100"; + } + List activityCenterGoodsListOfSubject = activityCenterGoodsListMap.get(subjectId); + + for (TbsActivityCenter center : subjectCenterList) { + List goodsList = activityCenterGoodsListOfSubject.stream() + .filter(a->a.getCenterId().equals(center.getCenterId())&&a.getCenterType().equals(center.getCenterType())) + .collect(Collectors.toList()); + final BigDecimal centerUsed = center.getUsedAmount(); + final BigDecimal centerAmt = center.getCenterAmount(); + + BigDecimal totalGoodRate = BigDecimal.ZERO; + BigDecimal totalGoodUsed = BigDecimal.ZERO; + BigDecimal totalGoodAmt = BigDecimal.ZERO; + for (TbsActivityCenterGoods goods : goodsList) { + BigDecimal rate = goods.getCenterGoodsRate(); + totalGoodRate = totalGoodRate.add(rate); + totalGoodAmt = totalGoodAmt.add(goods.getCenterGoodsAmount()); + totalGoodUsed = totalGoodUsed.add(goods.getUsedAmount()); + } + //重新分配比率 + if(totalGoodRate.compareTo(n100)!=0){ + log.error("totalGoodRate不为100:{}",activityId); + return "totalGoodRate不为100"; + } + + if(totalGoodAmt.compareTo(centerAmt)!=0){ + log.error("totalGoodAmt:{}",activityId); + return "totalGoodAmt错误"; + } + if(totalGoodUsed.compareTo(centerUsed)!=0){ + log.error("totalGoodUsed:{}",activityId); + return "totalGoodUsed错误"; + } + } + + } + + if(activity.getUsedAmount().compareTo(totalSubjectUsedAmt)!=0){ + log.error("活动和totalSubjectUsedAmt匹对金额异常:{}",activityId); + return "活动和totalSubjectUsedAmt匹对金额异常"; + } + if(totalSubjectUsedAmt.compareTo(totalAllCenterUsedAmt)!=0){ + log.error("活动和totalAllCenterUsedAmt匹对金额异常:{}",activityId); + return "活动和totalAllCenterUsedAmt匹对金额异常"; + } + if(activity.getTotalAmount().compareTo(totalSubjectAmt)!=0){ + log.error("科目和活动的申请金额不匹配"); + return "科目和活动的申请金额不匹配"; + } + // 处理预算占用 + List actBudgetLogs = budgetLogService.list(wrapper); + + List applyLogs = actBudgetLogs.stream().filter(a-> a.getOptType()!=4).collect(Collectors.toList()); + + List releaseLogs = actBudgetLogs.stream().filter(a-> a.getOptType()==4).collect(Collectors.toList()); + + BigDecimal applyAmt = totalBudgetLogAmount(applyLogs); + + BigDecimal releaseAmt = totalBudgetLogAmount(releaseLogs); + + //检查下占用预算和释放 + if(applyAmt.negate().compareTo(activity.getTotalAmount())!=0){ + log.info("历史预算占用金额异常"); + } + + if(activity.getReleaseAmount()!=null && releaseAmt.compareTo(activity.getReleaseAmount())!=0){ + log.info("历史预算释放金额异常"); + } + + List newApplyLogList = new ArrayList<>(); + List newReleaseLogList = new ArrayList<>(); + + for (TbsActivityCenterGoods goods : activityCenterGoodsList) { + + List goodApplyLogs = actBudgetLogs.stream().filter(a-> + a.getSubjectId().equals(goods.getSubjectId()) + &&a.getCenterType().equals(goods.getCenterType()) + &&a.getCenterId().equals(goods.getCenterId()) + &&a.getOptType()!=4 + ).collect(Collectors.toList()); + + List goodReleaseLogs = actBudgetLogs.stream().filter(a-> + a.getSubjectId().equals(goods.getSubjectId()) + &&a.getCenterType().equals(goods.getCenterType()) + &&a.getCenterId().equals(goods.getCenterId()) + &&a.getOptType()==4 + ).collect(Collectors.toList()); + + if(goodApplyLogs.size()==0 && goodReleaseLogs.size() ==0 + &&goods.getCenterGoodsAmount().equals(goods.getUsedAmount())){ + continue; + } + + if(goodApplyLogs.size()==0){ + return "缺失费用申请log"; + } + + // 新log + TbsBudgetLog newApplyLog = CopierUtil.copy(goodApplyLogs.get(0),new TbsBudgetLog()); + newApplyLog.setId(null); + newApplyLog.setAmount(goods.getCenterGoodsAmount().negate()); + newApplyLog.setOptType(1); + newApplyLogList.add(newApplyLog); + + if(goodReleaseLogs.size()>0){ + TbsBudgetLog newReleaseLog = CopierUtil.copy(goodReleaseLogs.get(0),new TbsBudgetLog()); + newReleaseLog.setId(null); + newReleaseLog.setAmount(goods.getCenterGoodsAmount().subtract(goods.getUsedAmount())); + newReleaseLog.setOptType(4); + newReleaseLogList.add(newReleaseLog); + } + + } + + + BigDecimal newApplyAmt = totalBudgetLogAmount(newApplyLogList); + BigDecimal newReleaseAmt = totalBudgetLogAmount(newReleaseLogList); + + if(newApplyAmt.negate().compareTo(activity.getTotalAmount())!=0){ + log.error("预算占用金额异常"); + return "预算占用金额异常"; + } + + if(activity.getReleaseAmount()!=null && newReleaseAmt.compareTo(activity.getReleaseAmount())!=0){ + log.error("预算释放金额异常 activity{},.getReleaseAmount():{} newReleaseAmt:{}",activityId,activity.getReleaseAmount(),newReleaseAmt); + return "预算释放金额异常"; + } + + if(updateSubject){ + activitySubjectService.updateBatchById(activitySubjectList); + } + activityCenterService.updateBatchById(activityCenterList); + activityCenterGoodsService.updateBatchById(activityCenterGoodsList); + List logIds = actBudgetLogs.stream().map(a->a.getId()).collect(Collectors.toList()); + if(!newApplyLogList.isEmpty()){ + budgetLogService.saveBatch(newApplyLogList); + } + if(CollectionUtil.isNotEmpty(newReleaseLogList)){ + budgetLogService.saveBatch(newReleaseLogList); + } + if(CollectionUtil.isNotEmpty(logIds)){ + budgetLogService.removeBatchByIds(logIds); + } + return null; + } + + + private BigDecimal totalBudgetLogAmount(List releaseLogs) { + BigDecimal amt = BigDecimal.ZERO; + if(releaseLogs!=null){ + for (TbsBudgetLog reLog : releaseLogs) { + amt = amt.add(reLog.getAmount()); + } + } + return amt; + } + +} diff --git a/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetReleaseApplicationService.java b/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetReleaseApplicationService.java new file mode 100644 index 00000000..e997e36e --- /dev/null +++ b/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetReleaseApplicationService.java @@ -0,0 +1,206 @@ +package com.qs.serve.modules.tbs.service; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.vtb.common.VtbFundFlowType; +import com.qs.serve.modules.vtb.entity.VtbFundFlow; +import com.qs.serve.modules.vtb.mapper.VtbFundFlowMapper; +import com.qs.serve.modules.vtb.service.VtbFundFlowService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2024/5/28 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsBudgetReleaseApplicationService { + + private final VtbFundFlowService fundFlowService; + private final VtbFundFlowMapper vtbFundFlowMapper; + private final TbsBudgetService budgetService; + private final TbsBudgetLogService budgetLogService; + private final TbsBudgetCostItemService budgetCostItemService; + private final TbsActivityService activityService; + private final TbsActivityCenterGoodsService activityCenterGoodsService; + private final TbsCostApplyService costApplyService; + private final TbsActivityPayConditionService activityPayConditionService; + private final TbsScheduleItemBudgetService tbsScheduleItemBudgetService; + + public void initHis(Long activityId){ + TbsBudget budget = budgetService.getById("1669"); + TbsScheduleItemBudget scheduleItemBudget = tbsScheduleItemBudgetService.getById("4896"); + TbsActivity activity = activityService.getById(activityId); + TbsCostApply costApply = costApplyService.getById(activity.getCostApplyId()); + SysUser sysUser = new SysUser(); + sysUser.setId("0"); + sysUser.setName("系统执行"); + sysUser.setCode("0"); + + List budgetLogList = new ArrayList<>(); + List centerGoodsList = activityCenterGoodsService.listByActivityId(activityId); + for (TbsActivityCenterGoods centerGoods : centerGoodsList) { + BigDecimal amount = centerGoods.getCenterGoodsAmount(); + + TbsBudgetCostItem costItem = new TbsBudgetCostItem(); + costItem.setCenterGoodsCode(centerGoods.getCenterGoodsCode()); + costItem.setCostApplyId(centerGoods.getCostApplyId()); + costItem.setActivityId(centerGoods.getActivityId()); + costItem.setActivityCode(centerGoods.getActivityCode()); + costItem.setSupplierId(centerGoods.getSupplierId()); + costItem.setSupplierCode(centerGoods.getSupplierCode()); + costItem.setSupplierName(centerGoods.getSupplierName()); + costItem.setSubjectId(centerGoods.getSubjectId()); + costItem.setSubjectCode(centerGoods.getSubjectCode()); + costItem.setSubjectName(centerGoods.getSubjectName()); + costItem.setCenterType(centerGoods.getCenterType()); + costItem.setCenterId(centerGoods.getCenterId()); + costItem.setCenterCode(centerGoods.getCenterCode()); + costItem.setCenterName(centerGoods.getCenterName()); + costItem.setCenterAmount(centerGoods.getCenterAmount()); + costItem.setCenterRate(centerGoods.getCenterRate()); + costItem.setCenterGoodsAmount(centerGoods.getCenterGoodsAmount()); + costItem.setCenterGoodsRate(centerGoods.getCenterGoodsRate()); + costItem.setTargetType(centerGoods.getTargetType()); + costItem.setTargetId(centerGoods.getTargetId()); + costItem.setTargetCode(centerGoods.getTargetCode()); + costItem.setTargetName(centerGoods.getTargetName()); + costItem.setTargetLevelPathIds(centerGoods.getTargetLevelPathIds()); + costItem.setTargetLevelPathNames(centerGoods.getTargetLevelPathNames()); + costItem.setActStartDate(centerGoods.getActStartDate()); + costItem.setActEndDate(centerGoods.getActEndDate()); + costItem.setPreStartDate(centerGoods.getPreStartDate()); + costItem.setPreEndDate(centerGoods.getPreEndDate()); + costItem.setPreCheckDate(centerGoods.getPreCheckDate()); + costItem.setCenterGoodItemId(centerGoods.getId()); + + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.buildTbsBudgetLog(BudgetLogOptFlag.State_1,sysUser,costApply,costItem ,budget,amount,activity); + budgetLog.setBudgetId(budget.getId()); + + budgetLog.setScheduleItemBudgetId(scheduleItemBudget.getId()); + budgetLog.setScheduleId(scheduleItemBudget.getScheduleId()); + budgetLog.setScheduleItemId(scheduleItemBudget.getScheduleItemId()); + budgetLog.setItemName(scheduleItemBudget.getItemName()); + + budgetLogList.add(budgetLog); + } + //移除历史记录 + budgetLogService.remove(new LambdaQueryWrapper() + .eq(TbsBudgetLog::getCostApplyId,activity.getCostApplyId()) + .eq(TbsBudgetLog::getOptType, BudgetLogOptFlag.State_1.getCode()) + .eq(TbsBudgetLog::getActivityId,activity.getId())); + //重新保存 + if(CollectionUtil.isNotEmpty(budgetLogList)){ + budgetLogService.saveBatch(budgetLogList); + } + + } + + /** + * 依据剩余预算刷新释放金额 + */ + public void check(Long actId){ + //校验活动的核销金额是否匹配,不匹配则中断 + //查询需要补偿释放的活动ID + //List activityIds = vtbFundFlowMapper.listMissReleaseActivityId(); + Long[] activityIds = new Long[]{actId}; + for (Long activityId : activityIds) { + TbsActivity activity = activityService.getById(activityId); + TbsCostApply costApply = costApplyService.getById(activity.getCostApplyId()); + + //保存预算日志 + List centerGoodsList = activityCenterGoodsService.listByActivityId(activityId); + LambdaQueryWrapper itemLqw = new LambdaQueryWrapper<>(); + itemLqw.eq(TbsBudgetCostItem::getActivityId,activityId); + List budgetCostItemList = budgetCostItemService.list(itemLqw); + List budgetIds = budgetCostItemList.stream().map(TbsBudgetCostItem::getBudgetId).collect(Collectors.toList()); + if(CollUtil.isEmpty(budgetIds)){ + continue; + } + List budgetLIst = budgetService.listByIds(budgetIds); + List budgetLogList = new ArrayList<>(); + for (TbsActivityCenterGoods centerGoods : centerGoodsList) { + if(centerGoods.getCenterGoodsAmount().compareTo(centerGoods.getUsedAmount())<1){ + continue; + } + TbsBudgetCostItem currCostItem = null; + TbsBudget currentBudget = null; + for (TbsBudgetCostItem costItem : budgetCostItemList) { + if(centerGoods.getId().equals(costItem.getCenterGoodItemId())){ + currCostItem = costItem; + break; + } + } + for (TbsBudget budget : budgetLIst) { + if (currCostItem.getBudgetId().equals(budget.getId())){ + currentBudget = budget; + } + } + BigDecimal amount = centerGoods.getCenterGoodsAmount().subtract(centerGoods.getUsedAmount()); + SysUser sysUser = new SysUser(); + sysUser.setId("0"); + sysUser.setName("系统执行"); + sysUser.setCode("0"); + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.buildTbsBudgetLog(BudgetLogOptFlag.State_4,sysUser,costApply,currCostItem,currentBudget,amount,activity); + budgetLogList.add(budgetLog); + } + + //TODO 二次校验,释放金额是否一致 + + + //移除历史记录 + fundFlowService.remove( + new LambdaQueryWrapper() + .eq(VtbFundFlow::getFundType, VtbFundFlowType.Release) + .eq(VtbFundFlow::getCostApplyId,activity.getCostApplyId()) + .eq(VtbFundFlow::getActivityId,activity.getId()) + ); + VtbFundFlow fundFlow = new VtbFundFlow(); + fundFlow.setFundType(VtbFundFlowType.Release); + fundFlow.setVerificationId(0L); + fundFlow.setCenterGoodsCode(activity.getActivityCode()+"_00"); + fundFlow.setCostApplyId(activity.getCostApplyId()); + fundFlow.setActivityId(activity.getId()); + fundFlow.setUsedAmount(activity.getReleaseAmount()); + fundFlow.setSupplierId(activity.getSupplierId()); + fundFlow.setSupplierCode(activity.getSupplierCode()); + fundFlow.setSupplierName(activity.getSupplierName()); + fundFlowService.save(fundFlow); + + //移除历史记录 + budgetLogService.remove(new LambdaQueryWrapper() + .eq(TbsBudgetLog::getCostApplyId,activity.getCostApplyId()) + .eq(TbsBudgetLog::getOptType, BudgetLogOptFlag.State_4.getCode()) + .eq(TbsBudgetLog::getActivityId,activity.getId())); + + //更新付款条件状态 + LambdaQueryWrapper updLqw = new LambdaQueryWrapper<>(); + updLqw.eq(TbsActivityPayCondition::getActivityId,activityId); + TbsActivityPayCondition payCondition = new TbsActivityPayCondition(); + payCondition.setFinishedFlag(1); + activityPayConditionService.update(payCondition,updLqw); + + //重新保存 + if(CollectionUtil.isNotEmpty(budgetLogList)){ + budgetLogService.saveBatch(budgetLogList); + } + + } + + + } + +} diff --git a/src/main/java/com/qs/serve/modules/tbs/service/TbsCostContractApplication.java b/src/main/java/com/qs/serve/modules/tbs/service/TbsCostContractApplication.java new file mode 100644 index 00000000..1d5355c4 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/tbs/service/TbsCostContractApplication.java @@ -0,0 +1,66 @@ +package com.qs.serve.modules.tbs.service; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.qs.serve.modules.tbs.common.TbsActivityState; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsActivityPayCondition; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.mapper.TbsActivityPayConditionMapper; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/5/28 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsCostContractApplication { + + private final TbsBudgetReleaseApplicationService tbsBudgetReleaseApplicationService; + private final TbsActivityPayConditionMapper activityPayConditionMapper; + private final TbsActivityPayConditionService activityPayConditionService; + private final TbsActivityService tbsActivityService; + private final TbsCostApplyService tbsCostApplyService; + private final VtbVerificationService verificationService; + + public void resetState(){ + //更新遗漏的已完成费用申请 + List costIds = activityPayConditionMapper.getFinishedCostId(); + if(CollUtil.isNotEmpty(costIds)){ + List costApplyList = tbsCostApplyService.listByIds(costIds); + for (TbsCostApply costApply : costApplyList) { + costApply.setChargeState(3); + costApply.setCheckState(1); + } + tbsCostApplyService.updateBatchById(costApplyList); + //更新状态 + activityPayConditionService.update(new LambdaUpdateWrapper() + .set(TbsActivityPayCondition::getFinishedFlag,1) + .in(TbsActivityPayCondition::getCostApplyId,costIds)); + List activityList = tbsActivityService.list(new LambdaQueryWrapper() + .in(TbsActivity::getCostApplyId,costIds)); + for (TbsActivity activity : activityList) { + if(activity.getUsedAmount().compareTo(activity.getTotalAmount())==0){ + activity.setActivityState(TbsActivityState.STATE_1_Finished); + }else { + //不进行直接释放,通过补充释放,最终一次性修复 + activity.setReleaseFlag(1); + activity.setReleaseAmount(activity.getTotalAmount().subtract(activity.getUsedAmount())); + activity.setActivityState(TbsActivityState.STATE_4_Release); + tbsBudgetReleaseApplicationService.check(activity.getId()); + } + } + tbsActivityService.updateBatchById(activityList); + } + + } + +} diff --git a/src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleItemBudgetService.java b/src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleItemBudgetService.java index b7cb4245..3c562f7b 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleItemBudgetService.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleItemBudgetService.java @@ -3,10 +3,7 @@ package com.qs.serve.modules.tbs.service; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.extension.service.IService; import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; -import com.qs.serve.modules.tbs.entity.dto.TbsBudgetScheduleWithAmount; -import com.qs.serve.modules.tbs.entity.dto.TbsScheduleItemBudgetIdDto; -import com.qs.serve.modules.tbs.entity.dto.TbsScheduleItemWithAmount; -import com.qs.serve.modules.tbs.entity.dto.TbsBudgetWithAmount; +import com.qs.serve.modules.tbs.entity.dto.*; import com.qs.serve.modules.tbs.entity.so.TbsScheduleItemSearch; import java.time.LocalDate; @@ -46,6 +43,13 @@ public interface TbsScheduleItemBudgetService extends IService listBudgetAmountByIds(TbsScheduleItemSearch param); + /** + * 查询审批中的费用或政策 + * @param param + * @return + */ + List listBudgetCheckingAmount(TbsScheduleItemSearch param); + } diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java index 0aa99d9b..a0a247f9 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java @@ -58,6 +58,7 @@ public class TbsActivityServiceImpl extends ServiceImpl0){ activityChannelPointService.saveBatch(activityChannelPointList); } + Long actId = tbsActivityChannelPointMapper.checkSubjectPoint(activity.getId()); + if(actId!=null){ + Assert.throwEx("活动["+activity.getActivityCode() + "]因科目类型,必须选网点"); + } //保存 activityGoodsService.saveBatch(activityGoodsList); activitySubjectService.saveBatch(activitySubjects); diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetApplyOperationServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetApplyOperationServiceImpl.java index 49feedc9..8b9c3403 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetApplyOperationServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetApplyOperationServiceImpl.java @@ -16,6 +16,7 @@ import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; import com.qs.serve.modules.tbs.service.TbsBudgetLogService; +import com.qs.serve.modules.tbs.service.TbsBudgetService; import com.qs.serve.modules.tbs.service.TbsScheduleItemBudgetService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -34,6 +35,7 @@ import java.util.List; @AllArgsConstructor public class TbsBudgetApplyOperationServiceImpl implements SeeYonOperationService { + private final TbsBudgetService budgetService; private final TbsBudgetMapper budgetMapper; private final TbsBudgetLogService budgetLogService; private final TbsScheduleItemBudgetService scheduleItemBudgetService; @@ -102,6 +104,7 @@ public class TbsBudgetApplyOperationServiceImpl implements SeeYonOperationServic budgetLogService.saveBatch(budgetLogList); } budgetMapper.updateConFlag(); + budgetService.syncMissSchItem(); return null; } diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetBatchOperationServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetBatchOperationServiceImpl.java index 199f7da1..42d16ce1 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetBatchOperationServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetBatchOperationServiceImpl.java @@ -81,6 +81,7 @@ public class TbsBudgetBatchOperationServiceImpl implements SeeYonOperationServic budgetBatch.setFinishedTime(LocalDateTime.now()); budgetBatchService.updateById(budgetBatch); tbsBudgetMapper.updateConFlag(); + tbsBudgetService.syncMissSchItem(); return null; } diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetBatchServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetBatchServiceImpl.java index 9cbf73e4..24c7ec34 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetBatchServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetBatchServiceImpl.java @@ -553,7 +553,7 @@ public class TbsBudgetBatchServiceImpl extends ServiceImpl activityGoodsList = goodsListMap.get(activityId); for (TbsActivityGoods goods : activityGoodsList) { boolean isMatch = false; - for (TbsBudgetCondition condition : budgetConditionList) { - if(goods.getTargetLevelPathIds().contains(condition.getTargetLevelPathIds())){ - isMatch = true; - break; + if(CollUtil.isNotEmpty(budgetConditionList)){ + for (TbsBudgetCondition condition : budgetConditionList) { + if(goods.getTargetLevelPathIds().contains(condition.getTargetLevelPathIds())){ + isMatch = true; + break; + } } } if(!isMatch){ diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetServiceImpl.java index 341075ff..87ec0280 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetServiceImpl.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qs.serve.common.config.properties.ProjectProperties; import com.qs.serve.common.framework.manager.AsyncFactory; import com.qs.serve.common.framework.manager.AsyncManager; +import com.qs.serve.common.framework.redis.RedisService; import com.qs.serve.common.model.dto.R; import com.qs.serve.common.model.enums.BudgetLogOptFlag; import com.qs.serve.common.util.*; @@ -83,6 +84,7 @@ public class TbsBudgetServiceImpl extends ServiceImpl private final VtbFundFlowService vtbFundFlowService; private final TbsActivityTemplateMapper tbsActivityTemplateMapper; + private RedisService redisService; private SysAttachService attachService; private SeeYonRequestService seeYonService; private ProjectProperties projectProperties; @@ -90,10 +92,12 @@ public class TbsBudgetServiceImpl extends ServiceImpl @Override public void commitApply(Long id) { + TbsBudget tbsBudget = this.getById(id); + redisService.throwResLock(TbsBudget.class.getSimpleName(),id.toString()); seeYonService.testConnection(); String templateCode = TbsSeeYonConst.BudgetApplyConf.Code(); SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); - TbsBudget tbsBudget = this.getById(id); + if(tbsBudget.getBudgetState().equals(1)){ Assert.throwEx("已开启"); } @@ -199,7 +203,7 @@ public class TbsBudgetServiceImpl extends ServiceImpl budget.setAttachIds(budgetBo.getAttachIds()); //设置指定模板 budget.setTemplateIds(new String[]{}); - if(budget.getTemplateFlag()!=null&&budget.getTemplateFlag().equals(1)){ + if(budgetBo.getTemplateFlag()!=null&&budgetBo.getTemplateFlag().equals(1)){ if(budgetBo.getTemplateIds()!=null&&budgetBo.getTemplateIds().length>0){ budget.setTemplateIds(budgetBo.getTemplateIds()); } diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyOperationServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyOperationServiceImpl.java index f8b2e535..037ab094 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyOperationServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyOperationServiceImpl.java @@ -221,12 +221,12 @@ public class TbsCostApplyOperationServiceImpl implements SeeYonOperationService ctpAffairVo.setAffairInfo(ctpAffair); //2已发 if(ctpAffair!=null&&ctpAffair.getState().equals(2)){ - String costId = ctpAffair.getCostApplyId(); - if(costId!=null){ - TbsCostApply costApply1 = costApplyService.getById(costId); - Date date = Date.from(costApply1.getSubmitTime().atZone(ZoneId.systemDefault()).toInstant()); - ctpAffair.setCommentTime(date); - } +// String costId = ctpAffair.getCostApplyId(); +// if(costId!=null){ +// TbsCostApply costApply1 = costApplyService.getById(costId); +// Date date = Date.from(costApply1.getSubmitTime().atZone(ZoneId.systemDefault()).toInstant()); +// ctpAffair.setCommentTime(date); +// } } for (SysUser user : userList) { if(ctpAffair.getMemberId().equals(user.getSyUserId())){ diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyPart1ServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyPart1ServiceImpl.java index d74095ea..423c0086 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyPart1ServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyPart1ServiceImpl.java @@ -111,6 +111,9 @@ public class TbsCostApplyPart1ServiceImpl implements TbsCostApplyPart1Service { if(orgCost.getCancelFlag().equals(1)){ Assert.throwEx("该记录的费用已异动"); } + if(orgCost.getContractFlag().equals(1)){ + Assert.throwEx("协议类不支持异动"); + } boolean isExtUser = orgCost.getExtUserId()!=null&&userId.equals(orgCost.getExtUserId()); if(!userId.equals(orgCost.getUserId())&&!isExtUser){ Assert.throwEx("拒绝访问"); diff --git a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java index 79a5f336..22a56e8e 100644 --- a/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java @@ -8,6 +8,7 @@ import com.qs.serve.common.config.properties.ProjectApisProperties; import com.qs.serve.common.config.properties.ProjectProperties; import com.qs.serve.common.framework.manager.AsyncFactory; import com.qs.serve.common.framework.manager.AsyncManager; +import com.qs.serve.common.framework.redis.RedisService; import com.qs.serve.common.model.consts.ApplyTypeConst; import com.qs.serve.common.model.enums.BudgetLogOptFlag; import com.qs.serve.common.model.consts.BudgetLogRollbackFlag; @@ -88,6 +89,8 @@ import java.util.stream.Collectors; @AllArgsConstructor public class TbsCostApplyServiceImpl extends ServiceImpl implements TbsCostApplyService { + private RedisService redisService; + private TbsActivityChannelPointMapper tbsActivityChannelPointMapper; private VtbVerificationMapper vtbVerificationMapper; private TbsBudgetApplicationService budgetApplicationService; private TbsBudgetCostItemService budgetCostItemService; @@ -163,6 +166,9 @@ public class TbsCostApplyServiceImpl extends ServiceImpl vtbLqw = new LambdaQueryWrapper<>(); vtbLqw.eq(VtbVerification::getCostApplyId,id); vtbLqw.and( @@ -495,8 +501,9 @@ public class TbsCostApplyServiceImpl extends ServiceImpl activityList = tbsActivityMapper.selectList(actLqw); + for (TbsActivity activity : activityList) { + Long actId = tbsActivityChannelPointMapper.checkSubjectPoint(activity.getId()); + if(actId!=null){ + Assert.throwEx("活动["+activity.getActivityCode() + "]因科目类型,必须选网点"); + } + } + //判断是否进场费 if(tbsCostApply.getContractFlag()!=null&&tbsCostApply.getContractFlag().equals(2)){ if (activityList.size()>1){ @@ -531,6 +545,12 @@ public class TbsCostApplyServiceImpl extends ServiceImpl payConditions = null; if(tbsCostApply.getContractFlag()!=null&&tbsCostApply.getContractFlag().equals(1)){ + //排查OA是否已提交数据 + String costCode = tbsCostApply.getCode(); + boolean checkExist = seeYonService.checkConstCodeExist(costCode); + if(!checkExist){ + Assert.throwEx("有效流程已在OA存在,无法重新发起流程"); + } LambdaQueryWrapper contractLambdaQueryWrapper = new LambdaQueryWrapper<>(); contractLambdaQueryWrapper.eq(TbsCostContract::getCostApplyId,id); List contractList = costContractMapper.selectList(contractLambdaQueryWrapper); @@ -671,6 +691,7 @@ public class TbsCostApplyServiceImpl extends ServiceImpl listBudgetCheckingAmount(TbsScheduleItemSearch param) { + + LambdaQueryWrapper budgetLqw = new LambdaQueryWrapper<>(); + budgetLqw.in(TbsBudget::getScheduleId,param.getScheduleIds()); + budgetLqw.in(TbsBudget::getCenterCombo,param.getCenterCombos()); + budgetLqw.eq(TbsBudget::getBudgetState,1); + List budgetList = tbsBudgetMapper.selectList(budgetLqw); + + Set budgetIds; + + if(CollectionUtil.isNotEmpty(param.getBrandIds())){ + //无品牌条件 + budgetIds = budgetList.stream() + .filter(a->a.getConditionFlag().equals(0)) + .map(TbsBudget::getId).collect(Collectors.toSet()); + + //筛选符合品牌条件 + List conBudgetIds = budgetList.stream() + .filter(a->a.getConditionFlag().equals(1)) + .map(TbsBudget::getId).collect(Collectors.toList()); + + LambdaQueryWrapper conLqw = new LambdaQueryWrapper<>(); + conBudgetIds.add(0L); + conLqw.in(TbsBudgetCondition::getBudgetId,conBudgetIds); + conLqw.in(TbsBudgetCondition::getBrandId,param.getBrandIds()); + List conditions = budgetConditionMapper.selectList(conLqw); + conBudgetIds = conditions.stream().map(TbsBudgetCondition::getBudgetId).collect(Collectors.toList()); + budgetIds.addAll(conBudgetIds); + }else { + //加载所有 + budgetIds = budgetList.stream().map(TbsBudget::getId).collect(Collectors.toSet()); + } + + budgetIds.add(0L); + + PageHelper.startPage(param.getPageNum(),param.getPageSize()); + + List budgetLogs = tbsBudgetLog2Mapper.getBudgetLogCheckingList(param,new ArrayList<>(budgetIds),param.getScheduleItemBudgetIds(), BudgetLogOptFlag.finalPolicyOptFlag,BudgetLogOptFlag.finalCostOptFlag); + + return budgetLogs; + } } diff --git a/src/main/java/com/qs/serve/modules/third/service/PortalOfCostApplication.java b/src/main/java/com/qs/serve/modules/third/service/PortalOfCostApplication.java index 8ecba32b..79183548 100644 --- a/src/main/java/com/qs/serve/modules/third/service/PortalOfCostApplication.java +++ b/src/main/java/com/qs/serve/modules/third/service/PortalOfCostApplication.java @@ -83,6 +83,7 @@ import java.util.stream.Collectors; @AllArgsConstructor public class PortalOfCostApplication { + private TbsCostContractApplication costContractApplication; private SysUserCodeMathMapper userCodeMathMapper; private final SysSyncLogService sysSyncLogService; private SysTableTempMapper sysTableTempMapper; @@ -187,6 +188,7 @@ public class PortalOfCostApplication { */ @Transactional(rollbackFor = Exception.class) public void createCostProcessByPolicy(ProcessCreatePolicyCostBo createBo){ + LocalDateTime nowTime = LocalDateTime.now(); SysUser user = userService.getByAccount(createBo.getUserCode()); if(user==null){Assert.throwEx("用户不存在,请重新编辑");} TzcPolicyItem policyItem = policyItemServiceService.getByPolicyItemCode(createBo.getPolicyItemCode()); @@ -194,6 +196,9 @@ public class PortalOfCostApplication { if(!policyItem.getPolicyItemStatus().equals(TzPolicyItemStatus.Status_2_SyncSuccess)){ Assert.throwEx("政策项状态异常或未完成同步"); } + if(nowTime.isBefore(policyItem.getPolicyEndDate().atStartOfDay())){ + Assert.throwEx("政策活动已截止于"+policyItem.getPolicyEndDate()); + } if(CollectionUtil.isEmpty(createBo.getGoodsList()) || createBo.getGoodsList().size()==0){ Assert.throwEx("商品数据不能为空"); } @@ -215,7 +220,6 @@ public class PortalOfCostApplication { //常用参数 final String GOODS_TYPE = "sku"; final BigDecimal OneHundred = new BigDecimal("100"); - LocalDateTime nowTime = LocalDateTime.now(); LocalDate nowDate = LocalDate.now(); Long supplierId = Long.parseLong(supplier.getId()); BigDecimal totalAmount = createBo.getTotalAmount(); @@ -1150,11 +1154,13 @@ public class PortalOfCostApplication { paymentItemService.save(paymentItem); verificationSubjectService.save(verificationSubject); } + if(subjectSurplus.compareTo(BigDecimal.ZERO)>0){ Assert.throwEx("余额不足"); } // 修复没有vtbFundFlow异常,并修复活动状态 verificationService.successCommit(verification.getId(),false); + costContractApplication.resetState(); } diff --git a/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyController.java b/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyController.java index 2c39e326..4baea14e 100644 --- a/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyController.java +++ b/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyController.java @@ -184,6 +184,15 @@ public class TzcPolicyController { public R getById(@PathVariable("id") String id){ TzcPolicy tzcPolicy = tzcPolicyService.getById(id); if(tzcPolicy!=null){ + if(tzcPolicy.getPolicyStatus().equals(TzcPolicyStatus.Status_1_Checking)){ + //尝试进行补偿 + try { + tzcPolicyOperationService.runCompensate(id); + tzcPolicy = tzcPolicyService.getById(id); + }catch (Exception e){ + + } + } List policyItemList = tzcPolicyItemService.listByPolicyId(tzcPolicy.getId()); tzcPolicy.setPolicyItemList(policyItemList); } @@ -450,7 +459,7 @@ public class TzcPolicyController { * @param id * @return */ - @PostMapping("/cancellation/{id}") + @DeleteMapping("/cancellation/{id}") public R cancellation(@PathVariable Long id){ List tzcPolicyItemList = tzcPolicyItemService.listByPolicyId(id); List itemIds = tzcPolicyItemList.stream().map(TzcPolicyItem::getId).collect(Collectors.toList()); diff --git a/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyItemController.java b/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyItemController.java index 48027a3e..c7dccf03 100644 --- a/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyItemController.java +++ b/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyItemController.java @@ -8,9 +8,12 @@ import com.qs.serve.common.model.enums.BizType; import com.qs.serve.common.model.enums.SystemModule; import com.qs.serve.common.util.*; import com.qs.serve.modules.sys.entity.SysAttach; +import com.qs.serve.modules.sys.entity.SysUser; import com.qs.serve.modules.sys.service.SysAttachService; +import com.qs.serve.modules.sys.service.SysUserService; import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudgetMapper; +import com.qs.serve.modules.tzc.common.TzPolicyItemStatus; import com.qs.serve.modules.tzc.common.TzcPolicyStatus; import com.qs.serve.modules.tzc.entity.TzcPolicy; import com.qs.serve.modules.tzc.entity.TzcPolicyGoods; @@ -27,6 +30,7 @@ import com.qs.serve.modules.tzc.entity.TzcPolicyItem; import com.qs.serve.modules.tzc.service.TzcPolicyItemService; import javax.validation.Valid; +import java.time.LocalDateTime; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -42,6 +46,7 @@ import java.util.stream.Collectors; @RequestMapping("tzc/policyItem") public class TzcPolicyItemController { + private SysUserService sysUserService; private TbsScheduleItemBudgetMapper tbsScheduleItemBudgetMapper; private TzcPolicyItemService tzcPolicyItemService; private TzcPolicyGoodsService tzcPolicyGoodsService; @@ -49,6 +54,17 @@ public class TzcPolicyItemController { private SysAttachService attachService; private TzcPolicyApplicationService policyApplicationService; + /** + * 释放政策 + * @param policyItemId + * @return + */ + @GetMapping("/releaseDev") + public R releasePcy(Long policyItemId){ + policyApplicationService.syncExpireRelease(); + return R.ok(); + } + /** * 释放政策 * @param policyItemId @@ -56,7 +72,19 @@ public class TzcPolicyItemController { */ @GetMapping("/releasePolicyByItemId") public R releasePolicy(Long policyItemId){ - policyApplicationService.releasePolicyItem(policyItemId); + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + policyApplicationService.releasePolicyItem(policyItemId, sysUser); + return R.ok(); + } + + /** + * 取消释放政策 + * @param policyItemId + * @return + */ + @GetMapping("/cancelReleasePolicyByItemId") + public R cancelReleasePolicyByItemId(Long policyItemId){ + policyApplicationService.cancelReleasePolicyItem(policyItemId); return R.ok(); } @@ -75,7 +103,15 @@ public class TzcPolicyItemController { policy = tzcPolicyService.getById(param.getPolicyId()); } + LocalDateTime nowTime = LocalDateTime.now(); + for (TzcPolicyItem policyItem : list) { + int expire = 0; + if(policyItem.getPolicyEndDate().atStartOfDay().isBefore(nowTime)){ + expire = 1; + } + policyItem.setExpireFlag(expire); + List policyGoodsList = tzcPolicyGoodsService.listByItemId(policyItem.getId()); policyItem.setPolicyGoodsList(policyGoodsList); if(policyItem.getAttachIds()!=null&&policyItem.getAttachIds().length>0){ diff --git a/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyItem.java b/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyItem.java index 559773b0..e4393182 100644 --- a/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyItem.java +++ b/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyItem.java @@ -81,6 +81,24 @@ public class TzcPolicyItem implements Serializable { @NotNull(message = "已用金额不能为空") private BigDecimal usedAmount; + /** 是否释放 */ + private Integer releaseFlag; + + /** 释放时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(updateStrategy = FieldStrategy.NOT_NULL) + private LocalDateTime releaseTime; + + private String releaseUserId; + + private String releaseUserCode; + + private String releaseUserName; + + /** 释放金额 */ + private BigDecimal releaseAmount; + /** 客户id */ @NotNull(message = "客户id不能为空") private Long supplierId; @@ -216,6 +234,12 @@ public class TzcPolicyItem implements Serializable { @TableField(exist = false) private List matchBudgetList; + /** + * 是否过期 + */ + @TableField(exist = false) + private Integer expireFlag; + public void initSetNull(){ this.setId(null); this.setCreateBy(null); diff --git a/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyMapper.java b/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyMapper.java index 301ea5eb..46757958 100644 --- a/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyMapper.java +++ b/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyMapper.java @@ -39,6 +39,12 @@ public interface TzcPolicyMapper extends BaseMapper { */ int cancelCostExtUserByPolicyIds(@Param("policyIds") List policyIds); + /** + * 获取需要释放的Item + * @return + */ + List listExpireItemIds(); + /** * 替换继承人 * @param userId diff --git a/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyApplicationService.java b/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyApplicationService.java index a4b4273e..9405c050 100644 --- a/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyApplicationService.java +++ b/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyApplicationService.java @@ -1,5 +1,6 @@ package com.qs.serve.modules.tzc.service; +import com.qs.serve.modules.sys.entity.SysUser; import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCostResult; import com.qs.serve.modules.tbs.entity.vo.TbsBudgetTableVo; import com.qs.serve.modules.tzc.entity.TzcPolicyItem; @@ -21,7 +22,18 @@ public interface TzcPolicyApplicationService { void syncPolicy(Long policyId); - void releasePolicyItem(Long policyId); + /** + * 同步过期的政策释放 + */ + void syncExpireRelease(); + + /** + * 取消释放 + * @param policyItemId + */ + void cancelReleasePolicyItem(Long policyItemId); + + void releasePolicyItem(Long policyItemId, SysUser user); /** * 创建费用占用结果 diff --git a/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyApplicationServiceImpl.java b/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyApplicationServiceImpl.java index 98da11ec..402bbed6 100644 --- a/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyApplicationServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyApplicationServiceImpl.java @@ -1,11 +1,13 @@ package com.qs.serve.modules.tzc.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.qs.serve.common.config.DevEnvironmentConfig; import com.qs.serve.common.config.properties.ProjectApisProperties; import com.qs.serve.common.config.properties.ProjectProperties; import com.qs.serve.common.framework.manager.AsyncFactory; import com.qs.serve.common.framework.manager.AsyncManager; +import com.qs.serve.common.framework.redis.RedisService; import com.qs.serve.common.model.enums.BudgetLogOptFlag; import com.qs.serve.common.model.consts.BudgetLogRollbackFlag; import com.qs.serve.common.model.dto.R; @@ -53,12 +55,14 @@ import com.qs.serve.modules.tzc.entity.TzcPolicyGoods; import com.qs.serve.modules.tzc.entity.TzcPolicyItem; import com.qs.serve.modules.tzc.entity.dto.PolicyItemDto; import com.qs.serve.modules.tzc.mapper.TzcPolicyItemMapper; +import com.qs.serve.modules.tzc.mapper.TzcPolicyMapper; import com.qs.serve.modules.tzc.service.TzcPolicyApplicationService; import com.qs.serve.modules.tzc.service.TzcPolicyGoodsService; import com.qs.serve.modules.tzc.service.TzcPolicyItemService; import com.qs.serve.modules.tzc.service.TzcPolicyService; import com.qs.serve.modules.vtb.common.VtbFundFlowType; import com.qs.serve.modules.vtb.entity.VtbFundFlow; +import com.qs.serve.modules.vtb.entity.VtbVerification; import com.qs.serve.modules.vtb.service.VtbFundFlowService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -82,6 +86,8 @@ import java.util.stream.Collectors; @AllArgsConstructor public class TzcPolicyApplicationServiceImpl implements TzcPolicyApplicationService { + private RedisService redisService; + private TzcPolicyMapper tzcPolicyMapper; private TzcPolicyService tzcPolicyService; private TzcPolicyItemService tzcPolicyItemService; private TzcPolicyItemMapper tzcPolicyItemMapper; @@ -107,6 +113,7 @@ public class TzcPolicyApplicationServiceImpl implements TzcPolicyApplicationServ private ProjectApisProperties projectApisProperties; private final VtbFundFlowService vtbFundFlowService; + @Override public void syncPolicy(Long policyId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); @@ -119,9 +126,84 @@ public class TzcPolicyApplicationServiceImpl implements TzcPolicyApplicationServ } @Override - public void releasePolicyItem(Long policyItemId) { + public void syncExpireRelease() { + SysUser sysUser = new SysUser(); + sysUser.setId("0"); + sysUser.setName("系统执行"); + sysUser.setCode(""); + List ids = tzcPolicyMapper.listExpireItemIds(); + for (Long id : ids) { + try { + releasePolicyItem(id,sysUser); + } catch (Exception e) { + log.error("释放过期费用失败,itemId:{} 原因:{}",id,e.getMessage()); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelReleasePolicyItem(Long policyItemId) { + TzcPolicyItem policyItem = tzcPolicyItemService.getById(policyItemId); + if(policyItem.getPolicyEndDate().atStartOfDay().isBefore(LocalDateTime.now())){ + Assert.throwEx("政策项已过期,不支持取消释放"); + } + if(!policyItem.getPolicyItemStatus().equals(TzPolicyItemStatus.Status_3_Finished)|| + !policyItem.getReleaseFlag().equals(1)){ + Assert.throwEx("政策项的状态不支持"); + } + //查询已转移金额,金额为正数 + BigDecimal usedAmt = tzcPolicyItemMapper.sumPolicyItemTranAmt(policyItem.getId()); + if(policyItem.getUsedAmount().compareTo(usedAmt)!=0){ + Assert.throwEx("政策的已用金额异常"); + } + + //移除流水 + vtbFundFlowService.remove(new LambdaQueryWrapper() + .eq(VtbFundFlow::getPolicyItemId,policyItemId) + .eq(VtbFundFlow::getFundType,VtbFundFlowType.Release) + ); + + //移除Log释放 + List budgetLogList = budgetLogService.list(new LambdaQueryWrapper() + .eq(TbsBudgetLog::getOptType,BudgetLogOptFlag.State_16.getCode()) + .eq(TbsBudgetLog::getPolicyItemId,policyItemId) + ); + BigDecimal totalRelease = BigDecimal.ZERO; + for (TbsBudgetLog budgetLog : budgetLogList) { + totalRelease = totalRelease.add(budgetLog.getAmount()); + } + if(policyItem.getReleaseAmount().compareTo(totalRelease)!=0){ + Assert.throwEx("释放金额异常"); + } + List logIds = budgetLogList.stream().map(TbsBudgetLog::getId).collect(Collectors.toList()); + budgetLogService.removeBatchByIds(logIds); + + //恢复状态 + policyItem.setReleaseAmount(BigDecimal.ZERO); + policyItem.setReleaseFlag(0); + policyItem.setReleaseTime(null); + policyItem.setReleaseUserId(""); + policyItem.setReleaseUserCode(""); + policyItem.setReleaseUserName(""); + policyItem.setPolicyItemStatus(TzPolicyItemStatus.Status_2_SyncSuccess); + tzcPolicyItemService.updateById(policyItem); + + //恢复主表状态 + Long policyId = policyItem.getPolicyId(); + TzcPolicy policy = tzcPolicyService.getById(policyId); + if(policy.getPolicyStatus().equals(TzcPolicyStatus.Status_3_Success)){ + policy.setPolicyStatus(TzcPolicyStatus.Status_2_PassSuccess); + tzcPolicyService.updateById(policy); + } + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void releasePolicyItem(Long policyItemId, SysUser user) { TzcPolicyItem policyItem = tzcPolicyItemService.getById(policyItemId); - if(!policyItem.getPolicyItemStatus().equals(TzPolicyItemStatus.Status_3_Finished)){ + if(!policyItem.getPolicyItemStatus().equals(TzPolicyItemStatus.Status_2_SyncSuccess)){ Assert.throwEx("政策项的状态不支持"); } Long policyId = policyItem.getPolicyId(); @@ -129,7 +211,11 @@ public class TzcPolicyApplicationServiceImpl implements TzcPolicyApplicationServ if(!policy.getPolicyStatus().equals(TzcPolicyStatus.Status_2_PassSuccess)){ Assert.throwEx("政策的状态不支持"); } + //查询已转移金额,金额为正数 BigDecimal usedAmt = tzcPolicyItemMapper.sumPolicyItemTranAmt(policyItem.getId()); + if(policyItem.getUsedAmount().compareTo(usedAmt)!=0){ + Assert.throwEx("政策的已用金额异常"); + } BigDecimal surplusAmt = policyItem.getDiscountMax().subtract(usedAmt); if(surplusAmt.compareTo(BigDecimal.ZERO)>0){ LambdaQueryWrapper tbsLogLqw = new LambdaQueryWrapper<>(); @@ -165,7 +251,13 @@ public class TzcPolicyApplicationServiceImpl implements TzcPolicyApplicationServ budgetLog.setOptType(optFlag.getCode()); budgetLogService.save(budgetLog); - policyItem.setUsedAmount(policyItem.getDiscountMax()); + //policyItem.setUsedAmount(policyItem.getDiscountMax()); + policyItem.setReleaseAmount(surplusAmt); + policyItem.setReleaseFlag(1); + policyItem.setReleaseTime(LocalDateTime.now()); + policyItem.setReleaseUserId(user.getId()); + policyItem.setReleaseUserCode(user.getCode()); + policyItem.setReleaseUserName(user.getName()); policyItem.setPolicyItemStatus(TzPolicyItemStatus.Status_3_Finished); tzcPolicyItemService.updateById(policyItem); @@ -175,7 +267,7 @@ public class TzcPolicyApplicationServiceImpl implements TzcPolicyApplicationServ boolean allFinished = true; for (TzcPolicyItem item : listByPolicyId) { if(!item.getPolicyItemStatus().equals(TzPolicyItemStatus.Status_3_Finished)){ - if (item.getDiscountMax().compareTo(item.getUsedAmount())==0){ + if (item.getDiscountMax().compareTo(item.getUsedAmount())==0||item.getReleaseFlag().equals(1)){ item.setPolicyItemStatus(TzPolicyItemStatus.Status_3_Finished); tzcPolicyItemService.updateById(item); continue; @@ -289,8 +381,10 @@ public class TzcPolicyApplicationServiceImpl implements TzcPolicyApplicationServ @Override @Transactional(rollbackFor = Exception.class) public void commitPolicy(Long policyId){ - seeYonService.testConnection(); TzcPolicy tzcPolicy = tzcPolicyService.getById(policyId); + + redisService.throwResLock(TzcPolicy.class.getSimpleName(),tzcPolicy.getId()+""); + seeYonService.testConnection(); Integer tzcPolicyStatus = tzcPolicy.getPolicyStatus(); if(!tzcPolicy.allowEditFlag()){ Assert.throwEx("操作失败,政策状态不支持"); diff --git a/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java b/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java index 3efda2c6..977e8d38 100644 --- a/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java +++ b/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java @@ -335,7 +335,7 @@ public class VtbVerificationController { * @param commitBo * @return */ - @LimitSubmit(interval = 3000) + @LimitSubmit(interval = 30000) @PostMapping("/commit") @SysLog(module = SystemModule.Verification, title = "核销", biz = BizType.UPDATE) @PreAuthorize("hasRole('vtb:verification:commit')") diff --git a/src/main/java/com/qs/serve/modules/vtb/mapper/VtbFundFlowMapper.java b/src/main/java/com/qs/serve/modules/vtb/mapper/VtbFundFlowMapper.java index 43f0717d..ae1347f5 100644 --- a/src/main/java/com/qs/serve/modules/vtb/mapper/VtbFundFlowMapper.java +++ b/src/main/java/com/qs/serve/modules/vtb/mapper/VtbFundFlowMapper.java @@ -1,5 +1,6 @@ package com.qs.serve.modules.vtb.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.qs.serve.common.model.AmountDTO; import com.qs.serve.modules.vtb.entity.VtbFundFlow; @@ -14,6 +15,9 @@ import java.util.List; */ public interface VtbFundFlowMapper extends BaseMapper { + @InterceptorIgnore(tenantLine = "1") + List listMissReleaseActivityId(); + /** * 统计金额 * @param flow diff --git a/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationMapper.java b/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationMapper.java index 77894e0a..9a52a32e 100644 --- a/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationMapper.java +++ b/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationMapper.java @@ -84,5 +84,11 @@ public interface VtbVerificationMapper extends BaseMapper { */ int updateCostExtUserByCostIds(@Param("costIds") List costIds, @Param("obj") SysUser sysUser); + /** + * 获取活动核销金额 + * @param actId + * @return + */ + BigDecimal getActivityVerificationAmt(@Param("actId")Long actId); } diff --git a/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java b/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java index 1c98ebcf..483d9b41 100644 --- a/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java @@ -8,6 +8,7 @@ import com.qs.serve.common.config.properties.ProjectApisProperties; import com.qs.serve.common.config.properties.ProjectProperties; import com.qs.serve.common.framework.manager.AsyncFactory; import com.qs.serve.common.framework.manager.AsyncManager; +import com.qs.serve.common.framework.redis.RedisService; import com.qs.serve.common.model.AmountDTO; import com.qs.serve.common.model.enums.BudgetLogOptFlag; import com.qs.serve.common.model.dto.R; @@ -103,6 +104,7 @@ public class VtbVerificationServiceImpl extends ServiceImpl subjectCenterBoList = verificationBo.getSubjectCenterList(); boolean isCenterCheck = CollectionUtil.isNotEmpty(subjectCenterBoList); @@ -844,6 +852,7 @@ public class VtbVerificationServiceImpl extends ServiceImpl + + + + + + + + + + + + + + + + + + + + + + + + + + + bir_budget_target.`id`, + bir_budget_target.`search_type`, + bir_budget_target.`year_num`, + bir_budget_target.`quarter_num`, + bir_budget_target.`month_num`, + bir_budget_target.`target_amt`, + bir_budget_target.`budget_amt`, + bir_budget_target.`dispatch_amt`, + bir_budget_target.`last_year_dispatch_amt`, + bir_budget_target.`province_city_amt`, + bir_budget_target.`province_city_region_amt`, + bir_budget_target.`total_real_amt`, + bir_budget_target.`brand_id`, + bir_budget_target.`brand_code`, + bir_budget_target.`brand_name`, + bir_budget_target.`center_type`, + bir_budget_target.`center_id`, + bir_budget_target.`center_code`, + bir_budget_target.`center_name` + + + + diff --git a/src/main/resources/mapper/bms/BmsSupplierMapper.xml b/src/main/resources/mapper/bms/BmsSupplierMapper.xml index 8a458171..65a03216 100644 --- a/src/main/resources/mapper/bms/BmsSupplierMapper.xml +++ b/src/main/resources/mapper/bms/BmsSupplierMapper.xml @@ -85,14 +85,19 @@ bms_supplier.`del_flag` + + diff --git a/src/main/resources/mapper/tbs/TbsBudget2Mapper.xml b/src/main/resources/mapper/tbs/TbsBudget2Mapper.xml index 161acaae..d31136e7 100644 --- a/src/main/resources/mapper/tbs/TbsBudget2Mapper.xml +++ b/src/main/resources/mapper/tbs/TbsBudget2Mapper.xml @@ -114,6 +114,7 @@ group by tbs_budget_log.schedule_item_budget_id + + + diff --git a/src/main/resources/mapper/tzc/TzcPolicyMapper.xml b/src/main/resources/mapper/tzc/TzcPolicyMapper.xml index 250dbc1f..8ed67274 100644 --- a/src/main/resources/mapper/tzc/TzcPolicyMapper.xml +++ b/src/main/resources/mapper/tzc/TzcPolicyMapper.xml @@ -107,6 +107,21 @@ order by create_time desc + + update tzc_policy set ext_user_id = #{obj.id},ext_user_code=#{obj.code},ext_user_name=#{obj.name} diff --git a/src/main/resources/mapper/vtb/VtbFundFlowMapper.xml b/src/main/resources/mapper/vtb/VtbFundFlowMapper.xml index 43f2271f..48054895 100644 --- a/src/main/resources/mapper/vtb/VtbFundFlowMapper.xml +++ b/src/main/resources/mapper/vtb/VtbFundFlowMapper.xml @@ -98,6 +98,26 @@ GROUP BY center_good_item_id + + diff --git a/src/main/resources/mapper/vtb/VtbVerfifcationMapper.xml b/src/main/resources/mapper/vtb/VtbVerfifcationMapper.xml index 4b01e7d8..4a203791 100644 --- a/src/main/resources/mapper/vtb/VtbVerfifcationMapper.xml +++ b/src/main/resources/mapper/vtb/VtbVerfifcationMapper.xml @@ -26,5 +26,23 @@ + +