commit b65c4df52ab72db66ff10130dd9ab4f7954cfb98 Author: Yen Date: Tue Apr 15 15:32:46 2025 +0800 初始化 diff --git a/cms-api/cms-admin-svc/pom.xml b/cms-api/cms-admin-svc/pom.xml new file mode 100644 index 0000000..e300cd5 --- /dev/null +++ b/cms-api/cms-admin-svc/pom.xml @@ -0,0 +1,58 @@ + + + + cms-api + com.qs + 1.0-SNAPSHOT + + 4.0.0 + + cms-admin-svc + + + 8 + 8 + + + + + com.qs + cms-framework + 1.0-SNAPSHOT + + + com.qs + cms-actuator + 1.0-SNAPSHOT + + + com.qs + cms-system + 1.0-SNAPSHOT + + + + + + serve + + + org.springframework.boot + spring-boot-maven-plugin + + com.qs.serve.Application + + + + + repackage + + + + + + + + diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/Application.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/Application.java new file mode 100644 index 0000000..af6486a --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/Application.java @@ -0,0 +1,67 @@ +package com.qs.serve; + +import com.qs.serve.common.config.DevEnvironmentConfig; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.stereotype.Indexed; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.annotation.PostConstruct; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import java.util.TimeZone; + +/** + * @author YenHex + * @since 2022/2/24 + */ +@Indexed +@EnableAsync +@EnableScheduling +@EnableTransactionManagement +@EnableCaching +@EnableFeignClients +@SpringBootApplication +public class Application extends SpringBootServletInitializer { + + @Value("${project.dev}") + String dev; + + public static void main(String[] args) { + long start = System.currentTimeMillis(); + SpringApplication.run(Application.class,args); + long end = System.currentTimeMillis(); + double diff = (end-start)/1000.0; + System.out.println("启动时间:"+diff + +"\n ____ _ _ __ _ _ \n" + + " / ___| | |_ __ _ _ __ | |_ _ _ _ __ ___ _ _ ___ ___ ___ ___ ___ / _| _ _ | || |\n" + + " \\___ \\ | __|/ _` || '__|| __| | | | || '_ \\ / __|| | | | / __|/ __|/ _ \\/ __|/ __|| |_ | | | || || |\n" + + " ___) || |_| (_| || | | |_ | |_| || |_) | \\__ \\| |_| || (__| (__| __/\\__ \\\\__ \\| _|| |_| || ||_|\n" + + " |____/ \\__|\\__,_||_| \\__| \\__,_|| .__/ |___/ \\__,_| \\___|\\___|\\___||___/|___/|_| \\__,_||_|(_)\n" + + " |_| \n"); + } + + @Override + public void onStartup(ServletContext servletContext) throws ServletException { + super.onStartup(servletContext); + } + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + return builder.sources(Application.class); + } + + @PostConstruct + void started() { + TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); + DevEnvironmentConfig.openDevEnv(dev.equals("true")); + } + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/AdminPortalController.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/AdminPortalController.java new file mode 100644 index 0000000..a4d8535 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/AdminPortalController.java @@ -0,0 +1,408 @@ +package com.qs.serve.controller; + +import cn.hutool.crypto.SecureUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.config.properties.ProjectProperties; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.framework.security.model.LoginUserType; +import com.qs.serve.common.model.annotation.LimitSubmit; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.consts.GySysConst; +import com.qs.serve.common.model.consts.RedisCacheKeys; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.common.model.enums.BizType; +import com.qs.serve.common.util.*; +import com.qs.serve.common.util.model.DateFormatString; +import com.qs.serve.controller.dto.SyLoginParam; +import com.qs.serve.modules.seeyon.SyKeyLoginUtil; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.mapper.GoodsImminentBatchMapper; +import com.qs.serve.modules.goods.service.GoodsCategoryRuleService; +import com.qs.serve.modules.goods.service.GoodsCategoryService; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.oms.entity.OmsOrder; +import com.qs.serve.modules.oms.entity.OmsOrderItem; +import com.qs.serve.modules.oms.entity.OmsSaleOrder; +import com.qs.serve.modules.oms.entity.OmsSaleOrderItem; +import com.qs.serve.modules.oms.mapper.OmsOrderMapper; +import com.qs.serve.modules.oms.service.OmsOrderItemService; +import com.qs.serve.modules.oms.service.OmsOrderService; +import com.qs.serve.modules.oms.service.OmsSaleOrderItemService; +import com.qs.serve.modules.oms.service.OmsSaleOrderService; +import com.qs.serve.modules.seeyon.entity.SyAffairStateResult; +import com.qs.serve.modules.seeyon.enums.SyAffairState; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysTenant; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.entity.dto.SysLoginByPhoneParam; +import com.qs.serve.modules.sys.entity.dto.SysLoginParam; +import com.qs.serve.modules.sys.entity.dto.SysResetPwdByPhoneParam; +import com.qs.serve.modules.sys.service.SysTenantService; +import com.qs.serve.modules.sys.service.SysUserLoginService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.service.TbsActivityService; +import com.qs.serve.modules.tbs.service.TbsCostApplyService; +import com.qs.serve.modules.tzc.entity.TzcPolicy; +import com.qs.serve.modules.tzc.service.TzcPolicyService; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.entity.VtbVerificationBatch; +import com.qs.serve.modules.vtb.service.VtbVerificationBatchService; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * 门户:后台接口 + * @author YenHex + * @since 2022/3/2 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("portal") +public class AdminPortalController { + + private SysTenantService sysTenantService; + private SysUserLoginService sysUserLoginService; + private RedisService redisService; + private SysUserService sysUserService; + private ProjectProperties projectProperties; + private SeeYonRequestService seeYonRequestService; + private TbsCostApplyService costApplyService; + private VtbVerificationService verificationService; + private VtbVerificationBatchService verificationBatchService; + private TzcPolicyService policyService; + private TbsActivityService activityService; + private GoodsImminentBatchMapper goodsImminentBatchMapper; + private OmsOrderMapper omsOrderMapper; + + private OmsOrderService omsOrderService; + private OmsOrderItemService omsOrderItemService; + + private OmsSaleOrderService omsSaleOrderService; + private OmsSaleOrderItemService omsSaleOrderItemService; + + private BmsSupplierAddressService bmsSupplierAddressService; + private GoodsCategoryRuleService goodsCategoryRuleService; + private GoodsSpuService goodsSpuService; + private GoodsSkuService goodsSkuService; + private GoodsCategoryService goodsCategoryService; + + @GetMapping("/getSystemTime") + public R getSystemTime(){ + return R.ok(DateUtils.format(LocalDateTime.now(), DateFormatString.DATE_TIME)); + } + + /** + * 获取所有租户 + * @return + */ + @GetMapping("/listTenant") + public R> getList(){ + List list = sysTenantService.list2(); + return R.ok(list); + } + + /** + * 致远远程跳转接口 + * @param param + * @param response + * @throws IOException + */ + @GetMapping("/syKeyLogin") + public void getList(SyLoginParam param, HttpServletResponse response) throws IOException { + String templateCode = param.getTemplateCode(); + String syId = param.getSyId(); + + // dev remove + if(!StringUtils.hasText(syId)){ + response.sendRedirect(projectProperties.getWebUrl()+"/#/login?"); + return; + } + + String key = param.getKey(); + SyAffairStateResult affairStateResult = seeYonRequestService.checkAffairState(key,syId,templateCode); + + // dev add + //syId = affairStateResult.getMemberId(); + + if(affairStateResult.getState()==SyAffairState.error){ + response.sendRedirect(projectProperties.getWebUrl()+"/#/login?"); + return; + } + + //通过类型和key获取审批id + String targetId = affairStateResult.getTargetId(); + String affairId = affairStateResult.getAffairId(); + String memberId = affairStateResult.getMemberId(); + + //通过syId生成token + String token = sysUserLoginService.loginBySyUserId(syId); + if(token==null){ + response.sendRedirect(projectProperties.getWebUrl()+"/#/login?"); + return; + }else { + String jumpUrl = "404"; + SyAffairState affairState = affairStateResult.getState(); + if(affairState!=SyAffairState.none&&affairState!=SyAffairState.error){ + //判断是否当前人员 + if(syId.equals(memberId)){ + //待审列表 + if (affairState==SyAffairState.next){ + if(templateCode.equals(TbsSeeYonConst.BatchCostCheckConf.Code())){ + VtbVerificationBatch object = verificationBatchService.getById(targetId); + jumpUrl = SyKeyLoginUtil.getUnCheckedUrl4BatchVerification(object.getCostApplyId(),affairId,object.getId()); + }else if(templateCode.equals(TbsSeeYonConst.CostCheckConf.Code())){ + VtbVerification object = verificationService.getById(targetId); + TbsActivity activity = activityService.getById(object.getActivityId()); + jumpUrl = SyKeyLoginUtil.getPreCheckUrl4Verification(activity.getCostApplyId(),activity.getId(),object.getId(),affairId); + }else{ + jumpUrl = SyKeyLoginUtil.getPreCheckUrl(templateCode,targetId,affairId); + } + }else { + if(templateCode.equals(TbsSeeYonConst.BatchCostCheckConf.Code())){ + VtbVerificationBatch object = verificationBatchService.getById(targetId); + jumpUrl = SyKeyLoginUtil.getCheckedUrl4BatchVerification(object.getCostApplyId(),affairId,object.getId()); + }else if(templateCode.equals(TbsSeeYonConst.CostCheckConf.Code())){ + VtbVerification object = verificationService.getById(targetId); + TbsActivity activity = activityService.getById(object.getActivityId()); + jumpUrl = SyKeyLoginUtil.getCheckedDetailUrl4Verification(activity.getCostApplyId(),activity.getId(),object.getId()); + }else{ + jumpUrl = SyKeyLoginUtil.getCheckedDetailUrl(templateCode,targetId); + } + } + }else{ + //判断是否创建人,创建人则跳转到详情 + SysUser sysUser = sysUserService.getBySyId(syId); + String creator = null; + //非当前表单用户跳转到404页面 + if(templateCode.equals(TbsSeeYonConst.CostApplyConf.Code())){ + TbsCostApply object = costApplyService.getById(targetId); + creator = object.getCreateBy(); + }else if(templateCode.equals(TbsSeeYonConst.CostCheckConf.Code())){ + VtbVerification object = verificationService.getById(targetId); + creator = object.getCreateBy(); + }else if(templateCode.equals(TbsSeeYonConst.BatchCostCheckConf.Code())){ + VtbVerificationBatch object = verificationBatchService.getById(targetId); + creator = object.getCreateBy(); + }else if(templateCode.equals(TbsSeeYonConst.PolicyConf.Code())){ + TzcPolicy object = policyService.getById(targetId); + creator = object.getCreateBy(); + } + if(creator!=null&&creator.equals(sysUser.getId())){ + jumpUrl = SyKeyLoginUtil.getMyDetailUrl(templateCode,targetId); + } + } + } + String fontUrl = projectProperties.getWebUrl() + "/#/jump?code=001&token="+token+"&jumpTo="+jumpUrl; + log.warn("fontUrl:{}",fontUrl); + response.sendRedirect(fontUrl); + } + } + + /** + * 登录接口 + * @return + */ + @LimitSubmit + @SysLog(title = "人员",desc = "后台登录",biz = BizType.LOGIN,saveReqParam = false) + @PostMapping("/login") + public R login(@RequestBody @Valid SysLoginParam param){ + return R.ok(sysUserLoginService.login(param)); + } + + /** + * 登录接口 + * @return + */ + @PostMapping("/flushToken") + public R flushToken(HttpServletRequest request){ + String token = request.getHeader(GySysConst.AUTHORIZATION_PROP); + String userId = JwtUtils.getUserId(token); + String client = JwtUtils.getClient(token); + String redisKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client,userId); + Map tokenMap = new HashMap<>(10); + String token2 = JwtUtils.generateToken(userId, LoginUserType.SYS_USER,client); + redisService.set(redisKey,token2); + tokenMap.put("token", token2); + tokenMap.put("client",client); + return R.ok(tokenMap); + } + + /** + * 手机登陆 + * @return + */ + @LimitSubmit + @SysLog(title = "人员",desc = "手机登陆",biz = BizType.LOGIN,saveReqParam = false) + @PostMapping("/phoneLogin") + public R phoneLogin(@RequestBody @Valid SysLoginByPhoneParam param){ + return R.ok(sysUserLoginService.login(param)); + } + + /** + * 登出接口 + * @return + */ + @SysLog(title = "人员",desc = "退出登录",biz = BizType.LOGOUT,saveReqParam = false) + @GetMapping("/logout") + public R login(){ + return R.ok(); + } + + + /** + * 获取用户手机验证码 + */ + @LimitSubmit(interval = 10000,message = "请10秒后尝试") + @SysLog(title = "人员",desc = "获取用户手机验证码",biz = BizType.OTHER) + @GetMapping("/userPhoneCode/{phone}") + public R phoneCode(@PathVariable("phone") String phone){ + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysUser::getAccount,phone); + Long count = sysUserService.count(wrapper); + if(count<1L){ + return R.error("无效手机号,请重新输入"); + } + String key = RedisCacheKeys.PHONE_KEY+phone; + String code = redisService.getString(key); + if(code==null){ + code = IdUtil.genCode(6); + } + redisService.set(key,code,1, TimeUnit.MINUTES); + // send msg + return R.ok(); + } + + /** + * 重置手机用户密码 + */ + @LimitSubmit(interval = 10000,message = "请10秒后尝试") + @SysLog(title = "人员",desc = "重置手机用户密码",biz = BizType.RESET) + @PostMapping("/resetPwdByPhone") + public R phoneCode(@RequestBody @Valid SysResetPwdByPhoneParam param){ + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysUser::getAccount,param.getPhone()); + List userList = sysUserService.list(wrapper); + if(userList.size()<1){ + return R.error("无效手机号,请重新输入"); + } + String key = RedisCacheKeys.PHONE_KEY+param.getPhone(); + String code = redisService.getString(key); + if(!param.getCode().equals(code)){ + return R.error("验证码无效或过期"); + } + SysUser sysUser = new SysUser(); + sysUser.setId(userList.get(0).getId()); + sysUser.setPassword(SecureUtil.md5(param.getNewPwd())); + sysUserService.updateById(sysUser); + return R.ok(); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getOrder/{id}") + public R getById(@PathVariable("id") String id,String supplierId){ + AuthContextUtils.setTenant("001"); + OmsOrder omsOrder = omsOrderService.getById(id); + if(omsOrder==null){return R.errorNotFound();} + omsOrder.setBrandRuleInfo(goodsCategoryRuleService.getById(omsOrder.getBrandRuleId())); + omsOrder.setAddressInfo(bmsSupplierAddressService.getById(omsOrder.getSupplierAddrId())); + + // 关联折扣信息 + if(StringUtils.hasText(omsOrder.getOaRateId())){ + SimpleKeyValue obj = omsOrderMapper.getExpiredRateInfo(omsOrder.getOaRateId()); + omsOrder.setDiscountRateInfo(obj); + } + if(omsOrder.getSupplierId().toString().equals(supplierId)){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(OmsOrderItem::getOrderId,id); + List list = omsOrderItemService.list(lqw); + for (OmsOrderItem orderItem : list) { + GoodsSpu goodsSpu = goodsSpuService.getById(orderItem.getSpuId()); + GoodsCategory goodsCategory = goodsCategoryService.getById(goodsSpu.getCategoryLast()); + orderItem.setCategoryInfo(goodsCategory); + orderItem.setSpuInfo(goodsSpu); + GoodsSku goodsSku = goodsSkuService.getById(orderItem.getSkuId()); + if(goodsSku!=null){ + orderItem.setSkuSpecialFlag(goodsSku.getSpecialFlag()); + } + //临期品添加批次对象 + if(omsOrder.getOrderType().equals(3)&&orderItem.getSkuBatchId()!=null){ + orderItem.setBatchInfo(goodsImminentBatchMapper.selectById(orderItem.getSkuBatchId())); + } + } + omsOrder.setOrderItems(list); + return R.ok(omsOrder); + } + + return R.error(); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getSaleOrder/{id}") + public R getSaleOrderById(@PathVariable("id") String id, String supplierId){ + AuthContextUtils.setTenant("001"); + OmsSaleOrder omsOrder = omsSaleOrderService.getById(id); + if(omsOrder==null){return R.errorNotFound();} + omsOrder.setBrandRuleInfo(goodsCategoryRuleService.getById(omsOrder.getBrandRuleId())); + omsOrder.setAddressInfo(bmsSupplierAddressService.getById(omsOrder.getSupplierAddrId())); + + // 关联折扣信息 + if(StringUtils.hasText(omsOrder.getOaRateId())){ + SimpleKeyValue obj = omsOrderMapper.getExpiredRateInfo(omsOrder.getOaRateId()); + omsOrder.setDiscountRateInfo(obj); + } + if(omsOrder.getSupplierId().toString().equals(supplierId)){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(OmsSaleOrderItem::getOrderId,id); + List list = omsSaleOrderItemService.list(lqw); + for (OmsSaleOrderItem orderItem : list) { + GoodsSpu goodsSpu = goodsSpuService.getById(orderItem.getSpuId()); + GoodsCategory goodsCategory = goodsCategoryService.getById(goodsSpu.getCategoryLast()); + orderItem.setCategoryInfo(goodsCategory); + orderItem.setSpuInfo(goodsSpu); + GoodsSku goodsSku = goodsSkuService.getById(orderItem.getSkuId()); + if(goodsSku!=null){ + orderItem.setSkuSpecialFlag(goodsSku.getSpecialFlag()); + } + //临期品添加批次对象 + if(omsOrder.getOrderType().equals(3)&&orderItem.getSkuBatchId()!=null){ + orderItem.setBatchInfo(goodsImminentBatchMapper.selectById(orderItem.getSkuBatchId())); + } + } + omsOrder.setOrderItems(list); + return R.ok(omsOrder); + } + return R.error(); + } + + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/CommonApi.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/CommonApi.java new file mode 100644 index 0000000..7c71c7e --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/CommonApi.java @@ -0,0 +1,21 @@ +package com.qs.serve.controller; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 门户:API通用接口 + * @author YenHex + * @since 2022/3/14 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/api/common") +public class CommonApi { + + + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/CommonController.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/CommonController.java new file mode 100644 index 0000000..d657ac7 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/CommonController.java @@ -0,0 +1,120 @@ +package com.qs.serve.controller; + +import com.qs.serve.common.config.properties.UploadProperties; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.enums.BizType; +import com.qs.serve.common.util.IdUtil; +import com.qs.serve.common.util.JwtUtils; +import com.qs.serve.common.util.UploadUtil; +import com.qs.serve.modules.oss.service.OssService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.util.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.IOException; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +/** + * 门户:后台通用接口 + * @author YenHex + * @since 2022/3/14 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/common") +public class CommonController { + + private UploadProperties uploadProperties; + + private OssService ossService; + + /** + * 获取签名 + * @param request + * @return + */ + @GetMapping("/getSign") + public R getSign(HttpServletRequest request) { + return R.ok(ossService.getPolicySign()); + } + + + /** + * 单图上传 + * @apiNote file不能为空 + * @param request + * @return + */ + @SysLog(title = "文件",biz = BizType.UPLOAD) + @PostMapping("/upload") + public R upload(HttpServletRequest request) { + String relativePath = UploadUtil.put(uploadProperties.getLogicalPath(),IdUtil.timeStampId(),request); + if(relativePath!=null){ + return R.ok(uploadProperties.getProxyUrl()+relativePath,"上传成功"); + } + return R.error("上传失败"); + } + + /** + * 验证token + * @param token + * @return + */ + @PostMapping("/validToken") + public R validToken(String token) { + return R.isOk(JwtUtils.verify(token),"无效token"); + } + + /** + * 多图上传 + * @apiNote files不能为空 + * @param request + * @return + */ + @SysLog(title = "文件",biz = BizType.UPLOAD) + @PostMapping( "/uploadMulti") + public R multiUpload(HttpServletRequest request) { + String contentType = request.getContentType(); + List files = null; + if (contentType != null && contentType.toLowerCase().startsWith("multipart")) { + MultipartHttpServletRequest multipartHttpServletRequest = WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class); + files = multipartHttpServletRequest.getFiles("files"); + } + if (files==null||files.isEmpty()) { + return R.error("请选择文件"); + } + List list = new ArrayList<>(); + for (int i = 0; i < files.size(); i++) { + MultipartFile file = files.get(i); + if (file.isEmpty()) { + return R.error("上传第" + (i++) + "个文件失败"); + } + String fileOrgName = file.getOriginalFilename(); + String mimeType = fileOrgName.substring(fileOrgName.lastIndexOf(".")); + String filePath = LocalDate.now().toString().replace("-","")+"/"+ IdUtil.timeStampId()+mimeType; + String uploadPath = uploadProperties.getLogicalPath(); + File dest = new File(uploadPath + filePath); + try { + file.transferTo(dest); + list.add(uploadProperties.getProxyUrl()+filePath); + } catch (IOException e) { + log.error(e.toString(), e); + return R.error("上传第" + (i++) + "个文件失败"); + } + } + return R.ok(list); + } + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/WxMpPortalApi.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/WxMpPortalApi.java new file mode 100644 index 0000000..a41d23e --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/WxMpPortalApi.java @@ -0,0 +1,122 @@ +package com.qs.serve.controller; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.mp.api.WxMpMessageRouter; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.bind.annotation.*; + +/** + * 门户:微信公众号回调 + * @author YenHex + * @since 2022-03-07 + */ +@Slf4j +@AllArgsConstructor +//@RestController +//@RequestMapping("/api/wx/mp/portal/{appid}") +public class WxMpPortalApi { + + private final WxMpService wxService; + private final WxMpMessageRouter messageRouter; + + /** + * 校验身份 + * @param appid + * @param signature + * @param timestamp + * @param nonce + * @param echostr + * @return + */ + @GetMapping(produces = "text/plain;charset=utf-8") + public String authGet(@PathVariable String appid, + @RequestParam(name = "signature", required = false) String signature, + @RequestParam(name = "timestamp", required = false) String timestamp, + @RequestParam(name = "nonce", required = false) String nonce, + @RequestParam(name = "echostr", required = false) String echostr) { + + log.info("\n接收到来自微信服务器的认证消息:[{}, {}, {}, {}]", signature, + timestamp, nonce, echostr); + if (StringUtils.isAnyBlank(signature, timestamp, nonce, echostr)) { + throw new IllegalArgumentException("请求参数非法,请核实!"); + } + if (!this.wxService.switchover(appid)) { + throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid)); + } + if (wxService.checkSignature(timestamp, nonce, signature)) { + return echostr; + } + return "非法请求"; + } + + /** + * 身份校验2 + * @param appid + * @param requestBody + * @param signature + * @param timestamp + * @param nonce + * @param openid + * @param encType + * @param msgSignature + * @return + */ + @PostMapping(produces = "application/xml; charset=UTF-8") + public String post(@PathVariable String appid, + @RequestBody String requestBody, + @RequestParam("signature") String signature, + @RequestParam("timestamp") String timestamp, + @RequestParam("nonce") String nonce, + @RequestParam("openid") String openid, + @RequestParam(name = "encrypt_type", required = false) String encType, + @RequestParam(name = "msg_signature", required = false) String msgSignature) { + log.info("\n接收微信请求:[openid=[{}], [signature=[{}], encType=[{}], msgSignature=[{}]," + + " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ", + openid, signature, encType, msgSignature, timestamp, nonce, requestBody); + if (!this.wxService.switchover(appid)) { + throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid)); + } + + if (!wxService.checkSignature(timestamp, nonce, signature)) { + throw new IllegalArgumentException("非法请求,可能属于伪造的请求!"); + } + String out = null; + if (encType == null) { + // 明文传输的消息 + WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(requestBody); + WxMpXmlOutMessage outMessage = this.route(inMessage); + if (outMessage == null) { + return ""; + } + out = outMessage.toXml(); + } else if ("aes".equalsIgnoreCase(encType)) { + // aes加密的消息 + WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml(requestBody, wxService.getWxMpConfigStorage(), + timestamp, nonce, msgSignature); + log.debug("\n消息解密后内容为:\n{} ", inMessage.toString()); + WxMpXmlOutMessage outMessage = this.route(inMessage); + if (outMessage == null) { + return ""; + } + + out = outMessage.toEncryptedXml(wxService.getWxMpConfigStorage()); + } + + log.debug("\n组装回复信息:{}", out); + return out; + } + + private WxMpXmlOutMessage route(WxMpXmlMessage message) { + try { + return this.messageRouter.route(message); + } catch (Exception e) { + log.error("路由消息时出现异常!", e); + } + return null; + } + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/WxSvcLoginApi.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/WxSvcLoginApi.java new file mode 100644 index 0000000..15b7f39 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/WxSvcLoginApi.java @@ -0,0 +1,237 @@ +package com.qs.serve.controller; + +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.framework.security.model.LoginUser; +import com.qs.serve.common.framework.security.model.LoginUserType; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.consts.RedisCacheKeys; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.enums.BizType; +import com.qs.serve.common.model.enums.HttpCode; +import com.qs.serve.common.model.enums.InterType; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.mapper.SysTenantMapper; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.sys.service.impl.SysUserDetailsServiceImpl; +import com.qs.serve.modules.wx.common.conf.WxCpConfig; +import com.qs.serve.modules.wx.entity.WxApp; +import com.qs.serve.modules.wx.entity.WxUser; +import com.qs.serve.modules.wx.entity.dto.WxLoginUser; +import com.qs.serve.modules.wx.service.WxAppService; +import com.qs.serve.modules.wx.service.WxUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl; +import me.chanjar.weixin.cp.bean.WxCpAgentJsapiSignature; +import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl; +import org.jetbrains.annotations.NotNull; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/** + * 门户:微信登录 + * @author YenHex + * @since 2022/3/7 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/api/wx/login") +public class WxSvcLoginApi { + + private final WxUserService wxUserService; + + private final RedisService redisService; + + private final SysUserDetailsServiceImpl userDetailsService; + + private final SysTenantMapper sysTenantMapper; + private final WxAppService wxAppService; + private SysUserService sysUserService; + + /** + * 企业微信登录 + * @param wxLoginUser + * @param request + * @return + */ + @SysLog(title = "企业微信登录",biz = BizType.LOGIN,inter = InterType.API) + @PostMapping("/cp") + public R loginCompanyApp(@RequestBody @Valid WxLoginUser wxLoginUser, HttpServletRequest request){ + WxUser wxUser = null; + try { + wxUser = wxUserService.login(wxLoginUser,request); + } catch (Exception e) { + Assert.throwEx(e.getMessage()); + } + if(wxUser==null){ + Assert.throwEx(HttpCode.WX_ERR); + } + Map objectMap = genTokenInfo(request, wxUser); + return R.ok(objectMap); + } + + /** + * 获取签名授权 + * @param url + * @param request + * @return + */ + @GetMapping("/getCpSignature") + public R getCpSignature(String url, HttpServletRequest request) { + AuthContextUtils.setTenant("001"); + String agentIdStr = request.getHeader("agentId"); + String appId = AuthContextUtils.getAppId(); + WxApp wxApp = wxAppService.getById(appId); + Integer agentId = Integer.parseInt(agentIdStr); + // 企业微信登录 + WxCpService wxCpService = new WxCpServiceImpl(); + WxCpDefaultConfigImpl config =new WxCpDefaultConfigImpl(); + config.setAgentId(agentId); + config.setCorpSecret(WxCpConfig.getSecret(agentId)); + config.setCorpId(wxApp.getId()); + wxCpService.setWxCpConfigStorage(config); + WxCpAgentJsapiSignature signature = null; + try { + signature = wxCpService.createAgentJsapiSignature(url); + } catch (WxErrorException e) { + log.warn("企业微信签名授权失败:appid{},agentId:{},{}",appId,agentId,e.getMessage()); + } + return R.ok(signature); + } + + /** + * 企业微信登录 + * @param wxLoginUser + * @param request + * @return + */ + @SysLog(title = "企业微信登录",biz = BizType.LOGIN,inter = InterType.API) + @PostMapping("/cp4Pc") + public R loginCompanyPc(@RequestBody @Valid WxLoginUser wxLoginUser, HttpServletRequest request){ + WxUser wxUser = null; + try { + wxUser = wxUserService.login(wxLoginUser,request); + } catch (Exception e) { + Assert.throwEx(e.getMessage()); + } + if(wxUser==null){ + Assert.throwEx(HttpCode.WX_ERR); + } + Map objectMap = genTokenInfo(request, wxUser); + return R.ok(objectMap.get("adminTokenInfo")); + } + + /** + * 小程序登陆(暂测试) + * @param wxLoginUser + * @param request + * @return + */ + @SysLog(title = "小程序登录",biz = BizType.LOGIN,inter = InterType.API) + @PostMapping("/ma") + public R loginMicroApp(@RequestBody @Valid WxLoginUser wxLoginUser, HttpServletRequest request){ + WxUser wxUser = null; + try { + wxUser = wxUserService.login(wxLoginUser,request); + } catch (Exception e) { + log.warn(e.getMessage()); + } + if(wxUser==null){ + Assert.throwEx(HttpCode.WX_ERR); + } + Map objectMap = genTokenInfo(request, wxUser); + return R.ok(objectMap); + } + + /** + * 公众号登录 + * @param wxLoginUser + * @return + * @throws Exception + */ + @SysLog(title = "公众号登录",biz = BizType.LOGIN,inter = InterType.API) + @PostMapping("/mp") + public R login(@RequestBody @Valid WxLoginUser wxLoginUser, HttpServletRequest request){ + WxUser wxUser = null; + try { + wxUser = wxUserService.login(wxLoginUser,request); + } catch (Exception e) { + log.warn(e.getMessage()); + } + if(wxUser==null){ + Assert.throwEx(HttpCode.WX_ERR); + } + Map objectMap = genTokenInfo(request, wxUser); + return R.ok(objectMap); + } + + @NotNull + private Map genTokenInfo(HttpServletRequest request, WxUser wxUser) { + Map objectMap = new HashMap<>(); + String token = IdUtil.fastSimpleUUID(); + LoginUser loginUser = new LoginUser(wxUser.getId(), wxUser.getEmpName(),"", + ServletUtils.getIp(request), LoginUserType.APP_USER,new ArrayList<>(),null,AuthContextUtils.getTenant()); + objectMap.put("token",token); + //微信登录ID + String wxUserKey = StringUtils.format(RedisCacheKeys.WX_KEY_USER,token); + redisService.set(wxUserKey, wxUser.getId()); + //后台管理员信息 + Map tokenMap = new HashMap<>(10); + String client = "wx_app"; + String redisKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client, wxUser.getSysUserId()); + String pctoken = JwtUtils.generateToken(wxUser.getSysUserId(),loginUser.getTypeFlag(),client); + redisService.set(redisKey,pctoken); + tokenMap.put("token", pctoken); + tokenMap.put("userId", wxUser.getSysUserId()); + tokenMap.put("IP", loginUser.getLoginIp()); + tokenMap.put("tenant", sysTenantMapper.selectById(loginUser.getTenant())); + tokenMap.put("loginType",client); + tokenMap.put("client",client); + //关联 + objectMap.put("adminTokenInfo",tokenMap); + return objectMap; + } + + /** + * 公众号测试登录 + */ + @PostMapping("/mptest") + public R login(HttpServletRequest request){ + Map objectMap = new HashMap<>(); + String token = IdUtil.fastSimpleUUID(); + //微信登录ID + String wxUserKey = StringUtils.format(RedisCacheKeys.WX_KEY_USER,token); + redisService.set(wxUserKey,"1"); + + LoginUser loginUser = new LoginUser("1","微信测试用户","", + ServletUtils.getIp(request), LoginUserType.APP_USER,new ArrayList<>(),null,AuthContextUtils.getTenant()); + objectMap.put("token",token); + String sysUserId = "1"; + Map tokenMap = new HashMap<>(10); + String client = "wx_app"; + String redisKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client,sysUserId); + String pctoken = JwtUtils.generateToken(sysUserId,loginUser.getTypeFlag(),client); + redisService.set(redisKey,pctoken); + tokenMap.put("token", pctoken); + tokenMap.put("userId", sysUserId); + tokenMap.put("IP", loginUser.getLoginIp()); + tokenMap.put("tenant", sysTenantMapper.selectById(loginUser.getTenant())); + tokenMap.put("loginType",client); + tokenMap.put("client",client); + //关联 + objectMap.put("adminTokenInfo",tokenMap); + return R.ok(objectMap); + } + + + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/dto/CounterResultVo.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/dto/CounterResultVo.java new file mode 100644 index 0000000..ce2fa7f --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/dto/CounterResultVo.java @@ -0,0 +1,27 @@ +package com.qs.serve.controller.dto; + +import lombok.Data; + +/** + * @author YenHex + * @since 2022/5/13 + */ +@Data +public class CounterResultVo { + + /** + * 待处理审批数 + */ + private Long apprCounter; + + /** + * 公告未读数 + */ + private Integer noticeCounter; + + /** + * 维修任务数 + */ + private Long repairCounter; + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/dto/SyLoginParam.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/dto/SyLoginParam.java new file mode 100644 index 0000000..584f519 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/controller/dto/SyLoginParam.java @@ -0,0 +1,27 @@ +package com.qs.serve.controller.dto; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/6/8 + */ +@Data +public class SyLoginParam { + + /** + * 模板编码 + */ + private String templateCode; + + /** + * 表单data的exsp5字段值 + */ + private String key; + + /** + * 致远员工id + */ + private String syId; + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/BirTask.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/BirTask.java new file mode 100644 index 0000000..81bd256 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/BirTask.java @@ -0,0 +1,52 @@ +package com.qs.serve.task; + +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.bir.controller.BirActivityCenterGoodsController; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @author YenHex + * @since 2023/11/7 + */ +@Slf4j +@Component +@AllArgsConstructor +@ConditionalOnProperty(value = "project.bir-service-sync", havingValue = "true") +public class BirTask { + + private final BirActivityCenterGoodsController birActivityCenterGoodsController; + + /** + * 同步bir实时 + * 15分钟执行一次 + */ + @Scheduled(cron="0 0/15 * * * ?") + public void toSyncBirEcro(){ + AuthContextUtils.setTenant("001"); + birActivityCenterGoodsController.toSyncBirEcro(); + log.warn("bir更新完成"); + } + + /** + * 移除因作废的费用申请导致的bir数据 + * 每天中午13点触发 + */ + @Scheduled(cron="0 0 13 * * ?") + public void toSyncRm(){ + AuthContextUtils.setTenant("001"); + birActivityCenterGoodsController.toSyncRm(); + log.warn("bir更新完成 - 作废的费用"); + } + + @PostConstruct + void started() { + log.warn("bir同步开启"); + } + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/BmsTask.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/BmsTask.java new file mode 100644 index 0000000..6174536 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/BmsTask.java @@ -0,0 +1,48 @@ +package com.qs.serve.task; + +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.bms.controller.BmsRegion2Controller; +import com.qs.serve.modules.bms.controller.BmsRegionController; +import com.qs.serve.modules.tbs.service.TbsActivityTemplateService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * @author YenHex + * @since 2024/5/9 + */ +@Slf4j +@Component +@AllArgsConstructor +@ConditionalOnProperty(value = "project.task", havingValue = "true") +public class BmsTask { + + private final BmsRegion2Controller bmsRegion2Controller; + private final BmsRegionController bmsRegionController; + private final TbsActivityTemplateService tbsActivityTemplateService; + + /** + * 更新树路径 + */ + @Scheduled(cron="0 0 7,13 * * ?") + public void levelTask(){ + AuthContextUtils.setTenant("001"); + bmsRegionController.updateLevel(); + bmsRegion2Controller.updateLevel(); + //更新客户的关联区域的列 + tbsActivityTemplateService.updateState(); + } + + /** + * 5分钟执行一次 + */ + @Scheduled(cron="0 0/5 * * * ?") + public void updateActTmpState(){ + AuthContextUtils.setTenant("001"); + tbsActivityTemplateService.updateState(); + } + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/ErpDipatchTask.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/ErpDipatchTask.java new file mode 100644 index 0000000..a4fe8f2 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/ErpDipatchTask.java @@ -0,0 +1,32 @@ +package com.qs.serve.task; + +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.bir.mapper.BirReportAccountBookMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * @author YenHex + * @since 2023/7/14 + */ +@Slf4j +@Component +@AllArgsConstructor +@ConditionalOnProperty(value = "project.task", havingValue = "true") +public class ErpDipatchTask { + + private final BirReportAccountBookMapper birReportAccountBookMapper; + + @Scheduled(cron="0 0 1 * * ?") + public void buildTempTable(){ + AuthContextUtils.setTenant("001"); + birReportAccountBookMapper.buildAllDispatch(); + birReportAccountBookMapper.buildRegionDispatch(); + birReportAccountBookMapper.buildBizRegionDispatch(); + birReportAccountBookMapper.buildCustomerDispatch(); + } + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/GoodsTask.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/GoodsTask.java new file mode 100644 index 0000000..d7367a5 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/GoodsTask.java @@ -0,0 +1,60 @@ +package com.qs.serve.task; + +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.goods.service.GoodsApplicationService; +import com.qs.serve.modules.goods.service.GoodsCustomerPriceService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * @author YenHex + * @since 2023/12/20 + */ +@Slf4j +@Component +@AllArgsConstructor +@ConditionalOnProperty(value = "project.task", havingValue = "true") +public class GoodsTask { + + private GoodsSpuService goodsSpuService; + private GoodsApplicationService goodsApplicationService; + private GoodsCustomerPriceService goodsCustomerPriceService; + + @Scheduled(cron="0 0 1 * * ?") + public void buildTempTable(){ + AuthContextUtils.setTenant("001"); + goodsSpuService.initSkuNum(); + } + + /** + * 每15分钟同步一次 + */ + @Scheduled(cron="0/15 0 0 * * ?") + public void syncCusPriceGoods(){ + AuthContextUtils.setTenant("001"); + goodsCustomerPriceService.syncCustomerPrice(); + } + + /** + * 每两个小时同步一次 + */ + //@Scheduled(cron="0 0/2 0 * * ?") + public void syncStandGoods(){ + AuthContextUtils.setTenant("001"); + goodsApplicationService.syncStandGoods(false); + } + + /** + * 同步价格 + */ + //@Scheduled(cron="0 0 1 * * ?") + public void syncInvPrice(){ + AuthContextUtils.setTenant("001"); + goodsApplicationService.syncSkuPrice(); + } + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/HisTask.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/HisTask.java new file mode 100644 index 0000000..69b4db7 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/HisTask.java @@ -0,0 +1,59 @@ +package com.qs.serve.task; + +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.consts.RedisCacheKeys; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.his.service.HisUserSupplierTempService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.concurrent.TimeUnit; + +/** + * @author YenHex + * @since 2023/5/31 + */ +@Slf4j +@Component +@AllArgsConstructor +@ConditionalOnProperty(value = "project.task", havingValue = "true") +public class HisTask { + + RedisService redisService; + HisUserSupplierTempService tempService; + + /** + * 数据处理10-15分钟,每隔20分钟执行一次,串行 + */ + @Scheduled(cron="0 0/20 * * * ?") + public void buildTempTable(){ + AuthContextUtils.setTenant("001"); + Integer opt = redisService.getInteger(RedisCacheKeys.HIS_UPDATE); + //设置默认值 + if (opt==null){ + redisService.set(RedisCacheKeys.HIS_UPDATE,0); + return; + } + //忽略状态 + if (opt==1){ + //执行同步 + log.warn("======================执行同步======================"); + LocalDateTime s1 = LocalDateTime.now(); + //防卡死,加入超时 + redisService.set(RedisCacheKeys.HIS_UPDATE,2,1, TimeUnit.HOURS); + tempService.reloadHis(); + LocalDateTime s2 = LocalDateTime.now(); + long diff = Duration.between(s1, s2).getSeconds(); + tempService.selectInfoHis(); + redisService.set(RedisCacheKeys.HIS_UPDATE,0); + log.warn("======================执行同步完成,耗时[ {} 秒]======================",diff); + } + } + + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/OmsTask.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/OmsTask.java new file mode 100644 index 0000000..6ca689f --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/OmsTask.java @@ -0,0 +1,36 @@ +package com.qs.serve.task; + +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.oms.mapper.OmsSaleOrderItemMapper; +import com.qs.serve.modules.oms.service.OmsOrderOptionsService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * @author YenHex + * @since 2024/9/26 + */ +@Slf4j +@Component +@AllArgsConstructor +@ConditionalOnProperty(value = "project.task", havingValue = "true") +public class OmsTask { + + OmsOrderOptionsService omsOrderOptionsService; + OmsSaleOrderItemMapper omsSaleOrderItemMapper; + + /** + * 同步临期品到调度系统的订单中间表 + * 每10分钟执行一次 + */ + @Scheduled(cron="0 0/10 * * * ?") + public void saveToErpOrder(){ + AuthContextUtils.setTenant("001"); + omsSaleOrderItemMapper.updateItemSkuBelong(); + omsOrderOptionsService.syncToErp(); + } + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/PayTask.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/PayTask.java new file mode 100644 index 0000000..7419d2f --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/PayTask.java @@ -0,0 +1,110 @@ +package com.qs.serve.task; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.config.properties.ProjectApisProperties; +import com.qs.serve.common.model.AmountDTO; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.HttpUtil; +import com.qs.serve.modules.pay.mapper.PayPaymentItemMapper; +import com.qs.serve.modules.pay.mapper.PayPaymentMapper; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.service.TbsCostApplyService; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/11/7 + */ +@Slf4j +@Component +@AllArgsConstructor +@ConditionalOnProperty(value = "project.task", havingValue = "true") +public class PayTask { + + private VtbVerificationService vtbVerificationService; + private VtbVerificationMapper vtbVerificationMapper; + private final TbsCostApplyService costApplyService; + private final PayPaymentItemMapper payPaymentItemMapper; + private final PayPaymentMapper payPaymentMapper; + private ProjectApisProperties projectApisProperties; + + /** + * 将未支付的重新发起请求 + */ + @Scheduled(cron="0 0 2 * * ?") + public void checkToPay(){ + AuthContextUtils.setTenant("001"); + //预先调用伟成同步状态接口,减少查询记录数 + String url = projectApisProperties.getCheckPayStatus(); + HttpUtil.doGet(url,null); + List vids = vtbVerificationMapper.listNotPayVerifyIds(); + for (Long vid : vids) { + vtbVerificationService.toPayRequest(vid); + try { + Thread.sleep(200); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + HttpUtil.doGet(url,null); + } + + /** + * 同步支付 + */ + @Scheduled(cron="0 0 2 * * ?") + public void syncCostPayStatus(){ + AuthContextUtils.setTenant("001"); + List costIds4State = payPaymentMapper.selectCostApplyIds4State(); + LambdaQueryWrapper costLqw = new LambdaQueryWrapper<>(); + costLqw.select( + TbsCostApply::getId, + TbsCostApply::getTotalActivityAmount + ); + costLqw.in(TbsCostApply::getId,costIds4State); + List costApplyList = costApplyService.list(costLqw); + List costIds = costApplyList.stream().map(TbsCostApply::toString).collect(Collectors.toList()); + + List amountDTOList = payPaymentItemMapper.selectCostTotal(costIds); + List updatePayStateList = new ArrayList<>(); + for (TbsCostApply costApply : costApplyList) { + String costId = costApply.getId().toString(); + for (AmountDTO dto : amountDTOList) { + if(costId.equals(dto.getId())){ + BigDecimal totalPay = dto.getAmount(); + if(totalPay.compareTo(BigDecimal.ZERO)==0){ + //未支付忽略 + continue; + } + BigDecimal totalCost = costApply.getTotalActivityAmount(); + TbsCostApply updParam = new TbsCostApply(); + updParam.setId(costApply.getId()); + if(totalPay.compareTo(totalCost)<0){ + updParam.setPayStatus(1); + }else { + updParam.setPayStatus(2); + } + updatePayStateList.add(updParam); + } + } + } + costApplyService.updateBatchById(updatePayStateList); + //更新支付表记录,用于实现增量更新 + List costIds4Update = updatePayStateList.stream().map(TbsCostApply::getId).collect(Collectors.toList()); + if(costIds4Update.size()>0){ + payPaymentItemMapper.updateSyncCostState(costIds4Update); + } + } + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/SysTask.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/SysTask.java new file mode 100644 index 0000000..47196ae --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/SysTask.java @@ -0,0 +1,47 @@ +package com.qs.serve.task; + +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.service.SysPostService; +import com.qs.serve.task.controller.TaskUserController; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * @author YenHex + * @since 2023/6/27 + */ +@Slf4j +@Component +@AllArgsConstructor +@ConditionalOnProperty(value = "project.task", havingValue = "true") +public class SysTask { + + TaskUserController taskUserController; + SysPostService sysPostService; + + /** + * 同步用户 + */ + @Scheduled(cron="0 0 1 * * ?") + public void task1(){ + AuthContextUtils.setTenant("001"); + taskUserController.test(); + //更新下属数据 + sysPostService.flushPathIds(); + } + + + /** + * 同步离职 + */ + @Scheduled(cron="0 0 2 * * ?") + public void task2(){ + AuthContextUtils.setTenant("001"); + taskUserController.doLeave(); + } + + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/TagTask.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/TagTask.java new file mode 100644 index 0000000..ed27941 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/TagTask.java @@ -0,0 +1,30 @@ +package com.qs.serve.task; + +import com.qs.serve.modules.tag.mapper.TagDataMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; + +/** + * @author YenHex + * @since 2023/5/31 + */ +@Slf4j +@Component +@AllArgsConstructor +@ConditionalOnProperty(value = "project.task", havingValue = "true") +public class TagTask { + + private TagDataMapper tagDataMapper; + + /** + * 数据处理10-15分钟,清理过期数据 + */ + //@Scheduled(cron="0 0/1 * * * ?") + public void buildTempTable(){ + //tagDataMapper.deleteExpireData(); + } + + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/TbsTask.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/TbsTask.java new file mode 100644 index 0000000..7f7c90c --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/TbsTask.java @@ -0,0 +1,74 @@ +package com.qs.serve.task; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.bir.mapper.BirTbsVtbPayJoinMapper; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.service.TbsActivityService; +import com.qs.serve.modules.tbs.service.TbsActivityTemplateService; +import com.qs.serve.modules.tbs.service.TbsCostApplyService; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import lombok.AllArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2022/12/9 + */ +@Component +@AllArgsConstructor +@ConditionalOnProperty(value = "project.task", havingValue = "true") +public class TbsTask { + + private final BirTbsVtbPayJoinMapper birTbsVtbPayJoinMapper; + private final TbsActivityService activityService; + private final TbsCostApplyService tbsCostApplyService; + private final TbsActivityTemplateService activityTemplateService; + private final VtbVerificationService vtbVerificationService; + + + //每日更新过期的活动,过期则进行冻结 + @Scheduled(cron="0 0 1 * * ?") + public void task1(){ + AuthContextUtils.setTenant("001"); + activityService.initReopenState(); + + LambdaQueryWrapper lqwApply = new LambdaQueryWrapper<>(); + lqwApply.select(TbsCostApply::getId); + lqwApply.eq(TbsCostApply::getChargeState, TbsCostApplyState.State_2_actioning.getCode()); + List costApplyList = tbsCostApplyService.list(lqwApply); + List costApplyIds = costApplyList.stream().map(TbsCostApply::getId).collect(Collectors.toList()); + // 更新费用申请的活动的冻结状态 + activityService.flushBandingState(costApplyIds); + } + + + /** + * 每半小时执行一次 + */ + @Scheduled(cron="0 0/30 * * * ?") + public void updateCheckState(){ + AuthContextUtils.setTenant("001"); + tbsCostApplyService.updateCheckState(); + //间隔几个月换一次即可 + Long maxCostId = 313000L; + birTbsVtbPayJoinMapper.updateActivityAllCenters(maxCostId); + } + + + /** + * 每半小时执行一次 + */ + @Scheduled(cron="0 0/30 * * * ?") + public void syncPayToErp(){ + AuthContextUtils.setTenant("001"); + vtbVerificationService.toPayRequest(); + } + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/TzcPolicyTask.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/TzcPolicyTask.java new file mode 100644 index 0000000..480b140 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/TzcPolicyTask.java @@ -0,0 +1,51 @@ +package com.qs.serve.task; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.seeyon.service.XiaoLuTonService; +import com.qs.serve.modules.third.service.PortalOfCostApplication; +import com.qs.serve.modules.tzc.common.TzPolicyItemStatus; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; +import com.qs.serve.modules.tzc.service.TzcPolicyApplicationService; +import com.qs.serve.modules.tzc.service.TzcPolicyItemService; +import com.qs.serve.modules.tzc.service.TzcPolicyService; +import lombok.AllArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 政策同步方法 + * @author YenHex + * @since 2023/3/11 + */ +@Component +@AllArgsConstructor +@ConditionalOnProperty(value = "project.task", havingValue = "true") +public class TzcPolicyTask { + + private TzcPolicyService policyService; + private TzcPolicyItemService policyItemService; + private TzcPolicyApplicationService policyApplicationService; + private PortalOfCostApplication portalOfCostApplication; + private XiaoLuTonService xiaoLuTonService; + + + /** + * 同步政策到销路通 + */ + @Scheduled(cron="0 20 * * * ?") + public void syncPolicyToXlt(){ + AuthContextUtils.setTenant("001"); + LambdaQueryWrapper itemLqw = new LambdaQueryWrapper<>(); + itemLqw.select(TzcPolicyItem::getId); + itemLqw.eq(TzcPolicyItem::getPolicyItemStatus,TzPolicyItemStatus.Status_1_PassSuccess); + List policyItemList = policyItemService.list(itemLqw); + for (TzcPolicyItem policyItem : policyItemList) { + policyApplicationService.syncPolicyItem(policyItem.getId()); + } + } + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/TzcTask.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/TzcTask.java new file mode 100644 index 0000000..18de9d8 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/TzcTask.java @@ -0,0 +1,35 @@ +package com.qs.serve.task; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; + +/** + * @author YenHex + * @since 2023/11/7 + */ +@Slf4j +@Component +@AllArgsConstructor +@ConditionalOnProperty(value = "project.task", havingValue = "true") +public class TzcTask { + + + /** + * 同步未同步的政策项(排查数据,并无异常) + * 流程如下 + * 1.查询CMS未同步的政策项编码发送到中间服务 SELECT * FROM `tzc_policy` LEFT JOIN tzc_policy_item + * ON tzc_policy.id = tzc_policy_item.policy_id WHERE tzc_policy.del_flag = 0 AND tzc_policy_item.del_flag = 0 + * AND tzc_policy.policy_status = 2 AND tzc_policy_item.sync_status = 0 + * 2.中间服务返回已有的政策项编码 SELECT * FROM [dbo].[XLT_BI_GhDbf] where cGhMemo = '数据自动导入' and cGhCode like 'P%' + * 3.更新已有的政策项编码 update tzc_policy_item set sync_status = 1 where policy_item_code in (...) + * 4.重新请求未同步的政策编码 + * + */ + //@Scheduled(cron="0 0 3 * * ?") + public void checkToPay(){ + + } + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/WxUserTask.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/WxUserTask.java new file mode 100644 index 0000000..20c62ae --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/WxUserTask.java @@ -0,0 +1,24 @@ +package com.qs.serve.task; + +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.wx.service.WxUserService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Component; + +/** + * @author YenHex + * @since 2022/9/26 + */ +@Component +@AllArgsConstructor +public class WxUserTask { + + private WxUserService wxUserService; + + //@Scheduled(cron = "0 0/30 * * * ?") + public void syncSubscribe(){ + AuthContextUtils.setTenant("001"); + wxUserService.syncSubscribe(); + } + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/HistTestController.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/HistTestController.java new file mode 100644 index 0000000..7917670 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/HistTestController.java @@ -0,0 +1,60 @@ +package com.qs.serve.task.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.config.DevEnvironmentConfig; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.consts.RedisCacheKeys; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.his.service.HisUserChannelPointService; +import com.qs.serve.modules.oms.entity.OmsOrder; +import com.qs.serve.task.HisTask; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/4/17 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("his/dev") +@ConditionalOnBean(HisTask.class) +public class HistTestController { + + HisUserChannelPointService hisUserChannelPointService; + RedisService redisService; + HisTask hisTask; + + @GetMapping("/initSupplier") + public R initSupplier(){ + if(DevEnvironmentConfig.isDev()){ + redisService.set(RedisCacheKeys.HIS_UPDATE,1); + hisTask.buildTempTable(); + } + return R.ok(); + } + + + /** + * + * @return + */ + @GetMapping("/initPoint") + public R initPoint(){ + if(DevEnvironmentConfig.isDev()){ + hisUserChannelPointService.initSetup(); + } + return R.ok(); + } + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/TaskActivityController.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/TaskActivityController.java new file mode 100644 index 0000000..18bdf86 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/TaskActivityController.java @@ -0,0 +1,96 @@ +package com.qs.serve.task.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.tbs.common.TbsActivityState; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplate; +import com.qs.serve.modules.tbs.service.TbsActivityService; +import com.qs.serve.modules.tbs.service.TbsActivityTemplateService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 【同步】 活动相关 + * @author YenHex + * @since 2023/6/27 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/task/activity") +//@ConditionalOnProperty(value = "project.task", havingValue = "true") +public class TaskActivityController { + + private final TbsActivityService activityService; + private final TbsActivityTemplateService activityTemplateService; + private final SeeYonRequestBaseService seeYonRequestBaseService; + + + + /** + * 同步ERP的发货单,用于计算活动费率 + * @return + */ + @GetMapping("syncDispatch") + public R task0(){ + seeYonRequestBaseService.getBase(TbsSeeYonConst.TASK_SYNC_DISPATCH,"同步ERP的发货单"); + return R.ok(); + } + + /** + * 每日更新过期的活动,过期则进行冻结 + * @return + */ + @GetMapping("lockActivity") + public R task2(){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.le(TbsActivity::getPreEndDate, LocalDate.now()); + lqw.eq(TbsActivity::getReopenFlag,0); + TbsActivity param = new TbsActivity(); + param.setActivityState(TbsActivityState.STATE_1_Baning); + activityService.update(param,lqw); + return R.ok(); + } + + /** + * 启用和停用模板规则 + * @return + */ + @GetMapping("startAndStopActivityTemplates") + public R task3(){ + LocalDateTime nowTime = LocalDateTime.now(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(TbsActivityTemplate::getId); + lqw.ge(TbsActivityTemplate::getStartTime,nowTime.with(LocalDateTime.MIN)); + lqw.le(TbsActivityTemplate::getStartTime,nowTime.with(LocalDateTime.MAX)); + lqw.eq(TbsActivityTemplate::getTemplateState,0); + List preStartList = activityTemplateService.list(lqw); + if(CollectionUtil.isNotEmpty(preStartList)){ + preStartList.forEach(a->a.setTemplateState(1)); + activityTemplateService.updateBatchById(preStartList); + } + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(); + lqw2.select(TbsActivityTemplate::getId); + lqw2.ge(TbsActivityTemplate::getEndTime,nowTime.with(LocalDateTime.MIN)); + lqw2.le(TbsActivityTemplate::getEndTime,nowTime.with(LocalDateTime.MAX)); + lqw2.eq(TbsActivityTemplate::getTemplateState,1); + List preCloseList = activityTemplateService.list(lqw2); + if(CollectionUtil.isNotEmpty(preCloseList)){ + preCloseList.forEach(a->a.setTemplateState(0)); + activityTemplateService.updateBatchById(preCloseList); + } + return R.ok(); + } + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/TaskPayController.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/TaskPayController.java new file mode 100644 index 0000000..31b6045 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/TaskPayController.java @@ -0,0 +1,30 @@ +package com.qs.serve.task.controller; + +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.pay.service.impl.PayApplicationService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author YenHex + * @since 2023/11/2 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/task/pay") +@ConditionalOnProperty(value = "project.task", havingValue = "true") +public class TaskPayController { + + PayApplicationService applicationService; + + @RequestMapping("test") + public R task(){ + applicationService.syncTotalPayToActivity(); + return R.ok(); + } + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/TaskPolicyController.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/TaskPolicyController.java new file mode 100644 index 0000000..3807224 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/TaskPolicyController.java @@ -0,0 +1,45 @@ +package com.qs.serve.task.controller; + +import com.qs.serve.common.model.dto.R; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 【同步】 政策相关 + * @author YenHex + * @since 2023/6/27 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/task/policy") +@ConditionalOnProperty(value = "project.task", havingValue = "true") +public class TaskPolicyController { + + //TzcPolicyTask policyTask; + + /** + * 根据销路通支付数据,和本系统政策匹对,并生成本系统核销及支付信息 + * @return + */ + @GetMapping("loadXltPayment") + public R syncFromXltPolicyPayment(){ + //policyTask.syncFromXltPolicyPayment(); + return R.ok(); + } + + /** + * 同步政策到销路通 + * @return + */ + @GetMapping("syncPolicyToXlt") + public R syncPolicyToXlt(){ + //policyTask.syncPolicyToXlt(); + return R.ok(); + } + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/TaskSupplierController.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/TaskSupplierController.java new file mode 100644 index 0000000..c196ac0 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/TaskSupplierController.java @@ -0,0 +1,65 @@ +package com.qs.serve.task.controller; + +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.consts.RedisCacheKeys; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.his.service.HisUserSupplierTempService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.concurrent.TimeUnit; + +/** + * 【同步】 客户相关 + * @author YenHex + * @since 2023/6/27 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/task/supplier") +@ConditionalOnProperty(value = "project.task", havingValue = "true") +public class TaskSupplierController { + + RedisService redisService; + HisUserSupplierTempService tempService; + + /** + * 通过客户底表 + * @return + */ + @GetMapping("syncToTemp") + public R test(){ + Integer opt = redisService.getInteger(RedisCacheKeys.HIS_UPDATE); + log.warn("======================执行状态:"+opt+"======================"); + //设置默认值 + if (opt==null){ + redisService.set(RedisCacheKeys.HIS_UPDATE,0); + return R.ok(); + } + //忽略状态 + if (opt==1){ + //执行同步 + log.warn("======================执行同步======================"); + LocalDateTime s1 = LocalDateTime.now(); + //防卡死,加入超时 + redisService.set(RedisCacheKeys.HIS_UPDATE,2,1, TimeUnit.HOURS); + tempService.reloadHis(); + LocalDateTime s2 = LocalDateTime.now(); + long diff = Duration.between(s1, s2).getSeconds(); + tempService.selectInfoHis(); + redisService.set(RedisCacheKeys.HIS_UPDATE,0); + log.warn("======================执行同步完成,耗时[ {} 秒]======================",diff); + } + return R.ok(); + } + + + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/TaskUserController.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/TaskUserController.java new file mode 100644 index 0000000..55f13b1 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/TaskUserController.java @@ -0,0 +1,106 @@ +package com.qs.serve.task.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.JsonUtil; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.his.service.HisUserSupplierService; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.entity.SysUserLeave; +import com.qs.serve.modules.sys.entity.dto.SyUser; +import com.qs.serve.modules.sys.service.SysUserLeaveService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.LocalDate; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 【同步】 用户相关 + * @author YenHex + * @since 2023/6/27 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/task/user") +//@ConditionalOnProperty(value = "project.task", havingValue = "true") +public class TaskUserController { + + SeeYonRequestBaseService seeYonRequestBaseService; + SysUserService sysUserService; + SysUserLeaveService sysUserLeaveService; + private final BmsSupplierMapper supplierMapper; + private final HisUserSupplierService hisUserSupplierService; + + @Transactional + public R doLeave(){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(SysUserLeave::getUserId,SysUserLeave::getId); + lqw.le(SysUserLeave::getLeaveEffectDate, LocalDate.now()); + lqw.eq(SysUserLeave::getLeaveStatus,0); + List sysUserLeaves = sysUserLeaveService.list(lqw); + if(sysUserLeaves.size()<1){ + return null; + } + for (SysUserLeave userLeaf : sysUserLeaves) { + userLeaf.setLeaveStatus(1); + } + sysUserLeaveService.updateBatchById(sysUserLeaves); + List userIds = sysUserLeaves.stream().map(a->a.getUserId()).collect(Collectors.toList()); + sysUserService.leaveNow(userIds,false); + return R.ok(); + } + + /** + * 同步致远的用户到CRM + * @return + */ + @GetMapping("syncFromSeeYon") + public R test(){ + R rs = seeYonRequestBaseService.getBase(TbsSeeYonConst.OA_USER_LIST_1,null); + String listJson = rs.getData(); + List userList = JsonUtil.jsonToList(listJson, SyUser.class); + assert userList != null; + if(userList.size()<1){ + return R.ok(); + } + List codes = userList.stream().map(SyUser::getCode).collect(Collectors.toList()); + LambdaQueryWrapper userLqw = new LambdaQueryWrapper<>(); + userLqw.in(SysUser::getAccount,codes).or() + .in(SysUser::getCode,codes); + List existUserList = sysUserService.list(userLqw); + for (SyUser oaUser : userList) { + boolean exist = existUserList.stream().anyMatch( + a->a.getAccount().equals(oaUser.getCode()) + ||a.getCode().equals(oaUser.getCode()) + ); + if(!exist){ + SysUser sysUser = new SysUser(); + sysUser.setCode(oaUser.getCode()); + sysUser.setMobile(oaUser.getMobile()); + sysUser.setAccount(oaUser.getCode()); + sysUser.setId(oaUser.getId()); + sysUser.setSyUserId(oaUser.getId()); + sysUser.setSyAccount(oaUser.getCode()); + sysUser.setServingState(1); + sysUser.setServingDate(LocalDate.now()); + sysUser.setSuperFlag(1); + sysUser.setTenantId("001"); + sysUserService.save(sysUser); + } + } + return R.ok(); + } + + + +} diff --git a/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/TaskWechatController.java b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/TaskWechatController.java new file mode 100644 index 0000000..dc14cc7 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/java/com/qs/serve/task/controller/TaskWechatController.java @@ -0,0 +1,38 @@ +package com.qs.serve.task.controller; + +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.wx.service.WxUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 【同步】 微信相关 + * @author YenHex + * @since 2023/6/27 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/task/wechat") +@ConditionalOnProperty(value = "project.task", havingValue = "true") +public class TaskWechatController { + + private WxUserService wxUserService; + + /** + * 同步订阅用户流程 + * @return + */ + @GetMapping("syncSubscribe") + public R test(){ + wxUserService.syncSubscribe(); + return R.ok(); + } + + + +} diff --git a/cms-api/cms-admin-svc/src/main/resources/application-dev.yml b/cms-api/cms-admin-svc/src/main/resources/application-dev.yml new file mode 100644 index 0000000..66d7d10 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/resources/application-dev.yml @@ -0,0 +1,133 @@ +feign: + client: + config: + default: + connectTimeout: 5000 # 连接超时时间 + readTimeout: 5000 # 读取超时时间 + httpclient: + enabled: true +# 服务列表 +service-list: + policy-svc: http://localhost:8081 + +#项目配置 +project: + bir-service: 'false' + bir-service-sync: 'false' + bir-service-url: 'http://192.168.0.9:7401' + web_url: 'http://192.168.0.9:6031' + host_url: 'http://192.168.0.9:7400' + pc-web-local: 'D:\Software\Nginx1.8\html\jslcrm3\' + apis: + #支付接口 + #cost-to-pay: 'http://59.37.164.96:2506/action/cms/api/add' + #支付接口(新) + #cost-to-pay: 'http://59.37.164.96:2505/api/cms/api/add' + cost-to-pay: 'http://0.0.0.0:2505/api/cms/api/add' + # 同步核销的支付状态 + #check-pay-status: 'http://59.37.164.96:2506/action/cms/cost/match' + check-pay-status: 'http://0.0.0.0:2506/action/cms/cost/match' + # 核销生成报价单接口 + diaodu-plan-order: '' + # 嘉士利接口,spu转换sku + #spu-to-sku: 'http://59.37.164.96:2505/api/cms/order/matchInvCode' + spu-to-sku: 'http://0.0.0.0:2505/api/cms/order/matchInvCode' + # 政策同步 + #policy-sync-cate: 'http://192.168.10.18:9003/api/cms/saleCost/costPolicy/syncCate' + policy-sync-cate: 'http://0.0.0.0:9003/api/cms/saleCost/costPolicy/syncCate' + # 政策同步旧的 + #policy-sync-inv: 'http://192.168.10.18:9003/api/cms/saleCost/costPolicy/syncInv' + policy-sync-inv: 'http://0.0.0.0:9003/api/cms/saleCost/costPolicy/syncInv' + + task: false + dev: true + seeyon: + enable: true + url: 'http://192.168.0.9:7444' + #请求致远OA的拓展服务(用于修改密码) + extApi: 'http://192.168.10.244:9003/' + + upload: + #上传映射地址 + proxy-url: https://qsjslservice.oss-cn-guangzhou.aliyuncs.com/jsl/ + #物理存储地址 + logical-path: D:\\WebMapPath\\ +#腾讯云配置 +tencent: + sms: + secret-id: AKIDR3A5mVkSaXFUT3TABanPxc2MtkMu45wb + secret-key: iLkjeKzHwegQ4eE55xX9byXmBLxgwypV + sdkAppId: 1400174031 + signName: 柒胜软件 + templateId: 689207 +#天翼云配置 +tianyi: + sms: + appid: 'WIgWyCFn4DnHLtjKBIXBVyZbGevFg3J4' + appKey: 'bjfsZlF01OZPUzyiCLSFOrOOnfsZhYZJ' +aliyun: + oss: + bucket: qsjslservice + accessKeyId: LTAI5tHvNJT7M9YZJ9BSmURK + accessKeySecret: OzH0ea3w8fgjrll9P0XTQlqmEg3Cky + endpoint: oss-cn-guangzhou.aliyuncs.com + prefix: jsl +#服务配置 +server: + port: 7400 + servlet: + context-path: / + + + +#SpringBoot相关 +spring: + datasource: + # 旧的 +# driver-class-name: com.mysql.cj.jdbc.Driver +# url: jdbc:mysql://192.168.0.9:3306/jsl_mall_qs_dev?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +# username: kpjsl +# password: '123456' + # 新的 + dynamic: + primary: crm_db #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + crm_db: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://192.168.0.9:3306/jsl_mall_qs_dev?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true + username: kpjsl + password: 123456 + qisheng: + url: jdbc:sqlserver://192.168.10.11:1433;DatabaseName=JSL_COST_QS_TEST + username: sa + password: JSL2282125 + driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver +#SpringBoot相关 + hikari: + #连接池名 + pool-name: DateHikariCP + #最小空闲连接数 + minimum-idle: 10 + # 空闲连接存活最大时间,默认600000(10分钟) + idle-timeout: 180000 + # 连接池最大连接数,默认是10 + maximum-pool-size: 30 + # 此属性控制从池返回的连接的默认自动提交行为,默认值:true + auto-commit: true + # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟 + max-lifetime: 1800000 + # 数据库连接超时时间,默认30秒,即30000 + connection-timeout: 30000 + connection-test-query: SELECT 1 + validation-timeout: 1 + login-timeout: 5 + + redis: + database: 1 + host: 127.0.0.1 + port: 6379 + password: +#工作流配置 +flowable: + database-schema-update: true diff --git a/cms-api/cms-admin-svc/src/main/resources/application-pro.yml b/cms-api/cms-admin-svc/src/main/resources/application-pro.yml new file mode 100644 index 0000000..76d35e1 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/resources/application-pro.yml @@ -0,0 +1,92 @@ +#项目配置 +project: + #关闭权限 + close-auth: 'false' + #true-请求端;false-接收端 + bir-service: 'false' + #对应233服务的的cms + bir-service-url: 'http://59.37.164.96:7400' + #bir-service-url: 'http://127.0.0.1:7401' + web_url: 'http://192.168.0.9:6031' + host_url: 'http://192.168.0.9:7400' + pc-web-local: 'D:\Software\Nginx1.8\html\jslcrm3\' + apis: + #支付接口 + cost-to-pay: 'http://59.37.164.96:2505/api/cms/api/add' + check-pay-status: 'http://59.37.164.96:2506/action/cms/cost/match' + # 核销生成报价单接口 + diaodu-plan-order: '' + # 嘉士利接口,spu转换sku + spu-to-sku: 'http://59.37.164.96:2505/api/cms/order/matchInvCode' + # 政策同步 + policy-sync-cate: 'http://59.37.164.96:2505/api/cms/saleCost/costPolicy/syncCate' + # 政策同步旧的 + policy-sync-inv: 'http://59.37.164.96:2505/api/cms/saleCost/costPolicy/syncInv' + task: false + dev: false + seeyon: + enable: true + url: 'http://192.168.0.9:7444' + #请求致远OA的拓展服务(用于修改密码) + extApi: 'http://192.168.10.244:9003/' + + upload: + #上传映射地址 + proxy-url: https://qsjslservice.oss-cn-guangzhou.aliyuncs.com/jsl/ + #物理存储地址 + logical-path: D:\\WebMapPath\\ +#腾讯云配置 +tencent: + sms: + secret-id: AKIDR3A5mVkSaXFUT3TABanPxc2MtkMu45wb + secret-key: iLkjeKzHwegQ4eE55xX9byXmBLxgwypV + sdkAppId: 1400174031 + signName: 柒胜软件 + templateId: 689207 +#天翼云配置 +tianyi: + sms: + appid: 'WIgWyCFn4DnHLtjKBIXBVyZbGevFg3J4' + appKey: 'bjfsZlF01OZPUzyiCLSFOrOOnfsZhYZJ' +aliyun: + oss: + bucket: qsjslservice + accessKeyId: LTAI5tHvNJT7M9YZJ9BSmURK + accessKeySecret: OzH0ea3w8fgjrll9P0XTQlqmEg3Cky + endpoint: oss-cn-guangzhou.aliyuncs.com + prefix: jsl +#服务配置 +server: + port: 7401 + servlet: + context-path: / +#SpringBoot相关 +spring: + datasource: + dynamic: + primary: crm_db #设置默认的数据源或者数据源组,默认值即为master + strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 + datasource: + crm_db: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://183.56.249.148:3306/jsl_cost_base?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true + username: root + password: '@Jsl2282125' + qisheng: + url: jdbc:sqlserver://192.168.10.11:1433;DatabaseName=JSL_COST_QS + username: sa + password: JSL2282125 + driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver +# erp: +# username: sa +# password: 'JSL2282125' +# url: jdbc:sqlserver://192.168.10.11:1433;DatabaseName=UFDATA_001_2020 +# driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver + redis: + database: 2 + host: 127.0.0.1 + port: 6379 + password: +#工作流配置 +flowable: + database-schema-update: true diff --git a/cms-api/cms-admin-svc/src/main/resources/application.yml b/cms-api/cms-admin-svc/src/main/resources/application.yml new file mode 100644 index 0000000..a9d4c58 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/resources/application.yml @@ -0,0 +1,87 @@ +spring: + servlet: + multipart: + max-file-size: 100MB + max-request-size: 160MB + profiles: + active: dev + main: + #easypoi启用覆盖 + allow-bean-definition-overriding: true + jmx: + enabled: false + devtools: + restart: + enabled: false +#项目配置 +project: + ignore-url: + tenants: #忽略租户拦截 + - /callback + - /favicon.ico + - /error + - /portal/syKeyLogin + - /bir/roiRate/test + - /static/* + - /api/wx/login/getCpSignature + - /web/* + permits: #忽略登录 + - /thirty/** #第三方接口 + - /portal/flushToken #第三方接口 + - /common/upload #支持API上传调整 + - /common/validToken #验证token + - /sys/attach/listByIds/** + - /api/** + - /static/** + - /web/** + - /portal/** + - /favicon.ico + - /error + - /callback + - /bir/roiRate/test + +#mybatis plus +mybatis-plus: + mapper-locations: classpath:mapper/*/*.xml + type-aliases-package: com.qs.serve.modules.*.entity.* + configuration: + map-underscore-to-camel-case: true + #log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl + global-config: + banner: false + db-config: + logic-delete-value: 1 + logic-not-delete-value: 0 + select-strategy: not_empty + logic-delete-field: delFlag +# 日志配置 +logging: + level: + ROOT: debug + com.qs.serve: debug + com.qs.serve.modules.his: debug + com.qs.serve.modules.sys: debug + com.qs.serve.modules.tag: info + org.xnio.nio: info + org.springframework: info + com.baomidou: info + org.mybatis: info + org.hibernate.validator: info + druid.sql.ResultSet: info + druid.sql.Connection: info + com.zaxxer.hikari.pool: info + com.zaxxer.hikari.HikariConfig: info + com.qs.serve.modules.sys.mapper.SysOperationLogMapper: info + java.io: warn + io.netty: info + io.undertow: info + io.lettuce.core: info + config: classpath:log4j2.xml +# PageHelper分页插件 +pagehelper: + reasonable: false + #helper-dialect: sqlserver + autoRuntimeDialect: true + supportMethodsArguments: true + params: count=countSql + diff --git a/cms-api/cms-admin-svc/src/main/resources/banner.txt b/cms-api/cms-admin-svc/src/main/resources/banner.txt new file mode 100644 index 0000000..09bf7ff --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/resources/banner.txt @@ -0,0 +1,4 @@ +${AnsiBackground.BLACK} +-- ---------------------------- +-- 嘉士利CRM系统 by.柒胜 +-- ---------------------------- diff --git a/cms-api/cms-admin-svc/src/main/resources/log4j2.xml b/cms-api/cms-admin-svc/src/main/resources/log4j2.xml new file mode 100644 index 0000000..f7d1bce --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/resources/log4j2.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cms-api/cms-admin-svc/src/main/resources/tx-log4j2.xml b/cms-api/cms-admin-svc/src/main/resources/tx-log4j2.xml new file mode 100644 index 0000000..23cdc82 --- /dev/null +++ b/cms-api/cms-admin-svc/src/main/resources/tx-log4j2.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cms-api/cms-policy-svc/pom.xml b/cms-api/cms-policy-svc/pom.xml new file mode 100644 index 0000000..c03e9ad --- /dev/null +++ b/cms-api/cms-policy-svc/pom.xml @@ -0,0 +1,19 @@ + + + + cms-api + com.qs + 1.0-SNAPSHOT + + 4.0.0 + + cms-policy-svc + + + 8 + 8 + + + diff --git a/cms-api/pom.xml b/cms-api/pom.xml new file mode 100644 index 0000000..2ab1fa3 --- /dev/null +++ b/cms-api/pom.xml @@ -0,0 +1,27 @@ + + + + jsl-cms + com.qs + 1.0-SNAPSHOT + + 4.0.0 + + pom + + cms-admin-svc + cms-policy-svc + + cms-api + + + 8 + 8 + + + + + + diff --git a/cms-common/pom.xml b/cms-common/pom.xml new file mode 100644 index 0000000..068b10d --- /dev/null +++ b/cms-common/pom.xml @@ -0,0 +1,46 @@ + + + + jsl-cms + com.qs + 1.0-SNAPSHOT + + 4.0.0 + + cms-common + + + 8 + 8 + + + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + org.projectlombok + lombok + 1.18.12 + compile + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + com.baomidou + mybatis-plus-boot-starter + + + org.springframework.boot + spring-boot-starter-validation + + + + diff --git a/cms-common/src/main/java/com/qs/serve/common/TestCommon.java b/cms-common/src/main/java/com/qs/serve/common/TestCommon.java new file mode 100644 index 0000000..5c9e351 --- /dev/null +++ b/cms-common/src/main/java/com/qs/serve/common/TestCommon.java @@ -0,0 +1,8 @@ +package com.qs.serve.common; + +/** + * @author YenHex + * @since 2025/4/14 + */ +public class TestCommon { +} diff --git a/cms-framework/pom.xml b/cms-framework/pom.xml new file mode 100644 index 0000000..a2eb0c0 --- /dev/null +++ b/cms-framework/pom.xml @@ -0,0 +1,199 @@ + + + + jsl-cms + com.qs + 1.0-SNAPSHOT + + 4.0.0 + + jar + cms-framework + + + 8 + 8 + + + + + + com.qs + cms-common + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-logging + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + org.springframework.boot + spring-boot-starter-undertow + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.springframework.boot + spring-boot-starter-security + + + + org.springframework.boot + spring-boot-starter-aop + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.springframework.boot + spring-boot-starter-log4j2 + + + + com.squareup.okhttp3 + okhttp + 4.10.0 + + + + com.alibaba + easyexcel + 3.3.2 + + + + + cn.hutool + hutool-all + ${hutool.version} + + + + com.auth0 + java-jwt + ${jwt.version} + + + + com.alibaba + fastjson + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.4.4 + + + org.mybatis + mybatis-spring + + + org.mybatis + mybatis + + + + + + com.baomidou + dynamic-datasource-spring-boot-starter + ${mybatis-plus.version} + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + mysql + mysql-connector-java + 8.0.15 + + + + com.microsoft.sqlserver + mssql-jdbc + 8.4.1.jre8 + + + + org.apache.commons + commons-lang3 + 3.12.0 + + + + com.github.binarywang + weixin-java-mp + + + + com.github.binarywang + weixin-java-cp + + + + org.springframework.boot + spring-boot-starter-test + test + + + + com.tencentcloudapi + tencentcloud-sdk-java + 3.1.598 + + + + com.github.shalousun + smart-doc + 2.4.0 + test + + + + com.aliyun.oss + aliyun-sdk-oss + 3.16.1 + + + + joda-time + joda-time + 2.10 + + + + + diff --git a/cms-framework/src/main/java/com/qs/serve/common/config/CustomServletContextInitializer.java b/cms-framework/src/main/java/com/qs/serve/common/config/CustomServletContextInitializer.java new file mode 100644 index 0000000..26c2074 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/config/CustomServletContextInitializer.java @@ -0,0 +1,24 @@ +package com.qs.serve.common.config; + +import org.springframework.boot.web.servlet.ServletContextInitializer; +import org.springframework.context.annotation.Configuration; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.SessionTrackingMode; +import java.util.Collections; + + +/** + * 禁用jsessionid + * @author YenHex + * @since 2022/3/11 + */ +@Configuration +public class CustomServletContextInitializer implements ServletContextInitializer { + + @Override + public void onStartup(ServletContext servletContext) throws ServletException { + servletContext.setSessionTrackingModes(Collections.singleton(SessionTrackingMode.COOKIE)); + } +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/config/DevEnvironmentConfig.java b/cms-framework/src/main/java/com/qs/serve/common/config/DevEnvironmentConfig.java new file mode 100644 index 0000000..172699e --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/config/DevEnvironmentConfig.java @@ -0,0 +1,33 @@ +package com.qs.serve.common.config; + +import com.qs.serve.common.util.Assert; +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; + +/** + * @author YenHex + * @since 2022/3/11 + */ +@Slf4j +@UtilityClass +public class DevEnvironmentConfig { + + private static Boolean devEnv = null; + public static void openDevEnv(Boolean open){ + log.warn("环境变量:devEnv=>>> "+open); + devEnv = open; + } + + public static Boolean isDev(){ + if(devEnv==null){ + Assert.throwEx("资源加载中..."); + } + return devEnv; + } + + /** + * 开启账套 + */ + public final static boolean OPEN_TENANT_BOOK = true; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/config/JwtConfig.java b/cms-framework/src/main/java/com/qs/serve/common/config/JwtConfig.java new file mode 100644 index 0000000..295c10d --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/config/JwtConfig.java @@ -0,0 +1,23 @@ +package com.qs.serve.common.config; + + +import lombok.Getter; + +/** + * @Author: YenHex + * @Date: 2021/3/3 + * @Version: 1.0 + **/ +@Getter +public class JwtConfig { + + /** + * 单位分钟 + */ + private final Integer expire = 7; + + private final String iss = "KP_ISS"; + + private final String secret = "QiShenAa18n9VUcCxaSeSqLtFvsSCaRoVPKtBLaYxB0123456"; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/config/RedisConfig.java b/cms-framework/src/main/java/com/qs/serve/common/config/RedisConfig.java new file mode 100644 index 0000000..cc4922f --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/config/RedisConfig.java @@ -0,0 +1,83 @@ +package com.qs.serve.common.config; + + +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; +import org.springframework.data.redis.serializer.*; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +import java.time.Duration; + + +/** + * @author YenHex + * @since 2022/2/24 + */ +@EnableCaching +@Configuration(proxyBeanMethods = false) +public class RedisConfig extends CachingConfigurerSupport{ + + private static final StringRedisSerializer STRING_SERIALIZER = new StringRedisSerializer(); + private static final GenericJackson2JsonRedisSerializer JACKSON__SERIALIZER = new GenericJackson2JsonRedisSerializer(); + + @Bean + public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { + //设置缓存过期时间 + RedisCacheConfiguration redisCacheCfg=RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(Duration.ofHours(1)) + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(STRING_SERIALIZER)) + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(JACKSON__SERIALIZER)); + return RedisCacheManager.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory)) + .cacheDefaults(redisCacheCfg) + .build(); + } + +// @Bean +// public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) { +// JavaTimeModule module = new JavaTimeModule(); +// DateTimeFormatter formatter = new DateTimeFormatterBuilder() +// .appendPattern("yyyy-MM-dd HH:mm:ss").toFormatter(); +// module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); +// module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); +// ObjectMapper objectMapper = builder.createXmlMapper(false).build(); +// objectMapper.registerModule(new JavaTimeModule()); +// objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); +// return objectMapper; +// } + + @Bean + public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory){ + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + container.setConnectionFactory(connectionFactory); + return container; + } + + @Bean + @ConditionalOnMissingBean(name = "redisTemplate") + public RedisTemplate redisTemplate(RedisConnectionFactory factory){ + // 配置redisTemplate + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(factory); + // key序列化 + redisTemplate.setKeySerializer(STRING_SERIALIZER); + // value序列化 + redisTemplate.setValueSerializer(JACKSON__SERIALIZER); + // Hash key序列化 + redisTemplate.setHashKeySerializer(STRING_SERIALIZER); + // Hash value序列化 + redisTemplate.setHashValueSerializer(JACKSON__SERIALIZER); + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/config/SpringMvcConfig.java b/cms-framework/src/main/java/com/qs/serve/common/config/SpringMvcConfig.java new file mode 100644 index 0000000..9cded5e --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/config/SpringMvcConfig.java @@ -0,0 +1,72 @@ +package com.qs.serve.common.config; + +import com.qs.serve.common.config.properties.ProjectProperties; +import com.qs.serve.common.framework.interceptor.LimitSubmitInterceptor; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.multipart.MultipartResolver; +import org.springframework.web.multipart.commons.CommonsMultipartResolver; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * @author YenHex + * @since 2022/2/24 + */ +@Slf4j +@AllArgsConstructor +@Configuration(proxyBeanMethods = false) +public class SpringMvcConfig implements WebMvcConfigurer { + + private final LimitSubmitInterceptor limitSubmitInterceptor; + //private final ApiAuthInterceptor apiAuthInterceptor; + + private final ProjectProperties projectProperties; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(limitSubmitInterceptor) + .addPathPatterns("/**"); + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + log.warn("PcWebLocal==>{}",projectProperties.getPcWebLocal()); + registry.addResourceHandler("/web/**") + .addResourceLocations("file:"+projectProperties.getPcWebLocal()); + registry.addResourceHandler("/static/**") + .addResourceLocations("file:"+projectProperties.getPcWebLocal()+"static/"); + } + + @Bean + public CorsFilter corsFilter() { + final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); + final CorsConfiguration corsConfiguration = new CorsConfiguration(); + /*是否允许请求带有验证信息*/ + corsConfiguration.setAllowCredentials(true); + /*允许访问的客户端域名*/ + corsConfiguration.addAllowedOrigin("*"); + /*允许服务端访问的客户端请求头*/ + corsConfiguration.addAllowedHeader("*"); + /*允许访问的方法名,GET POST等*/ + corsConfiguration.addAllowedMethod("*"); + urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration); + return new CorsFilter(urlBasedCorsConfigurationSource); + } + + //@Bean + public MultipartResolver multipartResolver(){ + CommonsMultipartResolver resolver = new CommonsMultipartResolver(); + resolver.setMaxInMemorySize(5120); + resolver.setMaxInMemorySize(300 * 1024 * 1024); + resolver.setDefaultEncoding("UTF-8"); + return resolver; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/config/ThreadPoolConfig.java b/cms-framework/src/main/java/com/qs/serve/common/config/ThreadPoolConfig.java new file mode 100644 index 0000000..f1128d5 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/config/ThreadPoolConfig.java @@ -0,0 +1,56 @@ +package com.qs.serve.common.config; + +import com.qs.serve.common.util.ThreadsUtils; +import org.apache.commons.lang3.concurrent.BasicThreadFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; + + +/** + * 线程池配置 + * @author YenHex + * @since 2022/2/24 + */ +@Configuration +public class ThreadPoolConfig { + + /** 核心线程池大小 */ + private final int corePoolSize = 50; + + + @Bean(name = "threadPoolTaskExecutor") + public ThreadPoolTaskExecutor threadPoolTaskExecutor() { + // 最大可创建的线程数 + int maxPoolSize = 200; + // 队列最大长度 + int queueCapacity = 1000; + // 线程池维护线程所允许的空闲时间 + int keepAliveSeconds = 300; + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setMaxPoolSize(maxPoolSize); + executor.setCorePoolSize(corePoolSize); + executor.setQueueCapacity(queueCapacity); + executor.setKeepAliveSeconds(keepAliveSeconds); + // 线程池对拒绝任务(无线程可用)的处理策略 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return executor; + } + + /** 执行周期性或定时任务 */ + @Bean(name = "scheduledExecutorService") + protected ScheduledExecutorService scheduledExecutorService() { + return new ScheduledThreadPoolExecutor(corePoolSize, + new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build()) { + @Override + protected void afterExecute(Runnable r, Throwable t) { + super.afterExecute(r, t); + ThreadsUtils.printException(r, t); + } + }; + } +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/config/properties/AliYunOssProperties.java b/cms-framework/src/main/java/com/qs/serve/common/config/properties/AliYunOssProperties.java new file mode 100644 index 0000000..fd69d18 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/config/properties/AliYunOssProperties.java @@ -0,0 +1,25 @@ +package com.qs.serve.common.config.properties; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @Author: YenHex + * @Date: 2021/3/3 + * @Version: 1.0 + **/ +@Getter +@Setter +@Component +@ConfigurationProperties(prefix = "aliyun.oss") +public class AliYunOssProperties { + + private String bucket; + private String accessKeyId; + private String accessKeySecret; + private String endpoint; + private String prefix; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/config/properties/AuthUrlConst.java b/cms-framework/src/main/java/com/qs/serve/common/config/properties/AuthUrlConst.java new file mode 100644 index 0000000..910aebc --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/config/properties/AuthUrlConst.java @@ -0,0 +1,13 @@ +package com.qs.serve.common.config.properties; + +/** + * @author YenHex + * @since 2024/3/27 + */ +public class AuthUrlConst { + + public final static String[] AUTH_ALLOW_URL = new String[]{ + "bir/" + }; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/config/properties/PermitProperties.java b/cms-framework/src/main/java/com/qs/serve/common/config/properties/PermitProperties.java new file mode 100644 index 0000000..c6269b4 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/config/properties/PermitProperties.java @@ -0,0 +1,32 @@ +package com.qs.serve.common.config.properties; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: YenHex + * @Date: 2021/3/3 + * @Version: 1.0 + **/ +@Getter +@Setter +@Component +@ConfigurationProperties(prefix = "project.ignore-url") +public class PermitProperties { + + /** + * 可通过路径(适用于回调场景、无拦截场景等) + */ + private List permits = new ArrayList<>(); + + /** + * 默认租户拦截(适用于无需登录接口,但有租户拦截) + */ + private List tenants = new ArrayList<>(); + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/config/properties/ProjectApisProperties.java b/cms-framework/src/main/java/com/qs/serve/common/config/properties/ProjectApisProperties.java new file mode 100644 index 0000000..8d81797 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/config/properties/ProjectApisProperties.java @@ -0,0 +1,36 @@ +package com.qs.serve.common.config.properties; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @author YenHex + * @since 2023/9/7 + */ +@Getter +@Setter +@Component +@ConfigurationProperties(prefix = "project.apis") +public class ProjectApisProperties { + + /** 支付接口 */ + private String costToPay; + + /** 同步核销的支付状态 */ + private String checkPayStatus; + + /** 调度系统-发货单 */ + private String diaoduPlanOrder; + + /** 嘉士利接口,spu转换sku */ + private String spuToSku; + + /** + * 原是生成销路通apt的中间表,替换伟成的接口直接生成 + */ + private String policySyncCate; + + private String policySyncInv; +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/config/properties/ProjectProperties.java b/cms-framework/src/main/java/com/qs/serve/common/config/properties/ProjectProperties.java new file mode 100644 index 0000000..f232a0c --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/config/properties/ProjectProperties.java @@ -0,0 +1,31 @@ +package com.qs.serve.common.config.properties; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @Author: YenHex + * @Date: 2021/3/3 + * @Version: 1.0 + **/ +@Getter +@Setter +@Component +@ConfigurationProperties(prefix = "project") +public class ProjectProperties { + + private String closeAuth; + + private String birService; + + private String birServiceUrl; + + private String hostUrl; + + private String webUrl; + + private String pcWebLocal; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/config/properties/QiShengDsProperties.java b/cms-framework/src/main/java/com/qs/serve/common/config/properties/QiShengDsProperties.java new file mode 100644 index 0000000..e1cd414 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/config/properties/QiShengDsProperties.java @@ -0,0 +1,22 @@ +package com.qs.serve.common.config.properties; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @author YenHex + * @since 2024/6/18 + */ +@Getter +@Setter +@Component +@ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.qisheng") +public class QiShengDsProperties { + + private String url; + private String username; + private String password; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/config/properties/RedisProperties.java b/cms-framework/src/main/java/com/qs/serve/common/config/properties/RedisProperties.java new file mode 100644 index 0000000..34cd197 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/config/properties/RedisProperties.java @@ -0,0 +1,25 @@ +package com.qs.serve.common.config.properties; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @author YenHex + * @since 2022/3/7 + */ +@Getter +@Setter +@Component +@ConfigurationProperties(prefix = "spring.redis") +public class RedisProperties { + + private String host; + + private Integer port; + + private String password; + + private Integer database; +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/config/properties/SeeYonProperties.java b/cms-framework/src/main/java/com/qs/serve/common/config/properties/SeeYonProperties.java new file mode 100644 index 0000000..55cd2f3 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/config/properties/SeeYonProperties.java @@ -0,0 +1,25 @@ +package com.qs.serve.common.config.properties; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @Author: YenHex + * @Date: 2021/3/3 + * @Version: 1.0 + **/ +@Getter +@Setter +@Component +@ConfigurationProperties(prefix = "project.seeyon") +public class SeeYonProperties { + + private Boolean enable; + + private String url; + + private String extApi; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/config/properties/UploadProperties.java b/cms-framework/src/main/java/com/qs/serve/common/config/properties/UploadProperties.java new file mode 100644 index 0000000..a18b81e --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/config/properties/UploadProperties.java @@ -0,0 +1,24 @@ +package com.qs.serve.common.config.properties; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @author YenHex + * @since 2022/3/14 + */ +@Getter +@Setter +@Component +@ConfigurationProperties(prefix = "project.upload") +public class UploadProperties { + + private String tempPath; + + private String proxyUrl; + + private String logicalPath; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/annotations/RedisCacheable.java b/cms-framework/src/main/java/com/qs/serve/common/framework/annotations/RedisCacheable.java new file mode 100644 index 0000000..c4acc8a --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/annotations/RedisCacheable.java @@ -0,0 +1,35 @@ +package com.qs.serve.common.framework.annotations; + +import java.lang.annotation.*; + +/** + * 解决原有@CacheAble不支持独立失效策略场景 + * @author YenHex + * @since 2024/10/17 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RedisCacheable { + + /** + * redis缓存前缀,默认类与方法名 + * @return + */ + String prefix() default ""; + + /** + * 过期时间 + * @return + */ + int expire() default 350; + + /** + * 缓存读取主键表达式 + * @return + */ + String expression() default ""; + + String SIMPLE_KEY = "#key"; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/annotations/TagField.java b/cms-framework/src/main/java/com/qs/serve/common/framework/annotations/TagField.java new file mode 100644 index 0000000..53d4fec --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/annotations/TagField.java @@ -0,0 +1,4 @@ +package com.qs.serve.common.framework.annotations; + +public @interface TagField { +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/aop/RedisCacheAspect.java b/cms-framework/src/main/java/com/qs/serve/common/framework/aop/RedisCacheAspect.java new file mode 100644 index 0000000..f6cbc5e --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/aop/RedisCacheAspect.java @@ -0,0 +1,133 @@ +package com.qs.serve.common.framework.aop; + +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.qs.serve.common.framework.annotations.RedisCacheable; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.util.JsonUtil; +import com.qs.serve.common.util.StringUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.core.annotation.AnnotatedElementUtils; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @author YenHex + * @since 2024/10/18 + */ +@Slf4j +//@Aspect +//@Component +@AllArgsConstructor +public class RedisCacheAspect { + + private final RedisService redisService; + + @Pointcut("@annotation(com.qs.serve.common.framework.annotations.RedisCacheable)") + public void PointCut() {} + + @Around("PointCut()") + public Object redisCacheAdvice(ProceedingJoinPoint joinPoint) throws Throwable { + Object[] args = joinPoint.getArgs(); + Signature signature = joinPoint.getSignature(); + MethodSignature methodSignature = ((MethodSignature) signature); + Method method = methodSignature.getMethod(); + RedisCacheable redisCacheable = AnnotatedElementUtils.findMergedAnnotation(method, RedisCacheable.class); + if(redisCacheable!=null){ + String prefix = StringUtils.hasText(redisCacheable.prefix()) ? redisCacheable.prefix() + : methodSignature.getDeclaringType().getName() +"."+ methodSignature.getMethod().getName()+"()"; + //构建表达式key + String pk = this.getPrimaryKey(methodSignature,redisCacheable,args); + String redisCacheKey = "RCache:" + prefix + (pk==null?"":pk); + Object result = redisService.get(redisCacheKey); + if(result!=null){ + return JsonUtil.jsonToMap(result.toString()); + } + result = joinPoint.proceed(args); + if(result!=null){ + redisService.set(redisCacheKey,JsonUtil.objectToJson(result),redisCacheable.expire(), TimeUnit.MILLISECONDS); + } + return result; + } + // 返回默认对象 + return joinPoint.proceed(args); + } + + public String getPrimaryKey(MethodSignature methodSignature,RedisCacheable annotation,Object[] args){ + String method = methodSignature.getDeclaringType().getName() + +"."+ methodSignature.getMethod().getName()+"()"; + final String expression = annotation.expression(); + //适配表达式读取key,key读取不到log.error,放行请求 + String primaryKey = null; + if(StringUtils.isNotEmpty(expression)){ + // + if(expression.equals(RedisCacheable.SIMPLE_KEY)&&args.length==1){ + return args[0].toString(); + } + List keys = new ArrayList<>(); + // 指定表名 + String tableName = null; + if(expression.contains(StringPool.DOT)){ + String[] keyArr = expression.split(StringPool.BACK_SLASH + StringPool.DOT); + for (String key : keyArr) { + if(key.contains(StringPool.DOLLAR)){ + tableName = key.replace(StringPool.DOLLAR,""); + continue; + } + keys.add(key); + } + }else { + keys.add(expression); + } + for (Object arg : args) { + // 跳过非指定的表名 + if(tableName!=null){ + String clazzName = arg.getClass().getSimpleName(); + if(!clazzName.equals(tableName)){ + continue; + } + } + // 读取key + primaryKey = getPrimaryKeyRecursion(keys, arg, 0); + } + if(primaryKey==null){ + log.error("LockSubmitAspect失效,方法:{} 无法读取主键:{}",method,expression); + } + } + return primaryKey; + } + + + /** + * 递归读取主键 + * @param keys + * @param arg + * @param startIndex + * @return + */ + private String getPrimaryKeyRecursion(List keys, Object arg, int startIndex) { + String key = keys.get(startIndex); + Map param = JsonUtil.jsonToMap(JsonUtil.objectToJson(arg)); + Object val = param.get(key); + if(val!=null){ + boolean isLast = startIndex + 1== keys.size(); + if(isLast){ + return val.toString(); + }else { + // 自调支持无限层级 + return getPrimaryKeyRecursion(keys, val, startIndex + 1 ); + } + } + return null; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/exception/BaseException.java b/cms-framework/src/main/java/com/qs/serve/common/framework/exception/BaseException.java new file mode 100644 index 0000000..07d0353 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/exception/BaseException.java @@ -0,0 +1,21 @@ +package com.qs.serve.common.framework.exception; + +/** + * @author JcYen + * @date 2020/6/11 + * @version 1.0 + */ +public abstract class BaseException extends RuntimeException { + + public BaseException(String message){ + super(message); + } + + /** + * 错误代码 + * @return + */ + public abstract int getCode(); + + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/exception/BusinessException.java b/cms-framework/src/main/java/com/qs/serve/common/framework/exception/BusinessException.java new file mode 100644 index 0000000..6679aca --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/exception/BusinessException.java @@ -0,0 +1,25 @@ +package com.qs.serve.common.framework.exception; + +import java.io.Serializable; + +/** + * @author JcYen + * @Date 2020/6/11 + * @Version 1.0 + */ +public class BusinessException extends BaseException implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer status; + + public BusinessException(String message,Integer status) { + super(message); + this.status = status; + } + + @Override + public int getCode() { + return status; + } +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/exception/UnifiedExceptionHandler.java b/cms-framework/src/main/java/com/qs/serve/common/framework/exception/UnifiedExceptionHandler.java new file mode 100644 index 0000000..f463aa8 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/exception/UnifiedExceptionHandler.java @@ -0,0 +1,153 @@ +package com.qs.serve.common.framework.exception; + +import com.qs.serve.common.config.DevEnvironmentConfig; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.enums.HttpCode; +import lombok.extern.slf4j.Slf4j; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.http.converter.HttpMessageNotWritableException; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Component; +import org.springframework.validation.BindException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.sql.SQLIntegrityConstraintViolationException; + + +/** + * @Author JcYen + * @Date 2019/6/7 + * @Version 1.0 + */ +@Slf4j +@Component +@ControllerAdvice +public class UnifiedExceptionHandler { + + + @ExceptionHandler(value = BusinessException.class) + @ResponseBody + public R handleBindException(BusinessException e,HttpServletRequest request) { + log.warn("自定义异常触发【{},{}】,请求地址:{}",e.getCode(),e.getMessage(),request.getRequestURI()); + return new R(e.getCode(),e.getMessage()); + } + + @ExceptionHandler(value = NullPointerException.class) + @ResponseBody + public R handleBindException(NullPointerException e,HttpServletRequest request) { + StringBuilder stringBuilder = new StringBuilder(); + for (StackTraceElement element : e.getStackTrace()) { + if (element.getClassName().contains("qs")){ + stringBuilder.append(element.getClassName()+":"+element.getLineNumber()+"\n"); + } + } + log.error("\n空指针:{} \n{}",request.getRequestURI(),stringBuilder); + e.printStackTrace(); + return R.error("数据不存在或被移除"); + } + + @ExceptionHandler({ + AccessDeniedException.class + }) + @ResponseBody + public R handleAccessException(AccessDeniedException e,HttpServletRequest request) { + HttpCode hc = HttpCode.FORBIDDEN_403; + log.error("访问拦截【{}】,请求地址:{}",e.getMessage(),request.getRequestURI()); + return new R(hc.getCode(),hc.getMsg()); + } + + @ExceptionHandler({ + UsernameNotFoundException.class, + }) + @ResponseBody + public R handlePrintMsgException(UsernameNotFoundException e) { + return R.error(); + } + + @ExceptionHandler({ + BadCredentialsException.class, + }) + @ResponseBody + public R handlePrintMsgException(Exception e) { + log.warn(e.getMessage()); + HttpCode hc = HttpCode.LOGIN_ERR_1; + return new R(hc.getCode(),hc.getMsg()); + } + + @ExceptionHandler({ + BindException.class, + HttpRequestMethodNotSupportedException.class + }) + @ResponseBody + public R handleDevPrintMsgException(Exception e,HttpServletRequest request) { + log.error("参数校验异常:{}",e.getMessage()); + if(DevEnvironmentConfig.isDev()){ + return R.error(e.getMessage()); + } + return R.error(); + } + + @ExceptionHandler({ + MethodArgumentNotValidException.class, + }) + @ResponseBody + public R handleMethodArgumentNotValidException(MethodArgumentNotValidException e,HttpServletRequest request) { + log.error("参数校验异常【{}】,请求地址:{}",e.getMessage(),request.getRequestURI()); + return R.error(e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); + } + + + @ExceptionHandler(value = DuplicateKeyException.class) + @ResponseBody + public R handleDuplicateKeyException(DuplicateKeyException e,HttpServletRequest request) { + log.error("限制重复数据【{}】,请求地址:{}",e.getMessage(),request.getRequestURI()); + e.printStackTrace(); + return R.error("限制重复数据,请联系管理员"); + } + + @ExceptionHandler(value = HttpMessageNotReadableException.class) + @ResponseBody + public R handleHttpMessageNotReadableException(HttpMessageNotReadableException e,HttpServletRequest request) { + log.error("请求参数无法解析【{}】,请求地址:{}",e.getMessage(),request.getRequestURI()); + return R.error("请求参数无法解析"); + } + + @ExceptionHandler({ + SQLIntegrityConstraintViolationException.class, + }) + @ResponseBody + public R handleSqlIntegrityException(Exception e,HttpServletRequest request) { + log.warn("数据库拦截【{}】,请求地址:{}",e.getMessage(),request.getRequestURI()); + e.printStackTrace(); + return new R(500,"数据库拦截,请联系管理员"); + } + + /** + * 强制运行写入成功 + * @param e + * @return + */ + @ExceptionHandler(value = HttpMessageNotWritableException.class) + @ResponseBody + public R handleMsgException(HttpMessageNotWritableException e) { + return R.ok(); + } + + @ExceptionHandler(value = Exception.class) + @ResponseBody + public R handleException(Exception e,HttpServletRequest request) { + log.error("Servlet异常\n请求地址:{},异常类型:{}\n异常信息:{}\n异常体:",request.getRequestURI(),e.getClass().getSimpleName(),e.getMessage(),e); + e.printStackTrace(); + if(DevEnvironmentConfig.isDev()){return R.error(e.getMessage());} + return R.error(); + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/interceptor/LimitSubmitInterceptor.java b/cms-framework/src/main/java/com/qs/serve/common/framework/interceptor/LimitSubmitInterceptor.java new file mode 100644 index 0000000..c778351 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/interceptor/LimitSubmitInterceptor.java @@ -0,0 +1,66 @@ +package com.qs.serve.common.framework.interceptor; + +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.HttpResponsePrintUtil; +import com.qs.serve.common.model.annotation.LimitSubmit; +import com.qs.serve.common.util.StringUtils; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.lang.reflect.Method; +import java.util.concurrent.TimeUnit; + +/** + * 防止重复提交拦截器 + * @author YenHex + */ +@Configuration(proxyBeanMethods = false) +public class LimitSubmitInterceptor implements HandlerInterceptor { + + public final String REPEAT_Limit_KEY = "repeatLimitKey"; + + @Resource + public RedisService redisService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + if (handler instanceof HandlerMethod) { + HandlerMethod handlerMethod = (HandlerMethod) handler; + Method method = handlerMethod.getMethod(); + LimitSubmit annotation = method.getAnnotation(LimitSubmit.class); + if (annotation != null) { + if (this.LimitSubmit(request, annotation)) { + if(StringUtils.isNotEmpty(annotation.message())){ + HttpResponsePrintUtil.print(response,406,annotation.message()); + }else { + HttpResponsePrintUtil.print(response,406,"系统处理中,请勿频繁操作"); + } + return false; + } + } + return true; + } else { + return true; + } + } + + /** + * 验证是否重复提交由子类实现具体的防重复提交的规则 + * @param request 请求对象 + * @param annotation 防复注解 + * @return + */ + public boolean LimitSubmit(HttpServletRequest request, LimitSubmit annotation) throws Exception { + String key = REPEAT_Limit_KEY+"_"+request.getRequestURI()+"_"+request.getRemoteHost(); + Object cache = redisService.get(key); + if(cache!=null){return true;} + redisService.set(key,"true",annotation.interval(), TimeUnit.MILLISECONDS); + return false; + } + + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/interceptor/LocalDateTimeFormatSerializer.java b/cms-framework/src/main/java/com/qs/serve/common/framework/interceptor/LocalDateTimeFormatSerializer.java new file mode 100644 index 0000000..32536cb --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/interceptor/LocalDateTimeFormatSerializer.java @@ -0,0 +1,29 @@ +package com.qs.serve.common.framework.interceptor; + +import com.alibaba.fastjson.serializer.JSONSerializer; +import com.alibaba.fastjson.serializer.ObjectSerializer; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * @author YenHex + * @since 2024/7/18 + */ +public class LocalDateTimeFormatSerializer implements ObjectSerializer { + + @Override + public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { + if (object == null) { + serializer.out.writeNull(); + return; + } + LocalDateTime date = (LocalDateTime) object; + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String timeString = formatter.format(date); + serializer.write(timeString); + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/interceptor/RepeatSubmitInterceptor.java b/cms-framework/src/main/java/com/qs/serve/common/framework/interceptor/RepeatSubmitInterceptor.java new file mode 100644 index 0000000..0aec072 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/interceptor/RepeatSubmitInterceptor.java @@ -0,0 +1,98 @@ +package com.qs.serve.common.framework.interceptor; + +import com.qs.serve.common.model.HttpResponsePrintUtil; +import com.qs.serve.common.model.annotation.RepeatSubmit; +import com.qs.serve.common.util.JsonUtil; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +/** + * 防止重复提交拦截器 + * @author YenHex + */ +@Configuration(proxyBeanMethods = false) +public class RepeatSubmitInterceptor implements HandlerInterceptor { + + public final String REPEAT_PARAMS = "repeatParams"; + public final String REPEAT_TIME = "repeatTime"; + public final String SESSION_REPEAT_KEY = "repeatData"; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + if (handler instanceof HandlerMethod) { + HandlerMethod handlerMethod = (HandlerMethod) handler; + Method method = handlerMethod.getMethod(); + RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class); + if (annotation != null) { + if (this.isRepeatSubmit(request, annotation)) { + HttpResponsePrintUtil.print(response,406,"系统正常处理,请勿重复提交"); + return false; + } + } + return true; + } else { + return true; + } + } + + /** + * 验证是否重复提交由子类实现具体的防重复提交的规则 + * @param request 请求对象 + * @param annotation 防复注解 + * @return + */ + public boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation) throws Exception { + // 本次参数及系统时间 + String nowParams = JsonUtil.objectToJson(request.getParameterMap()); + Map nowDataMap = new HashMap(); + nowDataMap.put(REPEAT_PARAMS, nowParams); + nowDataMap.put(REPEAT_TIME, System.currentTimeMillis()); + // 请求地址(作为存放session的key值) + String url = request.getRequestURI(); + HttpSession session = request.getSession(); + Object sessionObj = session.getAttribute(SESSION_REPEAT_KEY); + if (sessionObj != null) { + Map sessionMap = (Map) sessionObj; + if (sessionMap.containsKey(url)) { + Map preDataMap = (Map) sessionMap.get(url); + if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap, annotation.interval())) { + return true; + } + } + } + Map sessionMap = new HashMap<>(); + sessionMap.put(url, nowDataMap); + session.setAttribute(SESSION_REPEAT_KEY, sessionMap); + return false; + } + + /** + * 判断参数是否相同 + */ + private boolean compareParams(Map nowMap, Map preMap) { + String nowParams = (String) nowMap.get(REPEAT_PARAMS); + String preParams = (String) preMap.get(REPEAT_PARAMS); + return nowParams.equals(preParams); + } + + /** + * 判断两次间隔时间 + */ + private boolean compareTime(Map nowMap, Map preMap, int interval) { + long time1 = (Long) nowMap.get(REPEAT_TIME); + long time2 = (Long) preMap.get(REPEAT_TIME); + if ((time1 - time2) < interval) { + return true; + } + return false; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/manager/AsyncManager.java b/cms-framework/src/main/java/com/qs/serve/common/framework/manager/AsyncManager.java new file mode 100644 index 0000000..d82e34f --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/manager/AsyncManager.java @@ -0,0 +1,52 @@ +package com.qs.serve.common.framework.manager; + +import com.qs.serve.common.util.SpringUtils; +import com.qs.serve.common.util.ThreadsUtils; + +import java.util.TimerTask; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + + +/** + * 异步任务管理器 + * @author YenHex + * @since 2022/2/24 + */ +public class AsyncManager { + /** + * 操作延迟10毫秒 + */ + private final int OPERATE_DELAY_TIME = 10; + + /** + * 异步操作任务调度线程池 + */ + private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService"); + + /** + * 单例模式 + */ + private AsyncManager() { + } + + private static AsyncManager me = new AsyncManager(); + + public static AsyncManager me() { + return me; + } + + /** + * 执行任务 + * @param task 任务 + */ + public void execute(TimerTask task) { + executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS); + } + + /** 停止任务线程池 */ + public void shutdown() { + ThreadsUtils.shutdownAndAwaitTermination(executor); + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/handler/IdGeneratorHandler.java b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/handler/IdGeneratorHandler.java new file mode 100644 index 0000000..59b3b7a --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/handler/IdGeneratorHandler.java @@ -0,0 +1,17 @@ +package com.qs.serve.common.framework.mybatis.handler; + +import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator; +import com.qs.serve.common.util.NanoIdUtils; + +/** + * @author YenHex + * @since 2022/4/11 + */ +public class IdGeneratorHandler extends DefaultIdentifierGenerator { + + @Override + public String nextUUID(Object entity) { + return NanoIdUtils.randomNanoId(); + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/handler/meta/JsonStringTypeHandler.java b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/handler/meta/JsonStringTypeHandler.java new file mode 100644 index 0000000..9efe3ba --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/handler/meta/JsonStringTypeHandler.java @@ -0,0 +1,50 @@ +package com.qs.serve.common.framework.mybatis.handler.meta; + +import cn.hutool.json.JSONUtil; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * 存储到数据库, 将String数组转换成字符串; + * 从数据库获取数据, 将字符串转为LONG数组. + * @author YenHex + * @since 2022/3/1 + */ +@MappedTypes({String[].class}) +@MappedJdbcTypes({JdbcType.VARCHAR}) +public class JsonStringTypeHandler extends BaseTypeHandler { + + private static String[] l = new String[]{}; + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, + String[] parameter, JdbcType jdbcType) throws SQLException { + ps.setString(i, JSONUtil.toJsonStr(parameter)); + } + + @Override + public String[] getNullableResult(ResultSet rs, String columnName) + throws SQLException { + return JSONUtil.parseArray(rs.getString(columnName)).toArray(l); + } + + @Override + public String[] getNullableResult(ResultSet rs, int columnIndex) + throws SQLException { + return JSONUtil.parseArray(rs.getString(columnIndex)).toArray(l); + } + + @Override + public String[] getNullableResult(CallableStatement cs, int columnIndex) + throws SQLException { + return JSONUtil.parseArray(cs.getString(columnIndex)).toArray(l); + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/handler/meta/SplitStringTypeHandler.java b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/handler/meta/SplitStringTypeHandler.java new file mode 100644 index 0000000..ac02252 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/handler/meta/SplitStringTypeHandler.java @@ -0,0 +1,74 @@ +package com.qs.serve.common.framework.mybatis.handler.meta; + +import com.qs.serve.common.util.StringUtils; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Arrays; + +/** + * 存储到数据库, 将String数组转换成字符串; + * 从数据库获取数据, 将字符串转为LONG数组. + * @author YenHex + * @since 2022/3/1 + */ +@MappedTypes({String[].class}) +@MappedJdbcTypes({JdbcType.VARCHAR}) +public class SplitStringTypeHandler extends BaseTypeHandler { + + private static String[] l = new String[]{}; + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType) throws SQLException { + if(parameter!=null&¶meter.length>1){ + StringBuffer buffer = new StringBuffer(); + for (int i1 = 0; i1 < parameter.length; i1++) { + buffer.append(parameter[i1]); + if(i1+1 val != null && val.trim().length() > 0) + .toArray(String[]::new); + } + return null; + } + + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/handler/meta/TableNameAppendHandler.java b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/handler/meta/TableNameAppendHandler.java new file mode 100644 index 0000000..5b4520d --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/handler/meta/TableNameAppendHandler.java @@ -0,0 +1,69 @@ +package com.qs.serve.common.framework.mybatis.handler.meta; + +import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler; +import lombok.extern.slf4j.Slf4j; + +import java.util.Arrays; +import java.util.List; + +/** + * 拓展表格名称 + * @author YenHex + * @since 2024/12/26 + */ +@Slf4j +public class TableNameAppendHandler implements TableNameHandler { + + /** + * 用于记录哪些表可以使用该月份动态表名处理器(即哪些表按月分表) + */ + private List tableNames; + + /** + * 构造函数,构造动态表名处理器的时候,传递tableNames参数 + * @param tableNames + */ + public TableNameAppendHandler(String ...tableNames) { + this.tableNames = Arrays.asList(tableNames); + } + + /** + * 每个请求线程维护一个month数据,避免多线程数据冲突。所以使用ThreadLocal + */ + private static final ThreadLocal APPEND_DATA = new ThreadLocal<>(); + + /** + * 设置请求线程的month数据 + * @param name + */ + public static void setAppend(String name) { + APPEND_DATA.set(name); + } + + /** + * 删除当前请求线程的month数据 + */ + public static void removeCache() { + APPEND_DATA.remove(); + } + + /** + * 动态表名接口实现方法 + * @param sql + * @param tableName + * @return + */ + @Override + public String dynamicTableName(String sql, String tableName) { + if (this.tableNames.contains(tableName) && APPEND_DATA.get() != null){ + //表名增加月份后缀 + return tableName + "_" + APPEND_DATA.get(); + }else{ + if(this.tableNames.contains(tableName)){ + log.warn("APPEND_DATA is null, table is {}",tableName); + } + //表名原样返回 + return tableName; + } + } +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/join/JoinUtil.java b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/join/JoinUtil.java new file mode 100644 index 0000000..4e14619 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/join/JoinUtil.java @@ -0,0 +1,115 @@ +package com.qs.serve.common.framework.mybatis.join; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.common.framework.mybatis.join.annotations.BindEntity; +import com.qs.serve.common.framework.mybatis.join.enums.JoinType; +import com.qs.serve.common.framework.mybatis.join.model.JoinFieldData; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.SpringUtils; +import com.qs.serve.common.util.WordUtil; +import lombok.extern.slf4j.Slf4j; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author YenHex + * @since 2022/5/24 + */ +@Slf4j +public class JoinUtil { + + private static Map> CACHE_MAP = new ConcurrentHashMap<>(); + + private static List getJoinFields(List list) { + if(CollectionUtil.isEmpty(list)){ + return new ArrayList<>(); + } + String className = list.get(0).getClass().getName(); + List joinFieldDataList = new ArrayList<>(); + Class clazz = null; + try { + clazz = Class.forName(className); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + if(clazz==null){return null;} + Field[] fields = clazz.getDeclaredFields(); + Field fieldJoinVal = null; + Field fieldSetVal = null; + BindEntity bindEntity = null; + for (Field field : fields) { + for (Annotation annotation : field.getAnnotations()) { + if(annotation instanceof BindEntity){ + fieldSetVal = field; + bindEntity = (BindEntity) annotation; + break; + } + } + } + if(fieldSetVal!=null){ + for (Field field :fields){ + if(field.getName().equals(bindEntity.joinField())){ + fieldJoinVal = field; + break; + } + } + } + if(bindEntity!=null&&fieldJoinVal!=null){ + JoinFieldData fieldData = new JoinFieldData(); + fieldData.setFieldJoinVal(fieldJoinVal); + fieldData.setBindEntity(bindEntity); + fieldData.setFieldSetVal(fieldSetVal); + joinFieldDataList.add(fieldData); + } + CACHE_MAP.put(className,joinFieldDataList); + return joinFieldDataList; + } + + public static void relate(List list) { + List joinFieldData = getJoinFields(list); + HashMap tempCache = new HashMap<>(list.size()+1); + for (JoinFieldData fieldData : joinFieldData) { + for (Object object : list) { + try { + Field fieldJoinVal = fieldData.getFieldJoinVal(); + Field fieldSetVal = fieldData.getFieldSetVal(); + BindEntity bindEntity = fieldData.getBindEntity(); + fieldSetVal.setAccessible(true); + fieldJoinVal.setAccessible(true); + IService iService = SpringUtils.getBean(bindEntity.service()); + Object identity = fieldJoinVal.get(object); + if(identity==null){ + continue; + } + Object result = tempCache.get(identity.toString()); + if(result!=null){ + fieldSetVal.set(object,result); + continue; + } + if(bindEntity.joinType()== JoinType.List){ + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(WordUtil.toLine(bindEntity.joinField()),identity); + result = iService.list(wrapper); + }else { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq(WordUtil.toLine(bindEntity.selfField()),identity); + result = iService.getOne(wrapper,false); + } + fieldSetVal.set(object,result); + tempCache.put(identity.toString(),result); + } catch (IllegalAccessException e) { + log.warn("join 工具失败:",e); + } + } + } + tempCache = null; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/join/annotations/BindEntity.java b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/join/annotations/BindEntity.java new file mode 100644 index 0000000..887fa1e --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/join/annotations/BindEntity.java @@ -0,0 +1,36 @@ +package com.qs.serve.common.framework.mybatis.join.annotations; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.common.framework.mybatis.join.enums.JoinType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 实现left join + * @author YenHex + * @since 2022/5/24 + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface BindEntity { + + Class service(); + + /** + * 关联的表 + * @return + */ + String joinField() default ""; + + /** + * 主表 + * @return + */ + String selfField() default "id"; + + JoinType joinType() default JoinType.Object; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/join/enums/JoinType.java b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/join/enums/JoinType.java new file mode 100644 index 0000000..df49269 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/join/enums/JoinType.java @@ -0,0 +1,14 @@ +package com.qs.serve.common.framework.mybatis.join.enums; + +/** + * @author YenHex + * @since 2022/5/24 + */ +public enum JoinType { + + /** + * 返回类型 + */ + Object,List + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/join/model/JoinFieldData.java b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/join/model/JoinFieldData.java new file mode 100644 index 0000000..6d87537 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/join/model/JoinFieldData.java @@ -0,0 +1,17 @@ +package com.qs.serve.common.framework.mybatis.join.model; + +import com.qs.serve.common.framework.mybatis.join.annotations.BindEntity; +import lombok.Data; + +import java.lang.reflect.Field; + +/** + * @author YenHex + * @since 2022/5/24 + */ +@Data +public class JoinFieldData { + Field fieldJoinVal; + Field fieldSetVal; + BindEntity bindEntity; +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/query/AnnotationQueryStorage.java b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/query/AnnotationQueryStorage.java new file mode 100644 index 0000000..fcdaf80 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/query/AnnotationQueryStorage.java @@ -0,0 +1,159 @@ +package com.qs.serve.common.framework.mybatis.query; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qs.serve.common.framework.mybatis.query.annotations.QueryWrap; +import com.qs.serve.common.framework.mybatis.query.model.QueryFieldData; +import com.qs.serve.common.framework.mybatis.query.model.QueryFieldDataValue; +import com.qs.serve.common.framework.mybatis.query.model.QueryType; +import com.qs.serve.common.util.WordUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author JcYen + * @Date 2017/10/28 + * @Version 1.0 + */ +@Slf4j +public class AnnotationQueryStorage { + + private static final Map> BEAN_QUERY_FIELD = new ConcurrentHashMap<>(); + + protected static List getQueryFieldList(String className){ + List queryFieldList = BEAN_QUERY_FIELD.get(className); + if(queryFieldList==null){ + Class clazz = null; + try { + clazz = Class.forName(className); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + queryFieldList = new ArrayList<>(); + if(clazz==null){return queryFieldList;} + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + Annotation[] annotations = field.getAnnotations(); + boolean isExist = false; + boolean isIgnore = false; + for (Annotation annotation : annotations) { + if(annotation instanceof QueryWrap){ + QueryWrap queryWrap = (QueryWrap)annotation; + QueryFieldData queryField= handleQueryField(queryWrap.type(),field); + if(queryField!=null){ + isExist = true; + queryFieldList.add(queryField); + break; + } + } + if(annotation instanceof TableField){ + TableField tableField = (TableField) annotation; + isIgnore = tableField.exist(); + } + } + //不存在,添加默认 + if( !isExist && !isIgnore ){ + QueryFieldData queryField = new QueryFieldData(); + //系统默认使用格式。示例: userInfo -> user_info + queryField.setColumnName(WordUtil.toLine(field.getName())); + queryField.setField(field); + queryField.setFieldName(field.getName()); + queryField.setType(QueryType.NONE); + queryFieldList.add(queryField); + } + } + BEAN_QUERY_FIELD.put(className,queryFieldList); + if(queryFieldList.size()==0){ + log.warn("无匹配的注解字段,类名:"+className); + } + } + return queryFieldList; + } + + /** + * 处理查询列 + * @param queryType + * @param field + * @return + */ + private static QueryFieldData handleQueryField(QueryType queryType, Field field){ + String columnName = null; + if(queryType!=null){ + QueryFieldData queryField = new QueryFieldData(); + if(StringUtils.isEmpty(columnName)){ + columnName = WordUtil.toLine(field.getName()); + } + queryField.setFieldName(field.getName()); + queryField.setColumnName(columnName); + queryField.setField(field); + queryField.setType(queryType); + return queryField; + } + return null; + } + + + /** + * 加载查询对象生成配置值 + * @param query + * @return + */ + protected static List loadQueryFieldDataValues(Object query){ + String className = query.getClass().getName(); + List dataList = AnnotationQueryStorage.getQueryFieldList(className); + if(!CollectionUtils.isEmpty(dataList)){ + List valueList = new ArrayList<>(); + for (QueryFieldData fieldData : dataList) { + Field field = fieldData.getField(); + field.setAccessible(true); + Object value = null; + try { + value = field.get(query); + } catch (IllegalAccessException e) { + log.warn("查询类字段参数异常。查询类:{},字段:{}",className,field.getName()); + } + if(value!=null){ + QueryFieldDataValue dataValue = new QueryFieldDataValue(fieldData); + //通过列条件,重新赋值(赋值查询条件和格式) + dataValue.setValue(value); + valueList.add(dataValue); + } + } + return valueList; + } + return null; + } + + /** + * 初始化封装包参数 + * @param fieldValues + * @param queryWrapper + * @param + * @return 判断是否排序 + */ + protected static void initWrap(List fieldValues, QueryWrapper queryWrapper){ + for (QueryFieldDataValue fieldValue : fieldValues) { + QueryType queryType = fieldValue.getType(); + Object value = fieldValue.getValue(); + String column = fieldValue.getColumnName(); + if(queryType.equals(QueryType.EQ)){ queryWrapper.eq(column,value); } + if(queryType.equals(QueryType.GE)){ queryWrapper.ge(column,value); } + if(queryType.equals(QueryType.GT)){ queryWrapper.gt(column,value); } + if(queryType.equals(QueryType.In)){ queryWrapper.in(column,value); } + if(queryType.equals(QueryType.LE)){ queryWrapper.le(column,value); } + if(queryType.equals(QueryType.Like)){ queryWrapper.like(column,value); } + if(queryType.equals(QueryType.LT)){ queryWrapper.lt(column,value); } + if(queryType.equals(QueryType.NE)){ queryWrapper.ne(column,value); } + if(queryType.equals(QueryType.RightLike)){ queryWrapper.likeRight(column,value); } + } + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/query/annotations/QueryWrap.java b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/query/annotations/QueryWrap.java new file mode 100644 index 0000000..96cc08f --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/query/annotations/QueryWrap.java @@ -0,0 +1,32 @@ +package com.qs.serve.common.framework.mybatis.query.annotations; + +import com.qs.serve.common.framework.mybatis.query.model.QueryType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author JcYen + * @date 2020/5/26 + * SQL In条件注解 + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface QueryWrap { + + /** + * 列名(默认为空字符串) + * 空字符串,采用字段转列策略 示例: userInfo -> user_info + * 非空时,采用列的值 + */ + String value() default ""; + + /** + * 查询类型(默认采用值相对) + */ + QueryType type() default QueryType.EQ; + +} + diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/query/model/QueryFieldData.java b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/query/model/QueryFieldData.java new file mode 100644 index 0000000..1654861 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/query/model/QueryFieldData.java @@ -0,0 +1,23 @@ +package com.qs.serve.common.framework.mybatis.query.model; + +import lombok.Getter; +import lombok.Setter; + +import java.lang.reflect.Field; + +/** + * 存储DTO + * @author JcYen + * @Date 2017/10/28 + * @Version 1.0 + */ +@Getter +@Setter +public class QueryFieldData { + + private Field field; + private QueryType type; + private String columnName; + private String fieldName; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/query/model/QueryFieldDataValue.java b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/query/model/QueryFieldDataValue.java new file mode 100644 index 0000000..718b176 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/query/model/QueryFieldDataValue.java @@ -0,0 +1,25 @@ +package com.qs.serve.common.framework.mybatis.query.model; + +import com.qs.serve.common.util.CopierUtil; +import lombok.Getter; +import lombok.Setter; + +/** + * 存储DTO + * @author JcYen + * @Date 2017/10/28 + * @Version 1.0 + */ +@Getter +@Setter +public class QueryFieldDataValue{ + + public QueryFieldDataValue(QueryFieldData data){ + CopierUtil.copy(data,this); + } + + private QueryType type; + private String columnName; + private String fieldName; + private Object value; +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/query/model/QueryType.java b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/query/model/QueryType.java new file mode 100644 index 0000000..d32cd45 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/mybatis/query/model/QueryType.java @@ -0,0 +1,40 @@ +package com.qs.serve.common.framework.mybatis.query.model; + +/** + * @author JcYen + */ +public enum QueryType { + + /** + * 无 + */ + NONE, + + /** + * 通用的equals(Integer,Long,String) + */ + EQ, + NE, + + /** + * 比较修饰符,修饰日期,数值类型(Integer,Long,Double,BigDecimal) + */ + LT, + LE, + GT, + GE, + + /** + * 修饰List + */ + In, + NotIn, + + /** + * 修饰字符串 + */ + Like, + RightLike, + NotLike, + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/redis/RedisService.java b/cms-framework/src/main/java/com/qs/serve/common/framework/redis/RedisService.java new file mode 100644 index 0000000..afb0f55 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/redis/RedisService.java @@ -0,0 +1,415 @@ +package com.qs.serve.common.framework.redis; + +import com.qs.serve.common.util.Assert; +import lombok.AllArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.core.*; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.stereotype.Service; + +import java.io.Serializable; +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * @author JcYen + * @since 2022/3/4 + */ +@Service +@AllArgsConstructor +public class RedisService { + + private final static ThreadLocal RES_THEME_LOCK = new ThreadLocal<>(); + + public static void setLockTheme(String value){RES_THEME_LOCK.set(value);} + + public static String getLockTheme(){return RES_THEME_LOCK.get();} + + public static void removeThreadLocal(){ + RES_THEME_LOCK.remove(); + } + + @Bean + @Primary + public RedisCacheManager selfCacheManager(RedisTemplate redisTemplate) { + RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory()); + RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())); + return new TtlRedisCacheManager(redisCacheWriter, redisCacheConfiguration); + } + + private RedisTemplate redisTemplate; + + private StringRedisTemplate stringRedisTemplate; + + public long nextId(String key) { + ValueOperations valueOps = redisTemplate.opsForValue(); + // 如果键不存在,则设置初始值为 "0" + if (!redisTemplate.hasKey(key)) { + valueOps.set(key, "0"); + } + // 使用 INCR 命令递增计数器 + return valueOps.increment(key); + } + + /** + * 加锁 + * @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("锁失效"); + } + RedisService.setLockTheme(key); + } + + /** + * 释放锁 + * @param theme + * @param id + * @return 是否在锁 + */ + public void removeResLock(String theme,String id){ + String key = "LOCK_RES:"+theme+":"+id; + this.remove(key); + } + + + /** + * 写入缓存 + * + * @param key + * @param value + * @return + */ + public boolean set(final String key, Object value) { + boolean result = false; + try { + ValueOperations operations = redisTemplate.opsForValue(); + operations.set(key, value); + result = true; + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 写入缓存设置时效时间 + * + * @param key + * @param value + * @return + */ + public boolean set(final String key, Object value, int expireTime) { + return set(key, value, expireTime,TimeUnit.SECONDS); + } + + /** + * 写入缓存设置时效时间 + * + * @param key + * @param value + * @return + */ + public boolean set(final String key, Object value, int expireTime,TimeUnit unit) { + boolean result = false; + try { + ValueOperations operations = redisTemplate.opsForValue(); + operations.set(key, value); + redisTemplate.expire(key, expireTime, unit); + result = true; + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 批量删除对应的value + * + * @param keys + */ + public void remove(final String... keys) { + for (String key : keys) { + remove(key); + } + } + + /** + * 批量删除key + * + * @param pattern + */ + public void removePattern(final String pattern) { + Set keys = redisTemplate.keys(pattern); + if (keys.size() > 0) + redisTemplate.delete(keys); + } + + /** + * 删除对应的value + * + * @param key + */ + public void remove(final String key) { + if (exists(key)) { + redisTemplate.delete(key); + } + } + + /** + * 判断缓存中是否有对应的value + * + * @param text + * @return + */ + public Set list(final String text) { + Set keySet = redisTemplate.keys("*" + text + "*"); + for (String key : keySet) { + System.out.println(key); + } + return keySet; + } + + + /** + * 获取所有数据 + * + * @return + */ + public Set list() { + Set keySet = redisTemplate.keys("*" + "#" +"*"); + for (String key : keySet) { + System.out.println(key); + } + return keySet; + } + + + /** + * 判断缓存中是否有对应的value + * + * @param text + * @return + */ + public void removeForLike(final String text) { + Set keySet = redisTemplate.keys("*" + text + "*"); + Iterator it = keySet.iterator(); + while(it.hasNext()){ + redisTemplate.delete(it.next()); + } + } + + + public Map cleanRedis() { + Map map = new HashMap<>(); + try { + // 获取所有key + Set keys = redisTemplate.keys("*"); + assert keys != null; + // 迭代 + Iterator it1 = keys.iterator(); + while (it1.hasNext()) { + // 循环删除 + stringRedisTemplate.delete(it1.next()); + } + map.put("code", 1); + map.put("msg", "清理全局缓存成功"); + return map; + } catch (Exception e) { + map.put("code", -1); + map.put("msg", "清理全局缓存失败"); + return map; + } + } + + + /** + * 判断缓存中是否有对应的value + * + * @param key + * @return + */ + public boolean exists(final String key) { + return redisTemplate.hasKey(key); + } + + /** + * 读取缓存 + * + * @param key + * @return + */ + public Object get(final String key) { + Object result = null; + ValueOperations operations = redisTemplate.opsForValue(); + result = operations.get(key); + return result; + } + + public String getString(final String key) { + Object result = null; + ValueOperations operations = redisTemplate.opsForValue(); + result = operations.get(key); + if(result!=null){ + return result.toString(); + + } + return null; + } + + public Integer getInteger(final String key) { + String result = getString(key); + if(result!=null){ + return Integer.parseInt(result); + } + return null; + } + + public Long getLong(final String key) { + String result = getString(key); + if(result!=null){ + return Long.parseLong(result); + } + return null; + } + + /** + * 哈希 添加 + * + * @param key + * @param hashKey + * @param value + */ + public void hmSet(String key, Object hashKey, Object value) { + HashOperations hash = redisTemplate.opsForHash(); + hash.put(key, hashKey, value); + } + + /** + * 哈希获取数据 + * + * @param key + * @param hashKey + * @return + */ + public Object hmGet(String key, Object hashKey) { + HashOperations hash = redisTemplate.opsForHash(); + return hash.get(key, hashKey); + } + + /** + * 列表添加 + * + * @param k + * @param v + */ + public void lPush(String k, Object v) { + ListOperations list = redisTemplate.opsForList(); + list.rightPush(k, v); + } + + /** + * 列表获取 + * + * @param k + * @param l + * @param l1 + * @return + */ + public List lRange(String k, long l, long l1) { + ListOperations list = redisTemplate.opsForList(); + return list.range(k, l, l1); + } + + /** + * 集合添加 + * + * @param key + * @param value + */ + public void add(String key, Object value) { + SetOperations set = redisTemplate.opsForSet(); + set.add(key, value); + } + + /** + * 集合获取 + * + * @param key + * @return + */ + public Set setMembers(String key) { + SetOperations set = redisTemplate.opsForSet(); + return set.members(key); + } + + /** + * 有序集合添加 + * + * @param key + * @param value + * @param scoure + */ + public void zAdd(String key, Object value, double scoure) { + ZSetOperations zset = redisTemplate.opsForZSet(); + zset.add(key, value, scoure); + } + + /** + * 有序集合获取 + * + * @param key + * @param scoure + * @param scoure1 + * @return + */ + public Set rangeByScore(String key, double scoure, double scoure1) { + ZSetOperations zset = redisTemplate.opsForZSet(); + return zset.rangeByScore(key, scoure, scoure1); + } + + /** + * 移除业务锁 + * @param code + * @param targetId + */ + public void removeLock(String code,String targetId){ + String key = "lock_commit:"+code+":"+targetId; + this.remove(key); + } + + /** + * 锁 + * @param code + * @param targetId + * @return true--新建锁成功,false反之 + */ + public boolean tryToLock(String code,String targetId){ + String key = "lock_commit:"+code+":"+targetId; + Integer existState = getInteger(key); + if(existState==null){ + this.set(key,1,20,TimeUnit.SECONDS); + return true; + }else { + return false; + } + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/redis/TtlRedisCacheManager.java b/cms-framework/src/main/java/com/qs/serve/common/framework/redis/TtlRedisCacheManager.java new file mode 100644 index 0000000..53ffc9b --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/redis/TtlRedisCacheManager.java @@ -0,0 +1,30 @@ +package com.qs.serve.common.framework.redis; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.cache.RedisCache; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.util.StringUtils; + +import java.time.Duration; + +@Slf4j +public class TtlRedisCacheManager extends RedisCacheManager { + public TtlRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) { + super(cacheWriter, defaultCacheConfiguration); + } + + @Override + protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) { + log.debug("TtlRedisCacheManager keyName:{}",name); + String[] cells = StringUtils.delimitedListToStringArray(name, "="); + name = cells[0]; + if (cells.length > 1) { + long ttl = Long.parseLong(cells[1]); + // 根据传参设置缓存失效时间,默认单位是秒 + cacheConfig = cacheConfig.entryTtl(Duration.ofSeconds(ttl)); + } + return super.createRedisCache(name, cacheConfig); + } +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/security/handler/SecurityAccessDeniedHandler.java b/cms-framework/src/main/java/com/qs/serve/common/framework/security/handler/SecurityAccessDeniedHandler.java new file mode 100644 index 0000000..eae472a --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/security/handler/SecurityAccessDeniedHandler.java @@ -0,0 +1,22 @@ +package com.qs.serve.common.framework.security.handler; + +import com.qs.serve.common.model.HttpResponsePrintUtil; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.access.AccessDeniedHandler; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author YenHex + * @since 2022/3/3 + */ +public class SecurityAccessDeniedHandler implements AccessDeniedHandler { + + @Override + public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { + HttpResponsePrintUtil.print(response,403,"权限不足"); + } +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/security/handler/SecurityAuthenticationFailureHandler.java b/cms-framework/src/main/java/com/qs/serve/common/framework/security/handler/SecurityAuthenticationFailureHandler.java new file mode 100644 index 0000000..fa5cef6 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/security/handler/SecurityAuthenticationFailureHandler.java @@ -0,0 +1,22 @@ +package com.qs.serve.common.framework.security.handler; + +import com.qs.serve.common.model.HttpResponsePrintUtil; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.AuthenticationFailureHandler; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author YenHex + * @since 2022/3/3 + */ +public class SecurityAuthenticationFailureHandler implements AuthenticationFailureHandler { + + @Override + public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException authenticationException) throws IOException, ServletException { + HttpResponsePrintUtil.print(response,401,"登录信息已过期或失效"); + } +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/security/model/LoginUser.java b/cms-framework/src/main/java/com/qs/serve/common/framework/security/model/LoginUser.java new file mode 100644 index 0000000..4744121 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/security/model/LoginUser.java @@ -0,0 +1,97 @@ +package com.qs.serve.common.framework.security.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 用户登录信息 + * @author YenHex + * @since 2022/3/1 + */ +@Data +@AllArgsConstructor +public class LoginUser implements UserDetails { + + private String userId; + + private String nick; + + private String password; + + private String loginIp; + + /** 用户类型 */ + private LoginUserType typeFlag; + + private List authorList; + private List authorIds; + + private String tenant; + + @Override + public Collection getAuthorities() { + if(authorList!=null&&authorList.size()>0){ + return authorList + .stream() + .filter(n->n.length()>0) + .map(auth->new SimpleGrantedAuthority("ROLE_"+auth)) + .collect(Collectors.toList()); + } + return Collections.singletonList(new SimpleGrantedAuthority("NOT_ROLE")); + } + + @Override + public String getPassword() { + return password; + } + + @Override + public String getUsername() { + return userId; + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } + + public LoginUserDTO loginUserDTO(){ + return new LoginUserDTO(userId,nick,password,loginIp,typeFlag.getCode(),authorList,authorIds,tenant); + } + + public boolean verifyRole(String permitCode){ + return authorList.contains(permitCode); + } + + /** + * 是否拥有招生超管权限 + * @return + */ + public boolean hasRegSuperRole(){ + return verifyRole("edu:reg:admin"); + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/security/model/LoginUserDTO.java b/cms-framework/src/main/java/com/qs/serve/common/framework/security/model/LoginUserDTO.java new file mode 100644 index 0000000..2c847ca --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/security/model/LoginUserDTO.java @@ -0,0 +1,37 @@ +package com.qs.serve.common.framework.security.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 用户登录信息 + * @author YenHex + * @since 2022/3/1 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LoginUserDTO { + + private String userId; + + private String nick; + + private String password; + + private String loginIp; + + private String typeFlagCode; + + private List authorList; + private List authorIds; + private String tenant; + + public LoginUser loginUser(){ + return new LoginUser(userId,nick,password,loginIp,LoginUserType.getByCode(typeFlagCode),authorList,authorIds,tenant); + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/security/model/LoginUserType.java b/cms-framework/src/main/java/com/qs/serve/common/framework/security/model/LoginUserType.java new file mode 100644 index 0000000..8538e03 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/security/model/LoginUserType.java @@ -0,0 +1,34 @@ +package com.qs.serve.common.framework.security.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author YenHex + * @since 2022/3/7 + */ +@Getter +@AllArgsConstructor +public enum LoginUserType { + + /** + * 人员分类 + */ + APP_USER("00","微信用户"), + SYS_USER("01","系统人员"), + SYS_SUP_USER("02","超级管理员") + ; + + private String code; + private String name; + + public static LoginUserType getByCode(String code){ + for (LoginUserType value : LoginUserType.values()) { + if(value.getCode().equals(code)){ + return value; + } + } + return null; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/framework/security/util/SecurityPermitUtil.java b/cms-framework/src/main/java/com/qs/serve/common/framework/security/util/SecurityPermitUtil.java new file mode 100644 index 0000000..b03fac8 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/framework/security/util/SecurityPermitUtil.java @@ -0,0 +1,28 @@ +package com.qs.serve.common.framework.security.util; + +/** + * @Author JcYen + * @Date 2021/9/24 + * @Version 1.0 + */ +public class SecurityPermitUtil { + + public static boolean verify(String reg, String input){ + if ("/*".equals(reg)) return true; + String[] reg_split = reg.split("\\*"); + int index = 0, reg_len = reg_split.length; + boolean b = reg.charAt(reg.length() - 1) == '*' ? true : false; + while (input.length() > 0) { + if (index == reg_len) { + if (b) return true; + else return false; + } + String r = reg_split[index++]; + int indexOf = input.indexOf(r); + if (indexOf != 0) return false; + input = input.substring(indexOf + r.length()); + } + return true; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/AmountDTO.java b/cms-framework/src/main/java/com/qs/serve/common/model/AmountDTO.java new file mode 100644 index 0000000..b663b89 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/AmountDTO.java @@ -0,0 +1,18 @@ +package com.qs.serve.common.model; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/7/31 + */ +@Data +public class AmountDTO { + + private String id; + + private BigDecimal amount; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/HttpResponsePrintUtil.java b/cms-framework/src/main/java/com/qs/serve/common/model/HttpResponsePrintUtil.java new file mode 100644 index 0000000..9aa883d --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/HttpResponsePrintUtil.java @@ -0,0 +1,34 @@ +package com.qs.serve.common.model; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author YenHex + * @since 2022/3/30 + */ +public class HttpResponsePrintUtil { + + public static void print(HttpServletResponse response,Integer code ,String msg) throws IOException,SecurityException{ + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS"); + response.setHeader("Access-Control-Max-Age", "86400"); + response.setHeader("Access-Control-Allow-Headers", "*"); + response.setStatus(200); + response.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json;charset=UTF-8"); + response.getWriter().print("{\"status\":"+code+",\"msg\":\""+msg+"\"}"); + response.getWriter().flush(); + } + + public static void print2(HttpServletResponse response,Integer code ,String msg)throws IOException,SecurityException{ + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json;charset=UTF-8"); + response.getWriter().print("{\"status\":"+code+",\"msg\":\""+msg+"\"}"); + response.getWriter().flush(); + } + + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/annotation/BusinessDifference.java b/cms-framework/src/main/java/com/qs/serve/common/model/annotation/BusinessDifference.java new file mode 100644 index 0000000..394d592 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/annotation/BusinessDifference.java @@ -0,0 +1,20 @@ +package com.qs.serve.common.model.annotation; + +import java.lang.annotation.*; + +/** + * @author YenHex + * @since 2023/4/25 + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface BusinessDifference { + + /** + * 字段备注 + * @return + */ + String value() default ""; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/annotation/LimitSubmit.java b/cms-framework/src/main/java/com/qs/serve/common/model/annotation/LimitSubmit.java new file mode 100644 index 0000000..8ec4ce5 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/annotation/LimitSubmit.java @@ -0,0 +1,25 @@ +package com.qs.serve.common.model.annotation; + +import java.lang.annotation.*; + +/** + * 防止表单重复提交 + * @author YenHex + * @since 2022-03-01 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface LimitSubmit { + + /** + * 间隔时间(ms),在世界间隔内超过执行次数,视为被限制 + */ + int interval() default 1000; + + /** + * 提示消息 + */ + String message() default ""; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/annotation/RepeatSubmit.java b/cms-framework/src/main/java/com/qs/serve/common/model/annotation/RepeatSubmit.java new file mode 100644 index 0000000..5bd1eba --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/annotation/RepeatSubmit.java @@ -0,0 +1,20 @@ +package com.qs.serve.common.model.annotation; + +/** + * 防止表单重复提交 + * @author YenHex + * @since 2022-03-01 + */ +public @interface RepeatSubmit { + + /** + * 间隔时间(ms),小于此时间视为重复提交 + */ + int interval() default 5000; + + /** + * 提示消息 + */ + String message() default "不允许重复提交,请稍后再试"; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/annotation/SysLog.java b/cms-framework/src/main/java/com/qs/serve/common/model/annotation/SysLog.java new file mode 100644 index 0000000..cb30b55 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/annotation/SysLog.java @@ -0,0 +1,35 @@ +package com.qs.serve.common.model.annotation; + +import com.qs.serve.common.model.enums.BizType; +import com.qs.serve.common.model.enums.InterType; +import com.qs.serve.common.model.enums.SystemModule; + +import java.lang.annotation.*; + +/** + * 记录用户登录操作 + * @author YenHex + * @since 2022-03-01 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface SysLog { + + SystemModule module() default SystemModule.SYSTEM; + + /** 业务标题 */ + String title() default ""; + + /** 操作描述 */ + String desc() default ""; + + /** 操作类型 */ + BizType biz() default BizType.OTHER; + + /** 接口类型 */ + InterType inter() default InterType.ADMIN; + + boolean saveReqParam() default true; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/chart/BiCommonCounter.java b/cms-framework/src/main/java/com/qs/serve/common/model/chart/BiCommonCounter.java new file mode 100644 index 0000000..3403a26 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/chart/BiCommonCounter.java @@ -0,0 +1,19 @@ +package com.qs.serve.common.model.chart; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/6/7 + */ +@Data +public class BiCommonCounter { + + /** + * 横轴下标的ID + */ + private String label; + + private Long counts; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/chart/BiMonthCounter.java b/cms-framework/src/main/java/com/qs/serve/common/model/chart/BiMonthCounter.java new file mode 100644 index 0000000..ed23bea --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/chart/BiMonthCounter.java @@ -0,0 +1,15 @@ +package com.qs.serve.common.model.chart; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/6/7 + */ +@Data +public class BiMonthCounter { + + private String months; + private Long counts; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/chart/ChartAxisColumn.java b/cms-framework/src/main/java/com/qs/serve/common/model/chart/ChartAxisColumn.java new file mode 100644 index 0000000..3f01cb9 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/chart/ChartAxisColumn.java @@ -0,0 +1,39 @@ +package com.qs.serve.common.model.chart; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author YenHex + * @since 2023/6/7 + */ +@Data +public class ChartAxisColumn { + + /** 列Id */ + String columnId; + + /** 列名 */ + String columnName; + + /** 系列坐标值合计 */ + Double total; + + public static List buildMonthsOfYear(){ + List axisColumnList = new ArrayList<>(); + for (long i = 1; i < 13; i++) { + ChartAxisColumn axisColumn = new ChartAxisColumn(); + if(i>9){ + axisColumn.setColumnId(i+""); + }else { + axisColumn.setColumnId("0"+i); + } + axisColumn.setColumnName(i+"月"); + axisColumnList.add(axisColumn); + } + return axisColumnList; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/chart/ChartDataVo.java b/cms-framework/src/main/java/com/qs/serve/common/model/chart/ChartDataVo.java new file mode 100644 index 0000000..7346a6f --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/chart/ChartDataVo.java @@ -0,0 +1,148 @@ +package com.qs.serve.common.model.chart; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author YenHex + * @since 2023/6/7 + */ +@Data +public class ChartDataVo { + + /** + * 列(饼状图的主要参数) + */ + List axisColumnList; + + /** + * 系列 + */ + List seriesItemList; + + /** + * 分组 + */ + List groupItemList; + + + public void initAxisColumnTotal(){ + for (int i = 0; i < axisColumnList.size(); i++) { + ChartAxisColumn axisColumn = axisColumnList.get(i); + BigDecimal total = BigDecimal.ZERO; + if(seriesItemList!=null&&seriesItemList.size()>0){ + for (ChartSeriesItem seriesItem : seriesItemList) { + double value = seriesItem.getValues().get(i); + total = total.add(new BigDecimal(value+"")); + } + } + axisColumn.setTotal(total.doubleValue()); + } + } + + public static ChartDataVo buildStateChartData(List stateCounterList, Map stateMap){ + ChartDataVo chartDataVo = new ChartDataVo(); + List axisColumnList = new ArrayList<>(); + List seriesItemList = new ArrayList<>(); + List groupItemList = new ArrayList<>(); + ChartGroupItem groupItem = new ChartGroupItem(); + groupItem.setGroupId(100L); + groupItem.setGroupName("默认"); + groupItemList.add(groupItem); + for (String stateNum : stateMap.keySet()) { + String label = stateMap.get(stateNum); + ChartAxisColumn axisColumn = new ChartAxisColumn(); + axisColumn.setColumnId(stateNum); + axisColumn.setColumnName(label); + axisColumnList.add(axisColumn); + } + List values = new ArrayList<>(); + for (ChartAxisColumn chartAxisColumn : axisColumnList) { + Double currVal = 0.0; + for (BiCommonCounter counter : stateCounterList) { + if(chartAxisColumn.getColumnId().equals(counter.getLabel())){ + currVal = counter.getCounts().doubleValue(); + break; + } + } + values.add(currVal); + } + ChartSeriesItem seriesItem = new ChartSeriesItem(); + seriesItem.setGroupId(groupItem.getGroupId()); + seriesItem.setGroupName(groupItem.getGroupName()); + seriesItem.setValues(values); + seriesItemList.add(seriesItem); + //更新total + chartDataVo.setAxisColumnList(axisColumnList); + chartDataVo.setGroupItemList(groupItemList); + chartDataVo.setSeriesItemList(seriesItemList); + chartDataVo.initAxisColumnTotal(); + return chartDataVo; + } + + public void tes(){ + + } + + public void buildStateMap(Map stateMap){ + init(); + for (String stateNum : stateMap.keySet()) { + String label = stateMap.get(stateNum); + ChartAxisColumn axisColumn = new ChartAxisColumn(); + axisColumn.setColumnId(stateNum); + axisColumn.setColumnName(label); + this.axisColumnList.add(axisColumn); + } + } + public void buildStateMapOfMonths(){ + init(); + this.axisColumnList = ChartAxisColumn.buildMonthsOfYear(); + } + + /** + * 先调用buildStateMap + * @param groupId + * @param groupName + * @param stateCounterList + */ + public void addData(Long groupId,String groupName,List stateCounterList){ + ChartGroupItem groupItem = new ChartGroupItem(); + groupItem.setGroupId(groupId); + groupItem.setGroupName(groupName); + groupItemList.add(groupItem); + List values = new ArrayList<>(); + for (ChartAxisColumn chartAxisColumn : axisColumnList) { + Double currVal = 0.0; + for (BiCommonCounter counter : stateCounterList) { + if(chartAxisColumn.getColumnId().equals(counter.getLabel())){ + currVal = counter.getCounts().doubleValue(); + break; + } + } + values.add(currVal); + } + ChartSeriesItem seriesItem = new ChartSeriesItem(); + seriesItem.setGroupId(groupItem.getGroupId()); + seriesItem.setGroupName(groupItem.getGroupName()); + seriesItem.setValues(values); + seriesItemList.add(seriesItem); + this.initAxisColumnTotal(); + } + + private void init(){ + if(axisColumnList==null){ + axisColumnList = new ArrayList<>(); + } + if(seriesItemList==null){ + seriesItemList = new ArrayList<>(); + } + if(groupItemList==null){ + groupItemList = new ArrayList<>(); + } + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/chart/ChartGroupItem.java b/cms-framework/src/main/java/com/qs/serve/common/model/chart/ChartGroupItem.java new file mode 100644 index 0000000..6dc51d2 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/chart/ChartGroupItem.java @@ -0,0 +1,18 @@ +package com.qs.serve.common.model.chart; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/6/7 + */ +@Data +public class ChartGroupItem { + + /** 组id */ + private Long groupId; + + /** 组名 */ + private String groupName; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/chart/ChartSeriesItem.java b/cms-framework/src/main/java/com/qs/serve/common/model/chart/ChartSeriesItem.java new file mode 100644 index 0000000..0e5e99e --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/chart/ChartSeriesItem.java @@ -0,0 +1,26 @@ +package com.qs.serve.common.model.chart; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/6/7 + */ +@Data +public class ChartSeriesItem { + + + /** 组id */ + Long groupId; + + /** 组名 */ + String groupName; + + /** + * 值列表(列对应axisColumns) + */ + List values; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/chart/PrintChart.java b/cms-framework/src/main/java/com/qs/serve/common/model/chart/PrintChart.java new file mode 100644 index 0000000..846aed1 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/chart/PrintChart.java @@ -0,0 +1,75 @@ +package com.qs.serve.common.model.chart; + +import com.qs.serve.common.util.JsonUtil; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +/** + * @author YenHex + * @since 2023/2/17 + */ +public class PrintChart { + + + public static void main(String[] args) { + + //eg. 统计最近5年入学人数,并区分男女数量 + ChartDataVo chartDataVo = new ChartDataVo(); + + List axisColumnList = new ArrayList<>(); + List seriesItemList = new ArrayList<>(); + List groupItemList = new ArrayList<>(); + + ChartGroupItem groupItem = new ChartGroupItem(); + groupItem.setGroupId(100L); + groupItem.setGroupName("男学生"); + groupItemList.add(groupItem); + + ChartGroupItem groupItem2 = new ChartGroupItem(); + groupItem2.setGroupId(200L); + groupItem2.setGroupName("女学生"); + groupItemList.add(groupItem2); + + for (long i = 1; i <= 5; i++) { + ChartAxisColumn axisColumn = new ChartAxisColumn(); + axisColumn.setColumnId(i+""); + axisColumn.setColumnName("202"+i+"年"); + axisColumnList.add(axisColumn); + } + + Random random = new Random(); + for (ChartGroupItem chartGroupItem : groupItemList) { + ChartSeriesItem seriesItem = new ChartSeriesItem(); + seriesItem.setGroupId(chartGroupItem.getGroupId()); + seriesItem.setGroupName(chartGroupItem.getGroupName()); + List values = new ArrayList<>(); + for (int i = 0; i < axisColumnList.size(); i++) { + double result = random.nextInt(1000)+3000; + values.add(result); + } + seriesItem.setValues(values); + seriesItemList.add(seriesItem); + } + //更新total + for (int i = 0; i < axisColumnList.size(); i++) { + ChartAxisColumn axisColumn = axisColumnList.get(i); + BigDecimal total = BigDecimal.ZERO; + for (ChartSeriesItem seriesItem : seriesItemList) { + double value = seriesItem.getValues().get(i); + total = total.add(new BigDecimal(value+"")); + } + axisColumn.setTotal(total.doubleValue()); + } + chartDataVo.setAxisColumnList(axisColumnList); + chartDataVo.setGroupItemList(groupItemList); + chartDataVo.setSeriesItemList(seriesItemList); + String v = JsonUtil.objectToJson(chartDataVo); + System.out.println(v); + } + + + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/consts/ApplyTypeConst.java b/cms-framework/src/main/java/com/qs/serve/common/model/consts/ApplyTypeConst.java new file mode 100644 index 0000000..9a4a958 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/consts/ApplyTypeConst.java @@ -0,0 +1,13 @@ +package com.qs.serve.common.model.consts; + +/** + * @author YenHex + * @since 2023/9/19 + */ +public interface ApplyTypeConst { + + String CostBill = "CostBill"; + String CheckCost = "CheckCost"; + String ReleasePolicy = "ReleasePolicy"; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/consts/BudgetLogRollbackFlag.java b/cms-framework/src/main/java/com/qs/serve/common/model/consts/BudgetLogRollbackFlag.java new file mode 100644 index 0000000..4d5772c --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/consts/BudgetLogRollbackFlag.java @@ -0,0 +1,21 @@ +package com.qs.serve.common.model.consts; + +/** + * @author YenHex + * @since 2023/1/30 + */ +public interface BudgetLogRollbackFlag { + + /** 正常(标记为最新记录) */ + Integer State_0 = 0; + + /** 回退 */ + Integer State_1 = 1; + + /** 回退已处理 */ + Integer State_2 = 2; + + /** 删除已处理 */ + Integer State_3 = 3; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/consts/DSName.java b/cms-framework/src/main/java/com/qs/serve/common/model/consts/DSName.java new file mode 100644 index 0000000..bd74fcd --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/consts/DSName.java @@ -0,0 +1,11 @@ +package com.qs.serve.common.model.consts; + +/** + * @author YenHex + * @since 2024/3/20 + */ +public interface DSName { + + String QiSheng = "qisheng"; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/consts/DateConst.java b/cms-framework/src/main/java/com/qs/serve/common/model/consts/DateConst.java new file mode 100644 index 0000000..6cf1d01 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/consts/DateConst.java @@ -0,0 +1,10 @@ +package com.qs.serve.common.model.consts; + +/** + * @author YenHex + * @since 2022/2/24 + */ +public class DateConst { + + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/consts/GySysConst.java b/cms-framework/src/main/java/com/qs/serve/common/model/consts/GySysConst.java new file mode 100644 index 0000000..23f36f3 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/consts/GySysConst.java @@ -0,0 +1,41 @@ +package com.qs.serve.common.model.consts; + +/** + * 系统字段 + * @author YenHex + * @since 2022/2/24 + */ +public class GySysConst { + + /** 后台身份验证 */ + public static final String AUTHORIZATION_PROP = "Authorization"; + + /** API身份验证 */ + public static final String APP_TOKEN_PROP = "token"; + + /** 请求头参数 */ + public static final String USER_AGENT_PROP = "User-Agent"; + + public static final String TENANT_PROP = "tenant-id"; + public static final String SUPPLIER_PROP = "supplierId"; + + /** 系统租户数据库列 */ + public static final String TENANT_COLUMN = "tenant_id"; + + /** 第三方应用id。如:公众号 */ + public static final String APP_ID_PROP = "appid"; + + /** 通用参数 */ + public static final int STATUS_YES_1 = 1; + public static final int STATUS_NO_1 = 0; + + public static final String LANG_ZH_CN = "zh_CN"; + + + public static final String ROLE_ADMIN_OPT_LOG = "sys:operationLog:admin"; + public static final String ROLE_ADMIN_REG = "edu:reg:admin"; + + public static final String DEFAULT_PASSWORD = "12345678"; + + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/consts/OssConst.java b/cms-framework/src/main/java/com/qs/serve/common/model/consts/OssConst.java new file mode 100644 index 0000000..6a8b2d2 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/consts/OssConst.java @@ -0,0 +1,32 @@ +package com.qs.serve.common.model.consts; + +/** + * @author YenHex + * @since 2022/5/10 + */ +public class OssConst { + + /** + * 访问类型 + */ + public static final String ACCESS_OWNER = "own"; + public static final String ACCESS_DEPT = "dept"; + + /** + * 文件夹前缀 + */ + public static final String OWNER_DIR = "owner/"; + public static final String DEPT_DIR = "dept/"; + public static final String SPLIT = "/"; + + /** + * Tag + */ + public static final String TAG_CREATOR = "creator"; + public static final String TAG_CREATE_BY = "create_by"; + + public static final String FILE_TYPE_DIR = "文件夹"; + + public static final String DIR_TYPE_UNKNOWN = "未知"; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/consts/RedisCacheKeys.java b/cms-framework/src/main/java/com/qs/serve/common/model/consts/RedisCacheKeys.java new file mode 100644 index 0000000..de9ac61 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/consts/RedisCacheKeys.java @@ -0,0 +1,33 @@ +package com.qs.serve.common.model.consts; + +/** + * @author YenHex + * @since 2022/3/1 + */ +public class RedisCacheKeys { + + public final static String SUPPLIER_RELATE_TREE = "supplier_relate_tree"; + + /** 租户列表 */ + public final static String Tenant_ALL_LIST = "expire_tenant_list"; + + + + /** 用户登录APP {}客户端 {}用户ID */ + public final static String LOGIN_KEY_APP = "login_app_{}:{}:"; + + /** 微信用户ID */ + public final static String WX_KEY_USER = "wx_usr_id:{}:"; + + /** 手机号验证吗 */ + public final static String PHONE_KEY = "phone_code_:"; + + /** + * 0-无需操作 + * 1-未处理 + * 2-同步中 + * 3-同步完成,但未更新表 + */ + public final static String HIS_UPDATE = "update_his_flag:"; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/consts/RedisListenerKeys.java b/cms-framework/src/main/java/com/qs/serve/common/model/consts/RedisListenerKeys.java new file mode 100644 index 0000000..26b244d --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/consts/RedisListenerKeys.java @@ -0,0 +1,12 @@ +package com.qs.serve.common.model.consts; + +/** + * @author YenHex + * @since 2022/3/1 + */ +public class RedisListenerKeys { + + public final static String EXPIRED_TYPE = "__keyevent@*__:expired"; + + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/consts/ResultFlag.java b/cms-framework/src/main/java/com/qs/serve/common/model/consts/ResultFlag.java new file mode 100644 index 0000000..2641b44 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/consts/ResultFlag.java @@ -0,0 +1,12 @@ +package com.qs.serve.common.model.consts; + +/** + * @author YenHex + * @since 2023/2/15 + */ +public interface ResultFlag { + + int OK = 1; + int NOT = 0; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/consts/SysConfigKey.java b/cms-framework/src/main/java/com/qs/serve/common/model/consts/SysConfigKey.java new file mode 100644 index 0000000..4999b38 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/consts/SysConfigKey.java @@ -0,0 +1,19 @@ +package com.qs.serve.common.model.consts; + +/** + * 系统配置 + * @author YenHex + * @since 2022/11/12 + */ +public interface SysConfigKey { + + /** 费用超支 */ + String TbsBudgetOverspend = "TbsBudgetOverspend"; + + /** 活动预计核销日期 */ + String ActivityPreCheckDays = "ActivityPreCheckDays"; + + String DateCheckApplyExcelYear = "DateCheckApplyExcelYear"; + + String PolicyDelayDays = "PolicyDelayDays"; +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/dto/CommonIdsParam.java b/cms-framework/src/main/java/com/qs/serve/common/model/dto/CommonIdsParam.java new file mode 100644 index 0000000..ba8c866 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/dto/CommonIdsParam.java @@ -0,0 +1,16 @@ +package com.qs.serve.common.model.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/6/11 + */ +@Data +public class CommonIdsParam { + + private List ids; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/dto/DateSplitDTO.java b/cms-framework/src/main/java/com/qs/serve/common/model/dto/DateSplitDTO.java new file mode 100644 index 0000000..f63a795 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/dto/DateSplitDTO.java @@ -0,0 +1,28 @@ +package com.qs.serve.common.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; + +/** + * @author YenHex + * @since 2023/6/5 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DateSplitDTO { + + Integer days; + + LocalDate startDate; + + LocalDate endDate; + + Integer yearMonth; + + Integer sort; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/dto/DiffFieldVal.java b/cms-framework/src/main/java/com/qs/serve/common/model/dto/DiffFieldVal.java new file mode 100644 index 0000000..021bf12 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/dto/DiffFieldVal.java @@ -0,0 +1,17 @@ +package com.qs.serve.common.model.dto; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/4/25 + */ +@Data +public class DiffFieldVal { + + String field; + String comment; + String orgValue; + String newValue; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/dto/HeaderOption.java b/cms-framework/src/main/java/com/qs/serve/common/model/dto/HeaderOption.java new file mode 100644 index 0000000..cd5dd12 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/dto/HeaderOption.java @@ -0,0 +1,26 @@ +package com.qs.serve.common.model.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/5/17 + */ +@Data +public class HeaderOption { + + private String name; +// private String width; +// private String prefix; +// private String suffix; + private Boolean isSum; + private Integer decimalLength; + private String align; + private List children; + + public HeaderOption(String name){ + this.name = name; + } +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/dto/PageVo.java b/cms-framework/src/main/java/com/qs/serve/common/model/dto/PageVo.java new file mode 100644 index 0000000..c06af13 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/dto/PageVo.java @@ -0,0 +1,56 @@ +package com.qs.serve.common.model.dto; + +import com.qs.serve.common.util.PageUtil; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class PageVo{ + + /** + * 页幅 + */ + private Integer pageSize; + + /** + * 页眉 + */ + private Integer pageNum; + + /** + * 总数据数 + */ + private Long total; + + /** + * 总页数 + */ + private Long totalPage; + + /** + * 数据列表 + */ + private List list; + + public void initPageByTotal(long total){ + this.total = total; + this.pageNum = PageUtil.getPageNum(); + this.pageSize = PageUtil.getPageSize(); + if(pageSize==null||pageSize==0){ return; } + this.totalPage = total%pageSize==0?total/pageSize:(total/pageSize+1); + } + + public static PageVo initNewList(PageVo oldVo,List list){ + PageVo newVo = new PageVo<>(); + newVo.setPageNum(oldVo.getPageNum()); + newVo.setPageSize(oldVo.getPageSize()); + newVo.setTotal(oldVo.getTotal()); + newVo.setTotalPage(oldVo.getTotalPage()); + newVo.setList(list); + return newVo; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/dto/R.java b/cms-framework/src/main/java/com/qs/serve/common/model/dto/R.java new file mode 100644 index 0000000..bf6f27b --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/dto/R.java @@ -0,0 +1,223 @@ +package com.qs.serve.common.model.dto; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.pagehelper.PageInfo; +import com.qs.serve.common.util.PageUtil; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.List; + +/** + * 统一返回封装 + * 1.替代旧版的ViewResult + * 2.支持SmartDoc + * @author JcYen + * @date 2021/4/22 + * @version 2.0 + */ +@Getter +@Setter +public class R implements Serializable { + + public R(int status, String msg) { + this.status = status; + this.msg = msg; + } + + public R(int status, String msg, T data) { + this.status = status; + this.msg = msg; + this.data = data; + } + + /** + * 状态码 + */ + private Integer status; + + /** + * 信息 + */ + private String msg; + + /** + * 数据 + */ + private T data; + + public static final int SUCCESS_STATUS = 200; + public static final int IMPORT_ERROR = 201; + public static final int LOGOUT_STATUS = 401; + public static final int FORBIDDEN_STATUS = 403; + public static final int NOT_FOUND_STATUS = 434; + public static final int FAILED_STATUS = 500; + + public static final String SUCCESS_TIPS = "操作成功"; + public static final String FAILED_TIPS = "操作失败"; + public static final String FAILED_TIPS_2 = "业务操作失败"; + public static final String LOGOUT_TIPS = "登录无效"; + public static final String FORBIDDEN_TIPS = "无权限访问"; + public static final String NOT_FOUND_TIPS = "数据不存在或被移除"; + + public static R ok() { + return new R(SUCCESS_STATUS,SUCCESS_TIPS,null); + } + + public static R ok(String msg) { + return new R<>(SUCCESS_STATUS,msg,null); + } + + public static R ok(TYPE data) { + return new R<>(SUCCESS_STATUS,SUCCESS_TIPS,data); + } + + public static R ok(TYPE data,String message) { + return new R<>(SUCCESS_STATUS,message,data); + } + + public static R isTrue(Boolean bool){ + if(bool==null|| !bool){ + return error(); + } + return ok(); + } + + public static R isTrue(Boolean bool, String message){ + if(bool==null|| !bool){ + return error(message); + } + return ok(null,message); + } + + + public static R isNotNull(TYPE object){ + if(object==null){ + return error(); + } + return ok(object,SUCCESS_TIPS); + } + + public static R isOk(Boolean rs){ + if(rs==null){ + return error(); + } + return ok(); + } + + public static R isOk(Boolean rs,String errMsg){ + if(rs==null){ + return error(errMsg); + } + return ok(); + } + + public static R error(String message) { + return new R<>(FAILED_STATUS,message,null); + } + + public static R errorImport(Object data) { + return new R<>(IMPORT_ERROR,"导入异常",data); + } + + public static R error(String message,TYPE data) { + return new R<>(FAILED_STATUS,FAILED_TIPS,data); + } + + + + public static R error() { + return new R<>(FAILED_STATUS,FAILED_TIPS,null); + } + public static R errorNotFound() { + return new R<>(FAILED_STATUS,NOT_FOUND_TIPS,null); + } + public static R error2() { + return new R<>(FAILED_STATUS,FAILED_TIPS_2,null); + } + + public static R> byMbpList(IPage page){ + PageVo pageVo = new PageVo<>(); + pageVo.initPageByTotal(page.getTotal()); + pageVo.setList(page.getRecords()); + return R.ok(pageVo); + } + + public static R> byMbpList(IPage page,List data){ + PageVo pageVo = new PageVo<>(); + pageVo.initPageByTotal(page.getTotal()); + pageVo.setList(data); + return R.ok(pageVo); + } + + public static R> byPageHelperList(List data){ + return R.ok(buildPageHelperList(data)); + } + + public static PageVo buildPageHelperList(List data){ + PageVo pageVo = new PageVo<>(); + PageInfo pageInfo = new PageInfo<>(data); + pageVo.setPageSize(pageInfo.getPageSize()); + pageVo.setPageNum(pageInfo.getPageNum()); + pageVo.setTotal(pageInfo.getTotal()); + pageVo.setList(data); + pageVo.setTotalPage(new Long(pageInfo.getPages())); + return pageVo; + } + + public static PageVo buildPageHelperList(List sources,List details){ + PageVo pageVo = new PageVo<>(); + PageInfo pageInfo = new PageInfo<>(sources); + pageVo.setPageSize(pageInfo.getPageSize()); + pageVo.setPageNum(pageInfo.getPageNum()); + pageVo.setTotal(pageInfo.getTotal()); + pageVo.setList(details); + pageVo.setTotalPage(new Long(pageInfo.getPages())); + return pageVo; + } + + public static R> byEmptyList(){ + PageVo pageVo = new PageVo<>(); + pageVo.setPageSize(PageUtil.getPageSize()); + pageVo.setPageNum(PageUtil.getPageNum()); + pageVo.setTotal(0L); + pageVo.setList(null); + pageVo.setTotalPage(0L); + return R.ok(pageVo); + } + + public static R> byPageHelperList(List sources,List details){ + PageVo pageVo = new PageVo<>(); + PageInfo pageInfo = new PageInfo<>(sources); + pageVo.setPageSize(pageInfo.getPageSize()); + pageVo.setPageNum(pageInfo.getPageNum()); + pageVo.setTotal(pageInfo.getTotal()); + pageVo.setList(details); + pageVo.setTotalPage(new Long(pageInfo.getPages())); + return R.ok(pageVo); + } + + public static R> byPageList(Integer pageNum,Integer pageSize,Long total,List data){ + PageVo pageVo = new PageVo<>(); + pageVo.setPageSize(pageSize); + pageVo.setPageNum(pageNum); + pageVo.setTotal(total); + pageVo.setList(data); + pageVo.setTotalPage(total%pageSize==0?total/pageSize:total/pageSize+1); + return R.ok(pageVo); + } + + public static R> byPageList(Long total,List data){ + Integer pageNum = PageUtil.getPageNum(); + Integer pageSize = PageUtil.getPageSize(); + PageVo pageVo = new PageVo<>(); + pageVo.setPageSize(pageSize); + pageVo.setPageNum(pageNum); + pageVo.setTotal(total); + pageVo.setList(data); + pageVo.setTotalPage(total%pageSize==0?total/pageSize:total/pageSize+1); + return R.ok(pageVo); + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/dto/RowParam.java b/cms-framework/src/main/java/com/qs/serve/common/model/dto/RowParam.java new file mode 100644 index 0000000..a7c491b --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/dto/RowParam.java @@ -0,0 +1,26 @@ +package com.qs.serve.common.model.dto; + +import com.qs.serve.common.util.PageUtil; +import lombok.Data; + +/** + * @author YenHex + * @since 2023/5/17 + */ +@Data +public class RowParam { + + private Integer startIndex; + private Integer size; + + public RowParam(Integer startIndex, Integer size) { + this.startIndex = startIndex; + this.size = size; + } + + public RowParam(boolean pageable) { + this.size = PageUtil.getPageSize(); + this.startIndex = (PageUtil.getPageNum()-1)*size; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/dto/SimpleCountValue.java b/cms-framework/src/main/java/com/qs/serve/common/model/dto/SimpleCountValue.java new file mode 100644 index 0000000..ac9edc2 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/dto/SimpleCountValue.java @@ -0,0 +1,16 @@ +package com.qs.serve.common.model.dto; + +import lombok.Data; + +/** + * @author YenHex + * @since 2024/8/29 + */ +@Data +public class SimpleCountValue { + + String id; + + Long count; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/dto/SimpleKeyValue.java b/cms-framework/src/main/java/com/qs/serve/common/model/dto/SimpleKeyValue.java new file mode 100644 index 0000000..058cb32 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/dto/SimpleKeyValue.java @@ -0,0 +1,48 @@ +package com.qs.serve.common.model.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.List; + +/** + * @author YenHex + * @since 2022/3/7 + */ +@Data +@NotNull +@NoArgsConstructor +public class SimpleKeyValue { + + /** 键 */ + private String label; + + /** 值 */ + private T value; + + private String value2; + + private String parentId; + + /** 说明 */ + private String remark; + + private List> childList = new ArrayList<>(); + + public SimpleKeyValue(String label,T value,String remark){ + this.label = label; + this.value = value; + this.remark = remark; + } + public SimpleKeyValue(String label,T value){ + this.label = label; + this.value = value; + } + + public void addChild(SimpleKeyValue value){ + childList.add(value); + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/dto/TargetDTO.java b/cms-framework/src/main/java/com/qs/serve/common/model/dto/TargetDTO.java new file mode 100644 index 0000000..b4821cb --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/dto/TargetDTO.java @@ -0,0 +1,29 @@ +package com.qs.serve.common.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * @author YenHex + * @since 2023/4/7 + */ +@Data +@AllArgsConstructor +public class TargetDTO { + String targetId; + String targetCode; + String targetName; + + public TargetDTO(String targetId, String targetCode, String targetName) { + this.targetId = targetId; + this.targetCode = targetCode; + this.targetName = targetName; + } + + //拜访相关业务 + String localX; + String localY; + String address; + String mapAddress; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/dto/TargetObjectDTO.java b/cms-framework/src/main/java/com/qs/serve/common/model/dto/TargetObjectDTO.java new file mode 100644 index 0000000..f429482 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/dto/TargetObjectDTO.java @@ -0,0 +1,18 @@ +package com.qs.serve.common.model.dto; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/4/7 + */ +@Data +public class TargetObjectDTO { + + String targetType; + String targetId; + + String targetCode; + String targetName; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/dto/TreeNode.java b/cms-framework/src/main/java/com/qs/serve/common/model/dto/TreeNode.java new file mode 100644 index 0000000..cb4f4cc --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/dto/TreeNode.java @@ -0,0 +1,31 @@ +package com.qs.serve.common.model.dto; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * 树节点 + * @author YenHex + * @since 2022/3/1 + */ +@Data +public class TreeNode { + protected String id; + protected String parentId; + protected Integer nodeLevel; + protected Integer sort; + protected List children = new ArrayList<>(); + + public void addChildren(TreeNode treeNode) { + children.add(treeNode); + } + + public List getChildren() { + if(children==null||children.size()<=0){ + return null; + } + return children; + } +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/enums/BizType.java b/cms-framework/src/main/java/com/qs/serve/common/model/enums/BizType.java new file mode 100644 index 0000000..deb1dda --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/enums/BizType.java @@ -0,0 +1,53 @@ +package com.qs.serve.common.model.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author YenHex + * @since 2022/3/8 + */ +@Getter +@AllArgsConstructor +public enum BizType { + + /** 其它 */ + OTHER("其它"), + + /** 新增 */ + INSERT("新增"), + + /** 修改 */ + UPDATE("修改"), + + /** 删除 */ + DELETE("删除"), + + /** 授权 */ + GRANT("授权"), + + /** 强退 */ + FORCE("强退"), + + /** 清空数据 */ + CLEAN("清空"), + + /** 登录 */ + LOGIN("登录"), + + LOGOUT("登出"), + + UPLOAD("上传"), + + DOWNLOAD("下载"), + + QUERY("查询"), + + LEAVE("离职"), + EXPORT("导出"), + SUBMIT("提交"), + + RESET("重置"); + + String value; +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/enums/BudgetLogOptFlag.java b/cms-framework/src/main/java/com/qs/serve/common/model/enums/BudgetLogOptFlag.java new file mode 100644 index 0000000..8360b9c --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/enums/BudgetLogOptFlag.java @@ -0,0 +1,90 @@ +package com.qs.serve.common.model.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.List; + +/** + * @author YenHex + * @since 2023/1/30 + */ +@Getter +@AllArgsConstructor +public enum BudgetLogOptFlag { + + /** 0-预算新增 */ + State_0(0,true), + + /** 1-费用申请(费用申请,预算调减) */ + State_1(1,false), + + /** 2-预算调增 */ + State_2(2,true), + + /** 3-预算调减 */ + State_3(3,false), + + /** 4-费用释放(预算调增) */ + State_4(4,true), + + /** 5-费用申请调增(费用申请,预算调增) */ + State_5(5,true), + + /** 6-费用申请调减(费用申请,预算调减) */ + State_6(6,false), + + /** 已取消 7-销售区域迁移调增 */ + State_7(7,false), + + /** 已取消 8-销售区域迁移调减 */ + State_8(8,false), + + /** 已取消 9-行政区域迁移调增 */ + State_9(9,false), + + /** 已取消 10-行政区域迁移调减 */ + State_10(10,false), + + /** 11-政策申请 */ + State_11(11,false), + + /** 12-政策申请调增(政策申请,预算调增) */ + State_12(12,true), + + /** 13-政策因费用申请调增(政策申请,预算转移) */ + State_13(13,true), + + /** 14-政策申请释放(被拒绝后,政策释放) */ + State_14(14,true), + + /** 15-费用申请释放(被拒绝后,预算增加) */ + State_15(15,true), + + /** 16-政策释放(释放操作,预算增加) */ + State_16(16,true); + + /** + * 编码 + */ + private Integer code; + + /** + * 是否取反,添加预算 + */ + private boolean addBudget; + + private final static List finalBudgetOptFlag = Arrays.asList(0, 2, 3); + + public final static List finalCostOptFlag = Arrays.asList(1,4,5,6); + + public final static List finalPolicyOptFlag = Arrays.asList(11,12,13,14,15); + + /** + * 预算规划,状态0,2,3,新增、调增、调减 + */ + public static List getFinalBudgetOptFlag(){ + return finalBudgetOptFlag; + } +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/enums/ExcelFilePath.java b/cms-framework/src/main/java/com/qs/serve/common/model/enums/ExcelFilePath.java new file mode 100644 index 0000000..982e41f --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/enums/ExcelFilePath.java @@ -0,0 +1,19 @@ +package com.qs.serve.common.model.enums; + +import lombok.AllArgsConstructor; + +/** + * @author YenHex + * @since 2022/3/10 + */ +@AllArgsConstructor +public enum ExcelFilePath { + + /** 地址 */ + EDU_REG_ARCHIVE_IN("1000",""); + + String code; + + String path; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/enums/HttpCode.java b/cms-framework/src/main/java/com/qs/serve/common/model/enums/HttpCode.java new file mode 100644 index 0000000..18c2e61 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/enums/HttpCode.java @@ -0,0 +1,44 @@ +package com.qs.serve.common.model.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 请求状态码 + * @author YenHex + * @since 2022/2/28 + */ +@Getter +@AllArgsConstructor +public enum HttpCode { + + /** 基本参数 */ + SUCCESS(200,"操作成功"), + ERROR(500,"操作失败"), + DEV_ERR(500,"部分功能开发中..."), + WX_ERR(500,"微信服务调用异常"), + + LOGIN_ERR(401,"登录信息已过期或失效"), + LOGIN_ERR_2(500,"该账号已被停用,请联系系统管理员"), + LOGIN_ERR_1(500,"账号或登录密码不正确"), + LOGIN_ERR_4001(4001,"商户信息错误"), + LOGIN_ERR_4002(4002,"应用信息错误"), + + + /** 资源权限相关 */ + FORBIDDEN_403(403,"权限不足,无法访问"), + FORBIDDEN_403_1(403,"账套未注册,无权访问"), + FORBIDDEN_403_2(403,"客户端未注册,无权访问"), + FORBIDDEN_403_3(403,"IP地址未注册,无权访问"), + FORBIDDEN_403_4(403,"无招生超管权限,无权访问"), + FORBIDDEN_404(404,"资源不存在或被移除"), + FORBIDDEN_406(406,"系统正常处理,请勿重复提交"), + + + ERROR_EDU_SCHOOL_YEAR(5031,"当前学年信息错误,请重新设置当前学年"), + ; + + Integer code; + String msg; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/enums/InterType.java b/cms-framework/src/main/java/com/qs/serve/common/model/enums/InterType.java new file mode 100644 index 0000000..daf5495 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/enums/InterType.java @@ -0,0 +1,21 @@ +package com.qs.serve.common.model.enums; + +/** + * @author YenHex + * @since 2022/3/8 + */ +public enum InterType { + + /** + * 前台接口 + */ + API, + + + + /** + * 后台接口 + */ + ADMIN + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/enums/MonthValues.java b/cms-framework/src/main/java/com/qs/serve/common/model/enums/MonthValues.java new file mode 100644 index 0000000..22ac159 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/enums/MonthValues.java @@ -0,0 +1,40 @@ +package com.qs.serve.common.model.enums; + +/** + * @author YenHex + * @since 2023/9/13 + */ +public class MonthValues { + + public static final int[] Q1 = {1,2,3}; + public static final int[] Q2 = {4,5,6}; + public static final int[] Q3 = {7,8,9}; + public static final int[] Q4 = {10,11,12}; + + + + public static int[] getQArr(Integer val){ + for (int i = 0; i < Q1.length; i++) { + if(val==Q1[i]){ + return Q1; + } + } + for (int i = 0; i < Q2.length; i++) { + if(val==Q2[i]){ + return Q2; + } + } + for (int i = 0; i < Q3.length; i++) { + if(val==Q3[i]){ + return Q3; + } + } + for (int i = 0; i < Q4.length; i++) { + if(val==Q4[i]){ + return Q4; + } + } + return null; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/enums/PolicyType.java b/cms-framework/src/main/java/com/qs/serve/common/model/enums/PolicyType.java new file mode 100644 index 0000000..d1a26a9 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/enums/PolicyType.java @@ -0,0 +1,35 @@ +package com.qs.serve.common.model.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * minio策略配置 + * @author YenHex + * @since 2022/5/10 + */ +@Getter +@AllArgsConstructor +public enum PolicyType { + + /** + * 只读 + */ + READ("read-only"), + + /** + * 只写 + */ + WRITE("write-only"), + + /** + * 读写 + */ + READ_WRITE("read-write"); + + /** + * 类型 + */ + private final String type; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/enums/SystemModule.java b/cms-framework/src/main/java/com/qs/serve/common/model/enums/SystemModule.java new file mode 100644 index 0000000..a348f1e --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/enums/SystemModule.java @@ -0,0 +1,34 @@ +package com.qs.serve.common.model.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author YenHex + * @since 2022/7/25 + */ +@Getter +@AllArgsConstructor +public enum SystemModule { + + QUESTION("qms","问卷"), + BAZ("baz","拜访"), + Policy("tzc","政策"), + Payment("pay","支付"), + Budget("budget","预算"), + Verification("verification","核算"), + BIZ("biz","业务"), + BASE("bms","基础档案"), + GOODS("goods","商品"), + SYSTEM("sys","系统"), + UMS("ums","手机用户"), + DATA("data","数据"), + Excel("excel","excel数据"), + Tag("tag","标签"), + SALE("sale","销售"); + + String code; + + String vale; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/group/EditGroup.java b/cms-framework/src/main/java/com/qs/serve/common/model/group/EditGroup.java new file mode 100644 index 0000000..e2fab74 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/group/EditGroup.java @@ -0,0 +1,8 @@ +package com.qs.serve.common.model.group; + +/** + * @author YenHex + * @since 2022/5/16 + */ +public interface EditGroup { +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/group/SaveGroup.java b/cms-framework/src/main/java/com/qs/serve/common/model/group/SaveGroup.java new file mode 100644 index 0000000..e83376a --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/group/SaveGroup.java @@ -0,0 +1,8 @@ +package com.qs.serve.common.model.group; + +/** + * @author YenHex + * @since 2022/5/16 + */ +public interface SaveGroup { +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/group/SearchGroup.java b/cms-framework/src/main/java/com/qs/serve/common/model/group/SearchGroup.java new file mode 100644 index 0000000..2ddbdd2 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/group/SearchGroup.java @@ -0,0 +1,8 @@ +package com.qs.serve.common.model.group; + +/** + * @author YenHex + * @since 2022/5/16 + */ +public interface SearchGroup { +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/oa/OaFormMainProcess.java b/cms-framework/src/main/java/com/qs/serve/common/model/oa/OaFormMainProcess.java new file mode 100644 index 0000000..7902459 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/oa/OaFormMainProcess.java @@ -0,0 +1,42 @@ +package com.qs.serve.common.model.oa; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/1/12 + */ +@Data +public class OaFormMainProcess { + + private String targetId; + + /** + * 上次文件 + */ + private List uploadFiles; + + /** + * data + */ + private Object data; + + /** + * 员工号 + */ + private String senderLoginName; + + /** + * 模板编码 + */ + private String templateCode; + + private String userId; + + /** + * 模板编码 + */ + private String tableName; +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/model/oa/OaUploadFile.java b/cms-framework/src/main/java/com/qs/serve/common/model/oa/OaUploadFile.java new file mode 100644 index 0000000..0c13908 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/model/oa/OaUploadFile.java @@ -0,0 +1,27 @@ +package com.qs.serve.common.model.oa; + +import lombok.Data; + +/** + * @author YenHex + * @since 2024/1/12 + */ +@Data +public class OaUploadFile { + + /** + * 表单控件名称 + */ + private String field; + + /** + * 附件文件名 + */ + private String name; + + /** + * 附件url + */ + private String url; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/Assert.java b/cms-framework/src/main/java/com/qs/serve/common/util/Assert.java new file mode 100644 index 0000000..d1f440b --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/Assert.java @@ -0,0 +1,28 @@ +package com.qs.serve.common.util; + + +import com.qs.serve.common.framework.exception.BusinessException; +import com.qs.serve.common.model.enums.HttpCode; +import lombok.experimental.UtilityClass; + +/** + * 抛出异常工具类 + * @author YenHex + * @since 2022/2/25 + */ +@UtilityClass +public class Assert { + + public static void throwEx(Integer code,String msg){ + throw new BusinessException(msg, code); + } + + public static void throwEx(HttpCode httpCode){ + throw new BusinessException(httpCode.getMsg(),httpCode.getCode()); + } + + public static void throwEx(String msg){ + throw new BusinessException(msg,500); + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/BusinessDifferenceUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/BusinessDifferenceUtil.java new file mode 100644 index 0000000..39beb3c --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/BusinessDifferenceUtil.java @@ -0,0 +1,59 @@ +package com.qs.serve.common.util; + +import com.qs.serve.common.model.annotation.BusinessDifference; +import com.qs.serve.common.model.dto.DiffFieldVal; +import lombok.SneakyThrows; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +/** + * @author YenHex + * @since 2023/4/25 + */ +public class BusinessDifferenceUtil { + + @SneakyThrows + public static List getDifferenceList(T orgVal, T newVal){ + List diffFieldValList = new ArrayList<>(); + if(orgVal==null||newVal==null){ + return diffFieldValList; + } + Class clazz = null; + try { + clazz = Class.forName(orgVal.getClass().getName()); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + if(clazz==null){return diffFieldValList;} + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + for (Annotation annotation : field.getAnnotations()) { + if(annotation instanceof BusinessDifference){ + BusinessDifference busDiff = (BusinessDifference) annotation; + field.setAccessible(true); + Object orgValue = field.get(orgVal); + Object newValue = field.get(newVal); + if(newValue==null){ + continue; + } + if(orgValue==null){ + orgValue = ""; + } + if(!orgValue.equals(newValue)){ + DiffFieldVal fieldVal = new DiffFieldVal(); + fieldVal.setField(field.getName()); + fieldVal.setNewValue(newValue.toString()); + fieldVal.setOrgValue(orgValue.toString()); + fieldVal.setComment(busDiff.value()); + diffFieldValList.add(fieldVal); + } + } + } + } + return diffFieldValList; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/CodeGenUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/CodeGenUtil.java new file mode 100644 index 0000000..e3ca5ca --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/CodeGenUtil.java @@ -0,0 +1,145 @@ +package com.qs.serve.common.util; + +import com.qs.serve.common.config.DevEnvironmentConfig; +import com.qs.serve.common.framework.redis.RedisService; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.beans.BeansException; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +/** + * 生成编号 + * @author YenHex + * @since 2023/6/25 + */ +public class CodeGenUtil { + + @Getter + @AllArgsConstructor + public enum SourceKey{ + CostApply("cost_apply"), + SalePlan("SalePlan"), + Activity("activity"), + OmsOrder("OmsOrder"), + Verification("verification"), + VerificationBatch("verificationBatch"), + Policy("policy"), + Budget("Budget"), + BudgetChange("BudgetChange"), + BudgetBatch("BudgetBatch"), + AgreeCheck("AgreeCheck"), + PolicyItem("policy_item"); + private String code; + } + + @Getter + @AllArgsConstructor + public enum SourceDataKey{ + TagInfo("T","TagInfo"), + SaleRegion("S","SaleRegion"), + BizRegion("B","BizRegion"), + ActivityPayCondition("K","ActivityPayCondition"); + private String prefix; + private String code; + } + + + private static final int split_num = 1000; + + + final static String[] digits2 = { + "A" , "B" , "C" , "D" , "E" , + "F" , "G" , "H" ,"J" , "K" , + "L" , "M" , "N" , "P" , + "Q" , "R" , "T" , "U" , "V" , "W" , + "X" , "Y" + }; + + public static synchronized Long getIdx(String key){ + RedisService redisService = SpringUtils.getBean(RedisService.class); + Long value = redisService.getLong(key); + if(value==null){ + redisService.set(key,1); + value = 1L; + }else { + value++; + } + redisService.set(key,value); + return value; + } + + public synchronized static String generate(SourceKey sourceKey){ + try { + LocalDate localDateTime = LocalDate.now(); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMdd"); + String localTime = df.format(localDateTime); + localTime = localTime.substring(2); + String key = "code_index:"+sourceKey.getCode()+":"+localTime; + return localTime + getCommonValue(key); + } catch (BeansException e) { + e.printStackTrace(); + } + return IdUtil.getSnowflakeNextIdStr(); + } + + public static String getCommonValue(String key){ + Long value = getIdx(key); + String digitsNum = ""; + String appendStr = value+""; + if(value>split_num){ + appendStr = (value%100)+""; + Long d = value/split_num; + digitsNum = digits2[d.intValue()]; + } + StringBuilder appendZeros = new StringBuilder(); + for (int i = (appendStr+digitsNum).length(); i < 3; i++) { + appendZeros.append("0"); + } + //用于区分测试环境数据 + String subflex = DevEnvironmentConfig.isDev()?"TEST":""; + return digitsNum + appendZeros + appendStr+subflex; + } + + public synchronized static String getDataCode(SourceDataKey dataKey){ + String key = "code_data_index:"+dataKey.getCode(); + String commonVal = getCommonValue(key); + return dataKey.getPrefix() + commonVal; + } + + /** + * 32个字符,用来表示32进制 + */ + final static char[] digits = { + '0' , '1' , '2' , '3' , '4' , '5' , + '6' , '7' , '8' , '9' , 'A' , 'B' , + 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , + 'J' , 'K' , 'L' , 'M' , 'N' , 'P' , + 'Q' , 'R' , 'T' , 'U' , 'V' , 'W' , + 'X' , 'Y' + }; + + /** + * 10=>32 + * @param val + * @return + */ + static String digits32(long val) { + // 32=2^5=二进制100000 + int shift = 5; + // numberOfLeadingZeros 获取long值从高位连续为0的个数,比如val=0,则返回64 + // 此处mag=long值二进制减去高位0之后的长度 + int mag = Long.SIZE - Long.numberOfLeadingZeros(val); + int len = Math.max(((mag + (shift - 1)) / shift), 1); + char[] buf = new char[len]; + do { + // &31相当于%32 + buf[--len] = digits[((int) val) & 31]; + val >>>= shift; + } while (val != 0 && len > 0); + return new String(buf); + } + + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/CollectionUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/CollectionUtil.java new file mode 100644 index 0000000..b566282 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/CollectionUtil.java @@ -0,0 +1,90 @@ +package com.qs.serve.common.util; + +import lombok.experimental.UtilityClass; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author YenHex + * @since 2022/3/25 + */ +@UtilityClass +public class CollectionUtil extends cn.hutool.core.collection.CollectionUtil{ + + /** + * 去除list中的重复数据 + */ + public static List removeRepeat(List list) { + if (isEmpty(list)) { + return list; + } + List result = new ArrayList(); + for (T e : list) { + if (!result.contains(e)) { + result.add(e); + } + } + return result; + } + + public static boolean hasNull(Object... objects){ + for (int i = 0; i < objects.length; i++) { + if(objects[i]==null){return true;} + } + return false; + } + + public static boolean hasNotNull(Object... objects){ + for (int i = 0; i < objects.length; i++) { + if(objects[i]!=null){return true;} + } + return false; + } + + /** + * 将集合转换为String数组 + */ + public static String[] toArray(List list) { + if (isEmpty(list)) { + return null; + } + String[] result = new String[list.size()]; + for (int i = 0; i < list.size(); i++) { + result[i] = String.valueOf(list.get(i)); + } + return result; + } + + /** + * 将list拆分成多给指定的大小的list + */ + public static List> createList(List target, int size) { + List> listArr = new ArrayList<>(); + //获取被拆分的数组个数 + int arrSize = target.size()%size==0?target.size()/size:target.size()/size+1; + for(int i=0;i sub = new ArrayList(); + //把指定索引数据放入到list中 + for(int j=i*size;j<=size*(i+1)-1;j++) { + if(j<=target.size()-1) { + sub.add(target.get(j)); + } + } + listArr.add(sub); + } + return listArr; + } + + public static boolean isNotEmpty(T[] arr){ + return arr!=null && arr.length>0; + } + + public static T selectFirst(List list){ + if(isNotEmpty(list)){ + return list.get(0); + } + return null; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/CopierUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/CopierUtil.java new file mode 100644 index 0000000..a79c226 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/CopierUtil.java @@ -0,0 +1,95 @@ +package com.qs.serve.common.util; + +import lombok.experimental.UtilityClass; +import org.springframework.cglib.beans.BeanCopier; + +import java.io.*; +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 取代BeanUtils.CP + * @Author JcYen + * @Date 2019/6/3 + * @Version 1.0 + */ +@UtilityClass +public class CopierUtil { + + private static final Map BEAN_COPIERS = new ConcurrentHashMap(); + + private static String genKey(Class source, Class target) { + return source.getName() + target.getName(); + } + + /** + * target字段值,会被source字段值覆盖(包括null) + * @param source + * @param target + */ + public static T copy(Object source, T target) { + String key = genKey(source.getClass(), target.getClass()); + BeanCopier copier; + if (!BEAN_COPIERS.containsKey(key)) { + copier = BeanCopier.create(source.getClass(), target.getClass(), false); + BEAN_COPIERS.put(key, copier); + } else { + copier = BEAN_COPIERS.get(key); + } + copier.copy(source, target, null); + return target; + } + + + /** + * 采用对象的序列化完成对象的深克隆 + * @param obj 待克隆的对象 + * @return + */ + @SuppressWarnings("unchecked") + public static T cloneObject(T obj) { + T cloneObj = null; + try { + // 写入字节流 + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ObjectOutputStream obs = new ObjectOutputStream(out); + obs.writeObject(obj); + obs.close(); + + // 分配内存,写入原始对象,生成新对象 + ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray()); + ObjectInputStream ois = new ObjectInputStream(ios); + // 返回生成的新对象 + cloneObj = (T) ois.readObject(); + ois.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return cloneObj; + } + + /** + * 利用序列化完成集合的深克隆 + * + * @param collection 待克隆的集合 + * @return + * @throws ClassNotFoundException + * @throws IOException + */ + @SuppressWarnings("unchecked") + public static Collection cloneCollection(Collection collection) throws ClassNotFoundException, IOException{ + ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); + ObjectOutputStream out = new ObjectOutputStream(byteOut); + out.writeObject(collection); + out.close(); + + ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); + ObjectInputStream in = new ObjectInputStream(byteIn); + Collection dest = (Collection) in.readObject(); + in.close(); + + return dest; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/DateSplitUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/DateSplitUtil.java new file mode 100644 index 0000000..1504ed1 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/DateSplitUtil.java @@ -0,0 +1,66 @@ +package com.qs.serve.common.util; + +import com.qs.serve.common.model.dto.DateSplitDTO; +import lombok.experimental.UtilityClass; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 分割时间DTO工具类 + * @author YenHex + * @since 2023/6/5 + */ +@UtilityClass +public class DateSplitUtil { + + public static List getSplitDto(LocalDate sDate, LocalDate eDate){ + int diffYear = eDate.getYear() - sDate.getYear(); + int diffMonthOfYear = eDate.getMonthValue() - sDate.getMonthValue(); + int diffMonth = diffYear * 12 + diffMonthOfYear; + //最后一个月的年月数 + int lastYearMonth = eDate.getYear()*100 + eDate.getMonthValue(); + int firstYearMonth = sDate.getYear()*100 + sDate.getMonthValue(); + if(diffMonth<1){ + //同一个月 + int days = eDate.getDayOfMonth() - sDate.getDayOfMonth() + 1; + DateSplitDTO splitDTO = new DateSplitDTO(days,sDate,eDate,lastYearMonth,1); + return Arrays.asList(splitDTO); + }else { + List dateSplitDTOS = new ArrayList<>(); + for (int i = 0; i < diffMonth+2; i++) { + int sort = i+1; + LocalDate newStartDate = sDate.plusMonths(i); + int currYearMonth = newStartDate.getYear()*100 + newStartDate.getMonthValue(); + //第一个月 + if(firstYearMonth==currYearMonth){ + int days = sDate.lengthOfMonth() - sDate.getDayOfMonth() + 1; + //当月最后一天 + LocalDate endLocalDate = LocalDate.of(sDate.getYear(),sDate.getMonth(),sDate.lengthOfMonth()); + DateSplitDTO splitDTO = new DateSplitDTO(days,sDate,endLocalDate,currYearMonth,sort); + dateSplitDTOS.add(splitDTO); + }else if(currYearMonth==lastYearMonth){ + int days = eDate.getDayOfMonth(); + //当月第一天 + LocalDate startDate = newStartDate.withDayOfMonth(1); + DateSplitDTO splitDTO = new DateSplitDTO(days,startDate,eDate,currYearMonth,sort); + dateSplitDTOS.add(splitDTO); + break; + }else { + int days = newStartDate.lengthOfMonth(); + //当月第一天 + LocalDate startDate = newStartDate.withDayOfMonth(1); + //当月最后一天 + LocalDate endLocalDate = LocalDate.of(newStartDate.getYear(),newStartDate.getMonth(),newStartDate.lengthOfMonth()); + DateSplitDTO splitDTO = new DateSplitDTO(days,startDate,endLocalDate,currYearMonth,sort); + dateSplitDTOS.add(splitDTO); + } + } + return dateSplitDTOS; + } + + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/DateUtils.java b/cms-framework/src/main/java/com/qs/serve/common/util/DateUtils.java new file mode 100644 index 0000000..f421365 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/DateUtils.java @@ -0,0 +1,128 @@ +package com.qs.serve.common.util; + +import com.qs.serve.common.util.model.DateFormatString; +import lombok.experimental.UtilityClass; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.Date; + +/** + * @author YenHex + * @since 2022/3/1 + */ +@UtilityClass +public class DateUtils { + + public static Date localDateToDate(LocalDate date){ + //LocalDate date = LocalDate.of(2006,07,26); + ZoneId zone = ZoneId.systemDefault(); + Instant instant = date.atStartOfDay().atZone(zone).toInstant(); + Date da = Date.from(instant); + return da; + } + + public static String getString(DateFormatString format){ + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format.getValue()); + return LocalDateTime.now().format(formatter); + } + + + public static LocalDate toLocalDate(Date date){ +// Instant instant = date.toInstant(); +// ZoneId zoneId = ZoneId.systemDefault(); +// return instant.atZone(zoneId).toLocalDate(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + String str = dateFormat.format(date); + String[] a = str.split("-"); + return LocalDate.of(Integer.parseInt(a[0]),Integer.parseInt(a[1]),Integer.parseInt(a[2])); + } + + + public static Date toDate(LocalDate localDate){ + ZoneId zoneId = ZoneId.systemDefault(); + ZonedDateTime zdt = localDate.atStartOfDay(zoneId); + return Date.from(zdt.toInstant()); + } + + /** + * 获取设置后得时间 + * @param time + * @param unit + * @param num + * @return + */ + public static LocalDateTime beSetTime(LocalDateTime time, ChronoUnit unit,int num){ + if(num>0){ + return time.plus(num,unit); + }else { + return time.minus(-num,unit); + } + } + + public static LocalDate beSetDate(LocalDate time,int days){ + return time.plusDays(days); + } + + public static Date toDate(String str,String format){ + SimpleDateFormat sdf = new SimpleDateFormat(format); + try { + return sdf.parse(str); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + public static Date toDate(LocalDateTime time){ + return Date.from( time.atZone( ZoneId.systemDefault()).toInstant()); + } + + public static double diffTime(long beganTime, long endTime) { + return (double)(endTime - beganTime) / 1000.0D; + } + + public static String format(LocalDateTime localDateTime, DateFormatString format){ + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format.getValue()); + return localDateTime.format(formatter); + } + + public static String datePath(){ + return format(LocalDate.now(),DateFormatString.DATE); + } + + public static String format(LocalDate localDate, DateFormatString format){ + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format.getValue()); + return localDate.format(formatter); + } + + public static void main(String[] args) { + System.out.println(DateUtils.beSetTime(LocalDateTime.now(), ChronoUnit.DAYS,-2)); + // Get the LocalDateTime instance + LocalDateTime ldt + = LocalDateTime + .parse("2019-12-31T19:15:30"); + + // Get the String representation of this LocalDateTime + System.out.println("Original LocalDateTime: " + + ldt.toString()); + + // subtract 200 DAYS to LocalDateTime + LocalDateTime value + = ldt.minus(200, ChronoUnit.DAYS); + + // print result + System.out.println("LocalDateTime after subtracting DAYS: " + + value); + } + + public static int getQuarter(int month) { + if (month >= 1 && month <= 3) return 1; + else if (month >= 4 && month <= 6) return 2; + else if (month >= 7 && month <= 9) return 3; + else return 4; + } +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/HttpUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/HttpUtil.java new file mode 100644 index 0000000..6a251cc --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/HttpUtil.java @@ -0,0 +1,162 @@ +package com.qs.serve.common.util; + +import com.alibaba.fastjson.JSONObject; +import com.qs.serve.common.model.dto.R; +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.ParseException; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.protocol.HTTP; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Map; + +/** + * @author YenHex + * @since 2022/11/23 + */ +@Slf4j +@UtilityClass +public class HttpUtil { + + private final static String CONTENT_TYPE = "application/json"; + private final static String CHARSET = "UTF-8"; + private final static String EN_CONING = "UTF-8"; + + public static String doPost(String url, String jsonStr, HashMap headers) { + CloseableHttpClient client = HttpClientBuilder.create().build(); + CloseableHttpResponse response = null; + String errorMsg = null; + try { + //设post请求 + HttpPost post = new HttpPost(url); + //创建请求实体传参 + if(jsonStr!=null){ + StringEntity postingString = new StringEntity(jsonStr,CHARSET); + postingString.setContentEncoding(EN_CONING); + //设置post请求参数 + post.setEntity(postingString); + } + post.addHeader(HTTP.CONTENT_TYPE,CONTENT_TYPE); + if (headers != null) { + for (String key : headers.keySet()) { + post.addHeader(key,headers.get(key)); + } + } + post.setConfig( + RequestConfig.custom() + // 连接超时30秒,减少数据库连接占用时长 + // 缩短时长,避免事务时间过长,占用数据库连接 + .setConnectTimeout(30*1000) + .build() + ); + //执行post请求 + response = client.execute(post); + //访问成功状态码为200 + if (response.getStatusLine().getStatusCode() == 200) { + return EntityUtils.toString(response.getEntity()); + } + } catch (IOException e) { + errorMsg = e.getMessage(); + e.printStackTrace(); + }finally { + try { + client.close(); + if(response!=null){ + response.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return errorMsg; + } + + public static String doGet(String url, HashMap headers) { + CloseableHttpClient httpclient = HttpClients.createDefault(); + try { + HttpGet httpget = new HttpGet(url); + httpget.addHeader(HTTP.CONTENT_TYPE,CONTENT_TYPE); + if (headers != null) { + for (String key : headers.keySet()) { + httpget.addHeader(key,headers.get(key)); + } + } + CloseableHttpResponse response = httpclient.execute(httpget); + try { + if (response.getStatusLine().getStatusCode() == 200) { + return EntityUtils.toString(response.getEntity()); + } + } finally { + response.close(); + } + } catch (ClientProtocolException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + public static String createUrl(Map param){ + StringBuilder sb = new StringBuilder(); + for (String key : param.keySet()) { + String par = param.get(key).toString(); + try { + par = URLEncoder.encode(par,"UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + sb.append("&").append(key).append("=").append(par); + } + return sb.toString(); + } + + public static R doGetResult(String url,HashMap headers){ + String result = HttpUtil.doGet(url,headers); + log.debug("url:{},result:{}",url,result); + if(result==null){ + Assert.throwEx("远程服务连接失败"); + } + JSONObject jsonObject = JSONObject.parseObject(result); + Integer status = jsonObject.getInteger("status"); + String msg = jsonObject.getString("msg"); + String data = jsonObject.getString("data"); + return new R(status,msg,data); + } + + public static R doPostResult(String url, String jsonStr, HashMap headers){ + String result = HttpUtil.doPost(url,jsonStr,headers); + log.debug("url:{},result:{}",url,result); + if(result==null){ + log.warn("jsonStr:{}",jsonStr); + Assert.throwEx("远程服务连接失败"); + } + JSONObject jsonObject = JSONObject.parseObject(result); + Integer status = jsonObject.getInteger("status"); + String msg = jsonObject.getString("msg"); + String data = jsonObject.getString("data"); + return new R(status,msg,data); + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/IdUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/IdUtil.java new file mode 100644 index 0000000..d15bd32 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/IdUtil.java @@ -0,0 +1,61 @@ +package com.qs.serve.common.util; + +import cn.hutool.core.lang.Snowflake; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Random; + +/** + * @author YenHex + * @since 2022/3/3 + */ +public class IdUtil extends cn.hutool.core.util.IdUtil { + + private static final long BASE_DIFF_MILLIS = 1648013774104L; + private static final long BASE_DIFF_MILLIS2 = 1578585779603640320L; + + private static final Snowflake snowflake = getSnowflake(1,1); + + public static String timeStampId() { + long millis = System.currentTimeMillis(); + String prefix = String.format("%013d", millis-BASE_DIFF_MILLIS); + Random random = new Random(); + int end2 = random.nextInt(999); + return prefix + String.format("%03d", end2); + } + + + public static Long timeStampLong() { + return System.currentTimeMillis()-BASE_DIFF_MILLIS; + } + + + public static String dateTimeStampId() { + LocalDateTime localDateTime = LocalDateTime.now(); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); + String localTime = df.format(localDateTime); + Random random = new Random(); + int end2 = random.nextInt(999); + return localTime + String.format("%03d", end2); + } + + public static String dateTimeId() { + LocalDateTime localDateTime = LocalDateTime.now(); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); + String localTime = df.format(localDateTime); + return localTime; + } + + public static String genCode(int len) { + int max = new Double(Math.pow(10, len)).intValue() - 1; + Random random = new Random(); + int end2 = random.nextInt(max); + return String.format("%0"+len+"d", end2); + } + + public static long getSnowFlakeId(){ + return snowflake.nextId()-BASE_DIFF_MILLIS2; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/JdbcUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/JdbcUtil.java new file mode 100644 index 0000000..520b3f5 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/JdbcUtil.java @@ -0,0 +1,106 @@ +package com.qs.serve.common.util; + +import lombok.extern.slf4j.Slf4j; + +import java.sql.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 原生JDBC工具类 + * @Author JcYen + * @Date 2021/6/4 + */ +@Slf4j +public class JdbcUtil { + + private static final String[] FILTER_WORD = new String[]{"truncate","create","alter","eval","delete","sp_password"}; + + /** + * 执行SQL(为安全,拦截delete语句) + * @param username + * @param password + * @param url + * @param driverName + * @param sql + * @return + */ + public static List> query(String username, String password, String url, String driverName, String sql) { + //检查SQL,防止SQL执行DDL语句 + doSqlFilter(sql); + List> list = new ArrayList(); + Connection conn = null; + Statement stmt = null; + ResultSet rs = null; + try { + Class.forName(driverName); + conn = DriverManager.getConnection(url, username, password); + stmt = conn.createStatement(); + log.debug("JDBC工具类 Preparing SQL: {}",url); + rs = stmt.executeQuery(sql); + ResultSetMetaData md = rs.getMetaData(); + int columnCount = md.getColumnCount(); + while (rs.next()) { + Map rowData = new HashMap<>(); + for (int i = 1; i <= columnCount; i++) { + rowData.put(md.getColumnName(i), rs.getObject(i)); + } + list.add(rowData); + } + } catch (ClassNotFoundException e) { + log.warn(e.getMessage()); + } catch (SQLException throwables) { + log.error(throwables.getMessage()); + }finally { + if(rs!=null){ + try { + rs.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + if (stmt!=null){ + try { + stmt.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + if(conn!=null){ + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + rs = null; + stmt = null; + conn = null; + } + return list; + } + + private static void doSqlFilter(String sql){ + boolean unsafe = false; + String[] parts = sql.split(" "); + for (String part : parts) { + if(unsafe){ break; } + if(StringUtils.isEmpty(part)){ + continue; + } + part = part.trim(); + for (String filterWord : FILTER_WORD) { + if(part.equalsIgnoreCase(filterWord)){ + unsafe = true; + break; + } + } + } + if(unsafe){ + //AssertUtil.("非法SQL被拦截 ==> "+sql); + } + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/JsonUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/JsonUtil.java new file mode 100644 index 0000000..6796df3 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/JsonUtil.java @@ -0,0 +1,109 @@ +package com.qs.serve.common.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializeConfig; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.qs.serve.common.framework.interceptor.LocalDateTimeFormatSerializer; +import lombok.experimental.UtilityClass; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + + +/** + * Jackson json序列化和反序列化工具类 + * @Author JcYen + * @Date 2019/6/3 + * @Version 1.0 + */ +@UtilityClass +public class JsonUtil { + + /** + * jackson对象 + */ + static final ObjectMapper MAPPER = new ObjectMapper(); + + static { + MAPPER.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); + MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL); + MAPPER.registerModule(new JavaTimeModule()); + } + + /** + * 将对象转换成json字符串。 + */ + public static String objectToJson(Object data) { + try { + String string = MAPPER.writeValueAsString(data); + return string; + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return null; + } + + + /** + * 将json结果集转化为对象 + * + * @param jsonData json数据 + * @param beanType 对象中的object类型 + */ + public static T jsonToPojo(String jsonData, Class beanType) { + try { + T t = MAPPER.readValue(jsonData, beanType); + return t; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 将json数据转换成pojo对象list + */ + public static List jsonToList(String jsonData, Class beanType) { + JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType); + try { + List list = MAPPER.readValue(jsonData, javaType); + return list; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static Map jsonToMap(String jsonStr){ + Map json = JSONObject.parseObject(jsonStr, Map.class); + return json; + } + + public static Map objectToMap(Object object){ + // 创建SerializeConfig对象,并设置日期时间的格式 + SerializeConfig config = new SerializeConfig(); + LocalDateTimeFormatSerializer dateFormatSerializer = new LocalDateTimeFormatSerializer(); + config.put(LocalDateTime.class, dateFormatSerializer); + String jsonString = JSON.toJSONString(object, config); + Map map = JSONObject.parseObject(jsonString); + return map; + } + + public static List> listToMap(List objects){ + List> result = new ArrayList<>(); + for (T object : objects) { + Map map = objectToMap(object); + result.add(map); + } + return result; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/JumpToUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/JumpToUtil.java new file mode 100644 index 0000000..3792f0b --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/JumpToUtil.java @@ -0,0 +1,18 @@ +package com.qs.serve.common.util; + +import lombok.experimental.UtilityClass; + +/** + * @author YenHex + * @since 2023/6/8 + */ +@UtilityClass +public class JumpToUtil { + + public static String getJumpUrl(String host, String templateCode, String targetId) { + return host + "/#/jump?jumpType=apiApproval" + + "&targetCode="+templateCode + +"&targetId="+targetId; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/JwtUtils.java b/cms-framework/src/main/java/com/qs/serve/common/util/JwtUtils.java new file mode 100644 index 0000000..9f1c272 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/JwtUtils.java @@ -0,0 +1,82 @@ +package com.qs.serve.common.util; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import com.qs.serve.common.config.JwtConfig; +import com.qs.serve.common.framework.security.model.LoginUserType; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.authentication.BadCredentialsException; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; + +/** + * @author YenHex + * @since 2022/3/1 + */ +@Slf4j +public class JwtUtils { + + private final static String USER_ID_CLAIM = "UID"; + private final static String USER_TYPE_CLAIM = "TYPE"; + private final static String USER_CLIENT_CLAIM = "CLIENT"; + + private final static JwtConfig jwtConfig = new JwtConfig(); + + public static String generateToken(String userId, LoginUserType userType,String client) { + LocalDateTime dateTime = LocalDateTime.now(); + LocalDateTime exTime = DateUtils.beSetTime(dateTime, ChronoUnit.DAYS,jwtConfig.getExpire()); + Algorithm algorithm = Algorithm.HMAC256(jwtConfig.getSecret()); + return JWT.create() + .withIssuer(jwtConfig.getIss()) + .withIssuedAt(DateUtils.toDate(dateTime)) + .withExpiresAt(DateUtils.toDate(exTime)) + .withClaim(USER_TYPE_CLAIM,userType.getCode()) + .withClaim(USER_ID_CLAIM,userId) + .withClaim(USER_CLIENT_CLAIM,client) + .sign(algorithm); + } + + public static boolean verify(String token) { + try{ + Algorithm algorithm = Algorithm.HMAC256(jwtConfig.getSecret()); + JWTVerifier verifier = JWT.require(algorithm) + .withIssuer(jwtConfig.getIss()) + .build(); + verifier.verify(token); + return true; + } catch (Exception ex){ + log.debug("令牌验证异常:{}",ex.getMessage()); + return false; + } + } + + public static String getUserId(String token) { + try{ + return JWT.decode(token).getClaim(USER_ID_CLAIM).asString(); + }catch (Exception ex){ + log.debug("方法:getUserId() 令牌验证异常:{}",ex.getMessage()); + throw new BadCredentialsException("调用凭证无效"); + } + } + + public static String getUserType(String token) { + try{ + return JWT.decode(token).getClaim(USER_TYPE_CLAIM).asString(); + }catch (Exception ex){ + log.debug("方法:getUserId() 令牌验证异常:{}",ex.getMessage()); + throw new BadCredentialsException("调用凭证无效"); + } + } + + public static String getClient(String token) { + try{ + return JWT.decode(token).getClaim(USER_CLIENT_CLAIM).asString(); + }catch (Exception ex){ + log.debug("方法:getUserId() 令牌验证异常:{}",ex.getMessage()); + throw new BadCredentialsException("调用凭证无效"); + } + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/MinioUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/MinioUtil.java new file mode 100644 index 0000000..6425bff --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/MinioUtil.java @@ -0,0 +1,84 @@ +package com.qs.serve.common.util; + +import com.qs.serve.common.model.enums.PolicyType; +import lombok.experimental.UtilityClass; + +/** + * @author YenHex + * @since 2022/5/10 + */ +@UtilityClass +public class MinioUtil { + + public static String getPolicy(String bucketName, PolicyType policyType) { + StringBuilder builder = new StringBuilder(); + builder.append("{\n"); + builder.append(" \"Statement\": [\n"); + builder.append(" {\n"); + builder.append(" \"Action\": [\n"); + if (policyType == PolicyType.WRITE) { + builder.append(" \"s3:GetBucketLocation\",\n"); + builder.append(" \"s3:ListBucketMultipartUploads\"\n"); + } else if (policyType == PolicyType.READ_WRITE) { + builder.append(" \"s3:GetBucketLocation\",\n"); + builder.append(" \"s3:ListBucket\",\n"); + builder.append(" \"s3:ListBucketMultipartUploads\"\n"); + } else { + builder.append(" \"s3:GetBucketLocation\"\n"); + } + builder.append(" ],\n"); + builder.append(" \"Effect\": \"Allow\",\n"); + builder.append(" \"Principal\": \"*\",\n"); + builder.append(" \"Resource\": \"arn:aws:s3:::"); + builder.append(bucketName); + builder.append("\"\n"); + builder.append(" },\n"); + if (PolicyType.READ.equals(policyType)) { + builder.append(" {\n"); + builder.append(" \"Action\": [\n"); + builder.append(" \"s3:ListBucket\"\n"); + builder.append(" ],\n"); + builder.append(" \"Effect\": \"Deny\",\n"); + builder.append(" \"Principal\": \"*\",\n"); + builder.append(" \"Resource\": \"arn:aws:s3:::"); + builder.append(bucketName); + builder.append("\"\n"); + builder.append(" },\n"); + } + builder.append(" {\n"); + builder.append(" \"Action\": "); + switch (policyType) { + case WRITE: + builder.append("[\n"); + builder.append(" \"s3:AbortMultipartUpload\",\n"); + builder.append(" \"s3:DeleteObject\",\n"); + builder.append(" \"s3:ListMultipartUploadParts\",\n"); + builder.append(" \"s3:PutObject\"\n"); + builder.append(" ],\n"); + break; + case READ_WRITE: + builder.append("[\n"); + builder.append(" \"s3:AbortMultipartUpload\",\n"); + builder.append(" \"s3:DeleteObject\",\n"); + builder.append(" \"s3:GetObject\",\n"); + builder.append(" \"s3:ListMultipartUploadParts\",\n"); + builder.append(" \"s3:PutObject\"\n"); + builder.append(" ],\n"); + break; + default: + builder.append("\"s3:GetObject\",\n"); + break; + } + builder.append(" \"Effect\": \"Allow\",\n"); + builder.append(" \"Principal\": \"*\",\n"); + builder.append(" \"Resource\": \"arn:aws:s3:::"); + builder.append(bucketName); + builder.append("/*\"\n"); + builder.append(" }\n"); + builder.append(" ],\n"); + builder.append(" \"Version\": \"2012-10-17\"\n"); + builder.append("}\n"); + return builder.toString(); + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/NanoIdUtils.java b/cms-framework/src/main/java/com/qs/serve/common/util/NanoIdUtils.java new file mode 100644 index 0000000..da8b07d --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/NanoIdUtils.java @@ -0,0 +1,60 @@ +package com.qs.serve.common.util; + +import java.security.SecureRandom; +import java.util.Random; + +/** + * @author YenHex + * @since 2022/4/11 + */ +public final class NanoIdUtils { + public static final SecureRandom DEFAULT_NUMBER_GENERATOR = new SecureRandom(); + public static final char[] DEFAULT_ALPHABET = "_-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); + public static final int DEFAULT_SIZE = 21; + + private NanoIdUtils() { + } + + public static String randomNanoId() { + return randomNanoId(DEFAULT_NUMBER_GENERATOR, DEFAULT_ALPHABET, 21); + } + + public static String randomNanoId(Random random, char[] alphabet, int size) { + if (random == null) { + throw new IllegalArgumentException("random cannot be null."); + } else if (alphabet == null) { + throw new IllegalArgumentException("alphabet cannot be null."); + } else if (alphabet.length != 0 && alphabet.length < 256) { + if (size <= 0) { + throw new IllegalArgumentException("size must be greater than zero."); + } else { + int mask = (2 << (int)Math.floor(Math.log((double)(alphabet.length - 1)) / Math.log(2.0D))) - 1; + int step = (int)Math.ceil(1.6D * (double)mask * (double)size / (double)alphabet.length); + StringBuilder idBuilder = new StringBuilder(); + + while(true) { + byte[] bytes = new byte[step]; + random.nextBytes(bytes); + + for(int i = 0; i < step; ++i) { + int alphabetIndex = bytes[i] & mask; + if (alphabetIndex < alphabet.length) { + idBuilder.append(alphabet[alphabetIndex]); + if (idBuilder.length() == size) { + return idBuilder.toString(); + } + } + } + } + } + } else { + throw new IllegalArgumentException("alphabet must contain between 1 and 255 symbols."); + } + } + + public static void main(String[] args) { + for (int i = 0; i < 1000; i++) { + System.out.println(randomNanoId()); + } + } +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/PageUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/PageUtil.java new file mode 100644 index 0000000..63d725b --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/PageUtil.java @@ -0,0 +1,188 @@ +package com.qs.serve.common.util; + +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.pagehelper.PageHelper; +import com.qs.serve.common.framework.exception.BusinessException; +import lombok.experimental.UtilityClass; + +import java.util.ArrayList; +import java.util.List; + +/** + * 翻页工具类 + * @Author YenHex + * @Date 2021/6/9 + * @Version: 1.0 + **/ +@UtilityClass +public class PageUtil { + + private static final String PAGE_NUM = "pageNum"; + private static final String PAGE_SIZE = "pageSize"; + + private static final String ORDER_TYPE = "orderType"; + private static final String ORDER_PROP = "orderProp"; + + private static final String ORDER_TYPE_ASC = "ASC"; + private static final String ORDER_TYPE_DESC = "DESC"; + + private static final int MAX_PAGE_SIZE = 100; + + public static Page getMbpPage(){ + Integer pageNum = getPageNum(); + Integer pageSize = getPageSize(); + String orderProp = getOrderProp(); + String orderType = getOrderType(); + if ( pageNum ==null || pageNum<1 || pageSize==null || pageSize<1) { + throw new BusinessException("翻页参数异常",500); + } + Page page = new Page<>(); + page.setCurrent(pageNum); + page.setSize(pageSize); + if(StringUtils.hasText(orderProp)){ + OrderItem orderItem = new OrderItem(); + orderItem.setColumn(orderProp); + orderItem.setAsc(orderType.equals(ORDER_TYPE_ASC)); + List orderItems = new ArrayList<>(); + orderItems.add(orderItem); + page.setOrders(orderItems); + } + return page; + } + + public static Integer getPageNum(){ + Integer pageNum=null; + String pageNumStr = ServletUtils.getParameter(PAGE_NUM); + if(!StringUtils.hasText(pageNumStr)){ + Object pageNumObj = ServletUtils.getSession().getAttribute(PAGE_NUM); + if(pageNumObj!=null){ + pageNumStr = pageNumObj.toString(); + } + } + if(StringUtils.hasText(pageNumStr)){ + pageNum = Integer.parseInt(pageNumStr); + } + return pageNum; + } + + public static Integer getPageSize(){ + String pageSizeStr = ServletUtils.getParameter(PAGE_SIZE); + Integer pageSize = null; + if(!StringUtils.hasText(pageSizeStr)){ + Object pageNumObj = ServletUtils.getSession().getAttribute(PAGE_SIZE); + if(pageNumObj!=null){ + pageSizeStr = pageNumObj.toString(); + } + } + if(StringUtils.hasText(pageSizeStr)){ + pageSize = Integer.parseInt(pageSizeStr); + } + if(pageSize!=null && pageSize > MAX_PAGE_SIZE){ + throw new BusinessException("超出数据额度",500); + } + return pageSize; + } + + public static String getOrderProp(){ + String orderProp = ServletUtils.getParameter(ORDER_PROP); + if(StringUtils.hasText(orderProp)){ + orderProp = orderProp.trim(); + if(orderProp.contains(".")){ + String[] strings = orderProp.split("\\."); + return strings[0]+"."+strings[1]; + } + return WordUtil.toLine(orderProp); + } + return null; + } + + public static void setPageSize(String pageSize){ + ServletUtils.getSession().setAttribute(PAGE_SIZE,pageSize); + } + + public static void setPageNum(String pageNum){ + ServletUtils.getSession().setAttribute(PAGE_NUM,pageNum); + } + + public static String getOrderType(){ + String orderType = ServletUtils.getParameter(ORDER_TYPE); + if(StringUtils.hasText(orderType)){ + if(orderType.equalsIgnoreCase(ORDER_TYPE_DESC)){ + return ORDER_TYPE_DESC; + } + } + return ORDER_TYPE_ASC; + } + + public static Integer getStartRow(){ + Integer pageNum = getPageNum(); + Integer pageSize = getPageSize(); + if (pageNum==null || pageSize==null) { + throw new BusinessException("翻页参数异常",500); + } + return (pageNum-1)*pageSize; + } + + /** + * 启动翻页(翻页失败,会抛出异常) + * @return 是否使用翻页 + */ + public static boolean startPage(){ + return startPage(true); + } + + /** + * + * @param throwEx 是否抛异常 + * @return 是否使用翻页 + */ + public static boolean startPage(boolean throwEx){ + return startPage(null,null,throwEx); + } + + /** + * 执行翻页 + * @param object POJO + * @return 是否使用翻页 + */ + public static boolean startPage(T object){ + return startPage(object,null,true); + } + + public static boolean startPage(String prefix){ + return startPage(null,prefix,true); + } + /** + * + * @param throwEx 是否抛异常 + * @return 是否使用翻页 + */ + public static boolean startPage(T object,String prefix,boolean throwEx){ + Integer pageNum = getPageNum(); + Integer pageSize = getPageSize(); + String orderProp = getOrderProp(); + String orderType = getOrderType(); + if (pageNum!=null && pageNum>0 && pageSize!=null && pageSize>0) { + if(!StringUtils.isEmpty(orderProp)){ + if(prefix==null && object!=null){ + prefix = WordUtil.toLine(object.getClass().getSimpleName()); + } + if(prefix!=null){ + PageHelper.startPage(pageNum, pageSize).setOrderBy(prefix+"."+orderProp+" "+orderType); + }else { + PageHelper.startPage(pageNum, pageSize).setOrderBy(orderProp+" "+orderType); + } + return true; + } + PageHelper.startPage(pageNum, pageSize); + return true; + }else{ + if(throwEx){ + throw new BusinessException("翻页参数异常",500); + } + return false; + } + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/ServletUtils.java b/cms-framework/src/main/java/com/qs/serve/common/util/ServletUtils.java new file mode 100644 index 0000000..d1f4abb --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/ServletUtils.java @@ -0,0 +1,135 @@ +package com.qs.serve.common.util; + +import com.qs.serve.common.model.consts.GySysConst; +import lombok.experimental.UtilityClass; +import org.springframework.http.MediaType; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; + +/** + * Servlet容器工具类 + * @author YenHex + * @date 2021/6/9 + **/ +@UtilityClass +public class ServletUtils { + /** + * 获取String参数 + */ + public static String getParameter(String name) { + return getRequest().getParameter(name); + } + + public static String getAuthToken(){ + HttpServletRequest request = getRequest(); + return request.getHeader(GySysConst.AUTHORIZATION_PROP); + } + + /** + * 获取String参数 + */ + public static String getHeader(String name) { + return getRequest().getHeader(name); + } + + /** + * 获取IP + * @return + */ + public static String getIp(HttpServletRequest request) { + if(request==null){ + request = getRequest(); + } + String ip = request.getHeader("x-forwarded-for"); + if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + return ip; + } + + /** + * 判断本次请求的数据类型是否为json + * @param request request + * @return true: 是 JSON 数据; false: 非 json 数据 + */ + public static boolean isJsonRequest(HttpServletRequest request) { + if (request.getContentType() != null) { + return request.getContentType().equals(MediaType.APPLICATION_JSON_VALUE) || + request.getContentType().equals(MediaType.APPLICATION_JSON_UTF8_VALUE); + } + return false; + } + + /** + * 获取请求Body + * @param request + * @return + */ + public static String getBodyString(ServletRequest request) { + StringBuilder sb = new StringBuilder(); + InputStream inputStream = null; + BufferedReader reader = null; + try { + inputStream = request.getInputStream(); + reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + String line = ""; + while ((line = reader.readLine()) != null) { + sb.append(line); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return sb.toString(); + } + + /** + * 获取request + */ + public static HttpServletRequest getRequest() { + return getRequestAttributes().getRequest(); + } + + /** + * 获取session + */ + public static HttpSession getSession() { + return getRequest().getSession(); + } + + private static ServletRequestAttributes getRequestAttributes() { + RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); + return (ServletRequestAttributes) attributes; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/SmsReflectUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/SmsReflectUtil.java new file mode 100644 index 0000000..1b6b34f --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/SmsReflectUtil.java @@ -0,0 +1,50 @@ +package com.qs.serve.common.util; + +import com.qs.serve.common.util.model.wx.SmsBaseDto; +import com.qs.serve.common.util.model.wx.WxSmsProp; +import me.chanjar.weixin.mp.bean.template.WxMpTemplateData; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +/** + * @author YenHex + * @since 2022/3/16 + */ +public class SmsReflectUtil { + + /** + * 反射获取WX_SMS配置 + * @param baseDto + * @param + * @return + */ + public static List getTemplateDataList(T baseDto){ + List dataList = new ArrayList<>(); + for (Field field : baseDto.getClass().getDeclaredFields()) { + WxSmsProp wxSmsProp = null; + for (Annotation annotation : field.getAnnotations()) { + if(annotation instanceof WxSmsProp){ + wxSmsProp = (WxSmsProp)annotation; + break; + } + } + try { + field.setAccessible(true); + Object fieldObject = field.get(baseDto); + String value = ""; + if(fieldObject!=null){ + value = fieldObject.toString(); + } + WxMpTemplateData templateData = new WxMpTemplateData(wxSmsProp.keyword(),value); + dataList.add(templateData); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + return dataList; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/SpringUtils.java b/cms-framework/src/main/java/com/qs/serve/common/util/SpringUtils.java new file mode 100644 index 0000000..c2c0bc7 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/SpringUtils.java @@ -0,0 +1,147 @@ +package com.qs.serve.common.util; + +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +import java.util.Arrays; + +/** + * spring工具类 + * @author YenHex + * @since 2022/2/28 + */ +@Component +public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware +{ + /** Spring应用上下文环境 */ + private static ConfigurableListableBeanFactory beanFactory; + + private static ApplicationContext applicationContext; + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException + { + SpringUtils.beanFactory = beanFactory; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + SpringUtils.applicationContext = applicationContext; + } + + /** + * 获取对象 + * + * @param name + * @return Object 一个以所给名字注册的bean的实例 + * @throws BeansException + * + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException + { + return (T) beanFactory.getBean(name); + } + + /** + * 获取类型为requiredType的对象 + * + * @param clz + * @return + * @throws BeansException + * + */ + public static T getBean(Class clz) throws BeansException + { + T result = (T) beanFactory.getBean(clz); + return result; + } + + /** + * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true + * + * @param name + * @return boolean + */ + public static boolean containsBean(String name) + { + return beanFactory.containsBean(name); + } + + /** + * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) + * + * @param name + * @return boolean + * @throws NoSuchBeanDefinitionException + * + */ + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.isSingleton(name); + } + + /** + * @param name + * @return Class 注册对象的类型 + * @throws NoSuchBeanDefinitionException + * + */ + public static Class getType(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getType(name); + } + + /** + * 如果给定的bean名字在bean定义中有别名,则返回这些别名 + * + * @param name + * @return + * @throws NoSuchBeanDefinitionException + * + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getAliases(name); + } + + /** + * 获取aop代理对象 + * + * @param invoker + * @return + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) + { + return (T) AopContext.currentProxy(); + } + + /** + * 获取当前的环境配置,无配置返回null + * + * @return 当前的环境配置 + */ + public static String[] getActiveProfiles() + { + return applicationContext.getEnvironment().getActiveProfiles(); + } + + /** + * 获取当前的环境配置,当有多个环境配置时,只获取第一个 + * + * @return 当前的环境配置 + */ + public static String getActiveProfile() + { + final String[] activeProfiles = getActiveProfiles(); + return CollectionUtil.isNotEmpty(Arrays.asList(activeProfiles)) ? activeProfiles[0] : null; + } +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/SqlServerUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/SqlServerUtil.java new file mode 100644 index 0000000..3ad8c0a --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/SqlServerUtil.java @@ -0,0 +1,156 @@ +package com.qs.serve.common.util; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.microsoft.sqlserver.jdbc.SQLServerBulkCopy; +import com.microsoft.sqlserver.jdbc.SQLServerBulkCopyOptions; +import com.sun.rowset.CachedRowSetImpl; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.type.JdbcType; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.sql.*; +import java.util.List; + +/** + * SQL Server工具类 + * @author Trouble + * @version 1.0 + * @since 2024-04-25 15:00 + */ +@Slf4j +public class SqlServerUtil { + + /** + * 批量插入数据库 + * + * @param connectionUrl 数据库连接地址 + * @param list 要保存的对象集 + * @throws SQLException 插入对象失败 + */ + public static void batchInsert(String connectionUrl, List list) throws SQLException, IllegalAccessException { + long start = System.currentTimeMillis(); + String tableName = null; + //获取表名 + for (T t : list) { + TableName tableNameAnnotation = t.getClass().getAnnotation(TableName.class); + tableName = tableNameAnnotation.value(); + break; + } + + CachedRowSetImpl crs = getCachedRowSet(connectionUrl, tableName); + // 将对象转化为行数据 + for (Object obj : list) { + // 以动指针到插入行(虚拟行) + crs.moveToInsertRow(); + // 设置虚拟行相应的字段与数值;注意:字符串中的字段名与类型要与数据表中的一致 + Field[] declaredFields = obj.getClass().getDeclaredFields(); + for (Field field : declaredFields) { + + if(field.getName().equals("serialVersionUID")){ + continue; + } + + field.setAccessible(true); + + TableField tableField = field.getAnnotation(TableField.class); + String fieldName; + // 如果字段名不存在,则跳过 + // 如果字段名为空,则使用默认字段名称 + if (tableField != null) { + if (!tableField.exist()) { + continue; + } + fieldName = tableField.value(); + } else { + fieldName = field.getName(); + } + Object fieldValue = field.get(obj); + + if (tableField != null && tableField.jdbcType().equals(JdbcType.FLOAT)) { + crs.updateBigDecimal(fieldName, (BigDecimal) fieldValue); + } + else { + crs.updateObject(fieldName, fieldValue); + } + } + // 将虚拟行插入缓存 + crs.insertRow(); + // 将指针移动到当前行 + crs.moveToCurrentRow(); + } + saveRows(connectionUrl, tableName, crs, list.size()); + long end = System.currentTimeMillis(); + log.info("批量插入数据表{}成功,数量:{}条,耗时:{}ms", tableName, list.size(), end - start); + } + + /** + * 获取数据表的结构 + * + * @param url 链接对象 + * @param tableName 表名字 + * @return 数据表字段初始化的数据对象 + * @throws SQLException 数据表字段初始化失败 + */ + public static CachedRowSetImpl getCachedRowSet(String url, String tableName) throws SQLException { + // 链接方式固定(配置) + Connection con = connection(url); + String sql = String.format("select * from %s where 1 = 0", tableName); + // 执行sql语句封装 + PreparedStatement ps = con.prepareStatement(sql); + // 执行语句 + ResultSet rs = ps.executeQuery(); + // 创建行操作对象 + CachedRowSetImpl crs = new CachedRowSetImpl(); + // 设置表字段 + crs.populate(rs); + // 关闭流资源 + rs.close(); + // 关闭数据库链接 + con.close(); + // 返回含有表字段的行操作对象 + return crs; + } + + /** + * 连接数据库 + * + * @param connectionUrl 链接URL + * @return 链接对象 + * @throws SQLException 建立链接失败异常 + */ + public static Connection connection(String connectionUrl) throws SQLException { + return DriverManager.getConnection(connectionUrl); + } + + /** + * 将数据插入数据库 + * + * @param connectionUrl 数据库连接地址 + * @param tableName 数据表名称 + * @param crs 数据行操作对象 + * @param size 数据量 + * @throws SQLException 插入数据失败异常 + */ + public static void saveRows(String connectionUrl, String tableName, CachedRowSetImpl crs, int size) throws SQLException { + SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions(); + copyOptions.setKeepIdentity(true); + // 设置批量插入的数量 + copyOptions.setBatchSize(size); + // 开启事务 + copyOptions.setUseInternalTransaction(true); + // 配置url + SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(connectionUrl); + // 设置批量操作参数 + bulkCopy.setBulkCopyOptions(copyOptions); + // 设置要操作的表名 + bulkCopy.setDestinationTableName(tableName); + // 将数据保存到数据库 + bulkCopy.writeToServer(crs); + // 释放资源 + crs.close(); + // 释放资源 + bulkCopy.close(); + } +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/StringUtils.java b/cms-framework/src/main/java/com/qs/serve/common/util/StringUtils.java new file mode 100644 index 0000000..234b21a --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/StringUtils.java @@ -0,0 +1,139 @@ +package com.qs.serve.common.util; + +import lombok.experimental.UtilityClass; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2022/2/28 + */ +@UtilityClass +public class StringUtils extends org.springframework.util.StringUtils { + + /** 订单号生成(NEW) **/ + private static final AtomicInteger SEQ = new AtomicInteger(1000); + private static final AtomicInteger SEQ2 = new AtomicInteger(10001); + private static final DateTimeFormatter DF_FMT_PREFIX = DateTimeFormatter.ofPattern("yyMMddHHmmssSS"); + private static ZoneId ZONE_ID = ZoneId.of("Asia/Shanghai"); + + public static String generateOrderNo(){ + LocalDateTime dataTime = LocalDateTime.now(ZONE_ID); + if(SEQ.intValue()>9990){ + SEQ.getAndSet(1000); + } + return dataTime.format(DF_FMT_PREFIX)+SEQ.getAndIncrement(); + } + + public static String genShortId() { + // 2 位 年份的后两位 22001 后五位走随机 每天清一次缓存 99999 10 + StringBuilder idSb = new StringBuilder(); + /// 年份后两位 和 一年中的第几天 + LocalDate now = LocalDate.now(); + String year = now.getYear() + ""; + year = year.substring(2); + String day = now.getDayOfYear() + ""; + /// 补0 + if (day.length() < 3) { + StringBuilder sb = new StringBuilder(); + for (int i = day.length(); i < 3; i++) { + sb.append("0"); + } + day = sb.append(day).toString(); + } + idSb.append(year).append(day); + /// 后五位补随机数 + if(SEQ2.intValue()>99900){ + SEQ2.getAndSet(10000); + } + idSb.append(SEQ2.getAndIncrement()); + return idSb.toString(); + } + + public static void main(String[] args) { + for (int i = 0; i < 100; i++) { + System.out.println(genShortId()); + //System.out.println(generateOrderNo()); + } + } + + public static String tailorLen(String str,int len){ + if(StringUtils.hasText(str)&&str.length()>len){ + return str.substring(0,len-2)+"..."; + } + return str; + } + + /** 非空 */ + public static boolean isNotEmpty(String str){ + return !isEmpty(str); + } + + /** 含有空对象 */ + public static boolean hasEmpty(Object... strings){ + for (Object str : strings) { + if(isEmpty(str)){return true;} + } + return false; + } + + public static String getUrlByList(List list,String param){ + StringBuilder sb = new StringBuilder(); + for (Object val : list) { + sb.append("&"+param+"="+val); + } + return sb.toString(); + } + + /** + * 格式化 + * @param exp 含{}的表达式 + * @param params 参数(注意跳过空值) + * @return + */ + public static String format(String exp,String... params){ + StringBuilder builder = new StringBuilder(exp); + int idx_p = 0; + while (hasText(builder,"{}")){ + int idx = builder.indexOf("{}"); + if(idx_p splitIdString(String ids){ + if(ids==null){ + return null; + } + if(ids.contains(",")){ + String[] idsA= ids.split(","); + return Arrays.asList(idsA); + } + return Arrays.asList(ids); + } + + public static List splitIdLong(String ids){ + List strs = splitIdString(ids); + if(strs!=null){ + return strs.stream().map(Long::parseLong).collect(Collectors.toList()); + } + return null; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/ThreadsUtils.java b/cms-framework/src/main/java/com/qs/serve/common/util/ThreadsUtils.java new file mode 100644 index 0000000..03f7e2d --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/ThreadsUtils.java @@ -0,0 +1,75 @@ +package com.qs.serve.common.util; + +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.*; + + +/** + * 线程相关 + * @author YenHex + * @since 2022-03-01 + */ +@Slf4j +@UtilityClass +public class ThreadsUtils { + + /** + * sleep等待,单位为毫秒 + */ + public static void sleep(long milliseconds) { + try { + Thread.sleep(milliseconds); + } catch (InterruptedException e) { + return; + } + } + + /** + * 停止线程池 + * 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务. + * 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数. + * 如果仍人超時,則強制退出. + * 另对在shutdown时线程本身被调用中断做了处理. + */ + public static void shutdownAndAwaitTermination(ExecutorService pool) { + if (pool != null && !pool.isShutdown()) { + pool.shutdown(); + try { + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) { + pool.shutdownNow(); + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) { + log.info("Pool did not terminate"); + } + } + } catch (InterruptedException ie) { + pool.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + } + + /** + * 打印线程异常信息 + */ + public static void printException(Runnable r, Throwable t) { + if (t == null && r instanceof Future) { + try { + Future future = (Future) r; + if (future.isDone()) { + future.get(); + } + } catch (CancellationException ce) { + t = ce; + } catch (ExecutionException ee) { + t = ee.getCause(); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + } + } + if (t != null) { + log.error(t.getMessage(), t); + } + } +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/TianYiYunSmsUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/TianYiYunSmsUtil.java new file mode 100644 index 0000000..ffde60c --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/TianYiYunSmsUtil.java @@ -0,0 +1,48 @@ +package com.qs.serve.common.util; + +import cn.hutool.crypto.digest.DigestUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +/** + * @author YenHex + * @since 2024/1/26 + */ +@Slf4j +@Service +public class TianYiYunSmsUtil { + + private final static String url = "http://sms.189ek.com/yktsms/send?"; + + private final static String appId = "WIgWyCFn4DnHLtjKBIXBVyZbGevFg3J4"; + + private final static String appKey = "bjfsZlF01OZPUzyiCLSFOrOOnfsZhYZJ"; + + public static void sendMsg(String code){ + send("13286630016,15989082884,15913696250",code); + } + + public static void send(String phone,String code){ + //需要发送的手机号(多个号码以英文逗号 “,”分隔) 一次性最多 100 个号码 + String mobiles = phone; + String content = "【嘉士利】尊敬的用户,您预约来访已成功,"+code; + String sign = DigestUtil.md5Hex(appId+mobiles+content+appKey); + try { + String msg = URLEncoder.encode(content,"utf-8"); + String params = "appid="+ appId + + "&mobile="+ mobiles + + "&msg=" + msg + + "&sign=" + sign + + "&extPort="; + String result = HttpUtil.doPost(url+params,"{}",null); + log.debug("sms result = > {}",result); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/TokenUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/TokenUtil.java new file mode 100644 index 0000000..89aec72 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/TokenUtil.java @@ -0,0 +1,46 @@ +package com.qs.serve.common.util; + + +import com.qs.serve.common.util.model.DesUtils; + +/** + * @author YenHex + * @since 2022/2/25 + */ +public class TokenUtil { + + private static final String secretKey = "N2aD7vLTJjeo71vCHwbqYsSF9rZPUh"; + + /** + * 加密 + * @param userId + * @return + */ + public static String desEncrypt(String userId){ + String formatStr = userId+"-N2aD7vLTJjeo71vCHwbqYsSF9rZPUh"; + DesUtils des = new DesUtils(secretKey); + try { + return des.encrypt(formatStr); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 解密 + * @param encryptText + * @return clientId + */ + public static String desDecrypt(String encryptText){ + DesUtils des = new DesUtils(secretKey); + try { + String formatStr = des.decrypt(encryptText); + return formatStr.split("-")[0]; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/TreeUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/TreeUtil.java new file mode 100644 index 0000000..2053ac8 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/TreeUtil.java @@ -0,0 +1,75 @@ +package com.qs.serve.common.util; + +import com.qs.serve.common.model.dto.TreeNode; +import lombok.experimental.UtilityClass; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author YenHex + * @since 2022/3/1 + */ +@UtilityClass +public class TreeUtil { + + public static final String DEFAULT_PID_STRING = "0"; + + /** + * 两层循环实现建树 + * @param treeNodes 传入的树节点列表 + * @param rootPid + * @return + * sorted(Comparator.comparingInt(DemoEntity::getSort)) + */ + public List build(List treeNodes, String rootPid) { + List trees = new ArrayList<>(); + for (T treeNode : treeNodes) { + if (rootPid.equals(treeNode.getParentId())) { + trees.add(treeNode); + } + for (T it : treeNodes) { + if (it.getParentId().equals(treeNode.getId())) { + treeNode.addChildren(it); + } + } + } + return trees; + } + + /** + * 使用递归方法建树 + * + * @param treeNodes + * @return + */ + public List buildByRecursive(List treeNodes, Object root) { + List trees = new ArrayList(); + for (T treeNode : treeNodes) { + if (root.equals(treeNode.getParentId())) { + trees.add(findChildren(treeNode, treeNodes,1)); + } + } + return trees; + } + + /** + * 递归查找子节点 + * + * @param treeNodes + * @return + */ + public T findChildren(T treeNode, List treeNodes,int level) { + for (T it : treeNodes) { + if (treeNode.getId().equals(it.getParentId())) { + if (treeNode.getChildren() == null) { + treeNode.setChildren(new ArrayList<>()); + } + treeNode.addChildren(findChildren(it, treeNodes,level+1)); + } + } + treeNode.setNodeLevel(level); + return treeNode; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/UploadUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/UploadUtil.java new file mode 100644 index 0000000..09eb9e5 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/UploadUtil.java @@ -0,0 +1,53 @@ +package com.qs.serve.common.util; + +import cn.hutool.core.io.FileUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.util.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.IOException; +import java.time.LocalDate; + +/** + * @author YenHex + * @since 2022/3/14 + */ +@Slf4j +public class UploadUtil { + + /** + * 返回相对地址 + * @param uploadPath 物理路径 + * @param fileName2 文件名 + * @param request + * @return + */ + public static String put(String uploadPath,final String fileName2,HttpServletRequest request){ + String contentType = request.getContentType(); + MultipartFile file = null; + if (contentType != null && contentType.toLowerCase().startsWith("multipart")) { + MultipartHttpServletRequest multipartHttpServletRequest = WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class); + file = multipartHttpServletRequest.getFile("file"); + } + if (file==null||file.isEmpty()) { + Assert.throwEx("请选择文件"); + } + String fileOrgName = file.getOriginalFilename(); + String mimeType = fileOrgName.substring(fileOrgName.lastIndexOf(".")); + String fileName = fileName2 + mimeType ; + String prefix = LocalDate.now().toString().replace("-","")+"/"; + try { + FileUtil.createTempFile(new File(uploadPath+prefix)); + File dest = new File(uploadPath + prefix + fileName); + file.transferTo(dest); + return prefix + fileName; + } catch (IOException e) { + log.error(e.toString(), e); + } + return null; + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/ValidateTools.java b/cms-framework/src/main/java/com/qs/serve/common/util/ValidateTools.java new file mode 100644 index 0000000..0bc9f16 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/ValidateTools.java @@ -0,0 +1,85 @@ +package com.qs.serve.common.util; + +import com.qs.serve.common.framework.exception.BusinessException; +import lombok.experimental.UtilityClass; +import org.hibernate.validator.HibernateValidator; +import org.springframework.util.CollectionUtils; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; +import java.util.List; +import java.util.Set; + +/** + * validate方法中校验工具类 + *

+ * 只要在实体中加上相应的validate的相关注解即可 + *

+ * + * @author Zed + */ +@UtilityClass +public class ValidateTools { + /** + * 初始化检查器 + */ + private static final ValidatorFactory VALIDATOR_FACTORY = Validation.byProvider(HibernateValidator.class).configure().failFast(false).buildValidatorFactory(); + private static final Validator VALIDATOR = VALIDATOR_FACTORY.getValidator(); + /** + * 校验返回异常信息 + * + * @param t 实体 + * @param 实体泛型 + */ + public static String validStr(T t) { + // 构造返回信息 + StringBuilder validMessage = new StringBuilder(); + // 检查实体T + Set> set = VALIDATOR.validate(t); + // 循环set,获取检查结果 + for (ConstraintViolation vo : set) { + validMessage.append(vo.getMessage()).append(";"); + } + return validMessage.toString(); + } + /** + * 校验实体抛出异常 + * + * @param t 实体 + * @param 实体泛型 + */ + public static void valid(T t) { + String validStr = validStr(t); + // 抛出业务异常 + if (StringUtils.isNotEmpty(validStr)) { + throw new BusinessException(validStr,500); + } + } + /** + * 校验集合抛出异常 + * + * @param list 列表 + * @param 实体泛型 + */ + public static void valid(List list) { + if (CollectionUtils.isEmpty(list)) { + throw new BusinessException("数据不存在!",500); + } + // 构造返回信息 + StringBuilder validMessageTotal = new StringBuilder(); + // 遍历 + for (int i = 0; i < list.size(); i++) { + String validStr = validStr(list.get(i)); + if (StringUtils.isNotEmpty(validStr)) { + String msg = String.format("第%d条数据校验结果:[%s]\n", i + 1, validStr); + validMessageTotal.append(msg); + } + } + // 抛出业务异常 + if (StringUtils.isNotEmpty(validMessageTotal.toString())) { + throw new BusinessException(validMessageTotal.toString(),500); + } + } +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/WarpUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/WarpUtil.java new file mode 100644 index 0000000..94b6481 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/WarpUtil.java @@ -0,0 +1,62 @@ +package com.qs.serve.common.util; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qs.serve.common.framework.mybatis.query.AnnotationQueryStorage; +import com.qs.serve.common.framework.mybatis.query.model.QueryFieldDataValue; +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * 生成SQL条件包装对象 + * @author YenHex + * @date 2022/2/28 + **/ +@UtilityClass +@Slf4j +public class WarpUtil extends AnnotationQueryStorage { + + private static final String ORDER_PROP_NAME = "prop"; + private static final String ORDER_TYPE_NAME = "order"; + private static final String ORDER_DESC = "desc"; + private static final String CREATE_TIME = "create_time"; + + private static final String START_TIME = "startTime"; + private static final String END_TIME = "endTime"; + + public static QueryWrapper build(T query){ + return build(query,false); + } + + public static QueryWrapper build(T query,Boolean orderAble){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + List dataValues = loadQueryFieldDataValues(query); + assert dataValues != null; + initWrap(dataValues,queryWrapper); + initBetweenTime(queryWrapper); + if(orderAble){ + String columnsString = ServletUtils.getParameter(ORDER_PROP_NAME); + String orderType = ServletUtils.getParameter(ORDER_TYPE_NAME); + if(StringUtils.isNotEmpty(columnsString)){ + String[] columns = columnsString.split(","); +// if(orderType.equals(ORDER_DESC)){ +// queryWrapper.orderByDesc(columns); +// }else { +// queryWrapper.orderByAsc(columns); +// } + } + } + return queryWrapper; + } + + public static void initBetweenTime(QueryWrapper queryWrapper){ + String startTime = ServletUtils.getParameter(START_TIME); + String endTime = ServletUtils.getParameter(END_TIME); + if(!StringUtils.hasEmpty(startTime,endTime)){ + queryWrapper.ge(CREATE_TIME,startTime); + queryWrapper.le(CREATE_TIME,endTime); + } + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/WordUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/WordUtil.java new file mode 100644 index 0000000..2396956 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/WordUtil.java @@ -0,0 +1,108 @@ +package com.qs.serve.common.util; + +import lombok.experimental.UtilityClass; + +/** + * 单词间转换工具类 + * @author JcYen + * @Date 2020/5/27 + * @Version 1.0 + */ +@UtilityClass +public class WordUtil { + + public static String lowerFirst(String className){ + return lowerFirst(className,null); + } + + /** + * 类名首字母小写 + * @param className 类名 + * @param rmPrefix 移除的前缀,不区分大小写 + * @return + */ + public static String lowerFirst(String className,String rmPrefix){ + if(className==null){throw new RuntimeException("className is null");} + if(rmPrefix!=null){ + String prefix = className.substring(0,rmPrefix.length()); + if(prefix.toLowerCase().equals(rmPrefix.toLowerCase())){ + className = className.substring(rmPrefix.length()); + } + } + char[]chars = className.toCharArray(); + chars[0] += 32; + return String.valueOf(chars); + } + + /** + * 数据库表名 转 类名 : ums_user_log ->> UmsUserLog + * 1.首字母转小写 + * 2.下横线后的字母大写,去掉"_"下横线, + * @param tableName + * @return + */ + public static String tableToClass(String tableName) { + if(StringUtils.isEmpty(tableName)){return null;} + char[] chars = tableName.toCharArray(); + for (int i = 0; i < chars.length; i++) { + if(Character.isLowerCase(chars[i])&&i==0){ + chars[i] = Character.toUpperCase(chars[i]); + } + if(chars[i] == '_' && i+1> umsUserLog + * 1.首字母转小写 + * 2.下横线后的字母大写,去掉"_"下横线, + * @param columnName + * @return + */ + public static String columnToField(String columnName) { + if(StringUtils.isEmpty(columnName)){return null;} + char[] chars = columnName.toCharArray(); + for (int i = 0; i < chars.length; i++) { + if(chars[i] == '_' && i+1> ums_user_log + * 1.首字母转小写 + * 2.字符非首个字母,添加"_"下横线,并大写字母转小写 + * @param fieldName + * @return + */ + public static String toLine(String fieldName) { + if(StringUtils.isEmpty(fieldName)){return null;} + columnToField(fieldName); + char[] chars = fieldName.toCharArray(); + int countUpper = 0; + for (int i = 0; i < chars.length; i++) { + if(Character.isUpperCase(chars[i])&&i!=0){ + countUpper ++ ; + } + } + char[] newChars = new char[chars.length+countUpper]; + //偏移量 + int offset = 0; + for (int i = 0; i < chars.length; i++) { + if(Character.isUpperCase(chars[i])){ + if(i!=0){ + newChars[i+offset] = '_'; + offset++; + } + } + newChars[i+offset] = Character.toLowerCase(chars[i]); + } + return String.valueOf(newChars); + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/bus/QueryFilterUtil.java b/cms-framework/src/main/java/com/qs/serve/common/util/bus/QueryFilterUtil.java new file mode 100644 index 0000000..e9b5c8b --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/bus/QueryFilterUtil.java @@ -0,0 +1,28 @@ +package com.qs.serve.common.util.bus; + +import com.qs.serve.common.util.Assert; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; + +/** + * @author YenHex + * @since 2024/11/1 + */ +public class QueryFilterUtil { + + public static void filterSubmitDate(LocalDateTime startDate,LocalDateTime endDate,int maxDays) { + filterDate(startDate,endDate,maxDays,"申请时间段"); + } + + public static void filterDate(LocalDateTime startDate,LocalDateTime endDate,int maxDays,String timeName) { + if(startDate==null||endDate==null){ + Assert.throwEx("请选择"+timeName); + } + long daysBetween = ChronoUnit.DAYS.between(startDate, endDate); + if(daysBetween > maxDays){ + Assert.throwEx(timeName+"跨度最大值(天):"+maxDays); + } + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/model/DateFormatString.java b/cms-framework/src/main/java/com/qs/serve/common/util/model/DateFormatString.java new file mode 100644 index 0000000..43aa4e4 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/model/DateFormatString.java @@ -0,0 +1,25 @@ +package com.qs.serve.common.util.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author YenHex + * @since 2022/3/17 + */ +@Getter +@AllArgsConstructor +public enum DateFormatString { + + DATE_TIME("yyyy-MM-dd HH:mm:ss"), + DATE_TIME2("yyyy-MM-dd HH:mm:ss.000"), + DATE_TIME_NUM("yyyyMMddHHmmss"), + DATE_TIME_CN("yyyy年MM月dd日 HH时mm分ss秒"), + + DATE("yyyy-MM-dd"), + DATE_NUM("yyyyMMdd"), + DATE_CN("yyyy年MM月dd日"); + + private String value; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/model/DesUtils.java b/cms-framework/src/main/java/com/qs/serve/common/util/model/DesUtils.java new file mode 100644 index 0000000..2617af1 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/model/DesUtils.java @@ -0,0 +1,125 @@ +package com.qs.serve.common.util.model; + +import javax.crypto.Cipher; +import java.security.Key; + +/** + * 使用DES算法对字符串进行加密解密 (加密解密的操作步骤正好相反, 参考 {@link #encrypt(String)}, {@link #decrypt(String)}) + */ +public class DesUtils { + private static String defaultSecretKey = "default_secret_key"; //默认密钥 + private Cipher encryptCipher = null; //加密器 + private Cipher decryptCipher = null; //解密器 + + public DesUtils() throws Exception { + this(defaultSecretKey); + } + + /** + * @param secretKey 加密解密使用的密钥 + */ + public DesUtils(String secretKey) { + Key key; + try { + key = getKey(secretKey.getBytes()); + encryptCipher = Cipher.getInstance("DES"); + encryptCipher.init(Cipher.ENCRYPT_MODE, key); + decryptCipher = Cipher.getInstance("DES"); + decryptCipher.init(Cipher.DECRYPT_MODE, key); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 加密 (逻辑: 1. 将要加密的字符串转换为字节数组(byte array)
+ * 2. 将第一步的字节数组作为输入使用加密器(Cipher)的doFinal方法进行加密, 返回字节数组
+ * 3. 把加密后的字节数组转换成十六进制的字符串)
+ * @param strIn 要加密的字符串 + * @return 返回加密后的十六进制字符串 + * @throws Exception + */ + public String encrypt(String strIn) throws Exception { + return byteArr2HexStr(encrypt(strIn.getBytes())); + } + + public byte[] encrypt(byte[] arrB) throws Exception { + return encryptCipher.doFinal(arrB); + } + + /** + * 解密 (逻辑: 1. 把加密后的十六进制字符串转换成字节数组(byte array)
+ * 2. 将第一步的字节数组作为输入使用加密器(Cipher)的doFinal方法进行解密, 返回字节数组(byte array)
+ * 3. 把解密后的字节数组转换成字符串)
+ * @param strIn + * @return + * @throws Exception + */ + public String decrypt(String strIn) throws Exception { + return new String(decrypt(hexStr2ByteArr(strIn))); + } + + public byte[] decrypt(byte[] arrB) throws Exception { + return decryptCipher.doFinal(arrB); + } + + public static String byteArr2HexStr(byte[] arrB) throws Exception { + int iLen = arrB.length; + // 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍 + StringBuffer sb = new StringBuffer(iLen * 2); + for (int i = 0; i < iLen; i++) { + int intTmp = arrB[i]; + // 把负数转换为正数 + while (intTmp < 0) { + intTmp = intTmp + 256; + } + // 小于0F的数需要在前面补0 + if (intTmp < 16) { + sb.append("0"); + } + sb.append(Integer.toString(intTmp, 16)); + } + return sb.toString(); + } + + public static byte[] hexStr2ByteArr(String strIn) throws Exception { + byte[] arrB = strIn.getBytes(); + int iLen = arrB.length; + // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2 + byte[] arrOut = new byte[iLen / 2]; + for (int i = 0; i < iLen; i = i + 2) { + String strTmp = new String(arrB, i, 2); + arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16); + } + return arrOut; + } + + private Key getKey(byte[] arrBTmp) throws Exception { + // 创建一个空的8位字节数组(默认值为0) + byte[] arrB = new byte[8]; + // 将原始字节数组转换为8位 + for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) { + arrB[i] = arrBTmp[i]; + } + // 生成密钥 + Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES"); + return key; + } + + + /** + * 用法实例 + */ + public static void main(String[] args) { + try { + String test = "liwc"; + DesUtils des = new DesUtils("leemenz"); //自定义密钥 + System.out.println("加密前的字符:" + test); + System.out.println("加密后的字符:" + des.encrypt(test)); + System.out.println("解密后的字符:" + des.decrypt(des.encrypt(test))); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/model/QsJsonLocalDateTimeDeserializer.java b/cms-framework/src/main/java/com/qs/serve/common/util/model/QsJsonLocalDateTimeDeserializer.java new file mode 100644 index 0000000..ad46dfb --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/model/QsJsonLocalDateTimeDeserializer.java @@ -0,0 +1,28 @@ +package com.qs.serve.common.util.model; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * @author YenHex + * @since 2023/7/25 + */ +public class QsJsonLocalDateTimeDeserializer extends JsonDeserializer { + + final DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + @Override + public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JacksonException { + String val = jsonParser.getText(); + if (val==null||val.isEmpty()){ + return null; + } + return LocalDateTime.parse(val,df); + } +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/model/wx/SmsBaseDto.java b/cms-framework/src/main/java/com/qs/serve/common/util/model/wx/SmsBaseDto.java new file mode 100644 index 0000000..cdf477c --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/model/wx/SmsBaseDto.java @@ -0,0 +1,11 @@ +package com.qs.serve.common.util.model.wx; + +/** + * @author YenHex + * @since 2022/7/25 + */ +public abstract class SmsBaseDto { + + + +} diff --git a/cms-framework/src/main/java/com/qs/serve/common/util/model/wx/WxSmsProp.java b/cms-framework/src/main/java/com/qs/serve/common/util/model/wx/WxSmsProp.java new file mode 100644 index 0000000..2e5d73c --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/common/util/model/wx/WxSmsProp.java @@ -0,0 +1,19 @@ +package com.qs.serve.common.util.model.wx; + +import java.lang.annotation.*; + +/** + * 微信发送模板参数 + * @author YenHex + * @since 2022-03-16 + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface WxSmsProp { + + String keyword() default ""; + + String value() default ""; + +} diff --git a/cms-framework/src/main/java/com/qs/serve/framework/package-info.java b/cms-framework/src/main/java/com/qs/serve/framework/package-info.java new file mode 100644 index 0000000..c39a24c --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/framework/package-info.java @@ -0,0 +1 @@ +package com.qs.serve.framework; diff --git a/cms-framework/src/main/java/com/qs/serve/framework/support/package-info.java b/cms-framework/src/main/java/com/qs/serve/framework/support/package-info.java new file mode 100644 index 0000000..6d02305 --- /dev/null +++ b/cms-framework/src/main/java/com/qs/serve/framework/support/package-info.java @@ -0,0 +1 @@ +package com.qs.serve.framework.support; diff --git a/cms-modules/cms-actuator/pom.xml b/cms-modules/cms-actuator/pom.xml new file mode 100644 index 0000000..8f1a992 --- /dev/null +++ b/cms-modules/cms-actuator/pom.xml @@ -0,0 +1,27 @@ + + + + cms-modules + com.qs + 1.0-SNAPSHOT + + 4.0.0 + + cms-actuator + + + 8 + 8 + + + + + com.qs + cms-system + 1.0-SNAPSHOT + + + + diff --git a/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/HttpServletRequestFilter.java b/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/HttpServletRequestFilter.java new file mode 100644 index 0000000..185618d --- /dev/null +++ b/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/HttpServletRequestFilter.java @@ -0,0 +1,187 @@ +package com.qs.serve.actuator; + +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.DateUtils; +import com.qs.serve.common.util.ServletUtils; +import com.qs.serve.modules.sys.common.AuthContextUtils; +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; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * HttpServletRequest 过滤器 + * 解决: request.getInputStream()只能读取一次的问题 + * 目标: 流可重复读 + * @Author YenHex + * @Date 2021/4/9 + * @Version: 1.0 + **/ +@Slf4j +@Component +@WebFilter(filterName = "HttpServletRequestFilter", urlPatterns = "/") +@Order(10000) +public class HttpServletRequestFilter implements Filter{ + + @Resource + RedisService redisService; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + RequestWrapper requestWrapper = null; + if(servletRequest instanceof HttpServletRequest) { + //过滤文件URL + String url = ((HttpServletRequest) servletRequest).getRequestURI(); + if(!url.contains("import")&&!url.contains("upload")){ + requestWrapper = new RequestWrapper((HttpServletRequest) servletRequest); + } + } + long startTime = System.currentTimeMillis(); + if(null == requestWrapper) { + filterChain.doFilter(servletRequest, servletResponse); + } else { + filterChain.doFilter(requestWrapper, servletResponse); + } + long endTime = System.currentTimeMillis(); + double diffTime = DateUtils.diffTime(startTime,endTime); + assert servletRequest instanceof HttpServletRequest; + HttpServletRequest request = (HttpServletRequest)servletRequest; + String supplierId = request.getHeader("supplierId"); + String url = request.getRequestURL().toString(); + String method = request.getMethod(); + String queryStr = request.getQueryString(); + String reqBody = ""; + if (ServletUtils.isJsonRequest(request)&&requestWrapper!=null) { + reqBody = requestWrapper.getBody(); + } + StringBuffer buffer = new StringBuffer("\n["+method+"] "+url); + if(supplierId!=null){ + buffer.append(" 供应商ID: "+supplierId); + } + if(!StringUtils.isEmpty(queryStr)){ + buffer.append("\n参数: "+queryStr); + } + if(DevEnvironmentConfig.isDev() &&!StringUtils.isEmpty(reqBody)){ + buffer.append("\n请求体: "+reqBody); + } + if(diffTime>0.6D){ + buffer.append("\n耗时: "+diffTime+"秒"); + } + try { + LoginUser loginUser = AuthContextUtils.getLoginUser(false); + if(loginUser!=null){ + buffer.append("\n用户: "+loginUser.getNick()); + buffer.append(" IP:["+ServletUtils.getIp(request)+"]"); + buffer.append(" 时间:["+ LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)+"]"); + } + } catch (Exception e) {} + if(diffTime< 1D){ + log.info(buffer.toString()); + }else if (diffTime< 20D){ + log.warn(buffer.toString()); + }else { + log.error(buffer.toString()); + } + String themeKey = RedisService.getLockTheme(); + if(StringUtils.hasText(themeKey)){ + log.warn("释放资源key:{}",themeKey); + redisService.remove(themeKey); + } + //释放资源 防止线程池重复利用出现脏数据 + RedisService.removeThreadLocal(); + AuthContextUtils.removeThreadLocal(); + } + + @Override + public void destroy() { + + } + + /*** + * HttpServletRequest 包装器 + * 解决: request.getInputStream()只能读取一次的问题 + * 目标: 流可重复读 + */ + public class RequestWrapper extends HttpServletRequestWrapper { + + /** + * 请求体 + */ + private String mBody; + + public RequestWrapper(HttpServletRequest request) { + super(request); + mBody = getBody(request); + } + + /** + * 获取请求体 + * @param request 请求 + * @return 请求体 + */ + private String getBody(HttpServletRequest request) { + return ServletUtils.getBodyString(request); + } + + /** + * 获取请求体 + * @return 请求体 + */ + public String getBody() { + return mBody; + } + + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new InputStreamReader(getInputStream())); + } + + @Override + public ServletInputStream getInputStream() throws IOException { + // 创建字节数组输入流 + final ByteArrayInputStream bais = new ByteArrayInputStream(mBody.getBytes(StandardCharsets.UTF_8)); + + return new ServletInputStream() { + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + } + + @Override + public int read() throws IOException { + return bais.read(); + } + }; + } + } + +} diff --git a/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/MyBatisConfig.java b/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/MyBatisConfig.java new file mode 100644 index 0000000..8c80687 --- /dev/null +++ b/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/MyBatisConfig.java @@ -0,0 +1,67 @@ +package com.qs.serve.actuator; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author YenHex + * @since 2022/3/1 + */ +@MapperScan("com.qs.serve.modules.*.mapper") +@Configuration(proxyBeanMethods = false) +public class MyBatisConfig { + + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + // 翻页拦截器 + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + // 多租户、乐观锁等配置拦截 + interceptor.addInnerInterceptor(buildTenantHandler()); + // 添加动态表名插件 +// DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor(); +// dynamicTableNameInnerInterceptor.setTableNameHandler(tableNameAppendHandler()); +// interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor); + // 添加防止全表更新与删除拦截器 + interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); + return interceptor; + } + + @Bean + public MetaObjectHandler sysMetaHandler(){ + return new SysMetaHandler(); + } + + +// public TableNameAppendHandler tableNameAppendHandler(){ +// TableNameAppendHandler tableNameAppendHandler = new TableNameAppendHandler( +// "oms_sale_order", +// "oms_sale_order_item" +// ); +// return tableNameAppendHandler; +// } + + public TenantLineInnerInterceptor buildTenantHandler(){ + String[] ignoreTable = new String[]{ + "sys_user", + "sys_user_tenant", + "sys_permit", + "sys_tenant", + "wx_app", + "sys_menu", + "sys_menu_permit", + "sys_request_log", + "bir_budget_target" + }; + SysTenantHandler sysTenantHandler = new SysTenantHandler(ignoreTable); + return new TenantLineInnerInterceptor(sysTenantHandler); + } + +} diff --git a/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/SecurityConfig.java b/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/SecurityConfig.java new file mode 100644 index 0000000..f30da38 --- /dev/null +++ b/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/SecurityConfig.java @@ -0,0 +1,61 @@ +package com.qs.serve.actuator; + +import com.qs.serve.common.config.properties.PermitProperties; +import com.qs.serve.common.framework.security.handler.SecurityAccessDeniedHandler; +import lombok.AllArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2021/6/13 + */ +@Configuration +@AllArgsConstructor +@EnableGlobalMethodSecurity(prePostEnabled=true) +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + private final SecurityRequestFilter securityRequestFilter; + private final UserDetailsService userService; + private final PermitProperties permitProperties; + + @Override + protected void configure(HttpSecurity http) throws Exception { + List permitUrls = new ArrayList<>(); + if(permitProperties.getPermits()!=null){ permitUrls.addAll(permitProperties.getPermits()); } + if(permitProperties.getTenants()!=null){ permitUrls.addAll(permitProperties.getTenants()); } + permitUrls = permitUrls.stream().distinct().collect(Collectors.toList()); + String[] permit_urls = new String[permitUrls.size()]; + permitUrls.toArray(permit_urls); + http.csrf().disable(); + http.authorizeRequests() + .antMatchers(HttpMethod.OPTIONS.toString()).permitAll() + .antMatchers(permit_urls).permitAll() + //.antMatchers().permitAll() //测试用 + .anyRequest().authenticated(); + http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER); + http.logout() + .logoutUrl("/portal/logout") + .addLogoutHandler(new SecurityLogoutHandler()) + .invalidateHttpSession(true); + http.headers().cacheControl(); + http.addFilterBefore(securityRequestFilter, UsernamePasswordAuthenticationFilter.class); + http.exceptionHandling().accessDeniedHandler(new SecurityAccessDeniedHandler()); + } + + @Override + public UserDetailsService userDetailsService() { + return userService; + } + +} diff --git a/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/SecurityLogoutHandler.java b/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/SecurityLogoutHandler.java new file mode 100644 index 0000000..cb3acd5 --- /dev/null +++ b/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/SecurityLogoutHandler.java @@ -0,0 +1,24 @@ +package com.qs.serve.actuator; + +import com.qs.serve.common.model.HttpResponsePrintUtil; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.logout.LogoutHandler; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author YenHex + * @since 2021/12/22 + */ +public class SecurityLogoutHandler implements LogoutHandler { + @Override + public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { + try { + HttpResponsePrintUtil.print(response,200,"退出登录成功"); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/SecurityRequestFilter.java b/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/SecurityRequestFilter.java new file mode 100644 index 0000000..e7c29a7 --- /dev/null +++ b/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/SecurityRequestFilter.java @@ -0,0 +1,204 @@ +package com.qs.serve.actuator; + +import com.qs.serve.common.config.properties.AuthUrlConst; +import com.qs.serve.common.config.properties.PermitProperties; +import com.qs.serve.common.config.properties.ProjectProperties; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.framework.security.model.LoginUser; +import com.qs.serve.common.framework.security.util.SecurityPermitUtil; +import com.qs.serve.common.model.HttpResponsePrintUtil; +import com.qs.serve.common.model.consts.GySysConst; +import com.qs.serve.common.model.consts.RedisCacheKeys; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.JwtUtils; +import com.qs.serve.modules.sys.service.SysUserService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 判断token情况 + * @Author JcYen + * @Date 2022/03/01 + * @Version 1.0 + */ +@Slf4j +@Component +public class SecurityRequestFilter extends OncePerRequestFilter { + + @Value("${server.servlet.context-path}") + public String contextPath; + + @Autowired + private SysUserService sysUserService; + + @Autowired + private PermitProperties permitProperties; + + @Autowired + private RedisService redisService; + + @Autowired + private ProjectProperties projectProperties; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { + + String supplierId = request.getHeader(GySysConst.SUPPLIER_PROP); + AuthContextUtils.setSupplierId(supplierId); + //移除前缀 + String url = request.getRequestURI(); + if(!StringUtils.isEmpty(contextPath)&&!contextPath.equals("/")){ + url = url.replace(contextPath,""); + } + //分析拦截类型 + boolean ignorePermit = false; + for(String reg : permitProperties.getPermits()){ + if(SecurityPermitUtil.verify(reg,url)){ + ignorePermit=true; + break; + } + } + //分析拦截类型 + boolean ignoreTenant = false; + for(String reg : permitProperties.getTenants()){ + if(SecurityPermitUtil.verify(reg,url)){ + ignoreTenant = true; + break; + } + } + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Expose-Headers", "Date"); + //登录拦截 + if ("OPTIONS".equals(request.getMethod())) { + HttpResponsePrintUtil.print(response,200,"success"); + return; + } + if(!ignoreTenant){ + boolean hasTenant = handleTenant(request,response); + if(!hasTenant){ + return; + } + } + if(projectProperties.getCloseAuth()!=null && projectProperties.getCloseAuth().equals("true")){ + for (String allowUrl : AuthUrlConst.AUTH_ALLOW_URL) { + if(url.contains(allowUrl)){ + doSecurityAuthor(false,request, response, chain); + } + } + }else { + if(ignorePermit){ + //try to doSecurityAuthor + tryDoSecurityAuthor(request, response, chain); + chain.doFilter(request,response); + }else { + doSecurityAuthor(true,request, response, chain); + } + } + } + + /** + * 尝试执行登录 + * @param request + * @param response + * @param chain + * @throws IOException + * @throws ServletException + */ + private void tryDoSecurityAuthor(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { + + String tenant = request.getHeader(GySysConst.TENANT_PROP); + if(!StringUtils.hasText(tenant)){ + tenant = "001"; + } + String token = request.getHeader(GySysConst.AUTHORIZATION_PROP); + if(token != null && JwtUtils.verify(token)){ + String userId = JwtUtils.getUserId(token); + AuthContextUtils.setTenant(tenant); + if(SecurityContextHolder.getContext().getAuthentication()==null){ + LoginUser userDetails = sysUserService.getLoginUserById(userId); + if(userDetails!=null){ + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + } + } + } + + + /** + * 执行登录 + * @param request + * @param response + * @param chain + * @throws IOException + * @throws ServletException + */ + private void doSecurityAuthor(boolean checkRedis,HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { + String token = request.getHeader(GySysConst.AUTHORIZATION_PROP); + if(!JwtUtils.verify(token)){ + HttpResponsePrintUtil.print2(response,401,"身份凭证无效或过期"); + }else{ + String userId = JwtUtils.getUserId(token); + String userType = JwtUtils.getUserType(token); + String client = JwtUtils.getClient(token); + if(checkRedis){ + String redisKey = com.qs.serve.common.util.StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client,userId); + String cacheToken = redisService.getString(redisKey); + if(cacheToken==null){ + //redisService.remove(redisKey); + HttpResponsePrintUtil.print2(response,401,"已被系统登出"); + //return解决:security.access.AccessDeniedException + return; + } + } + if(SecurityContextHolder.getContext().getAuthentication()==null){ + UserDetails userDetails = sysUserService.getLoginUserById(userId); + if(userDetails==null){ + HttpResponsePrintUtil.print2(response,401,"登录信息无效,请重新登录"); + //return解决:security.access.AccessDeniedException + return; + }else { + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + } + chain.doFilter(request, response); + } + } + + /** + * 多租户模式下使用 + * @param request + * @param response + * @throws IOException + * @throws ServletException + */ + private boolean handleTenant(HttpServletRequest request, HttpServletResponse response) throws IOException{ + String tenant = request.getHeader(GySysConst.TENANT_PROP); + if (tenant != null) { + AuthContextUtils.setTenant(tenant); + return true; + }else{ + log.error("商户信息错误,请求地址:{}",request.getRequestURI()); + HttpResponsePrintUtil.print2(response,4001,"商户信息错误"); + return false; + } + } + +} diff --git a/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/SysLogAspect.java b/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/SysLogAspect.java new file mode 100644 index 0000000..b9578f0 --- /dev/null +++ b/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/SysLogAspect.java @@ -0,0 +1,225 @@ +package com.qs.serve.actuator; + +import com.alibaba.fastjson.JSON; +import com.qs.serve.common.framework.manager.AsyncManager; +import com.qs.serve.common.framework.security.model.LoginUser; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.consts.GySysConst; +import com.qs.serve.modules.sync.AsyncFactory; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.ServletUtils; +import com.qs.serve.modules.sys.entity.SysOperationLog; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.annotation.*; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Component; +import org.springframework.validation.BindingResult; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.HandlerMapping; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; + +/** + * 操作日志织入 + * @author YenHex + * @since 2022/3/8 + */ +@Slf4j +@Aspect +@Component +public class SysLogAspect { + + @Autowired + private SysUserService sysUserService; + + ThreadLocal startTimeIndex = new ThreadLocal<>(); + + @Pointcut("@annotation(com.qs.serve.common.model.annotation.SysLog)") + public void logPointCut() {} + + @Before("@annotation(com.qs.serve.common.model.annotation.SysLog)") + public void doBefore() { + startTimeIndex.set(System.currentTimeMillis()); + } + + /** + * 处理完请求后执行 + * @param joinPoint 切点 + */ + @AfterReturning(pointcut = "logPointCut()", returning = "jsonResult") + public void doAfterReturning(JoinPoint joinPoint, Object jsonResult) { + handleLog(joinPoint, null, jsonResult); + } + + /** + * 拦截异常操作 + * @param joinPoint 切点 + * @param e 异常 + */ + @AfterThrowing(value = "logPointCut()", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, Exception e) { + handleLog(joinPoint, e, null); + } + + protected void handleLog(final JoinPoint joinPoint, final Exception e, Object jsonResult) { + try { + // 获得注解 + SysLog controllerLog = getAnnotationLog(joinPoint); + if (controllerLog == null) { + return; + } + + HttpServletRequest request = ServletUtils.getRequest(); + + //耗时 + Long startTime = startTimeIndex.get(); + Long diffTime = null; + boolean isLongTime = false; + if(startTime!=null){ + diffTime = System.currentTimeMillis()-startTime; + if(diffTime>10000){ + isLongTime = true; + } + } + + //GET只保存请求时间长的请求 + if(request.getMethod().equals("GET") && !isLongTime){ + return; + } + // 获取当前的用户 + LoginUser loginUser = AuthContextUtils.getLoginUser(false); + SysOperationLog operLog = new SysOperationLog(); + operLog.setReqIp(ServletUtils.getIp(request)); + operLog.setReqMethod(request.getMethod()); + operLog.setJsonResult(JSON.toJSONString(jsonResult)); + operLog.setReqUrl(request.getRequestURI()); + operLog.setUserAgent(request.getHeader(GySysConst.USER_AGENT_PROP)); + if (loginUser != null) { + operLog.setUserId(loginUser.getUserId()); + operLog.setUserType(loginUser.getTypeFlag().getCode()); + SysUser sysUser = sysUserService.getById(loginUser.getUserId()); + if(sysUser!=null){ + operLog.setCreatorName(sysUser.getName()); + } + } + if (e != null) { + operLog.setErrMsg(StringUtils.substring(e.getMessage(), 0, 2500)); + } + if(diffTime!=null){ + operLog.setElapsedTime(diffTime); + }else { + operLog.setElapsedTime(-1L); + } + String className = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + operLog.setCodeMethod(className + "." + methodName + "()"); + // 处理设置注解上的参数 + getControllerMethodDescription(joinPoint, controllerLog, operLog); + operLog.setTenantId(AuthContextUtils.getTenant()); + // 保存数据库 + AsyncManager.me().execute(AsyncFactory.saveOperationLog(operLog)); + } catch (Exception exp) { + // 记录本地异常日志 + log.error("==前置通知异常==\n异常信息:{}", exp.getMessage()); + exp.printStackTrace(); + } + } + + /** + * 获取注解中对方法的描述信息 + * @param sysLog 日志 + * @param operationLog 操作日志 + * @throws Exception + */ + public void getControllerMethodDescription(JoinPoint joinPoint, SysLog sysLog, SysOperationLog operationLog) throws Exception { + operationLog.setBizType(sysLog.biz().getValue()); + operationLog.setInterType(sysLog.inter().name()); + operationLog.setTitle(sysLog.title()); + operationLog.setModule(sysLog.module().getVale()); + operationLog.setOptDesc(sysLog.desc()); + if (sysLog.saveReqParam()) { + setRequestValue(joinPoint, operationLog); + } + } + + /** + * 获取请求的参数,放到log中 + * @param operationLog 操作日志 + * @throws Exception 异常 + */ + private void setRequestValue(JoinPoint joinPoint, SysOperationLog operationLog) throws Exception { + String requestMethod = operationLog.getReqMethod(); + if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)) { + String params = argsArrayToString(joinPoint.getArgs()); + operationLog.setReqParam(StringUtils.substring(params, 0, 2500)); + } else { + Map paramsMap = (Map) ServletUtils.getRequest().getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE); + operationLog.setReqParam(StringUtils.substring(paramsMap.toString(), 0, 2500)); + } + } + + /** 是否存在注解,如果存在就获取 */ + private SysLog getAnnotationLog(JoinPoint joinPoint){ + Signature signature = joinPoint.getSignature(); + MethodSignature methodSignature = (MethodSignature) signature; + Method method = methodSignature.getMethod(); + if (method != null) { + return method.getAnnotation(SysLog.class); + } + return null; + } + + /** + * 参数拼装 + */ + private String argsArrayToString(Object[] paramsArray) { + String params = ""; + if (paramsArray != null && paramsArray.length > 0) { + for (int i = 0; i < paramsArray.length; i++) { + if (paramsArray[i]!=null && !isFilterObject(paramsArray[i])) { + Object jsonObj = JSON.toJSON(paramsArray[i]); + params += jsonObj.toString() + " "; + } + } + } + return params.trim(); + } + + /** + * 判断是否需要过滤的对象。 + * @param o 对象信息。 + * @return 如果是需要过滤的对象,则返回true;否则返回false。 + */ + @SuppressWarnings("rawtypes") + public boolean isFilterObject(final Object o) { + Class clazz = o.getClass(); + if (clazz.isArray()) { + return clazz.getComponentType().isAssignableFrom(MultipartFile.class); + } else if (Collection.class.isAssignableFrom(clazz)) { + Collection collection = (Collection) o; + for (Iterator iter = collection.iterator(); iter.hasNext(); ) { + return iter.next() instanceof MultipartFile; + } + } else if (Map.class.isAssignableFrom(clazz)) { + Map map = (Map) o; + for (Iterator iter = map.entrySet().iterator(); iter.hasNext(); ) { + Map.Entry entry = (Map.Entry) iter.next(); + return entry.getValue() instanceof MultipartFile; + } + } + return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse + || o instanceof BindingResult; + } +} diff --git a/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/SysMetaHandler.java b/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/SysMetaHandler.java new file mode 100644 index 0000000..ff329a4 --- /dev/null +++ b/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/SysMetaHandler.java @@ -0,0 +1,36 @@ +package com.qs.serve.actuator; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.qs.serve.common.framework.security.model.LoginUser; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.reflection.MetaObject; + +import java.time.LocalDateTime; + +/** + * 自动注入列数据 + * @author YenHex + * @since 2022/3/1 + */ +@Slf4j +public class SysMetaHandler implements MetaObjectHandler { + + @Override + public void insertFill(MetaObject metaObject) { + LoginUser loginUser = AuthContextUtils.getLoginUser(false); + if(loginUser!=null){ + this.strictInsertFill(metaObject, "createBy", () -> loginUser.getUserId(), String.class); + } + this.strictInsertFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class); + } + + @Override + public void updateFill(MetaObject metaObject) { + LoginUser loginUser = AuthContextUtils.getLoginUser(false); + if(loginUser!=null){ + this.strictUpdateFill(metaObject, "updateBy", () -> loginUser.getUserId(), String.class); + } + this.strictUpdateFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class); + } +} diff --git a/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/SysTenantHandler.java b/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/SysTenantHandler.java new file mode 100644 index 0000000..b634a31 --- /dev/null +++ b/cms-modules/cms-actuator/src/main/java/com/qs/serve/actuator/SysTenantHandler.java @@ -0,0 +1,58 @@ +package com.qs.serve.actuator; + +import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; +import com.qs.serve.common.model.consts.GySysConst; +import com.qs.serve.common.model.enums.HttpCode; +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.StringValue; + +import java.util.Arrays; + +/** + * @Author YenHex + * @Date 2021/5/7 + * @Version: 1.0 + **/ +public class SysTenantHandler implements TenantLineHandler { + + public SysTenantHandler(String[] ignoreTables){ + this.IGNORE_TABLES = Arrays.asList(ignoreTables); + } + + + final private java.util.List IGNORE_TABLES; + + @Override + public Expression getTenantId() { + String tenant = AuthContextUtils.getTenant(); + if(tenant==null){ + Assert.throwEx(HttpCode.LOGIN_ERR_4001); + } + return new StringValue(tenant); + } + + @Override + public String getTenantIdColumn() { + return GySysConst.TENANT_COLUMN; + } + + /** + * 判断是否忽略该表,默认全忽略,匹配到的不忽略 + * @param tableName + * @return + */ + @Override + public boolean ignoreTable(String tableName) { + for (String tb : this.IGNORE_TABLES) { + if(tableName.equalsIgnoreCase(tb)){ + return true; + } + } + return false; + } + + + +} diff --git a/cms-modules/cms-policy/cms-policy-api/pom.xml b/cms-modules/cms-policy/cms-policy-api/pom.xml new file mode 100644 index 0000000..2fddb54 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-api/pom.xml @@ -0,0 +1,28 @@ + + + + cms-policy + com.qs + 1.0-SNAPSHOT + + 4.0.0 + + jar + cms-policy-api + + + 8 + 8 + + + + + com.qs + cms-common + 1.0-SNAPSHOT + + + + diff --git a/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/api/TzcRebateAPI.java b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/api/TzcRebateAPI.java new file mode 100644 index 0000000..e66f1ed --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/api/TzcRebateAPI.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.tzc.api; + +import com.qs.serve.modules.tzc.entity.TzcRebate; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +/** + * @author YenHex + * @since 2025/4/15 + */ +@FeignClient(name = "policy-svc", url = "${service-list.policy}") +public interface TzcRebateAPI { + + @GetMapping("/api/tzc/rebate/{id}") + TzcRebate getRebateById(@PathVariable("id") Long id); + +} diff --git a/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebate.java b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebate.java new file mode 100644 index 0000000..0edf187 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebate.java @@ -0,0 +1,123 @@ +package com.qs.serve.modules.tzc.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 lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; + +/** + * 返利信息 实体类 + * @author YenHex + * @since 2025-04-15 + */ +@Data +@TableName("tzc_rebate") +public class TzcRebate implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 模板id */ + private Long templateId; + + /** 模板名称 */ + @Length(max = 64,message = "模板名称长度不能超过64字") + private String templateName; + + /** 返利编码 */ + @Length(max = 64,message = "返利编码长度不能超过64字") + private String rebateCode; + + /** 返利抬头 */ + @Length(max = 64,message = "返利抬头长度不能超过64字") + private String rebateName; + + /** 返利开始时间 */ + @Length(max = 0,message = "返利开始时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime activityStartTime; + + /** 返利结束时间 */ + @Length(max = 0,message = "返利结束时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime activityEndTime; + + /** 自动获取发货数据:0-否;1-是 */ + private Integer autoDispatchFlag; + + /** 核销模式:0-人工复核;1-自动核销 */ + private Integer checkModel; + + /** 超过多少金额自动核销变为人工核销 */ + private BigDecimal checkMaxAmount; + + /** 自动核销日期类型:0-手动设置;1-自然月;2-自然周 */ + private Integer checkAutoDateType; + + /** 核销开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate checkStartDate; + + /** 核销结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate checkEndDate; + + /** 客户id */ + private Long supplierId; + + /** 客户编码 */ + @Length(max = 64,message = "客户编码长度不能超过64字") + private String supplierCode; + + /** 客户名称 */ + @Length(max = 64,message = "客户名称长度不能超过64字") + private String supplierName; + + /** 返利总金额 */ + private BigDecimal rebateAmount; + + /** 坎级叠加标识 */ + @NotNull(message = "坎级叠加标识不能为空") + private Integer overlayFlag; + + + public static TzcRebate toNewObject(TzcRebate source){ + TzcRebate rebate = new TzcRebate(); + rebate.setId(source.getId()); + rebate.setTemplateId(source.getTemplateId()); + rebate.setTemplateName(source.getTemplateName()); + rebate.setRebateCode(source.getRebateCode()); + rebate.setRebateName(source.getRebateName()); + rebate.setActivityStartTime(source.getActivityStartTime()); + rebate.setActivityEndTime(source.getActivityEndTime()); + rebate.setAutoDispatchFlag(source.getAutoDispatchFlag()); + rebate.setCheckModel(source.getCheckModel()); + rebate.setCheckMaxAmount(source.getCheckMaxAmount()); + rebate.setCheckAutoDateType(source.getCheckAutoDateType()); + rebate.setCheckStartDate(source.getCheckStartDate()); + rebate.setCheckEndDate(source.getCheckEndDate()); + rebate.setSupplierId(source.getSupplierId()); + rebate.setSupplierCode(source.getSupplierCode()); + rebate.setSupplierName(source.getSupplierName()); + rebate.setRebateAmount(source.getRebateAmount()); + rebate.setOverlayFlag(source.getOverlayFlag()); + return rebate; + } + +} + diff --git a/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateCenter.java b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateCenter.java new file mode 100644 index 0000000..17e5721 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateCenter.java @@ -0,0 +1,137 @@ +package com.qs.serve.modules.tzc.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 2025-04-15 + */ +@Data +@TableName("tzc_rebate_center") +public class TzcRebateCenter implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long rebateId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long rebateSubjectId; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 费用额度 */ + @NotNull(message = "费用额度不能为空") + private BigDecimal centerAmount; + + /** 费用占比 */ + @NotNull(message = "费用占比不能为空") + private BigDecimal centerRate; + + /** 成本中心类型 */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 255,message = "成本中心类型长度不能超过255字") + private String centerType; + + /** 成本中心id */ + @NotBlank(message = "成本中心id不能为空") + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 50,message = "成本中心编码长度不能超过50字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 200,message = "成本中心名称长度不能超过200字") + private String centerName; + + /** 备注 */ + @Length(max = 600,message = "备注长度不能超过600字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 模板唯一健 */ + @Length(max = 200,message = "模板唯一健长度不能超过200字") + private String tmpUk; + + + public static TzcRebateCenter toNewObject(TzcRebateCenter source){ + TzcRebateCenter rebateCenter = new TzcRebateCenter(); + rebateCenter.setId(source.getId()); + rebateCenter.setRebateId(source.getRebateId()); + rebateCenter.setRebateSubjectId(source.getRebateSubjectId()); + rebateCenter.setSubjectId(source.getSubjectId()); + rebateCenter.setCenterAmount(source.getCenterAmount()); + rebateCenter.setCenterRate(source.getCenterRate()); + rebateCenter.setCenterType(source.getCenterType()); + rebateCenter.setCenterId(source.getCenterId()); + rebateCenter.setCenterCode(source.getCenterCode()); + rebateCenter.setCenterName(source.getCenterName()); + rebateCenter.setRemark(source.getRemark()); + rebateCenter.setCreateTime(source.getCreateTime()); + rebateCenter.setUpdateTime(source.getUpdateTime()); + rebateCenter.setTenantId(source.getTenantId()); + rebateCenter.setCreateBy(source.getCreateBy()); + rebateCenter.setUpdateBy(source.getUpdateBy()); + rebateCenter.setDelFlag(source.getDelFlag()); + rebateCenter.setTmpUk(source.getTmpUk()); + return rebateCenter; + } + +} + diff --git a/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateLevels.java b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateLevels.java new file mode 100644 index 0000000..427aa5f --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateLevels.java @@ -0,0 +1,75 @@ +package com.qs.serve.modules.tzc.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 2025-04-15 + */ +@Data +@TableName("tzc_rebate_levels") +public class TzcRebateLevels implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 返利id */ + @NotNull(message = "返利id不能为空") + private Long rebateId; + + /** 坎级数字 */ + @NotNull(message = "坎级数字不能为空") + private Integer levelNum; + + /** 条件类型:0-同期进货金额;1-区间目标金额 */ + @NotNull(message = "条件类型:0-同期进货金额;1-区间目标金额不能为空") + private Integer conditionType; + + /** 条件选择:0-百分比;1-固定金额 */ + @NotNull(message = "条件选择:0-百分比;1-固定金额不能为空") + private Integer conditionSelect; + + /** 满足条件的比例 */ + private BigDecimal conditionRate; + + /** 满足条件的金额 */ + private BigDecimal conditionAmount; + + /** 返利说明和计算例子 */ + @Length(max = 600,message = "返利说明和计算例子长度不能超过600字") + private String exampleRemark; + + + public static TzcRebateLevels toNewObject(TzcRebateLevels source){ + TzcRebateLevels rebateLevels = new TzcRebateLevels(); + rebateLevels.setId(source.getId()); + rebateLevels.setRebateId(source.getRebateId()); + rebateLevels.setLevelNum(source.getLevelNum()); + rebateLevels.setConditionType(source.getConditionType()); + rebateLevels.setConditionSelect(source.getConditionSelect()); + rebateLevels.setConditionRate(source.getConditionRate()); + rebateLevels.setConditionAmount(source.getConditionAmount()); + rebateLevels.setExampleRemark(source.getExampleRemark()); + return rebateLevels; + } + +} + diff --git a/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateLevelsArgument.java b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateLevelsArgument.java new file mode 100644 index 0000000..6d4103b --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateLevelsArgument.java @@ -0,0 +1,87 @@ +package com.qs.serve.modules.tzc.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 2025-04-15 + */ +@Data +@TableName("tzc_rebate_levels_argument") +public class TzcRebateLevelsArgument implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 坎级id */ + private Long levelId; + + /** 业务类型:返利;总目标;补偿 */ + @Length(max = 64,message = "业务类型:返利;总目标;补偿长度不能超过64字") + private String businessType; + + /** 补偿的期间id */ + private Long periodId; + + /** 目标销量维度:0-总量;1-增量 */ + private Integer sumAddFlag; + + /** 选择的策略:0-百分比;固定金额 */ + private Integer rateAmtFlag; + + /** 总量返利百分比 */ + private BigDecimal sumReturnRate; + + /** 总量返利固定金额 */ + private BigDecimal sumReturnFixed; + + /** 总量最高返利金额 */ + private BigDecimal sumMaxReturn; + + /** 增量返利百分比 */ + private BigDecimal addReturnRate; + + /** 增量返利固定金额 */ + private BigDecimal addReturnFixed; + + /** 增量最高返利金额 */ + private BigDecimal addMaxReturn; + + + public static TzcRebateLevelsArgument toNewObject(TzcRebateLevelsArgument source){ + TzcRebateLevelsArgument rebateLevelsArgument = new TzcRebateLevelsArgument(); + rebateLevelsArgument.setId(source.getId()); + rebateLevelsArgument.setLevelId(source.getLevelId()); + rebateLevelsArgument.setBusinessType(source.getBusinessType()); + rebateLevelsArgument.setPeriodId(source.getPeriodId()); + rebateLevelsArgument.setSumAddFlag(source.getSumAddFlag()); + rebateLevelsArgument.setRateAmtFlag(source.getRateAmtFlag()); + rebateLevelsArgument.setSumReturnRate(source.getSumReturnRate()); + rebateLevelsArgument.setSumReturnFixed(source.getSumReturnFixed()); + rebateLevelsArgument.setSumMaxReturn(source.getSumMaxReturn()); + rebateLevelsArgument.setAddReturnRate(source.getAddReturnRate()); + rebateLevelsArgument.setAddReturnFixed(source.getAddReturnFixed()); + rebateLevelsArgument.setAddMaxReturn(source.getAddMaxReturn()); + return rebateLevelsArgument; + } + +} + diff --git a/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateLevelsConfig.java b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateLevelsConfig.java new file mode 100644 index 0000000..744b7ed --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateLevelsConfig.java @@ -0,0 +1,73 @@ +package com.qs.serve.modules.tzc.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 2025-04-15 + */ +@Data +@TableName("tzc_rebate_levels_config") +public class TzcRebateLevelsConfig implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 返利id */ + @NotNull(message = "返利id不能为空") + private Long rebateId; + + /** 坎级数字 */ + @NotNull(message = "坎级数字不能为空") + private Integer levelNum; + + /** 条件类型:0-同期进货金额;1-区间目标金额 */ + private Integer conditionType; + + /** 条件选择:0-百分比;1-固定金额 */ + private Integer conditionSelect; + + /** 满足条件的比例 */ + private BigDecimal conditionRate; + + /** 满足条件的金额 */ + private BigDecimal conditionAmount; + + /** 返利说明和计算例子 */ + @Length(max = 600,message = "返利说明和计算例子长度不能超过600字") + private String exampleRemark; + + + public static TzcRebateLevelsConfig toNewObject(TzcRebateLevelsConfig source){ + TzcRebateLevelsConfig rebateLevelsConfig = new TzcRebateLevelsConfig(); + rebateLevelsConfig.setId(source.getId()); + rebateLevelsConfig.setRebateId(source.getRebateId()); + rebateLevelsConfig.setLevelNum(source.getLevelNum()); + rebateLevelsConfig.setConditionType(source.getConditionType()); + rebateLevelsConfig.setConditionSelect(source.getConditionSelect()); + rebateLevelsConfig.setConditionRate(source.getConditionRate()); + rebateLevelsConfig.setConditionAmount(source.getConditionAmount()); + rebateLevelsConfig.setExampleRemark(source.getExampleRemark()); + return rebateLevelsConfig; + } + +} + diff --git a/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebatePeriod.java b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebatePeriod.java new file mode 100644 index 0000000..018b827 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebatePeriod.java @@ -0,0 +1,101 @@ +package com.qs.serve.modules.tzc.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 2025-04-15 + */ +@Data +@TableName("tzc_rebate_period") +public class TzcRebatePeriod implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 返利id */ + private Long rebateId; + + /** 适用期间标题 */ + @Length(max = 64,message = "适用期间标题长度不能超过64字") + private String periodTitle; + + /** 开始时间 */ + @Length(max = 0,message = "开始时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime periodStartDate; + + /** 结束时间 */ + @Length(max = 0,message = "结束时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime periodEndDate; + + /** 区间目标金额 */ + private BigDecimal periodAmount; + + /** 同期进货金额 */ + private BigDecimal samePeriodAmount; + + /** 总目标达标补偿 */ + private Integer compensationFlag; + + /** 基于目标销量金额:0-总理;1-增量 */ + private Integer sumAddFlag; + + /** 选择的策略:0-基于比例;基于固定金额 */ + private Integer rateAmtFlag; + + /** 总量百分比 */ + private BigDecimal sumRateVal; + + /** 总量固定金额 */ + private BigDecimal sumAmtVal; + + /** 增量百分比 */ + private BigDecimal addRateVal; + + /** 增量固定金额 */ + private BigDecimal addAmtVal; + + + public static TzcRebatePeriod toNewObject(TzcRebatePeriod source){ + TzcRebatePeriod rebatePeriod = new TzcRebatePeriod(); + rebatePeriod.setId(source.getId()); + rebatePeriod.setRebateId(source.getRebateId()); + rebatePeriod.setPeriodTitle(source.getPeriodTitle()); + rebatePeriod.setPeriodStartDate(source.getPeriodStartDate()); + rebatePeriod.setPeriodEndDate(source.getPeriodEndDate()); + rebatePeriod.setPeriodAmount(source.getPeriodAmount()); + rebatePeriod.setSamePeriodAmount(source.getSamePeriodAmount()); + rebatePeriod.setCompensationFlag(source.getCompensationFlag()); + rebatePeriod.setSumAddFlag(source.getSumAddFlag()); + rebatePeriod.setRateAmtFlag(source.getRateAmtFlag()); + rebatePeriod.setSumRateVal(source.getSumRateVal()); + rebatePeriod.setSumAmtVal(source.getSumAmtVal()); + rebatePeriod.setAddRateVal(source.getAddRateVal()); + rebatePeriod.setAddAmtVal(source.getAddAmtVal()); + return rebatePeriod; + } + +} + diff --git a/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateSubject.java b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateSubject.java new file mode 100644 index 0000000..e35f554 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-api/src/main/java/com/qs/serve/modules/tzc/entity/TzcRebateSubject.java @@ -0,0 +1,119 @@ +package com.qs.serve.modules.tzc.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 2025-04-15 + */ +@Data +@TableName("tzc_rebate_subject") +public class TzcRebateSubject implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long rebateId; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** 科目比例 */ + private BigDecimal subjectRate; + + /** 科目额度 */ + @NotNull(message = "科目额度不能为空") + private BigDecimal subjectAmount; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 前端用于绑定模板id */ + @Length(max = 255,message = "前端用于绑定模板id长度不能超过255字") + private String tmpUk; + + + public static TzcRebateSubject toNewObject(TzcRebateSubject source){ + TzcRebateSubject rebateSubject = new TzcRebateSubject(); + rebateSubject.setId(source.getId()); + rebateSubject.setRebateId(source.getRebateId()); + rebateSubject.setSubjectId(source.getSubjectId()); + rebateSubject.setSubjectCode(source.getSubjectCode()); + rebateSubject.setSubjectName(source.getSubjectName()); + rebateSubject.setSubjectRate(source.getSubjectRate()); + rebateSubject.setSubjectAmount(source.getSubjectAmount()); + rebateSubject.setRemark(source.getRemark()); + rebateSubject.setCreateTime(source.getCreateTime()); + rebateSubject.setUpdateTime(source.getUpdateTime()); + rebateSubject.setTenantId(source.getTenantId()); + rebateSubject.setCreateBy(source.getCreateBy()); + rebateSubject.setUpdateBy(source.getUpdateBy()); + rebateSubject.setDelFlag(source.getDelFlag()); + rebateSubject.setTmpUk(source.getTmpUk()); + return rebateSubject; + } + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/pom.xml b/cms-modules/cms-policy/cms-policy-bus/pom.xml new file mode 100644 index 0000000..15f05ca --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/pom.xml @@ -0,0 +1,33 @@ + + + + cms-policy + com.qs + 1.0-SNAPSHOT + + 4.0.0 + + jar + cms-policy-bus + + + 8 + 8 + + + + + com.qs + cms-policy-api + 1.0-SNAPSHOT + + + com.qs + cms-framework + 1.0-SNAPSHOT + + + + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/controller/TzcRebateController.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/controller/TzcRebateController.java new file mode 100644 index 0000000..fd7a51d --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/controller/TzcRebateController.java @@ -0,0 +1,121 @@ +package com.qs.serve.modules.tzc.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tzc.entity.TzcRebate; +import com.qs.serve.modules.tzc.service.TzcRebateService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 政策 返利信息 + * @author YenHex + * @since 2025-04-15 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tzc/rebate") +public class TzcRebateController { + + private TzcRebateService tzcRebateService; + + /** + * 列表 + * @param param + * @return + */ + //@GetMapping("/list") + //@PreAuthorize("hasRole('tzc:rebate:query')") + public R> getList(TzcRebate param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = tzcRebateService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + //@GetMapping("/page") + //@PreAuthorize("hasRole('tzc:rebate:query')") + public R> getPage(TzcRebate param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = tzcRebateService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + //@GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Policy, title = "返利信息", biz = BizType.QUERY) + @PreAuthorize("hasRole('tzc:rebate:query')") + public R getById(@PathVariable("id") String id){ + TzcRebate tzcRebate = tzcRebateService.getById(id); + return R.ok(tzcRebate); + } + + + + /** + * 更新 + * @param param + * @return + */ + //@PostMapping("/updateById") + @SysLog(module = SystemModule.Policy, title = "返利信息", biz = BizType.UPDATE) + //@PreAuthorize("hasRole('tzc:rebate:update')") + public R updateById(@RequestBody @Valid TzcRebateBo param){ + TzcRebate entity = CopierUtil.copy(param,new TzcRebate()); + boolean result = tzcRebateService.updateById(entity); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + //@PostMapping("/save") + @SysLog(module = SystemModule.Policy, title = "返利信息", biz = BizType.INSERT) + //@PreAuthorize("hasRole('tzc:rebate:insert')") + public R save(@RequestBody @Valid TzcRebateBo param){ + TzcRebate entity = CopierUtil.copy(param,new TzcRebate()); + boolean result = tzcRebateService.save(entity); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.Policy, title = "返利信息", biz = BizType.DELETE) + //@PreAuthorize("hasRole('tzc:rebate:delete')") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = tzcRebateService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebateCenterMapper.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebateCenterMapper.java new file mode 100644 index 0000000..a6e78d2 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebateCenterMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tzc.entity.TzcRebateCenter; + +/** + * 活动成本中心项 Mapper + * @author YenHex + * @date 2025-04-15 + */ +public interface TzcRebateCenterMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebateLevelsArgumentMapper.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebateLevelsArgumentMapper.java new file mode 100644 index 0000000..f5b92c8 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebateLevelsArgumentMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tzc.entity.TzcRebateLevelsArgument; + +/** + * 返利坎级参数 Mapper + * @author YenHex + * @date 2025-04-15 + */ +public interface TzcRebateLevelsArgumentMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebateLevelsConfigMapper.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebateLevelsConfigMapper.java new file mode 100644 index 0000000..281cd00 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebateLevelsConfigMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tzc.entity.TzcRebateLevelsConfig; + +/** + * 返利坎级 Mapper + * @author YenHex + * @date 2025-04-15 + */ +public interface TzcRebateLevelsConfigMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebateLevelsMapper.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebateLevelsMapper.java new file mode 100644 index 0000000..cf3871d --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebateLevelsMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tzc.entity.TzcRebateLevels; + +/** + * 返利坎级 Mapper + * @author YenHex + * @date 2025-04-15 + */ +public interface TzcRebateLevelsMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebateMapper.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebateMapper.java new file mode 100644 index 0000000..27f688b --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebateMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tzc.entity.TzcRebate; + +/** + * 返利信息 Mapper + * @author YenHex + * @date 2025-04-15 + */ +public interface TzcRebateMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebatePeriodMapper.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebatePeriodMapper.java new file mode 100644 index 0000000..e88f6a7 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebatePeriodMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tzc.entity.TzcRebatePeriod; + +/** + * 返利适用期间 Mapper + * @author YenHex + * @date 2025-04-15 + */ +public interface TzcRebatePeriodMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebateSubjectMapper.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebateSubjectMapper.java new file mode 100644 index 0000000..6d29e40 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/mapper/TzcRebateSubjectMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tzc.entity.TzcRebateSubject; + +/** + * 活动科目项 Mapper + * @author YenHex + * @date 2025-04-15 + */ +public interface TzcRebateSubjectMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/package-info.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/package-info.java new file mode 100644 index 0000000..0c21101 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/package-info.java @@ -0,0 +1 @@ +package com.qs.serve.modules.tzc; diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateCenterService.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateCenterService.java new file mode 100644 index 0000000..e2158cf --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateCenterService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tzc.entity.TzcRebateCenter; + +/** + * 活动成本中心项 服务接口 + * @author YenHex + * @date 2025-04-15 + */ +public interface TzcRebateCenterService extends IService { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateLevelsArgumentService.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateLevelsArgumentService.java new file mode 100644 index 0000000..0166735 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateLevelsArgumentService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tzc.entity.TzcRebateLevelsArgument; + +/** + * 返利坎级参数 服务接口 + * @author YenHex + * @date 2025-04-15 + */ +public interface TzcRebateLevelsArgumentService extends IService { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateLevelsConfigService.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateLevelsConfigService.java new file mode 100644 index 0000000..1698435 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateLevelsConfigService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tzc.entity.TzcRebateLevelsConfig; + +/** + * 返利坎级 服务接口 + * @author YenHex + * @date 2025-04-15 + */ +public interface TzcRebateLevelsConfigService extends IService { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateLevelsService.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateLevelsService.java new file mode 100644 index 0000000..96628c1 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateLevelsService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tzc.entity.TzcRebateLevels; + +/** + * 返利坎级 服务接口 + * @author YenHex + * @date 2025-04-15 + */ +public interface TzcRebateLevelsService extends IService { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebatePeriodService.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebatePeriodService.java new file mode 100644 index 0000000..ca636e9 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebatePeriodService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tzc.entity.TzcRebatePeriod; + +/** + * 返利适用期间 服务接口 + * @author YenHex + * @date 2025-04-15 + */ +public interface TzcRebatePeriodService extends IService { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateService.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateService.java new file mode 100644 index 0000000..ce1e079 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tzc.entity.TzcRebate; + +/** + * 返利信息 服务接口 + * @author YenHex + * @date 2025-04-15 + */ +public interface TzcRebateService extends IService { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateSubjectService.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateSubjectService.java new file mode 100644 index 0000000..a12b261 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/TzcRebateSubjectService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tzc.entity.TzcRebateSubject; + +/** + * 活动科目项 服务接口 + * @author YenHex + * @date 2025-04-15 + */ +public interface TzcRebateSubjectService extends IService { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateCenterServiceImpl.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateCenterServiceImpl.java new file mode 100644 index 0000000..976e057 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateCenterServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tzc.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tzc.entity.TzcRebateCenter; +import com.qs.serve.modules.tzc.service.TzcRebateCenterService; +import com.qs.serve.modules.tzc.mapper.TzcRebateCenterMapper; + +/** + * 活动成本中心项 服务实现类 + * @author YenHex + * @since 2025-04-15 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TzcRebateCenterServiceImpl extends ServiceImpl implements TzcRebateCenterService { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateLevelsArgumentServiceImpl.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateLevelsArgumentServiceImpl.java new file mode 100644 index 0000000..3c0eff5 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateLevelsArgumentServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tzc.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tzc.entity.TzcRebateLevelsArgument; +import com.qs.serve.modules.tzc.service.TzcRebateLevelsArgumentService; +import com.qs.serve.modules.tzc.mapper.TzcRebateLevelsArgumentMapper; + +/** + * 返利坎级参数 服务实现类 + * @author YenHex + * @since 2025-04-15 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TzcRebateLevelsArgumentServiceImpl extends ServiceImpl implements TzcRebateLevelsArgumentService { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateLevelsConfigServiceImpl.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateLevelsConfigServiceImpl.java new file mode 100644 index 0000000..e697377 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateLevelsConfigServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tzc.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tzc.entity.TzcRebateLevelsConfig; +import com.qs.serve.modules.tzc.service.TzcRebateLevelsConfigService; +import com.qs.serve.modules.tzc.mapper.TzcRebateLevelsConfigMapper; + +/** + * 返利坎级 服务实现类 + * @author YenHex + * @since 2025-04-15 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TzcRebateLevelsConfigServiceImpl extends ServiceImpl implements TzcRebateLevelsConfigService { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateLevelsServiceImpl.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateLevelsServiceImpl.java new file mode 100644 index 0000000..113dc20 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateLevelsServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tzc.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tzc.entity.TzcRebateLevels; +import com.qs.serve.modules.tzc.service.TzcRebateLevelsService; +import com.qs.serve.modules.tzc.mapper.TzcRebateLevelsMapper; + +/** + * 返利坎级 服务实现类 + * @author YenHex + * @since 2025-04-15 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TzcRebateLevelsServiceImpl extends ServiceImpl implements TzcRebateLevelsService { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebatePeriodServiceImpl.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebatePeriodServiceImpl.java new file mode 100644 index 0000000..b2e4365 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebatePeriodServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tzc.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tzc.entity.TzcRebatePeriod; +import com.qs.serve.modules.tzc.service.TzcRebatePeriodService; +import com.qs.serve.modules.tzc.mapper.TzcRebatePeriodMapper; + +/** + * 返利适用期间 服务实现类 + * @author YenHex + * @since 2025-04-15 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TzcRebatePeriodServiceImpl extends ServiceImpl implements TzcRebatePeriodService { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateServiceImpl.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateServiceImpl.java new file mode 100644 index 0000000..7db56a8 --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tzc.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tzc.entity.TzcRebate; +import com.qs.serve.modules.tzc.service.TzcRebateService; +import com.qs.serve.modules.tzc.mapper.TzcRebateMapper; + +/** + * 返利信息 服务实现类 + * @author YenHex + * @since 2025-04-15 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TzcRebateServiceImpl extends ServiceImpl implements TzcRebateService { + +} + diff --git a/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateSubjectServiceImpl.java b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateSubjectServiceImpl.java new file mode 100644 index 0000000..ecd3e7e --- /dev/null +++ b/cms-modules/cms-policy/cms-policy-bus/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcRebateSubjectServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tzc.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tzc.entity.TzcRebateSubject; +import com.qs.serve.modules.tzc.service.TzcRebateSubjectService; +import com.qs.serve.modules.tzc.mapper.TzcRebateSubjectMapper; + +/** + * 活动科目项 服务实现类 + * @author YenHex + * @since 2025-04-15 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TzcRebateSubjectServiceImpl extends ServiceImpl implements TzcRebateSubjectService { + +} + diff --git a/cms-modules/cms-policy/pom.xml b/cms-modules/cms-policy/pom.xml new file mode 100644 index 0000000..e30445b --- /dev/null +++ b/cms-modules/cms-policy/pom.xml @@ -0,0 +1,24 @@ + + + + cms-modules + com.qs + 1.0-SNAPSHOT + + 4.0.0 + + pom + + cms-policy-api + cms-policy-bus + + cms-policy + + + 8 + 8 + + + diff --git a/cms-modules/cms-system/pom.xml b/cms-modules/cms-system/pom.xml new file mode 100644 index 0000000..bfaae73 --- /dev/null +++ b/cms-modules/cms-system/pom.xml @@ -0,0 +1,28 @@ + + + + cms-modules + com.qs + 1.0-SNAPSHOT + + 4.0.0 + + jar + cms-system + + + 8 + 8 + + + + + com.qs + cms-framework + 1.0-SNAPSHOT + + + + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/base/ErpDataBaseService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/base/ErpDataBaseService.java new file mode 100644 index 0000000..e96802d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/base/ErpDataBaseService.java @@ -0,0 +1,40 @@ +package com.qs.serve.modules.base; + +import cn.hutool.crypto.digest.DigestUtil; +import com.qs.serve.common.config.properties.QiShengDsProperties; +import com.qs.serve.common.util.HttpUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +/** + * @author YenHex + * @since 2024/1/26 + */ +@Slf4j +@Service +public class ErpDataBaseService { + + @Autowired + private QiShengDsProperties qiShengDsProperties; + + public static String erpJslGroupDbConnectionUrl; + + public static String getErpJslGroupDbConnectionUrl(){ + return erpJslGroupDbConnectionUrl; + } + + @PostConstruct + public void initErpJslGroupDbConnectionUrl() { + log.warn("数据库加载... ErpJslGroupDbConnectionUrl:{}",erpJslGroupDbConnectionUrl); + erpJslGroupDbConnectionUrl = qiShengDsProperties.getUrl() + + ";user=" + qiShengDsProperties.getUsername() + + ";password=" + qiShengDsProperties.getPassword(); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/base/TencentYunSmsService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/base/TencentYunSmsService.java new file mode 100644 index 0000000..5464a0c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/base/TencentYunSmsService.java @@ -0,0 +1,74 @@ +package com.qs.serve.modules.base; + +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; +import com.tencentcloudapi.sms.v20210111.SmsClient; +import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest; +import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +/** + * @author YenHex + * @since 2022/9/20 + */ +@Service +public class TencentYunSmsService { + + @Value("${tencent.sms.secret-id}") + private String secretId; + + @Value("${tencent.sms.secret-key}") + private String secretKey; + + @Value("${tencent.sms.sdkAppId}") + private String sdkAppId; + + @Value("${tencent.sms.signName}") + private String signName; + + @Value("${tencent.sms.templateId}") + private String templateId; + + public void send(String phone,String code) { + Credential cred = new Credential(secretId, secretKey); + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setReqMethod("POST"); + httpProfile.setConnTimeout(60); + /* 指定接入地域域名,默认就近地域接入域名为 sms.tencentcloudapi.com ,也支持指定地域域名访问,例如广州地域的域名为 sms.ap-guangzhou.tencentcloudapi.com */ + httpProfile.setEndpoint("sms.ap-guangzhou.tencentcloudapi.com"); + + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setSignMethod("HmacSHA256"); + clientProfile.setHttpProfile(httpProfile); + SmsClient client = new SmsClient(cred, "ap-guangzhou",clientProfile); + SendSmsRequest req = new SendSmsRequest(); + + req.setSmsSdkAppId(sdkAppId); + + req.setSignName(signName); + + req.setTemplateId(templateId); + + // 调整短信模板 + String[] templateParamSet = {code}; + req.setTemplateParamSet(templateParamSet); + + String[] phoneNumberSet = {"+86"+phone}; + req.setPhoneNumberSet(phoneNumberSet); + + SendSmsResponse res = null; + try { + res = client.SendSms(req); + // 输出json格式的字符串回包 + System.out.println(SendSmsResponse.toJsonString(res)); + } catch (TencentCloudSDKException e) { + e.printStackTrace(); + } + + } + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/base/TianYiYunSmsService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/base/TianYiYunSmsService.java new file mode 100644 index 0000000..ac60cc6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/base/TianYiYunSmsService.java @@ -0,0 +1,48 @@ +package com.qs.serve.modules.base; + +import cn.hutool.crypto.digest.DigestUtil; +import com.qs.serve.common.util.HttpUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +/** + * @author YenHex + * @since 2024/1/26 + */ +@Slf4j +@Service +public class TianYiYunSmsService { + + private final String url = "http://sms.189ek.com/yktsms/send?"; + + @Value("${tianyi.sms.appid}") + private String appId; + + @Value("${tianyi.sms.appKey}") + private String appKey; + + public void send(String phone,String code){ + //需要发送的手机号(多个号码以英文逗号 “,”分隔) 一次性最多 100 个号码 + String mobiles = phone; + String content = "【嘉士利】验证码"+code; + String sign = DigestUtil.md5Hex(appId+mobiles+content+appKey); + try { + String msg = URLEncoder.encode(content,"utf-8"); + String params = "appid="+ appId + + "&mobile="+ mobiles + + "&msg=" + msg + + "&sign=" + sign + + "&extPort="; + String result = HttpUtil.doPost(url+params,"{}",null); + log.debug("sms result = > {}",result); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/base/controller/JslApiController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/base/controller/JslApiController.java new file mode 100644 index 0000000..77e40bd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/base/controller/JslApiController.java @@ -0,0 +1,115 @@ +package com.qs.serve.modules.base.controller; + +import cn.hutool.crypto.SecureUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.consts.GySysConst; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.ValidateTools; +import com.qs.serve.modules.bms.entity.bo.BmsSupplierBatchBo; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.goods.entity.bo.GoodsSpuBatchTasteBo; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.entity.bo.SysUserBatchBo; +import com.qs.serve.modules.sys.entity.bo.SysUserBo; +import com.qs.serve.modules.sys.service.SysRoleService; +import com.qs.serve.modules.sys.service.SysUserSalesService; +import com.qs.serve.modules.sys.service.SysUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; + +import javax.validation.Valid; + +/** + * 【嘉士利对接】 + * @author YenHex + * @since 2022/10/28 + */ +@Slf4j +@AllArgsConstructor +//@RestController +//@RequestMapping("/jsl") +public class JslApiController { + + private SysUserService sysUserService; + private SysRoleService sysRoleService; + private BmsSupplierService bmsSupplierService; + private SysUserSalesService sysUserSalesService; + private GoodsSpuService goodsSpuService; + + /** + * 客户档案 + * @param param + * @return + */ + //@PostMapping("/supplier/editBatch") + //@SysLog(module = SystemModule.BASE, title = "供应商", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:supplier:insert')") + public R editBatch(@RequestBody @Valid BmsSupplierBatchBo param){ + bmsSupplierService.editBatch(param); + return R.ok(); + } + + + + /** + * 业务员档案 + * @param batchBo + * @return + */ + //@SysLog(title = "人员",desc = "用户新增",biz = BizType.INSERT) + //@PostMapping("/user/editBatch") + //@PreAuthorize("hasRole('sys:user:insert')") + @Transactional(rollbackFor = Exception.class) + public R saveBatch(@RequestBody @Valid SysUserBatchBo batchBo){ + for (SysUserBo userBo : batchBo.getUserList()) { + SysUser dbData = sysUserService.getById(userBo.getId()); + SysUser param = CopierUtil.copy(userBo,dbData==null?new SysUser():dbData); + //设置普通管理员 + param.setSuperFlag(0); + param.setTenantId(AuthContextUtils.getTenant()); + param.setAccount(param.getMobile()); + param.setPassword(SecureUtil.md5(GySysConst.DEFAULT_PASSWORD)); + if(param.getMobile()!=null){ + param.setAccount(param.getMobile()); + } + //检查手机号是否已用 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.ne(SysUser::getId,userBo.getId()); + wrapper.eq(SysUser::getMobile,param.getMobile()); + Long count = sysUserService.count(wrapper); + if(count>0L){ + return R.error("手机号已被注册"); + } + if(dbData == null){ + sysUserService.save(param); + }else { + sysUserService.updateById(param); + } +// if(param.getId()!=null&& com.qs.serve.common.util.CollectionUtil.isNotEmpty(userBo.getRoleIds())){ +// sysRoleService.saveUserRole4Edit(userBo.getRoleIds(),param.getId()); +// } + } + return R.ok(); + } + + + /** + * (批量)编辑口味品类SPU,建议每次小于50条 + * @param param + * @return + */ + //@PostMapping("/saveBatchTasteSpu") + //@SysLog(module = SystemModule.GOODS, title = "spu", biz = BizType.INSERT) + //@PreAuthorize("hasRole('goods:spu:insert')") + public R saveBatchTasteSpu(@RequestBody GoodsSpuBatchTasteBo param){ + ValidateTools.valid(param.getTasteProducts()); + return R.ok(goodsSpuService.saveBatchTasteSpu(param)); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/common/BazTargetTypeConsts.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/common/BazTargetTypeConsts.java new file mode 100644 index 0000000..5ea69fc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/common/BazTargetTypeConsts.java @@ -0,0 +1,12 @@ +package com.qs.serve.modules.baz.common; + +/** + * @author YenHex + * @since 2023/4/7 + */ +public interface BazTargetTypeConsts { + + String POINT = "point"; + String CUSTOMER = "customer"; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/controller/BazVisitController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/controller/BazVisitController.java new file mode 100644 index 0000000..72bbd9c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/controller/BazVisitController.java @@ -0,0 +1,148 @@ +package com.qs.serve.modules.baz.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.baz.entity.BazVisitFlow; +import com.qs.serve.modules.baz.service.BazVisitFlowService; +import com.qs.serve.modules.bms.entity.BmsSupplierVisitForm; +import com.qs.serve.modules.bms.service.BmsSupplierVisitFormService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.baz.entity.BazVisit; +import com.qs.serve.modules.baz.service.BazVisitService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 拜访模块 拜访 + * @author YenHex + * @since 2023-04-07 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("baz/visit") +public class BazVisitController { + + private BazVisitService bazVisitService; + + private BazVisitFlowService bazVisitFlowService; + + private BmsSupplierVisitFormService bmsSupplierVisitFormService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(BazVisit param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = bazVisitService.list(lqw); + return R.ok(list); + } + + + /** + * 获取第一个流程 + * @param visitId + * @return + */ + @GetMapping("/getFirstFlow/{visitId}") + @SysLog(module = SystemModule.BAZ, title = "拜访流程", biz = BizType.QUERY) + public R getFirstFlow(@PathVariable("visitId") String visitId){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BazVisitFlow::getFlowSort,1); + lqw.eq(BazVisitFlow::getVisitId,visitId); + BazVisitFlow bazVisitFlow = bazVisitFlowService.getOne(lqw,false); + if(bazVisitFlow.getFormId()!=null&&!bazVisitFlow.getFormId().equals(0L)){ + BmsSupplierVisitForm visitForm = bmsSupplierVisitFormService.getById(bazVisitFlow.getFormId()); + bazVisitFlow.setFormInfo(visitForm); + }else { + bazVisitFlow.setFormId(null); + } + return R.ok(bazVisitFlow); + } + + /** + * 翻页 + * @param param + * @return + */ + //@GetMapping("/page") + @PreAuthorize("hasRole('baz:visit:query')") + public R> getPage(BazVisit param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = bazVisitService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + //@GetMapping("/getById/{id}") + //@SysLog(module = SystemModule.BAZ, title = "拜访", biz = BizType.QUERY) + @PreAuthorize("hasRole('baz:visit:query')") + public R getById(@PathVariable("id") String id){ + BazVisit bazVisit = bazVisitService.getById(id); + return R.ok(bazVisit); + } + + + + /** + * 更新 + * @param param + * @return + */ + //@PostMapping("/updateById") + @SysLog(module = SystemModule.BAZ, title = "拜访", biz = BizType.UPDATE) + @PreAuthorize("hasRole('baz:visit:update')") + public R updateById(@RequestBody @Valid BazVisit param){ + boolean result = bazVisitService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + //@PostMapping("/save") + @SysLog(module = SystemModule.BAZ, title = "拜访", biz = BizType.INSERT) + @PreAuthorize("hasRole('baz:visit:insert')") + public R save(@RequestBody @Valid BazVisit param){ + boolean result = bazVisitService.save(param); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + //@DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BAZ, title = "拜访", biz = BizType.DELETE) + @PreAuthorize("hasRole('baz:visit:delete')") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = bazVisitService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/controller/BazVisitFlowController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/controller/BazVisitFlowController.java new file mode 100644 index 0000000..4628a1b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/controller/BazVisitFlowController.java @@ -0,0 +1,153 @@ +package com.qs.serve.modules.baz.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.baz.entity.bo.BazVisitFlowSortBo; +import com.qs.serve.modules.bms.entity.BmsSupplierVisitForm; +import com.qs.serve.modules.bms.service.BmsSupplierVisitFormService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.baz.entity.so.BazVisitFlowSo; +import com.qs.serve.modules.baz.entity.bo.BazVisitFlowBo; +import com.qs.serve.modules.baz.entity.BazVisitFlow; +import com.qs.serve.modules.baz.service.BazVisitFlowService; + +import javax.validation.Valid; +import java.util.Comparator; +import java.util.List; + +/** + * 拜访模块 拜访流程 + * @author YenHex + * @since 2023-04-07 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("baz/visitFlow") +public class BazVisitFlowController { + + private BazVisitFlowService bazVisitFlowService; + private BmsSupplierVisitFormService visitFormService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(BazVisitFlowSo param){ + BazVisitFlow entity = CopierUtil.copy(param,new BazVisitFlow()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + lqw.orderByAsc(BazVisitFlow::getFlowSort); + List list = bazVisitFlowService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BazVisitFlowSo param){ + BazVisitFlow entity = CopierUtil.copy(param,new BazVisitFlow()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + PageUtil.startPage(); + lqw.orderByAsc(BazVisitFlow::getFlowSort); + List list = bazVisitFlowService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BAZ, title = "拜访流程", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + BazVisitFlow bazVisitFlow = bazVisitFlowService.getById(id); + if(bazVisitFlow.getFormId()!=null&&!bazVisitFlow.getFormId().equals(0L)){ + BmsSupplierVisitForm visitForm = visitFormService.getById(bazVisitFlow.getFormId()); + bazVisitFlow.setFormInfo(visitForm); + }else { + bazVisitFlow.setFormId(null); + } + return R.ok(bazVisitFlow); + } + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BAZ, title = "拜访流程", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid BazVisitFlowBo param){ + if(param.getId()==null){ + return R.error2(); + } + bazVisitFlowService.modify(param); + return R.ok(); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BAZ, title = "拜访流程", biz = BizType.INSERT) + public R save(@RequestBody @Valid BazVisitFlowBo param){ + param.setId(null); + BazVisitFlow visitFlow = bazVisitFlowService.modify(param); + return R.ok(visitFlow); + } + + /** + * 更新排序 + * @param param + * @return + */ + @PostMapping("/sort") + @SysLog(module = SystemModule.BAZ, title = "拜访流程", biz = BizType.INSERT) + public R sort(@RequestBody @Valid BazVisitFlowSortBo param){ + List items = param.getSortValues(); + items.sort(Comparator.comparingInt(BazVisitFlowSortBo.Item::getSortValue)); + for (int i = 0; i < items.size(); i++) { + BazVisitFlowSortBo.Item item = items.get(i); + BazVisitFlow visitFlow = new BazVisitFlow(); + visitFlow.setId(item.getId()); + visitFlow.setFlowSort(i+1); + bazVisitFlowService.updateById(visitFlow); + } + return R.ok(); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BAZ, title = "拜访流程", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = bazVisitFlowService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/controller/BazVisitInstanceController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/controller/BazVisitInstanceController.java new file mode 100644 index 0000000..a83d655 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/controller/BazVisitInstanceController.java @@ -0,0 +1,160 @@ +package com.qs.serve.modules.baz.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.baz.entity.BazVisitInstanceFlow; +import com.qs.serve.modules.baz.service.BazVisitInstanceFlowService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.baz.entity.so.BazVisitInstanceSo; +import com.qs.serve.modules.baz.entity.BazVisitInstance; +import com.qs.serve.modules.baz.service.BazVisitInstanceService; + +import javax.validation.Valid; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 拜访模块 拜访实例 + * @author YenHex + * @since 2023-04-07 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("baz/visitInstance") +public class BazVisitInstanceController { + + private BazVisitInstanceService bazVisitInstanceService; + private BazVisitInstanceFlowService bazVisitInstanceFlowService; + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BazVisitInstanceSo param){ + BazVisitInstance query = CopierUtil.copy(param,new BazVisitInstance()); + if(param.getQueryStartDate()!=null){ + query.setQueryStartDate(param.getQueryStartDate().atStartOfDay()); + } + if(param.getQueryEndDate()!=null){ + query.setQueryEndDate(param.getQueryEndDate().atTime(23,59,59)); + } + PageUtil.startPage(); + List list = bazVisitInstanceService.selectBazVisitInstanceList(query); + return R.byPageHelperList(list); + } + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(BazVisitInstanceSo param){ + BazVisitInstance query = CopierUtil.copy(param,new BazVisitInstance()); + if(param.getQueryStartDate()!=null){ + query.setQueryStartDate(param.getQueryStartDate().atStartOfDay()); + } + if(param.getQueryEndDate()!=null){ + query.setQueryEndDate(param.getQueryEndDate().atTime(23,59,59)); + } + List list = bazVisitInstanceService.selectBazVisitInstanceList(query); + + if(param.getLoadFlowList()!=null&¶m.getLoadFlowList().equals(1)){ + List ids = list.stream().map(BazVisitInstance::getId).collect(Collectors.toList()); + ids.add(-1L); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(BazVisitInstanceFlow::getVisitInstanceId,ids); + List allFlowList = bazVisitInstanceFlowService.list(lqw); + Map> flowListGroupByVisitInstanceId = allFlowList.stream() + .collect(Collectors.groupingBy(BazVisitInstanceFlow::getVisitInstanceId)); + for (BazVisitInstance instance : list) { + List fl = flowListGroupByVisitInstanceId.get(instance.getId()); + instance.setFlowList(fl); + } + } + return R.ok(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BAZ, title = "拜访实例", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + BazVisitInstance bazVisitInstance = bazVisitInstanceService.getById(id); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BazVisitInstanceFlow::getVisitInstanceId,id); + List flowList = bazVisitInstanceFlowService.list(lqw); + bazVisitInstance.setFlowList(flowList); + return R.ok(bazVisitInstance); + } + + /** + * ID查询(流程项) + * @param id + * @return + */ + @GetMapping("/getByFlowId/{id}") + public R getByFlowId(@PathVariable("id") String id){ + BazVisitInstanceFlow instanceFlow = bazVisitInstanceFlowService.getById(id); + BazVisitInstance visitInstance = bazVisitInstanceService.getById(instanceFlow.getVisitInstanceId()); + instanceFlow.setInstanceMainInfo(visitInstance); + return R.ok(instanceFlow); + } + + + /** + * 更新 + * @param param + * @return + */ + //@PostMapping("/updateById") + @SysLog(module = SystemModule.BAZ, title = "拜访实例", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid BazVisitInstance param){ + boolean result = bazVisitInstanceService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + //@PostMapping("/save") + @SysLog(module = SystemModule.BAZ, title = "拜访实例", biz = BizType.INSERT) + public R save(@RequestBody @Valid BazVisitInstance param){ + boolean result = bazVisitInstanceService.save(param); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BAZ, title = "拜访实例", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = bazVisitInstanceService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/controller/my/BazMyVisitInstanceController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/controller/my/BazMyVisitInstanceController.java new file mode 100644 index 0000000..a36d586 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/controller/my/BazMyVisitInstanceController.java @@ -0,0 +1,231 @@ +package com.qs.serve.modules.baz.controller.my; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.baz.entity.BazVisit; +import com.qs.serve.modules.baz.entity.BazVisitInstance; +import com.qs.serve.modules.baz.entity.bo.BazCreateVisitInstanceBo; +import com.qs.serve.modules.baz.entity.bo.BazVisitInstanceFlowBo; +import com.qs.serve.modules.baz.entity.so.BazVisitInstanceSo; +import com.qs.serve.modules.baz.service.BazVisitInstanceService; +import com.qs.serve.modules.baz.service.BazVisitService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.service.SysPostUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.time.LocalDate; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 拜访模块 拜访实例(我的) + * @author YenHex + * @since 2023-04-07 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("baz/myVisitInstance") +public class BazMyVisitInstanceController { + + private BazVisitInstanceService bazVisitInstanceService; + private BazVisitService visitService; + private SysPostUserService postUserService; + + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BazVisitInstanceSo param){ + BazVisitInstance entity = CopierUtil.copy(param,new BazVisitInstance()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + if(param.getQueryStartDate()!=null){ + lqw.ge(BazVisitInstance::getCreateTime,param.getQueryStartDate()); + } + if(param.getQueryEndDate()!=null){ + lqw.le(BazVisitInstance::getCreateTime,param.getQueryEndDate().atTime(23,59,59)); + } + PageUtil.startPage(); + lqw.eq(BazVisitInstance::getVisitorId, AuthContextUtils.getSysUserId()); + lqw.orderByDesc(BazVisitInstance::getCreateTime); + List list = bazVisitInstanceService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * 翻页(我的部下) + * @param param + * @return + */ + @GetMapping("/page4Under") + public R> page4Under(BazVisitInstanceSo param){ + BazVisitInstance entity = CopierUtil.copy(param,new BazVisitInstance()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + if(param.getQueryStartDate()!=null){ + lqw.ge(BazVisitInstance::getCreateTime,param.getQueryStartDate()); + } + if(param.getQueryEndDate()!=null){ + lqw.le(BazVisitInstance::getCreateTime,param.getQueryEndDate().atTime(23,59,59)); + } + List userIds = postUserService.listByChildIds(AuthContextUtils.getSysUserId()); + if(userIds.size()<1){ + return R.byEmptyList(); + } + String userId = AuthContextUtils.getSysUserId(); + PageUtil.startPage(); + lqw.in(BazVisitInstance::getVisitorId, userIds); + lqw.ne(BazVisitInstance::getVisitorId,userId); + lqw.orderByDesc(BazVisitInstance::getCreateTime); + List list = bazVisitInstanceService.list(lqw); + return R.byPageHelperList(list); + } + + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(BazVisitInstanceSo param){ + BazVisitInstance query = CopierUtil.copy(param,new BazVisitInstance()); + if(param.getQueryStartDate()!=null){ + query.setQueryEndDate(param.getQueryStartDate().atStartOfDay()); + } + if(param.getQueryEndDate()!=null){ + query.setQueryEndDate(param.getQueryEndDate().atTime(23,59,59)); + } + param.setVisitorId(AuthContextUtils.getSysUserId()); + List list = bazVisitInstanceService.selectBazVisitInstanceList(query); + return R.ok(list); + } + + /** + * 列表(我的部下) + * @param param + * @return + */ + @GetMapping("/list4Under") + public R> list4Under(BazVisitInstanceSo param){ + BazVisitInstance query = CopierUtil.copy(param,new BazVisitInstance()); + if(param.getQueryStartDate()!=null){ + query.setQueryEndDate(param.getQueryStartDate().atStartOfDay()); + } + if(param.getQueryEndDate()!=null){ + query.setQueryEndDate(param.getQueryEndDate().atTime(23,59,59)); + } + List userIds = postUserService.listByChildIds(AuthContextUtils.getSysUserId()); + if(userIds.size()<1){ + return R.ok(); + } + + String userId = AuthContextUtils.getSysUserId(); + //PageUtil.startPage(); + query.setQueryUserIds(userIds); + query.setIgnoreUserId(userId); + List list = bazVisitInstanceService.selectBazVisitInstanceList(query); + return R.ok(list); + } + + /** + * 获取用户未完成拜访数量 + * @param visitId 拜访id + * @return + */ + @GetMapping("/getCounter") + public R getPage(Long visitId){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BazVisitInstance::getVisitId,visitId); + lqw.eq(BazVisitInstance::getVisitorId,AuthContextUtils.getSysUserId()); + lqw.eq(BazVisitInstance::getVisitState,0); + long unFinished = bazVisitInstanceService.count(lqw); + Map map = new HashMap<>(); + map.put("unFinished",unFinished); + return R.ok(map,"ok"); + } + + /** + * 统计创建数量(用于判断当天是否提交) + * @param visitId + * @param targetId + * @return + */ + @GetMapping("/countCreate") + public R getPage(String visitId,String targetId){ + BazVisit bazVisit = visitService.getById(visitId); + LambdaQueryWrapper limitVisitLqw = new LambdaQueryWrapper<>(); + limitVisitLqw.eq(BazVisitInstance::getVisitorId,AuthContextUtils.getSysUserId()); + limitVisitLqw.eq(BazVisitInstance::getTargetType,bazVisit.getTargetType()); + limitVisitLqw.eq(BazVisitInstance::getTargetId,targetId); + limitVisitLqw.ge(BazVisitInstance::getCreateTime, LocalDate.now()); + long count = bazVisitInstanceService.count(limitVisitLqw); + return R.ok(count); + } + + + /** + * 创建流程 + * @param param + * @return + */ + @PostMapping("/create") + @SysLog(module = SystemModule.BAZ, title = "拜访实例", biz = BizType.INSERT) + public R save(@RequestBody @Valid BazCreateVisitInstanceBo param){ + BazVisitInstance result = bazVisitInstanceService.create(param); + return R.ok(result); + } + + /** + * 提交流程 + * @param param + * @return + */ + @PostMapping("/submitFlow") + @SysLog(module = SystemModule.BAZ, title = "拜访实例", biz = BizType.INSERT) + public R save(@RequestBody @Valid BazVisitInstanceFlowBo param){ + bazVisitInstanceService.submit(param); + return R.ok(); + } + + /** + * 完成流程 + * @param id + * @return + */ + @PostMapping("/finished/{instanceId}") + @SysLog(module = SystemModule.BAZ, title = "拜访实例", biz = BizType.INSERT) + public R finished(@PathVariable("instanceId")Long id){ + bazVisitInstanceService.finished(id); + return R.ok(); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BAZ, title = "拜访实例", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(BazVisitInstance::getId,idsLong); + lqw.eq(BazVisitInstance::getVisitorId, AuthContextUtils.getSysUserId()); + boolean result = bazVisitInstanceService.remove(lqw); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/BazVisit.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/BazVisit.java new file mode 100644 index 0000000..5b441d9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/BazVisit.java @@ -0,0 +1,95 @@ +package com.qs.serve.modules.baz.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 2023-04-07 + */ +@Data +@TableName("baz_visit") +public class BazVisit implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 拜访名称 */ + @NotBlank(message = "拜访名称不能为空") + @Length(max = 255,message = "拜访名称长度不能超过255字") + private String visitName; + + /** 目标类型 */ + @NotBlank(message = "目标类型不能为空") + @Length(max = 255,message = "目标类型长度不能超过255字") + private String targetType; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + + public static BazVisit toNewObject(BazVisit source){ + BazVisit visit = new BazVisit(); + visit.setId(source.getId()); + visit.setVisitName(source.getVisitName()); + visit.setTargetType(source.getTargetType()); + visit.setRemark(source.getRemark()); + visit.setCreateTime(source.getCreateTime()); + visit.setUpdateTime(source.getUpdateTime()); + visit.setTenantId(source.getTenantId()); + visit.setDelFlag(source.getDelFlag()); + visit.setCreateBy(source.getCreateBy()); + visit.setUpdateBy(source.getUpdateBy()); + return visit; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/BazVisitFlow.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/BazVisitFlow.java new file mode 100644 index 0000000..84805f0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/BazVisitFlow.java @@ -0,0 +1,125 @@ +package com.qs.serve.modules.baz.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 com.qs.serve.modules.baz.entity.bo.BazVisitFlowBo; +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 2023-04-07 + */ +@Data +@TableName("baz_visit_flow") +public class BazVisitFlow implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 拜访id */ + @NotNull(message = "拜访id不能为空") + private Long visitId; + + /** 拜访名称 */ + private String visitName; + + /** 目标类型 */ + @NotBlank(message = "目标类型不能为空") + @Length(max = 255,message = "目标类型长度不能超过255字") + private String targetType; + + /** 流程名称 */ + @NotBlank(message = "流程名称不能为空") + @Length(max = 255,message = "流程名称长度不能超过255字") + private String flowTitle; + + /** 排序 */ + private Integer flowSort; + + /** 业务类型:0-普通;1->签到;2-签退;3->小结 */ + private Integer flowBizType; + + /** 是否可忽略 */ + @NotNull(message = "是否可忽略不能为空") + private Integer ignoreFlag; + + /** 是否定位 */ + @NotNull(message = "是否定位不能为空") + private Integer positionState; + + /** 是否拍照 */ + @NotNull(message = "是否拍照不能为空") + private Integer photoState; + + /** 表单id (0表示空值)*/ + @NotNull(message = "表单id不能为空") + private Long formId; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + @TableField(exist = false) + private Object formInfo; + + public static BazVisitFlow toNewObject(BazVisitFlowBo source){ + BazVisitFlow visitFlow = new BazVisitFlow(); + visitFlow.setId(source.getId()); + visitFlow.setVisitId(source.getVisitId()); + visitFlow.setFlowTitle(source.getFlowTitle()); + visitFlow.setIgnoreFlag(source.getIgnoreFlag()); + visitFlow.setPositionState(source.getPositionState()); + visitFlow.setPhotoState(source.getPhotoState()); + visitFlow.setFormId(source.getFormId()); + visitFlow.setRemark(source.getRemark()); + return visitFlow; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/BazVisitInfo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/BazVisitInfo.java new file mode 100644 index 0000000..632188d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/BazVisitInfo.java @@ -0,0 +1,119 @@ +package com.qs.serve.modules.baz.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 2023-04-10 + */ +@Data +@TableName("baz_visit_info") +public class BazVisitInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 访问id */ + @NotNull(message = "访问id不能为空") + private Long visitId; + + /** 目标类型 */ + @NotBlank(message = "目标类型不能为空") + @Length(max = 255,message = "目标类型长度不能超过255字") + private String targetType; + + /** 目标id */ + @NotNull(message = "目标id不能为空") + private String targetId; + + private String userId; + + /** 拜访次数 */ + @NotNull(message = "拜访次数不能为空") + private Integer visitCount; + + /** 上次拜访时间 */ + @Length(max = 0,message = "上次拜访时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime lastVisitTime; + + /** 计划下一次拜访时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate nextVisitDate; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + + public static BazVisitInfo toNewObject(BazVisitInfo source){ + BazVisitInfo visitInfo = new BazVisitInfo(); + visitInfo.setId(source.getId()); + visitInfo.setVisitId(source.getVisitId()); + visitInfo.setTargetType(source.getTargetType()); + visitInfo.setTargetId(source.getTargetId()); + visitInfo.setVisitCount(source.getVisitCount()); + visitInfo.setLastVisitTime(source.getLastVisitTime()); + visitInfo.setNextVisitDate(source.getNextVisitDate()); + visitInfo.setRemark(source.getRemark()); + visitInfo.setCreateTime(source.getCreateTime()); + visitInfo.setUpdateTime(source.getUpdateTime()); + visitInfo.setTenantId(source.getTenantId()); + visitInfo.setDelFlag(source.getDelFlag()); + visitInfo.setCreateBy(source.getCreateBy()); + visitInfo.setUpdateBy(source.getUpdateBy()); + return visitInfo; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/BazVisitInstance.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/BazVisitInstance.java new file mode 100644 index 0000000..6a872a0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/BazVisitInstance.java @@ -0,0 +1,221 @@ +package com.qs.serve.modules.baz.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 com.qs.serve.common.model.dto.TargetDTO; +import com.qs.serve.modules.baz.entity.bo.BazVisitInstanceFlowBo; +import com.qs.serve.modules.sys.entity.SysUser; +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; +import java.util.List; + +/** + * 拜访实例 实体类 + * @author YenHex + * @since 2023-04-07 + */ +@Data +@TableName("baz_visit_instance") +public class BazVisitInstance implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 标题 */ + @NotBlank(message = "标题不能为空") + @Length(max = 255,message = "标题长度不能超过255字") + private String title; + + /** 拜访类型id */ + @NotNull(message = "拜访类型id不能为空") + private Long visitId; + + /** 目标类型 */ + @NotBlank(message = "目标类型不能为空") + @Length(max = 255,message = "目标类型长度不能超过255字") + private String targetType; + + /** 拜访状态:0-进行中;1-完成 */ + @NotNull(message = "拜访状态:0-进行中;1-完成不能为空") + private Integer visitState; + + /** 拜访人id */ + @NotBlank(message = "拜访人id不能为空") + @Length(max = 255,message = "拜访人id长度不能超过255字") + private String visitorId; + + /** 拜访人编码 */ + @NotBlank(message = "拜访人编码不能为空") + @Length(max = 255,message = "拜访人编码长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String visitorCode; + + /** 拜访人 */ + @NotBlank(message = "拜访人不能为空") + @Length(max = 255,message = "拜访人长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String visitorName; + + /** 目标id */ + @NotBlank(message = "目标id不能为空") + @Length(max = 255,message = "目标id长度不能超过255字") + private String targetId; + + /** 目标i编码 */ + @Length(max = 255,message = "目标i编码长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String targetCode; + + /** 目标名称 */ + @NotBlank(message = "目标名称不能为空") + @Length(max = 255,message = "目标名称长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String targetName; + + private String targetLocalX; + private String targetLocalY; + private String targetAddress; + private String targetMapAddress; + + /** 遗失定位标识 */ + private Integer missLocalFlag; + + /** 省 */ + private String extProvince; + + /** 城市 */ + private String extCity; + + /** 区 */ + private String extRegionArea; + + /** 乡镇 */ + private String extTownship; + + /** 街道 */ + private String extStreet; + + /** 街道编号 */ + private String extStreetNumber; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime finishedTime; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + @TableField(condition = SqlCondition.LIKE) + private String positionStatusContent; + + private String positionStatus; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + @TableField(exist = false) + private List flowList; + + /** 拜访小结 */ + @TableField(exist = false) + private String summary; + + /** 签到时间 */ + @TableField(exist = false) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime signTime; + + /** 签退时间 */ + @TableField(exist = false) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime outTime; + + /** 查询开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + @TableField(exist = false) + private LocalDateTime queryStartDate; + + /** 查询结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + @TableField(exist = false) + private LocalDateTime queryEndDate; + + /** 查询用户ID */ + @TableField(exist = false) + private List queryUserIds; + + /** 忽略的用户ID */ + @TableField(exist = false) + private String ignoreUserId; + + public static BazVisitInstance toNewObject(BazVisit source, TargetDTO targetDTO, SysUser sysUser, BazVisitInstanceFlowBo flowBo){ + BazVisitInstance visitInstance = new BazVisitInstance(); + //visitInstance.setTitle(source.getTitle()); + visitInstance.setVisitId(source.getId()); + visitInstance.setTargetType(source.getTargetType()); + visitInstance.setVisitState(0); + visitInstance.setVisitorId(sysUser.getId()); + visitInstance.setVisitorCode(sysUser.getCode()); + visitInstance.setVisitorName(sysUser.getName()); + visitInstance.setTargetId(targetDTO.getTargetId()); + visitInstance.setTargetCode(targetDTO.getTargetCode()); + visitInstance.setTargetName(targetDTO.getTargetName()); + visitInstance.setRemark(source.getRemark()); + + + visitInstance.setExtProvince(flowBo.getExtProvince()); + visitInstance.setExtCity(flowBo.getExtCity()); + visitInstance.setExtRegionArea(flowBo.getExtRegionArea()); + visitInstance.setExtTownship(flowBo.getExtTownship()); + visitInstance.setExtStreet(flowBo.getExtStreet()); + visitInstance.setExtStreetNumber(flowBo.getExtStreetNumber()); + + return visitInstance; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/BazVisitInstanceFlow.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/BazVisitInstanceFlow.java new file mode 100644 index 0000000..32293a5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/BazVisitInstanceFlow.java @@ -0,0 +1,238 @@ +package com.qs.serve.modules.baz.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 com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import com.qs.serve.common.model.dto.TargetDTO; +import com.qs.serve.modules.baz.entity.bo.BazVisitInstanceFlowBo; +import com.qs.serve.modules.sys.entity.SysUser; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +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 2023-04-07 + */ +@Data +@TableName(value = "baz_visit_instance_flow",autoResultMap = true) +public class BazVisitInstanceFlow implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 拜访实例id */ + @NotNull(message = "拜访实例id不能为空") + private Long visitInstanceId; + + /** 拜访id */ + @NotNull(message = "拜访id不能为空") + private Long visitId; + + /** 目标类型 */ + @NotBlank(message = "目标类型不能为空") + @Length(max = 255,message = "目标类型长度不能超过255字") + private String targetType; + + /** 目标id */ + @NotBlank(message = "目标id不能为空") + @Length(max = 255,message = "目标id长度不能超过255字") + private String targetId; + + /** 目标编码 */ + @Length(max = 255,message = "目标编码长度不能超过255字") + private String targetCode; + + /** 目标名称 */ + @NotBlank(message = "目标名称不能为空") + @Length(max = 255,message = "目标名称长度不能超过255字") + private String targetName; + + /** 目标地址id */ + @Length(max = 255,message = "目标地址id长度不能超过255字") + private String targetAddressId; + + /** 流程名称 */ + @NotBlank(message = "流程名称不能为空") + @Length(max = 255,message = "流程名称长度不能超过255字") + private String flowTitle; + + /** 业务类型:0-普通;1->签到;2-签退;3->小结 */ + private Integer flowBizType; + + /** 排序 */ + private Integer flowSort; + + /** 状态:0-进行中;1-完成;2-跳过 */ + private Integer flowState; + + /** 是否可忽略当前流程 */ + private Integer ignoreFlag; + + /** 是否定位 */ + private Integer positionState; + + /** 是否拍照 */ + private Integer photoState; + + /** 表单id(0表示空值) */ + private Long formId; + + /** 表单Json */ + @Length(max = 0,message = "表单Json长度不能超过0字") + private String formJson; + + /** 输入值 */ + @Length(max = 255,message = "输入值长度不能超过255字") + private String valInputValue; + + /** 地图地址 */ + private String mapAddress; + + /** 纬度 */ + @Length(max = 255,message = "纬度长度不能超过255字") + private String valLocalX; + + /** 经度 */ + @Length(max = 255,message = "经度长度不能超过255字") + private String valLocalY; + + /** 省 */ + private String extProvince; + + /** 城市 */ + private String extCity; + + /** 区 */ + private String extRegionArea; + + /** 乡镇 */ + private String extTownship; + + /** 街道 */ + private String extStreet; + + /** 街道编号 */ + private String extStreetNumber; + + /** 拍照图片地址 */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] valPhotoUrls; + + /** 表单填写json */ + @Length(max = 0,message = "表单填写json长度不能超过0字") + private String valFormValue; + + /** 拜访人id */ + @NotBlank(message = "拜访人id不能为空") + @Length(max = 255,message = "拜访人id长度不能超过255字") + private String visitorId; + + /** 拜访人编码 */ + @NotBlank(message = "拜访人编码不能为空") + @Length(max = 255,message = "拜访人编码长度不能超过255字") + private String visitorCode; + + /** 拜访人 */ + @NotBlank(message = "拜访人不能为空") + @Length(max = 255,message = "拜访人长度不能超过255字") + private String visitorName; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime submitTime; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + @TableField(exist = false) + private Object instanceMainInfo; + + public static BazVisitInstanceFlow toNewObject(BazVisitFlow source, TargetDTO targetDTO, SysUser user){ + BazVisitInstanceFlow visitInstanceFlow = new BazVisitInstanceFlow(); + visitInstanceFlow.setVisitId(source.getVisitId()); + visitInstanceFlow.setTargetType(source.getTargetType()); + visitInstanceFlow.setTargetId(targetDTO.getTargetId()); + visitInstanceFlow.setTargetCode(targetDTO.getTargetCode()); + visitInstanceFlow.setTargetName(targetDTO.getTargetName()); + visitInstanceFlow.setFlowTitle(source.getFlowTitle()); + visitInstanceFlow.setFlowBizType(source.getFlowBizType()); + visitInstanceFlow.setFlowSort(source.getFlowSort()); + visitInstanceFlow.setIgnoreFlag(source.getIgnoreFlag()); + visitInstanceFlow.setPositionState(source.getPositionState()); + visitInstanceFlow.setPhotoState(source.getPhotoState()); + visitInstanceFlow.setFormId(source.getFormId()); + visitInstanceFlow.setVisitorId(user.getId()); + visitInstanceFlow.setVisitorCode(user.getCode()); + visitInstanceFlow.setVisitorName(user.getName()); + return visitInstanceFlow; + } + + + public void initInputValues(BazVisitInstanceFlowBo source){ + this.setTargetAddressId(source.getTargetAddressId()); + this.setValInputValue(source.getValInputValue()); + this.setValLocalX(source.getValLocalX()); + this.setValLocalY(source.getValLocalY()); + this.setValPhotoUrls(source.getValPhotoUrls()); + this.setValFormValue(source.getValFormValue()); + this.setMapAddress(source.getMapAddress()); + + this.setExtProvince(source.getExtProvince()); + this.setExtCity(source.getExtCity()); + this.setExtRegionArea(source.getExtRegionArea()); + this.setExtTownship(source.getExtTownship()); + this.setExtStreet(source.getExtStreet()); + this.setExtStreetNumber(source.getExtStreetNumber()); + + + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/bo/BazCreateVisitInstanceBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/bo/BazCreateVisitInstanceBo.java new file mode 100644 index 0000000..3821cdf --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/bo/BazCreateVisitInstanceBo.java @@ -0,0 +1,41 @@ +package com.qs.serve.modules.baz.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 拜访实例 Bo + * @author YenHex + * @since 2023-04-07 + */ +@Data +public class BazCreateVisitInstanceBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 拜访类型id */ + @NotNull(message = "拜访类型id不能为空") + private Long visitId; + + /** 目标id */ + @NotBlank(message = "目标id不能为空") + @Length(max = 255,message = "目标id长度不能超过255字") + private String targetId; + + /** 首次提交信息对象 */ + private BazVisitInstanceFlowBo firstFlowSubmit; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/bo/BazVisitFlowBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/bo/BazVisitFlowBo.java new file mode 100644 index 0000000..e7b9d6c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/bo/BazVisitFlowBo.java @@ -0,0 +1,69 @@ +package com.qs.serve.modules.baz.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 拜访流程 Bo + * @author YenHex + * @since 2023-04-07 + */ +@Data +public class BazVisitFlowBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 拜访id 值:1-> 网点打开 */ + @NotNull(message = "拜访id不能为空") + private Long visitId; + + /** 流程名称 */ + @NotBlank(message = "流程名称不能为空") + @Length(max = 255,message = "流程名称长度不能超过255字") + private String flowTitle; + + /** 排序 */ + @NotNull(message = "排序不能为空") + private Integer flowSort; + + /** 业务类型:0-普通;1->签到;2-签退;3->小结 */ + @NotNull(message = "排序不能为空") + private Integer flowBizType; + + /** 是否可忽略 */ + @NotNull(message = "是否可忽略不能为空") + private Integer ignoreFlag; + + /** 是否定位 */ + @NotNull(message = "是否定位不能为空") + private Integer positionState; + + /** 是否拍照 */ + @NotNull(message = "是否拍照不能为空") + private Integer photoState; + + /** 表单id */ + private Long formId; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/bo/BazVisitFlowSortBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/bo/BazVisitFlowSortBo.java new file mode 100644 index 0000000..57dd07f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/bo/BazVisitFlowSortBo.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.baz.entity.bo; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; +/** + * 拜访流程 Bo + * @author YenHex + * @since 2023-04-07 + */ +@Data +public class BazVisitFlowSortBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 备注 */ + private List sortValues; + + @Data + public static class Item{ + Integer sortValue; + Long id; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/bo/BazVisitInstanceFlowBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/bo/BazVisitInstanceFlowBo.java new file mode 100644 index 0000000..34ad481 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/bo/BazVisitInstanceFlowBo.java @@ -0,0 +1,79 @@ +package com.qs.serve.modules.baz.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 拜访实例流程 Bo + * @author YenHex + * @since 2023-04-07 + */ +@Data +public class BazVisitInstanceFlowBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 实例的流程id(首次提交可忽略) */ + @NotNull(message = "拜访实例id不能为空") + private Long instanceFlowId; + + /** 目标地址id(用不上可忽略) */ + @Length(max = 255,message = "目标地址id长度不能超过255字") + private String targetAddressId; + + /** 输入值(用不上可忽略) */ + private String valInputValue; + + /** 地图地址 */ + private String mapAddress; + + /** 省 */ + private String extProvince; + + /** 城市 */ + private String extCity; + + /** 区 */ + private String extRegionArea; + + /** 乡镇 */ + private String extTownship; + + /** 街道 */ + private String extStreet; + + /** 街道编号 */ + private String extStreetNumber; + + /** 纬度 */ + @Length(max = 255,message = "纬度长度不能超过255字") + private String valLocalX; + + /** 经度 */ + @Length(max = 255,message = "经度长度不能超过255字") + private String valLocalY; + + /** 拍照图片地址 */ + private String[] valPhotoUrls; + + /** 表单填写json */ + private String valFormValue; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/so/BazVisitFlowSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/so/BazVisitFlowSo.java new file mode 100644 index 0000000..40b2ff7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/so/BazVisitFlowSo.java @@ -0,0 +1,57 @@ +package com.qs.serve.modules.baz.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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 2023-04-07 + */ +@Data +public class BazVisitFlowSo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 拜访id */ + private Long visitId; + + /** 目标类型 */ + private String targetType; + + /** 流程名称 */ + private String flowTitle; + + /** 排序 */ + private Integer flowSort; + + /** 是否可忽略 */ + private Integer ignoreFlag; + + /** 是否定位 */ + private Integer positionState; + + /** 是否拍照 */ + private Integer photoState; + + /** 表单id */ + private Long formId; + + /** 备注 */ + private String remark; + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/so/BazVisitInstanceFlowSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/so/BazVisitInstanceFlowSo.java new file mode 100644 index 0000000..c93828d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/so/BazVisitInstanceFlowSo.java @@ -0,0 +1,90 @@ +package com.qs.serve.modules.baz.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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 2023-04-07 + */ +@Data +public class BazVisitInstanceFlowSo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 拜访实例id */ + private Long visitInstanceId; + + /** 拜访id */ + private Long visitId; + + /** 目标id */ + private String targetId; + + /** 目标编码 */ + private String targetCode; + + /** 目标名称 */ + private String targetName; + + /** 目标地址id */ + private String targetAddressId; + + /** 流程名称 */ + private String flowTitle; + + /** 排序 */ + private Integer flowSort; + + /** 是否可忽略当前流程 */ + private Integer ignoreFlag; + + /** 是否定位 */ + private Integer positionState; + + /** 是否拍照 */ + private Integer photoState; + + /** 表单id(0表示空值) */ + private Long formId; + + /** 表单Json */ + private String formJson; + + /** 输入值 */ + private String valInputValue; + + /** 纬度 */ + private String valLocalX; + + /** 经度 */ + private String valLocalY; + + /** 拍照图片地址 */ + private String valPhotoUrls; + + /** 表单填写json */ + private String valFormValue; + + /** 备注 */ + private String remark; + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/so/BazVisitInstanceSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/so/BazVisitInstanceSo.java new file mode 100644 index 0000000..a9cf220 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/entity/so/BazVisitInstanceSo.java @@ -0,0 +1,79 @@ +package com.qs.serve.modules.baz.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +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 2023-04-07 + */ +@Data +public class BazVisitInstanceSo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 标题 */ + private String title; + + /** 拜访类型id */ + private Long visitId; + + /** 拜访状态:0-进行中;1-完成 */ + private Integer visitState; + + /** 拜访人id */ + private String visitorId; + + /** 拜访人编码 */ + private String visitorCode; + + /** 拜访人 */ + private String visitorName; + + /** 目标id */ + private String targetId; + + /** 目标i编码 */ + private String targetCode; + + /** 目标名称 */ + private String targetName; + + /** 遗失定位标识 */ + private Integer missLocalFlag; + + private String summary; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate queryStartDate; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate queryEndDate; + + /** + * 加载流程 0/1 + */ + private Integer loadFlowList; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/mapper/BazVisitFlowMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/mapper/BazVisitFlowMapper.java new file mode 100644 index 0000000..0253bc3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/mapper/BazVisitFlowMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.baz.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.baz.entity.BazVisitFlow; + +/** + * 拜访流程 Mapper + * @author YenHex + * @date 2023-04-07 + */ +public interface BazVisitFlowMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/mapper/BazVisitInfoMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/mapper/BazVisitInfoMapper.java new file mode 100644 index 0000000..0e77b80 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/mapper/BazVisitInfoMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.baz.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.baz.entity.BazVisitInfo; + +/** + * 供应商拜访信息 Mapper + * @author YenHex + * @date 2023-04-10 + */ +public interface BazVisitInfoMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/mapper/BazVisitInstanceFlowMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/mapper/BazVisitInstanceFlowMapper.java new file mode 100644 index 0000000..1dd198f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/mapper/BazVisitInstanceFlowMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.baz.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.baz.entity.BazVisitInstanceFlow; + +/** + * 拜访实例流程 Mapper + * @author YenHex + * @date 2023-04-07 + */ +public interface BazVisitInstanceFlowMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/mapper/BazVisitInstanceMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/mapper/BazVisitInstanceMapper.java new file mode 100644 index 0000000..0d64e8e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/mapper/BazVisitInstanceMapper.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.baz.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.baz.entity.BazVisitInstance; +import com.qs.serve.modules.baz.entity.so.BazVisitInstanceSo; +import org.apache.ibatis.annotations.Param; +import java.util.List; + +/** + * 拜访实例 Mapper + * @author YenHex + * @date 2023-04-07 + */ +public interface BazVisitInstanceMapper extends BaseMapper { + + List selectBazVisitInstanceList(@Param("query") BazVisitInstance param); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/mapper/BazVisitMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/mapper/BazVisitMapper.java new file mode 100644 index 0000000..7d6549c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/mapper/BazVisitMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.baz.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.baz.entity.BazVisit; + +/** + * 拜访 Mapper + * @author YenHex + * @date 2023-04-07 + */ +public interface BazVisitMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/BazVisitFlowService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/BazVisitFlowService.java new file mode 100644 index 0000000..c7c67b2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/BazVisitFlowService.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.baz.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.baz.entity.BazVisitFlow; +import com.qs.serve.modules.baz.entity.bo.BazVisitFlowBo; + +/** + * 拜访流程 服务接口 + * @author YenHex + * @date 2023-04-07 + */ +public interface BazVisitFlowService extends IService { + + BazVisitFlow modify(BazVisitFlowBo param); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/BazVisitInfoService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/BazVisitInfoService.java new file mode 100644 index 0000000..c9b1211 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/BazVisitInfoService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.baz.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.baz.entity.BazVisitInfo; + +/** + * 供应商拜访信息 服务接口 + * @author YenHex + * @date 2023-04-10 + */ +public interface BazVisitInfoService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/BazVisitInstanceFlowService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/BazVisitInstanceFlowService.java new file mode 100644 index 0000000..6009d17 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/BazVisitInstanceFlowService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.baz.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.baz.entity.BazVisitInstanceFlow; + +/** + * 拜访实例流程 服务接口 + * @author YenHex + * @date 2023-04-07 + */ +public interface BazVisitInstanceFlowService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/BazVisitInstanceService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/BazVisitInstanceService.java new file mode 100644 index 0000000..11ea786 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/BazVisitInstanceService.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.baz.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.baz.entity.BazVisitInstance; +import com.qs.serve.modules.baz.entity.bo.BazCreateVisitInstanceBo; +import com.qs.serve.modules.baz.entity.bo.BazVisitInstanceFlowBo; +import com.qs.serve.modules.baz.entity.so.BazVisitInstanceSo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 拜访实例 服务接口 + * @author YenHex + * @date 2023-04-07 + */ +public interface BazVisitInstanceService extends IService { + + BazVisitInstance create(BazCreateVisitInstanceBo param); + + void submit(BazVisitInstanceFlowBo param); + + void finished(Long id); + + List selectBazVisitInstanceList( BazVisitInstance param); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/BazVisitService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/BazVisitService.java new file mode 100644 index 0000000..96990dd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/BazVisitService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.baz.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.baz.entity.BazVisit; + +/** + * 拜访 服务接口 + * @author YenHex + * @date 2023-04-07 + */ +public interface BazVisitService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/impl/BazVisitFlowServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/impl/BazVisitFlowServiceImpl.java new file mode 100644 index 0000000..d15e246 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/impl/BazVisitFlowServiceImpl.java @@ -0,0 +1,62 @@ +package com.qs.serve.modules.baz.service.impl; + +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.modules.baz.entity.BazVisit; +import com.qs.serve.modules.baz.entity.bo.BazVisitFlowBo; +import com.qs.serve.modules.baz.mapper.BazVisitMapper; +import com.qs.serve.modules.biz.mapper.BizVisitMapper; +import com.qs.serve.modules.biz.service.BizVisitService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.baz.entity.BazVisitFlow; +import com.qs.serve.modules.baz.service.BazVisitFlowService; +import com.qs.serve.modules.baz.mapper.BazVisitFlowMapper; + +/** + * 拜访流程 服务实现类 + * @author YenHex + * @since 2023-04-07 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BazVisitFlowServiceImpl extends ServiceImpl implements BazVisitFlowService { + + BazVisitMapper bazVisitMapper; + + @Override + public BazVisitFlow modify(BazVisitFlowBo param) { + Long id = param.getId(); + BazVisitFlow entity = BazVisitFlow.toNewObject(param); + BazVisit bazVisit = bazVisitMapper.selectById(param.getVisitId()); + entity.setVisitId(bazVisit.getId()); + entity.setTargetType(bazVisit.getTargetType()); + entity.setVisitName(bazVisit.getVisitName()); + entity.setFlowBizType(param.getFlowBizType()); + if(param.getFlowBizType()!=null&& param.getFlowBizType() >0){ + LambdaQueryWrapper lqwErrCount = new LambdaQueryWrapper<>(); + lqwErrCount.eq(BazVisitFlow::getVisitId,bazVisit.getId()); + lqwErrCount.eq(BazVisitFlow::getFlowBizType,param.getFlowBizType()); + if(id!=null){ + lqwErrCount.ne(BazVisitFlow::getId,id); + } + if(this.count(lqwErrCount)>0){ + Assert.throwEx("流程中业务类型不能重复"); + } + } + //设置排序 + LambdaQueryWrapper lqwCount = new LambdaQueryWrapper<>(); + lqwCount.eq(BazVisitFlow::getVisitId,param.getVisitId()); + if(id==null){ + Long count = this.count(lqwCount); + entity.setFlowSort(count.intValue()+1); + } + this.saveOrUpdate(entity); + return entity; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/impl/BazVisitInfoServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/impl/BazVisitInfoServiceImpl.java new file mode 100644 index 0000000..5d55cd2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/impl/BazVisitInfoServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.baz.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.baz.entity.BazVisitInfo; +import com.qs.serve.modules.baz.service.BazVisitInfoService; +import com.qs.serve.modules.baz.mapper.BazVisitInfoMapper; + +/** + * 供应商拜访信息 服务实现类 + * @author YenHex + * @since 2023-04-10 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BazVisitInfoServiceImpl extends ServiceImpl implements BazVisitInfoService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/impl/BazVisitInstanceFlowServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/impl/BazVisitInstanceFlowServiceImpl.java new file mode 100644 index 0000000..e98853a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/impl/BazVisitInstanceFlowServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.baz.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.baz.entity.BazVisitInstanceFlow; +import com.qs.serve.modules.baz.service.BazVisitInstanceFlowService; +import com.qs.serve.modules.baz.mapper.BazVisitInstanceFlowMapper; + +/** + * 拜访实例流程 服务实现类 + * @author YenHex + * @since 2023-04-07 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BazVisitInstanceFlowServiceImpl extends ServiceImpl implements BazVisitInstanceFlowService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/impl/BazVisitInstanceServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/impl/BazVisitInstanceServiceImpl.java new file mode 100644 index 0000000..381feee --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/impl/BazVisitInstanceServiceImpl.java @@ -0,0 +1,284 @@ +package com.qs.serve.modules.baz.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.TargetDTO; +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.baz.common.BazTargetTypeConsts; +import com.qs.serve.modules.baz.entity.*; +import com.qs.serve.modules.baz.entity.bo.BazCreateVisitInstanceBo; +import com.qs.serve.modules.baz.entity.bo.BazVisitInstanceFlowBo; +import com.qs.serve.modules.baz.mapper.BazVisitFlowMapper; +import com.qs.serve.modules.baz.mapper.BazVisitMapper; +import com.qs.serve.modules.baz.service.BazVisitInfoService; +import com.qs.serve.modules.baz.service.BazVisitInstanceFlowService; +import com.qs.serve.modules.bms.entity.*; +import com.qs.serve.modules.bms.mapper.*; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.baz.service.BazVisitInstanceService; +import com.qs.serve.modules.baz.mapper.BazVisitInstanceMapper; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +/** + * 拜访实例 服务实现类 + * @author YenHex + * @since 2023-04-07 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BazVisitInstanceServiceImpl extends ServiceImpl implements BazVisitInstanceService { + + BmsSupplierContactsMapper bmsSupplierContactsMapper; + BmsChannelPointMapper pointMapper; + BmsSupplierMapper supplierMapper; + SysUserMapper sysUserMapper; + BmsSupplierVisitFormMapper visitFormMapper; + BmsSupplierVisitAddressMapper visitAddressMapper; + BazVisitInstanceFlowService instanceFlowService; + BazVisitFlowMapper flowMapper; + BazVisitMapper visitMapper; + private BazVisitInfoService bazVisitInfoService; + BmsChannelPointExtMapper pointExtMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public BazVisitInstance create(BazCreateVisitInstanceBo param) { + SysUser sysUser = sysUserMapper.selectById(AuthContextUtils.getSysUserId()); + BazVisit bazVisit = visitMapper.selectById(param.getVisitId()); + LambdaQueryWrapper flowLqw = new LambdaQueryWrapper<>(); + flowLqw.eq(BazVisitFlow::getVisitId,param.getVisitId()); + flowLqw.orderByAsc(BazVisitFlow::getFlowSort); + List visitFlowList = flowMapper.selectList(flowLqw); + if(visitFlowList.size()<1){ + Assert.throwEx("未设置流程,请联系管理员"); + } + BazVisitInstanceFlowBo flowBo = param.getFirstFlowSubmit(); + String targetType = bazVisit.getTargetType(); + TargetDTO targetDTO = null; + if(targetType.equals(BazTargetTypeConsts.CUSTOMER)){ + BmsSupplier supplier = supplierMapper.selectById(param.getTargetId()); + targetDTO = new TargetDTO(supplier.getId(),supplier.getCode(),supplier.getName()); + String addrId = flowBo.getTargetAddressId(); + BmsSupplierVisitAddress visitAddress = visitAddressMapper.selectById(addrId); + targetDTO.setLocalX(visitAddress.getLocalX()); + targetDTO.setLocalY(visitAddress.getLocalY()); + targetDTO.setAddress(visitAddress.getAddressDetail()); + targetDTO.setMapAddress(visitAddress.getLocalAddress()); + }else if (targetType.equals(BazTargetTypeConsts.POINT)){ + BmsChannelPoint point = pointMapper.selectById(param.getTargetId()); + targetDTO = new TargetDTO(point.getId()+"",point.getPointCode(),point.getPointName()); + targetDTO.setLocalX(point.getLocalX()); + targetDTO.setLocalY(point.getLocalY()); + targetDTO.setAddress(point.getAddress()); + targetDTO.setMapAddress(point.getMapAddress()); + // 保存相关信息在拓展表 + try { + if(StringUtils.hasText(flowBo.getMapAddress())&&StringUtils.hasText(flowBo.getExtProvince())){ + BmsChannelPointExt pointExtDb = pointExtMapper.selectById(point.getId()); + BmsChannelPointExt pointExt = new BmsChannelPointExt(); + pointExt.setPointId(point.getId()+""); + pointExt.setExtProvince(flowBo.getExtProvince()); + pointExt.setExtCity(flowBo.getExtCity()); + pointExt.setExtRegionArea(flowBo.getExtRegionArea()); + pointExt.setExtTownship(flowBo.getExtTownship()); + pointExt.setExtStreet(flowBo.getExtStreet()); + pointExt.setExtStreetNumber(flowBo.getExtStreetNumber()); + pointExt.setLocalX(flowBo.getValLocalX()); + pointExt.setLocalY(flowBo.getValLocalY()); + pointExt.setAddress(flowBo.getMapAddress()); + if(pointExtDb==null){ + pointExtMapper.insert(pointExt); + }else { + pointExtMapper.updateById(pointExt); + } + } + } catch (Exception e) { + log.error("PointExt异常:{}",e.getMessage()); + } + } + + //多少天内只能拜访次数(一天一次) + LambdaQueryWrapper limitVisitLqw = new LambdaQueryWrapper<>(); + limitVisitLqw.eq(BazVisitInstance::getVisitorId,sysUser.getId()); + limitVisitLqw.eq(BazVisitInstance::getTargetType,targetType); + limitVisitLqw.eq(BazVisitInstance::getTargetId,targetDTO.getTargetId()); + limitVisitLqw.ge(BazVisitInstance::getCreateTime, LocalDate.now()); + long count = this.count(limitVisitLqw); + if(count>0){ + Assert.throwEx("一天内只能拜访一次"); + } + + //构建实例 + BazVisitInstance visitInstance = BazVisitInstance.toNewObject(bazVisit,targetDTO,sysUser,flowBo); + visitInstance.setTargetAddress(targetDTO.getAddress()); + visitInstance.setTargetMapAddress(targetDTO.getMapAddress()); + visitInstance.setTargetLocalX(targetDTO.getLocalX()); + visitInstance.setTargetLocalY(targetDTO.getLocalY()); + visitInstance.setTitle(sysUser.getName()+"["+bazVisit.getVisitName()+"]"+targetDTO.getTargetName()); + //构建流程 + List instanceFlowList = new ArrayList<>(); + for (BazVisitFlow visitFlow : visitFlowList) { + BazVisitInstanceFlow instanceFlow = BazVisitInstanceFlow.toNewObject(visitFlow,targetDTO,sysUser); + instanceFlow.setVisitInstanceId(visitInstance.getId()); + //设置缓存表单JSON + if(instanceFlow.getFormId()!=null&&!instanceFlow.getFormId().equals(0L)){ + BmsSupplierVisitForm visitForm = visitFormMapper.selectById(instanceFlow.getFormId()); + instanceFlow.setFormJson(visitForm.getFormContext()); + } + if(instanceFlow.getFlowSort().equals(1)){ + instanceFlow.initInputValues(flowBo); + instanceFlow.setFlowState(1); + instanceFlow.setSubmitTime(LocalDateTime.now()); + instanceFlow.setRemark(flowBo.getRemark()); + if(instanceFlow.getPositionState().equals(2) + &&(StringUtils.hasEmpty(flowBo.getValLocalX()) + ||StringUtils.hasEmpty(flowBo.getMapAddress()) + ||StringUtils.hasEmpty(flowBo.getValLocalY()))){ + Assert.throwEx("定位信息缺失"); + } + if(instanceFlow.getPhotoState().equals(2) + &&(flowBo.getValPhotoUrls()==null||flowBo.getValPhotoUrls().length<1)){ + Assert.throwEx("拍照信息缺失"); + } + + } + + instanceFlow.setTargetAddressId(flowBo.getTargetAddressId()); + + instanceFlowList.add(instanceFlow); + } + + //更新统计 + LambdaQueryWrapper visitInfoLqw = new LambdaQueryWrapper<>(); + visitInfoLqw.eq(BazVisitInfo::getTargetType, targetType); + visitInfoLqw.eq(BazVisitInfo::getTargetId,targetDTO.getTargetId()); + visitInfoLqw.eq(BazVisitInfo::getUserId,sysUser.getId()); + BazVisitInfo visitInfo = bazVisitInfoService.getOne(visitInfoLqw,false); + if(visitInfo==null){ + visitInfo = new BazVisitInfo(); + visitInfo.setVisitId(visitInstance.getVisitId()); + visitInfo.setTargetId(targetDTO.getTargetId()); + visitInfo.setTargetType(targetType); + visitInfo.setUserId(sysUser.getId()); + visitInfo.setVisitCount(1); + }else { + visitInfo.setVisitCount(visitInfo.getVisitCount()+1); + } + visitInfo.setLastVisitTime(LocalDateTime.now()); + + //保存 + bazVisitInfoService.saveOrUpdate(visitInfo); + this.save(visitInstance); + for (BazVisitInstanceFlow instanceFlow : instanceFlowList) { + instanceFlow.setVisitInstanceId(visitInstance.getId()); + } + instanceFlowService.saveBatch(instanceFlowList); + return visitInstance; + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void submit(BazVisitInstanceFlowBo param) { + BazVisitInstanceFlow instanceFlowDb = instanceFlowService.getById(param.getInstanceFlowId()); + if(instanceFlowDb.getFlowState().equals(1)){ + Assert.throwEx("请勿重复提交"); + } + if(instanceFlowDb.getPositionState().equals(2) + &&(StringUtils.hasEmpty(param.getValLocalX()) + ||StringUtils.hasEmpty(param.getValLocalY()) + ||StringUtils.hasEmpty(param.getMapAddress()))){ + Assert.throwEx("定位信息缺失"); + } + if(instanceFlowDb.getPhotoState().equals(2) + &&(param.getValPhotoUrls()==null||param.getValPhotoUrls().length<1)){ + Assert.throwEx("拍照信息缺失"); + } + BazVisitInstanceFlow instanceFlow = new BazVisitInstanceFlow(); + instanceFlow.setId(param.getInstanceFlowId()); + instanceFlow.initInputValues(param); + instanceFlow.setFlowState(1); + instanceFlow.setSubmitTime(LocalDateTime.now()); + instanceFlow.setRemark(param.getRemark()); + instanceFlowService.updateById(instanceFlow); + //定位信息缺失标识 + if(instanceFlowDb.getPositionState().equals(2) + &&("0".equals(param.getValLocalX())|| "0".equals(param.getValLocalY()))){ + BazVisitInstance visitInstance = new BazVisitInstance(); + visitInstance.setMissLocalFlag(1); + visitInstance.setId(instanceFlowDb.getVisitInstanceId()); + this.updateById(visitInstance); + } + //完成自动更新 + LambdaQueryWrapper countLqw = new LambdaQueryWrapper<>(); + countLqw.eq(BazVisitInstanceFlow::getVisitInstanceId,instanceFlowDb.getVisitInstanceId()); + countLqw.eq(BazVisitInstanceFlow::getFlowState,0); + long count = instanceFlowService.count(countLqw); + if(count<1){ + //客户拜访无联系人 + if(instanceFlowDb.getTargetType().equals("customer")){ + LambdaQueryWrapper contactsLqw = new LambdaQueryWrapper<>(); + contactsLqw.eq(BmsSupplierContacts::getSupplierId,instanceFlowDb.getTargetId()); + if(bmsSupplierContactsMapper.selectCount(contactsLqw)<1){ + return; + } + } + BazVisitInstance visitInstance = new BazVisitInstance(); + visitInstance.setFinishedTime(LocalDateTime.now()); + visitInstance.setVisitState(1); + visitInstance.setId(instanceFlowDb.getVisitInstanceId()); + this.updateById(visitInstance); + } + } + + @Override + public void finished(Long instanceId) { + BazVisitInstance instanceDb = this.getById(instanceId); + //客户拜访无联系人 + if(instanceDb.getTargetType().equals("customer")){ + LambdaQueryWrapper contactsLqw = new LambdaQueryWrapper<>(); + contactsLqw.eq(BmsSupplierContacts::getSupplierId,instanceDb.getTargetId()); + if(bmsSupplierContactsMapper.selectCount(contactsLqw)<1){ + Assert.throwEx("请补充客户联系人"); + } + } + if(instanceDb.getVisitState().equals(0)){ + LambdaQueryWrapper countLqw = new LambdaQueryWrapper<>(); + countLqw.select( + BazVisitInstanceFlow::getId, + BazVisitInstanceFlow::getFlowTitle, + BazVisitInstanceFlow::getIgnoreFlag); + countLqw.eq(BazVisitInstanceFlow::getVisitInstanceId,instanceId); + countLqw.eq(BazVisitInstanceFlow::getFlowState,0); + List instanceFlowList = instanceFlowService.list(countLqw); + for (BazVisitInstanceFlow instanceFlow : instanceFlowList) { + if(instanceFlow.getIgnoreFlag().equals(0)){ + Assert.throwEx("["+instanceFlow.getFlowTitle()+"]未完成"); + } + instanceFlow.setFlowState(2); + } + instanceFlowService.updateBatchById(instanceFlowList); + BazVisitInstance visitInstance = new BazVisitInstance(); + visitInstance.setVisitState(1); + visitInstance.setId(instanceId); + this.updateById(visitInstance); + } + } + + @Override + public List selectBazVisitInstanceList(BazVisitInstance param) { + return super.baseMapper.selectBazVisitInstanceList(param); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/impl/BazVisitServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/impl/BazVisitServiceImpl.java new file mode 100644 index 0000000..d08b9e6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/baz/service/impl/BazVisitServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.baz.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.baz.entity.BazVisit; +import com.qs.serve.modules.baz.service.BazVisitService; +import com.qs.serve.modules.baz.mapper.BazVisitMapper; + +/** + * 拜访 服务实现类 + * @author YenHex + * @since 2023-04-07 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BazVisitServiceImpl extends ServiceImpl implements BazVisitService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/consts/BirActivityCenterGoodsUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/consts/BirActivityCenterGoodsUtil.java new file mode 100644 index 0000000..b5e79de --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/consts/BirActivityCenterGoodsUtil.java @@ -0,0 +1,53 @@ +package com.qs.serve.modules.bir.consts; + +import cn.hutool.core.collection.CollUtil; +import com.qs.serve.common.util.SpringUtils; +import com.qs.serve.modules.bir.service.BirActivityCenterGoodsService; +import com.qs.serve.modules.tbs.entity.TbsCostBirLog; +import com.qs.serve.modules.tbs.mapper.TbsCostBirLogMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeansException; + +import java.util.Arrays; +import java.util.List; + +/** + * @author YenHex + * @since 2024/3/15 + */ +@Slf4j +public class BirActivityCenterGoodsUtil { + + public static void buildBir(Long costId){ + if(costId==null){ + return; + } + buildBir(Arrays.asList(costId)); + } + + public static void buildBir(List costIds){ + TbsCostBirLogMapper birLogMapper = null; + try { + birLogMapper = SpringUtils.getBean(TbsCostBirLogMapper.class); + } catch (BeansException e) { + e.printStackTrace(); + } + if(birLogMapper==null){ + log.error("获取不到BEAN TbsCostBirLogMapper BirActivityCenterGoodsUtil "); + return; + } + if(CollUtil.isEmpty(costIds)){ + return; + } + for (Long costId : costIds) { + try { + TbsCostBirLog birLog = new TbsCostBirLog(); + birLog.setCostId(costId); + birLogMapper.insert(birLog); + } catch (BeansException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/consts/TbsVtbPayShowType.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/consts/TbsVtbPayShowType.java new file mode 100644 index 0000000..76d92a3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/consts/TbsVtbPayShowType.java @@ -0,0 +1,12 @@ +package com.qs.serve.modules.bir.consts; + +/** + * @author YenHex + * @since 2023/10/25 + */ +public interface TbsVtbPayShowType { + + Integer activity = 1; + Integer activityVtb = 2; + Integer all = 3; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/controller/BirActivityCenterGoodsController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/controller/BirActivityCenterGoodsController.java new file mode 100644 index 0000000..5eefb11 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/controller/BirActivityCenterGoodsController.java @@ -0,0 +1,293 @@ +package com.qs.serve.modules.bir.controller; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.aliyun.oss.OSS; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.qs.serve.common.config.properties.AliYunOssProperties; +import com.qs.serve.common.config.properties.ProjectProperties; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bir.entity.BirActivityCenterGoods; +import com.qs.serve.modules.bir.service.BirActivityCenterGoodsService; +import com.qs.serve.modules.oss.service.OssService; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.common.util.BirHttpUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.mapper.*; +import com.qs.serve.modules.tbs.service.TbsCostApplyService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.io.*; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 基础档案 渠道 + * @author YenHex + * @since 2022-11-03 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bir/centerGoods") +public class BirActivityCenterGoodsController { + + private OssService ossService; + private AliYunOssProperties aliYunOSSProperties; + private BirActivityCenterGoodsService centerGoodsService; + private TbsCostApplyService tbsCostApplyService; + private ProjectProperties projectProperties; + private TbsCostBirLogMapper tbsCostBirLogMapper; + private TbsActivityCenterGoodsMapper tbsActivityCenterGoodsMapper; + private TbsActivityMapper tbsActivityMapper; + private TbsBudgetLogMapper tbsBudgetLogMapper; + private TbsBudgetMapper tbsBudgetMapper; + + @GetMapping("/toSyncBir") + public R syncBir(Long costId){ + boolean isRestBir = BirHttpUtil.isRestBir(); + if(isRestBir){ + return BirHttpUtil.get("/bir/centerGoods/toSyncBir?costId="+costId,null); + } + centerGoodsService.rebuildBir(Arrays.asList(costId)); + return R.ok(); + } + + /** + * 通过budgetCode更新所有费用的bir + * @param budgetCode + * @return + */ + @GetMapping("/toSyncBirbyBudgetCode") + public R toSyncBirbyBudgetCode(String budgetCode){ + List budgetList = tbsBudgetMapper.selectList(new LambdaQueryWrapper().eq(TbsBudget::getBudgetNumber,budgetCode)); + if(budgetList.size()==1){ + List costIds = tbsBudgetLogMapper.getBudgetCostIds(budgetList.get(0).getId()); + //centerGoodsService.rebuildBir(Arrays.asList(costIds)); + if(CollectionUtil.isNotEmpty(costIds)){ + for (Long costId : costIds) { + centerGoodsService.rebuildBir(Arrays.asList(costId)); + } + } + } + return R.ok(); + } + + + @GetMapping("/toSyncBirbyId") + public R toSyncBirbyId(String costId){ + List list = tbsCostApplyService.listByIds(Arrays.asList(costId)); + for (TbsCostApply costApply : list) { + centerGoodsService.rebuildBir(Arrays.asList(costApply.getId())); + } + return R.ok(); + } + + @GetMapping("/toSyncBirbyCode") + public R toSyncBirEcro(String costCode){ + List list = tbsCostApplyService.list(new LambdaQueryWrapper().eq(TbsCostApply::getCode,costCode)); + for (TbsCostApply costApply : list) { + centerGoodsService.rebuildBir(Arrays.asList(costApply.getId())); + } + return R.ok(); + } + + /** + * 移除退回的费用申请 + * @return + */ + @GetMapping("/toSyncBackCost") + public R toSyncBackCost(){ + List list = tbsCostApplyService.list(new LambdaQueryWrapper() + .eq(TbsCostApply::getChargeState, TbsCostApplyState.State_4_refused.getCode()) + .orderByDesc(TbsCostApply::getId) + .last(" limit 10000") + ); + for (TbsCostApply costApply : list) { + centerGoodsService.rebuildBir(Arrays.asList(costApply.getId())); + } + return R.ok(); + } + + @GetMapping("/toSyncBirToday") + public R toSyncBirEcro2(){ + //Long[] ids = new Long[]{}; + //List ids = tbsActivityMapper.selectReleaseCostIds(); + Set ids = tbsActivityCenterGoodsMapper.selectUpdateCostApplyIds(); + List errIds = new ArrayList<>(); + for (Long id : ids) { + log.error("执行ID XXXX:{}",id); + try { + centerGoodsService.rebuildBir(Arrays.asList(id)); + } catch (Exception e) { + e.printStackTrace(); + errIds.add(id); + } + } + for (Long errId : errIds) { + log.error("错误的费用申请ID:{}",errId); + } + return R.ok(); + } + + /** + * 移除因作废的费用申请导致的bir数据 + * @return + */ + @GetMapping("/toSyncRmCost") + public R toSyncRm(){ + //select id from tbs_cost_apply where del_flag = 0 and ( cancel_flag = 1 or charge_state in (5,6,8) ) + List costApplyList = tbsCostApplyService.list(new LambdaQueryWrapper() + .select(TbsCostApply::getId) + .and( + qw->qw.eq(TbsCostApply::getCancelFlag,1) + .or() + .in(TbsCostApply::getChargeState,5,6,8) + ) + .ne(TbsCostApply::getTmpState,3) + .last(" limit 1600 ") + ); + List ids = costApplyList.stream().map(TbsCostApply::getId).collect(Collectors.toList()); + if(ids.size()<1){ + log.warn("已全部移除了错误的bir数据"); + return R.ok(); + } + centerGoodsService.rebuildBir(ids); + tbsCostApplyService.update(new LambdaUpdateWrapper() + .set(TbsCostApply::getTmpState,3) + .in(TbsCostApply::getId,ids)); + return R.ok(); + } + + @GetMapping("/toSyncBirEcro") + public R toSyncBirEcro(){ + List costIds = tbsCostBirLogMapper.listCostIds(); + if(CollectionUtil.isNotEmpty(costIds)){ + for (Long costId : costIds) { + centerGoodsService.rebuildBir(Arrays.asList(costId)); + tbsCostBirLogMapper.delete(new LambdaQueryWrapper().eq(TbsCostBirLog::getCostId,costId)); + } + } + return R.ok(); + } + + @GetMapping("/toSyncDev") + public R syncBir(Integer idType){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw + .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); + } + return R.ok(); + } + private boolean extracted(LambdaQueryWrapper lqw) { + List costApplyList = tbsCostApplyService.list(lqw); + List costIds = costApplyList.stream().map(TbsCostApply::getId).collect(Collectors.toList()); + if(CollectionUtil.isEmpty(costIds)){ + return true; + } + 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,20)); + log.info("{}/{} {}",i,costIds.size(),costId); + } + return costIds.size()<100; + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BirActivityCenterGoods param){ + boolean isRestBir = BirHttpUtil.isRestBir(); + if(isRestBir){ + return BirHttpUtil.get("/bir/centerGoods/page",param); + } + PageUtil.startPage(); + LambdaQueryWrapper channelWrapper = new LambdaQueryWrapper<>(param); + if(param.getKeyNumStart()!=null){ + Integer keyNumStart = Integer.parseInt(param.getKeyNumStart().replace("-","")); + channelWrapper.ge(BirActivityCenterGoods::getKeyNum,keyNumStart); + } + if(param.getKeyNumEnd()!=null){ + Integer keyNumEnd = Integer.parseInt(param.getKeyNumEnd().replace("-","")); + channelWrapper.le(BirActivityCenterGoods::getKeyNum,keyNumEnd); + } + List list = centerGoodsService.list(channelWrapper); + return R.byPageHelperList(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/export") + public R export(BirActivityCenterGoods param){ + boolean isRestBir = BirHttpUtil.isRestBir(); + if(isRestBir){ + return BirHttpUtil.get("/bir/centerGoods/export",param); + } + LambdaQueryWrapper channelWrapper = new LambdaQueryWrapper<>(param); + if(param.getKeyNumStart()!=null){ + Integer keyNumStart = Integer.parseInt(param.getKeyNumStart().replace("-","")); + channelWrapper.ge(BirActivityCenterGoods::getKeyNum,keyNumStart); + } + if(param.getKeyNumEnd()!=null){ + Integer keyNumEnd = Integer.parseInt(param.getKeyNumEnd().replace("-","")); + channelWrapper.le(BirActivityCenterGoods::getKeyNum,keyNumEnd); + } + List list = centerGoodsService.list(channelWrapper); + + String templateFileName = "tempFiles"; + InputStream inputStream = null; + try { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + ExcelWriter excelWriter = EasyExcel.write().withTemplate(templateFileName).file(os).build(); + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + excelWriter.fill(list, writeSheet); + excelWriter.finish(); + byte[] buffer = os.toByteArray(); + inputStream = new ByteArrayInputStream(buffer); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM/dd"); + String prefix = aliYunOSSProperties.getPrefix(); + String dir = prefix + "/" + sdf.format(new Date())+"/"; + String fileName = dir + IdUtil.getSnowflakeNextId() + ".xlsx"; + OSS oss = ossService.getOSSClient(); + oss.putObject(aliYunOSSProperties.getBucket(),fileName,inputStream); + return R.ok(fileName,"ok"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if(inputStream!=null){ + inputStream.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return R.error(); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/controller/BirBudgetScheduleController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/controller/BirBudgetScheduleController.java new file mode 100644 index 0000000..09c5fb4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/controller/BirBudgetScheduleController.java @@ -0,0 +1,106 @@ +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; +import com.qs.serve.modules.tbs.entity.so.TbsScheduleItemSearch; +import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudget2Mapper; +import com.qs.serve.modules.tbs.mapper.TbsScheduleItemMapper; +import com.qs.serve.modules.tbs.mapper.TbsScheduleMapper; +import com.qs.serve.modules.tbs.service.TbsScheduleItemBudgetService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/12/27 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bir/budget") +public class BirBudgetScheduleController { + + private final TbsScheduleItemBudgetService scheduleItemBudgetService; + private final TbsScheduleItemBudget2Mapper scheduleItemBudget2Mapper; + private final TbsScheduleItemMapper tbsScheduleItemMapper; + private final TbsScheduleMapper tbsScheduleMapper; + + + /** + * 查询预算使用情况 + * @param query + * @return + */ + @PostMapping("/budgetUsedList") + public R> queryBudgetUsed(@RequestBody TbsScheduleItemSearch query){ + query.initCenterCombo(); + List scheduleItemWithAmounts = scheduleItemBudgetService.listBudgetAmountByIds(query); + 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 + * @return + */ + @PostMapping("/budgetItemUsedList") + public R> queryBudgetItemUsed(@RequestBody TbsScheduleItemSearch query){ + query.initCenterCombo(); + if(CollectionUtil.isNotEmpty(query.getScheduleIds())){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(TbsScheduleItem::getScheduleId,query.getScheduleIds()); + lqw.select(TbsScheduleItem::getId); + List scheduleItemList = tbsScheduleItemMapper.selectList(lqw); + List itemIds = scheduleItemList.stream().map(a->a.getId().toString()).collect(Collectors.toList()); + query.setScheduleItemIds(itemIds); + } + List scheduleItemBudgetIdDtoList = scheduleItemBudget2Mapper.listItemBudgetIds(query); + List scheduleItemIds = scheduleItemBudgetIdDtoList.stream().map(TbsScheduleItemBudgetIdDto::getScheduleItemId).collect(Collectors.toList()); + if(CollectionUtil.isEmpty(scheduleItemIds)){ + return R.ok(); + } + List scheduleItemList = tbsScheduleItemMapper.selectBatchIds(scheduleItemIds); + List scheduleList = tbsScheduleMapper.selectList(new QueryWrapper<>()); + List scheduleItemWithAmounts = scheduleItemBudgetService.listScheduleItemAmountByIds(scheduleItemBudgetIdDtoList); + for (TbsScheduleItemWithAmount itemWithAmount : scheduleItemWithAmounts) { + for (TbsScheduleItem scheduleItem : scheduleItemList) { + if(itemWithAmount.getScheduleItemId().equals(scheduleItem.getId())){ + itemWithAmount.setScheduleItemName(scheduleItem.getItemName()); + for (TbsSchedule schedule : scheduleList) { + if(schedule.getId().equals(scheduleItem.getScheduleId())){ + itemWithAmount.setScheduleName(schedule.getName()); + break; + } + } + break; + } + } + } + return R.ok(scheduleItemWithAmounts); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/controller/BirRoiRateController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/controller/BirRoiRateController.java new file mode 100644 index 0000000..ca5f38c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/controller/BirRoiRateController.java @@ -0,0 +1,259 @@ +package com.qs.serve.modules.bir.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.annotation.RepeatSubmit; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bir.entity.so.BirBudgetTargetSo; +import com.qs.serve.modules.bir.entity.so.BirCostRoiSo; +import com.qs.serve.modules.bir.entity.vo.*; +import com.qs.serve.modules.bir.service.*; +import com.qs.serve.modules.sys.entity.SysDictData; +import com.qs.serve.modules.sys.service.SysDictDataService; +import com.qs.serve.modules.tbs.common.TbsCenterType; +import com.qs.serve.modules.tbs.common.util.BirHttpUtil; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsActivityCenter; +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; +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.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +/** + * BI报表 ROI费率 + * @author YenHex + * @since 2023-06-05 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bir/roiRate") +public class BirRoiRateController { + + private BirRoiRateService birRoiRateService; + private BirBaseActivityService activityService; + private BirActivityCenterGoodsService birActivityCenterGoodsService; + private BirReportAccountBookService birReportAccountBookService; + private TbsBudgetService tbsBudgetService; + private BirCenterRateService birCenterRateService; + private SysDictDataService sysDictDataService; + private TbsCostApplyService costApplyService; + private TbsActivityMapper tbsActivityMapper; + private TbsActivityCenterMapper tbsActivityCenterMapper; + private BirBaseActivityService birBaseActivityService; + private BirBudgetTargetService birBudgetTargetService; + private BirBudgetTargetImportService birBudgetTargetImportService; + + /** + * 测试 + * @param id + * @return + */ + @GetMapping("/testCostCenter") + public R buildCostCenter(String id){ + TbsActivityCenter tbsActivityCenter = tbsActivityCenterMapper.selectById(id); + TbsActivity activity = tbsActivityMapper.selectById(tbsActivityCenter.getActivityId()); + return R.ok(BirHttpUtil.buildCostCenter(tbsActivityCenter.getCenterType(), + tbsActivityCenter.getCenterId(), + tbsActivityCenter.getCenterName(), + activity.getSupplierCode())); + } + + @GetMapping("/getCostCenter") + public R buildCostCenter(String centerType, String centerId, String centerName,String supplierCode){ + return R.ok(birCenterRateService.buildCostCenter(centerType, centerId, centerName, supplierCode)); + } + + + + + /** + * 台账 + * @return + */ + @GetMapping("/standingBook") + public R standingBookByCall(String type,String year){ + if(!StringUtils.hasText(year) || !StringUtils.hasText(type)){ + Assert.throwEx("参数不能为空!"); + } + boolean isRestBir = BirHttpUtil.isRestBir(); + if(isRestBir){ + return BirHttpUtil.get("/bir/roiRate/standingBook?type="+type+"&year="+year); + } + return R.ok(birReportAccountBookService.getReportAccountBookData(type,year)); + } + + /** + * 台账 + * @return + */ + @GetMapping("/standingBookExport") + public R standingBookExport(String year){ + if(!StringUtils.hasText(year)){ + Assert.throwEx("参数不能为空!"); + } + boolean isRestBir = BirHttpUtil.isRestBir(); + if(isRestBir){ + return BirHttpUtil.get("/bir/roiRate/standingBookExport?year="+year); + } + List vos = new ArrayList<>(); + BirAccountReportVo center = birReportAccountBookService.getReportAccountBookData(TbsCenterType.center.name(),year); + BirAccountReportVo customer = birReportAccountBookService.getReportAccountBookData(TbsCenterType.customer.name(),year); + BirAccountReportVo saleRegion = birReportAccountBookService.getReportAccountBookData(TbsCenterType.saleRegion.name(),year); + BirAccountReportVo bizRegion = birReportAccountBookService.getReportAccountBookData(TbsCenterType.bizRegion.name(),year); + vos.add(center); + vos.add(customer); + vos.add(saleRegion); + vos.add(bizRegion); + return R.ok(vos); + } + + /** + * 获取费率 + * @param param + * @return + */ + @RepeatSubmit + @GetMapping("/costYearMonth") + public R getCostRoiOfYearMonth(BirCostRoiSo param){ + boolean isRestBir = BirHttpUtil.isRestBir(); + if(isRestBir){ + return BirHttpUtil.get("/bir/roiRate/costYearMonth",param); + } + BirRoiVo vo = new BirRoiVo(); + List itemList = birRoiRateService.getCostRoiOfYearMonth(param); + vo.setItemList(itemList); + vo.setYtdPercent(birRoiRateService.getYtdPercent(itemList)); + vo.setQtdPercent(birRoiRateService.getQtdPercent(itemList)); + + vo.setYtdRegionPercent(birRoiRateService.getYtdRegionPercent(itemList)); + vo.setYtdAllPercent(birRoiRateService.getYtdAllPercent(itemList)); + vo.setQtdAllPercent(birRoiRateService.getQtdAllPercent(itemList)); + vo.setQtdRegionPercent(birRoiRateService.getQtdRegionPercent(itemList)); + + return R.ok(vo); + } + + /** + * 获取费率 + * @param query + * @return + */ +// @RepeatSubmit +// @PostMapping("/costYearMonthV2") +// public R> getCostRoiOfYearMonthV2(@RequestBody BirBudgetTargetSo query){ +// boolean isRestBir = BirHttpUtil.isRestBir(); +// if(isRestBir){ +// return BirHttpUtil.post("/bir/roiRate/costYearMonthV2",query); +// } +// List list = birBudgetTargetService.listVo(query); +// return R.ok(list); +// } + + /** + * 获取费率 + * @param query + * @return + */ + @RepeatSubmit + @PostMapping("/costYearMonthBaseV2") + public R> getCostRoiOfYearMonthBaseV2(@RequestBody BirBudgetTargetSo query){ + boolean isRestBir = BirHttpUtil.isRestBir(); + if(isRestBir){ + return BirHttpUtil.post("/bir/roiRate/costYearMonthBaseV2",query); + } + List list = birBudgetTargetService.listBaseVo(query); + return R.ok(list); + } + + @GetMapping("/getCenterByTargetId") + public R> getCenterByTargetId(BirBudgetTargetSo query){ + List list = birBudgetTargetService.getCenterByTargetId(query); + return R.ok(list); + } + + +// @PostMapping("/buildCustomerCost") +// public R buildCustomerCost(){ +//// boolean isRestBir = BirHttpUtil.isRestBir(); +//// if(isRestBir){ +//// return BirHttpUtil.get("/bir/roiRate/buildCustomerCost"); +//// } +// birBudgetTargetImportService.deleteAll(); +// birBudgetTargetImportService.buildCustomerCost(); +// birBudgetTargetImportService.buildCityCost(); +// birBudgetTargetImportService.buildProCost(); +// birBudgetTargetImportService.buildAreaCost(); +// return R.ok(); +// } + + + /** + * 获取成本中心费率 + * @param costApplyId + * @param policyId + * @return + */ + @RepeatSubmit + @GetMapping("/centerRateByCostApplyId") + public R> centerRateByCostApplyId(Long costApplyId,Long policyId){ + boolean isRestBir = BirHttpUtil.isRestBir(); + if(isRestBir){ + if(costApplyId!=null){ + return BirHttpUtil.get("/bir/roiRate/centerRateByCostApplyId?costApplyId="+costApplyId); + } + if(policyId!=null){ + return BirHttpUtil.get("/bir/roiRate/centerRateByCostApplyId?policyId="+policyId); + } + return R.ok(); + } + return R.ok(birCenterRateService.findCostCenterDataByCostApplyId(costApplyId,policyId)); + } + + /** + * 获取成本中心费率(版本v2) + * @param costApplyId + * @param policyId + * @return + */ + @RepeatSubmit + @GetMapping("/centerRateByCostApplyIdv2") + public R> centerRateByCostApplyIdv2(Long costApplyId,Long policyId){ + boolean isRestBir = BirHttpUtil.isRestBir(); + if(isRestBir){ + if(costApplyId!=null){ + return BirHttpUtil.get("/bir/roiRate/centerRateByCostApplyIdv2?costApplyId="+costApplyId,null); + } + if(policyId!=null){ + return BirHttpUtil.get("/bir/roiRate/centerRateByCostApplyIdv2?policyId="+policyId,null); + } + return R.ok(); + } + return R.ok(birCenterRateService.selectCostApplyRateVoList(costApplyId,policyId)); + } + + /** + * 发货单时间 + * @return + */ + @GetMapping("/dispatchTime") + public R getDispatchTime(){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SysDictData::getGroupKey,"dispatch_sync_time"); + SysDictData sysDictData = sysDictDataService.getOne(lqw); + if(sysDictData==null){ + return R.ok("2023-10-1 12:00:00","demo默认数据"); + } + return R.ok(sysDictData.getKeyVal(),"ok"); + } + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/controller/BirTbsVtbPayJoinController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/controller/BirTbsVtbPayJoinController.java new file mode 100644 index 0000000..50673cb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/controller/BirTbsVtbPayJoinController.java @@ -0,0 +1,87 @@ +package com.qs.serve.modules.bir.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.annotation.RepeatSubmit; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.common.util.bus.QueryFilterUtil; +import com.qs.serve.modules.bir.entity.dto.BirTbsVtbPayJoinDTO; +import com.qs.serve.modules.bir.entity.so.BirCostRoiSo; +import com.qs.serve.modules.bir.entity.so.BirTbsVtbPayJoinSo; +import com.qs.serve.modules.bir.entity.vo.BirAccountReportVo; +import com.qs.serve.modules.bir.entity.vo.BirRoiCostItemVo; +import com.qs.serve.modules.bir.entity.vo.BirRoiVo; +import com.qs.serve.modules.bir.service.*; +import com.qs.serve.modules.sys.entity.SysDictData; +import com.qs.serve.modules.sys.service.SysDictDataService; +import com.qs.serve.modules.tbs.common.TbsCenterType; +import com.qs.serve.modules.tbs.entity.dto.TbsCostSubItem; +import com.qs.serve.modules.tbs.service.TbsBudgetService; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.entity.dto.VtbActivityCheckDTO; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * BI报表 ROI费率 + * @author YenHex + * @since 2023-06-05 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bir/tbsVtbPayJoin") +public class BirTbsVtbPayJoinController { + + private BirTbsVtbPayJoinService birTbsVtbPayJoinService; + + @GetMapping("/page") + public R> page(BirTbsVtbPayJoinSo so){ + if(so.getShowType()==null){ + Assert.throwEx("请选择显示方式!"); + } + if(so.getQueryStartSubmitTime()==null||so.getQueryEndSubmitTime()==null){ + Assert.throwEx("请选择申请时间段"); + } + long daysBetween = ChronoUnit.DAYS.between(so.getQueryStartSubmitTime(), so.getQueryEndSubmitTime()); + long maxDiff = 120L; + if(daysBetween > maxDiff){ + Assert.throwEx("申请时间段跨度最大值(天):"+maxDiff); + } + PageVo page = birTbsVtbPayJoinService.selectBirTbsVtbPayJoinDTO(so,1); + BirTbsVtbPayJoinDTO sumData = birTbsVtbPayJoinService.getSumData(so); + Map returnMap = new HashMap<>(); + returnMap.put("page",page); + returnMap.put("sumData",sumData); + + return R.ok(returnMap); + } + + @GetMapping("/export") + public R> export(BirTbsVtbPayJoinSo so){ + if(so.getShowType()==null){ + Assert.throwEx("请选择显示方式!"); + } + QueryFilterUtil.filterSubmitDate(so.getQueryStartSubmitTime(),so.getQueryEndSubmitTime(),120); + PageVo page = birTbsVtbPayJoinService.selectBirTbsVtbPayJoinDTO(so,0); + BirTbsVtbPayJoinDTO sumData = birTbsVtbPayJoinService.getSumData(so); + Map returnMap = new HashMap<>(); + returnMap.put("list",page.getList()); + returnMap.put("sumData",sumData); + + return R.ok(returnMap); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirActivityCenterGoods.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirActivityCenterGoods.java new file mode 100644 index 0000000..d975752 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirActivityCenterGoods.java @@ -0,0 +1,351 @@ +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.alibaba.excel.annotation.ExcelProperty; +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 2023-07-07 + */ +@Data +@TableName("bir_activity_center_goods") +public class BirActivityCenterGoods implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 活动费用明细 */ + @ExcelProperty("活动费用明细ID") + @NotNull(message = "活动费用明细不能为空") + private Long activityCenterGoodsId; + + /** 年月 */ + @ExcelProperty("年月") + @NotNull(message = "年月不能为空") + private Integer keyNum; + + /** 天数 */ + @ExcelProperty("天数") + @NotNull(message = "天数不能为空") + private Integer days; + + @ExcelProperty("当月有多少天") + @NotNull(message = "天数不能为空") + private Integer dayOfMouth; + + /** 开始日期 */ + @ExcelProperty("开始日期") + @NotNull(message = "开始日期不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate starDate; + + /** 结束日期 */ + @ExcelProperty("结束日期") + @NotNull(message = "结束日期不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate endDate; + + /** 分配的预算金额 */ + @ExcelProperty("分配的预算金额") + @NotNull(message = "分配的预算金额不能为空") + private BigDecimal splitAmount; + + /** 分配的核销金额 */ + @ExcelProperty("分配的核销金额") + @NotNull(message = "分配的核销金额不能为空") + private BigDecimal splitUsedAmount; + + /** 分配的释放金额 */ + @ExcelProperty("分配的释放金额") + @NotNull(message = "分配的释放金额不能为空") + private BigDecimal splitReleaseAmount; + + private BigDecimal splitPayAmount; + + /** 成本明细编码 */ + @ExcelProperty("成本明细编码") + @Length(max = 30,message = "成本明细编码长度不能超过30字") + private String centerGoodsCode; + + /** 费用申请id */ + @ExcelProperty("费用申请id") + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @ExcelProperty("活动id") + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 活动编码 */ + @ExcelProperty("活动编码") + @NotBlank(message = "活动编码不能为空") + @Length(max = 30,message = "活动编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String activityCode; + + /** 活动总金额 */ + @ExcelProperty("活动总金额") + private BigDecimal activityTotalAmount; + + /** 活动总核销金额 */ + @ExcelProperty("活动总核销金额") + private BigDecimal activityTotalCheckAmount; + + /** 活动完成主题 */ + @ExcelProperty("活动完成主题") + private Integer activityFinishedFlag; + + /** 活动释放 */ + @ExcelProperty("活动释放金额") + private BigDecimal activityTotalReleaseAmount; + + private BigDecimal activityTotalPayAmount; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @ExcelProperty("科目编码") + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + @TableField(condition = SqlCondition.LIKE) + private String subjectCode; + + /** 科目名称 */ + @ExcelProperty("科目名称") + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + @TableField(condition = SqlCondition.LIKE) + private String subjectName; + + /** 成本中心类型 */ + @ExcelProperty("成本中心类型") + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 50,message = "成本中心类型长度不能超过50字") + private String centerType; + + /** 成本中心id */ + @NotBlank(message = "成本中心id不能为空") + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @ExcelProperty("成本中心编码") + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 50,message = "成本中心编码长度不能超过50字") + @TableField(condition = SqlCondition.LIKE) + private String centerCode; + + /** 成本中心名称 */ + @ExcelProperty("成本中心名称") + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 200,message = "成本中心名称长度不能超过200字") + @TableField(condition = SqlCondition.LIKE) + private String centerName; + + /** 成本中心金额 */ + @ExcelProperty("成本中心金额") + @NotNull(message = "成本中心金额不能为空") + private BigDecimal centerAmount; + + /** 成本中心占比 */ + @ExcelProperty("成本中心占比") + @NotNull(message = "成本中心占比不能为空") + private BigDecimal centerRate; + + /** 费用额度 */ + @ExcelProperty("费用额度") + @NotNull(message = "费用额度不能为空") + private BigDecimal centerGoodsAmount; + + /** 费用占比 */ + @ExcelProperty("费用占比") + @NotNull(message = "费用占比不能为空") + private BigDecimal centerGoodsRate; + + /** 已用费用 */ + @ExcelProperty("已用费用") + @NotNull(message = "已用费用不能为空") + private BigDecimal usedAmount; + + /** 目标类型(brand、category、series、spu、sku) */ + @ExcelProperty("商品维度类型") + @NotBlank(message = "目标类型(brand、category、series、spu、sku)不能为空") + @Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字") + private String targetType; + + /** 目标id */ + @NotNull(message = "目标id不能为空") + private Long targetId; + + /** 目标编码 */ + @ExcelProperty("商品维度编码") + @NotBlank(message = "目标编码不能为空") + @Length(max = 30,message = "目标编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String targetCode; + + /** 目标名称 */ + @ExcelProperty("商品维度名称") + @NotBlank(message = "目标名称不能为空") + @Length(max = 200,message = "目标名称长度不能超过200字") + @TableField(condition = SqlCondition.LIKE) + private String targetName; + + /** 目标等级路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathIds; + + /** 目标等级路径 */ + @Length(max = 800,message = "目标等级路径长度不能超过800字") + private String targetLevelPathNames; + + /** 一级成本中心 */ + @Length(max = 32,message = "一级成本中心长度不能超过32字") + private String centerLv1Id; + + /** 一级成本中心 */ + @ExcelProperty("一级成本中心编码") + @Length(max = 50,message = "一级成本中心长度不能超过50字") + private String centerLv1Code; + + /** 一级成本中心 */ + @ExcelProperty("一级成本中心") + @Length(max = 255,message = "一级成本中心长度不能超过255字") + private String centerLv1Name; + + /** 二级成本中心 */ + @Length(max = 32,message = "二级成本中心长度不能超过32字") + private String centerLv2Id; + + /** 二级成本中心 */ + @ExcelProperty("二级成本中心编码") + @Length(max = 50,message = "二级成本中心长度不能超过50字") + private String centerLv2Code; + + /** 二级成本中心 */ + @ExcelProperty("二级成本中心") + @Length(max = 255,message = "二级成本中心长度不能超过255字") + private String centerLv2Name; + + /** 备注 */ + @Length(max = 600,message = "备注长度不能超过600字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 活动开始时间 */ + @ExcelProperty("活动开始时间") + @NotNull(message = "活动开始时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate actStartDate; + + /** 活动结束时间 */ + @ExcelProperty("活动结束时间") + @NotNull(message = "活动结束时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate actEndDate; + + /** 预算开始时间 */ + @ExcelProperty("预算开始时间") + @NotNull(message = "预算开始时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate preStartDate; + + /** 预算结束时间 */ + @ExcelProperty("预算结束时间") + @NotNull(message = "预算结束时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate preEndDate; + + /** 预计核销时间 */ + @ExcelProperty("预计核销时间") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate preCheckDate; + + /** 客户id */ + @NotNull(message = "客户id不能为空") + private Long supplierId; + + /** 客户编码 */ + @ExcelProperty("客户编码") + @NotBlank(message = "客户编码不能为空") + @Length(max = 30,message = "客户编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String supplierCode; + + /** 客户名称 */ + @ExcelProperty("客户名称") + @NotBlank(message = "客户名称不能为空") + @Length(max = 200,message = "客户名称长度不能超过200字") + @TableField(condition = SqlCondition.LIKE) + private String supplierName; + + private Long templateId; + + private Long budgetId; + + private Long scheduleItemBudgetId; + + @TableField(condition = SqlCondition.LIKE) + private String templateTitle; + + @TableField(condition = SqlCondition.LIKE) + private String supplierSaleRegionName; + + private String supplierSaleRegionId; + + @TableField(condition = SqlCondition.LIKE) + private String supplierBizRegionName; + + private String supplierBizRegionId; + + @TableField(exist = false) + private String keyNumStart; + + @TableField(exist = false) + private String keyNumEnd; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirBaseActivity.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirBaseActivity.java new file mode 100644 index 0000000..eeab188 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirBaseActivity.java @@ -0,0 +1,154 @@ +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; + +/** + * ROI费率(活动档案) 实体类 + * @author YenHex + * @since 2023-06-05 + */ +@Data +@TableName("bir_base_activity") +public class BirBaseActivity implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 编号 */ + @TableId(type = IdType.INPUT) + private Long id; + + /** 键值(日期数) */ + @NotNull(message = "键值(日期数)不能为空") + private Integer keyNum; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + private Long costApplyId; + + /** 活动金额(分割,费用投入金额) */ + @NotNull(message = "活动金额(费用投入金额)不能为空") + private BigDecimal activityAmt; + + /** 核销总金额 */ + private BigDecimal activityUsedAmt; + + /** 活动总金额(费用投入金额) */ + @NotNull(message = "活动总金额(费用投入金额)不能为空") + private BigDecimal activityTotalAmt; + + /** 核销金额(分割) */ + @NotNull(message = "核销金额不能为空") + private BigDecimal verificationAmt; + + private BigDecimal preActQuantity; + + /** 费用通过标识,用于已申请费用活动列表 */ + private Integer costPassFlag; + + /** 客户id */ + @NotNull(message = "客户id不能为空") + private Long supplierId; + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + @Length(max = 30,message = "客户编码长度不能超过30字") + private String supplierCode; + + /** 客户名称 */ + @NotBlank(message = "客户名称不能为空") + @Length(max = 200,message = "客户名称长度不能超过200字") + private String supplierName; + + /** 用户id */ + @NotBlank(message = "用户id不能为空") + @Length(max = 64,message = "用户id长度不能超过64字") + private String userId; + + /** 当月有多少天 */ + private Integer monthDays; + + /** 活动总天数 */ + private Integer totalDays; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate startDate; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate endDate; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate activityStartDate; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate activityEndDate; + + private Integer applyStatus; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + public static BirBaseActivity toNewObject(BirBaseActivity source){ + BirBaseActivity baseActivity = new BirBaseActivity(); + baseActivity.setId(source.getId()); + baseActivity.setKeyNum(source.getKeyNum()); + baseActivity.setActivityId(source.getActivityId()); + baseActivity.setActivityAmt(source.getActivityAmt()); + baseActivity.setActivityTotalAmt(source.getActivityTotalAmt()); + baseActivity.setVerificationAmt(source.getVerificationAmt()); + baseActivity.setSupplierId(source.getSupplierId()); + baseActivity.setSupplierCode(source.getSupplierCode()); + baseActivity.setSupplierName(source.getSupplierName()); + baseActivity.setUserId(source.getUserId()); + baseActivity.setMonthDays(source.getMonthDays()); + baseActivity.setTotalDays(source.getTotalDays()); + baseActivity.setStartDate(source.getStartDate()); + baseActivity.setEndDate(source.getEndDate()); + baseActivity.setCreateTime(source.getCreateTime()); + baseActivity.setUpdateTime(source.getUpdateTime()); + baseActivity.setTenantId(source.getTenantId()); + baseActivity.setDelFlag(source.getDelFlag()); + return baseActivity; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirBudgetTarget.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirBudgetTarget.java new file mode 100644 index 0000000..5310ba4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirBudgetTarget.java @@ -0,0 +1,129 @@ +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.INPUT) + private Long id; + + /** 搜索维度:0-客户;1-城市;2-省级经理;3-大区经理 */ + @TableField(value = "search_type") + private Integer searchType; + + // 年份 + @TableField(value = "year_num") + private Integer yearNum; + + // 季度 + @TableField(value = "quarter_num") + private Integer quarterNum; + + // 月份 + @TableField(value = "month_num") + private Integer monthNum; + + // 销售目标 + @TableField(value = "target_amt") + private BigDecimal targetAmt; + + // 预算金额 + @TableField(value = "budget_amt") + private BigDecimal budgetAmt; + + // 实际发货 + @TableField(value = "dispatch_amt") + private BigDecimal dispatchAmt; + + // 去年同期发货 + @TableField(value = "last_year_dispatch_amt") + private BigDecimal lastYearDispatchAmt; + + // 城+省费用 + @TableField(value = "province_city_amt") + private BigDecimal provinceCityAmt; + + // 城+省+区费用 + @TableField(value = "province_city_region_amt") + private BigDecimal provinceCityRegionAmt; + + // 实际总费用 + @TableField(value = "total_real_amt") + private BigDecimal totalRealAmt; + + // 品牌ID + @TableField(value = "brand_id") + private String brandId; + + // 品牌编码 + @TableField(value = "brand_code") + @Length(max = 255, message = "品牌编码长度不能超过255字") + private String brandCode; + + // 品牌名称 + @TableField(value = "brand_name") + @Length(max = 255, message = "品牌长度不能超过255字") + private String brandName; + + // 客户ID + @TableField(value = "customer_id") + private String customerId; + + // 客户编码 + @TableField(value = "customer_code") + @Length(max = 255, message = "客户编码长度不能超过255字") + private String customerCode; + + // 客户名称 + @TableField(value = "customer_name") + @Length(max = 255, message = "客户长度不能超过255字") + private String customerName; + + // 成本中心类型:saleRegion; bizRegion; costCenter; supplier + @TableField(value = "center_type") + @Length(max = 255, message = "成本中心类型长度不能超过255字") + private String centerType; + + // 成本中心ID + @TableField(value = "center_id") + private String centerId; + + // 成本中心编码 + @TableField(value = "center_code") + @Length(max = 255, message = "成本中心编码长度不能超过255字") + private String centerCode; + + // 成本中心名称 + @TableField(value = "center_name") + @Length(max = 255, message = "成本中心名长度不能超过255字") + private String centerName; + + // 预算/目标 预算费用率 + @TableField(value = "rate") + private BigDecimal rate; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirCityTargetView.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirCityTargetView.java new file mode 100644 index 0000000..4879862 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirCityTargetView.java @@ -0,0 +1,227 @@ +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-14 + */ +@Data +@TableName("bir_city_target_view") +public class BirCityTargetView implements Serializable { + + private static final long serialVersionUID = 1L; + + /** */ + @TableId(type = IdType.AUTO) + private Long id; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String region; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String regionProvince; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String regionCity; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String regionUser; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String regionUserId; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String regionProvinceUser; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String regionSales2Id; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String brand; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String category; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String m1; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String m2; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String m3; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String q1Target; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String m4; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String m5; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String m6; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String q2Target; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String m7; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String m8; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String m9; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String q3Target; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String m10; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String m11; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String m12; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String q4Target; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String yearTarget; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String q1Budget; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String q2Budget; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String q3Budget; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String q4Budget; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String yearBudget; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String yearRate; + + /** */ + private Long brandId; + + /** */ + private Long categoryId; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String regionId; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String cityId; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String regionProvinceId; + + //0 city 1 省 2大区 + private Integer type; + + public static BirCityTargetView toNewObject(BirCityTargetView source){ + BirCityTargetView cityTargetView = new BirCityTargetView(); + cityTargetView.setId(source.getId()); + cityTargetView.setRegion(source.getRegion()); + cityTargetView.setRegionProvince(source.getRegionProvince()); + cityTargetView.setRegionCity(source.getRegionCity()); + cityTargetView.setRegionUser(source.getRegionUser()); + cityTargetView.setRegionUserId(source.getRegionUserId()); + cityTargetView.setRegionProvinceUser(source.getRegionProvinceUser()); + cityTargetView.setRegionSales2Id(source.getRegionSales2Id()); + cityTargetView.setBrand(source.getBrand()); + cityTargetView.setCategory(source.getCategory()); + cityTargetView.setM1(source.getM1()); + cityTargetView.setM2(source.getM2()); + cityTargetView.setM3(source.getM3()); + cityTargetView.setQ1Target(source.getQ1Target()); + cityTargetView.setM4(source.getM4()); + cityTargetView.setM5(source.getM5()); + cityTargetView.setM6(source.getM6()); + cityTargetView.setQ2Target(source.getQ2Target()); + cityTargetView.setM7(source.getM7()); + cityTargetView.setM8(source.getM8()); + cityTargetView.setM9(source.getM9()); + cityTargetView.setQ3Target(source.getQ3Target()); + cityTargetView.setM10(source.getM10()); + cityTargetView.setM11(source.getM11()); + cityTargetView.setM12(source.getM12()); + cityTargetView.setQ4Target(source.getQ4Target()); + cityTargetView.setYearTarget(source.getYearTarget()); + cityTargetView.setQ1Budget(source.getQ1Budget()); + cityTargetView.setQ2Budget(source.getQ2Budget()); + cityTargetView.setQ3Budget(source.getQ3Budget()); + cityTargetView.setQ4Budget(source.getQ4Budget()); + cityTargetView.setYearBudget(source.getYearBudget()); + cityTargetView.setYearRate(source.getYearRate()); + cityTargetView.setBrandId(source.getBrandId()); + cityTargetView.setCategoryId(source.getCategoryId()); + cityTargetView.setRegionId(source.getRegionId()); + cityTargetView.setCityId(source.getCityId()); + cityTargetView.setRegionProvinceId(source.getRegionProvinceId()); + return cityTargetView; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirRemoveId.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirRemoveId.java new file mode 100644 index 0000000..ed0d860 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirRemoveId.java @@ -0,0 +1,40 @@ +package com.qs.serve.modules.bir.entity; + +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.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * ROI费率 实体类 + * @author YenHex + * @since 2023-06-05 + */ +@Data +@TableName("bir_remove_id") +public class BirRemoveId implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 编号 */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime deleteTime; + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirRoiRate.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirRoiRate.java new file mode 100644 index 0000000..6ad2cae --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirRoiRate.java @@ -0,0 +1,134 @@ +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; + +/** + * ROI费率 实体类 + * @author YenHex + * @since 2023-06-05 + */ +@Data +@TableName("bir_roi_rate") +public class BirRoiRate implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 编号 */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 键值(日期数) */ + @NotNull(message = "键值(日期数)不能为空") + private Integer keyNum; + + /** 活动金额(费用投入金额) */ + @NotNull(message = "活动金额(费用投入金额)不能为空") + private BigDecimal activityAmt; + + /** 核销金额 */ + @NotNull(message = "核销金额不能为空") + private BigDecimal verificationAmt; + + /** 活动状态 */ + private Integer activityState; + + /** 发货量类型:0->预估;1->实际 */ + private Integer shipmentType; + + /** 发货量 */ + private Long shipmentQty; + + /** 发货金额 */ + private BigDecimal shipmentAmt; + + /** 客户id */ + @NotNull(message = "客户id不能为空") + private Long supplierId; + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + @Length(max = 30,message = "客户编码长度不能超过30字") + private String supplierCode; + + /** 客户名称 */ + @NotBlank(message = "客户名称不能为空") + @Length(max = 200,message = "客户名称长度不能超过200字") + private String supplierName; + + /** 用户id */ + @NotBlank(message = "用户id不能为空") + @Length(max = 64,message = "用户id长度不能超过64字") + private String userId; + + /** 用户编码 */ + @NotBlank(message = "用户编码不能为空") + @Length(max = 255,message = "用户编码长度不能超过255字") + private String userCode; + + /** 用户名 */ + @NotBlank(message = "用户名不能为空") + @Length(max = 255,message = "用户名长度不能超过255字") + private String userName; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + +// public static BirRoiRate toNewObject(BirRoiRate source){ +// BirRoiRate roiRate = new BirRoiRate(); +// roiRate.setId(source.getId()); +// roiRate.setKeyNum(source.getKeyNum()); +// roiRate.setActivityAmt(source.getActivityAmt()); +// roiRate.setVerificationAmt(source.getVerificationAmt()); +// roiRate.setActivityState(source.getActivityState()); +// roiRate.setShipmentType(source.getShipmentType()); +// roiRate.setShipmentQty(source.getShipmentQty()); +// roiRate.setShipmentAmt(source.getShipmentAmt()); +// roiRate.setSupplierId(source.getSupplierId()); +// roiRate.setSupplierCode(source.getSupplierCode()); +// roiRate.setSupplierName(source.getSupplierName()); +// roiRate.setUserId(source.getUserId()); +// roiRate.setUserCode(source.getUserCode()); +// roiRate.setUserName(source.getUserName()); +// roiRate.setCreateTime(source.getCreateTime()); +// roiRate.setUpdateTime(source.getUpdateTime()); +// roiRate.setTenantId(source.getTenantId()); +// roiRate.setDelFlag(source.getDelFlag()); +// return roiRate; +// } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirScheduleItemBudget.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirScheduleItemBudget.java new file mode 100644 index 0000000..f1758af --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/BirScheduleItemBudget.java @@ -0,0 +1,126 @@ +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 2023-07-07 + */ +@Data +@TableName("bir_schedule_item_budget") +public class BirScheduleItemBudget implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 考核id */ + @NotNull(message = "考核id不能为空") + private Long scheduleId; + + /** 考核期项id */ + @NotNull(message = "考核期项id不能为空") + private Long scheduleItemId; + + /** 考核编码 */ + @NotBlank(message = "考核编码不能为空") + @Length(max = 30,message = "考核编码长度不能超过30字") + private String itemName; + + /** 开始时间 */ + @NotNull(message = "开始时间不能为空") + @Length(max = 0,message = "开始时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime budgetStartDate; + + /** 结束时间 */ + @NotNull(message = "结束时间不能为空") + @Length(max = 0,message = "结束时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime budgetEndDate; + + /** 预算id */ + @NotNull(message = "预算id不能为空") + private Long budgetId; + + /** 预算金额 */ + @NotNull(message = "预算金额不能为空") + private BigDecimal budgetAmount; + + /** */ + private BigDecimal preDispatchAmount; + + private BigDecimal splitBudgetAmount; + private BigDecimal splitPreDispatchAmount; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 键值(日期数) */ + @NotNull(message = "键值(日期数)不能为空") + private Integer keyNum; + + /** 当月有多少天 */ + private Integer monthDays; + + /** 活动总天数 */ + private Integer totalDays; + + /** 当月分割开始 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate startDate; + + /** 当月分割结束 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate endDate; + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/dto/BirCenterGoodSplitDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/dto/BirCenterGoodSplitDTO.java new file mode 100644 index 0000000..b3f6329 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/dto/BirCenterGoodSplitDTO.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.bir.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/7/7 + */ +@Data +public class BirCenterGoodSplitDTO { + + //当前CenterGoods分割项金额 + BigDecimal currentSplitAmount; + + //当前CenterGoods分割项核销金额(粗略计算) + BigDecimal currentSplitCheckAmount; + + //当前CenterGoods分割项核销金额(粗略计算) + BigDecimal currentSplitReleaseAmount; + + //当前CenterGoods分割项支付金额(粗略计算) + BigDecimal currentSplitPayAmount; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/dto/BirPayJoinDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/dto/BirPayJoinDTO.java new file mode 100644 index 0000000..edf193b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/dto/BirPayJoinDTO.java @@ -0,0 +1,33 @@ +package com.qs.serve.modules.bir.entity.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 活动的核销情况 + * @author YenHex + * @since 2023/9/4 + */ +@Data +public class BirPayJoinDTO { + + + private Long vtbId; + + private Long payId; + + private String payCode; + + private BigDecimal payAmount; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime payDate; + + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/dto/BirRoiCostDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/dto/BirRoiCostDTO.java new file mode 100644 index 0000000..f77b334 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/dto/BirRoiCostDTO.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.bir.entity.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/6/7 + */ +@Data +public class BirRoiCostDTO { + + private String userId; + private String supplierId; + private String notSupplierId; + + private List userIds; + private List supplierIds; + + + private Integer startMonthNum; + + private Integer endMonthNum; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/dto/BirTbsVtbPayJoinDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/dto/BirTbsVtbPayJoinDTO.java new file mode 100644 index 0000000..ae76688 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/dto/BirTbsVtbPayJoinDTO.java @@ -0,0 +1,124 @@ +package com.qs.serve.modules.bir.entity.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 活动的核销情况 + * @author YenHex + * @since 2023/9/4 + */ +@Data +public class BirTbsVtbPayJoinDTO { + + private Long costApplyId; + + /** 费用编码 */ + private String costApplyCode; + + private String costTitle; + + /** 客户id */ + private String supplierId; + + private String supplierCode; + + private String supplierName; + + private String userCode; + + private String userName; + + private Integer chargeState; + + /** 提交实际 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime submitTime; + + /** 提交实际 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime passTime; + + private Long activityId; + /** 活动编码 */ + private String activityCode; + + private String activityTitle; + + private String centerName; + + /** 提交实际 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime actStartDate; + + /** 提交实际 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime actEndDate; + + + private BigDecimal activityAmount; + + /** 核销金额 */ + private BigDecimal checkedAmount; + + /** 核销金额 */ + private BigDecimal checkingAmount; + + /** 释放金额 */ + private BigDecimal releaseAmount; + + private BigDecimal unCheckAmount; + + private BigDecimal payedAmount; + + private BigDecimal unpayAmount; + + private BigDecimal notPayAmount; + + private Long vtbId; + + private String vtbCode; + + private Integer vtbState; + + private String checkUserCode; + + private String checkUserName; + + private BigDecimal vtbAmount; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime vtbSubmitDate; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime vtbFinishDate; + + private Long payId; + + private String payCode; + + private BigDecimal payAmount; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime payDate; + + /** + * 费用类型:0->常规;1->协议类;2->进场费 + */ + private Integer contractFlag; + + private List birVtbPayJoinDTOList; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/dto/BirVtbPayJoinDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/dto/BirVtbPayJoinDTO.java new file mode 100644 index 0000000..4e6881f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/dto/BirVtbPayJoinDTO.java @@ -0,0 +1,41 @@ +package com.qs.serve.modules.bir.entity.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 活动的核销情况 + * @author YenHex + * @since 2023/9/4 + */ +@Data +public class BirVtbPayJoinDTO { + + private Long vtbId; + + private Long activityId; + + private String vtbCode; + + private String checkUserCode; + + private String checkUserName; + + private BigDecimal vtbAmount; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime vtbSubmitDate; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime vtbFinishDate; + + private List payJoinDTOList; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/dto/UnMatchBirRecord.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/dto/UnMatchBirRecord.java new file mode 100644 index 0000000..fa136dc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/dto/UnMatchBirRecord.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.bir.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * activity和centerGoods不匹配记录 DTO + * @author YenHex + * @since 2024/2/18 + */ +@Data +public class UnMatchBirRecord { + + private String activityId; + + private String keyNum; + + private BigDecimal birCenterGoodAmt; + + private BigDecimal activityAmt; + + private Long birActId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/so/BirBudgetTargetSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/so/BirBudgetTargetSo.java new file mode 100644 index 0000000..23eff88 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/so/BirBudgetTargetSo.java @@ -0,0 +1,76 @@ +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 { + + private static final long serialVersionUID = 1L; + + /** 搜索维度: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 Integer yearMonthStartQuery; + private Integer yearMonthEndQuery; + + private Integer yearStart; + private Integer yearEnd; + private Integer monthStart; + private Integer monthEnd; + /** + * 业务待定 + */ + private String supplierId; + + private String targetId; + + /** + * 成本中心 + */ + private List centerList; + + /**品牌 */ + private List brandIds; + + /** + * 减少xml条件 + */ + private Integer selectCenterFlag; + + /**成本中心编码 */ + private List centerIds; + + /**行政区域-成本中心编码 */ + private List bizRegionIds; + + /**销售区域-成本中心编码 */ + private List saleRegionIds; + + /**客户-成本中心编码 */ + private List supplierIds; + + private List supplierCodes; + + //用于查询某类成本中心的所有成本中心 + private List centerType; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/so/BirCostRoiSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/so/BirCostRoiSo.java new file mode 100644 index 0000000..f4e03d0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/so/BirCostRoiSo.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.bir.entity.so; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/6/6 + */ +@Data +public class BirCostRoiSo { + + /** + * 供应商ID + */ + private String supplierId; + + /** + * 加载类型 + * 0->客户 + * 1->申请人的客户(不含当前客户) + * 2->客户的行政区域,省份(不含当前客户) + * 3->客户的销售区域(不含当前客户) + * 4->客户的公司维度(替换原来的0) + * 5->客户的行政区域,城市(不含当前客户) + */ + private Integer loadType; + + private String userId; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/so/BirMonthCusCenterSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/so/BirMonthCusCenterSo.java new file mode 100644 index 0000000..7e2c0c5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/so/BirMonthCusCenterSo.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.bir.entity.so; + +import lombok.Data; +import java.util.List; + +/** + * @author YenHex + * @since 2023/9/15 + */ +@Data +public class BirMonthCusCenterSo { + + String supplierCode; + String centerType; + String centerId; + Integer startYearMonth; + Integer endYearMonth; + List supplierCodeList; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/so/BirTbsVtbPayJoinSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/so/BirTbsVtbPayJoinSo.java new file mode 100644 index 0000000..c1565fc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/so/BirTbsVtbPayJoinSo.java @@ -0,0 +1,133 @@ +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.LocalDateTime; +import java.util.List; + +/** + * 活动的核销情况 + * @author YenHex + * @since 2023/9/4 + */ +@Data +public class BirTbsVtbPayJoinSo { + + /** 费用编码 */ + private String costApplyCode; + + private String costTitle; + + /** 客户 */ + private String supplierCode; + + private String supplierName; + + /** 活动编码 */ + private String activityCode; + + private String activityTitle; + + private String userCode; + + private String userName; + + private Integer costApplyState; + /** 核销状态 */ + private Integer verificationState; + + private String vtbCode; + + private String checkUserCode; + + private String checkUserName; + + private String payCode; + + /** 提交开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryStartSubmitTime; + + /** 提交结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryEndSubmitTime; + + /** 过审开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryStartFinishTime; + + /** 过审结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryEndFinishTime; + + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryStartActivityStartTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryEndActivityStartTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryStartActivityEndTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryEndActivityEndTime; + + + /** 核销开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryStartCheckTime; + + /** 核销开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryEndCheckTime; + + /** 核销完成时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryStartFinishCheckTime; + + /** 核销完成时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryEndFinishCheckTime; + + + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryStartPayTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryEndPayTime; + + private Integer onlyAct; + + private List actIds; + + private Integer showType; + + private String orderProp; + + private String orderType; + + /** + * 费用类型:0->常规;1->协议类;2->进场费 + */ + private Integer contractFlag; + + private String centerName; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/so/CostInfo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/so/CostInfo.java new file mode 100644 index 0000000..4e1f255 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/so/CostInfo.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.bir.entity.so; + +import lombok.Data; + +@Data +public class CostInfo{ + + private static final long serialVersionUID = 1L; + + /** + * center,saleRegion,bizRegion,supplier + */ + private String centerType; + + private String centerId; +} \ No newline at end of file diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirAccountReportVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirAccountReportVo.java new file mode 100644 index 0000000..47a0998 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirAccountReportVo.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.bir.entity.vo; + +import com.qs.serve.common.model.dto.HeaderOption; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author YenHex + * @since 2023/6/6 + */ +@Data +public class BirAccountReportVo { + + private List headerList; + + private BudgetPlanVo budgetPlanVo; + + private List> itemList; + + private String type; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirActivityCenterGoodsMonthVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirActivityCenterGoodsMonthVo.java new file mode 100644 index 0000000..737addb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirActivityCenterGoodsMonthVo.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.bir.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/9/15 + */ +@Data +public class BirActivityCenterGoodsMonthVo { + + /** 年月 */ + private Integer keyNum; + + /** 费用申请 */ + private BigDecimal totalCostAmt; + + /** 释放 */ + private BigDecimal totalReleaseAmt; + + /** 核销 */ + private BigDecimal totalUsedAmt; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirBaseDispatchVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirBaseDispatchVo.java new file mode 100644 index 0000000..1cdf75d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirBaseDispatchVo.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.bir.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2024/6/4 + */ +@Data +public class BirBaseDispatchVo { + + /** 年月份 */ + private Integer yearMonthNum; + + /** 实际发货 */ + private BigDecimal dispatchAmt; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirBaseReportVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirBaseReportVo.java new file mode 100644 index 0000000..fe54934 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirBaseReportVo.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.bir.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2024/6/4 + */ +@Data +public class BirBaseReportVo { + + private String year; + + private String month; + + /** 年月份 */ + private Integer yearMonthNum; + + /** 实际发货 */ + private BigDecimal dispatchAmt; + + /** 实际总费用 */ + private BigDecimal totalRealAmt; + + /** 实际总费用率 */ + private BigDecimal totalRealRate; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirBudgetTargetVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirBudgetTargetVo.java new file mode 100644 index 0000000..0129789 --- /dev/null +++ b/cms-modules/cms-system/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/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirCenterCostRateItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirCenterCostRateItem.java new file mode 100644 index 0000000..47558ed --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirCenterCostRateItem.java @@ -0,0 +1,113 @@ +package com.qs.serve.modules.bir.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; +import java.util.Map; + +/** + * @author YenHex + * @since 2023/7/3 + */ +@Data +public class BirCenterCostRateItem { + + /** + * 目标发货金额 + */ + private BigDecimal targetDispatchAmt; + + /** + * 预算金额 + */ + private BigDecimal budgetAmt; + + /** + * 目标费率 + */ + private BigDecimal targetRoiRate; + + /** + * 实际发货金额 + */ + private BigDecimal realDispatchAmt; + + /** + * 已用预算金额 + */ + private BigDecimal usedBudgetAmt; + + /** + * 可用预算金额 + */ + private BigDecimal unUsedBudgetAmt; + + /** + * 实际费率 + */ + private BigDecimal realRoiRate; + +// /** +// * 已批准费用金额 +// */ +// private BigDecimal costPassAmt; +// +// /** +// * 申请中费用金额 +// */ +// private BigDecimal costApplyingAmt; +// +// /** +// * 已核销费用金额 +// */ +// private BigDecimal checkedAmt; +// +// /** +// * 未核销金额(申请中) +// */ +// private BigDecimal checkingAmt; +// +// /** +// * 未申请核销金额 +// */ +// private BigDecimal noCheckAmt; +// +// /** +// * 已释放金额 +// */ +// private BigDecimal releaseAmt; +// +// /** +// * 冻结中 +// */ +// private BigDecimal frozenAmt; + + public BirCenterCostRateItem(){ + + } + + public BirCenterCostRateItem(Map map,String headerPrefix){ + this.targetDispatchAmt = map.get(headerPrefix+"目标发货")==null?BigDecimal.ZERO:(BigDecimal) map.get(headerPrefix+"目标发货"); + this.realDispatchAmt = map.get(headerPrefix+"实际发货")==null?BigDecimal.ZERO:(BigDecimal) map.get(headerPrefix+"实际发货"); + this.budgetAmt = map.get(headerPrefix+"总预算")==null?BigDecimal.ZERO:(BigDecimal) map.get(headerPrefix+"总预算"); + this.usedBudgetAmt = map.get(headerPrefix+"已用预算")==null?BigDecimal.ZERO:(BigDecimal) map.get(headerPrefix+"已用预算"); + this.unUsedBudgetAmt = map.get(headerPrefix+"可用预算")==null?BigDecimal.ZERO:(BigDecimal) map.get(headerPrefix+"可用预算"); + this.realRoiRate = map.get(headerPrefix+"实际费用率")==null?BigDecimal.ZERO:((BigDecimal) map.get(headerPrefix+"实际费用率")).multiply(BigDecimal.valueOf(100L)); + this.targetRoiRate = map.get(headerPrefix+"目标费用率")==null?BigDecimal.ZERO:((BigDecimal) map.get(headerPrefix+"目标费用率")).multiply(BigDecimal.valueOf(100L)); + + } + + public BirCenterCostRateItem(List itemData){ + this.budgetAmt = itemData.stream().map(a->a.getBudgetAmt()).reduce(BigDecimal.ZERO,BigDecimal::add); + this.usedBudgetAmt = itemData.stream().map(a->a.getUsedBudgetAmt()).reduce(BigDecimal.ZERO,BigDecimal::add); + this.unUsedBudgetAmt = itemData.stream().map(a->a.getUnUsedBudgetAmt()).reduce(BigDecimal.ZERO,BigDecimal::add); + this.targetDispatchAmt = itemData.stream().map(a->a.getTargetDispatchAmt()).reduce(BigDecimal.ZERO,BigDecimal::add); + this.realDispatchAmt = itemData.stream().map(a->a.getRealDispatchAmt()).reduce(BigDecimal.ZERO,BigDecimal::add); + this.realRoiRate = this.realDispatchAmt.compareTo(BigDecimal.ZERO)==0? + BigDecimal.ZERO:this.usedBudgetAmt.divide(this.realDispatchAmt,4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100L)); + this.targetRoiRate = this.targetDispatchAmt.compareTo(BigDecimal.ZERO)==0? + BigDecimal.ZERO:this.budgetAmt.divide(this.targetDispatchAmt,4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100L)); + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirCenterCostRateMain.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirCenterCostRateMain.java new file mode 100644 index 0000000..25d22db --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirCenterCostRateMain.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.bir.entity.vo; + +import com.qs.serve.modules.goods.entity.dto.TbsCenterDto; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetSimpleVo; +import lombok.Data; +import java.util.List; +/** + * @author YenHex + * @since 2023/7/3 + */ +@Data +public class BirCenterCostRateMain { + + private TbsCenterDto center1; + private TbsCenterDto center2; + private TbsBudgetSimpleVo budgetInfo; + private BirCenterCostRateItem yearInfo; + private List seasonList; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirCostApplyRateVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirCostApplyRateVo.java new file mode 100644 index 0000000..8637d43 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirCostApplyRateVo.java @@ -0,0 +1,72 @@ +package com.qs.serve.modules.bir.entity.vo; + +import com.qs.serve.modules.goods.entity.dto.TbsCenterDto; +import com.qs.serve.modules.tbs.entity.TbsActivityCenter; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/12/29 + */ +@Data +public class BirCostApplyRateVo { + + public BirCostApplyRateVo(String scheduleType, TbsCenterDto centerDto){ + this.scheduleType = scheduleType; + this.centerId = centerDto.getId(); + this.centerCode = centerDto.getCenterCode(); + this.centerName = centerDto.getCenterName(); + this.centerType = centerDto.getCenterType(); + } + + private String centerId; + + private String centerType; + + private String centerCode; + + private String centerName; + + /** + * 年季月,year,quarter,month + */ + private String scheduleType; + +// /** 目标金额(待定) */ +// private BigDecimal targetAmount; +// +// /** 预算金额(待定) */ +// private BigDecimal budgetAmt; +// +// /** 预算费用率(待定) */ +// private BigDecimal budgetRate; + + /** 客户发货 */ + private BigDecimal cusDisAmt; + + /** 客户费用(客户占用该成本中心的费用金额) */ + private BigDecimal cusCostAmt; + + /** 客户费用率(客户费用/客户发货) */ + private BigDecimal cusRate; + + /** 该成本中心所有客户的发货金额 */ + private BigDecimal centerDisAmt; + + /** 所有客户占用该成本中心的费用金额 */ + private BigDecimal centerCostAmt; + + /** 成本中心维度比率 */ + private BigDecimal centerRate; + + /** 整体发货金额 */ + private BigDecimal allDisAmt; + + /** 整体费用金额 */ + private BigDecimal allCostAmt; + + /** 整体的比率 */ + private BigDecimal allByRate; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirReportVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirReportVo.java new file mode 100644 index 0000000..fb9c1a4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirReportVo.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.bir.entity.vo; + +import com.qs.serve.common.model.dto.HeaderOption; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author YenHex + * @since 2023/6/6 + */ +@Data +public class BirReportVo { + + private List>> itemList; + + private List headerList; + + private BudgetPlanVo budgetPlanVo; + + private List> dataList; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirRoiCostItemVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirRoiCostItemVo.java new file mode 100644 index 0000000..9744fa0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirRoiCostItemVo.java @@ -0,0 +1,84 @@ +package com.qs.serve.modules.bir.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + * @author YenHex + * @since 2023/6/6 + */ +@Data +public class BirRoiCostItemVo { + + /** + * 年/月 + */ + private Integer yearMonth; + + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate yearMonthDate; + + + /** + * 费用预估金额(目标) + */ + private BigDecimal preAmt; + + /** + * 费用金额(实际金额+预估金额) + */ + private BigDecimal costAmt; + + /** + * 核销金额(实际金额) + */ + private BigDecimal checkAmt; + + /** + * 费用金额(实际金额,界面的预算费用) + */ + private BigDecimal costRealAmt; + + /** + * 核销金额(重复参数,与checkAmt一样) + */ + private BigDecimal checkRealAmt; + + /** + * 发货金额(原发货金额) + */ + private BigDecimal dispatchAmt; + + /** + * 销售大区费用 + */ + private BigDecimal regionTotalCostAmt; + + /** + * 销售大区发货 + */ + private BigDecimal regionTotalDispatchAmt; + + /** + * 整体发货金额 + */ + private BigDecimal allDispatchAmt; + + /** + * 整体费用金额 + */ + private BigDecimal allCostAmt; + + /** + * 整体ORI达成率 + */ + private BigDecimal allRoiRate; + + private Float ytdPercent; + + private Float qtdPercent; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirRoiVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirRoiVo.java new file mode 100644 index 0000000..6874464 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BirRoiVo.java @@ -0,0 +1,48 @@ +package com.qs.serve.modules.bir.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; + +/** + * @author YenHex + * @since 2023/6/6 + */ +@Data +public class BirRoiVo { + + private List itemList; + + /** + * 当年费用率 + */ + private Float ytdPercent; + + /** + * 当年大区费用率 + */ + private Float ytdRegionPercent; + + /** + * 当年整体费用率 + */ + private Float ytdAllPercent; + + /** + * 当季费用率 + */ + private Float qtdPercent; + + /** + * 当季整体费用率 + */ + private Float qtdAllPercent; + + /** + * 当季大区费用率 + */ + private Float qtdRegionPercent; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BudgetPlanVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BudgetPlanVo.java new file mode 100644 index 0000000..f055e26 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/BudgetPlanVo.java @@ -0,0 +1,21 @@ +package com.qs.serve.modules.bir.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class BudgetPlanVo { + + String budgetYear; + + BigDecimal budgetPlanSaleAmout; + + BigDecimal budgetPlanAmount; + + BigDecimal usedAmout; + + BigDecimal plannedAmount; + + BigDecimal realSaleAmount; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/YtdQtdToOAVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/YtdQtdToOAVo.java new file mode 100644 index 0000000..5acc41a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/entity/vo/YtdQtdToOAVo.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.bir.entity.vo; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/6/6 + */ +@Data +public class YtdQtdToOAVo { + + private Float ytdCustomerPercent; + + private Float ytdUserPercent; + + private Float ytdRegion2Percent; + + private Float ytdRegionPercent; + + private Float qtdCustomerPercent; + + private Float qtdUserPercent; + + private Float qtdRegion2Percent; + + private Float qtdRegionPercent; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirActivityCenterGoodsMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirActivityCenterGoodsMapper.java new file mode 100644 index 0000000..ad997ee --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirActivityCenterGoodsMapper.java @@ -0,0 +1,52 @@ +package com.qs.serve.modules.bir.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.common.model.consts.DSName; +import com.qs.serve.modules.bir.entity.BirActivityCenterGoods; +import com.qs.serve.modules.bir.entity.so.BirBudgetTargetSo; +import com.qs.serve.modules.bir.entity.so.BirMonthCusCenterSo; +import com.qs.serve.modules.bir.entity.vo.BirActivityCenterGoodsMonthVo; +import com.qs.serve.modules.bir.entity.vo.BirBaseDispatchVo; +import com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; + +/** + * Mapper + * @author YenHex + * @date 2023-07-06 + */ +@DS(DSName.QiSheng) +public interface BirActivityCenterGoodsMapper extends BaseMapper { + + //List selectErrorBir(); + + @InterceptorIgnore(tenantLine = "true") + BigDecimal totalAmt(@Param("startDate") Integer startDate, + @Param("endDate")Integer endDate); + + /** + * 查询出异动的记录 + */ + //List selectChangeCenterGoods(@Param("startDate") LocalDate startDate,@Param("endDate")LocalDate endDate,@Param("costApplyId")Long costApplyId); + + //List selectNoExistCenterGoods(); + + List listMonthCusCenterVo(@Param("query") BirMonthCusCenterSo param); + + List list4BirBudgetTarget(@Param("query") BirBudgetTargetSo so); + + @InterceptorIgnore(tenantLine = "true") + List list4DispatchSqlserver(@Param("query") BirBudgetTargetSo so); + + @InterceptorIgnore(tenantLine = "true") + List list4CenterSqlserver(@Param("query") BirBudgetTargetSo so); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirBaseActivityMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirBaseActivityMapper.java new file mode 100644 index 0000000..d107cce --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirBaseActivityMapper.java @@ -0,0 +1,59 @@ +package com.qs.serve.modules.bir.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.common.model.consts.DSName; +import com.qs.serve.modules.bir.entity.BirBaseActivity; +import com.qs.serve.modules.bir.entity.dto.UnMatchBirRecord; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.time.LocalDate; +import java.util.List; + +/** + * ROI费率(活动档案) Mapper + * @author YenHex + * @date 2023-06-05 + */ +@DS(DSName.QiSheng) +public interface BirBaseActivityMapper extends BaseMapper { + + //List selectByBirActivity(@Param("startDate") LocalDate startDate, @Param("endDate")LocalDate endDate); + + //List selectErrorAmtActivityCode(); + + @InterceptorIgnore(tenantLine = "true") + @Select("select " + + "tmp.activity_id as activityId, " + + "tmp.key_num as keyNum, " + + "tmp.cost_amt as activityAmt, " + + "tmp2.cost_amt2 as birCenterGoodAmt, " + + "tmp.id as birActId " + + "from " + + "( " + + " SELECT " + + " bir_base_activity.id," + + " bir_base_activity.activity_id, " + + " bir_base_activity.key_num, " + + " sum( bir_base_activity.activity_amt ) AS cost_amt " + + " FROM " + + " `bir_base_activity` " + + " WHERE " + + " bir_base_activity.del_flag = '0' " + + " and bir_base_activity.activity_start_date>'2023-01-01' " + + " group by bir_base_activity.key_num,bir_base_activity.activity_id " + + ") tmp left join " + + "( " + + " select bir.id,activity_id,key_num as key_num2,SUM(split_amount) as cost_amt2 " + + " from bir_activity_center_goods bir " + + " where bir.star_date>'2023-01-01' " + + " group by key_num,activity_id " + + ") tmp2 on tmp.activity_id = tmp2.activity_id and tmp.key_num = tmp2.key_num2 " + + "where tmp.cost_amt != tmp2.cost_amt2 ") + List selectUnMatchBir(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirBudgetTargetMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirBudgetTargetMapper.java new file mode 100644 index 0000000..fa11b81 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirBudgetTargetMapper.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.bir.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.common.model.consts.DSName; +import com.qs.serve.modules.bir.entity.BirBudgetTarget; +import com.qs.serve.modules.bir.entity.so.BirBudgetTargetSo; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +/** + * Mapper + * @author YenHex + * @date 2024-06-04 + */ +@DS(DSName.QiSheng) +public interface BirBudgetTargetMapper extends BaseMapper { + + + @InterceptorIgnore(tenantLine = "1") + List selectBirBudgetTargetList(@Param("query") BirBudgetTargetSo budgetTargetSo); + + + @Update("truncate table bir_budget_target") + void deleteAllData(); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirCityTargetViewMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirCityTargetViewMapper.java new file mode 100644 index 0000000..dd5bfaa --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirCityTargetViewMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bir.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bir.entity.BirCityTargetView; + +/** + * Mapper + * @author YenHex + * @date 2024-06-14 + */ +public interface BirCityTargetViewMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirRemoveIdMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirRemoveIdMapper.java new file mode 100644 index 0000000..6692f85 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirRemoveIdMapper.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.BirRemoveId; +import com.qs.serve.modules.bir.entity.BirRoiRate; +import com.qs.serve.modules.bir.entity.dto.BirRoiCostDTO; +import com.qs.serve.modules.bir.entity.vo.BirRoiCostItemVo; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.List; + +/** + * Mapper + * @author YenHex + * @date 2023-06-05 + */ +public interface BirRemoveIdMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirReportAccountBookMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirReportAccountBookMapper.java new file mode 100644 index 0000000..053b534 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirReportAccountBookMapper.java @@ -0,0 +1,71 @@ +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.BirBaseActivity; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.mapping.StatementType; + +import java.time.LocalDate; +import java.util.List; +import java.util.Map; + +/** + * ROI费率(活动档案) Mapper + * @author YenHex + * @date 2023-06-05 + */ +@Mapper +public interface BirReportAccountBookMapper { + + @Select("call get_report_header(#{inyear, mode=IN, jdbcType=VARCHAR},#{result, mode=OUT, jdbcType=VARCHAR})") + @Options(statementType = StatementType.CALLABLE) + @InterceptorIgnore(tenantLine = "true") + void getReportHeader(Map map); + + + @Select("call get_tbs_report_region(#{inyear, mode=IN, jdbcType=VARCHAR})") + @Options(statementType = StatementType.CALLABLE) + @InterceptorIgnore(tenantLine = "true") + List> reportAccountBookRegion(@Param("inyear") String inyear); + + @Select("call get_tbs_report_customer(#{inyear, mode=IN, jdbcType=VARCHAR})") + @Options(statementType = StatementType.CALLABLE) + @InterceptorIgnore(tenantLine = "true") + List> reportAccountBookCustomer(@Param("inyear")String inyear); + + @Select("call get_tbs_report_bizregion(#{inyear, mode=IN, jdbcType=VARCHAR})") + @Options(statementType = StatementType.CALLABLE) + @InterceptorIgnore(tenantLine = "true") + List> reportAccountBookBizRegion(@Param("inyear")String inyear); + + @Select("call get_tbs_report_center(#{inyear, mode=IN, jdbcType=VARCHAR})") + @Options(statementType = StatementType.CALLABLE) + @InterceptorIgnore(tenantLine = "true") + List> reportAccountBookCenter(@Param("inyear")String inyear); + + @Select("call build_region_dispatch()") + @Options(statementType = StatementType.CALLABLE) + @InterceptorIgnore(tenantLine = "true") + void buildRegionDispatch(); + + @Select("call build_bizregion_dispatch()") + @Options(statementType = StatementType.CALLABLE) + @InterceptorIgnore(tenantLine = "true") + void buildBizRegionDispatch(); + + @Select("call build_customer_dispatch()") + @Options(statementType = StatementType.CALLABLE) + @InterceptorIgnore(tenantLine = "true") + void buildCustomerDispatch(); + + @Select("call build_all_dispatch()") + @Options(statementType = StatementType.CALLABLE) + @InterceptorIgnore(tenantLine = "true") + void buildAllDispatch(); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirRoiRateMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirRoiRateMapper.java new file mode 100644 index 0000000..b7e10c1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirRoiRateMapper.java @@ -0,0 +1,33 @@ +package com.qs.serve.modules.bir.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.common.model.consts.DSName; +import com.qs.serve.modules.bir.entity.BirRoiRate; +import com.qs.serve.modules.bir.entity.dto.BirRoiCostDTO; +import com.qs.serve.modules.bir.entity.vo.BirRoiCostItemVo; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.List; + +/** + * Mapper + * @author YenHex + * @date 2023-06-05 + */ +@DS(DSName.QiSheng) +public interface BirRoiRateMapper extends BaseMapper { + + + @InterceptorIgnore(tenantLine = "1") + List queryForecastRoiCostItems(@Param("query") BirRoiCostDTO param); + + @InterceptorIgnore(tenantLine = "1") + List queryRoiCostItems(@Param("query") BirRoiCostDTO param); + + @InterceptorIgnore(tenantLine = "1") + BigDecimal querySumAmt(@Param("query") BirRoiCostDTO param); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirScheduleItemBudgetMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirScheduleItemBudgetMapper.java new file mode 100644 index 0000000..4435d96 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirScheduleItemBudgetMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bir.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bir.entity.BirScheduleItemBudget; + +/** + * 预算考核期项 Mapper + * @author YenHex + * @date 2023-07-07 + */ +public interface BirScheduleItemBudgetMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirTbsVtbPayJoinMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirTbsVtbPayJoinMapper.java new file mode 100644 index 0000000..201f7c0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/mapper/BirTbsVtbPayJoinMapper.java @@ -0,0 +1,36 @@ +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.BirBaseActivity; +import com.qs.serve.modules.bir.entity.dto.BirTbsVtbPayJoinDTO; +import com.qs.serve.modules.bir.entity.so.BirTbsVtbPayJoinSo; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import org.apache.ibatis.annotations.Param; + +import java.time.LocalDate; +import java.util.List; + +/** + * ROI费率(活动档案) Mapper + * @author YenHex + * @date 2023-06-05 + */ +public interface BirTbsVtbPayJoinMapper extends BaseMapper { + + /** + * 更新维护综合查询的成本中心 + * @param maxCostId + * @return + */ + @InterceptorIgnore(tenantLine = "1") + int updateActivityAllCenters(@Param("maxCostId") Long maxCostId); + + List selectBirTbsVtbPayJoinDTO(@Param("query") BirTbsVtbPayJoinSo so); + + List selectSumVtbAmount(@Param("actIds") List actIds); + + List selectSumPayAmount(@Param("actIds") List actIds); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirActivityCenterGoodsService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirActivityCenterGoodsService.java new file mode 100644 index 0000000..70a6ca0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirActivityCenterGoodsService.java @@ -0,0 +1,21 @@ +package com.qs.serve.modules.bir.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bir.entity.BirActivityCenterGoods; +import com.qs.serve.modules.bir.entity.so.BirMonthCusCenterSo; +import com.qs.serve.modules.bir.entity.vo.BirActivityCenterGoodsMonthVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 服务接口 + * @author YenHex + * @date 2023-07-06 + */ +public interface BirActivityCenterGoodsService extends IService { + + void rebuildBir(List costApplyId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirBaseActivityService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirBaseActivityService.java new file mode 100644 index 0000000..6745664 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirBaseActivityService.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.bir.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bir.entity.BirBaseActivity; + +import java.util.List; + +/** + * ROI费率(活动档案) 服务接口 + * @author YenHex + * @date 2023-06-05 + */ +public interface BirBaseActivityService extends IService { + + void flushByCostId(Long costId); + + /** + * 更新bir活动的金额 + */ + void compareAmtToUpdateActivityAmt(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirBudgetTargetImportService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirBudgetTargetImportService.java new file mode 100644 index 0000000..2dc3a36 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirBudgetTargetImportService.java @@ -0,0 +1,24 @@ +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 BirBudgetTargetImportService extends IService { + + void buildCustomerCost(); + void buildCityCost(); + void buildProCost(); + void buildAreaCost(); + void deleteAll(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirBudgetTargetService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirBudgetTargetService.java new file mode 100644 index 0000000..5f6287d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirBudgetTargetService.java @@ -0,0 +1,23 @@ +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.BirBaseReportVo; +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); + + List listBaseVo(BirBudgetTargetSo query); + + List getCenterByTargetId(BirBudgetTargetSo query); +} \ No newline at end of file diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirCenterRateService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirCenterRateService.java new file mode 100644 index 0000000..cb7e6c3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirCenterRateService.java @@ -0,0 +1,32 @@ +package com.qs.serve.modules.bir.service; + +import com.qs.serve.modules.bir.entity.vo.BirCostApplyRateVo; +import com.qs.serve.modules.tbs.entity.dto.TbsCostSubItem; + +import java.util.List; + +public interface BirCenterRateService { + + TbsCostSubItem.CostCenterTranStr buildCostCenter(String centerType, String centerId, String centerName); + + /** + * 拓展方法 + * @param centerType + * @param centerId + * @param centerName + * @param supplierCode 如果不为空,计算客户的成本中心维度数据 + * @return + */ + TbsCostSubItem.CostCenterTranStr buildCostCenter(String centerType, String centerId, String centerName,String supplierCode); + + List findCostCenterDataByCostApplyId(Long costApplyId,Long policyId); + + /** + * 新的费用率统计 + * @param costApplyId + * @param policyId + * @return + */ + List selectCostApplyRateVoList(Long costApplyId,Long policyId); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirCityTargetViewService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirCityTargetViewService.java new file mode 100644 index 0000000..5c91b38 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirCityTargetViewService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bir.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bir.entity.BirCityTargetView; + +/** + * 服务接口 + * @author YenHex + * @date 2024-06-14 + */ +public interface BirCityTargetViewService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirRemoveIdService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirRemoveIdService.java new file mode 100644 index 0000000..017b776 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirRemoveIdService.java @@ -0,0 +1,11 @@ +package com.qs.serve.modules.bir.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bir.entity.BirRemoveId; + +/** + * @author YenHex + * @since 2024/1/29 + */ +public interface BirRemoveIdService extends IService { +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirReportAccountBookService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirReportAccountBookService.java new file mode 100644 index 0000000..c6d731b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirReportAccountBookService.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.bir.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bir.entity.BirBaseActivity; +import com.qs.serve.modules.bir.entity.vo.BirAccountReportVo; +import com.qs.serve.modules.bir.entity.vo.BirReportVo; + +/** + * 台帐 服务接口 + * @author YenHex + * @date 2023-06-05 + */ +public interface BirReportAccountBookService { + + BirAccountReportVo getReportAccountBookData(String type,String year); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirRoiRateService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirRoiRateService.java new file mode 100644 index 0000000..29a424f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirRoiRateService.java @@ -0,0 +1,69 @@ +package com.qs.serve.modules.bir.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.bir.entity.BirRoiRate; +import com.qs.serve.modules.bir.entity.dto.BirRoiCostDTO; +import com.qs.serve.modules.bir.entity.so.BirCostRoiSo; +import com.qs.serve.modules.bir.entity.vo.BirRoiCostItemVo; +import com.qs.serve.modules.bir.entity.vo.YtdQtdToOAVo; +import com.qs.serve.modules.tbs.entity.TbsCostApply; + +import java.util.List; + +/** + * 服务接口 + * @author YenHex + * @date 2023-06-05 + */ +public interface BirRoiRateService extends IService { + + /** + * 查询费率 + * @param param + * @return + */ + List queryRoiCostItems(BirRoiCostDTO param); + + /** + * 获取费率和ROI + * @param param + * @return + */ + List getCostRoiOfYearMonth(BirCostRoiSo param); + + Float getYtdPercent(List list); + + Float getYtdAllPercent(List list); + + Float getYtdRegionPercent(List list); + + Float getQtdPercent(List list); + + Float getQtdAllPercent(List list); + + Float getQtdRegionPercent(List list); + + YtdQtdToOAVo buildYtdAndQtdData(TbsCostApply apply); + + /** + * 设置查询条件和返回客户CODELIST + * @param costDTO + * @param supplierId + * @param loadType 0->客户,1->申请人的客户,2->客户的行政区域,3->客户的销售区域 + * @param userId + * @return + */ + List getBiRoiCostDTOAndFindSupplierCodes(BirRoiCostDTO costDTO,String supplierId,Integer loadType,String userId); + + /** + * 获取客户编码 + * @param costDTO + * @param centerType + * @param centerIds + * @return + */ + List getSupplierCodesByCenter(BirRoiCostDTO costDTO,String centerType,List centerIds); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirScheduleItemBudgetService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirScheduleItemBudgetService.java new file mode 100644 index 0000000..369fc6d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirScheduleItemBudgetService.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.bir.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bir.entity.BirScheduleItemBudget; + +/** + * 预算考核期项 服务接口 + * @author YenHex + * @date 2023-07-07 + */ +public interface BirScheduleItemBudgetService extends IService { + + /** + * 创建数据 + */ + void buildScheduleItemBudget(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirTbsVtbPayJoinService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirTbsVtbPayJoinService.java new file mode 100644 index 0000000..3d0012a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/BirTbsVtbPayJoinService.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.bir.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.modules.bir.entity.BirBaseActivity; +import com.qs.serve.modules.bir.entity.dto.BirTbsVtbPayJoinDTO; +import com.qs.serve.modules.bir.entity.so.BirTbsVtbPayJoinSo; + +import java.util.List; + +/** + * ROI费率(活动档案) 服务接口 + * @author YenHex + * @date 2023-06-05 + */ +public interface BirTbsVtbPayJoinService extends IService { + + PageVo selectBirTbsVtbPayJoinDTO(BirTbsVtbPayJoinSo so,Integer searchPage); + + BirTbsVtbPayJoinDTO getSumData(BirTbsVtbPayJoinSo so); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirActivityCenterGoodsServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirActivityCenterGoodsServiceImpl.java new file mode 100644 index 0000000..82dad4d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirActivityCenterGoodsServiceImpl.java @@ -0,0 +1,483 @@ +package com.qs.serve.modules.bir.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.DateSplitDTO; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.DateSplitUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.bir.entity.BirBaseActivity; +import com.qs.serve.modules.bir.entity.BirRemoveId; +import com.qs.serve.modules.bir.entity.dto.BirCenterGoodSplitDTO; +import com.qs.serve.modules.bir.service.BirBaseActivityService; +import com.qs.serve.modules.bms.entity.BmsCostCenter; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.mapper.BmsCostCenterMapper; +import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.tbs.common.TbsActivityState; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.mapper.TbsActivityCenterGoodsMapper; +import com.qs.serve.modules.tbs.mapper.TbsActivityMapper; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper; +import com.qs.serve.modules.tbs.service.TbsActivityCenterGoodsService; +import com.qs.serve.modules.tbs.service.TbsBudgetCostItemService; +import com.qs.serve.modules.vtb.common.VtbFundFlowType; +import com.qs.serve.modules.vtb.entity.VtbFundFlow; +import com.qs.serve.modules.vtb.entity.dto.VtbFundFlowSumAmtDTO; +import com.qs.serve.modules.vtb.mapper.VtbFundFlowMapper; +import com.tencentcloudapi.cii.v20201210.models.ResultObject; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bir.entity.BirActivityCenterGoods; +import com.qs.serve.modules.bir.service.BirActivityCenterGoodsService; +import com.qs.serve.modules.bir.mapper.BirActivityCenterGoodsMapper; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * @author YenHex + * @since 2023-07-06 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BirActivityCenterGoodsServiceImpl extends ServiceImpl implements BirActivityCenterGoodsService { + + private final BmsCostCenterMapper costCenterMapper; + + private final BmsRegionMapper regionMapper; + + private final BmsRegion2Mapper region2Mapper; + + private final TbsActivityMapper activityMapper; + + private final TbsActivityCenterGoodsMapper tbsActivityCenterGoodsMapper; + + private final BmsSupplierMapper bmsSupplierMapper; + + private final TbsCostApplyMapper tbsCostApplyMapper; + + private final BirBaseActivityService birBaseActivityService; + + private final TbsBudgetCostItemService budgetCostItemService; + + @Override + public void rebuildBir(List costApplyIds) { + if(CollectionUtil.isEmpty(costApplyIds)){ + return; + } + //不占预算的状态,进行清理 + List tbsCostApplyList = tbsCostApplyMapper.selectBatchIds(costApplyIds); + List rmIds = new ArrayList<>(); + List buildIds = new ArrayList<>(); + for (TbsCostApply costApply : tbsCostApplyList) { + if(costApply.getCancelFlag().equals(1)){ + rmIds.add(costApply.getId()); + continue; + } + Boolean useBudget = TbsCostApplyState.checkUseBudget(costApply.getChargeState()); + if(useBudget!=null){ + if(useBudget){ + buildIds.add(costApply.getId()); + }else { + rmIds.add(costApply.getId()); + } + } + } + //移除历史记录 + if(CollUtil.isNotEmpty(rmIds)){ + LambdaQueryWrapper rmCostId = new LambdaQueryWrapper<>(); + rmCostId.in(BirActivityCenterGoods::getCostApplyId,rmIds); + this.remove(rmCostId); + } + + //过滤需要移除的ID + costApplyIds = buildIds; + if(CollectionUtil.isEmpty(costApplyIds)){ + return; + } + + //刷新BirBaseActivity + for (Long costApplyId : costApplyIds) { + birBaseActivityService.flushByCostId(costApplyId); + } + + LambdaQueryWrapper centerGoodsLambdaQueryWrapper = new LambdaQueryWrapper<>(); + centerGoodsLambdaQueryWrapper.in(TbsActivityCenterGoods::getCostApplyId,costApplyIds); + List activityCenterGoodsAllList = tbsActivityCenterGoodsMapper.selectList(centerGoodsLambdaQueryWrapper); + + if(activityCenterGoodsAllList.size()<1){ + return; + } + + //加载所有自定义成本中心 + List costCenterList = costCenterMapper.selectList(new QueryWrapper<>()); + + // 按活动id分组 + Map> collectMap = activityCenterGoodsAllList.stream() + .collect(Collectors.groupingBy(TbsActivityCenterGoods::getActivityId)); + + //移除错误的历史记录 + LambdaQueryWrapper rmErrorActId = new LambdaQueryWrapper<>(); + rmErrorActId.notIn(BirActivityCenterGoods::getActivityId,collectMap.keySet()); + rmErrorActId.in(BirActivityCenterGoods::getCostApplyId,costApplyIds); + this.remove(rmErrorActId); + + LambdaQueryWrapper supplierLqw = new LambdaQueryWrapper<>(); + 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)); + + 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<>(); + costLqw.in(TbsCostApply::getId,costApplyIds); + costLqw.eq(TbsCostApply::getCancelFlag,0); + costLqw.in(TbsCostApply::getChargeState,1,2,3,4); + List costApplyList = tbsCostApplyMapper.selectBatchIds(costApplyIds); + + Map> costApplyMap = costApplyList.stream().collect(Collectors.groupingBy(TbsCostApply::getId)); + + for (Long activityId : collectMap.keySet()) { + + //移除历史记录 + LambdaQueryWrapper rmActId = new LambdaQueryWrapper<>(); + rmActId.eq(BirActivityCenterGoods::getActivityId,activityId); + this.remove(rmActId); + + TbsActivity activity = activityMapper.selectById(activityId); + if(activity==null||activity.getCancelFlag().equals(1)){ + continue; + } + TbsCostApply costApply = costApplyMap.get(activity.getCostApplyId()).get(0); + if(costApply==null){ + continue; + } + + //用于保存的对象列表 + List bacgList = new ArrayList<>(); + + //创建对象列表 + List activityCenterGoodsList = collectMap.get(activityId); + + for (TbsActivityCenterGoods activityCenterGoods : activityCenterGoodsList) { + + //绑定预算信息 + TbsBudgetCostItem costItem = budgetCostItemService.getOne( + new LambdaQueryWrapper() + .eq(TbsBudgetCostItem::getCenterGoodItemId,activityCenterGoods.getId()),false); + + LocalDate actStartDate = activityCenterGoods.getPreStartDate(); + LocalDate actEndDate = activityCenterGoods.getPreEndDate(); + int currentActDays = (int) (actEndDate.toEpochDay()-actStartDate.toEpochDay()+1); + List dateSplitList = DateSplitUtil.getSplitDto(actStartDate,actEndDate); + if(dateSplitList.size()>1){ + for (DateSplitDTO currDateSplit : dateSplitList) { + //获取该项分割金额对象 + BirCenterGoodSplitDTO goodSplitDTO = this.buildSplitAmount(activity,activityCenterGoods, + dateSplitList, currDateSplit,currentActDays); + //创建底表对象 + BirActivityCenterGoods entity = createBirActivityCenterGoodsEntity(costCenterList, + activityCenterGoods, currentActDays, currDateSplit, goodSplitDTO,supplierMap,saleRegionMap,bizRegionMap,costApply); + if(costItem!=null){ + entity.setBudgetId(costItem.getBudgetId()); + entity.setScheduleItemBudgetId(costItem.getScheduleItemBudgetId()); + } + bacgList.add(entity); + } + }else if (dateSplitList.size()==1){ + DateSplitDTO currDateSplit = dateSplitList.get(0); + //获取该项分割金额对象 + BirCenterGoodSplitDTO goodSplitDTO = this.buildSplitAmount(activity,activityCenterGoods, + dateSplitList, currDateSplit,currentActDays); + //创建底表对象 + BirActivityCenterGoods entity = createBirActivityCenterGoodsEntity(costCenterList, + activityCenterGoods, currentActDays, currDateSplit, goodSplitDTO,supplierMap,saleRegionMap,bizRegionMap,costApply); + if(costItem!=null){ + entity.setBudgetId(costItem.getBudgetId()); + entity.setScheduleItemBudgetId(costItem.getScheduleItemBudgetId()); + } + bacgList.add(entity); + } + } + if(bacgList.size()>0){ + LocalDateTime nowTime = LocalDateTime.now(); + for (BirActivityCenterGoods bir : bacgList) { + bir.setId(IdUtil.getSnowflakeNextId()); + bir.setUpdateTime(nowTime); + super.getBaseMapper().insert(bir); + } + } + } + } + + + /** + * 创建底表对象 + * @param costCenterList + * @param activityCenterGoods + * @param currentActDays + * @param currDateSplit + * @param goodSplitDTO + * @return + */ + @NotNull + private BirActivityCenterGoods createBirActivityCenterGoodsEntity(List costCenterList, + TbsActivityCenterGoods activityCenterGoods, + Integer currentActDays, + DateSplitDTO currDateSplit, + BirCenterGoodSplitDTO goodSplitDTO, + Map supplierMap, + Map saleRegionMap, + Map bizRegionMap, + TbsCostApply costApply) { + BirActivityCenterGoods entity = new BirActivityCenterGoods(); + entity.setActivityCenterGoodsId(activityCenterGoods.getId()); + entity.setKeyNum(currDateSplit.getYearMonth()); + entity.setDays(currentActDays); + entity.setDayOfMouth(currDateSplit.getDays()); + entity.setStarDate(currDateSplit.getStartDate()); + entity.setEndDate(currDateSplit.getEndDate()); + entity.setSplitAmount(goodSplitDTO.getCurrentSplitAmount()); + entity.setSplitUsedAmount(goodSplitDTO.getCurrentSplitCheckAmount()); + entity.setSplitReleaseAmount(goodSplitDTO.getCurrentSplitReleaseAmount()); + entity.setSplitPayAmount(goodSplitDTO.getCurrentSplitPayAmount()); + entity.setCenterGoodsCode(activityCenterGoods.getCenterGoodsCode()); + entity.setCostApplyId(activityCenterGoods.getCostApplyId()); + entity.setActivityId(activityCenterGoods.getActivityId()); + entity.setActivityCode(activityCenterGoods.getActivityCode()); + entity.setActivityTotalAmount(activityCenterGoods.getActivityAmt()); + entity.setActivityTotalCheckAmount(activityCenterGoods.getActivityCheckAmt()); + BigDecimal releaseAmount = BigDecimal.ZERO; + if(1 == activityCenterGoods.getActivityFinishedFlag()){ + releaseAmount = entity.getActivityTotalAmount().subtract(entity.getActivityTotalCheckAmount()); + } + entity.setActivityTotalReleaseAmount(releaseAmount); + entity.setActivityTotalPayAmount(activityCenterGoods.getPayAmount()); + entity.setActivityFinishedFlag(activityCenterGoods.getActivityFinishedFlag()); + entity.setSubjectId(activityCenterGoods.getSubjectId()); + entity.setSubjectCode(activityCenterGoods.getSubjectCode()); + entity.setSubjectName(activityCenterGoods.getSubjectName()); + entity.setCenterType(activityCenterGoods.getCenterType()); + entity.setCenterId(activityCenterGoods.getCenterId()); + entity.setCenterCode(activityCenterGoods.getCenterCode()); + entity.setCenterName(activityCenterGoods.getCenterName()); + entity.setCenterAmount(activityCenterGoods.getCenterAmount()); + entity.setCenterRate(activityCenterGoods.getCenterRate()); + entity.setCenterGoodsAmount(activityCenterGoods.getCenterGoodsAmount()); + entity.setCenterGoodsRate(activityCenterGoods.getCenterGoodsRate()); + entity.setUsedAmount(activityCenterGoods.getUsedAmount()); + entity.setTargetType(activityCenterGoods.getTargetType()); + entity.setTargetId(activityCenterGoods.getTargetId()); + entity.setTargetCode(activityCenterGoods.getTargetCode()); + entity.setTargetName(activityCenterGoods.getTargetName()); + entity.setTargetLevelPathIds(activityCenterGoods.getTargetLevelPathIds()); + entity.setTargetLevelPathNames(activityCenterGoods.getTargetLevelPathNames()); + //递归初始化成本中心 + this.initializeCostCenterInfo(entity, costCenterList); + entity.setActStartDate(activityCenterGoods.getActStartDate()); + entity.setActEndDate(activityCenterGoods.getActEndDate()); + entity.setPreStartDate(activityCenterGoods.getPreStartDate()); + entity.setPreEndDate(activityCenterGoods.getPreEndDate()); + entity.setPreCheckDate(activityCenterGoods.getPreCheckDate()); + entity.setSupplierId(activityCenterGoods.getSupplierId()); + entity.setSupplierCode(activityCenterGoods.getSupplierCode()); + entity.setSupplierName(activityCenterGoods.getSupplierName()); + entity.setTemplateId(costApply.getTemplateId()); + entity.setTemplateTitle(costApply.getTemplateTitle()); + + BmsSupplier supplier = supplierMap.get(entity.getSupplierId().toString()); + if(supplier!=null){ + BmsRegion saleRegion = saleRegionMap.get(supplier.getRegionLast()); + if(saleRegion!=null) { + entity.setSupplierSaleRegionId(saleRegion.getId()); + entity.setSupplierSaleRegionName(saleRegion.getName()); + } + + BmsRegion2 bizRegion = bizRegionMap.get(supplier.getRegion2Last()); + if(bizRegion!=null) { + entity.setSupplierBizRegionId(bizRegion.getId()); + entity.setSupplierBizRegionName(bizRegion.getName()); + } + } + return entity; + } + + + /** + * 递归初始化成本中心 + * @param entity + * @param costCenterList + */ + private void initializeCostCenterInfo(BirActivityCenterGoods entity,List costCenterList) { + String centerId = entity.getCenterId(); + String centerType = entity.getCenterType(); + String centerCode = entity.getCenterCode(); + String centerName = entity.getCenterName(); + if("center".equals(centerType)){ + for (BmsCostCenter costCenter : costCenterList) { + if(centerId.equals(costCenter.getId().toString())){ + if(costCenter.getPid().equals(0L)){ + entity.setCenterLv1Id(costCenter.getId().toString()); + entity.setCenterLv1Code(costCenter.getCode()); + entity.setCenterLv1Name(costCenter.getName()); + }else { + //递归设置成本中心 + this.recursionInitCenter(entity, costCenterList, costCenter,6); + } + } + } + }else if ("saleRegion".equals(centerType)){ + BmsRegion region = regionMapper.selectById(centerId); + if(region==null){ + QueryWrapper lqw = new QueryWrapper(); + lqw.eq("code",centerId); + region = regionMapper.selectOne(lqw); + } + String[] regionIds = region.getPathIds().split("_"); + entity.setCenterLv1Id(regionIds[0]); + if(regionIds.length>1){ + entity.setCenterLv2Id(regionIds[1]); + } + }else if ("bizRegion".equals(centerType)){ + BmsRegion2 region = region2Mapper.selectById(centerId); + if(region==null){ + QueryWrapper lqw = new QueryWrapper(); + lqw.eq("code",centerId); + region = region2Mapper.selectOne(lqw); + } + String[] regionIds = region.getPathIds().split("_"); + entity.setCenterLv1Id(regionIds[0]); + if(regionIds.length>1){ + entity.setCenterLv2Id(regionIds[1]); + } + }else{ + entity.setCenterLv1Id(centerId); + entity.setCenterLv1Code(centerCode); + entity.setCenterLv1Name(centerName); + } + } + + /** + * 递归设置成本中心 + * @param entity + * @param costCenterList + * @param costCenter + * @param maxLevel 循环最大层级 + */ + private void recursionInitCenter(BirActivityCenterGoods entity, + List costCenterList, + BmsCostCenter costCenter, + Integer maxLevel) { + maxLevel--; + for (BmsCostCenter nextTopCenter : costCenterList) { + if(nextTopCenter.getPid().equals(0L)){ + entity.setCenterLv1Id(nextTopCenter.getId().toString()); + entity.setCenterLv1Code(nextTopCenter.getCode()); + entity.setCenterLv1Name(nextTopCenter.getName()); + + entity.setCenterLv2Id(costCenter.getId().toString()); + entity.setCenterLv2Code(costCenter.getCode()); + entity.setCenterLv2Name(costCenter.getName()); + return; + }else { + if(maxLevel<0){ + return; + } + this.recursionInitCenter(entity,costCenterList,nextTopCenter,maxLevel); + } + } + } + + /** + * 获取项分割对象 + * @param activityCenterGoods + * @param dateSplitList + * @param currDateSplit + * @param currentActDays + * @return + */ + private BirCenterGoodSplitDTO buildSplitAmount(TbsActivity activity,TbsActivityCenterGoods activityCenterGoods, + List dateSplitList , + DateSplitDTO currDateSplit, + Integer currentActDays){ + + BigDecimal currentCenterGoodsAmount = activityCenterGoods.getCenterGoodsAmount(); + BigDecimal splitCenterGoodsAmount = activityCenterGoods.getCenterGoodsAmount(); + + BigDecimal currentCheckAmount = activityCenterGoods.getUsedAmount(); + BigDecimal splitCheckAmount = activityCenterGoods.getUsedAmount(); + + BigDecimal currentPayAmount = activityCenterGoods.getPayAmount(); + BigDecimal splitPayAmount = activityCenterGoods.getPayAmount(); + + // sort==size 最后一个节点 + if (currDateSplit.getSort().equals(dateSplitList.size())) { + for (DateSplitDTO splitDTO : dateSplitList) { + BigDecimal dayRate = new BigDecimal(splitDTO.getDays() + "") + .divide(new BigDecimal(currentActDays + ""), 4, BigDecimal.ROUND_HALF_DOWN); + //跳过当前年月 + if (splitDTO.getYearMonth().equals(currDateSplit.getYearMonth())) { + continue; + } + splitCenterGoodsAmount = splitCenterGoodsAmount.subtract(currentCenterGoodsAmount.multiply(dayRate).setScale(2, RoundingMode.HALF_UP)); + splitCheckAmount = splitCheckAmount.subtract(currentCheckAmount.multiply(dayRate).setScale(2, RoundingMode.HALF_UP)); + splitPayAmount = splitPayAmount.subtract(currentPayAmount.multiply(dayRate).setScale(2, RoundingMode.HALF_UP)); + } + } else { + BigDecimal dayRate = new BigDecimal(currDateSplit.getDays() + "") + .divide(new BigDecimal(currentActDays + ""), 4, BigDecimal.ROUND_HALF_DOWN); + splitCenterGoodsAmount = currentCenterGoodsAmount.multiply(dayRate).setScale(2, RoundingMode.HALF_UP); + splitCheckAmount = currentCheckAmount.multiply(dayRate).setScale(2, RoundingMode.HALF_UP); + splitPayAmount = currentPayAmount.multiply(dayRate).setScale(2, RoundingMode.HALF_UP); + } + BirCenterGoodSplitDTO goodSplitDTO = new BirCenterGoodSplitDTO(); + goodSplitDTO.setCurrentSplitAmount(splitCenterGoodsAmount); + goodSplitDTO.setCurrentSplitCheckAmount(splitCenterGoodsAmount); + goodSplitDTO.setCurrentSplitPayAmount(splitPayAmount); + goodSplitDTO.setCurrentSplitReleaseAmount(BigDecimal.ZERO); + if(activity.getActivityState()!=null&&activity.getActivityState().equals(TbsActivityState.STATE_1_Finished) + ||activity.getActivityState().equals(TbsActivityState.STATE_4_Release)){ + BigDecimal currentReleaseAmount = splitCenterGoodsAmount.subtract(splitCheckAmount); + goodSplitDTO.setCurrentSplitReleaseAmount(currentReleaseAmount); + goodSplitDTO.setCurrentSplitCheckAmount(splitCheckAmount); + goodSplitDTO.setCurrentSplitPayAmount(splitPayAmount); + } + return goodSplitDTO; + } + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirBaseActivityServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirBaseActivityServiceImpl.java new file mode 100644 index 0000000..ca94df1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirBaseActivityServiceImpl.java @@ -0,0 +1,215 @@ +package com.qs.serve.modules.bir.service.impl; + +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.DateSplitDTO; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.DateSplitUtil; +import com.qs.serve.modules.bir.entity.dto.UnMatchBirRecord; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.mapper.TbsActivityMapper; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper; +import com.qs.serve.modules.tbs.service.TbsActivityService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bir.entity.BirBaseActivity; +import com.qs.serve.modules.bir.service.BirBaseActivityService; +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; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * ROI费率(活动档案) 服务实现类 + * @author YenHex + * @since 2023-06-05 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BirBaseActivityServiceImpl extends ServiceImpl implements BirBaseActivityService { + + private final TbsCostApplyMapper costApplyMapper; + private final TbsActivityMapper tbsActivityMapper; + private final TbsActivityService tbsActivityService; + + @Override + public void flushByCostId(Long costId) { + TbsCostApply costApply = costApplyMapper.selectById(costId); + List activityList = tbsActivityService.listByCostApplyId(costId); + //删除历史数据 + List ids = activityList.stream().filter(a->a.getId()!=null) + .map(TbsActivity::getId).collect(Collectors.toList()); + LambdaQueryWrapper birBaseActivityLqw = new LambdaQueryWrapper<>(); + 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); + + List birBaseActivities = new ArrayList<>(); + for (TbsActivity activity : activityList) { + LocalDate actStartDate = activity.getPreStartDate(); + LocalDate actEndDate = activity.getPreEndDate(); + int currentActDays = (int) (actEndDate.toEpochDay()-actStartDate.toEpochDay()+1); + BigDecimal amount = activity.getTotalAmount(); + List dateSplitList = DateSplitUtil.getSplitDto(actStartDate,actEndDate); + + if(dateSplitList.size()>1){ + //当前年月 + for(DateSplitDTO dto : dateSplitList) { + BirBaseActivity baseActivity = new BirBaseActivity(); + + //活动金额 + BigDecimal currentAmount; + //核销金额 + BigDecimal currentCheckAmount; + //支付金额 + BigDecimal currentPayAmount = BigDecimal.ZERO; + + Integer currItemDays = 0; + + DateSplitDTO currDateSplit = dto; + currItemDays = currDateSplit.getDays(); + baseActivity.setStartDate(currDateSplit.getStartDate()); + baseActivity.setEndDate(currDateSplit.getEndDate()); + if (currDateSplit.getSort().equals(dateSplitList.size())) { + //最后一个月 + //活动金额 + currentAmount = activity.getTotalAmount(); + //核销金额 + currentCheckAmount = activity.getUsedAmount(); + currentPayAmount = activity.getPayAmount(); + for (DateSplitDTO splitDTO : dateSplitList) { + //跳过当前年月 + if (splitDTO.getYearMonth().equals(dto.getYearMonth())) { + continue; + } + //日期占比 + BigDecimal dayRate = new BigDecimal(splitDTO.getDays() + "") + .divide(new BigDecimal(currentActDays + ""), 2, BigDecimal.ROUND_HALF_DOWN); + currentAmount = currentAmount.subtract(amount.multiply(dayRate).setScale(2, RoundingMode.HALF_UP)); + currentCheckAmount = currentCheckAmount.subtract(activity.getUsedAmount().multiply(dayRate).setScale(2, RoundingMode.HALF_UP)); + } + } else { + //日期占比 + BigDecimal dayRate = new BigDecimal(currDateSplit.getDays() + "") + .divide(new BigDecimal(currentActDays + ""), 2, BigDecimal.ROUND_HALF_DOWN); + currentAmount = amount.multiply(dayRate).setScale(2, RoundingMode.HALF_UP); + currentCheckAmount = activity.getUsedAmount().multiply(dayRate).setScale(2, RoundingMode.HALF_UP); + currentPayAmount = activity.getPayAmount().multiply(dayRate).setScale(2, RoundingMode.HALF_UP); + } + + baseActivity.setKeyNum(dto.getYearMonth()); + baseActivity.setActivityId(activity.getId()); + baseActivity.setCostApplyId(costApply.getId()); + baseActivity.setActivityAmt(currentAmount); + baseActivity.setActivityTotalAmt(activity.getTotalAmount()); + baseActivity.setActivityUsedAmt(activity.getUsedAmount()); + baseActivity.setVerificationAmt(currentCheckAmount); + baseActivity.setPreActQuantity(activity.getPreActQuantity()); + baseActivity.setSupplierId(activity.getSupplierId()); + baseActivity.setSupplierCode(activity.getSupplierCode()); + baseActivity.setSupplierName(activity.getSupplierName()); + baseActivity.setActivityStartDate(actStartDate); + baseActivity.setActivityEndDate(actEndDate); + baseActivity.setUserId(costApply.getUserId()); + baseActivity.setMonthDays(currItemDays); + baseActivity.setCostPassFlag(activity.getCostPassFlag()); + baseActivity.setTotalDays(currentActDays); + baseActivity.setApplyStatus(activity.getFinishedFlag()); + birBaseActivities.add(baseActivity); + } + }else if (dateSplitList.size()==1){ + BirBaseActivity baseActivity = new BirBaseActivity(); + + //活动金额 + BigDecimal currentAmountOne = null; + //核销金额 + BigDecimal currentCheckAmountOne = null; + Integer currItemDaysOne = null; + + DateSplitDTO dateSplit = dateSplitList.get(0); + baseActivity.setStartDate(dateSplit.getStartDate()); + baseActivity.setEndDate(dateSplit.getEndDate()); + currentAmountOne = amount; + currentCheckAmountOne = activity.getUsedAmount(); + currItemDaysOne = dateSplit.getDays(); + + baseActivity.setKeyNum(dateSplit.getYearMonth()); + baseActivity.setActivityId(activity.getId()); + baseActivity.setCostApplyId(costApply.getId()); + baseActivity.setActivityAmt(currentAmountOne); + baseActivity.setActivityTotalAmt(activity.getTotalAmount()); + baseActivity.setActivityUsedAmt(activity.getUsedAmount()); + baseActivity.setVerificationAmt(currentCheckAmountOne); + baseActivity.setPreActQuantity(activity.getPreActQuantity()); + baseActivity.setSupplierId(activity.getSupplierId()); + baseActivity.setActivityStartDate(actStartDate); + baseActivity.setActivityEndDate(actEndDate); + baseActivity.setSupplierCode(activity.getSupplierCode()); + baseActivity.setSupplierName(activity.getSupplierName()); + baseActivity.setUserId(costApply.getUserId()); + baseActivity.setMonthDays(currItemDaysOne); + baseActivity.setCostPassFlag(activity.getCostPassFlag()); + baseActivity.setTotalDays(currentActDays); + baseActivity.setApplyStatus(activity.getFinishedFlag()); + birBaseActivities.add(baseActivity); + }else { + Assert.throwEx("dateSplitList is empty"); + } + + + } + //保存 + LocalDateTime nowTime = LocalDateTime.now(); + for (BirBaseActivity baseActivity : birBaseActivities) { + baseActivity.setId(IdUtil.getSnowflakeNextId()); + baseActivity.setUpdateTime(nowTime); + super.getBaseMapper().insert(baseActivity); + } + } + + @Override + public void compareAmtToUpdateActivityAmt() { + List matchBirRecords = baseMapper.selectUnMatchBir(); + Map> listMap = matchBirRecords.stream().collect(Collectors.groupingBy(UnMatchBirRecord::getActivityId)); + for (String activityId : listMap.keySet()) { + List list = listMap.get(activityId); + BigDecimal totalAmt1 = BigDecimal.ZERO; + BigDecimal totalAmt2 = BigDecimal.ZERO; + for (UnMatchBirRecord record : list) { + totalAmt1 = totalAmt1.add(record.getActivityAmt()); + totalAmt2 = totalAmt2.add(record.getBirCenterGoodAmt()); + } + //允许有不超过 3 的误差 + if(totalAmt1.subtract(totalAmt2).abs().doubleValue() < 3){ + List updList = new ArrayList<>(); + for (UnMatchBirRecord record : list) { + BirBaseActivity baseActivity = new BirBaseActivity(); + baseActivity.setId(record.getBirActId()); + baseActivity.setActivityAmt(record.getBirCenterGoodAmt()); + updList.add(baseActivity); + } + updateBatchById(updList); + } + } + + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirBudgetTargetImportServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirBudgetTargetImportServiceImpl.java new file mode 100644 index 0000000..e0541e6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirBudgetTargetImportServiceImpl.java @@ -0,0 +1,586 @@ +package com.qs.serve.modules.bir.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.base.ErpDataBaseService; +import com.qs.serve.modules.bir.entity.BirActivityCenterGoods; +import com.qs.serve.modules.bir.entity.BirBudgetTarget; +import com.qs.serve.modules.bir.entity.BirCityTargetView; +import com.qs.serve.modules.bir.entity.so.BirBudgetTargetSo; +import com.qs.serve.modules.bir.entity.vo.BirBudgetTargetVo; +import com.qs.serve.modules.bir.mapper.BirActivityCenterGoodsMapper; +import com.qs.serve.modules.bir.mapper.BirBudgetTargetMapper; +import com.qs.serve.modules.bir.service.BirBudgetTargetImportService; +import com.qs.serve.modules.bir.service.BirBudgetTargetService; +import com.qs.serve.modules.bir.service.BirCityTargetViewService; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsRegion2Service; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.erp.entity.dto.ErpDispatchSumVo; +import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.service.GoodsCategoryService; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.sql.SQLException; +import java.time.LocalDateTime; +import java.time.temporal.TemporalAdjusters; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * @author YenHex + * @since 2024-06-04 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BirBudgetTargetImportServiceImpl extends ServiceImpl implements BirBudgetTargetImportService { + + private BirActivityCenterGoodsMapper birActivityCenterGoodsMapper; + private GoodsSpuService goodsSpuService; + private GoodsSkuService goodsSkuService; + private GoodsCategoryService goodsCategoryService; + private ErpDispatchDataMapper erpDispatchDataMapper; + private BmsRegion2Service region2Service; + private BmsSupplierService bmsSupplierService; + private BirCityTargetViewService birCityTargetViewService; + + private BirBudgetTarget initTargetByBirCenterGoods(BirActivityCenterGoods item){ + BirBudgetTarget target = new BirBudgetTarget(); + target.setSearchType(0); + Integer keyNum = item.getKeyNum(); + initTargetDate(target,keyNum); + + //成本中心 + target.setCenterType(item.getCenterType()); + target.setCenterId(item.getCenterId()); + target.setCenterCode(item.getCenterCode()); + target.setCenterName(item.getCenterName()); + + //客户 + target.setCustomerId(item.getSupplierId()+""); + target.setCustomerCode(item.getSupplierCode()); + target.setCustomerName(item.getSupplierName()); + + + target.setTotalRealAmt(item.getSplitUsedAmount()); + + //品牌 + target.setBrandId(item.getTargetLevelPathIds()); + target.setBrandName(item.getTargetLevelPathNames()); + + target.setId(IdUtil.getSnowflakeNextId()); + + return target; + } + + private void initTargetDate(BirBudgetTarget target,Integer keyNum ){ + target.setYearNum(keyNum / 100); + target.setMonthNum(keyNum % 100); + target.setQuarterNum(DateUtils.getQuarter(target.getMonthNum())); + } + + public void buildCustomerCost() { + BirBudgetTargetSo so = new BirBudgetTargetSo(); + List birActivityCenterGoodsList = birActivityCenterGoodsMapper.list4BirBudgetTarget(so); + List targetList = birActivityCenterGoodsList.stream() + .map(item->initTargetByBirCenterGoods(item)).collect(Collectors.toList()); + + List brandIds = targetList.stream().map(a->a.getBrandId()).distinct().collect(Collectors.toList()); + + brandIds.stream().forEach(brandId->{ + LambdaQueryWrapper spuQueryWrapper = new LambdaQueryWrapper<>(); + spuQueryWrapper.select(GoodsSpu::getId); + spuQueryWrapper.eq(GoodsSpu::getCategoryFirst,brandId); + List goodsSpuList = goodsSpuService.list(spuQueryWrapper); + List spuIds = goodsSpuList.stream().map(a->a.getId()).collect(Collectors.toList()); + if(spuIds.size()==0){ + return; + } + LambdaQueryWrapper skuQueryWrapper = new LambdaQueryWrapper<>(); + skuQueryWrapper.in(GoodsSku::getSpuId,spuIds); + List goodsSkuList = goodsSkuService.list(skuQueryWrapper); + List skuCodes = goodsSkuList.stream().map(a->a.getSkuCode()).distinct().collect(Collectors.toList()); + List erpDispatchSumVos = erpDispatchDataMapper.querySumCost4BudgetTarger(skuCodes); + + Map erpDispatchSumMap = erpDispatchSumVos.stream() + .collect(Collectors.toMap( + vo -> vo.getYearMonth() + "_" + vo.getCustomerCode(), + ErpDispatchSumVo::getDispatchSumCost)); + + targetList.stream().forEach(item->{ + if(item.getBrandId().equals(brandId)){ + String key = (item.getYearNum()*100 + item.getMonthNum()) + "_" + item.getCustomerCode(); + if(erpDispatchSumMap.containsKey(key)){ + item.setDispatchAmt(erpDispatchSumMap.get(key)); + } + + String lastkey = ((item.getYearNum()-1)*100 + item.getMonthNum()) + "_" + item.getCustomerCode(); + if(erpDispatchSumMap.containsKey(lastkey)){ + item.setLastYearDispatchAmt(erpDispatchSumMap.get(lastkey)); + } + } + }); + }); + + try { + SqlServerUtil.batchInsert(ErpDataBaseService.getErpJslGroupDbConnectionUrl(),targetList); + } catch (SQLException throwables) { + throwables.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + public void buildCityCost() { + + LambdaQueryWrapper supplierLambdaQueryWrapper = new LambdaQueryWrapper<>(); + supplierLambdaQueryWrapper.eq(BmsSupplier::getBookCode,"001"); + List bmsSupplierList = bmsSupplierService.list(supplierLambdaQueryWrapper); + + Map> supplierByRegionSec = bmsSupplierList.stream().filter(a->a.getRegion2Second()!=null) + .collect(Collectors.groupingBy(BmsSupplier::getRegion2Second)); + + List insertList = new ArrayList<>(); + + supplierByRegionSec.keySet().stream().forEach(region2Id->{ + + List supplierList = supplierByRegionSec.get(region2Id); + List customerIds = supplierList.stream().map(a->a.getId()).collect(Collectors.toList()); + //城市ID查目标 和 预算 + LambdaQueryWrapper cityTargetLambdaQueryWrapper = new LambdaQueryWrapper<>(); + cityTargetLambdaQueryWrapper.eq(BirCityTargetView::getCityId,region2Id); + cityTargetLambdaQueryWrapper.eq(BirCityTargetView::getType,0); + List birCityTagetList = birCityTargetViewService.list(cityTargetLambdaQueryWrapper); + if(birCityTagetList.size()==0){ + log.warn("没有找到城市,ID为"+region2Id); + return; + } + Map> cityTargetByBrand = + birCityTagetList.stream().collect(Collectors.groupingBy(BirCityTargetView::getBrandId)); + + cityTargetByBrand.keySet().stream().forEach(brandId->{ + List targetList = cityTargetByBrand.get(brandId); +// BigDecimal m1 = sumTargetData(targetList,"m1"); +// BigDecimal m2 = sumTargetData(targetList,"m2"); +// BigDecimal m3 = sumTargetData(targetList,"m3"); +// BigDecimal m4 = sumTargetData(targetList,"m4"); +// BigDecimal m5 = sumTargetData(targetList,"m5"); +// BigDecimal m6 = sumTargetData(targetList,"m6"); +// BigDecimal m7 = sumTargetData(targetList,"m7"); +// BigDecimal m8 = sumTargetData(targetList,"m8"); +// BigDecimal m9 = sumTargetData(targetList,"m9"); +// BigDecimal m10 = sumTargetData(targetList,"m10"); +// BigDecimal m11 = sumTargetData(targetList,"m11"); +// BigDecimal m12 = sumTargetData(targetList,"m12"); +// BigDecimal q1Budget = sumTargetData(targetList,"q1Budget"); +// BigDecimal q2Budget = sumTargetData(targetList,"q2Budget"); +// BigDecimal q3Budget = sumTargetData(targetList,"q3Budget"); +// BigDecimal q4Budget = sumTargetData(targetList,"q4Budget"); + BigDecimal yearTarget = sumTargetData(targetList,"yearTarget"); + BigDecimal yearBudget = sumTargetData(targetList,"yearBudget"); + BigDecimal yearRate; + if(yearTarget.compareTo(BigDecimal.ZERO)==0){ + yearRate = BigDecimal.ZERO; + }else{ + yearRate = yearBudget.divide(yearTarget, 4, BigDecimal.ROUND_HALF_UP); + } + + LambdaQueryWrapper birDataLambdaQueryWrapper = new LambdaQueryWrapper<>(); + birDataLambdaQueryWrapper.in(BirBudgetTarget::getCustomerId, customerIds); + birDataLambdaQueryWrapper.eq(BirBudgetTarget::getBrandId, brandId); + birDataLambdaQueryWrapper.eq(BirBudgetTarget::getYearNum, 2024); + birDataLambdaQueryWrapper.eq(BirBudgetTarget::getSearchType, 0); + + List data2024List = this.list(birDataLambdaQueryWrapper); + + Map> data2024MonMap = + data2024List.stream().collect(Collectors.groupingBy(BirBudgetTarget::getMonthNum)); + + data2024MonMap.keySet().stream().forEach(mon->{ +// for(int mon= 1;mon<=12;mon++) { + +// List dataList = this.list(birDataLambdaQueryWrapper); + List dataMonList = data2024MonMap.get(mon); + + Map> dataCenterMap = + dataMonList.stream().collect(Collectors.groupingBy(g->g.getCenterType()+"_"+g.getCenterId())); + + dataCenterMap.keySet().stream().forEach(centerKey->{ + List dataList = dataCenterMap.get(centerKey); + + BigDecimal dispatchAmt = dataList.stream().map(a -> a.getDispatchAmt()==null?BigDecimal.ZERO:a.getDispatchAmt()).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal lastYearDispatchAmt = dataList.stream().map(a -> a.getLastYearDispatchAmt()==null?BigDecimal.ZERO:a.getLastYearDispatchAmt()).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal totalRealAmt = dataList.stream().map(a -> a.getTotalRealAmt()==null?BigDecimal.ZERO:a.getTotalRealAmt()).reduce(BigDecimal.ZERO, BigDecimal::add); + BirBudgetTarget targetData = new BirBudgetTarget(); + + String[] centerType = centerKey.split("_"); + targetData.setCenterType(centerType[0]); + targetData.setCenterId(centerType[1]); + + targetData.setSearchType(1); + targetData.setId(IdUtil.getSnowflakeNextId()); + targetData.setBrandId(brandId + ""); + targetData.setYearNum(2024); + targetData.setMonthNum(mon); + targetData.setQuarterNum(DateUtils.getQuarter(mon)); + targetData.setDispatchAmt(dispatchAmt.setScale(2, RoundingMode.HALF_UP)); + targetData.setLastYearDispatchAmt(lastYearDispatchAmt.setScale(2, RoundingMode.HALF_UP)); + targetData.setTotalRealAmt(totalRealAmt.setScale(2, RoundingMode.HALF_UP)); + targetData.setTargetAmt(sumTargetData(targetList,"m"+mon).multiply(new BigDecimal(10000)).setScale(2, RoundingMode.HALF_UP)); + targetData.setBudgetAmt(sumTargetData(targetList,"q"+DateUtils.getQuarter(mon)+"Budget").multiply(new BigDecimal(10000)).setScale(2, RoundingMode.HALF_UP)); + targetData.setRate(yearRate); + targetData.setCustomerId(region2Id); + insertList.add(targetData); + }); + }); + }); + //得到品牌IDs 和 时间 + + //客户IDs和品牌IDs和 时间查实际费 + + }); + + try { + SqlServerUtil.batchInsert(ErpDataBaseService.getErpJslGroupDbConnectionUrl(),insertList); + } catch (SQLException throwables) { + throwables.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + private BigDecimal sumTargetData(List targetList,String fieldName) { + if(targetList.size()==0){ + return BigDecimal.ZERO; + } + try { + Class clazz = targetList.get(0).getClass(); + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + + BigDecimal target = targetList.stream().map(transaction -> { + try { + String fieldNameValue = (String) field.get(transaction); + if(fieldNameValue==null || !StringUtils.hasText(fieldNameValue)){ + return BigDecimal.ZERO; + } + return new BigDecimal(fieldNameValue); + } catch (NumberFormatException | IllegalAccessException e) { + e.printStackTrace(); + return BigDecimal.ZERO; + } + }).reduce(BigDecimal.ZERO, BigDecimal::add); + return target; + + } catch (NoSuchFieldException e) { + e.printStackTrace(); + return BigDecimal.ZERO; + } + } + + + public void buildProCost() { + + LambdaQueryWrapper supplierLambdaQueryWrapper = new LambdaQueryWrapper<>(); + supplierLambdaQueryWrapper.eq(BmsSupplier::getBookCode,"001"); + List bmsSupplierList = bmsSupplierService.list(supplierLambdaQueryWrapper); + + Map> supplierByRegionSec = bmsSupplierList.stream().filter(a->a.getRegionSecond()!=null) + .collect(Collectors.groupingBy(BmsSupplier::getRegionSecond)); + + List insertList = new ArrayList<>(); + + supplierByRegionSec.keySet().stream().forEach(region2Id->{ + + List supplierList = supplierByRegionSec.get(region2Id); + List customerIds = supplierList.stream().map(a->a.getId()).collect(Collectors.toList()); + //城市ID查目标 和 预算 + LambdaQueryWrapper cityTargetLambdaQueryWrapper = new LambdaQueryWrapper<>(); + cityTargetLambdaQueryWrapper.eq(BirCityTargetView::getRegionSales2Id,region2Id); + cityTargetLambdaQueryWrapper.eq(BirCityTargetView::getType,1); + List birCityTagetList = birCityTargetViewService.list(cityTargetLambdaQueryWrapper); + if(birCityTagetList.size()==0){ + log.warn("没有找到二级销售区域,ID为"+region2Id); + return; + } + Map> cityTargetByBrand = + birCityTagetList.stream().collect(Collectors.groupingBy(BirCityTargetView::getBrandId)); + + cityTargetByBrand.keySet().stream().forEach(brandId->{ + List targetList = cityTargetByBrand.get(brandId); +// BigDecimal m1 = sumTargetData(targetList,"m1"); +// BigDecimal m2 = sumTargetData(targetList,"m2"); +// BigDecimal m3 = sumTargetData(targetList,"m3"); +// BigDecimal m4 = sumTargetData(targetList,"m4"); +// BigDecimal m5 = sumTargetData(targetList,"m5"); +// BigDecimal m6 = sumTargetData(targetList,"m6"); +// BigDecimal m7 = sumTargetData(targetList,"m7"); +// BigDecimal m8 = sumTargetData(targetList,"m8"); +// BigDecimal m9 = sumTargetData(targetList,"m9"); +// BigDecimal m10 = sumTargetData(targetList,"m10"); +// BigDecimal m11 = sumTargetData(targetList,"m11"); +// BigDecimal m12 = sumTargetData(targetList,"m12"); +// BigDecimal q1Budget = sumTargetData(targetList,"q1Budget"); +// BigDecimal q2Budget = sumTargetData(targetList,"q2Budget"); +// BigDecimal q3Budget = sumTargetData(targetList,"q3Budget"); +// BigDecimal q4Budget = sumTargetData(targetList,"q4Budget"); + BigDecimal yearTarget = sumTargetData(targetList,"yearTarget"); + BigDecimal yearBudget = sumTargetData(targetList,"yearBudget"); + BigDecimal yearRate; + if(yearTarget.compareTo(BigDecimal.ZERO)==0){ + yearRate = BigDecimal.ZERO; + }else{ + yearRate = yearBudget.divide(yearTarget, 4, BigDecimal.ROUND_HALF_UP); + } + + LambdaQueryWrapper birDataLambdaQueryWrapper = new LambdaQueryWrapper<>(); + birDataLambdaQueryWrapper.in(BirBudgetTarget::getCustomerId, customerIds); + birDataLambdaQueryWrapper.eq(BirBudgetTarget::getBrandId, brandId); + birDataLambdaQueryWrapper.eq(BirBudgetTarget::getYearNum, 2024); + birDataLambdaQueryWrapper.eq(BirBudgetTarget::getSearchType, 0); + + List data2024List = this.list(birDataLambdaQueryWrapper); + + Map> data2024MonMap = + data2024List.stream().collect(Collectors.groupingBy(BirBudgetTarget::getMonthNum)); + + data2024MonMap.keySet().stream().forEach(mon->{ +// for(int mon= 1;mon<=12;mon++) { + +// List dataList = this.list(birDataLambdaQueryWrapper); + List dataMonList = data2024MonMap.get(mon); + + Map> dataCenterMap = + dataMonList.stream().collect(Collectors.groupingBy(g->g.getCenterType()+"_"+g.getCenterId())); + + dataCenterMap.keySet().stream().forEach(centerKey->{ + List dataList = dataCenterMap.get(centerKey); + + BigDecimal dispatchAmt = dataList.stream().map(a -> a.getDispatchAmt()==null?BigDecimal.ZERO:a.getDispatchAmt()).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal lastYearDispatchAmt = dataList.stream().map(a -> a.getLastYearDispatchAmt()==null?BigDecimal.ZERO:a.getLastYearDispatchAmt()).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal totalRealAmt = dataList.stream().map(a -> a.getTotalRealAmt()==null?BigDecimal.ZERO:a.getTotalRealAmt()).reduce(BigDecimal.ZERO, BigDecimal::add); + BirBudgetTarget targetData = new BirBudgetTarget(); + + String[] centerType = centerKey.split("_"); + targetData.setCenterType(centerType[0]); + targetData.setCenterId(centerType[1]); + + targetData.setSearchType(2); + targetData.setId(IdUtil.getSnowflakeNextId()); + targetData.setBrandId(brandId + ""); + targetData.setYearNum(2024); + targetData.setMonthNum(mon); + targetData.setQuarterNum(DateUtils.getQuarter(mon)); + targetData.setDispatchAmt(dispatchAmt.setScale(2, RoundingMode.HALF_UP)); + targetData.setLastYearDispatchAmt(lastYearDispatchAmt.setScale(2, RoundingMode.HALF_UP)); + targetData.setTotalRealAmt(totalRealAmt.setScale(2, RoundingMode.HALF_UP)); + targetData.setTargetAmt(sumTargetData(targetList,"m"+mon).multiply(new BigDecimal(10000)).setScale(2, RoundingMode.HALF_UP)); + targetData.setBudgetAmt(sumTargetData(targetList,"q"+DateUtils.getQuarter(mon)+"Budget").multiply(new BigDecimal(10000)).setScale(2, RoundingMode.HALF_UP)); + targetData.setRate(yearRate); + targetData.setCustomerId(region2Id); + insertList.add(targetData); + + LambdaUpdateWrapper birCustomerUpdateLambdaQueryWrapper = new LambdaUpdateWrapper<>(); + birCustomerUpdateLambdaQueryWrapper.set(BirBudgetTarget::getProvinceCityAmt,targetData.getTotalRealAmt()); + birCustomerUpdateLambdaQueryWrapper.eq(BirBudgetTarget::getYearNum,2024); + birCustomerUpdateLambdaQueryWrapper.eq(BirBudgetTarget::getMonthNum,mon); + birCustomerUpdateLambdaQueryWrapper.eq(BirBudgetTarget::getCenterType,centerType[0]); + birCustomerUpdateLambdaQueryWrapper.eq(BirBudgetTarget::getCenterId,centerType[1]); + birCustomerUpdateLambdaQueryWrapper.eq(BirBudgetTarget::getBrandId,brandId); + birCustomerUpdateLambdaQueryWrapper.eq(BirBudgetTarget::getSearchType,0); + birCustomerUpdateLambdaQueryWrapper.in(BirBudgetTarget::getCustomerId,customerIds); + this.update(birCustomerUpdateLambdaQueryWrapper); + }); + }); + }); + //得到品牌IDs 和 时间 + + //客户IDs和品牌IDs和 时间查实际费 + + }); + + try { + SqlServerUtil.batchInsert(ErpDataBaseService.getErpJslGroupDbConnectionUrl(),insertList); + } catch (SQLException throwables) { + throwables.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + + public void buildAreaCost() { + + LambdaQueryWrapper supplierLambdaQueryWrapper = new LambdaQueryWrapper<>(); + supplierLambdaQueryWrapper.eq(BmsSupplier::getBookCode,"001"); + List bmsSupplierList = bmsSupplierService.list(supplierLambdaQueryWrapper); + + Map> supplierByRegionSec = bmsSupplierList.stream().filter(a->a.getRegionFirst()!=null) + .collect(Collectors.groupingBy(BmsSupplier::getRegionFirst)); + + List insertList = new ArrayList<>(); + + supplierByRegionSec.keySet().stream().forEach(region2Id->{ + + List supplierList = supplierByRegionSec.get(region2Id); + List customerIds = supplierList.stream().map(a->a.getId()).collect(Collectors.toList()); + //城市ID查目标 和 预算 + LambdaQueryWrapper cityTargetLambdaQueryWrapper = new LambdaQueryWrapper<>(); + cityTargetLambdaQueryWrapper.eq(BirCityTargetView::getRegionId,region2Id); + cityTargetLambdaQueryWrapper.eq(BirCityTargetView::getType,2); + List birCityTagetList = birCityTargetViewService.list(cityTargetLambdaQueryWrapper); + if(birCityTagetList.size()==0){ + log.warn("没有找到一级销售区域,ID为"+region2Id); + return; + } + Map> cityTargetByBrand = + birCityTagetList.stream().collect(Collectors.groupingBy(BirCityTargetView::getBrandId)); + + cityTargetByBrand.keySet().stream().forEach(brandId->{ + List targetList = cityTargetByBrand.get(brandId); +// BigDecimal m1 = sumTargetData(targetList,"m1"); +// BigDecimal m2 = sumTargetData(targetList,"m2"); +// BigDecimal m3 = sumTargetData(targetList,"m3"); +// BigDecimal m4 = sumTargetData(targetList,"m4"); +// BigDecimal m5 = sumTargetData(targetList,"m5"); +// BigDecimal m6 = sumTargetData(targetList,"m6"); +// BigDecimal m7 = sumTargetData(targetList,"m7"); +// BigDecimal m8 = sumTargetData(targetList,"m8"); +// BigDecimal m9 = sumTargetData(targetList,"m9"); +// BigDecimal m10 = sumTargetData(targetList,"m10"); +// BigDecimal m11 = sumTargetData(targetList,"m11"); +// BigDecimal m12 = sumTargetData(targetList,"m12"); +// BigDecimal q1Budget = sumTargetData(targetList,"q1Budget"); +// BigDecimal q2Budget = sumTargetData(targetList,"q2Budget"); +// BigDecimal q3Budget = sumTargetData(targetList,"q3Budget"); +// BigDecimal q4Budget = sumTargetData(targetList,"q4Budget"); + BigDecimal yearTarget = sumTargetData(targetList,"yearTarget"); + BigDecimal yearBudget = sumTargetData(targetList,"yearBudget"); + BigDecimal yearRate; + if(yearTarget.compareTo(BigDecimal.ZERO)==0){ + yearRate = BigDecimal.ZERO; + }else{ + yearRate = yearBudget.divide(yearTarget, 4, BigDecimal.ROUND_HALF_UP); + } + + LambdaQueryWrapper birDataLambdaQueryWrapper = new LambdaQueryWrapper<>(); + birDataLambdaQueryWrapper.in(BirBudgetTarget::getCustomerId, customerIds); + birDataLambdaQueryWrapper.eq(BirBudgetTarget::getBrandId, brandId); + birDataLambdaQueryWrapper.eq(BirBudgetTarget::getYearNum, 2024); + birDataLambdaQueryWrapper.eq(BirBudgetTarget::getSearchType, 0); + + List data2024List = this.list(birDataLambdaQueryWrapper); + + Map> data2024MonMap = + data2024List.stream().collect(Collectors.groupingBy(BirBudgetTarget::getMonthNum)); + + data2024MonMap.keySet().stream().forEach(mon->{ +// for(int mon= 1;mon<=12;mon++) { + +// List dataList = this.list(birDataLambdaQueryWrapper); + List dataMonList = data2024MonMap.get(mon); + + Map> dataCenterMap = + dataMonList.stream().collect(Collectors.groupingBy(g->g.getCenterType()+"_"+g.getCenterId())); + + dataCenterMap.keySet().stream().forEach(centerKey-> { + List dataList = dataCenterMap.get(centerKey); + + BigDecimal dispatchAmt = dataList.stream().map(a -> a.getDispatchAmt() == null ? BigDecimal.ZERO : a.getDispatchAmt()).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal lastYearDispatchAmt = dataList.stream().map(a -> a.getLastYearDispatchAmt() == null ? BigDecimal.ZERO : a.getLastYearDispatchAmt()).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal totalRealAmt = dataList.stream().map(a -> a.getTotalRealAmt() == null ? BigDecimal.ZERO : a.getTotalRealAmt()).reduce(BigDecimal.ZERO, BigDecimal::add); + BirBudgetTarget targetData = new BirBudgetTarget(); + + String[] centerType = centerKey.split("_"); + targetData.setCenterType(centerType[0]); + targetData.setCenterId(centerType[1]); + targetData.setSearchType(3); + targetData.setId(IdUtil.getSnowflakeNextId()); + targetData.setBrandId(brandId + ""); + targetData.setYearNum(2024); + targetData.setMonthNum(mon); + targetData.setQuarterNum(DateUtils.getQuarter(mon)); + targetData.setDispatchAmt(dispatchAmt.setScale(2, RoundingMode.HALF_UP)); + targetData.setLastYearDispatchAmt(lastYearDispatchAmt.setScale(2, RoundingMode.HALF_UP)); + targetData.setTotalRealAmt(totalRealAmt.setScale(2, RoundingMode.HALF_UP)); + targetData.setTargetAmt(sumTargetData(targetList, "m" + mon).multiply(new BigDecimal(10000)).setScale(2, RoundingMode.HALF_UP)); + targetData.setBudgetAmt(sumTargetData(targetList, "q" + DateUtils.getQuarter(mon) + "Budget").multiply(new BigDecimal(10000)).setScale(2, RoundingMode.HALF_UP)); + targetData.setRate(yearRate); + targetData.setCustomerId(region2Id); + insertList.add(targetData); + + LambdaUpdateWrapper birCustomerUpdateLambdaQueryWrapper = new LambdaUpdateWrapper<>(); + birCustomerUpdateLambdaQueryWrapper.set(BirBudgetTarget::getProvinceCityRegionAmt,targetData.getTotalRealAmt()); + birCustomerUpdateLambdaQueryWrapper.eq(BirBudgetTarget::getYearNum,2024); + birCustomerUpdateLambdaQueryWrapper.eq(BirBudgetTarget::getMonthNum,mon); + birCustomerUpdateLambdaQueryWrapper.eq(BirBudgetTarget::getCenterType,centerType[0]); + birCustomerUpdateLambdaQueryWrapper.eq(BirBudgetTarget::getCenterId,centerType[1]); + birCustomerUpdateLambdaQueryWrapper.eq(BirBudgetTarget::getBrandId,brandId); + birCustomerUpdateLambdaQueryWrapper.eq(BirBudgetTarget::getSearchType,0); + birCustomerUpdateLambdaQueryWrapper.in(BirBudgetTarget::getCustomerId,customerIds); + this.update(birCustomerUpdateLambdaQueryWrapper); + + }); + }); + }); + //得到品牌IDs 和 时间 + + //客户IDs和品牌IDs和 时间查实际费 + + }); + + try { + SqlServerUtil.batchInsert(ErpDataBaseService.getErpJslGroupDbConnectionUrl(),insertList); + } catch (SQLException throwables) { + throwables.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + public void deleteAll(){ +// LambdaQueryWrapper birDataLambdaQueryWrapper = new LambdaQueryWrapper<>(); +// this.remove(birDataLambdaQueryWrapper); + this.getBaseMapper().deleteAllData(); + } + + public void setProviceCityAmt(){ + LambdaQueryWrapper birDataLambdaQueryWrapper = new LambdaQueryWrapper<>(); + birDataLambdaQueryWrapper.eq(BirBudgetTarget::getSearchType,2); + List proList = this.list(birDataLambdaQueryWrapper); + + Map> proMap = + proList.stream().collect(Collectors.groupingBy(BirBudgetTarget::getCustomerId)); + + proMap.keySet().stream().forEach(proCustomeId->{ + LambdaQueryWrapper cityTargetLambdaQueryWrapper = new LambdaQueryWrapper<>(); + cityTargetLambdaQueryWrapper.eq(BirCityTargetView::getRegionSales2Id,proCustomeId); + cityTargetLambdaQueryWrapper.eq(BirCityTargetView::getType,0); + List birCityTagetList = birCityTargetViewService.list(cityTargetLambdaQueryWrapper); + List cityIds = birCityTagetList.stream().map(a->a.getCityId()).distinct().collect(Collectors.toList()); + LambdaQueryWrapper birCityLambdaQueryWrapper = new LambdaQueryWrapper<>(); + birCityLambdaQueryWrapper.eq(BirBudgetTarget::getSearchType,1); + List cityList = this.list(birCityLambdaQueryWrapper); + }); + } +} \ No newline at end of file diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirBudgetTargetServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirBudgetTargetServiceImpl.java new file mode 100644 index 0000000..50b9de5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirBudgetTargetServiceImpl.java @@ -0,0 +1,416 @@ +package com.qs.serve.modules.bir.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.tbs.common.util.BirHttpUtil; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.bir.entity.BirActivityCenterGoods; +import com.qs.serve.modules.bir.entity.so.BirBudgetTargetSo; +import com.qs.serve.modules.bir.entity.vo.BirBaseDispatchVo; +import com.qs.serve.modules.bir.entity.vo.BirBaseReportVo; +import com.qs.serve.modules.bir.entity.vo.BirBudgetTargetVo; +import com.qs.serve.modules.bir.mapper.BirActivityCenterGoodsMapper; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsRegion2Service; +import com.qs.serve.modules.bms.service.BmsRegionService; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bir.entity.BirBudgetTarget; +import com.qs.serve.modules.bir.service.BirBudgetTargetService; +import com.qs.serve.modules.bir.mapper.BirBudgetTargetMapper; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * @author YenHex + * @since 2024-06-04 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BirBudgetTargetServiceImpl extends ServiceImpl implements BirBudgetTargetService { + + private BmsSupplierService bmsSupplierService; + private BmsSupplierMapper bmsSupplierMapper; + private BmsRegion2Service bmsRegion2Service; + private BmsRegionService bmsRegionService; + private BirActivityCenterGoodsMapper birActivityCenterGoodsMapper; + + private void initQuery(BirBudgetTargetSo query){ + query.setLoadType(query.getLoadType()-1); + + if(query.getLoadType()==0) { + BmsSupplier supplier = bmsSupplierService.getById(query.getTargetId()); + if(supplier==null){ + Assert.throwEx("找不到该客户!"); + } + List supplierIds = new ArrayList<>(); + List supplierCodes = new ArrayList<>(); + supplierIds.add(supplier.getId()); + query.setSupplierIds(supplierIds); + supplierCodes.add(supplier.getCode()); + query.setSupplierCodes(supplierCodes); + }else if(query.getLoadType()==1){ + BmsSupplier param4Supplier = new BmsSupplier(); + param4Supplier.setCurrUserId(query.getTargetId()); + List supplierList = bmsSupplierMapper.selectSupplierList(param4Supplier); + List supplierIds = supplierList.stream() + .map(BmsSupplier::getId) + .distinct().collect(Collectors.toList()); + query.setSupplierIds(supplierIds); + + List supplierCodes = supplierList.stream() + .map(BmsSupplier::getCode) + .distinct().collect(Collectors.toList()); + query.setSupplierCodes(supplierCodes); + }else if(query.getLoadType()==2){ + BmsRegion2 targetRegion = bmsRegion2Service.getById(query.getTargetId()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplier::getBookCode,"001"); + if(targetRegion.getLevel()==1){ + lqw.eq(BmsSupplier::getRegion2First,query.getTargetId()); + }else if(targetRegion.getLevel()==2){ + lqw.eq(BmsSupplier::getRegion2Second,query.getTargetId()); + }else if(targetRegion.getLevel()==3){ + lqw.eq(BmsSupplier::getRegion2Third,query.getTargetId()); + }else{ + Assert.throwEx("行政区域查询失败!"); + } + List supplierList = bmsSupplierService.list(lqw); + List supplierIds = supplierList.stream() + .map(BmsSupplier::getId) + .distinct().collect(Collectors.toList()); + query.setSupplierIds(supplierIds); + List supplierCodes = supplierList.stream() + .map(BmsSupplier::getCode) + .distinct().collect(Collectors.toList()); + query.setSupplierCodes(supplierCodes); + }else if(query.getLoadType()==3){ + BmsRegion targetRegion = bmsRegionService.getById(query.getTargetId()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplier::getBookCode,"001"); + + if(targetRegion.getLevel()==1){ + lqw.eq(BmsSupplier::getRegionFirst,query.getTargetId()); + }else if(targetRegion.getLevel()==2){ + lqw.eq(BmsSupplier::getRegionSecond,query.getTargetId()); + }else if(targetRegion.getLevel()==3){ + lqw.eq(BmsSupplier::getRegionThird,query.getTargetId()); + }else{ + Assert.throwEx("销售区域查询失败!"); + } + List supplierList = bmsSupplierService.list(lqw); + List supplierIds = supplierList.stream() + .map(BmsSupplier::getId) + .distinct().collect(Collectors.toList()); + query.setSupplierIds(supplierIds); + List supplierCodes = supplierList.stream() + .map(BmsSupplier::getCode) + .distinct().collect(Collectors.toList()); + query.setSupplierCodes(supplierCodes); + } + } + + @Override + public List listBaseVo(BirBudgetTargetSo query) { + List returnList = new ArrayList<>(); + LocalDateTime endMonth = query.getYearMonthEnd(); + LocalDateTime startMonth = query.getYearMonthStart(); + query.setYearMonthStartQuery(startMonth.getYear()*100 + startMonth.getMonthValue()); + query.setYearMonthEndQuery(endMonth.getYear()*100 + endMonth.getMonthValue()); + query.setSelectCenterFlag(0); + if(CollUtil.isNotEmpty(query.getCenterList()) || CollectionUtil.isNotEmpty(query.getCenterType())){ + query.setSelectCenterFlag(1); + } + initQuery(query); + + List birActivityCenterGoodsList = new ArrayList<>(); + List birBaseDispatchVoList = new ArrayList<>(); + if(query.getSupplierIds().size()>2000 || query.getSupplierCodes().size()>2000){ + List supplierIds = query.getSupplierIds(); + List supplierCodes = query.getSupplierCodes(); + + List> supplierIdList = CollectionUtil.createList(supplierIds,2000); + List> supplierCodeList = CollectionUtil.createList(supplierCodes,2000); + + for(int i=0;i tempIds = supplierIdList.get(i); + tempIds.add("-99"); + query.setSupplierIds(tempIds); + List tempCodes = supplierCodeList.get(i); + tempCodes.add("-99"); + query.setSupplierCodes(tempCodes); + + List tempActivityCenterGoodsList = birActivityCenterGoodsMapper.list4BirBudgetTarget(query); + List tempBaseDispatchVoList = birActivityCenterGoodsMapper.list4DispatchSqlserver(query); + birActivityCenterGoodsList.addAll(tempActivityCenterGoodsList); + birBaseDispatchVoList.addAll(tempBaseDispatchVoList); + } + + }else{ + //防止传入空数组,导致SQL查出所有客户 + List supplierIds = query.getSupplierIds(); + supplierIds.add("-99"); + query.setSupplierIds(supplierIds); + List supplierCodes = query.getSupplierCodes(); + supplierCodes.add("-99"); + query.setSupplierCodes(supplierCodes); + + birActivityCenterGoodsList = birActivityCenterGoodsMapper.list4BirBudgetTarget(query); + birBaseDispatchVoList = birActivityCenterGoodsMapper.list4DispatchSqlserver(query); + } + + 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; + } + returnList.add(initBaseVo(birActivityCenterGoodsList,birBaseDispatchVoList, m, y)); + } + } + + return returnList; + } + + private BirBaseReportVo initBaseVo(List birActivityCenterGoodsList, + List birBaseDispatchVoList, int month, int year){ + BirBaseReportVo vo = new BirBaseReportVo(); + vo.setYearMonthNum(year*100 + month); + vo.setDispatchAmt(BigDecimal.ZERO); + vo.setTotalRealAmt(BigDecimal.ZERO); + vo.setTotalRealRate(BigDecimal.ZERO); + vo.setYear(year+""); + vo.setMonth(month+""); + + if(birActivityCenterGoodsList.size()>0){ + BigDecimal totalRealAmt = birActivityCenterGoodsList.stream().filter(a->a.getKeyNum().equals(vo.getYearMonthNum())) + .map(a->a.getSplitUsedAmount()==null?BigDecimal.ZERO:a.getSplitUsedAmount()) + .reduce(BigDecimal.ZERO, BigDecimal::add); + vo.setTotalRealAmt(totalRealAmt); + } + if(birBaseDispatchVoList.size()>0){ + BigDecimal dispatchAmt = birBaseDispatchVoList.stream().filter(a->a.getYearMonthNum().equals(vo.getYearMonthNum())) + .map(a->a.getDispatchAmt()==null?BigDecimal.ZERO:a.getDispatchAmt()) + .reduce(BigDecimal.ZERO, BigDecimal::add); + vo.setDispatchAmt(dispatchAmt); + } + + if(vo.getDispatchAmt().compareTo(BigDecimal.ZERO)!=0){ + vo.setTotalRealRate(vo.getTotalRealAmt().divide(vo.getDispatchAmt(), 4, RoundingMode.DOWN)); + } + + return vo; + } + +// @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.setYearStart(startMonth.getYear()); +// query.setYearEnd(endMonth.getYear()); +// query.setMonthStart(startMonth.getMonthValue()); +// query.setMonthEnd(endMonth.getMonthValue()); +// +// +// query.setSelectCenterFlag(0); +// if(CollUtil.isNotEmpty(query.getCenterList())){ +// query.setSelectCenterFlag(1); +// } +// +// BmsSupplier supplier = bmsSupplierService.getById(query.getSupplierId()); +// +// if(query.getLoadType()==1){ +// query.setBizRegionIds(Arrays.asList(supplier.getRegion2Second())); +// }else if(query.getLoadType()==2){ +// query.setSaleRegionIds(Arrays.asList(supplier.getRegionSecond())); +// }else if(query.getLoadType()==3){ +// query.setSaleRegionIds(Arrays.asList(supplier.getRegionFirst())); +// } +// +// List birBudgetTargets = baseMapper.selectBirBudgetTargetList(query); +// +// query.setLoadType(0); +// List birSupplierBudgetTargets = baseMapper.selectBirBudgetTargetList(query); +// +// Map> listMap = birBudgetTargets.stream() +// .collect(Collectors.groupingBy(obj->obj.getYearNum()+"_"+obj.getMonthNum())); +// Map> listSupplierMap = birSupplierBudgetTargets.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,listSupplierMap, m, y)); +// } +// } +// return budgetTargetVoList; +// } + + private BirBudgetTargetVo getBudgetTargetVo(Map> listMap,Map> listSupplierMap, int month, int year) { + List mList = listMap.get(year +"_"+ month); + List sList = listSupplierMap.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(mList!=null) { + Map> brandMap = mList.stream().collect(Collectors.groupingBy(obj -> obj.getBrandId())); + BigDecimal targetAmt = brandMap.values().stream().map(a -> a.get(0).getTargetAmt() == null ? BigDecimal.ZERO : a.get(0).getTargetAmt()).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal budgetAmt = brandMap.values().stream().map(a -> a.get(0).getBudgetAmt() == null ? BigDecimal.ZERO : a.get(0).getBudgetAmt()).reduce(BigDecimal.ZERO, BigDecimal::add); + + targetVo.setTargetAmt(targetAmt); + targetVo.setBudgetAmt(budgetAmt); + } + + if(sList!=null) { + BigDecimal cityRegionAmt = sList.stream().map(a -> a.getProvinceCityAmt() == null ? BigDecimal.ZERO : a.getProvinceCityAmt()).reduce(BigDecimal.ZERO, BigDecimal::add); + targetVo.setProvinceCityAmt(cityRegionAmt); + BigDecimal provinceCityRegionAmt = sList.stream().map(a -> a.getProvinceCityRegionAmt() == null ? BigDecimal.ZERO : a.getProvinceCityRegionAmt()).reduce(BigDecimal.ZERO, BigDecimal::add); + targetVo.setProvinceCityRegionAmt(provinceCityRegionAmt); + } + + if(CollUtil.isNotEmpty(mList)){ + for (BirBudgetTarget target : mList) { +// targetVo.setTargetAmt(targetVo.getTargetAmt().add(target.getTargetAmt())); +// targetVo.setBudgetAmt(targetVo.getBudgetAmt().add(target.getBudgetAmt())); +// if(target.getTargetAmt()!=null){ +// targetVo.setTargetAmt(target.getTargetAmt()); +// }else{ +// targetVo.setTargetAmt(BigDecimal.ZERO); +// } +// if(target.getBudgetAmt()!=null){ +// targetVo.setBudgetAmt(target.getBudgetAmt()); +// }else{ +// targetVo.setBudgetAmt(BigDecimal.ZERO); +// } + if(target.getDispatchAmt()!=null) { + targetVo.setDispatchAmt(targetVo.getDispatchAmt().add(target.getDispatchAmt())); + } + if(target.getTotalRealAmt()!=null) { + targetVo.setTotalRealAmt(targetVo.getTotalRealAmt().add(target.getTotalRealAmt())); + } + if(target.getLastYearDispatchAmt()!=null) { + targetVo.setLastYearDispatchAmt(targetVo.getLastYearDispatchAmt().add(target.getLastYearDispatchAmt())); + } + } + //预算费率 = 预算费用/销售目标 + if(targetVo.getTargetAmt()!=null && targetVo.getTargetAmt().compareTo(BigDecimal.ZERO)!=0) { + targetVo.setBudgetRate(targetVo.getBudgetAmt().divide(targetVo.getTargetAmt(), 2, RoundingMode.DOWN)); + //发货达成率 = 实际发货/销售目标 + targetVo.setDispatchRate(targetVo.getDispatchAmt().divide(targetVo.getTargetAmt(), 2, RoundingMode.DOWN)); + }else{ + targetVo.setBudgetRate(BigDecimal.ZERO); + targetVo.setDispatchRate(BigDecimal.ZERO); + } + //(当前发货-去年同期发货)/去年同期发货 + if(targetVo.getLastYearDispatchAmt()!=null && targetVo.getLastYearDispatchAmt().compareTo(BigDecimal.ZERO)!=0) { + targetVo.setLastYearGrowRate( + targetVo.getDispatchAmt() + .subtract(targetVo.getLastYearDispatchAmt()) + .divide(targetVo.getLastYearDispatchAmt(), 2, RoundingMode.DOWN) + ); + }else{ + targetVo.setLastYearGrowRate(BigDecimal.ZERO); + } + //实际费用率=实际费用/实际发货 + if(targetVo.getDispatchAmt()!=null && targetVo.getDispatchAmt().compareTo(BigDecimal.ZERO)!=0) { + targetVo.setProvinceCityRate(targetVo.getProvinceCityAmt().divide(targetVo.getDispatchAmt(), 2, RoundingMode.DOWN)); + targetVo.setProvinceCityRegionRate(targetVo.getProvinceCityRegionAmt().divide(targetVo.getDispatchAmt(), 2, RoundingMode.DOWN)); + targetVo.setTotalRealRate(targetVo.getTotalRealAmt().divide(targetVo.getDispatchAmt(), 2, RoundingMode.DOWN)); + }else{ + targetVo.setProvinceCityRate(BigDecimal.ZERO); + targetVo.setProvinceCityRegionRate(BigDecimal.ZERO); + targetVo.setTotalRealRate(BigDecimal.ZERO); + } + } + return targetVo; + } + + public List getCenterByTargetId(BirBudgetTargetSo query){ + boolean isRestBir = BirHttpUtil.isRestBir(); + if(isRestBir){ + R result = BirHttpUtil.get("/bir/roiRate/getCenterByTargetId",query); + if(result.getStatus() != 200 || result.getData() == null) { + Assert.throwEx(result.getMsg()); + } + return (List) result.getData(); + } + initQuery(query); + List centerGoodsList = new ArrayList<>(); + if(query.getSupplierIds().size()>2000 || query.getSupplierCodes().size()>2000) { + List supplierIds = query.getSupplierIds(); + List supplierCodes = query.getSupplierCodes(); + + List> supplierIdList = CollectionUtil.createList(supplierIds, 2000); + List> supplierCodeList = CollectionUtil.createList(supplierCodes, 2000); + + for(int i=0;i tempIds = supplierIdList.get(i); + tempIds.add("-99"); + query.setSupplierIds(tempIds); + List tempCenterGoodsList = birActivityCenterGoodsMapper.list4CenterSqlserver(query); + if(tempCenterGoodsList!=null && tempCenterGoodsList.size()>0) { + centerGoodsList.addAll(tempCenterGoodsList); + } + } + }else{ + //防止传入空数组,导致SQL查出所有客户 + List supplierIds = query.getSupplierIds(); + supplierIds.add("-99"); + query.setSupplierIds(supplierIds); + List tempCenterGoodsList = birActivityCenterGoodsMapper.list4CenterSqlserver(query); + if(tempCenterGoodsList!=null && tempCenterGoodsList.size()>0) { + centerGoodsList.addAll(tempCenterGoodsList); + } + } + + List centerIdList = centerGoodsList.stream().map(a->a.getCenterId()).collect(Collectors.toList()); + return centerIdList; + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirCenterRateServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirCenterRateServiceImpl.java new file mode 100644 index 0000000..9473cc0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirCenterRateServiceImpl.java @@ -0,0 +1,533 @@ +package com.qs.serve.modules.bir.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.common.model.enums.MonthValues; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.SpringUtils; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bir.entity.BirActivityCenterGoods; +import com.qs.serve.modules.bir.entity.BirRoiRate; +import com.qs.serve.modules.bir.entity.dto.BirRoiCostDTO; +import com.qs.serve.modules.bir.entity.so.BirCostRoiSo; +import com.qs.serve.modules.bir.entity.so.BirMonthCusCenterSo; +import com.qs.serve.modules.bir.entity.vo.BirActivityCenterGoodsMonthVo; +import com.qs.serve.modules.bir.entity.vo.BirCostApplyRateVo; +import com.qs.serve.modules.bir.entity.vo.BirRoiCostItemVo; +import com.qs.serve.modules.bir.entity.vo.YtdQtdToOAVo; +import com.qs.serve.modules.bir.mapper.BirActivityCenterGoodsMapper; +import com.qs.serve.modules.bir.mapper.BirRoiRateMapper; +import com.qs.serve.modules.bir.service.BirActivityCenterGoodsService; +import com.qs.serve.modules.bir.service.BirCenterRateService; +import com.qs.serve.modules.bir.service.BirRoiRateService; +import com.qs.serve.modules.bms.entity.BmsCenterRegion; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierTarget; +import com.qs.serve.modules.bms.mapper.BmsCenterRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierTargetMapper; +import com.qs.serve.modules.erp.entity.dto.ErpDispatchSumVo; +import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper; +import com.qs.serve.modules.goods.entity.dto.TbsCenterDto; +import com.qs.serve.modules.tbs.common.util.QuarterUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.dto.CusTargetRateDTO; +import com.qs.serve.modules.tbs.entity.dto.TbsCostSubItem; +import com.qs.serve.modules.tbs.mapper.*; +import com.qs.serve.modules.tzc.entity.TzcPolicy; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; +import com.qs.serve.modules.tzc.mapper.TzcPolicyItemMapper; +import com.qs.serve.modules.tzc.mapper.TzcPolicyMapper; +import com.qs.serve.modules.tzc.service.TzcPolicyService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.Month; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * @author YenHex + * @since 2023-06-05 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BirCenterRateServiceImpl implements BirCenterRateService { + + private TbsScheduleItemBudgetMapper tbsScheduleItemBudgetMapper; + private TbsBudgetMapper tbsBudgetMapper; + private BirRoiRateService birRoiRateService; + private final ErpDispatchDataMapper dispatchDataMapper; + private BirActivityCenterGoodsMapper birActivityCenterGoodsMapper; + private TbsActivityCenterMapper tbsActivityCenterMapper; + private TzcPolicyItemMapper tzcPolicyItemMapper; + private TzcPolicyMapper tzcPolicyMapper; + private TbsBudgetLogMapper tbsBudgetLogMapper; + private BmsSupplierTargetMapper bmsSupplierTargetMapper; + private TbsScheduleItemMapper tbsScheduleItemMapper; + private TbsCostApplyMapper tbsCostApplyMapper; + private BmsSupplierMapper supplierMapper; + + @Override + public List findCostCenterDataByCostApplyId(Long costApplyId,Long policyId){ + List centerDataList = new ArrayList<>(); + if(costApplyId!=null) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivityCenter::getCostApplyId, costApplyId); + List tbsActivityCenters = tbsActivityCenterMapper.selectList(lqw); + if (tbsActivityCenters.size() == 0) { + return centerDataList; + } + TbsCostApply costApply = tbsCostApplyMapper.selectById(costApplyId); + Map> centerMapList = tbsActivityCenters.stream().collect(Collectors.groupingBy(a -> a.getCenterType() + "-" + a.getCenterId())); + List centerList = centerMapList.values().stream().map(a -> a.get(0)).collect(Collectors.toList()); + for(TbsActivityCenter center : centerList) { + TbsCostSubItem.CostCenterTranStr costCenter = this.buildCostCenter(center.getCenterType(), center.getCenterId(), center.getCenterName(),costApply.getSupplierCode()); + costCenter.setCenterId(center.getCenterId()); + costCenter.setCentertype(center.getCenterType()); + costCenter.setCenterCode(center.getCenterCode()); + centerDataList.add(costCenter); + } + } + if(policyId!=null) { + TzcPolicy policy = tzcPolicyMapper.selectById(policyId); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TzcPolicyItem::getPolicyId,policyId); + List policyItems = tzcPolicyItemMapper.selectList(lqw); + Map> centerMapList = policyItems.stream().collect(Collectors.groupingBy(a -> a.getCenterType() + "-" + a.getCenterId())); + List centerList = centerMapList.values().stream().map(a -> a.get(0)).collect(Collectors.toList()); + for(TzcPolicyItem center : centerList) { + TbsCostSubItem.CostCenterTranStr costCenter = this.buildCostCenter(center.getCenterType(), center.getCenterId(), center.getCenterName(),policy.getSupplierCode()); + costCenter.setCenterId(center.getCenterId()); + costCenter.setCentertype(center.getCenterType()); + costCenter.setCenterCode(center.getCenterCode()); + centerDataList.add(costCenter); + } + } + + return centerDataList; + } + + @Override + public List selectCostApplyRateVoList(Long costApplyId, Long policyId) { + List centerDtoList = null; + String supplierId = null; + if(costApplyId!=null){ + TbsCostApply costApply = tbsCostApplyMapper.selectById(costApplyId); + LambdaQueryWrapper acLqw = new LambdaQueryWrapper<>(); + acLqw.eq(TbsActivityCenter::getCostApplyId,costApplyId); + List activityCenterList = tbsActivityCenterMapper.selectList(acLqw); + supplierId = costApply.getSupplierId()+""; + centerDtoList = activityCenterList.stream().map(a->{ + TbsCenterDto centerDto = new TbsCenterDto(); + centerDto.setId(a.getCenterId()); + centerDto.setCenterCode(a.getCenterCode()); + centerDto.setCenterName(a.getCenterName()); + centerDto.setCenterType(a.getCenterType()); + return centerDto; + }).collect(Collectors.toList()); + }else { + //加载政策 + TzcPolicy policy = tzcPolicyMapper.selectById(policyId); + supplierId = policy.getSupplierId()+""; + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TzcPolicyItem::getPolicyId,policyId); + List policyItemList = tzcPolicyItemMapper.selectList(lqw); + centerDtoList = policyItemList.stream().map(a->{ + TbsCenterDto centerDto = new TbsCenterDto(); + centerDto.setId(a.getCenterId()); + centerDto.setCenterCode(a.getCenterCode()); + centerDto.setCenterName(a.getCenterName()); + centerDto.setCenterType(a.getCenterType()); + return centerDto; + }).collect(Collectors.toList()); + } + + LocalDate nowDate = LocalDate.now(); + int year = nowDate.getYear(); + int month = nowDate.getMonthValue(); + month = month>1?month:1; + //年 + int yearStartNum = year*100 + 1; + int yearEndNum = year*100 + month; + //当月 + int currMonthNum = yearEndNum; + //当季度 + List numbers = QuarterUtil.getQuarterNumbers(year,month); + int quarterStartNum = numbers.get(0); + int quarterEndNum = numbers.get(2); + + List resultList = new ArrayList<>(); + + List yearList = this.buildCostApplyRateList( + "year",yearStartNum, yearEndNum, + supplierId, centerDtoList); + + List seasonList = this.buildCostApplyRateList( + "quarter",quarterStartNum, quarterEndNum, + supplierId, centerDtoList); + + List monthList = this.buildCostApplyRateList( + "month",currMonthNum, currMonthNum, + supplierId, centerDtoList); + + + + resultList.addAll(yearList); + resultList.addAll(seasonList); + resultList.addAll(monthList); + return resultList; + } + + /** + * 获取费率详情 + * @param scheduleType 年季月,year,quarter,month + * @param startMonthNum 格式如 20231 + * @param endMonthNum 格式如 202312 + * @param supplierId + * @param centerDtoList + * @return + */ + private List buildCostApplyRateList(String scheduleType,int startMonthNum, int endMonthNum, String supplierId, + List centerDtoList) { + List costApplyRateVoList = new ArrayList<>(); + for (TbsCenterDto center : centerDtoList) { + BirCostApplyRateVo costApplyRateVo = new BirCostApplyRateVo(scheduleType,center); + //周期内使用金额合计,成本中心 + LambdaQueryWrapper birCenterLwq = new LambdaQueryWrapper<>(); + birCenterLwq.eq(BirActivityCenterGoods::getCenterId,center.getId()); + birCenterLwq.eq(BirActivityCenterGoods::getCenterType,center.getCenterType()); + birCenterLwq.ge(BirActivityCenterGoods::getKeyNum, startMonthNum); + birCenterLwq.le(BirActivityCenterGoods::getKeyNum, endMonthNum); + List birCenterCost = birActivityCenterGoodsMapper.selectList(birCenterLwq); + BigDecimal centerUsedCost = birCenterCost.stream().map(BirActivityCenterGoods::getSplitUsedAmount).reduce(BigDecimal.ZERO,BigDecimal::add); + //周期内使用金额合计,客户 + LambdaQueryWrapper birSupplierLwq = new LambdaQueryWrapper<>(); + birSupplierLwq.eq(BirActivityCenterGoods::getSupplierId, supplierId); + birSupplierLwq.ge(BirActivityCenterGoods::getKeyNum, startMonthNum); + birSupplierLwq.le(BirActivityCenterGoods::getKeyNum, endMonthNum); + List birSupplierCost = birActivityCenterGoodsMapper.selectList(birSupplierLwq); + BigDecimal supplierUsedCost = birSupplierCost.stream().map(BirActivityCenterGoods::getSplitUsedAmount).reduce(BigDecimal.ZERO,BigDecimal::add); + + //客户维度发货金额 + List dispatchSumSupplierVos = dispatchDataMapper.querySumCost(startMonthNum, endMonthNum,Arrays.asList(supplierId)); + BigDecimal dispatchSumSupplierAmt = dispatchSumSupplierVos.stream().map(ErpDispatchSumVo::getDispatchSumCost).reduce(BigDecimal.ZERO,BigDecimal::add); + + //成本中心维度发货金额 + List supplierCodeList = birRoiRateService.getSupplierCodesByCenter( + new BirRoiCostDTO(),center.getCenterType(), Arrays.asList(center.getId())); + List dispatchSumCenterVos = dispatchDataMapper.querySumCost(startMonthNum, endMonthNum,supplierCodeList); + BigDecimal dispatchSumCenterAmt = dispatchSumCenterVos.stream().map(ErpDispatchSumVo::getDispatchSumCost).reduce(BigDecimal.ZERO,BigDecimal::add); + + costApplyRateVo.setCusCostAmt(supplierUsedCost); + costApplyRateVo.setCusDisAmt(dispatchSumSupplierAmt); + costApplyRateVo.setCenterCostAmt(centerUsedCost); + costApplyRateVo.setCenterDisAmt(dispatchSumCenterAmt); + if(dispatchSumSupplierAmt.compareTo(BigDecimal.ZERO)!=0){ + costApplyRateVo.setCusRate(supplierUsedCost.divide(dispatchSumSupplierAmt,2,RoundingMode.DOWN)); + } + if(dispatchSumCenterAmt.compareTo(BigDecimal.ZERO)!=0){ + costApplyRateVo.setCenterRate(centerUsedCost.divide(dispatchSumCenterAmt,2,RoundingMode.DOWN)); + } + //所有的发货单统计 + BigDecimal dispatchSumAllsAmt = dispatchDataMapper.getSumCost(startMonthNum, endMonthNum); + costApplyRateVo.setAllDisAmt(dispatchSumAllsAmt); + //所有的费用使用金额 + BigDecimal allUsedCost = birActivityCenterGoodsMapper.totalAmt(startMonthNum,endMonthNum); + costApplyRateVo.setAllCostAmt(allUsedCost); + + if(dispatchSumAllsAmt!=null&&dispatchSumAllsAmt.compareTo(BigDecimal.ZERO)!=0){ + if(costApplyRateVo.getAllCostAmt()!=null){ + costApplyRateVo.setAllByRate(costApplyRateVo.getAllCostAmt().divide(costApplyRateVo.getAllDisAmt(),2,RoundingMode.DOWN)); + }else { + costApplyRateVo.setAllByRate(BigDecimal.ZERO); + } + } + + costApplyRateVoList.add(costApplyRateVo); + + } + return costApplyRateVoList; + } + + @Override + public TbsCostSubItem.CostCenterTranStr buildCostCenter(String centerType, String centerId, String centerName, String supplierCode) { + + int year = LocalDate.now().getYear(); + int month = LocalDate.now().getMonthValue(); + month = month>1?month:1; + int startMonthNum = year*100 + 1; + int endMonthNum = year*100 + month; + BirRoiCostDTO costDTO = new BirRoiCostDTO(); + costDTO.setStartMonthNum(startMonthNum); + costDTO.setEndMonthNum(endMonthNum); + + + String centerKey = centerType + "-" + centerId; + TbsCostSubItem.CostCenterTranStr costCenter = new TbsCostSubItem.CostCenterTranStr(centerName,centerType+"-"+centerId); + /* --------------- 全年目标费用率YTD 目标预计发货,目标预算 --------------------------- */ + //通过成本中心TYPE和ID取预算 + LambdaQueryWrapper budgetLambdaQueryWrapper = new LambdaQueryWrapper<>(); + budgetLambdaQueryWrapper.eq(TbsBudget::getCenterId,centerId); + budgetLambdaQueryWrapper.eq(TbsBudget::getCenterType,centerType); + List tbsBudgetList = tbsBudgetMapper.selectList(budgetLambdaQueryWrapper); + //通过预算ID取预算的发货和金额 + LambdaQueryWrapper scheduleItemBudgetLambdaQueryWrapper = new LambdaQueryWrapper<>(); + scheduleItemBudgetLambdaQueryWrapper.in(TbsScheduleItemBudget::getBudgetId,tbsBudgetList.stream().map(TbsBudget::getId).collect(Collectors.toList())); + List scheduleItemBudgetList = tbsScheduleItemBudgetMapper.selectList(scheduleItemBudgetLambdaQueryWrapper); + //合计目标发货和金定额 + BigDecimal targetDispatchAmout = scheduleItemBudgetList.stream().map(a->a.getPreDispatchAmount()==null?BigDecimal.ZERO:a.getPreDispatchAmount()).reduce(BigDecimal.ZERO,BigDecimal::add); + costCenter.setTargetSales(targetDispatchAmout.toString()); + + LambdaQueryWrapper tbsbudgetLogLambdaQueryWrapper = new LambdaQueryWrapper(); + tbsbudgetLogLambdaQueryWrapper.eq(TbsBudgetLog::getCenterId,centerId); + tbsbudgetLogLambdaQueryWrapper.eq(TbsBudgetLog::getCenterType,centerType); + tbsbudgetLogLambdaQueryWrapper.in(TbsBudgetLog::getOptType, BudgetLogOptFlag.getFinalBudgetOptFlag()); + List logList = tbsBudgetLogMapper.selectList(tbsbudgetLogLambdaQueryWrapper); + BigDecimal targetBudgetAmout = logList.stream().map(a->a.getAmount()).reduce(BigDecimal.ZERO,BigDecimal::add); + costCenter.setAreaBudget(targetBudgetAmout.toString()); + + BigDecimal targetExpenseRate = BigDecimal.ZERO; + if(targetDispatchAmout.compareTo(BigDecimal.ZERO)!=0) { + targetExpenseRate = targetBudgetAmout.divide(targetDispatchAmout, 2, BigDecimal.ROUND_HALF_DOWN); + costCenter.setTargetExpenseRate(targetExpenseRate.toString()); + costCenter.setYtdTargetExpenseRate(targetExpenseRate.toString()); + } +// costCenter.setTargetExpenseRate(targetExpenseRate); + costCenter.setYtdTargetBudget(targetBudgetAmout.toString()); + costCenter.setYtdTargetSales(targetDispatchAmout.toString()); +// costCenter.setYtdTargetExpenseRate(targetExpenseRate); + +// costCenter.setQtdTargetBudget(BigDecimal.ZERO); +// costCenter.setQtdTargetSales(BigDecimal.ZERO); +// costCenter.setQtdTargetExpenseRate(BigDecimal.ZERO); +// costCenter.setMtdTargetBudget(BigDecimal.ZERO); +// costCenter.setMtdTargetSales(BigDecimal.ZERO); +// costCenter.setMtdTargetExpenseRate(BigDecimal.ZERO); + /* ------------------------------------------------------------------------- */ + + //实际发贷数 + //supplierCodeList 指成本中心维度的客户,需要和参数supplierCode作区分 + List supplierCodeList = birRoiRateService.getSupplierCodesByCenter(costDTO,centerType, Arrays.asList(centerId)); + List dispatchSumVos = dispatchDataMapper.querySumCost(startMonthNum,endMonthNum,supplierCodeList); + + //获取BIR表的数据,用于计算实际费用率 + LambdaQueryWrapper birLwq = new LambdaQueryWrapper<>(); + birLwq.eq(BirActivityCenterGoods::getCenterId,centerId); + birLwq.eq(BirActivityCenterGoods::getCenterType,centerType); + birLwq.ge(BirActivityCenterGoods::getKeyNum,startMonthNum); + birLwq.le(BirActivityCenterGoods::getKeyNum,endMonthNum); + List birCenterCost = birActivityCenterGoodsMapper.selectList(birLwq); + + /* --------------- 实际费用率YTD --------------------------------------------- */ + BigDecimal ytdRealDipatch = dispatchSumVos.stream().map(a->a.getDispatchSumCost()).reduce(BigDecimal.ZERO,BigDecimal::add); + BigDecimal ytdRealCost = birCenterCost.stream().map(a->a.getSplitUsedAmount()).reduce(BigDecimal.ZERO,BigDecimal::add); + costCenter.setYtdRealCost(ytdRealCost.toString()); + costCenter.setYtdRealSales(ytdRealDipatch.toString()); + BigDecimal ytdRealExpenseRate = BigDecimal.ZERO; + if(ytdRealDipatch.compareTo(BigDecimal.ZERO)!=0) { + ytdRealExpenseRate = ytdRealCost.divide(ytdRealDipatch, 2, BigDecimal.ROUND_HALF_DOWN); + costCenter.setYtdRealExpenseRate(ytdRealExpenseRate.toString()); + } +// costCenter.setYtdRealExpenseRate(ytdRealExpenseRate); + /* ------------------------------------------------------------------------- */ + + /* --------------- 实际费用率QTD --------------------------------------------- */ + List yearQuarter = QuarterUtil.getQuarterNumbers(year, month); + BigDecimal qtdRealDipatch = dispatchSumVos.stream().filter(a->yearQuarter.contains(a.getYearMonth())).map(a->a.getDispatchSumCost()).reduce(BigDecimal.ZERO,BigDecimal::add); + BigDecimal qtdRealCost = birCenterCost.stream().filter(a->yearQuarter.contains(a.getKeyNum())).map(a->a.getSplitUsedAmount()).reduce(BigDecimal.ZERO,BigDecimal::add); + costCenter.setQtdRealCost(qtdRealCost.toString()); + costCenter.setQtdRealSales(qtdRealDipatch.toString()); + BigDecimal qtdRealExpenseRate = BigDecimal.ZERO; + if(qtdRealDipatch.compareTo(BigDecimal.ZERO)!=0) { + qtdRealExpenseRate = qtdRealCost.divide(qtdRealDipatch, 2, BigDecimal.ROUND_HALF_DOWN); + costCenter.setQtdRealExpenseRate(qtdRealExpenseRate.toString()); + } +// costCenter.setQtdRealExpenseRate(qtdRealExpenseRate); + /* ------------------------------------------------------------------------- */ + + /* --------------- 实际费用率MTD --------------------------------------------- */ + Integer yearMonth = year*100 + month; + BigDecimal mtdRealDipatch = dispatchSumVos.stream().filter(a->yearMonth.equals(a.getYearMonth())).map(a->a.getDispatchSumCost()).reduce(BigDecimal.ZERO,BigDecimal::add); + BigDecimal mtdRealCost = birCenterCost.stream().filter(a->yearMonth.equals(a.getKeyNum())).map(a->a.getSplitUsedAmount()).reduce(BigDecimal.ZERO,BigDecimal::add); + costCenter.setMtdRealCost(mtdRealCost.toString()); + costCenter.setMtdRealSales(mtdRealDipatch.toString()); + BigDecimal mtdRealExpenseRate = BigDecimal.ZERO; + if(mtdRealDipatch.compareTo(BigDecimal.ZERO)!=0) { + mtdRealExpenseRate = mtdRealCost.divide(mtdRealDipatch, 2, BigDecimal.ROUND_HALF_DOWN); + costCenter.setMtdRealExpenseRate(mtdRealExpenseRate.toString()); + } + //创建客户的费率 + if(StringUtils.hasText(supplierCode)){ + try { + this.buildCustomerCenterTargetData(centerType, centerId, costCenter, supplierCode); + } catch (Exception e) { + log.error("[{}]创建客户成本中心的费率出现异常:{}",supplierCode,e.getMessage()); + } + } + + costCenter.setCenterCode(centerKey); + costCenter.setCentertype(centerType); + costCenter.setCenterId(centerId); + + return costCenter; + } + + @Override + public TbsCostSubItem.CostCenterTranStr buildCostCenter(String centerType, String centerId, String centerName){ + return this.buildCostCenter(centerType, centerId, centerName,null); + } + + /** + * 创建客户成本中心维度的目标数据 + * @param centerType + * @param centerId + * @param costCenter + * @param supplierCode + */ + private void buildCustomerCenterTargetData(String centerType, String centerId, TbsCostSubItem.CostCenterTranStr costCenter,String supplierCode) { + LocalDate nowTime = LocalDate.now(); + int curYear = nowTime.getYear(); + int curMonth = nowTime.getMonthValue(); + String curMonthString = curMonth>9?curMonth+"":"0"+curMonth; + int startMonth = Integer.parseInt(curYear+"01"); + int endMonth = Integer.parseInt(curYear+curMonthString); + int[] currQ = MonthValues.getQArr(curMonth); + + //更变客户维度为总公司维度 + List supplierCode4Group = new ArrayList<>(); + supplierCode4Group.add(supplierCode); + LambdaQueryWrapper supplierLqw = new LambdaQueryWrapper<>(); + supplierLqw.eq(BmsSupplier::getCode,supplierCode); + BmsSupplier supplier = supplierMapper.selectOne(supplierLqw); + if(supplier.getComRegionCode()!=null){ + LambdaQueryWrapper supplierLqw4Group = new LambdaQueryWrapper<>(); + supplierLqw4Group.eq(BmsSupplier::getComRegionCode,supplier.getComRegionCode()); + List supplierList = supplierMapper.selectList(supplierLqw4Group); + for (BmsSupplier bmsSupplier : supplierList) { + supplierCode4Group.add(bmsSupplier.getCode()); + } + } + + BirMonthCusCenterSo queryCusCenterRate = new BirMonthCusCenterSo(); + queryCusCenterRate.setSupplierCodeList(supplierCode4Group); + queryCusCenterRate.setCenterType(centerType); + queryCusCenterRate.setCenterId(centerId); + queryCusCenterRate.setStartYearMonth(startMonth); + queryCusCenterRate.setEndYearMonth(endMonth); + //年目标费率 + CusTargetRateDTO targetRateDTO = this.buildCusCenterTargetData(supplierCode4Group); + List centerGoodsMonthVoList = birActivityCenterGoodsMapper.listMonthCusCenterVo(queryCusCenterRate); + BigDecimal totalCostQty = BigDecimal.ZERO; + BigDecimal totalDispatchQty = BigDecimal.ZERO; + + List dispatchSumVos = dispatchDataMapper.querySumCost(startMonth,endMonth,supplierCode4Group); + for (int monthNumber : currQ) { + String tmp = monthNumber>9?monthNumber+"":"0"+monthNumber; + int currYearMonth = Integer.parseInt(curYear+tmp); + //计算发货金额 + for (ErpDispatchSumVo dispatchSumVo : dispatchSumVos) { + if(dispatchSumVo.getYearMonth()==currYearMonth){ + totalDispatchQty = totalDispatchQty.add(dispatchSumVo.getDispatchSumCost()); + } + } + //计算费用金额 + for (BirActivityCenterGoodsMonthVo goodsMonthVo : centerGoodsMonthVoList) { + if(goodsMonthVo.getKeyNum()==currYearMonth){ + totalCostQty = totalCostQty.add(goodsMonthVo.getTotalCostAmt()); + } + } + } + //计算年 + BigDecimal totalCostYear = BigDecimal.ZERO; + BigDecimal totalDispatchYear = BigDecimal.ZERO; + for (BirActivityCenterGoodsMonthVo monthVo : centerGoodsMonthVoList) { + totalCostYear = totalCostYear.add(monthVo.getTotalCostAmt()); + } + for (ErpDispatchSumVo dispatchSumVo : dispatchSumVos) { + totalDispatchYear = totalDispatchYear.add(dispatchSumVo.getDispatchSumCost()); + } + //计算客户维度费率 + costCenter.setQtdCusCenterCost(totalCostQty.toString()); + costCenter.setQtdCusCenterSend(totalDispatchQty.toString()); + String qtyCusCenterRateString = null; + if(totalDispatchQty.compareTo(BigDecimal.ZERO) != 0){ + qtyCusCenterRateString = totalCostQty.divide(totalDispatchQty,4,RoundingMode.DOWN).toString(); + } + costCenter.setQtdCusCenterExpenseRate(qtyCusCenterRateString); + costCenter.setQtdCusCenterTargetExpenseRate(targetRateDTO.getCusTargetRateQty()); + costCenter.setYtdCusCenterCost(totalCostYear.toString()); + costCenter.setYtdCusCenterSend(totalDispatchYear.toString()); + String ytdCusCenterRateString = null; + if(totalDispatchYear.compareTo(BigDecimal.ZERO) != 0){ + ytdCusCenterRateString = totalCostYear.divide(totalDispatchYear,4,RoundingMode.DOWN).toString(); + } + costCenter.setYtdCusCenterExpenseRate(ytdCusCenterRateString); + costCenter.setYtdCusCenterTargetExpenseRate(targetRateDTO.getCusTargetRate()); + } + + /** + * 计算客户目标费率 + * @param supplierCodes + * @return + */ + public CusTargetRateDTO buildCusCenterTargetData(List supplierCodes){ + String cusTargetRateQty=null; + String cusTargetRate=null; + LocalDate nowTime = LocalDate.now(); + int curYear = nowTime.getYear(); + int curMonth = nowTime.getMonthValue(); + int[] currQ = MonthValues.getQArr(curMonth); + List supplierTargetList = bmsSupplierTargetMapper.selectList( + new LambdaQueryWrapper() + .in(BmsSupplierTarget::getSupplierCode, supplierCodes) + ); + List scheduleItemIds = supplierTargetList.stream().map(BmsSupplierTarget::getScheduleItemId).collect(Collectors.toList()); + List scheduleIds = supplierTargetList.stream().map(BmsSupplierTarget::getScheduleId).collect(Collectors.toList()); + Map scheduleItems = new HashMap<>(); + if(scheduleItemIds.size()>0&&scheduleIds.size()>0){ + LambdaQueryWrapper scheduleItemsLqw = new LambdaQueryWrapper<>(); + scheduleItemsLqw.in(TbsScheduleItem::getId,scheduleItemIds); + scheduleItemsLqw.in(TbsScheduleItem::getScheduleId,scheduleIds); + List scheduleItemList = tbsScheduleItemMapper.selectList(scheduleItemsLqw); + for (TbsScheduleItem scheduleItem : scheduleItemList) { + scheduleItems.put(scheduleItem.getId(),scheduleItem); + } + } + BigDecimal cusDispatchTarget = BigDecimal.ZERO; + BigDecimal cusCostTarget = BigDecimal.ZERO; + //季度 + BigDecimal cusDispatchTargetQty = BigDecimal.ZERO; + BigDecimal cusCostTargetQty = BigDecimal.ZERO; + for (BmsSupplierTarget supplierTarget : supplierTargetList) { + cusDispatchTarget = cusDispatchTarget.add(supplierTarget.getTargetDispatchAmount()); + cusCostTarget = cusCostTarget.add(supplierTarget.getTargetCostAmount()); + TbsScheduleItem itm = scheduleItems.get(supplierTarget.getScheduleItemId()); + int itmYear =itm.getStartDate().getYear(); + if(itmYear==curYear){ + int itmMonth =itm.getStartDate().getMonthValue(); + if(Arrays.stream(currQ).anyMatch(i->itmMonth==i)){ + cusDispatchTargetQty = cusDispatchTargetQty.add(supplierTarget.getTargetDispatchAmount()); + cusCostTargetQty = cusCostTargetQty.add(supplierTarget.getTargetCostAmount()); + } + } + } + if(cusCostTarget.compareTo(BigDecimal.ZERO)!=0&&cusDispatchTarget.compareTo(BigDecimal.ZERO)!=0){ + cusTargetRate = cusCostTarget.divide(cusDispatchTarget,4,RoundingMode.DOWN).toString(); + } + if(cusCostTargetQty.compareTo(BigDecimal.ZERO)!=0&&cusDispatchTargetQty.compareTo(BigDecimal.ZERO)!=0){ + cusTargetRateQty = cusCostTargetQty.divide(cusDispatchTargetQty,4,RoundingMode.DOWN).toString(); + } + return new CusTargetRateDTO(cusTargetRateQty,cusTargetRate); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirCityTargetViewServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirCityTargetViewServiceImpl.java new file mode 100644 index 0000000..b9ce3fd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirCityTargetViewServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.bir.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bir.entity.BirCityTargetView; +import com.qs.serve.modules.bir.service.BirCityTargetViewService; +import com.qs.serve.modules.bir.mapper.BirCityTargetViewMapper; + +/** + * 服务实现类 + * @author YenHex + * @since 2024-06-14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BirCityTargetViewServiceImpl extends ServiceImpl implements BirCityTargetViewService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirRemoveIdServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirRemoveIdServiceImpl.java new file mode 100644 index 0000000..e683bde --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirRemoveIdServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.bir.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.bir.entity.BirRemoveId; +import com.qs.serve.modules.bir.mapper.BirRemoveIdMapper; +import com.qs.serve.modules.bir.service.BirRemoveIdService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @author YenHex + * @since 2024/1/29 + */ + +@Slf4j +@Service +@AllArgsConstructor +public class BirRemoveIdServiceImpl extends ServiceImpl implements BirRemoveIdService { + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirReportAccountBookServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirReportAccountBookServiceImpl.java new file mode 100644 index 0000000..141cdf5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirReportAccountBookServiceImpl.java @@ -0,0 +1,271 @@ +package com.qs.serve.modules.bir.service.impl; + +import cn.hutool.core.util.ArrayUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.HeaderOption; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.modules.bir.entity.BirRoiRate; +import com.qs.serve.modules.bir.entity.dto.BirRoiCostDTO; +import com.qs.serve.modules.bir.entity.so.BirCostRoiSo; +import com.qs.serve.modules.bir.entity.vo.*; +import com.qs.serve.modules.bir.mapper.BirReportAccountBookMapper; +import com.qs.serve.modules.bir.mapper.BirRoiRateMapper; +import com.qs.serve.modules.bir.service.BirReportAccountBookService; +import com.qs.serve.modules.bir.service.BirRoiRateService; +import com.qs.serve.modules.bms.entity.BmsCostCenter; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.vo.BmsRegionTreeVo; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsCostCenterService; +import com.qs.serve.modules.bms.service.BmsRegion2Service; +import com.qs.serve.modules.bms.service.BmsRegionService; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.erp.entity.dto.ErpDispatchSumVo; +import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper; +import com.qs.serve.modules.goods.entity.dto.TbsCenterDto; +import com.qs.serve.modules.tbs.common.TbsCenterType; +import com.qs.serve.modules.tbs.entity.TbsBudgetPlan; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.entity.TbsScheduleItem; +import com.qs.serve.modules.tbs.mapper.TbsBudgetLogMapper; +import com.qs.serve.modules.tbs.mapper.TbsScheduleItemMapper; +import com.qs.serve.modules.tbs.service.TbsBudgetLogService; +import com.qs.serve.modules.tbs.service.TbsBudgetPlanService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.Month; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * @author YenHex + * @since 2023-06-05 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BirReportAccountBookServiceImpl implements BirReportAccountBookService { + + private final BirReportAccountBookMapper birReportAccountBookMapper; + private final BmsRegionService bmsRegionService; + private final BmsRegion2Service bmsRegion2Service; + private final BmsSupplierService bmsSupplierService; + private final BmsCostCenterService bmsCostCenterService; + private final TbsBudgetPlanService tbsBudgetPlanService; + private final TbsBudgetLogMapper tbsBudgetLogMapper; + private final TbsScheduleItemMapper tbsScheduleItemMapper; + private final ErpDispatchDataMapper erpDispatchDataMapper; + + @Override + public BirAccountReportVo getReportAccountBookData(String type,String year){ + + BirAccountReportVo vo = new BirAccountReportVo(); + + vo.setType(type); + + List headerList = tbsScheduleItemMapper.getItemNames(year); + + List> itemDataList = buildCostData(type,year,headerList); + + if(itemDataList.size()>0) { + List forSumItemData = itemDataList.stream().flatMap(List::stream).collect(Collectors.toList()); + BirCenterCostRateMain allMainItem = buildSumData(forSumItemData); + allMainItem.getCenter2().setCenterName("合计"); + + if (type.equals(TbsCenterType.saleRegion.name()) || type.equals(TbsCenterType.bizRegion.name())) { + itemDataList.forEach(item -> { + BirCenterCostRateMain mainItem = buildSumData(item); + item.add(mainItem); + }); + } + + itemDataList.add(Arrays.asList(allMainItem)); + } + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsBudgetPlan::getBudgetYear,year); + TbsBudgetPlan tbsBudgetPlan = tbsBudgetPlanService.getOne(lqw); + + BudgetPlanVo budgetPlanVo = new BudgetPlanVo(); + CopierUtil.copy(tbsBudgetPlan,budgetPlanVo); + + + BigDecimal plannedAmount = tbsBudgetLogMapper.countPlannedBudgetAmount(year); + budgetPlanVo.setPlannedAmount(plannedAmount); + + BigDecimal usedAmount = tbsBudgetLogMapper.countUsedBudgetAmount(year); + budgetPlanVo.setUsedAmout(usedAmount); + + BigDecimal realSaleAmount = erpDispatchDataMapper.querySumCostAmt(Integer.parseInt(year+"01"),Integer.parseInt(year+"12"),null); + budgetPlanVo.setRealSaleAmount(realSaleAmount); + + vo.setHeaderList(headerList); + vo.setItemList(itemDataList); + vo.setBudgetPlanVo(budgetPlanVo); + return vo; + } + + private BirCenterCostRateMain buildSumData(List item){ + BirCenterCostRateMain mainItem = new BirCenterCostRateMain(); + + //年度合计 + List yearInfos = item.stream().map(a->a.getYearInfo()).collect(Collectors.toList()); + BirCenterCostRateItem sumYearInfo = new BirCenterCostRateItem(yearInfos); + mainItem.setYearInfo(sumYearInfo); + + List sumSeasonInfoList = new ArrayList<>(); + //周期合计 + for(int i=0;i seasonInfos = item.stream().map(a->a.getSeasonList().get(finalI)).collect(Collectors.toList()); + BirCenterCostRateItem seasonInfo = new BirCenterCostRateItem(seasonInfos); + sumSeasonInfoList.add(seasonInfo); + } + + mainItem.setSeasonList(sumSeasonInfoList); + + //成本中心设置 + TbsCenterDto sumCenterDto = CopierUtil.copy(item.get(0).getCenter2(),new TbsCenterDto()); + sumCenterDto.setCenterName("合计"+sumCenterDto.getCenterName()); + + mainItem.setCenter2(sumCenterDto); + + return mainItem; + } + + private List> buildCostData(String type,String year,List headerList){ + List> itemDataList = new ArrayList<>(); + if(headerList.size()>0) { + + if (type.equals(TbsCenterType.saleRegion.name())) { + List bmsRegionList = bmsRegionService.list(); + Map bmsRegionMap = bmsRegionList.stream().collect(Collectors.toMap(BmsRegion::getId, Function.identity())); + + List> itemList = birReportAccountBookMapper.reportAccountBookRegion(year); + + Map> mainList = itemList.stream().map(i -> { + BirCenterCostRateMain main = new BirCenterCostRateMain(); + + BmsRegion center2 = bmsRegionMap.get(i.get("center_id")); + if (center2 == null) { + return main; + } else { + main.setCenter2(new TbsCenterDto(center2)); + } + + BmsRegion center1 = bmsRegionMap.get(center2.getPid()); + if (center1 == null) { + main.setCenter1(new TbsCenterDto(center2)); + } else { + main.setCenter1(new TbsCenterDto(center1)); + } + + List seasonList = headerList.stream().map(a -> new BirCenterCostRateItem(i, "【" + a + "】")).collect(Collectors.toList()); + main.setSeasonList(seasonList); + main.setYearInfo(new BirCenterCostRateItem(i, "【全年】")); + + return main; + }).filter(a -> a.getCenter2() != null).collect(Collectors.groupingBy(a -> a.getCenter1().getId())); + + itemDataList.addAll(mainList.values()); + } else if (type.equals(TbsCenterType.bizRegion.name())) { + List bmsRegionList = bmsRegion2Service.list(); + Map bmsRegionMap = bmsRegionList.stream().collect(Collectors.toMap(BmsRegion2::getId, Function.identity())); + + List> itemList = birReportAccountBookMapper.reportAccountBookBizRegion(year); + + Map> mainList = itemList.stream().map(i -> { + BirCenterCostRateMain main = new BirCenterCostRateMain(); + + BmsRegion2 center2 = bmsRegionMap.get(i.get("center_id")); + if (center2 == null) { + return main; + } else { + main.setCenter2(new TbsCenterDto(center2)); + main.setCenter1(new TbsCenterDto(center2)); + } + + + List seasonList = headerList.stream().map(a -> new BirCenterCostRateItem(i, "【" + a + "】")).collect(Collectors.toList()); + main.setSeasonList(seasonList); + main.setYearInfo(new BirCenterCostRateItem(i, "【全年】")); + + return main; + }).filter(a -> a.getCenter2() != null).collect(Collectors.groupingBy(a -> a.getCenter1().getId())); + + itemDataList.addAll(mainList.values()); + } else if (type.equals(TbsCenterType.customer.name())) { + + List> itemList = birReportAccountBookMapper.reportAccountBookCustomer(year); + List supperIds = itemList.stream().map(i -> i.get("center_id").toString()).collect(Collectors.toList()); + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(BmsSupplier::getId, supperIds); + List supplierList = bmsSupplierService.list(lqw); + Map supplierMap = supplierList.stream().collect(Collectors.toMap(BmsSupplier::getId, Function.identity())); + + + List mainList = itemList.stream().map(i -> { + BirCenterCostRateMain main = new BirCenterCostRateMain(); + + BmsSupplier supplier = supplierMap.get(i.get("center_id")); + if (supplier == null) { + return main; + } else { + main.setCenter2(new TbsCenterDto(supplier)); + main.setCenter1(new TbsCenterDto(supplier)); + } + + List seasonList = headerList.stream().map(a -> new BirCenterCostRateItem(i, "【" + a + "】")).collect(Collectors.toList()); + main.setSeasonList(seasonList); + main.setYearInfo(new BirCenterCostRateItem(i, "【全年】")); + + return main; + }).filter(a -> a.getCenter2() != null).collect(Collectors.toList()); + itemDataList.add(mainList); + + } else if (type.equals(TbsCenterType.center.name())) { + List> itemList = birReportAccountBookMapper.reportAccountBookCenter(year); + List centerIds = itemList.stream().map(i -> i.get("center_id").toString()).collect(Collectors.toList()); + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(BmsCostCenter::getId, centerIds); + List bmsCostCenterList = bmsCostCenterService.list(lqw); + Map bmsCostCenterMap = bmsCostCenterList.stream().collect(Collectors.toMap(a -> a.getId().toString(), Function.identity())); + + List mainList = itemList.stream().map(i -> { + BirCenterCostRateMain main = new BirCenterCostRateMain(); + + BmsCostCenter costCenter = bmsCostCenterMap.get(i.get("center_id")); + if (costCenter == null) { + return main; + } else { + main.setCenter2(new TbsCenterDto(costCenter)); + main.setCenter1(new TbsCenterDto(costCenter)); + } + + List seasonList = headerList.stream().map(a -> new BirCenterCostRateItem(i, "【" + a + "】")).collect(Collectors.toList()); + main.setSeasonList(seasonList); + main.setYearInfo(new BirCenterCostRateItem(i, "【全年】")); + + return main; + }).filter(a -> a.getCenter2() != null).collect(Collectors.toList()); + itemDataList.add(mainList); + } + return itemDataList; + }else{ + return itemDataList; + } + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirRoiRateServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirRoiRateServiceImpl.java new file mode 100644 index 0000000..34f7b8d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirRoiRateServiceImpl.java @@ -0,0 +1,689 @@ +package com.qs.serve.modules.bir.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.modules.bir.entity.dto.BirRoiCostDTO; +import com.qs.serve.modules.bir.entity.so.BirCostRoiSo; +import com.qs.serve.modules.bir.entity.vo.BirRoiCostItemVo; +import com.qs.serve.modules.bir.entity.vo.YtdQtdToOAVo; +import com.qs.serve.modules.bms.entity.BmsCenterRegion; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.mapper.BmsCenterRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.erp.entity.dto.ErpDispatchSumVo; +import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bir.entity.BirRoiRate; +import com.qs.serve.modules.bir.service.BirRoiRateService; +import com.qs.serve.modules.bir.mapper.BirRoiRateMapper; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.Month; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * @author YenHex + * @since 2023-06-05 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BirRoiRateServiceImpl extends ServiceImpl implements BirRoiRateService { + + private final BmsSupplierMapper bmsSupplierMapper; + private final ErpDispatchDataMapper dispatchDataMapper; + private final BmsCenterRegionMapper bmsCenterRegionMapper; + + @Override + public List queryRoiCostItems(BirRoiCostDTO param) { + //实际金额 + List realDataList = baseMapper.queryRoiCostItems(param); + for (BirRoiCostItemVo itemVo : realDataList) { + itemVo.setCostRealAmt(itemVo.getCostAmt()); + itemVo.setCheckRealAmt(itemVo.getCheckAmt()); + //实际金额使用核销金额 + itemVo.setCostAmt(itemVo.getCheckAmt()); + if(itemVo.getPreAmt()==null){ + itemVo.setPreAmt(BigDecimal.ZERO); + } + } + //预估金额 + List forecastDataList = baseMapper.queryForecastRoiCostItems(param); + + //合并数据 + for (BirRoiCostItemVo data1 : realDataList) { + for (BirRoiCostItemVo data2 : forecastDataList) { + if(data1.getYearMonth().equals(data2.getYearMonth())){ + //预估金额使用申请金额 + data1.setCostAmt(data1.getCostAmt().add(data2.getCostAmt())); + //预估相加 + data1.setPreAmt(data1.getPreAmt().add(data2.getPreAmt())); + } + } + } + + //加入未为被命中的 + List allList = new ArrayList<>(); + allList.addAll(realDataList); + for (BirRoiCostItemVo data2 : forecastDataList) { + boolean exist = false; + for (BirRoiCostItemVo data1 : realDataList) { + if(data1.getYearMonth().equals(data2.getYearMonth())){ + exist = true; + break; + } + } + if(!exist){ + allList.add(data2); + } + } + return allList; + } + + @Override + public List getCostRoiOfYearMonth(BirCostRoiSo param) { + Integer loadType = param.getLoadType(); + String supplierId = param.getSupplierId(); + BmsSupplier supplier = bmsSupplierMapper.selectById(supplierId); + //最近12个月 + LocalDate currMonth = LocalDate.now(); + int currMonthNum = currMonth.getYear()*100 + currMonth.getMonthValue(); + LocalDate startMonth = currMonth.plusMonths(-12); + int startMonthNum = startMonth.getYear()*100 + startMonth.getMonthValue(); + BirRoiCostDTO costDTO = new BirRoiCostDTO(); + costDTO.setStartMonthNum(startMonthNum); + costDTO.setEndMonthNum(currMonthNum); + + //设置查询条件和返回客户CODELIST + List supplierCodeList = getBiRoiCostDTOAndFindSupplierCodes(costDTO,supplierId,loadType,param.getUserId()); + + List costItemVoList = this.queryRoiCostItems(costDTO); + + //整体费率,不添加过滤条件 + BirRoiCostDTO costDTO2 = new BirRoiCostDTO(); + costDTO2.setStartMonthNum(startMonthNum); + costDTO2.setEndMonthNum(currMonthNum); + List DataCountAllList = baseMapper.queryRoiCostItems(costDTO2); + for (BirRoiCostItemVo data1 : DataCountAllList) { + for (BirRoiCostItemVo data2 : costItemVoList) { + if(data1.getYearMonth().equals(data2.getYearMonth())){ + data2.setAllCostAmt(data1.getCostAmt()); + break; + } + } + } + + //构建大区费率 + this.buildRegionCostAndRate(supplier, currMonthNum, startMonthNum, supplierCodeList, costItemVoList); + + //客户发货单 + List dispatchSumVos = null; + if(supplierCodeList!=null&&supplierCodeList.size()>0){ + dispatchSumVos = dispatchDataMapper.querySumCost(startMonthNum,currMonthNum,supplierCodeList); + } + //整体发货单 + List allDispatch = dispatchDataMapper.querySumCost(startMonthNum,currMonthNum,null); + + for (BirRoiCostItemVo costItemVo : costItemVoList) { + costItemVo.setDispatchAmt(BigDecimal.ZERO); + costItemVo.setAllDispatchAmt(BigDecimal.ZERO); + //关联 整体发货单 + for (ErpDispatchSumVo dispatch : allDispatch) { + if(dispatch.getYearMonth().equals(costItemVo.getYearMonth())){ + // 发货金额=原发货金额) + costItemVo.setAllDispatchAmt(dispatch.getDispatchSumCost()); + //设置整体维度ROI + if (costItemVo.getAllCostAmt()!=null + &&costItemVo.getAllDispatchAmt()!=null + &&costItemVo.getAllDispatchAmt().compareTo(BigDecimal.ZERO)!=0){ + costItemVo.setAllRoiRate(costItemVo.getAllCostAmt().divide(costItemVo.getAllDispatchAmt(),2,RoundingMode.DOWN)); + } + break; + } + } + //关联 客户发货单 + if(dispatchSumVos!=null){ + for (ErpDispatchSumVo dispatchSumVo : dispatchSumVos) { + if(dispatchSumVo.getYearMonth().equals(costItemVo.getYearMonth())){ + // 发货金额=原发货金额) + costItemVo.setDispatchAmt(dispatchSumVo.getDispatchSumCost()); + break; + } + } + } + } + + + //补充数据0的项 + List costItemVos = new ArrayList<>(); + for (int i = startMonthNum; i <= currMonthNum; i++) { + int month = Integer.parseInt((""+i).substring(4)); + if(month>12){ + i = startMonth.getYear()*100 + 101; + month = 1; + } + boolean isEmpty = true; + for (BirRoiCostItemVo itemVo : costItemVoList) { + if(itemVo.getYearMonth().equals(i)){ + isEmpty = false; + } + } + if(isEmpty){ + BigDecimal dispatchAmt = BigDecimal.ZERO; + if(dispatchSumVos!=null){ + for (ErpDispatchSumVo dispatchSumVo : dispatchSumVos) { + if(dispatchSumVo.getYearMonth().equals(i)){ + dispatchAmt = dispatchSumVo.getDispatchSumCost(); + break; + } + } + } + BirRoiCostItemVo itemVo = new BirRoiCostItemVo(); + itemVo.setYearMonth(i); + itemVo.setYearMonthDate(LocalDate.of(i/100,month,1)); + itemVo.setCostAmt(BigDecimal.ZERO); + itemVo.setPreAmt(BigDecimal.ZERO); + itemVo.setCheckAmt(BigDecimal.ZERO); + itemVo.setCostRealAmt(BigDecimal.ZERO); + itemVo.setCheckRealAmt(BigDecimal.ZERO); + itemVo.setRegionTotalCostAmt(BigDecimal.ZERO); + itemVo.setRegionTotalDispatchAmt(BigDecimal.ZERO); + itemVo.setDispatchAmt(dispatchAmt); + costItemVos.add(itemVo); + } + } + costItemVoList.addAll(costItemVos); + Collections.sort(costItemVoList,(a,b)->b.getYearMonth()-a.getYearMonth()); + return costItemVoList; + } + + /** + * 构建大区费率 + * @param supplier + * @param currMonthNum + * @param startMonthNum + * @param supplierCodeList + * @param costItemVoList + */ + private void buildRegionCostAndRate(BmsSupplier supplier, int currMonthNum, int startMonthNum, List supplierCodeList, List costItemVoList) { + //加载公司内所有客户的编码 + LambdaQueryWrapper regionSupplierLqw = new LambdaQueryWrapper<>(); + regionSupplierLqw.eq(BmsSupplier::getRegionFirst, supplier.getRegionFirst()); + regionSupplierLqw.select(BmsSupplier::getId,BmsSupplier::getCode); + List regionSupplierList = bmsSupplierMapper.selectList(regionSupplierLqw); + List regionSupplierIds = regionSupplierList.stream().map(BmsSupplier::getId).distinct().collect(Collectors.toList()); + regionSupplierIds.add("-999"); + //加载公司内费用 + BirRoiCostDTO costDTO4Com = new BirRoiCostDTO(); + costDTO4Com.setStartMonthNum(startMonthNum); + costDTO4Com.setEndMonthNum(currMonthNum); + costDTO4Com.setSupplierIds(regionSupplierIds); + List costItemVoCom = this.queryRoiCostItems(costDTO4Com); + //合并项 + for (BirRoiCostItemVo itemVo : costItemVoList) { + itemVo.setRegionTotalCostAmt(BigDecimal.ZERO); + for (BirRoiCostItemVo costItemVo : costItemVoCom) { + if(itemVo.getYearMonth().equals(costItemVo.getYearMonth())){ + itemVo.setRegionTotalCostAmt(costItemVo.getCostRealAmt()); + break; + } + } + } + //加载公司发货单 + List dispatchSumComVos = null; + if(supplierCodeList !=null&& supplierCodeList.size()>0){ + dispatchSumComVos = dispatchDataMapper.querySumCost(startMonthNum, currMonthNum, supplierCodeList); + } + for (BirRoiCostItemVo costItemVo : costItemVoList) { + costItemVo.setRegionTotalDispatchAmt(BigDecimal.ZERO); + if(dispatchSumComVos!=null){ + for (ErpDispatchSumVo dispatchSumVo : dispatchSumComVos) { + if(dispatchSumVo.getYearMonth().equals(costItemVo.getYearMonth())){ + // 发货金额=原发货金额) + costItemVo.setRegionTotalDispatchAmt(dispatchSumVo.getDispatchSumCost()); + break; + } + } + } + } + } + + private boolean checkNotNullVale(String val){ + return val!=null&&!val.equals("0"); + } + + @Override + public Float getYtdPercent(List list){ + Float ytdPercent = null; + + LocalDate currMonth = LocalDate.now(); + if(currMonth.getMonthValue()==1){ + return ytdPercent; + } + + BigDecimal costAmt = BigDecimal.ZERO; + BigDecimal dispatchAmt = BigDecimal.ZERO; + + currMonth = currMonth.plusMonths(-1); + int currMonthNum = currMonth.getYear()*100 + currMonth.getMonthValue(); + int startMonthNum = currMonth.getYear()*100 + 1; + + for(BirRoiCostItemVo vo:list){ + if(vo.getYearMonth()<=currMonthNum && vo.getYearMonth()>=startMonthNum){ + costAmt = costAmt.add(vo.getCostAmt()); + dispatchAmt = dispatchAmt.add(vo.getDispatchAmt()); + } + } + + if(dispatchAmt.compareTo(BigDecimal.ZERO)>0) { + ytdPercent = costAmt.divide(dispatchAmt,4, RoundingMode.HALF_UP).floatValue(); + } + + return ytdPercent; + } + + @Override + public Float getYtdAllPercent(List list) { + Float ytdPercent = null; + + LocalDate currMonth = LocalDate.now(); + if(currMonth.getMonthValue()==1){ + return ytdPercent; + } + + BigDecimal costAmt = BigDecimal.ZERO; + BigDecimal dispatchAmt = BigDecimal.ZERO; + + currMonth = currMonth.plusMonths(-1); + int currMonthNum = currMonth.getYear()*100 + currMonth.getMonthValue(); + int startMonthNum = currMonth.getYear()*100 + 1; + + for(BirRoiCostItemVo vo:list){ + if(vo.getYearMonth()<=currMonthNum && vo.getYearMonth()>=startMonthNum){ + if(vo.getAllCostAmt()!=null){ + costAmt = costAmt.add(vo.getAllCostAmt()); + } + if(vo.getAllDispatchAmt()!=null){ + dispatchAmt = dispatchAmt.add(vo.getAllDispatchAmt()); + } + } + } + + if(dispatchAmt.compareTo(BigDecimal.ZERO)>0) { + ytdPercent = costAmt.divide(dispatchAmt,4, RoundingMode.HALF_UP).floatValue(); + } + + return ytdPercent; + } + + @Override + public Float getYtdRegionPercent(List list) { + Float ytdPercent = null; + + LocalDate currMonth = LocalDate.now(); + if(currMonth.getMonthValue()==1){ + return ytdPercent; + } + + BigDecimal costAmt = BigDecimal.ZERO; + BigDecimal dispatchAmt = BigDecimal.ZERO; + + currMonth = currMonth.plusMonths(-1); + int currMonthNum = currMonth.getYear()*100 + currMonth.getMonthValue(); + int startMonthNum = currMonth.getYear()*100 + 1; + + for(BirRoiCostItemVo vo:list){ + if(vo.getYearMonth()<=currMonthNum && vo.getYearMonth()>=startMonthNum){ + costAmt = costAmt.add(vo.getRegionTotalCostAmt()); + dispatchAmt = dispatchAmt.add(vo.getRegionTotalDispatchAmt()); + } + } + + if(dispatchAmt.compareTo(BigDecimal.ZERO)>0) { + ytdPercent = costAmt.divide(dispatchAmt,4, RoundingMode.HALF_UP).floatValue(); + } + + return ytdPercent; + } + + @Override + public Float getQtdPercent(List list){ + Float qtdPercent = null; + + LocalDate currMonth = LocalDate.now(); + if(currMonth.getMonthValue()==1){ + return 0F; + } + // 获取当前季度的第一个月 + Month firstMonthOfQuarter = currMonth.getMonth().firstMonthOfQuarter(); + // 获取当季第一个月的整数表示 + int firstMonthInteger = firstMonthOfQuarter.getValue(); + + if(firstMonthInteger == currMonth.getMonthValue()){ + return 0F; + } + + currMonth = currMonth.plusMonths(-1); + int currMonthNum = currMonth.getYear()*100 + currMonth.getMonthValue(); + int startMonthNum = currMonth.getYear()*100 + firstMonthInteger; + + BigDecimal costAmt = BigDecimal.ZERO; + BigDecimal dispatchAmt = BigDecimal.ZERO; + + for(BirRoiCostItemVo vo:list){ + if(vo.getYearMonth()<=currMonthNum && vo.getYearMonth()>=startMonthNum){ + costAmt = costAmt.add(vo.getCostAmt()); + dispatchAmt = dispatchAmt.add(vo.getDispatchAmt()); + } + } + + if(dispatchAmt.compareTo(BigDecimal.ZERO)>0) { + qtdPercent = costAmt.divide(dispatchAmt,4, RoundingMode.HALF_UP).floatValue(); + } + + return qtdPercent; + } + + @Override + public Float getQtdAllPercent(List list) { + Float qtdPercent = null; + + LocalDate currMonth = LocalDate.now(); + if(currMonth.getMonthValue()==1){ + return 0F; + } + // 获取当前季度的第一个月 + Month firstMonthOfQuarter = currMonth.getMonth().firstMonthOfQuarter(); + // 获取当季第一个月的整数表示 + int firstMonthInteger = firstMonthOfQuarter.getValue(); + + if(firstMonthInteger == currMonth.getMonthValue()){ + return 0F; + } + + currMonth = currMonth.plusMonths(-1); + int currMonthNum = currMonth.getYear()*100 + currMonth.getMonthValue(); + int startMonthNum = currMonth.getYear()*100 + firstMonthInteger; + + BigDecimal costAmt = BigDecimal.ZERO; + BigDecimal dispatchAmt = BigDecimal.ZERO; + + for(BirRoiCostItemVo vo:list){ + if(vo.getYearMonth()<=currMonthNum && vo.getYearMonth()>=startMonthNum){ + if(vo.getAllCostAmt()!=null){ + costAmt = costAmt.add(vo.getAllCostAmt()); + } + if(vo.getAllDispatchAmt()!=null){ + dispatchAmt = dispatchAmt.add(vo.getAllDispatchAmt()); + } + } + } + + if(dispatchAmt.compareTo(BigDecimal.ZERO)>0) { + qtdPercent = costAmt.divide(dispatchAmt,4, RoundingMode.HALF_UP).floatValue(); + } + + return qtdPercent; + } + + @Override + public Float getQtdRegionPercent(List list) { + Float qtdPercent = null; + + LocalDate currMonth = LocalDate.now(); + if(currMonth.getMonthValue()==1){ + return 0F; + } + // 获取当前季度的第一个月 + Month firstMonthOfQuarter = currMonth.getMonth().firstMonthOfQuarter(); + // 获取当季第一个月的整数表示 + int firstMonthInteger = firstMonthOfQuarter.getValue(); + + if(firstMonthInteger == currMonth.getMonthValue()){ + return 0F; + } + + currMonth = currMonth.plusMonths(-1); + int currMonthNum = currMonth.getYear()*100 + currMonth.getMonthValue(); + int startMonthNum = currMonth.getYear()*100 + firstMonthInteger; + + BigDecimal costAmt = BigDecimal.ZERO; + BigDecimal dispatchAmt = BigDecimal.ZERO; + + for(BirRoiCostItemVo vo:list){ + if(vo.getYearMonth()<=currMonthNum && vo.getYearMonth()>=startMonthNum){ + costAmt = costAmt.add(vo.getRegionTotalCostAmt()); + dispatchAmt = dispatchAmt.add(vo.getRegionTotalDispatchAmt()); + } + } + + if(dispatchAmt.compareTo(BigDecimal.ZERO)>0) { + qtdPercent = costAmt.divide(dispatchAmt,4, RoundingMode.HALF_UP).floatValue(); + } + + return qtdPercent; + } + + @Override + public YtdQtdToOAVo buildYtdAndQtdData(TbsCostApply apply){ + YtdQtdToOAVo vo = new YtdQtdToOAVo(); + getYtdData(vo,apply.getSupplierId().toString(), apply.getUserId()); + getQtdData(vo,apply.getSupplierId().toString(), apply.getUserId()); + return vo; + } + + private void getYtdData(YtdQtdToOAVo vo,String supplierId,String userId){ + LocalDate currMonth = LocalDate.now(); + if(currMonth.getMonthValue()==1){ + return ; + } + + currMonth = currMonth.plusMonths(-1); + int currMonthNum = currMonth.getYear()*100 + currMonth.getMonthValue(); + int startMonthNum = currMonth.getYear()*100 + 1; + + BirRoiCostDTO costDTO = new BirRoiCostDTO(); + costDTO.setStartMonthNum(startMonthNum); + costDTO.setEndMonthNum(currMonthNum); + + Float customerPercent = getPercenDateByLoadType(0,costDTO,supplierId,userId); + Float userPercent = getPercenDateByLoadType(1,costDTO,supplierId,userId);; + Float region2Percent = getPercenDateByLoadType(2,costDTO,supplierId,userId);; + Float regionPercent = getPercenDateByLoadType(3,costDTO,supplierId,userId);; + + vo.setYtdCustomerPercent(customerPercent); + vo.setYtdUserPercent(userPercent); + vo.setYtdRegion2Percent(region2Percent); + vo.setYtdRegionPercent(regionPercent); + } + + private void getQtdData(YtdQtdToOAVo vo,String supplierId,String userId){ + LocalDate currMonth = LocalDate.now(); + if(currMonth.getMonthValue()==1){ + return ; + } + + Month firstMonthOfQuarter = currMonth.getMonth().firstMonthOfQuarter(); + // 获取当季第一个月的整数表示 + int firstMonthInteger = firstMonthOfQuarter.getValue(); + + if(firstMonthInteger == currMonth.getMonthValue()){ + return ; + } + + currMonth = currMonth.plusMonths(-1); + int currMonthNum = currMonth.getYear()*100 + currMonth.getMonthValue(); + int startMonthNum = currMonth.getYear()*100 + firstMonthInteger; + + BirRoiCostDTO costDTO = new BirRoiCostDTO(); + costDTO.setStartMonthNum(startMonthNum); + costDTO.setEndMonthNum(currMonthNum); + + Float customerPercent = getPercenDateByLoadType(0,costDTO,supplierId,userId); + Float userPercent = getPercenDateByLoadType(1,costDTO,supplierId,userId);; + Float region2Percent = getPercenDateByLoadType(2,costDTO,supplierId,userId);; + Float regionPercent = getPercenDateByLoadType(3,costDTO,supplierId,userId);; + + vo.setQtdCustomerPercent(customerPercent); + vo.setQtdUserPercent(userPercent); + vo.setQtdRegion2Percent(region2Percent); + vo.setQtdRegionPercent(regionPercent); + } + + private Float getPercenDateByLoadType(Integer loadType,BirRoiCostDTO oriCostDTO,String supplierId,String userId){ + BirRoiCostDTO costDTO = CopierUtil.copy(oriCostDTO,new BirRoiCostDTO()); + List supplierCodeList = getBiRoiCostDTOAndFindSupplierCodes(costDTO, supplierId, loadType, userId); + if(supplierCodeList==null||supplierCodeList.size()==0){ + return 0F; + } + Float tempPercent = getPercentDate(costDTO,supplierCodeList); + return tempPercent; + } + + private Float getPercentDate(BirRoiCostDTO costDTO,List supplierCodeList){ + Float percent = null; + + Integer startMonthNum = costDTO.getStartMonthNum(); + Integer endMonthNum = costDTO.getEndMonthNum(); + BigDecimal dispatchSumAmt = dispatchDataMapper.querySumCostAmt(startMonthNum,endMonthNum,supplierCodeList); + + if(dispatchSumAmt == null || dispatchSumAmt.compareTo(BigDecimal.ZERO)<=0) { + //-1表无发货值 + return -1F; + //return percent; + } + + BigDecimal costSumAmt = baseMapper.querySumAmt(costDTO); + if(costSumAmt!=null) { + percent = costSumAmt.divide(dispatchSumAmt, 4, RoundingMode.HALF_UP).floatValue(); + } + return percent; + } + + @Override + public List getBiRoiCostDTOAndFindSupplierCodes(BirRoiCostDTO costDTO, String supplierId, Integer loadType, String userId){ + BmsSupplier bmsSupplier = bmsSupplierMapper.selectById(supplierId); + List supplierCodeList = new ArrayList<>(); + //有空指针 +// if(bmsSupplier==null){ +// supplierCodeList.add("-999"); +// return supplierCodeList; +// } + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(BmsSupplier::getId,BmsSupplier::getCode); + if(loadType.equals(0)){ + //0->客户 + supplierCodeList.add(bmsSupplier.getCode()); + costDTO.setSupplierId(supplierId); + }else if (loadType.equals(1)){ + //1->申请人的客户 + costDTO.setUserId(userId); + BmsSupplier param4Supplier = new BmsSupplier(); + param4Supplier.setCurrUserId(userId); + List supplierList = bmsSupplierMapper.selectSupplierList(param4Supplier); + List supplierCodes = supplierList.stream() + .map(BmsSupplier::getCode) + .distinct().collect(Collectors.toList()); + supplierCodeList.addAll(supplierCodes); + }else if(loadType.equals(2)){ + //2->客户的行政区域 + if (checkNotNullVale(bmsSupplier.getRegion2Second())){ + lqw.eq(BmsSupplier::getRegion2Second,bmsSupplier.getRegion2Second()); + }else{ + lqw.eq(BmsSupplier::getId,"-999"); + } + }else if(loadType.equals(3)){ + //3->客户的销售区域,省份 + if (checkNotNullVale(bmsSupplier.getRegionSecond())){ + lqw.eq(BmsSupplier::getRegionSecond,bmsSupplier.getRegionSecond()); + }else if(checkNotNullVale(bmsSupplier.getRegionFirst())){ + lqw.eq(BmsSupplier::getRegionFirst,bmsSupplier.getRegionFirst()); + }else { + lqw.eq(BmsSupplier::getId,"-999"); + } + }else if(loadType.equals(4)){ + //4->公司维度统计 + lqw.eq(BmsSupplier::getComRegionCode,bmsSupplier.getComRegionCode()==null?"-1":bmsSupplier.getComRegionCode()); + //防止空值 + supplierCodeList.add(bmsSupplier.getCode()); + }else if(loadType.equals(5)){ + //5->城市,行政区域(不含当前客户) + if (checkNotNullVale(bmsSupplier.getRegion2Third())){ + lqw.eq(BmsSupplier::getRegion2Third,bmsSupplier.getRegion2Third()); + }else{ + lqw.eq(BmsSupplier::getId,"-999"); + } + } + if (loadType.equals(2)||loadType.equals(3)||loadType.equals(4)){ + List supplierList = bmsSupplierMapper.selectList(lqw); + List supplierIds = supplierList.stream().map(BmsSupplier::getId) + .distinct().collect(Collectors.toList()); + List supplierCodes = supplierList.stream().map(BmsSupplier::getCode) + .distinct().collect(Collectors.toList()); + supplierCodeList.addAll(supplierCodes); + //防止空值 + supplierIds.add("-999"); + costDTO.setSupplierIds(supplierIds); + } + //防止空值 + supplierCodeList.add("-999"); + return supplierCodeList; + } + + @Override + public List getSupplierCodesByCenter(BirRoiCostDTO costDTO, String centerType, List centerIds) { + if(CollUtil.isEmpty(centerIds)){ + return new ArrayList<>(); + } + if(centerType.equals("customer")){ + List supplierList = bmsSupplierMapper.selectBatchIds(centerIds); + return supplierList.stream().map(BmsSupplier::getCode).collect(Collectors.toList()); + }else if(centerType.equals("bizRegion")){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(BmsSupplier::getCode); + lqw.in(BmsSupplier::getRegion2First,centerIds) + .or().in(BmsSupplier::getRegion2Second,centerIds) + .or().in(BmsSupplier::getRegion2Third,centerIds) + .or().in(BmsSupplier::getRegion2Fourthly,centerIds); + return bmsSupplierMapper.selectList(lqw).stream().map(BmsSupplier::getCode).collect(Collectors.toList()); + }else if(centerType.equals("saleRegion")){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(BmsSupplier::getCode); + lqw.in(BmsSupplier::getRegionFirst,centerIds) + .or().in(BmsSupplier::getRegionSecond,centerIds) + .or().in(BmsSupplier::getRegionThird,centerIds) + .or().in(BmsSupplier::getRegionFourthly,centerIds); + return bmsSupplierMapper.selectList(lqw).stream().map(BmsSupplier::getCode).collect(Collectors.toList()); + }else if(centerType.equals("center")){ + LambdaQueryWrapper lqwCR = new LambdaQueryWrapper<>(); + lqwCR.in(BmsCenterRegion::getCenterId,centerIds); + List centerRegionList = bmsCenterRegionMapper.selectList(lqwCR); + centerIds = centerRegionList.stream().map(a->a.getRegionId()).collect(Collectors.toList()); + if(centerIds.size()>0) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(BmsSupplier::getCode); + lqw.in(BmsSupplier::getRegionFirst, centerIds) + .or().in(BmsSupplier::getRegionSecond, centerIds) + .or().in(BmsSupplier::getRegionThird, centerIds) + .or().in(BmsSupplier::getRegionFourthly, centerIds); + return bmsSupplierMapper.selectList(lqw).stream().map(BmsSupplier::getCode).collect(Collectors.toList()); + }else { + return new ArrayList<>(); + } + } + return new ArrayList<>(); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirScheduleItemBudgetServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirScheduleItemBudgetServiceImpl.java new file mode 100644 index 0000000..94c7201 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirScheduleItemBudgetServiceImpl.java @@ -0,0 +1,195 @@ +package com.qs.serve.modules.bir.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.DateSplitDTO; +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.DateSplitUtil; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.entity.TbsBudgetLog; +import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; +import com.qs.serve.modules.tbs.mapper.TbsBudgetLogMapper; +import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; +import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudgetMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bir.entity.BirScheduleItemBudget; +import com.qs.serve.modules.bir.service.BirScheduleItemBudgetService; +import com.qs.serve.modules.bir.mapper.BirScheduleItemBudgetMapper; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 预算考核期项 服务实现类 + * @author YenHex + * @since 2023-07-07 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BirScheduleItemBudgetServiceImpl extends ServiceImpl implements BirScheduleItemBudgetService { + + private final TbsBudgetMapper budgetMapper; + private final TbsBudgetLogMapper budgetLogMapper; + private final TbsScheduleItemBudgetMapper scheduleItemBudgetMapper; + + @Override + public void buildScheduleItemBudget() { + + //加载所有启用的预算 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(TbsBudget::getId); + lqw.eq(TbsBudget::getBudgetState,1); + lqw.eq(TbsBudget::getBirFlag,0); + List budgetList = budgetMapper.selectList(lqw); + List budgetIds = budgetList.stream().map(TbsBudget::getId).collect(Collectors.toList()); + //清空异动数据 + LambdaQueryWrapper rmLqw = new LambdaQueryWrapper<>(); + rmLqw.in(BirScheduleItemBudget::getBudgetId,budgetIds); + this.remove(rmLqw); + //加载所有的调增调减预算 + Map budgetLogAmtMap = buildAdjustBudgetAmount(budgetIds); + //加载预算的周期金额 + LambdaQueryWrapper sibLqw = new LambdaQueryWrapper<>(); + sibLqw.in(TbsScheduleItemBudget::getBudgetId,budgetIds); + List scheduleItemBudgetList = scheduleItemBudgetMapper.selectList(sibLqw); + List maintenanceList = new ArrayList<>(); + for (TbsScheduleItemBudget scheduleItemBudget : scheduleItemBudgetList) { + // 调整金额 + BigDecimal adjustAmount = budgetLogAmtMap.get(scheduleItemBudget.getId()); + if(adjustAmount!=null){ + scheduleItemBudget.setBudgetAmount(scheduleItemBudget.getBudgetAmount().add(adjustAmount)); + } + // 按时间分割 + LocalDate actStartDate = scheduleItemBudget.getStartDate().toLocalDate(); + LocalDate actEndDate = scheduleItemBudget.getEndDate().toLocalDate(); + int currentActDays = (int) (actEndDate.toEpochDay()-actStartDate.toEpochDay()+1); + List dateSplitList = DateSplitUtil.getSplitDto(actStartDate,actEndDate); + if(dateSplitList.size()>1){ + //计算剩余 + BigDecimal surplusScheduleBudget = scheduleItemBudget.getBudgetAmount(); + BigDecimal surplusScheduleDispatch = scheduleItemBudget.getPreDispatchAmount(); + for (DateSplitDTO currDateSplit : dateSplitList) { + //日期占比 + BigDecimal dayRate = new BigDecimal(currDateSplit.getDays() + "") + .divide(new BigDecimal(currentActDays + ""), 2, BigDecimal.ROUND_HALF_DOWN); + //分割的金额 + BigDecimal splitBudgetAmt; + BigDecimal splitDispatchAmt; + //最后一项 + if(currDateSplit.getSort().equals(dateSplitList.size())){ + splitBudgetAmt = surplusScheduleBudget; + splitDispatchAmt = surplusScheduleDispatch; + }else { + splitBudgetAmt = scheduleItemBudget.getBudgetAmount().multiply(dayRate); + splitDispatchAmt = scheduleItemBudget.getPreDispatchAmount().multiply(dayRate); + surplusScheduleBudget = surplusScheduleBudget.subtract(splitBudgetAmt); + surplusScheduleDispatch = surplusScheduleDispatch.subtract(splitDispatchAmt); + } + maintenanceList.add( + this.buildMainEntity( + scheduleItemBudget, + currDateSplit, + currentActDays, + splitBudgetAmt, + splitDispatchAmt) + ); + } + + }else if (dateSplitList.size()==1){ + maintenanceList.add( + this.buildMainEntity( + scheduleItemBudget, + dateSplitList.get(0), + currentActDays, + scheduleItemBudget.getBudgetAmount(), + scheduleItemBudget.getPreDispatchAmount()) + ); + }else { + Assert.throwEx("Invalid date"); + } + } + } + + /** + * Builds the main entity + * @param source + * @param dateSplit + * @param totalDays + * @param splitBudgetAmount + * @param splitPreDispatchAmount + * @return + */ + public BirScheduleItemBudget buildMainEntity(TbsScheduleItemBudget source,DateSplitDTO dateSplit, + Integer totalDays, + BigDecimal splitBudgetAmount, + BigDecimal splitPreDispatchAmount){ + BirScheduleItemBudget scheduleItemBudget = new BirScheduleItemBudget(); + scheduleItemBudget.setId(source.getId()); + scheduleItemBudget.setScheduleId(source.getScheduleId()); + scheduleItemBudget.setScheduleItemId(source.getScheduleItemId()); + scheduleItemBudget.setItemName(source.getItemName()); + scheduleItemBudget.setBudgetStartDate(source.getStartDate()); + scheduleItemBudget.setBudgetEndDate(source.getEndDate()); + scheduleItemBudget.setBudgetId(source.getBudgetId()); + scheduleItemBudget.setBudgetAmount(source.getBudgetAmount()); + scheduleItemBudget.setPreDispatchAmount(source.getPreDispatchAmount()); + scheduleItemBudget.setSplitBudgetAmount(splitBudgetAmount); + scheduleItemBudget.setSplitPreDispatchAmount(splitPreDispatchAmount); + scheduleItemBudget.setRemark(source.getRemark()); + scheduleItemBudget.setCreateTime(source.getCreateTime()); + scheduleItemBudget.setUpdateTime(source.getUpdateTime()); + scheduleItemBudget.setTenantId(source.getTenantId()); + scheduleItemBudget.setCreateBy(source.getCreateBy()); + scheduleItemBudget.setUpdateBy(source.getUpdateBy()); + + scheduleItemBudget.setKeyNum(dateSplit.getYearMonth()); + scheduleItemBudget.setMonthDays(dateSplit.getDays()); + scheduleItemBudget.setTotalDays(totalDays); + scheduleItemBudget.setStartDate(dateSplit.getStartDate()); + scheduleItemBudget.setEndDate(dateSplit.getEndDate()); + + return scheduleItemBudget; + } + + /** + * 加载所有的调增调减预算 + * @param budgetIds + * @return key -> scheduleItemBudgetId ; value -> 调整金额 + */ + @NotNull + private Map buildAdjustBudgetAmount(List budgetIds) { + LambdaQueryWrapper budgetLogLqw = new LambdaQueryWrapper<>(); + budgetLogLqw.select(TbsBudgetLog::getBudgetId,TbsBudgetLog::getAmount); + budgetLogLqw.in(TbsBudgetLog::getBudgetId,budgetIds); + budgetLogLqw.in(TbsBudgetLog::getOptType, + BudgetLogOptFlag.State_2.getCode(), + BudgetLogOptFlag.State_3.getCode()); + List budgetLogs = budgetLogMapper.selectList(budgetLogLqw); + Map budgetLogAmtMap = new HashMap<>(); + Map> budgetLogsGroup = budgetLogs.stream().collect(Collectors.groupingBy(TbsBudgetLog::getScheduleItemBudgetId)); + for (Long budgetId : budgetLogsGroup.keySet()) { + BigDecimal adjustedAmount = BigDecimal.ZERO; + for (TbsBudgetLog budgetLog : budgetLogsGroup.get(budgetId)) { + if(budgetLog.getAmount() != null) { + adjustedAmount = adjustedAmount.add(budgetLog.getAmount()); + } + } + budgetLogAmtMap.put(budgetId, adjustedAmount); + } + return budgetLogAmtMap; + } + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirTbsVtbPayJoinServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirTbsVtbPayJoinServiceImpl.java new file mode 100644 index 0000000..c5388a4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bir/service/impl/BirTbsVtbPayJoinServiceImpl.java @@ -0,0 +1,251 @@ +package com.qs.serve.modules.bir.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.DateSplitDTO; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bir.consts.TbsVtbPayShowType; +import com.qs.serve.modules.bir.entity.BirBaseActivity; +import com.qs.serve.modules.bir.entity.dto.BirPayJoinDTO; +import com.qs.serve.modules.bir.entity.dto.BirTbsVtbPayJoinDTO; +import com.qs.serve.modules.bir.entity.dto.BirVtbPayJoinDTO; +import com.qs.serve.modules.bir.entity.so.BirTbsVtbPayJoinSo; +import com.qs.serve.modules.bir.mapper.BirTbsVtbPayJoinMapper; +import com.qs.serve.modules.bir.service.BirBaseActivityService; +import com.qs.serve.modules.bir.service.BirTbsVtbPayJoinService; +import com.qs.serve.modules.pay.entity.PayPayment; +import com.qs.serve.modules.pay.entity.PayPaymentItem; +import com.qs.serve.modules.pay.service.PayPaymentItemService; +import com.qs.serve.modules.pay.service.PayPaymentService; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.mapper.TbsActivityMapper; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper; +import com.qs.serve.modules.tbs.service.TbsActivityService; +import com.qs.serve.modules.tbs.service.TbsCostApplyService; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * ROI费率(活动档案) 服务实现类 + * @author YenHex + * @since 2023-06-05 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BirTbsVtbPayJoinServiceImpl extends ServiceImpl implements BirTbsVtbPayJoinService { + @Autowired + private PayPaymentService payPaymentService; + @Autowired + private PayPaymentItemService payPaymentItemService; + @Autowired + private VtbVerificationService verificationService; + @Autowired + private TbsActivityService activityService; + @Autowired + private TbsCostApplyService costApplyService; + + @Override + public PageVo selectBirTbsVtbPayJoinDTO(BirTbsVtbPayJoinSo so,Integer searchPage){ + if(searchPage==1) { + PageUtil.startPage(); + } + List dtoList = this.baseMapper.selectBirTbsVtbPayJoinDTO(so); + + PageVo pageVo = new PageVo<>(); + if(searchPage==1) { + pageVo = R.buildPageHelperList(dtoList); + } + + List actIds = dtoList.stream().map(a->a.getActivityId()).distinct().collect(Collectors.toList()); + + + List sumVtbAmountList = actIds.size()>0?this.baseMapper.selectSumVtbAmount(actIds):new ArrayList<>(); + + List sumPayAmountList = actIds.size()>0?this.baseMapper.selectSumPayAmount(actIds):new ArrayList<>(); + + List returnActDtoList = dtoList.stream().map(act->{ + + Optional sumVtbAmountMatch = sumVtbAmountList.stream() + .filter(a->a.getActivityId().equals(act.getActivityId())) + .findFirst(); + + if (sumVtbAmountMatch.isPresent()) { + act.setCheckedAmount(sumVtbAmountMatch.get().getCheckedAmount()); + act.setCheckingAmount(sumVtbAmountMatch.get().getCheckingAmount()); + }else{ + act.setCheckedAmount(BigDecimal.ZERO); + act.setCheckingAmount(BigDecimal.ZERO); + } + + Optional sumPayAmountMatch = sumPayAmountList.stream() + .filter(a->a.getActivityId().equals(act.getActivityId())) + .findFirst(); + + if (sumPayAmountMatch.isPresent()) { + act.setPayedAmount(sumPayAmountMatch.get().getPayedAmount()); + act.setNotPayAmount(sumPayAmountMatch.get().getNotPayAmount()); + }else{ + act.setPayedAmount(BigDecimal.ZERO); + act.setNotPayAmount(BigDecimal.ZERO); + } + + if(act.getReleaseAmount()==null){ + act.setReleaseAmount(BigDecimal.ZERO); + } + + act.setUnCheckAmount(act.getActivityAmount().subtract(act.getCheckedAmount()).subtract(act.getCheckingAmount()).subtract(act.getReleaseAmount())); + act.setUnpayAmount(act.getCheckedAmount().subtract(act.getPayedAmount())); + + return act; + }).collect(Collectors.toList()); + + pageVo.setList(returnActDtoList); + + return pageVo; + } + + public BirTbsVtbPayJoinDTO getSumData(BirTbsVtbPayJoinSo so){ + + BirTbsVtbPayJoinDTO sumDto = new BirTbsVtbPayJoinDTO(); + + so.setOnlyAct(1); + so.setShowType(0); + List costApplyList = this.baseMapper.selectBirTbsVtbPayJoinDTO(so); + List actIds = costApplyList.stream().map(a->a.getActivityId()).collect(Collectors.toList()); + if(actIds.size()==0){ + return sumDto; + } + so.setOnlyAct(null); + so.setActIds(actIds); + List dtoList = this.baseMapper.selectBirTbsVtbPayJoinDTO(so); + + List sumVtbAmountList = actIds.size()>0?this.baseMapper.selectSumVtbAmount(actIds):new ArrayList<>(); + + List sumPayAmountList = actIds.size()>0?this.baseMapper.selectSumPayAmount(actIds):new ArrayList<>(); + + BigDecimal vtbAmount = sumVtbAmountList.stream().filter(a->a.getCheckedAmount()!=null) + .map(BirTbsVtbPayJoinDTO::getCheckedAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add).add( + sumVtbAmountList.stream().filter(a->a.getCheckingAmount()!=null) + .map(BirTbsVtbPayJoinDTO::getCheckingAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add) + ); + + BigDecimal payAmount = sumPayAmountList.stream().filter(a->a.getPayedAmount()!=null) + .map(BirTbsVtbPayJoinDTO::getPayedAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + List returnActDtoList = dtoList.stream() + .collect(Collectors.toMap( + BirTbsVtbPayJoinDTO::getActivityId, + dto -> dto, + (existing, replacement) -> existing, + LinkedHashMap::new)) + .values() + .stream().map(act->{ + + Optional sumVtbAmountMatch = sumVtbAmountList.stream() + .filter(a->a.getActivityId().equals(act.getActivityId())) + .findFirst(); + + if (sumVtbAmountMatch.isPresent()) { + act.setCheckedAmount(sumVtbAmountMatch.get().getCheckedAmount()); + act.setCheckingAmount(sumVtbAmountMatch.get().getCheckingAmount()); + }else{ + act.setCheckedAmount(BigDecimal.ZERO); + act.setCheckingAmount(BigDecimal.ZERO); + } + + Optional sumPayAmountMatch = sumPayAmountList.stream() + .filter(a->a.getActivityId().equals(act.getActivityId())) + .findFirst(); + + if (sumPayAmountMatch.isPresent()) { + act.setPayedAmount(sumPayAmountMatch.get().getPayedAmount()); + act.setNotPayAmount(sumPayAmountMatch.get().getNotPayAmount()); + }else{ + act.setPayedAmount(BigDecimal.ZERO); + act.setNotPayAmount(BigDecimal.ZERO); + } + + if(act.getReleaseAmount()==null){ + act.setReleaseAmount(BigDecimal.ZERO); + } + + act.setUnCheckAmount(act.getActivityAmount().subtract(act.getCheckedAmount()).subtract(act.getCheckingAmount()).subtract(act.getReleaseAmount())); + act.setUnpayAmount(act.getCheckedAmount().subtract(act.getPayedAmount())); + + return act; + }).collect(Collectors.toList()); + + + BigDecimal activityAmount = returnActDtoList.stream() + .map(BirTbsVtbPayJoinDTO::getActivityAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + BigDecimal checkedAmount = returnActDtoList.stream() + .map(BirTbsVtbPayJoinDTO::getCheckedAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + BigDecimal checkingAmount = returnActDtoList.stream() + .map(BirTbsVtbPayJoinDTO::getCheckingAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + BigDecimal releaseAmount = returnActDtoList.stream() + .map(BirTbsVtbPayJoinDTO::getReleaseAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + BigDecimal unCheckAmount = returnActDtoList.stream() + .map(BirTbsVtbPayJoinDTO::getUnCheckAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + BigDecimal payedAmount = returnActDtoList.stream() + .map(BirTbsVtbPayJoinDTO::getPayedAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + BigDecimal unpayAmount = returnActDtoList.stream() + .map(BirTbsVtbPayJoinDTO::getUnpayAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + BigDecimal notPayAmount = returnActDtoList.stream() + .map(BirTbsVtbPayJoinDTO::getNotPayAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + sumDto.setActivityAmount(activityAmount); + sumDto.setCheckedAmount(checkedAmount); + sumDto.setCheckingAmount(checkingAmount); + sumDto.setReleaseAmount(releaseAmount); + sumDto.setUnCheckAmount(unCheckAmount); + sumDto.setPayedAmount(payedAmount); + sumDto.setUnpayAmount(unpayAmount); + sumDto.setNotPayAmount(notPayAmount); + + + + sumDto.setVtbAmount(vtbAmount); + sumDto.setPayAmount(payAmount); + + return sumDto; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/consts/GroupDataType.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/consts/GroupDataType.java new file mode 100644 index 0000000..0aa430d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/consts/GroupDataType.java @@ -0,0 +1,12 @@ +package com.qs.serve.modules.biz.consts; + +/** + * @author YenHex + * @since 2023/10/25 + */ +public interface GroupDataType { + + String USER = "user"; + String DEPT = "dept"; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizAppLogController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizAppLogController.java new file mode 100644 index 0000000..5b7c94f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizAppLogController.java @@ -0,0 +1,80 @@ +package com.qs.serve.modules.biz.controller; + +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.util.PageUtil; +import com.qs.serve.modules.biz.entity.BizAppLog; +import com.qs.serve.modules.biz.service.BizAppLogService; +import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.*; + +/** +* 业务 APP错误日志 +* @author YenHex +* @since 2023-05-26 +*/ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/biz/appLog") +public class BizAppLogController { + + private final BizAppLogService bizAppLogService; + + /** + * 列表查询 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(BizAppLog param) { + List list = bizAppLogService.queryList(param); + return R.ok(list); + } + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + public PageVo getPage(BizAppLog param) { + PageUtil.startPage(); + List list = bizAppLogService.queryList(param); + return R.buildPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping(value = "/{id}") + public R getById(@PathVariable("id") String id){ + BizAppLog bizAppLog = bizAppLogService.getById(id); + return R.ok(bizAppLog); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping() + @Transactional(rollbackFor = Exception.class) + public R save(@RequestBody @Valid BizAppLog param){ + bizAppLogService.save(param); + return R.ok(); + } + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizCommentController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizCommentController.java new file mode 100644 index 0000000..3139ec8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizCommentController.java @@ -0,0 +1,165 @@ +package com.qs.serve.modules.biz.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.sys.common.AuthContextUtils; +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 lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.biz.entity.so.BizCommentSo; +import com.qs.serve.modules.biz.entity.bo.BizCommentBo; +import com.qs.serve.modules.biz.entity.BizComment; +import com.qs.serve.modules.biz.service.BizCommentService; + +import javax.validation.Valid; +import java.util.Arrays; +import java.util.List; + +/** + * 业务 通用的评论 + * @author YenHex + * @since 2023-02-17 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("biz/comment") +public class BizCommentController { + + private BizCommentService bizCommentService; + private SysUserService sysUserService; + private SysAttachService attachService; + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(@Valid BizCommentSo param){ + BizComment entity = CopierUtil.copy(param,new BizComment()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + PageUtil.startPage(); + List list = bizCommentService.list(lqw); + for (BizComment bizComment : list) { + if(CollectionUtil.isNotEmpty(bizComment.getAttachIds())){ + List attachIds = Arrays.asList(bizComment.getAttachIds()); + List attachList = attachService.listByIds(attachIds); + bizComment.setAttachList(attachList); + } + } + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + BizComment bizComment = bizCommentService.getById(id); + if(CollectionUtil.isNotEmpty(bizComment.getAttachIds())){ + List attachIds = Arrays.asList(bizComment.getAttachIds()); + List attachList = attachService.listByIds(attachIds); + bizComment.setAttachList(attachList); + } + return R.ok(bizComment); + } + + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BIZ, title = "评论", biz = BizType.INSERT) + public R save(@RequestBody @Valid BizCommentBo param){ + String userId = AuthContextUtils.getSysUserId(); + SysUser sysUser = sysUserService.getById(userId); + param.setId(null); + BizComment entity = CopierUtil.copy(param,new BizComment()); + entity.setUserId(sysUser.getId()); + entity.setUserName(sysUser.getName()); + entity.setUserAvatar(sysUser.getIcon()); + boolean result = bizCommentService.save(entity); + return R.ok(entity); + } + + + /** + * 更新(我的) + * @param param + * @return + */ + @PostMapping("/updateMyById") + @SysLog(module = SystemModule.BIZ, title = "评论", biz = BizType.UPDATE) + public R updateMyById(@RequestBody @Valid BizCommentBo param){ + BizComment bizComment = bizCommentService.getById(param.getId()); + if(bizComment.getUserId().equals(AuthContextUtils.getSysUserId())){ + BizComment entity = CopierUtil.copy(param,new BizComment()); + boolean result = bizCommentService.updateById(entity); + return R.ok(entity); + } + return R.error("无相关数据"); + } + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BIZ, title = "评论", biz = BizType.UPDATE) + @PreAuthorize("hasRole('biz:comment:update')") + public R updateById(@RequestBody @Valid BizCommentBo param){ + BizComment entity = CopierUtil.copy(param,new BizComment()); + boolean result = bizCommentService.updateById(entity); + return R.ok(entity); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BIZ, title = "评论", biz = BizType.DELETE) + @PreAuthorize("hasRole('biz:comment:delete')") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = bizCommentService.removeByIds(idsLong); + return R.isTrue(result); + } + + /** + * 删除(我的) + * @param ids + * @return + */ + @DeleteMapping("/deleteMyById/{ids}") + @SysLog(module = SystemModule.BIZ, title = "评论", biz = BizType.DELETE) + public R deleteMyById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BizComment::getUserId,AuthContextUtils.getSysUserId()); + lqw.in(BizComment::getId,idsLong); + boolean result = bizCommentService.remove(lqw); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizCusVisitController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizCusVisitController.java new file mode 100644 index 0000000..fb40fdd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizCusVisitController.java @@ -0,0 +1,115 @@ +package com.qs.serve.modules.biz.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.biz.entity.BizCusVisit; +import com.qs.serve.modules.biz.service.BizCusVisitService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 业务 客户拜访日志 + * @author YenHex + * @since 2023-03-24 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("biz/cusVisit") +public class BizCusVisitController { + + private BizCusVisitService bizCusVisitService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(BizCusVisit param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = bizCusVisitService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BizCusVisit param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + lqw.orderByDesc(BizCusVisit::getId); + PageUtil.startPage(); + List list = bizCusVisitService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BIZ, title = "拜访日志", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + BizCusVisit bizCusVisit = bizCusVisitService.getById(id); + return R.ok(bizCusVisit); + } + + + + /** + * 更新 + * @param param + * @return + */ + //@PostMapping("/updateById") + @SysLog(module = SystemModule.BIZ, title = "拜访日志", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid BizCusVisit param){ + boolean result = bizCusVisitService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + //@PostMapping("/save") + @SysLog(module = SystemModule.BIZ, title = "拜访日志", biz = BizType.INSERT) + public R save(@RequestBody @Valid BizCusVisit param){ + boolean result = bizCusVisitService.save(param); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BIZ, title = "拜访日志", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = bizCusVisitService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizSignTypeController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizSignTypeController.java new file mode 100644 index 0000000..9984fdb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizSignTypeController.java @@ -0,0 +1,137 @@ +package com.qs.serve.modules.biz.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.biz.entity.BizVisitForm; +import com.qs.serve.modules.biz.entity.so.BizSignTypeQuery; +import com.qs.serve.modules.biz.entity.vo.BizSignTypeVo; +import com.qs.serve.modules.biz.service.BizVisitFormService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.biz.entity.BizSignType; +import com.qs.serve.modules.biz.service.BizSignTypeService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 定位打卡-业务类型 + * @author YenHex + * @since 2024-09-04 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("biz/signType") +public class BizSignTypeController { + + private BizSignTypeService bizSignTypeService; + private BizVisitFormService bizVisitFormService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(BizSignTypeQuery param){ + List list = bizSignTypeService.selectSignTypes(param); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BizSignTypeQuery param){ + PageUtil.startPage(); + List list = bizSignTypeService.selectSignTypes(param); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BIZ, title = "", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + BizSignType bizSignType = bizSignTypeService.getById(id); + BizSignTypeVo typeVo = CopierUtil.copy(bizSignType, new BizSignTypeVo()); + BizVisitForm form = bizVisitFormService.getById(bizSignType.getTemplateId()); + if(form!=null){ + typeVo.setVersion(form.getVersion()); + typeVo.setTemplateName(form.getTitle()); + typeVo.setFormContext(form.getFormContext()); + } + return R.ok(typeVo); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BIZ, title = "", biz = BizType.UPDATE) + //@PreAuthorize("hasRole('biz:signType:update')") + public R updateById(@RequestBody @Valid BizSignType param){ + BizSignType entity = CopierUtil.copy(param,new BizSignType()); + long count = bizSignTypeService.count(new LambdaQueryWrapper() + .eq(BizSignType::getTypeName,param.getTypeName()) + .ne(BizSignType::getId,param.getId())); + if(count>0){ + return R.error("类型的标题不可重复"); + } + boolean result = bizSignTypeService.updateById(entity); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BIZ, title = "", biz = BizType.INSERT) + public R save(@RequestBody @Valid BizSignType param){ + BizSignType entity = CopierUtil.copy(param,new BizSignType()); + long count = bizSignTypeService.count(new LambdaQueryWrapper() + .eq(BizSignType::getTypeName,param.getTypeName())); + if(count>0){ + return R.error("类型的标题不可重复"); + } + boolean result = bizSignTypeService.save(entity); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BIZ, title = "", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = bizSignTypeService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizUserGroupController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizUserGroupController.java new file mode 100644 index 0000000..eff5e45 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizUserGroupController.java @@ -0,0 +1,145 @@ +package com.qs.serve.modules.biz.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.biz.entity.BizUserGroupItem; +import com.qs.serve.modules.biz.entity.bo.BizUserGroupBatchBo; +import com.qs.serve.modules.biz.service.BizUserGroupItemService; +import com.qs.serve.modules.biz.service.impl.BizUserGroupApplicationService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.biz.entity.BizUserGroup; +import com.qs.serve.modules.biz.service.BizUserGroupService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 用户个人数据分组 + * @author YenHex + * @since 2023-10-25 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("biz/dataGroup") +public class BizUserGroupController { + + private final BizUserGroupApplicationService bizUserGroupApplicationService; + private BizUserGroupService bizUserGroupService; + private BizUserGroupItemService bizUserGroupItemService; + private SysUserService sysUserService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(BizUserGroup param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + lqw.eq(BizUserGroup::getUserId, AuthContextUtils.getSysUserId()); + List list = bizUserGroupService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BizUserGroup param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + lqw.eq(BizUserGroup::getUserId, AuthContextUtils.getSysUserId()); + PageUtil.startPage(); + List list = bizUserGroupService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + BizUserGroup bizUserGroup = bizUserGroupService.getById(id); + if(!bizUserGroup.getUserId().equals(AuthContextUtils.getSysUserId())){ + return R.error("无相关数据"); + } + LambdaQueryWrapper itemLqw = new LambdaQueryWrapper<>(); + itemLqw.eq(BizUserGroupItem::getGroupId,id); + List itemList = bizUserGroupItemService.list(itemLqw); + bizUserGroup.setGroupItemList(itemList); + return R.ok(bizUserGroup); + } + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/update") + public R updateById(@RequestBody @Valid BizUserGroup param){ + BizUserGroup bizUserGroup = bizUserGroupService.getById(param.getId()); + if(!bizUserGroup.getUserId().equals(AuthContextUtils.getSysUserId())){ + return R.error("无相关数据"); + } + boolean result = bizUserGroupService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + public R save(@RequestBody @Valid BizUserGroup param){ + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + param.setUserId(sysUser.getId()); + param.setUserCode(sysUser.getCode()); + param.setUserName(sysUser.getName()); + boolean result = bizUserGroupService.save(param); + return R.isTrue(result); + } + + + /** + * 编辑 (场景:同时编辑分组数据) + * @param param + * @return + */ + @PostMapping("/editWithItem") + public R editWithItem(@RequestBody @Valid BizUserGroupBatchBo param){ + param.setEditGroupFlag(1); + bizUserGroupApplicationService.editWithItem(param); + return R.ok(); + } + + /** + * 删除整个组 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(BizUserGroup::getId,idsLong); + lqw.eq(BizUserGroup::getUserId,AuthContextUtils.getSysUserId()); + boolean result = bizUserGroupService.remove(lqw); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizUserGroupItemController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizUserGroupItemController.java new file mode 100644 index 0000000..6435c9c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizUserGroupItemController.java @@ -0,0 +1,94 @@ +package com.qs.serve.modules.biz.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.biz.entity.bo.BizUserGroupBatchBo; +import com.qs.serve.modules.biz.entity.bo.BizUserGroupItemBatchBo; +import com.qs.serve.modules.biz.service.impl.BizUserGroupApplicationService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.biz.entity.BizUserGroupItem; +import com.qs.serve.modules.biz.service.BizUserGroupItemService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 用户个人数据 + * @author YenHex + * @since 2023-10-25 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("biz/dataItem") +public class BizUserGroupItemController { + + private final BizUserGroupItemService bizUserGroupItemService; + private final BizUserGroupApplicationService bizUserGroupApplicationService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(BizUserGroupItem param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = bizUserGroupItemService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BizUserGroupItem param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = bizUserGroupItemService.list(lqw); + return R.byPageHelperList(list); + } + + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + public R save(@RequestBody @Valid BizUserGroupItemBatchBo param){ + BizUserGroupBatchBo groupBatchBo = new BizUserGroupBatchBo(); + groupBatchBo.setEditGroupFlag(0); + groupBatchBo.setId(param.getGroupId()); + groupBatchBo.setItems(param.getItems()); + bizUserGroupApplicationService.editWithItem(groupBatchBo); + return R.ok(); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = bizUserGroupItemService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizVisitController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizVisitController.java new file mode 100644 index 0000000..46bf656 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizVisitController.java @@ -0,0 +1,157 @@ +package com.qs.serve.modules.biz.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.biz.mapper.BizVisitMapper; +import com.qs.serve.modules.sys.service.SysPostUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.biz.entity.BizVisit; +import com.qs.serve.modules.biz.service.BizVisitService; + +import java.util.List; + +/** + * 业务 拜访日志 + * @author YenHex + * @since 2022-10-26 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("biz/visit") +public class BizVisitController { + + private BizVisitService bizVisitService; + + private BizVisitMapper bizVisitMapper; + + private SysPostUserService postUserService; + + /** + * 获取签到类型下拉框数据 + * @return + */ + @GetMapping("/signTypeOptions") + public R> getSignTypeOptions(){ + return R.ok(bizVisitMapper.selectAllSignType()); + } + + /** + * 翻页(我的下属拜访记录) + * @param param + * @return + */ + @GetMapping("/page4Under") + public R> page4Under(BizVisit param){ + List userIds = postUserService.listByChildIds(AuthContextUtils.getSysUserId()); + if(userIds.size()<1){ + return R.byEmptyList(); + } + PageUtil.startPage(); + LambdaQueryWrapper visitWrapper = this.getBizVisitLambdaQueryWrapper(param); + visitWrapper.in(BizVisit::getVisitorId,userIds); + List list = bizVisitService.list(visitWrapper); + return R.byPageHelperList(list); + } + + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BizVisit param){ + PageUtil.startPage(); + LambdaQueryWrapper visitWrapper = this.getBizVisitLambdaQueryWrapper(param); + List list = bizVisitService.list(visitWrapper); + return R.byPageHelperList(list); + } + + /** + * 列表(我的下属拜访记录) + * @param param + * @return + */ + @GetMapping("/list4Under") + public R> list4Under(BizVisit param){ + List userIds = postUserService.listByChildIds(AuthContextUtils.getSysUserId()); + if(userIds.size()<1){ + return R.ok(); + } + LambdaQueryWrapper visitWrapper = this.getBizVisitLambdaQueryWrapper(param); + visitWrapper.in(BizVisit::getVisitorId,userIds); + List list = bizVisitService.list(visitWrapper); + return R.ok(list); + } + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(BizVisit param){ + LambdaQueryWrapper visitWrapper = this.getBizVisitLambdaQueryWrapper(param); + List list = bizVisitService.list(visitWrapper); + return R.ok(list); + } + + @NotNull + private LambdaQueryWrapper getBizVisitLambdaQueryWrapper(BizVisit param) { + LambdaQueryWrapper visitWrapper = new LambdaQueryWrapper<>(param); + visitWrapper.orderByDesc(BizVisit::getId); + if(param.getQueryStartTime()!=null){ + visitWrapper.ge(BizVisit::getCreateTime, param.getQueryStartTime()); + } + if(param.getQueryEndTime()!=null){ + visitWrapper.le(BizVisit::getCreateTime, param.getQueryEndTime().atTime(23,59,59)); + } + if(param.getMissLocalFlag()!=null&& param.getMissLocalFlag().equals(1)){ + visitWrapper.eq(BizVisit::getLocalX,"0"); + visitWrapper.eq(BizVisit::getLocalY,"0"); + } + if(param.getMissLocalFlag()!=null&& param.getMissLocalFlag().equals(0)){ + visitWrapper.ne(BizVisit::getLocalX,"0"); + visitWrapper.ne(BizVisit::getLocalY,"0"); + } + return visitWrapper; + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BIZ, title = "拜访日志", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + BizVisit bizVisit = bizVisitService.getById(id); + return R.ok(bizVisit); + } + + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BIZ, title = "拜访日志", biz = BizType.DELETE) + public R deleteById(@PathVariable("id") Long id){ + boolean result = bizVisitService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizVisitFormController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizVisitFormController.java new file mode 100644 index 0000000..b8c565c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/BizVisitFormController.java @@ -0,0 +1,120 @@ +package com.qs.serve.modules.biz.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.biz.entity.BizVisitForm; +import com.qs.serve.modules.biz.service.BizVisitFormService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 定位打卡-模板表单 + * @author YenHex + * @since 2024-09-05 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("biz/visitForm") +public class BizVisitFormController { + + private BizVisitFormService bizVisitFormService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + //@PreAuthorize("hasRole('biz:visitForm:query')") + public R> getList(BizVisitForm param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = bizVisitFormService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + //@PreAuthorize("hasRole('biz:visitForm:query')") + public R> getPage(BizVisitForm param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = bizVisitFormService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BIZ, title = "科目表单", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + BizVisitForm bizVisitForm = bizVisitFormService.getById(id); + return R.ok(bizVisitForm); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BIZ, title = "科目表单", biz = BizType.UPDATE) + //@PreAuthorize("hasRole('biz:visitForm:update')") + public R updateById(@RequestBody @Valid BizVisitForm param){ + BizVisitForm entity = CopierUtil.copy(param,new BizVisitForm()); + bizVisitFormService.updateById(entity); + return R.ok(entity); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BIZ, title = "科目表单", biz = BizType.INSERT) + //@PreAuthorize("hasRole('biz:visitForm:insert')") + public R save(@RequestBody @Valid BizVisitForm param){ + BizVisitForm entity = CopierUtil.copy(param,new BizVisitForm()); + bizVisitFormService.save(entity); + return R.ok(entity); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BIZ, title = "科目表单", biz = BizType.DELETE) + //@PreAuthorize("hasRole('biz:visitForm:delete')") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = bizVisitFormService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/api/BizCusVisitApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/api/BizCusVisitApi.java new file mode 100644 index 0000000..c9d0de7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/api/BizCusVisitApi.java @@ -0,0 +1,231 @@ +package com.qs.serve.modules.biz.controller.api; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.biz.entity.BizCusVisit; +import com.qs.serve.modules.biz.entity.bo.BizCusVisitBo; +import com.qs.serve.modules.biz.service.BizCusVisitService; +import com.qs.serve.modules.bms.entity.*; +import com.qs.serve.modules.bms.service.*; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.wx.entity.WxUser; +import com.qs.serve.modules.wx.service.WxUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.List; + +/** + * API业务 客户拜访日志 + * @author YenHex + * @since 2022-10-26 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/api/cusVisit") +public class BizCusVisitApi { + + private BizCusVisitService bizVisitService; + private WxUserService wxUserService; + private SysUserService sysUserService; + private BmsSupplierService supplierService; + + private BmsSupplierVisitService bmsSupplierVisitService; + private BmsSupplierVisitTypeService bmsSupplierVisitTypeService; + private BmsSupplierVisitFormService bmsSupplierVisitFormService; + private BmsSupplierVisitAddressService bmsSupplierVisitAddressService; + + + private SysPostUserService postUserService; + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BizCusVisit param){ + WxUser wxUser = wxUserService.getCurrentWxUser(); + if(wxUser.getSysUserId()==null||wxUser.getSysUserId().equals("0")){ + return R.byEmptyList(); + } + String userId = wxUser.getSysUserId(); + param.setVisitorId(userId); + PageUtil.startPage(); + LambdaQueryWrapper visitWrapper = new LambdaQueryWrapper<>(param); + visitWrapper.orderByDesc(BizCusVisit::getCreateTime); + List list = bizVisitService.list(visitWrapper); + return R.byPageHelperList(list); + } + + /** + * 翻页(我的下属拜访记录) + * @param param + * @return + */ + @GetMapping("/page4Under") + public R> page4Under(BizCusVisit param){ + WxUser wxUser = wxUserService.getCurrentWxUser(); + if(wxUser.getSysUserId()==null||wxUser.getSysUserId().equals("0")){ + return R.byEmptyList(); + } + String userId = wxUser.getSysUserId(); + List userIds = postUserService.listByChildIds(userId); + if(userIds.size()<1){ + return R.byEmptyList(); + } + PageUtil.startPage(); + LambdaQueryWrapper visitWrapper = new LambdaQueryWrapper<>(param); + visitWrapper.in(BizCusVisit::getVisitorId,userIds); + visitWrapper.orderByDesc(BizCusVisit::getCreateTime); + List list = bizVisitService.list(visitWrapper); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + WxUser wxUser = wxUserService.getCurrentWxUser(); + if(wxUser.getSysUserId()==null||wxUser.getSysUserId().equals("0")){ + return R.ok(); + } + String userId = wxUser.getSysUserId(); + BizCusVisit bizVisit = bizVisitService.getById(id); + if(!bizVisit.getVisitorId().equals(userId)){ + return R.ok(); + } + return R.ok(bizVisit); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + public R updateById(@RequestBody @Valid BizCusVisitBo param){ + WxUser wxUser = wxUserService.getCurrentWxUser(); + if(wxUser.getSysUserId()==null||wxUser.getSysUserId().equals("0")){ + return R.ok(); + } + String userId = wxUser.getSysUserId(); + this.saveOrUpdate(param,userId); + return R.ok(); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + public R save(@RequestBody @Valid BizCusVisitBo param){ + WxUser wxUser = wxUserService.getCurrentWxUser(); + String userId = wxUser.getSysUserId(); + if(wxUser.getSysUserId()==null||wxUser.getSysUserId().equals("0")){ + return R.ok(); + } + saveOrUpdate(param, userId); + return R.ok(); + } + + private void saveOrUpdate(BizCusVisitBo param, String userId) { + BizCusVisit cusVisitDb= bizVisitService.getById(param.getId()); + if(cusVisitDb!=null){ + if(cusVisitDb.getStatus()==1){ + return; + }else if(cusVisitDb.getStatus()==0){ + param.setPhotos(null); + param.setLocalX(null); + param.setLocalY(null); + param.setAddressId(null); + param.setInputAddress(null); + param.setSignTypeId(null); + param.setCustomerId(null); + BizCusVisit cusVisit = BizCusVisit.toNewObject(param); + BmsSupplierVisitType visitType = bmsSupplierVisitTypeService.getById(cusVisitDb.getSignTypeId()); + if(visitType.getTypeFormId()!=null){ + BmsSupplierVisitForm visitForm = bmsSupplierVisitFormService.getById(visitType.getTypeFormId()); + cusVisit.setSignTypeFormId(visitForm.getId()); + cusVisit.setSignTypeForm(visitForm.getFormContext()); + } + cusVisit.setSignTypeFormValue(param.getFormJson()); + cusVisit.setStatus(1); + bizVisitService.updateById(cusVisit); + return; + } + } + BizCusVisit cusVisit = BizCusVisit.toNewObject(param); + SysUser sysUser = sysUserService.getById(userId); + cusVisit.setVisitorId(userId); + cusVisit.setVisitorName(sysUser.getName()); + BmsSupplier supplier = supplierService.getById(param.getCustomerId()); + cusVisit.setCustomerId(supplier.getId()); + cusVisit.setCustomerName(supplier.getName()); + cusVisit.setCustomerCode(supplier.getCode()); + BmsSupplierVisitType visitType = bmsSupplierVisitTypeService.getById(param.getSignTypeId()); + cusVisit.setSignTypeId(visitType.getId()); + cusVisit.setSignType(visitType.getTypeName()); + BmsSupplierVisitAddress visitAddress = bmsSupplierVisitAddressService.getById(param.getAddressId()); + cusVisit.setAddress(visitAddress.getAddressDetail()); + if(visitType.getTypeFormId()!=null){ + BmsSupplierVisitForm visitForm = bmsSupplierVisitFormService.getById(visitType.getTypeFormId()); + cusVisit.setSignTypeFormId(visitForm.getId()); + cusVisit.setSignTypeForm(visitForm.getFormContext()); + cusVisit.setSignTypeFormValue(param.getFormJson()); + } + bizVisitService.saveOrUpdate(cusVisit); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplierVisit::getSupplierId,supplier.getId()); + BmsSupplierVisit supplierVisit = bmsSupplierVisitService.getOne(lqw); + if(supplierVisit==null){ + supplierVisit = new BmsSupplierVisit(); + supplierVisit.setSupplierId(supplier.getId()); + supplierVisit.setVisitCount(1); + supplierVisit.setLastVisitTime(LocalDateTime.now()); + supplierVisit.setNextVisitDate(param.getNextTimeVisit()); + bmsSupplierVisitService.save(supplierVisit); + }else { + supplierVisit.setVisitCount(supplierVisit.getVisitCount()+1); + supplierVisit.setLastVisitTime(LocalDateTime.now()); + supplierVisit.setNextVisitDate(param.getNextTimeVisit()); + bmsSupplierVisitService.updateById(supplierVisit); + } + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + public R deleteById(@PathVariable("id") Long id){ + WxUser wxUser = wxUserService.getCurrentWxUser(); + if(wxUser.getSysUserId()==null||wxUser.getSysUserId().equals("0")){ + return R.ok(); + } + String userId = wxUser.getSysUserId(); + BizCusVisit bizVisit = bizVisitService.getById(id); + if(!bizVisit.getVisitorId().equals(userId)){ + return R.ok(); + } + boolean result = bizVisitService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/api/BizVisitApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/api/BizVisitApi.java new file mode 100644 index 0000000..93a241a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/api/BizVisitApi.java @@ -0,0 +1,203 @@ +package com.qs.serve.modules.biz.controller.api; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.biz.entity.BizVisit; +import com.qs.serve.modules.biz.service.BizSignTypeService; +import com.qs.serve.modules.biz.service.BizVisitService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.wx.entity.WxUser; +import com.qs.serve.modules.wx.service.WxUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * API业务 拜访日志 + * @author YenHex + * @since 2022-10-26 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/api/visit") +public class BizVisitApi { + + private BizVisitService bizVisitService; + private WxUserService wxUserService; + private SysUserService sysUserService; + + private SysPostUserService postUserService; + private BizSignTypeService bizSignTypeService; + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BizVisit param){ + WxUser wxUser = wxUserService.getCurrentWxUser(); + if(wxUser.getSysUserId()==null||wxUser.getSysUserId().equals("0")){ + return R.byEmptyList(); + } + String userId = wxUser.getSysUserId(); + param.setVisitorId(userId); + PageUtil.startPage(); + LambdaQueryWrapper visitWrapper = this.getBizVisitLambdaQueryWrapper(param); + List list = bizVisitService.list(visitWrapper); + return R.byPageHelperList(list); + } + + @NotNull + private LambdaQueryWrapper getBizVisitLambdaQueryWrapper(BizVisit param) { + LambdaQueryWrapper visitWrapper = new LambdaQueryWrapper<>(param); + if(param.getQueryStartTime()!=null){ + visitWrapper.ge(BizVisit::getCreateTime, param.getQueryStartTime()); + } + if(param.getQueryEndTime()!=null){ + visitWrapper.le(BizVisit::getCreateTime, param.getQueryEndTime().atTime(23,59,59)); + } + if(param.getMissLocalFlag()!=null&& param.getMissLocalFlag().equals(1)){ + visitWrapper.eq(BizVisit::getLocalX,"0"); + visitWrapper.eq(BizVisit::getLocalY,"0"); + } + if(param.getMissLocalFlag()!=null&& param.getMissLocalFlag().equals(0)){ + visitWrapper.ne(BizVisit::getLocalX,"0"); + visitWrapper.ne(BizVisit::getLocalY,"0"); + } + visitWrapper.orderByDesc(BizVisit::getCreateTime); + return visitWrapper; + } + + /** + * 翻页(我的下属拜访记录) + * @param param + * @return + */ + @GetMapping("/page4Under") + public R> page4Under(BizVisit param){ + WxUser wxUser = wxUserService.getCurrentWxUser(); + if(wxUser.getSysUserId()==null||wxUser.getSysUserId().equals("0")){ + return R.byEmptyList(); + } + String userId = wxUser.getSysUserId(); + List userIds = postUserService.listByChildIds(userId); + if(userIds.size()<1){ + return R.byEmptyList(); + } + PageUtil.startPage(); + LambdaQueryWrapper visitWrapper = this.getBizVisitLambdaQueryWrapper(param); + visitWrapper.in(BizVisit::getVisitorId,userIds); + List list = bizVisitService.list(visitWrapper); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + WxUser wxUser = wxUserService.getCurrentWxUser(); + if(wxUser.getSysUserId()==null||wxUser.getSysUserId().equals("0")){ + return R.ok(); + } + String userId = wxUser.getSysUserId(); + BizVisit bizVisit = bizVisitService.getById(id); +// if(!bizVisit.getVisitorId().equals(userId)){ +// return R.ok(); +// } + return R.ok(bizVisit); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + public R updateById(@RequestBody @Valid BizVisit param){ + WxUser wxUser = wxUserService.getCurrentWxUser(); + if(wxUser.getSysUserId()==null||wxUser.getSysUserId().equals("0")){ + return R.ok(); + } + String userId = wxUser.getSysUserId(); + BizVisit bizVisit = bizVisitService.getById(param.getId()); + if(!bizVisit.getVisitorId().equals(userId)){ + return R.ok(); + } + +// //自动关联模板ID +// BizSignType signType = bizSignTypeService.getOne(new LambdaQueryWrapper() +// .eq(BizSignType::getTypeName,param.getSignType())); +// if(signType!=null){ +// param.setSignTypeId(signType.getId()); +// param.setFormId(signType.getTemplateId()); +// } + + boolean result = bizVisitService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + public R save(@RequestBody @Valid BizVisit param){ + WxUser wxUser = wxUserService.getCurrentWxUser(); + if(wxUser.getSysUserId()==null||wxUser.getSysUserId().equals("0")){ + return R.ok(); + } + //自动关联模板ID +// BizSignType signType = bizSignTypeService.getOne(new LambdaQueryWrapper() +// .eq(BizSignType::getTypeName,param.getSignType())); +// if(signType!=null){ +// param.setSignTypeId(signType.getId()); +// param.setFormId(signType.getTemplateId()); +// } + + String userId = wxUser.getSysUserId(); + SysUser sysUser = sysUserService.getById(userId); + param.setVisitorId(userId); + param.setVisitorCode(sysUser.getCode()); + param.setVisitorName(sysUser.getName()); + boolean result = bizVisitService.save(param); + return R.isTrue(result); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + public R deleteById(@PathVariable("id") Long id){ + WxUser wxUser = wxUserService.getCurrentWxUser(); + if(wxUser.getSysUserId()==null||wxUser.getSysUserId().equals("0")){ + return R.ok(); + } + String userId = wxUser.getSysUserId(); + BizVisit bizVisit = bizVisitService.getById(id); + if(!bizVisit.getVisitorId().equals(userId)){ + return R.ok(); + } + boolean result = bizVisitService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/my/BizVisitMyController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/my/BizVisitMyController.java new file mode 100644 index 0000000..19dd119 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/controller/my/BizVisitMyController.java @@ -0,0 +1,155 @@ +package com.qs.serve.modules.biz.controller.my; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.biz.entity.BizVisit; +import com.qs.serve.modules.biz.service.BizVisitService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.service.SysUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * 业务 拜访日志(我的) + * @author YenHex + * @since 2022-10-26 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/my/visit") +public class BizVisitMyController { + + private BizVisitService bizVisitService; + private SysUserService sysUserService; + private SysPostUserService postUserService; + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(BizVisit param){ + String userId = AuthContextUtils.getSysUserId(); + param.setVisitorId(userId); + LambdaQueryWrapper visitWrapper = this.getBizVisitLambdaQueryWrapper(param); + List list = bizVisitService.list(visitWrapper); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BizVisit param){ + String userId = AuthContextUtils.getSysUserId(); + param.setVisitorId(userId); + PageUtil.startPage(); + LambdaQueryWrapper visitWrapper = this.getBizVisitLambdaQueryWrapper(param); + List list = bizVisitService.list(visitWrapper); + return R.byPageHelperList(list); + } + + @NotNull + private LambdaQueryWrapper getBizVisitLambdaQueryWrapper(BizVisit param) { + LambdaQueryWrapper visitWrapper = new LambdaQueryWrapper<>(param); + if(param.getQueryStartTime()!=null){ + visitWrapper.ge(BizVisit::getCreateTime, param.getQueryStartTime()); + } + if(param.getQueryEndTime()!=null){ + visitWrapper.le(BizVisit::getCreateTime, param.getQueryEndTime().atTime(23,59,59)); + }if(param.getMissLocalFlag()!=null&& param.getMissLocalFlag().equals(1)){ + visitWrapper.eq(BizVisit::getLocalX,"0"); + visitWrapper.eq(BizVisit::getLocalY,"0"); + } + if(param.getMissLocalFlag()!=null&& param.getMissLocalFlag().equals(0)){ + visitWrapper.ne(BizVisit::getLocalX,"0"); + visitWrapper.ne(BizVisit::getLocalY,"0"); + } + visitWrapper.orderByDesc(BizVisit::getCreateTime); + return visitWrapper; + } + + /** + * 翻页(我的下属拜访记录) + * @param param + * @return + */ + @GetMapping("/page4Under") + public R> page4Under(BizVisit param){ + String userId = AuthContextUtils.getSysUserId(); + List userIds = postUserService.listByChildIds(userId); + if(userIds.size()<1){ + return R.byEmptyList(); + } + PageUtil.startPage(); + LambdaQueryWrapper visitWrapper = this.getBizVisitLambdaQueryWrapper(param); + visitWrapper.in(BizVisit::getVisitorId,userIds); + List list = bizVisitService.list(visitWrapper); + return R.byPageHelperList(list); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + public R updateById(@RequestBody @Valid BizVisit param){ + String userId = AuthContextUtils.getSysUserId(); + BizVisit bizVisit = bizVisitService.getById(param.getId()); + if(!bizVisit.getVisitorId().equals(userId)){ + return R.ok(); + } + boolean result = bizVisitService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + public R save(@RequestBody @Valid BizVisit param){ + String userId = AuthContextUtils.getSysUserId(); + SysUser sysUser = sysUserService.getById(userId); + param.setVisitorId(userId); + param.setVisitorCode(sysUser.getCode()); + param.setVisitorName(sysUser.getName()); + boolean result = bizVisitService.save(param); + return R.isTrue(result); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + public R deleteById(@PathVariable("id") Long id){ + String userId = AuthContextUtils.getSysUserId(); + BizVisit bizVisit = bizVisitService.getById(id); + if(!bizVisit.getVisitorId().equals(userId)){ + return R.ok(); + } + boolean result = bizVisitService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizAppLog.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizAppLog.java new file mode 100644 index 0000000..1f7a6fc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizAppLog.java @@ -0,0 +1,149 @@ +package com.qs.serve.modules.biz.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 2023-05-26 + */ +@Data +@TableName("biz_app_log") +public class BizAppLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** user-agent(后端处理) */ + private String userAgent; + + /** 设备号 */ + @Length(max = 255,message = "设备号长度不能超过255字") + private String driveCode; + + /** 错误信息 */ + @Length(max = 2000,message = "错误信息长度不能超过2000字") + private String errorMsg; + + /** 定位信息 */ + @Length(max = 2000,message = "定位信息长度不能超过2000字") + private String localMsg; + + /** 定位类型 */ + @Length(max = 255,message = "定位类型长度不能超过255字") + private String localType; + + /** sdk版本 */ + @Length(max = 255,message = "sdk版本长度不能超过255字") + private String sdkVersion; + + /** 网络信息 */ + @Length(max = 255,message = "网络信息长度不能超过255字") + private String netInfo; + + @Length(max = 255,message = "长度不能超过255字") + private String userId; + + @Length(max = 255,message = "长度不能超过255字") + private String userCode; + + @Length(max = 255,message = "长度不能超过255字") + private String userName; + + /** 拓展字段1 */ + @Length(max = 255,message = "拓展字段1长度不能超过255字") + private String sp1; + + /** 拓展字段2 */ + @Length(max = 255,message = "拓展字段2长度不能超过255字") + private String sp2; + + /** 拓展字段3 */ + @Length(max = 255,message = "拓展字段3长度不能超过255字") + private String sp3; + + /** 拓展字段4 */ + @Length(max = 255,message = "拓展字段4长度不能超过255字") + private String sp4; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + + public static BizAppLog toNewObject(BizAppLog source){ + BizAppLog appLog = new BizAppLog(); + appLog.setId(source.getId()); + appLog.setUserAgent(source.getUserAgent()); + appLog.setDriveCode(source.getDriveCode()); + appLog.setErrorMsg(source.getErrorMsg()); + appLog.setLocalMsg(source.getLocalMsg()); + appLog.setLocalType(source.getLocalType()); + appLog.setSdkVersion(source.getSdkVersion()); + appLog.setNetInfo(source.getNetInfo()); + appLog.setUserId(source.getUserId()); + appLog.setUserCode(source.getUserCode()); + appLog.setUserName(source.getUserName()); + appLog.setSp1(source.getSp1()); + appLog.setSp2(source.getSp2()); + appLog.setSp3(source.getSp3()); + appLog.setSp4(source.getSp4()); + appLog.setRemark(source.getRemark()); + appLog.setCreateTime(source.getCreateTime()); + appLog.setUpdateTime(source.getUpdateTime()); + appLog.setTenantId(source.getTenantId()); + appLog.setDelFlag(source.getDelFlag()); + appLog.setCreateBy(source.getCreateBy()); + appLog.setUpdateBy(source.getUpdateBy()); + return appLog; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizComment.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizComment.java new file mode 100644 index 0000000..b047988 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizComment.java @@ -0,0 +1,103 @@ +package com.qs.serve.modules.biz.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +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 2023-02-17 + */ +@Data +@TableName(value = "biz_comment",autoResultMap = true) +public class BizComment implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 目标类型 */ + @NotBlank(message = "目标类型不能为空") + @Length(max = 20,message = "目标类型长度不能超过20字") + private String targetType; + + /** 目标id */ + @NotBlank(message = "目标id不能为空") + @Length(max = 64,message = "目标id长度不能超过64字") + private String targetId; + + /** 用户id */ + @NotBlank(message = "用户id不能为空") + @Length(max = 40,message = "用户id长度不能超过40字") + private String userId; + + /** 用户名称 */ + @Length(max = 50,message = "用户名称长度不能超过50字") + private String userName; + + /** 头像 */ + @Length(max = 255,message = "头像长度不能超过255字") + private String userAvatar; + + /** 附件ID */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] attachIds; + + /** 内容 */ + @Length(max = 1024,message = "内容长度不能超过1024字") + private String context; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** 附件 */ + @TableField(exist = false) + private List attachList; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizCusVisit.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizCusVisit.java new file mode 100644 index 0000000..fb834a6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizCusVisit.java @@ -0,0 +1,145 @@ +package com.qs.serve.modules.biz.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 com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import com.qs.serve.modules.biz.entity.bo.BizCusVisitBo; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +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 2023-03-24 + */ +@Data +@TableName(value = "biz_cus_visit",autoResultMap = true) +public class BizCusVisit implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 图片 */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] photos; + + /** 纬度 */ + @Length(max = 255,message = "纬度长度不能超过255字") + private String localX; + + /** 经度 */ + @Length(max = 255,message = "经度长度不能超过255字") + private String localY; + + /** 目标拜访的地址 */ + @Length(max = 512,message = "地址长度不能超过512字") + private String address; + + /** 地图标记的地址 */ + private String inputAddress; + + /** 目标拜访的地址ID */ + private String addressId; + + /** 状态 */ + private Integer status; + + /** 签到类型Id */ + @NotNull(message = "签到类型不能为空") + private Long signTypeId; + + /** 类型:单选 【潜在客户签到;培训会议;其他定点签到;在家办公 】 */ + @Length(max = 255,message = "类型:单选 【潜在客户签到;培训会议;其他定点签到;在家办公 】长度不能超过255字") + private String signType; + + private String signTypeForm; + + private Long signTypeFormId; + + private String signTypeFormValue; + + /** 拜访人id */ + @Length(max = 32,message = "拜访人id长度不能超过32字") + private String visitorId; + + /** 拜访人 */ + @Length(max = 32,message = "拜访人长度不能超过32字") + private String visitorName; + + /** 客户id */ + @Length(max = 32,message = "客户id长度不能超过32字") + private String customerId; + + /** 客户名 */ + @Length(max = 255,message = "客户名长度不能超过255字") + private String customerName; + + /** 客户编号 */ + @Length(max = 255,message = "客户编号长度不能超过255字") + private String customerCode; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + + public static BizCusVisit toNewObject(BizCusVisitBo source){ + BizCusVisit cusVisit = new BizCusVisit(); + cusVisit.setId(source.getId()); + cusVisit.setPhotos(source.getPhotos()); + cusVisit.setLocalX(source.getLocalX()); + cusVisit.setLocalY(source.getLocalY()); + cusVisit.setAddressId(source.getAddressId()); + cusVisit.setCustomerId(source.getCustomerId()); + cusVisit.setRemark(source.getRemark()); + cusVisit.setInputAddress(source.getInputAddress()); + return cusVisit; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizSignType.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizSignType.java new file mode 100644 index 0000000..6f13733 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizSignType.java @@ -0,0 +1,94 @@ +package com.qs.serve.modules.biz.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-09-04 + */ +@Data +@TableName("biz_sign_type") +public class BizSignType implements Serializable { + + private static final long serialVersionUID = 1L; + + /** ID */ + @TableId(type = IdType.AUTO) + private String id; + + /** 签到类型 */ + @NotBlank(message = "签到类型不能为空") + @Length(max = 255,message = "签到类型长度不能超过255字") + private String typeName; + + /** 模板ID */ + @Length(max = 255,message = "模板ID长度不能超过255字") + private String templateId; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + + public static BizSignType toNewObject(BizSignType source){ + BizSignType signType = new BizSignType(); + signType.setId(source.getId()); + signType.setTypeName(source.getTypeName()); + signType.setTemplateId(source.getTemplateId()); + signType.setRemark(source.getRemark()); + signType.setCreateTime(source.getCreateTime()); + signType.setUpdateTime(source.getUpdateTime()); + signType.setTenantId(source.getTenantId()); + signType.setDelFlag(source.getDelFlag()); + signType.setCreateBy(source.getCreateBy()); + signType.setUpdateBy(source.getUpdateBy()); + return signType; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizUserGroup.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizUserGroup.java new file mode 100644 index 0000000..b5a8c82 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizUserGroup.java @@ -0,0 +1,94 @@ +package com.qs.serve.modules.biz.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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 2023-10-25 + */ +@Data +@TableName("biz_user_group") +public class BizUserGroup implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 分组名称 */ + @Length(max = 255,message = "分组名称长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String groupName; + + /** 用户ID */ + @Length(max = 255,message = "用户ID长度不能超过255字") + private String userId; + + /** 用户编码 */ + @Length(max = 255,message = "用户编码长度不能超过255字") + private String userCode; + + /** 用户名称 */ + @Length(max = 255,message = "用户名称长度不能超过255字") + private String userName; + + /** 应用场景 */ + @Length(max = 255,message = "应用场景长度不能超过255字") + private String scene; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** */ + @JsonIgnore + @JsonProperty + private String tenantId; + + @TableField(exist = false) + List groupItemList; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizUserGroupItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizUserGroupItem.java new file mode 100644 index 0000000..fcb5ee3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizUserGroupItem.java @@ -0,0 +1,90 @@ +package com.qs.serve.modules.biz.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 2023-10-25 + */ +@Data +@TableName("biz_user_group_item") +public class BizUserGroupItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 分组名称 */ + private Long groupId; + + /** 数据类型:user;dept等 */ + @Length(max = 255,message = "数据类型:user;dept等长度不能超过255字") + private String targetType; + + /** 目标id */ + @Length(max = 255,message = "目标id长度不能超过255字") + private String targetId; + + /** 目标 */ + @Length(max = 255,message = "目标长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String targetName; + + /** 目标编码 */ + @Length(max = 255,message = "目标编码长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String targetCode; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** */ + @JsonIgnore + @JsonProperty + private String tenantId; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizVisit.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizVisit.java new file mode 100644 index 0000000..f9a30e3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizVisit.java @@ -0,0 +1,150 @@ +package com.qs.serve.modules.biz.entity; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +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 2022-10-26 + */ +@Data +@TableName(value = "biz_visit",autoResultMap = true) +public class BizVisit implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 图片 */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] photos; + + /** 纬度 */ + @Length(max = 255,message = "纬度长度不能超过255字") + private String localX; + + /** 经度 */ + @Length(max = 255,message = "经度长度不能超过255字") + private String localY; + + /** 地址 */ + @Length(max = 512,message = "地址长度不能超过512字") + private String address; + + /** 省 */ + private String extProvince; + + /** 城市 */ + private String extCity; + + /** 区 */ + private String extRegionArea; + + /** 乡镇 */ + private String extTownship; + + /** 街道 */ + private String extStreet; + + /** 街道编号 */ + private String extStreetNumber; + + /** 类型:单选 【潜在客户签到;培训会议;其他定点签到;在家办公 】 */ + private String signType; + + /** 签到类型ID */ + private String signTypeId; + + /** 表单ID */ + private String formId; + + /** 表单标题 */ + private String formTitle; + + /** 表单设置 */ + private String formSettings; + + /** 表单值 */ + private String formValues; + + /** 表单版本 */ + private String formVersion; + + /** 拜访人id */ + @Length(max = 32,message = "拜访人id长度不能超过32字") + private String visitorId; + + @TableField(condition = SqlCondition.LIKE) + private String visitorCode; + + /** 拜访人 */ + @Length(max = 32,message = "拜访人长度不能超过32字") + @TableField(condition = SqlCondition.LIKE) + private String visitorName; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate queryStartTime; + + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate queryEndTime; + + @TableField(exist = false) + private Integer missLocalFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizVisitForm.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizVisitForm.java new file mode 100644 index 0000000..5ba1f26 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/BizVisitForm.java @@ -0,0 +1,107 @@ +package com.qs.serve.modules.biz.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-09-05 + */ +@Data +@TableName("biz_visit_form") +public class BizVisitForm implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 标题 */ + @NotBlank(message = "标题不能为空") + @Length(max = 40,message = "标题长度不能超过40字") + private String title; + + /** 子标题 */ + @Length(max = 255,message = "子标题长度不能超过255字") + private String subtitle; + + /** 描述 */ + @Length(max = 255,message = "描述长度不能超过255字") + private String descr; + + /** 表单json */ + @NotBlank(message = "表单json不能为空") + private String formContext; + + /** 表单版本 */ + private Integer version; + + /** 表单类型 */ + private Integer formType; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + + public static BizVisitForm toNewObject(BizVisitForm source){ + BizVisitForm visitForm = new BizVisitForm(); + visitForm.setId(source.getId()); + visitForm.setTitle(source.getTitle()); + visitForm.setSubtitle(source.getSubtitle()); + visitForm.setDescr(source.getDescr()); + visitForm.setFormContext(source.getFormContext()); + visitForm.setVersion(source.getVersion()); + visitForm.setFormType(source.getFormType()); + visitForm.setCreateTime(source.getCreateTime()); + visitForm.setCreateBy(source.getCreateBy()); + visitForm.setUpdateTime(source.getUpdateTime()); + visitForm.setUpdateBy(source.getUpdateBy()); + visitForm.setTenantId(source.getTenantId()); + visitForm.setDelFlag(source.getDelFlag()); + return visitForm; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/bo/BizCommentBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/bo/BizCommentBo.java new file mode 100644 index 0000000..08e2624 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/bo/BizCommentBo.java @@ -0,0 +1,52 @@ +package com.qs.serve.modules.biz.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.TableField; +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; + +/** + * 通用的评论 Bo + * @author YenHex + * @since 2023-02-17 + */ +@Data +public class BizCommentBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 目标类型 */ + @NotBlank(message = "目标类型不能为空") + private String targetType; + + /** 目标id */ + @NotBlank(message = "目标id不能为空") + @Length(max = 64,message = "目标id长度不能超过64字") + private String targetId; + + /** 附件ID */ + private String[] attachIds; + + /** 内容 */ + @Length(max = 1024,message = "内容长度不能超过1024字") + private String context; + + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/bo/BizCusVisitBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/bo/BizCusVisitBo.java new file mode 100644 index 0000000..12c0c34 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/bo/BizCusVisitBo.java @@ -0,0 +1,73 @@ +package com.qs.serve.modules.biz.entity.bo; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * 拜访日志 实体类 + * @author YenHex + * @since 2023-03-24 + */ +@Data +public class BizCusVisitBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 图片 */ + private String[] photos; + + /** 纬度 */ + private String localX; + + /** 经度 */ + private String localY; + + /** 地址 */ + private String addressId; + + /** 地图标记的地址 */ + private String inputAddress; + + /** 签到类型Id */ + private Long signTypeId; + + /** 客户id */ + private String customerId; + + /** 状态 */ + private Integer status; + + /** + * 填写的表单内容 + */ + private String formJson; + + /** + * 计划下次访问时间 + */ + private LocalDate nextTimeVisit; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 指定的下属 */ + private String userId; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/bo/BizUserGroupBatchBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/bo/BizUserGroupBatchBo.java new file mode 100644 index 0000000..ee0ad1c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/bo/BizUserGroupBatchBo.java @@ -0,0 +1,41 @@ +package com.qs.serve.modules.biz.entity.bo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import java.util.List; + +/** + * @author YenHex + * @since 2023/10/25 + */ +@Data +public class BizUserGroupBatchBo { + + /** id */ + private Long id; + + /** 分组名称 */ + private String groupName; + + /** 应用场景 */ + private String scene; + + /** 备注 */ + private String remark; + + private List items; + + private Integer editGroupFlag; + + @Data + public static class Item{ + + private String targetType; + + private String targetId; + + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/bo/BizUserGroupItemBatchBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/bo/BizUserGroupItemBatchBo.java new file mode 100644 index 0000000..f000d78 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/bo/BizUserGroupItemBatchBo.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.biz.entity.bo; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/10/25 + */ +@Data +public class BizUserGroupItemBatchBo { + + private Long groupId; + + private List items; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/so/BizCommentSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/so/BizCommentSo.java new file mode 100644 index 0000000..9d229bd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/so/BizCommentSo.java @@ -0,0 +1,79 @@ +package com.qs.serve.modules.biz.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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 2023-02-17 + */ +@Data +public class BizCommentSo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 目标类型 */ + @NotNull(message = "targetType is not null") + private String targetType; + + /** 目标id */ + @NotNull(message = "targetId is not null") + private String targetId; + + /** 用户id */ + private String userId; + + /** 用户名称 */ + private String userName; + + /** 头像 */ + private String userAvatar; + + /** 附件ID */ + private String docId; + + /** 内容 */ + private String context; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 创建人 */ + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 更新人 */ + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/so/BizSignTypeQuery.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/so/BizSignTypeQuery.java new file mode 100644 index 0000000..39a26f9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/so/BizSignTypeQuery.java @@ -0,0 +1,15 @@ +package com.qs.serve.modules.biz.entity.so; + +import lombok.Data; + +/** + * @author YenHex + * @since 2024/9/5 + */ +@Data +public class BizSignTypeQuery { + + private String typeName; + private String templateId; + private String templateName; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/vo/BizSignTypeVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/vo/BizSignTypeVo.java new file mode 100644 index 0000000..1676d58 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/entity/vo/BizSignTypeVo.java @@ -0,0 +1,21 @@ +package com.qs.serve.modules.biz.entity.vo; + +import com.qs.serve.modules.biz.entity.BizSignType; +import lombok.Data; + +/** + * @author YenHex + * @since 2024/9/5 + */ +@Data +public class BizSignTypeVo extends BizSignType { + + private String templateName; + + /** 表单内容 */ + private String formContext; + + /** 表单版本 */ + private Integer version; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizAppLogMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizAppLogMapper.java new file mode 100644 index 0000000..ee7067c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizAppLogMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.biz.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.biz.entity.BizAppLog; + +/** + * Mapper + * @author YenHex + * @since 2023-05-26 + */ +public interface BizAppLogMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizCommentMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizCommentMapper.java new file mode 100644 index 0000000..26b31ae --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizCommentMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.biz.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.biz.entity.BizComment; + +/** + * 通用的评论 Mapper + * @author YenHex + * @date 2023-02-17 + */ +public interface BizCommentMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizCusVisitMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizCusVisitMapper.java new file mode 100644 index 0000000..1a27fcb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizCusVisitMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.biz.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.biz.entity.BizCusVisit; + +/** + * 拜访日志 Mapper + * @author YenHex + * @date 2023-03-24 + */ +public interface BizCusVisitMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizSignTypeMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizSignTypeMapper.java new file mode 100644 index 0000000..6464a3e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizSignTypeMapper.java @@ -0,0 +1,21 @@ +package com.qs.serve.modules.biz.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.biz.entity.BizSignType; +import com.qs.serve.modules.biz.entity.so.BizSignTypeQuery; +import com.qs.serve.modules.biz.entity.vo.BizSignTypeVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Mapper + * @author YenHex + * @date 2024-09-04 + */ +public interface BizSignTypeMapper extends BaseMapper { + + List selectBizSignTypeVoList(@Param("query") BizSignTypeQuery query); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizUserGroupItemMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizUserGroupItemMapper.java new file mode 100644 index 0000000..c9f0151 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizUserGroupItemMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.biz.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.biz.entity.BizUserGroupItem; + +/** + * 税务信息表 Mapper + * @author YenHex + * @date 2023-10-25 + */ +public interface BizUserGroupItemMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizUserGroupMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizUserGroupMapper.java new file mode 100644 index 0000000..c5b9504 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizUserGroupMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.biz.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.biz.entity.BizUserGroup; + +/** + * 税务信息表 Mapper + * @author YenHex + * @date 2023-10-25 + */ +public interface BizUserGroupMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizVisitFormMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizVisitFormMapper.java new file mode 100644 index 0000000..ab6a1c7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizVisitFormMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.biz.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.biz.entity.BizVisitForm; + +/** + * 科目表单 Mapper + * @author YenHex + * @date 2024-09-05 + */ +public interface BizVisitFormMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizVisitMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizVisitMapper.java new file mode 100644 index 0000000..9db2318 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/mapper/BizVisitMapper.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.biz.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.biz.entity.BizVisit; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 拜访日志 Mapper + * @author YenHex + * @date 2022-10-26 + */ +public interface BizVisitMapper extends BaseMapper { + + @InterceptorIgnore(tenantLine = "1") + @Select("SELECT " + + " sign_type " + + "FROM " + + " biz_visit " + + "WHERE " + + " del_flag = '0' " + + " group BY sign_type " + + " order by sign_type") + List selectAllSignType(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizAppLogService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizAppLogService.java new file mode 100644 index 0000000..cc41954 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizAppLogService.java @@ -0,0 +1,36 @@ +package com.qs.serve.modules.biz.service; + + +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.modules.biz.entity.BizAppLog; + +import java.util.Collection; +import java.util.List; + +/** + * 服务接口 + * @author YenHex + * @since 2023-05-26 + */ +public interface BizAppLogService{ + + /** 新增 */ + BizAppLog getById(String id); + + /** 翻页查询 */ + //PageVo queryPage(BizAppLog param, PageQuery pageQuery); + + /** 列表查询 */ + List queryList(BizAppLog param); + + /** 新增 */ + Boolean save(BizAppLog param); + + /** 修改 */ + Boolean updateById(BizAppLog param); + + /** 删除 */ + Boolean removeByIds(Collection ids); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizCommentService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizCommentService.java new file mode 100644 index 0000000..5602256 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizCommentService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.biz.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.biz.entity.BizComment; + +/** + * 通用的评论 服务接口 + * @author YenHex + * @date 2023-02-17 + */ +public interface BizCommentService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizCusVisitService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizCusVisitService.java new file mode 100644 index 0000000..f4896c1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizCusVisitService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.biz.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.biz.entity.BizCusVisit; + +/** + * 拜访日志 服务接口 + * @author YenHex + * @date 2023-03-24 + */ +public interface BizCusVisitService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizSignTypeService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizSignTypeService.java new file mode 100644 index 0000000..bf25d56 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizSignTypeService.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.biz.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.biz.entity.BizSignType; +import com.qs.serve.modules.biz.entity.so.BizSignTypeQuery; +import com.qs.serve.modules.biz.entity.vo.BizSignTypeVo; + +import java.util.List; + +/** + * 服务接口 + * @author YenHex + * @date 2024-09-04 + */ +public interface BizSignTypeService extends IService { + + List selectSignTypes(BizSignTypeQuery query); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizUserGroupItemService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizUserGroupItemService.java new file mode 100644 index 0000000..6745af7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizUserGroupItemService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.biz.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.biz.entity.BizUserGroupItem; + +/** + * 税务信息表 服务接口 + * @author YenHex + * @date 2023-10-25 + */ +public interface BizUserGroupItemService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizUserGroupService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizUserGroupService.java new file mode 100644 index 0000000..0c092a7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizUserGroupService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.biz.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.biz.entity.BizUserGroup; + +/** + * 税务信息表 服务接口 + * @author YenHex + * @date 2023-10-25 + */ +public interface BizUserGroupService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizVisitFormService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizVisitFormService.java new file mode 100644 index 0000000..1ccabdf --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizVisitFormService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.biz.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.biz.entity.BizVisitForm; + +/** + * 科目表单 服务接口 + * @author YenHex + * @date 2024-09-05 + */ +public interface BizVisitFormService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizVisitService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizVisitService.java new file mode 100644 index 0000000..2b3e8bd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/BizVisitService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.biz.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.biz.entity.BizVisit; + +/** + * 拜访日志 服务接口 + * @author YenHex + * @date 2022-10-26 + */ +public interface BizVisitService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizAppLogServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizAppLogServiceImpl.java new file mode 100644 index 0000000..513c70c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizAppLogServiceImpl.java @@ -0,0 +1,91 @@ +package com.qs.serve.modules.biz.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.ServletUtils; +import com.qs.serve.modules.biz.entity.BizAppLog; +import com.qs.serve.modules.biz.mapper.BizAppLogMapper; +import com.qs.serve.modules.biz.service.BizAppLogService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import java.util.*; + +/** + * 服务实现类 + * @author YenHex + * @since 2023-05-26 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BizAppLogServiceImpl implements BizAppLogService { + + private final BizAppLogMapper bizAppLogMapper; + private final SysUserMapper sysUserMapper; + + @Override + public BizAppLog getById(String id){ + return bizAppLogMapper.selectById(id); + } + + @Override + public List queryList(BizAppLog param) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + return bizAppLogMapper.selectList(lqw); + } + + @Override + public Boolean save(BizAppLog param) { + BizAppLog appLog = new BizAppLog(); + String agentString = ServletUtils.getHeader("User-Agent"); + param.setUserAgent(agentString); + SysUser sysUser = sysUserMapper.selectById(AuthContextUtils.getSysUserId()); + appLog.setUserId(sysUser.getId()); + appLog.setUserName(sysUser.getName()); + appLog.setUserCode(sysUser.getCode()); + appLog.setUserAgent(param.getUserAgent()); + appLog.setDriveCode(param.getDriveCode()); + appLog.setErrorMsg(param.getErrorMsg()); + appLog.setLocalMsg(param.getLocalMsg()); + appLog.setLocalType(param.getLocalType()); + appLog.setSdkVersion(param.getSdkVersion()); + appLog.setNetInfo(param.getNetInfo()); + appLog.setSp1(param.getSp1()); + appLog.setSp2(param.getSp2()); + appLog.setSp3(param.getSp3()); + appLog.setSp4(param.getSp4()); + boolean flag = bizAppLogMapper.insert(appLog) > 0; + if (flag) { + param.setId(appLog.getId()); + } + return flag; + } + + @Override + public Boolean updateById(BizAppLog param) { + BizAppLog appLog = new BizAppLog(); + appLog.setId(param.getId()); + appLog.setUserAgent(param.getUserAgent()); + appLog.setDriveCode(param.getDriveCode()); + appLog.setErrorMsg(param.getErrorMsg()); + appLog.setLocalMsg(param.getLocalMsg()); + appLog.setLocalType(param.getLocalType()); + appLog.setSdkVersion(param.getSdkVersion()); + appLog.setNetInfo(param.getNetInfo()); + appLog.setSp1(param.getSp1()); + appLog.setSp2(param.getSp2()); + appLog.setSp3(param.getSp3()); + appLog.setSp4(param.getSp4()); + return bizAppLogMapper.updateById(appLog) > 0; + } + + @Override + public Boolean removeByIds(Collection ids) { + return bizAppLogMapper.deleteBatchIds(ids) > 0; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizCommentServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizCommentServiceImpl.java new file mode 100644 index 0000000..0492c7a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizCommentServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.biz.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.biz.entity.BizComment; +import com.qs.serve.modules.biz.service.BizCommentService; +import com.qs.serve.modules.biz.mapper.BizCommentMapper; + +/** + * 通用的评论 服务实现类 + * @author YenHex + * @since 2023-02-17 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BizCommentServiceImpl extends ServiceImpl implements BizCommentService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizCusVisitServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizCusVisitServiceImpl.java new file mode 100644 index 0000000..7247381 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizCusVisitServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.biz.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.biz.entity.BizCusVisit; +import com.qs.serve.modules.biz.service.BizCusVisitService; +import com.qs.serve.modules.biz.mapper.BizCusVisitMapper; + +/** + * 拜访日志 服务实现类 + * @author YenHex + * @since 2023-03-24 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BizCusVisitServiceImpl extends ServiceImpl implements BizCusVisitService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizSignTypeServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizSignTypeServiceImpl.java new file mode 100644 index 0000000..6f2cc3b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizSignTypeServiceImpl.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.biz.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.biz.entity.so.BizSignTypeQuery; +import com.qs.serve.modules.biz.entity.vo.BizSignTypeVo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.biz.entity.BizSignType; +import com.qs.serve.modules.biz.service.BizSignTypeService; +import com.qs.serve.modules.biz.mapper.BizSignTypeMapper; + +import java.util.List; + +/** + * 服务实现类 + * @author YenHex + * @since 2024-09-04 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BizSignTypeServiceImpl extends ServiceImpl implements BizSignTypeService { + + @Override + public List selectSignTypes(BizSignTypeQuery query) { + return baseMapper.selectBizSignTypeVoList(query); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizUserGroupApplicationService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizUserGroupApplicationService.java new file mode 100644 index 0000000..4eeb2f4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizUserGroupApplicationService.java @@ -0,0 +1,90 @@ +package com.qs.serve.modules.biz.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.biz.consts.GroupDataType; +import com.qs.serve.modules.biz.entity.BizUserGroup; +import com.qs.serve.modules.biz.entity.BizUserGroupItem; +import com.qs.serve.modules.biz.entity.bo.BizUserGroupBatchBo; +import com.qs.serve.modules.biz.service.BizUserGroupItemService; +import com.qs.serve.modules.biz.service.BizUserGroupService; +import com.qs.serve.modules.sys.entity.SysDept; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysDeptService; +import com.qs.serve.modules.sys.service.SysUserService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author YenHex + * @since 2023/10/25 + */ +@Service +@AllArgsConstructor +public class BizUserGroupApplicationService { + + private BizUserGroupService bizUserGroupService; + private BizUserGroupItemService bizUserGroupItemService; + private SysUserService sysUserService; + private SysDeptService sysDeptService; + + + /** + * 编辑 (场景:同时编辑分组数据) + * @param param + * @return*/ + @Transactional(rollbackFor = Exception.class) + public void editWithItem(BizUserGroupBatchBo param){ + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + BizUserGroup bizUserGroup = new BizUserGroup(); + if(param.getId()!=null){ + bizUserGroup = bizUserGroupService.getById(param.getId()); + if(!bizUserGroup.getUserId().equals(AuthContextUtils.getSysUserId())){ + Assert.throwEx("无相关数据"); + } + } + if(param.getEditGroupFlag().equals(1)){ + bizUserGroup.setGroupName(param.getGroupName()); + bizUserGroup.setUserId(sysUser.getId()); + bizUserGroup.setUserCode(sysUser.getCode()); + bizUserGroup.setUserName(sysUser.getName()); + bizUserGroup.setScene(param.getScene()); + bizUserGroup.setRemark(param.getRemark()); + bizUserGroupService.saveOrUpdate(bizUserGroup); + } + Long groupId = bizUserGroup.getId(); + //移除历史ITEM + if(param.getEditGroupFlag().equals(1)){ + LambdaQueryWrapper itemLqw = new LambdaQueryWrapper<>(); + itemLqw.eq(BizUserGroupItem::getGroupId,groupId); + bizUserGroupItemService.remove(itemLqw); + } + //保存item + List groupItemList = new ArrayList<>(); + for (BizUserGroupBatchBo.Item item : param.getItems()) { + BizUserGroupItem groupItem = new BizUserGroupItem(); + groupItem.setGroupId(groupId); + groupItem.setTargetType(item.getTargetType()); + groupItem.setTargetId(item.getTargetId()); + if(item.getTargetType().equals(GroupDataType.USER)){ + SysUser user = sysUserService.getById(item.getTargetId()); + groupItem.setTargetName(user.getName()); + groupItem.setTargetCode(user.getCode()); + }else if (item.getTargetType().equals(GroupDataType.DEPT)){ + SysDept dept = sysDeptService.getById(item.getTargetId()); + groupItem.setTargetName(dept.getName()); + groupItem.setTargetCode(dept.getCode()); + }else { + continue; + } + groupItemList.add(groupItem); + } + bizUserGroupItemService.saveBatch(groupItemList); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizUserGroupItemServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizUserGroupItemServiceImpl.java new file mode 100644 index 0000000..db99236 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizUserGroupItemServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.biz.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.biz.entity.BizUserGroupItem; +import com.qs.serve.modules.biz.service.BizUserGroupItemService; +import com.qs.serve.modules.biz.mapper.BizUserGroupItemMapper; + +/** + * 税务信息表 服务实现类 + * @author YenHex + * @since 2023-10-25 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BizUserGroupItemServiceImpl extends ServiceImpl implements BizUserGroupItemService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizUserGroupServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizUserGroupServiceImpl.java new file mode 100644 index 0000000..2121796 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizUserGroupServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.biz.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.biz.entity.BizUserGroup; +import com.qs.serve.modules.biz.service.BizUserGroupService; +import com.qs.serve.modules.biz.mapper.BizUserGroupMapper; + +/** + * 税务信息表 服务实现类 + * @author YenHex + * @since 2023-10-25 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BizUserGroupServiceImpl extends ServiceImpl implements BizUserGroupService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizVisitFormServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizVisitFormServiceImpl.java new file mode 100644 index 0000000..5ab19de --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizVisitFormServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.biz.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.biz.entity.BizVisitForm; +import com.qs.serve.modules.biz.service.BizVisitFormService; +import com.qs.serve.modules.biz.mapper.BizVisitFormMapper; + +/** + * 科目表单 服务实现类 + * @author YenHex + * @since 2024-09-05 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BizVisitFormServiceImpl extends ServiceImpl implements BizVisitFormService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizVisitServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizVisitServiceImpl.java new file mode 100644 index 0000000..86ca18b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/biz/service/impl/BizVisitServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.biz.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.biz.entity.BizVisit; +import com.qs.serve.modules.biz.service.BizVisitService; +import com.qs.serve.modules.biz.mapper.BizVisitMapper; + +/** + * 拜访日志 服务实现类 + * @author YenHex + * @since 2022-10-26 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BizVisitServiceImpl extends ServiceImpl implements BizVisitService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/common/BookAccountUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/common/BookAccountUtil.java new file mode 100644 index 0000000..e322e1e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/common/BookAccountUtil.java @@ -0,0 +1,56 @@ +package com.qs.serve.modules.bms.common; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.SpringUtils; +import com.qs.serve.modules.bms.entity.BmsAccountUser; +import com.qs.serve.modules.bms.mapper.BmsAccountUserMapper; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2024/4/18 + */ +public class BookAccountUtil { + + public static final String USER_CACHE_BOOK_PREFIX = ""; + + public static List getCurrentUserAccount(){ + String userId = AuthContextUtils.getSysUserId(); + BmsAccountUserMapper mapper = SpringUtils.getBean(BmsAccountUserMapper.class); + List bookAccList = mapper.selectList(new LambdaQueryWrapper() + .eq(BmsAccountUser::getUserId,userId)).stream().map(BmsAccountUser::getBookCode).collect(Collectors.toList()); + if(CollUtil.isEmpty(bookAccList)){ + bookAccList = new ArrayList<>(); + bookAccList.add("0"); + } + return bookAccList; +// String userId = AuthContextUtils.getSysUserId(); +// RedisService redisService = SpringUtils.getBean(RedisService.class); +// String json = redisService.getString(USER_CACHE_BOOK_PREFIX+userId); +// if(json==null){ +// List bookAccList = new ArrayList<>(); +// bookAccList.add("-999"); +// return bookAccList; +// } +// return JsonUtil.jsonToList(json,String.class); + } + +// public static void setCache(String userId){ +// RedisService redisService = SpringUtils.getBean(RedisService.class); +// BmsAccountUserMapper mapper = SpringUtils.getBean(BmsAccountUserMapper.class); +// List bookAccList = mapper.selectList(new LambdaQueryWrapper() +// .eq(BmsAccountUser::getUserId,userId)).stream().map(BmsAccountUser::getBookCode).collect(Collectors.toList()); +// if(CollUtil.isEmpty(bookAccList)){ +// bookAccList = new ArrayList<>(); +// bookAccList.add("-999"); +// } +// String json = JsonUtil.objectToJson(bookAccList); +// redisService.set(USER_CACHE_BOOK_PREFIX+userId,json); +// } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/common/CenterExtendBuildType.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/common/CenterExtendBuildType.java new file mode 100644 index 0000000..0dfd41d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/common/CenterExtendBuildType.java @@ -0,0 +1,13 @@ +package com.qs.serve.modules.bms.common; + +/** + * @author YenHex + * @since 2023/7/17 + */ +public interface CenterExtendBuildType { + + String DATA = "data"; + String TREE = "tree"; + String ERROR = "err"; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/common/FactoryIdOperation.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/common/FactoryIdOperation.java new file mode 100644 index 0000000..8ec69b4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/common/FactoryIdOperation.java @@ -0,0 +1,6 @@ +package com.qs.serve.modules.bms.common; + +public interface FactoryIdOperation { + String Add = "Add"; + String Del = "del"; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/common/MasterUserType.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/common/MasterUserType.java new file mode 100644 index 0000000..debe71d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/common/MasterUserType.java @@ -0,0 +1,15 @@ +package com.qs.serve.modules.bms.common; + +/** + * @author YenHex + * @since 2022/11/11 + */ +public interface MasterUserType { + + String Channel = "channel"; + + String Point = "point"; + + String Center = "center"; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsAccountController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsAccountController.java new file mode 100644 index 0000000..3624a7f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsAccountController.java @@ -0,0 +1,100 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.BmsAccount; +import com.qs.serve.modules.bms.service.BmsAccountService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 基础档案 账套 + * @author YenHex + * @since 2024-04-11 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/account") +public class BmsAccountController { + + private BmsAccountService bmsAccountService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(BmsAccount param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = bmsAccountService.list(lqw); + return R.ok(list); + } + + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "账套", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + BmsAccount bmsAccount = bmsAccountService.getById(id); + return R.ok(bmsAccount); + } + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "账套", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid BmsAccount param){ + boolean result = bmsAccountService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "账套", biz = BizType.INSERT) + public R save(@RequestBody @Valid BmsAccount param){ + boolean result = bmsAccountService.save(param); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BASE, title = "账套", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = bmsAccountService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsAccountUserController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsAccountUserController.java new file mode 100644 index 0000000..966519e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsAccountUserController.java @@ -0,0 +1,77 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.entity.bo.BmsAccountUserBo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.BmsAccountUser; +import com.qs.serve.modules.bms.service.BmsAccountUserService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 基础档案 账套的用户 + * @author YenHex + * @since 2024-04-11 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/accountUser") +public class BmsAccountUserController { + + private BmsAccountUserService bmsAccountUserService; + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BmsAccountUser param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = bmsAccountUserService.list(lqw); + return R.byPageHelperList(list); + } + + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/saveBatch") + @SysLog(module = SystemModule.BASE, title = "账套的用户", biz = BizType.INSERT) + public R save(@RequestBody @Valid BmsAccountUserBo param){ + bmsAccountUserService.modify(param); + return R.ok(); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BASE, title = "账套的用户", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = bmsAccountUserService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsApplyMessageController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsApplyMessageController.java new file mode 100644 index 0000000..8f48189 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsApplyMessageController.java @@ -0,0 +1,146 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.consts.ApplyTypeConst; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.common.model.enums.BizType; +import com.qs.serve.common.model.enums.SystemModule; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.entity.bo.BmsApplyMessageTestBo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.BmsApplyMessage; +import com.qs.serve.modules.bms.service.BmsApplyMessageService; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 基础档案 申请信息 + * @author YenHex + * @since 2023-09-18 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/applyMessage") +public class BmsApplyMessageController { + + private BmsApplyMessageService bmsApplyMessageService; + + /** + * 业务类型 下拉框 + * @return + */ + @GetMapping("/option") + public R option(){ + List options = new ArrayList<>(); + SimpleKeyValue value1 = new SimpleKeyValue("费用申请",ApplyTypeConst.CostBill,""); + SimpleKeyValue value2 = new SimpleKeyValue("核销申请",ApplyTypeConst.CheckCost,""); + SimpleKeyValue value3 = new SimpleKeyValue("政策申请", ApplyTypeConst.ReleasePolicy,""); + options.add(value1); + options.add(value2); + options.add(value3); + return R.ok(options); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BmsApplyMessage param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = bmsApplyMessageService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "申请信息", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + BmsApplyMessage bmsApplyMessage = bmsApplyMessageService.getById(id); + return R.ok(bmsApplyMessage); + } + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "申请信息", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid BmsApplyMessage param){ + boolean result = bmsApplyMessageService.updateById(param); + return R.isTrue(result); + } + + /** + * 更新状态 + * @param param + * @return + */ + @PostMapping("/enable") + @SysLog(module = SystemModule.BASE, title = "申请信息", biz = BizType.UPDATE) + public R enableById(@RequestBody BmsApplyMessage param){ + BmsApplyMessage upd = new BmsApplyMessage(); + upd.setId(param.getId()); + upd.setEnableFlag(param.getEnableFlag()); + boolean result = bmsApplyMessageService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "申请信息", biz = BizType.INSERT) + public R save(@RequestBody @Valid BmsApplyMessage param){ + boolean result = bmsApplyMessageService.save(param); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BASE, title = "申请信息", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = bmsApplyMessageService.removeByIds(idsLong); + return R.isTrue(result); + } + + /** + * 获取执行js代码 + * @param param + * @return + */ + @PostMapping("getExecuteJsString") + public R getSeeYonData(@RequestBody @Valid BmsApplyMessageTestBo param){ + return R.ok(bmsApplyMessageService.getSeeYonData(param)); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsCenterExtendController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsCenterExtendController.java new file mode 100644 index 0000000..fc437c9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsCenterExtendController.java @@ -0,0 +1,155 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.entity.BmsCenterExtendUser; +import com.qs.serve.modules.bms.entity.bo.BmsCenterExtendBo; +import com.qs.serve.modules.bms.service.BmsCenterExtendBuildService; +import com.qs.serve.modules.bms.service.BmsCenterExtendUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.omg.CORBA.DynAnyPackage.Invalid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.so.BmsCenterExtendSo; +import com.qs.serve.modules.bms.entity.BmsCenterExtend; +import com.qs.serve.modules.bms.service.BmsCenterExtendService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 基础档案 后继成本中心 + * @author YenHex + * @since 2023-05-30 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/centerExtend") +public class BmsCenterExtendController { + + private BmsCenterExtendService bmsCenterExtendService; + private BmsCenterExtendUserService bmsCenterExtendUserService; + private BmsCenterExtendBuildService bmsCenterExtendBuildService; + + /** + * 列表 + * @param param + * @return + */ + //@GetMapping("/list") + @PreAuthorize("hasRole('bms:centerExtend:query')") + public R> getList(BmsCenterExtendSo param){ + BmsCenterExtend entity = CopierUtil.copy(param,new BmsCenterExtend()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + List list = bmsCenterExtendService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BmsCenterExtendSo param){ + BmsCenterExtend entity = CopierUtil.copy(param,new BmsCenterExtend()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + lqw.eq(BmsCenterExtend::getSourceId,0); + PageUtil.startPage(); + List list = bmsCenterExtendService.list(lqw); + for (BmsCenterExtend centerExtend : list) { + LambdaQueryWrapper childLqw = new LambdaQueryWrapper<>(); + childLqw.eq(BmsCenterExtend::getSourceId,centerExtend.getId()); + List childList = bmsCenterExtendService.list(childLqw); + centerExtend.setChildList(childList); + } + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "后继成本中心", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + BmsCenterExtend centerExtend = bmsCenterExtendService.getById(id); + LambdaQueryWrapper childLqw = new LambdaQueryWrapper<>(); + childLqw.eq(BmsCenterExtend::getSourceId,centerExtend.getId()); + List childList = bmsCenterExtendService.list(childLqw); + for (BmsCenterExtend childExt : childList) { + LambdaQueryWrapper userLqw = new LambdaQueryWrapper<>(); + userLqw.eq(BmsCenterExtendUser::getChildExtId,childExt.getId()); + List userList = bmsCenterExtendUserService.list(userLqw); + childExt.setUserList(userList); + } + centerExtend.setChildList(childList); + return R.ok(centerExtend); + } + + + /** + * 保存均摊 + * @param param + * @return + */ + @PostMapping("/allocation4Save") + @SysLog(module = SystemModule.BASE, title = "后继成本中心", biz = BizType.INSERT) + public R allocation(@RequestBody BmsCenterExtendBo param){ + if(param.getId()!=null){ + return R.error("Invalid"); + } + BmsCenterExtend detail = bmsCenterExtendService.allocation(param); + return R.ok(detail); + } + + /** + * 更新均摊(加删除子节点) + * @param param + * @return + */ + @PostMapping("/allocation4Update") + @SysLog(module = SystemModule.BASE, title = "后继成本中心", biz = BizType.UPDATE) + public R allocation4Update(@RequestBody BmsCenterExtendBo param){ + if(param.getId()==null){ + return R.error("Invalid"); + } + bmsCenterExtendService.allocation(param); + return R.ok(); + } + + /** + * 删除均摊关系,并恢复到未继承状态 + * @param id + * @return + */ + @DeleteMapping("/deleteAndReply/{id}") + @SysLog(module = SystemModule.BASE, title = "后继成本中心", biz = BizType.UPDATE) + public R delete(@PathVariable("id") Long id){ + bmsCenterExtendService.deleteAndReply(id); + return R.ok(); + } + + /** + * 更新均摊(加删除子节点) + * @return + */ + @PostMapping("/initBuild") + public R allocation4Update(){ + bmsCenterExtendBuildService.initData(); + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsChannelController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsChannelController.java new file mode 100644 index 0000000..bb643a1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsChannelController.java @@ -0,0 +1,492 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +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.bms.common.MasterUserType; +import com.qs.serve.modules.bms.controller.my.BmsChannelMyController; +import com.qs.serve.modules.bms.entity.*; +import com.qs.serve.modules.bms.entity.bo.BmsChannel4ExcelBo; +import com.qs.serve.modules.bms.entity.bo.BmsSupplierChannelBo; +import com.qs.serve.modules.bms.mapper.BmsMasterUserMapper; +import com.qs.serve.modules.bms.service.BmsChannelPointService; +import com.qs.serve.modules.bms.service.BmsSupplierChannelService; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.his.entity.HisUserChannelPoint; +import com.qs.serve.modules.his.service.HisUserChannelPointService; +import com.qs.serve.modules.tbs.entity.TbsActivityChannel; +import com.qs.serve.modules.tbs.service.TbsActivityChannelService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.service.BmsChannelService; + +import javax.validation.Valid; +import java.util.*; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +/** + * 基础档案 渠道 + * @author YenHex + * @since 2022-11-03 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/channel") +public class BmsChannelController { + + private BmsChannelService bmsChannelService; + private BmsChannelPointService bmsChannelPointService; + private TbsActivityChannelService activityChannelService; + private HisUserChannelPointService hisUserChannelPointService; + private BmsMasterUserMapper bmsMasterUserMapper; + private BmsSupplierChannelService bmsSupplierChannelService; + private BmsChannelMyController bmsChannelMyController; + private BmsSupplierChannelController bmsSupplierChannelController; + private BmsSupplierService bmsSupplierService; + + + /** + * 导出列表 + * @param param + * @return + */ + @GetMapping("/export") + @PreAuthorize("hasRole('bms:channel:query')") + public R> export(BmsChannel param){ + + LambdaQueryWrapper channelWrapper = new LambdaQueryWrapper<>(param); + channelWrapper.orderByDesc(BmsChannel::getCreateTime); + if(param.getSelectStartTime()!=null) { + channelWrapper.ge(BmsChannel::getCreateTime, param.getSelectStartTime()); + channelWrapper.isNotNull(BmsChannel::getCreateBy); + } + if(param.getSelectEndTime()!=null) { + channelWrapper.le(BmsChannel::getCreateTime, param.getSelectEndTime()); + channelWrapper.isNotNull(BmsChannel::getCreateBy); + } +// if(param.getExportNum()==null || param.getExportNum()==0){ +// Assert.throwEx("请输入导出条数"); +// } + + if(CollectionUtil.isNotEmpty(param.getSelectIds())){ + channelWrapper.in(BmsChannel::getId, param.getSelectIds()); + } + + if(param.getExportNum() != null && param.getExportNum()!= 0){ + channelWrapper.last(" limit "+param.getExportNum()); + } + + List list = bmsChannelService.list(channelWrapper); + + List channelIds = list.stream().map(a->a.getId()).collect(Collectors.toList()); + if(channelIds.size()>0) { + LambdaQueryWrapper supplierChannelLambdaQueryWrapper = new LambdaQueryWrapper<>(); + supplierChannelLambdaQueryWrapper.in(BmsSupplierChannel::getChannelId, channelIds); + List supplierChannelList = bmsSupplierChannelService.list(supplierChannelLambdaQueryWrapper); + List supplierIds = supplierChannelList.stream().map(a->a.getSupplierId().toString()).distinct().collect(Collectors.toList()); + if(supplierIds.size()>0){ + LambdaQueryWrapper supplierLqw = new LambdaQueryWrapper(); + supplierLqw.in(BmsSupplier::getId,supplierIds); + List supplierList = bmsSupplierService.list(supplierLqw); + list.forEach(a->{ + List supplierIdList = supplierChannelList.stream().filter(b->b.getChannelId().equals(a.getId())).map(b->b.getSupplierId()+"").collect(Collectors.toList()); + List supplierNames = supplierList.stream().filter(b->supplierIdList.contains(b.getId())).map(b->b.getName()).collect(Collectors.toList()); + a.setSupplierNames(supplierNames); + }); + } + } + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('bms:channel:query')") + public R> getPage(BmsChannel param){ + if(param.getLoadByCurrent()!=null&¶m.getLoadByCurrent().equals(1)){ + return bmsChannelMyController.getPage4UnderAndMine(param); + } + + + LambdaQueryWrapper channelWrapper = new LambdaQueryWrapper<>(param); + if(param.getSelectStartTime()!=null) { + channelWrapper.ge(BmsChannel::getCreateTime, param.getSelectStartTime()); + channelWrapper.isNotNull(BmsChannel::getCreateBy); + } + if(param.getSelectEndTime()!=null) { + channelWrapper.le(BmsChannel::getCreateTime, param.getSelectEndTime()); + channelWrapper.isNotNull(BmsChannel::getCreateBy); + } + channelWrapper.orderByDesc(BmsChannel::getCreateTime); + + + if(StringUtils.hasText(param.getSeachSupplierName())){ + BmsSupplierChannel searchSupplierChannel = new BmsSupplierChannel(); + searchSupplierChannel.setSupplierName(param.getSeachSupplierName()); + List bmsSupplierChannelList = bmsSupplierChannelService.selectSupplierChannelList(searchSupplierChannel); + List channelIds = bmsSupplierChannelList.stream().map(a->a.getChannelId()).collect(Collectors.toList()); + if(channelIds.size()>0) { + channelWrapper.in(BmsChannel::getId, channelIds); + }else{ + channelWrapper.eq(BmsChannel::getId, 0L); + } + } + + PageUtil.startPage(); + List list = bmsChannelService.list(channelWrapper); + + list.forEach(a->{ + BmsSupplierChannel searchSupplierChannel = new BmsSupplierChannel(); + searchSupplierChannel.setChannelId(a.getId()); + List bmsSupplierChannelList = bmsSupplierChannelService.selectSupplierChannelList(searchSupplierChannel); + a.setSupplierNames(bmsSupplierChannelList.stream().map(b->b.getSupplierName()).collect(Collectors.toList())); + }); + + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "渠道", biz = BizType.QUERY) + @PreAuthorize("hasRole('bms:channel:query')") + public R getById(@PathVariable("id") String id){ + BmsChannel bmsChannel = bmsChannelService.getById(id); + return R.ok(bmsChannel); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "渠道", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:channel:update')") + public R updateById(@RequestBody @Valid BmsChannel param){ + BmsChannel ori = bmsChannelService.getById(param.getId()); + if(param.getHeadChannelId()!=null){ + BmsChannel headChannel = bmsChannelService.getById(param.getHeadChannelId()); + if(headChannel!=null){ + param.setHeadChannel(headChannel.getChannelName()); + param.setHeadChannelCode(headChannel.getChannelCode()); + } + }else{ + param.setHeadChannelId(0L); + 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()); + channelPoints = channelPoints.stream().map(a->{ + a.setChannelName(param.getChannelName()); + return a; + }).collect(Collectors.toList()); + bmsChannelPointService.updateBatchById(channelPoints); + + LambdaQueryWrapper mgrLqw = new LambdaQueryWrapper<>(); + mgrLqw.eq(BmsMasterUser::getType, MasterUserType.Channel); + mgrLqw.eq(BmsMasterUser::getTargetId,ori.getId()); + List masterUsers = bmsMasterUserMapper.selectList(mgrLqw); + for (BmsMasterUser masterUser : masterUsers) { + masterUser.setChannelName(param.getChannelName()); + bmsMasterUserMapper.updateById(masterUser); + } + + } + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "渠道", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:channel:insert')") + public R save(@RequestBody @Valid BmsChannel param){ + param.setChannelCode("D"+ StringUtils.genShortId()); + if(param.getHeadChannelId()!=null){ + BmsChannel headChannel = bmsChannelService.getById(param.getHeadChannelId()); + if(headChannel!=null){ + param.setHeadChannel(headChannel.getChannelName()); + param.setHeadChannelCode(headChannel.getChannelCode()); + } + } + bmsChannelService.save(param); + if(CollectionUtil.isNotEmpty(param.getSupplierIds())){ + BmsSupplierChannelBo channelBo = new BmsSupplierChannelBo(); + channelBo.setChannelIds(Arrays.asList(param.getId())); + channelBo.setSupplierIds(param.getSupplierIds()); + bmsSupplierChannelController.save(channelBo); + } + return R.ok(); + } + + /** + * 导入 + * @param param + * @return + */ + @PostMapping("/importExcel") + @SysLog(module = SystemModule.BASE, title = "渠道", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:channel:insert')") + public R importExcel(@RequestBody @Valid List param){ + + param.forEach(a->{ + a.setErrorInfo(""); + if(a.getType().equals("4")){ + return; + } + if(!StringUtils.hasText(a.getChannelName())){ + a.setErrorInfo(a.getErrorInfo()+"渠道名称不能为空;"); + } + if(!StringUtils.hasText(a.getChannelType())){ + a.setErrorInfo(a.getErrorInfo()+"渠道类型不能为空;"); + } + if(a.getCostFlag()==null){ + a.setErrorInfo(a.getErrorInfo()+"是否可投放费用不能为空;"); + } + }); + List saveList = param.stream().filter(a->a.getType().equals("1")).collect(Collectors.toList()); + List updateList = param.stream().filter(a->a.getType().equals("2")).collect(Collectors.toList()); + List deleteList = param.stream().filter(a->a.getType().equals("3")).collect(Collectors.toList()); + + /** ------------------------------- 查客户列表 ------------------------------------------------ */ + List supplierNames = new ArrayList<>(); + supplierNames.addAll(saveList.stream().filter(a->a.getSupplierNames()!=null).map(a->a.getSupplierNames()).flatMap(List::stream).collect(Collectors.toList())); + supplierNames.addAll(updateList.stream().filter(a->a.getSupplierNames()!=null).map(a->a.getSupplierNames()).flatMap(List::stream).collect(Collectors.toList())); + supplierNames = supplierNames.stream().distinct().collect(Collectors.toList()); + List supplierList = new ArrayList<>(); + if(supplierNames.size()>0) { + LambdaQueryWrapper supplierLambdaQueryWrapper = new LambdaQueryWrapper<>(); + supplierLambdaQueryWrapper.in(BmsSupplier::getName, supplierNames); + supplierList = bmsSupplierService.list(supplierLambdaQueryWrapper); + List existSupplierName = supplierList.stream().map(a -> a.getName()).collect(Collectors.toList()); + if (supplierList.size() < supplierNames.size()) { + param.forEach(a -> { + if(a.getType().equals("4")){ + return; + } + List noExistName = a.getSupplierNames().stream().filter(b -> !existSupplierName.contains(b)).collect(Collectors.toList()); + if (noExistName.size() > 0) { + a.setErrorInfo(a.getErrorInfo() + "不存在客户" + noExistName.stream().collect(Collectors.joining(",")) + ";"); + } + }); + } + } + /** ----------------------------------------------------------------------------------- */ + /** ------------------------------- 校验新增 ------------------------------------------------ */ + if(saveList.size()>0) { + List saveCodes = saveList.stream().filter(a -> StringUtils.hasText(a.getChannelCode())).map(a -> a.getChannelCode()).distinct().collect(Collectors.toList()); + if(saveCodes.size()>0) { + LambdaQueryWrapper checkSaveChannelCode = new LambdaQueryWrapper<>(); + checkSaveChannelCode.in(BmsChannel::getChannelCode, saveCodes); + List checkSaveChannelList = bmsChannelService.list(checkSaveChannelCode); + if (checkSaveChannelList.size() > 0) { + List existSaveCodes = checkSaveChannelList.stream().map(a -> a.getChannelCode()).collect(Collectors.toList()); + param.forEach(a -> { + if (a.getType().equals("1")) { + if (existSaveCodes.contains(a.getChannelCode())) { + a.setErrorInfo(a.getErrorInfo() + "新增已存在渠道编码;"); + } + } + }); + } + } + } + /** ----------------------------------------------------------------------------------- */ + /** ------------------------------- 校验更新 ------------------------------------------------ */ + if(updateList.size()>0) { + List updateCheckCodes = updateList.stream().filter(a -> StringUtils.hasText(a.getChannelCode())).map(a -> a.getChannelCode()).distinct().collect(Collectors.toList()); + if(updateCheckCodes.size()==0) { + param.forEach(a -> { + if (a.getType().equals("2")) { + a.setErrorInfo(a.getErrorInfo() + "更新不存在渠道编码;"); + } + }); + }else { + LambdaQueryWrapper checkUpdateChannelCode = new LambdaQueryWrapper<>(); + checkUpdateChannelCode.in(BmsChannel::getChannelCode, updateCheckCodes); + List checkUpdateChannelList = bmsChannelService.list(checkUpdateChannelCode); + List existSaveCodes = checkUpdateChannelList.stream().map(a -> a.getChannelCode()).collect(Collectors.toList()); + param.forEach(a -> { + if (a.getType().equals("2")) { + if (!existSaveCodes.contains(a.getChannelCode())) { + a.setErrorInfo(a.getErrorInfo() + "更新不存在渠道编码;"); + } + } + }); + } + } + /** ----------------------------------------------------------------------------------- */ + /** ------------------------------- 删除更新 ------------------------------------------------ */ + if(deleteList.size()>0) { + List deleteCheckCodes = deleteList.stream().filter(a -> StringUtils.hasText(a.getChannelCode())).map(a -> a.getChannelCode()).distinct().collect(Collectors.toList()); + if(deleteCheckCodes.size()==0){ + param.forEach(a -> { + if (a.getType().equals("3")) { + a.setErrorInfo(a.getErrorInfo() + "删除不存在渠道编码;"); + } + }); + }else { + LambdaQueryWrapper checkdeleteChannelCode = new LambdaQueryWrapper<>(); + checkdeleteChannelCode.in(BmsChannel::getChannelCode, deleteCheckCodes); + List checkdeleteChannelList = bmsChannelService.list(checkdeleteChannelCode); + if (checkdeleteChannelList.size() > 0) { + List existSaveCodes = checkdeleteChannelList.stream().map(a -> a.getChannelCode()).collect(Collectors.toList()); + param.forEach(a -> { + if (a.getType().equals("3")) { + if (!existSaveCodes.contains(a.getChannelCode())) { + a.setErrorInfo(a.getErrorInfo() + "删除不存在渠道编码;"); + } + } + }); + } + } + } + /** ----------------------------------------------------------------------------------- */ + /** ------------------------------- 返回错误 ------------------------------------------- */ + if(param.stream().filter(a->a.getErrorInfo().length()>0).count()>0) { + return R.ok(param, "导入失败,请打开EXCEL查询错误详情!"); + } + /** ----------------------------------------------------------------------------------- */ + /** ------------------------------- 保存新增 ------------------------------------------------ */ + if(saveList.size()>0) { + List saveBmsChannels = saveList.stream().map(a -> { + BmsChannel bmsChannel = new BmsChannel(); + CopierUtil.copy(a, bmsChannel); + if (!StringUtils.hasText(bmsChannel.getChannelCode())) { + bmsChannel.setChannelCode("D" + StringUtils.genShortId()); + } + return bmsChannel; + }).collect(Collectors.toList()); + bmsChannelService.saveBatch(saveBmsChannels); + this.batchHandleChannelSupplier(saveBmsChannels, supplierList); + } + /** ----------------------------------------------------------------------------------- */ + /** ------------------------------- 更新数据 ------------------------------------------------ */ + if(updateList.size()>0) { + List updateBmsChannels = updateList.stream().map(a -> { + BmsChannel bmsChannel = new BmsChannel(); + CopierUtil.copy(a, bmsChannel); + return bmsChannel; + }).collect(Collectors.toList()); + List updateCodes = updateBmsChannels.stream().map(a -> a.getChannelCode()).collect(Collectors.toList()); + LambdaQueryWrapper bmsChannelLambdaQueryWrapper = new LambdaQueryWrapper<>(); + bmsChannelLambdaQueryWrapper.in(BmsChannel::getChannelCode, updateCodes); + List oriBmsChannelList = bmsChannelService.list(bmsChannelLambdaQueryWrapper); + Map codeToChannelId = oriBmsChannelList.stream().collect(Collectors.toMap(BmsChannel::getChannelCode, BmsChannel::getId)); + updateBmsChannels = updateBmsChannels.stream().map(a -> { + a.setId(codeToChannelId.get(a.getChannelCode())); + return a; + }).collect(Collectors.toList()); + bmsChannelService.updateBatchById(updateBmsChannels); + this.batchHandleChannelSupplier(updateBmsChannels, supplierList); + } + /** ----------------------------------------------------------------------------------- */ + /** ------------------------------- 删除数据 ------------------------------------------------ */ + if(deleteList.size()>0) { + List deleteBmsChannels = deleteList.stream().map(a -> { + BmsChannel bmsChannel = new BmsChannel(); + CopierUtil.copy(a, bmsChannel); + return bmsChannel; + }).collect(Collectors.toList()); + List deleteCodes = deleteBmsChannels.stream().map(a -> a.getChannelCode()).collect(Collectors.toList()); + LambdaQueryWrapper deleteBmsChannelLambdaQueryWrapper = new LambdaQueryWrapper<>(); + deleteBmsChannelLambdaQueryWrapper.in(BmsChannel::getChannelCode, deleteCodes); + List oriDeleteBmsChannelList = bmsChannelService.list(deleteBmsChannelLambdaQueryWrapper); + Map deleteCodeToChannelId = oriDeleteBmsChannelList.stream().collect(Collectors.toMap(BmsChannel::getChannelCode, BmsChannel::getId)); + deleteBmsChannels = deleteBmsChannels.stream().map(a -> { + a.setId(deleteCodeToChannelId.get(a.getChannelCode())); + return a; + }).collect(Collectors.toList()); + List deleteIds = deleteBmsChannels.stream().map(a -> a.getId()).collect(Collectors.toList()); + bmsChannelService.removeBatchByIds(deleteIds); + LambdaQueryWrapper supplierChannelLambdaQueryWrapper = new LambdaQueryWrapper<>(); + supplierChannelLambdaQueryWrapper.in(BmsSupplierChannel::getChannelId, deleteIds); + bmsSupplierChannelService.remove(supplierChannelLambdaQueryWrapper); + /** ----------------------------------------------------------------------------------- */ + } + return R.ok(); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BASE, title = "渠道", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:channel:delete')") + public R deleteById(@PathVariable("id") Long id){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivityChannel::getChannelId,id); + if(activityChannelService.count(lqw)>0){ + return R.error("活动含当前渠道,删除失败"); + } + + LambdaQueryWrapper pointLqw = new LambdaQueryWrapper<>(); + pointLqw.eq(BmsChannelPoint::getChannelId,id); + if(bmsChannelPointService.count(pointLqw)>1){ + return R.error("含有网点,删除失败"); + } + + //删除相关的网点授权 + LambdaQueryWrapper mgrLqw = new LambdaQueryWrapper<>(); + mgrLqw.eq(BmsMasterUser::getType, MasterUserType.Channel); + mgrLqw.eq(BmsMasterUser::getTargetId,id); + bmsMasterUserMapper.delete(mgrLqw); + + hisUserChannelPointService.removeByChannelId(id); + + boolean result = bmsChannelService.removeById(id); + if(result){ + bmsSupplierChannelService.deleteByChannelId(id+""); + } + return R.isTrue(result); + } + + private void batchHandleChannelSupplier(List saveBmsChannels, List supplierList){ + List bmsSupplierChannelList = saveBmsChannels.stream().map(a->{ + List supplierIds = supplierList.stream().filter(b->a.getSupplierNames().contains(b.getName())).map(b->Long.parseLong(b.getId())).collect(Collectors.toList()); + List bmsSupplierChannels = supplierIds.stream().map(b->{ + BmsSupplierChannel supplierChannel = new BmsSupplierChannel(); + supplierChannel.setChannelId(a.getId()); + supplierChannel.setSupplierId(b); + return supplierChannel; + }).collect(Collectors.toList()); + return bmsSupplierChannels; + }).flatMap(List::stream).collect(Collectors.toList()); + bmsSupplierChannelService.deleteBatchByChannelIds(saveBmsChannels.stream().map(a->a.getId()).distinct().collect(Collectors.toList())); + bmsSupplierChannelService.saveBatch(bmsSupplierChannelList); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsChannelPointController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsChannelPointController.java new file mode 100644 index 0000000..c5ce307 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsChannelPointController.java @@ -0,0 +1,575 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.dto.RowParam; +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.baz.common.BazTargetTypeConsts; +import com.qs.serve.modules.baz.entity.BazVisitInfo; +import com.qs.serve.modules.baz.service.BazVisitInfoService; +import com.qs.serve.modules.bms.common.MasterUserType; +import com.qs.serve.modules.bms.controller.my.BmsChannelPointMyController; +import com.qs.serve.modules.bms.entity.*; +import com.qs.serve.modules.bms.entity.bo.BmsChannelPoint4ExcelBo; +import com.qs.serve.modules.bms.entity.bo.BmsChannelPointBo; +import com.qs.serve.modules.bms.entity.bo.BmsChannelPointMapInfoBo; +import com.qs.serve.modules.bms.entity.so.BmsPointVisitSo; +import com.qs.serve.modules.bms.entity.vo.BmsUserPoint4VisitVo; +import com.qs.serve.modules.bms.mapper.BmsChannelPointMapper; +import com.qs.serve.modules.bms.service.*; +import com.qs.serve.modules.his.service.HisUserChannelPointService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.common.enums.BusinessLogType; +import com.qs.serve.modules.sys.service.SysBusinessLogService; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.tbs.entity.TbsActivityChannelPoint; +import com.qs.serve.modules.tbs.service.TbsActivityChannelPointService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 基础档案 渠道站点 + * @author YenHex + * @since 2022-11-03 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/channelPoint") +public class BmsChannelPointController { + + private SysBusinessLogService businessLogService; + private BazVisitInfoService bazVisitInfoService; + private BmsChannelPointService bmsChannelPointService; + private BmsRegionService bmsRegionService; + private BmsRegion2Service bmsRegion2Service; + private TbsActivityChannelPointService activityChannelPointService; + private BmsChannelPointMapper channelPointMapper; + private HisUserChannelPointService hisUserChannelPointService; + private BmsMasterUserService bmsMasterUserService; + private SysPostUserService postUserService; + private BmsChannelPointMyController bmsChannelPointMyController; + private BmsChannelService bmsChannelService; + private BmsSupplierChannelService bmsSupplierChannelService; + + /** + * 导出 + * @param param + * @return + */ + @GetMapping("/export") + @PreAuthorize("hasRole('bms:channelPoint:query')") + public R> export(BmsChannelPoint param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + lqw.orderByDesc(BmsChannelPoint::getCreateTime); + if(param.getSelectStartTime()!=null) { + lqw.ge(BmsChannelPoint::getCreateTime, param.getSelectStartTime()); + lqw.isNotNull(BmsChannelPoint::getCreateBy); + } + if(param.getSelectEndTime()!=null) { + lqw.le(BmsChannelPoint::getCreateTime, param.getSelectEndTime()); + lqw.isNotNull(BmsChannelPoint::getCreateBy); + } + if(CollectionUtil.isNotEmpty(param.getSelectIds())){ + lqw.in(BmsChannelPoint::getId, param.getSelectIds()); + } + + if(param.getExportNum() != null && param.getExportNum()!= 0 + && param.getStartNum() != null ){ + lqw.last(" limit "+param.getStartNum() + "," + param.getExportNum()); + } + + List list = bmsChannelPointService.list(lqw); + List bizRegionIds = new ArrayList<>(); + bizRegionIds.addAll(list.stream().filter(a->a.getBizRegionId()!=null).map(a->a.getBizRegionId()).collect(Collectors.toList())); + bizRegionIds = bizRegionIds.stream().distinct().collect(Collectors.toList()); + List region2List = new ArrayList<>(); + if(bizRegionIds.size()>0){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.in(BmsRegion2::getId,bizRegionIds); + region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + } + Map idToBizRegion = region2List.stream().collect(Collectors.toMap(BmsRegion2::getId, a->a)); + + for (BmsChannelPoint channelPoint : list) { + Long channelId = channelPoint.getChannelId(); + BmsChannel channel = bmsChannelService.getById(channelId); + if(channel!=null){ + channelPoint.setChannelName(channel.getChannelName()); + channelPoint.setChannelCode(channel.getChannelCode()); + channelPoint.setChannelType(channel.getChannelType()); + } + if(StringUtils.hasText(channelPoint.getBizRegionPath())){ + String[] bizRegions = channelPoint.getBizRegionPath().split("_"); + if(bizRegions.length>0){ + channelPoint.setBizRegionName(bizRegions[bizRegions.length-1]); + } + BmsRegion2 region2 = idToBizRegion.get(channelPoint.getBizRegionId()); + if(region2!=null){ + channelPoint.setBizRegionCode(region2.getCode()); + } + } + if(StringUtils.hasText(channelPoint.getSaleRegionPath())){ + String[] regions = channelPoint.getSaleRegionPath().split("_"); + if(regions.length>0){ + channelPoint.setSaleRegionName(regions[regions.length-1]); + } + } + } + return R.ok(list); + } + + /** + * 获取我负责的网点 + * @param param + * @return + */ + @GetMapping("/page4Visit") + public R> getPage4Visit(BmsPointVisitSo param){ + String sysUserId = AuthContextUtils.getSysUserId(); + List userIds = postUserService.listByChildIds(sysUserId); + userIds.add(sysUserId); + Long count = channelPointMapper.selectCountUserPointList4Visit(param,userIds); + if(count<1){ + return R.byEmptyList(); + } + List list = channelPointMapper.selectUserPointList4Visit(param, userIds,new RowParam(true)); + for (BmsUserPoint4VisitVo visitVo : list) { + LambdaQueryWrapper visitInfoLqw = new LambdaQueryWrapper<>(); + visitInfoLqw.eq(BazVisitInfo::getTargetType, BazTargetTypeConsts.POINT); + visitInfoLqw.eq(BazVisitInfo::getTargetId,visitVo.getPointId()); + visitInfoLqw.eq(BazVisitInfo::getUserId,sysUserId); + BazVisitInfo visitInfo = bazVisitInfoService.getOne(visitInfoLqw,false); + visitVo.setVisitInfo(visitInfo); + } + return R.byPageList(count,list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('bms:channelPoint:query')") + public R> getPage(BmsChannelPoint param){ + if(param.getLoadByCurrent()!=null&¶m.getLoadByCurrent().equals(1)){ + return bmsChannelPointMyController.page4UnderAndMine(param); + } + + if(StringUtils.hasText(param.getSeachSupplierName())){ + BmsSupplierChannel searchSupplierChannel = new BmsSupplierChannel(); + searchSupplierChannel.setSupplierName(param.getSeachSupplierName()); + List bmsSupplierChannelList = bmsSupplierChannelService.selectSupplierChannelList(searchSupplierChannel); + List channelIds = bmsSupplierChannelList.stream().map(a->a.getChannelId()).collect(Collectors.toList()); + param.setSeachChannelIds(channelIds); + } + + PageUtil.startPage(); + List list = bmsChannelPointService.selectChannelPointList(param); + List bizRegionIds = new ArrayList<>(); + bizRegionIds.addAll(list.stream().filter(a->a.getBizRegionId()!=null).map(a->a.getBizRegionId()).collect(Collectors.toList())); + bizRegionIds = bizRegionIds.stream().distinct().collect(Collectors.toList()); + List region2List = new ArrayList<>(); + if(bizRegionIds.size()>0){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.in(BmsRegion2::getId,bizRegionIds); + region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + } + Map idToBizRegion = region2List.stream().collect(Collectors.toMap(BmsRegion2::getId, a->a)); + for (BmsChannelPoint channelPoint : list) { + if(StringUtils.hasText(channelPoint.getBizRegionPath())){ + String[] bizRegions = channelPoint.getBizRegionPath().split("_"); + if(bizRegions.length>0){ + channelPoint.setBizRegionName(bizRegions[bizRegions.length-1]); + } + + BmsRegion2 region2 = idToBizRegion.get(channelPoint.getBizRegionId()); + if(region2!=null){ + channelPoint.setBizRegionCode(region2.getCode()); + } + } + if(StringUtils.hasText(channelPoint.getSaleRegionPath())){ + String[] regions = channelPoint.getSaleRegionPath().split("_"); + if(regions.length>0){ + channelPoint.setSaleRegionName(regions[regions.length-1]); + } + } + + BmsSupplierChannel searchSupplierChannel = new BmsSupplierChannel(); + searchSupplierChannel.setChannelId(channelPoint.getChannelId()); + List bmsSupplierChannelList = bmsSupplierChannelService.selectSupplierChannelList(searchSupplierChannel); + channelPoint.setSupplierNames(bmsSupplierChannelList.stream().map(b->b.getSupplierName()).collect(Collectors.toList())); + + } + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "渠道站点", biz = BizType.QUERY) + @PreAuthorize("hasRole('bms:channelPoint:query')") + public R getById(@PathVariable("id") String id){ + BmsChannelPoint bmsChannelPoint = bmsChannelPointService.getById(id); + BmsRegion bmsRegion = bmsRegionService.getById(bmsChannelPoint.getSaleRegionId()); + if(bmsRegion!=null){ + bmsChannelPoint.setSaleRegionName(bmsRegion.getName()); + } + BmsRegion2 bmsRegion2 = bmsRegion2Service.getById(bmsChannelPoint.getBizRegionId()); + if(bmsRegion2!=null){ + bmsChannelPoint.setBizRegionName(bmsRegion2.getName()); + } + return R.ok(bmsChannelPoint); + } + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "渠道站点", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:channelPoint:update')") + public R updateById(@RequestBody BmsChannelPointBo param){ + return R.isTrue(bmsChannelPointService.modify(param)); + } + + /** + * 更新地图信息 + * @param param + * @return + */ + @PostMapping("/updateMapInfo") + public R updateById(@RequestBody BmsChannelPointMapInfoBo param){ + BmsChannelPoint channelPoint = CopierUtil.copy(param,new BmsChannelPoint()); + BmsChannelPoint orgData = bmsChannelPointService.getById(channelPoint.getId()); + if(!StringUtils.hasText(orgData.getBizRegionId()) && StringUtils.hasText(param.getAdCode())){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.eq(BmsRegion2::getCode,param.getAdCode()); + BmsRegion2 region2 = bmsRegion2Service.getOne(region2LambdaQueryWrapper); + if(region2!=null) { + channelPoint.setBizRegionId(region2.getId()); + channelPoint.setBizRegionPath(region2.getPathNames()); + channelPoint.setBizRegionPathIds(region2.getPathIds()); + } + } + bmsChannelPointService.updateById(channelPoint); + businessLogService.buildLog4Change(BusinessLogType.Point, + channelPoint.getId()+"",channelPoint.getPointCode(),channelPoint.getPointName(),null,orgData,channelPoint); + if(!StringUtils.hasText(param.getLocalX())||!StringUtils.hasText(param.getLocalY())){ + channelPointMapper.updateSetNullOfMapInfo(param.getId()); + } + return R.ok(); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "渠道站点", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:channelPoint:insert')") + public R save(@RequestBody @Valid BmsChannelPointBo param){ + boolean result = bmsChannelPointService.modify(param); + return R.isTrue(result); + } + + /** + * 导入 + * @param param + * @return + */ + @PostMapping("/importExcel") + @SysLog(module = SystemModule.BASE, title = "渠道站点", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:channelPoint:insert')") + public R importExcel(@RequestBody @Valid List param){ + param.forEach(a->{ + + a.setErrorInfo(""); + if(a.getType().equals("4")){ + return; + } + if(!StringUtils.hasText(a.getChannelCode())){ + a.setErrorInfo(a.getErrorInfo()+"渠道编码不能为空;"); + } + if(!StringUtils.hasText(a.getPointName())){ + a.setErrorInfo(a.getErrorInfo()+"网点名称不能为空;"); + } + if(!StringUtils.hasText(a.getAddress())){ + a.setErrorInfo(a.getErrorInfo()+"网点地址不能为空;"); + } + if(!StringUtils.hasText(a.getPointLevel())){ + a.setErrorInfo(a.getErrorInfo()+"网点等级不能为空;"); + } + if(!StringUtils.hasText(a.getPointType())){ + a.setErrorInfo(a.getErrorInfo()+"网点类型不能为空;"); + } +// if(!StringUtils.hasText(a.getBizRegionCode())){ +// a.setErrorInfo(a.getErrorInfo()+"行政区域编码不能为空;"); +// } + if(!StringUtils.hasText(a.getShopArea())){ + a.setErrorInfo(a.getErrorInfo()+"店铺面积不能为空;"); + } + if(a.getCountCheckstand()==null){ + a.setErrorInfo(a.getErrorInfo()+"收银台数量不能为空;"); + } + if(a.getCostFlag()==null){ + a.setErrorInfo(a.getErrorInfo()+"是否可投放费用不能为空;"); + } + }); + + List saveList = param.stream().filter(a-> "1".equals(a.getType())).collect(Collectors.toList()); + List updateList = param.stream().filter(a-> "2".equals(a.getType())).collect(Collectors.toList()); + List deleteList = param.stream().filter(a-> "3".equals(a.getType())).collect(Collectors.toList()); + + /** ------------------------------- 查渠道列表 ------------------------------------------------ */ + List channelCodes = new ArrayList<>(); + channelCodes.addAll(saveList.stream().filter(a->a.getChannelCode()!=null).map(a->a.getChannelCode()).collect(Collectors.toList())); + channelCodes.addAll(updateList.stream().filter(a->a.getChannelCode()!=null).map(a->a.getChannelCode()).collect(Collectors.toList())); + channelCodes = channelCodes.stream().distinct().collect(Collectors.toList()); + List channelList = new ArrayList<>(); + if(channelCodes.size()>0){ + LambdaQueryWrapper channelLambdaQueryWrapper = new LambdaQueryWrapper<>(); + channelLambdaQueryWrapper.in(BmsChannel::getChannelCode,channelCodes); + channelList = bmsChannelService.list(channelLambdaQueryWrapper); + List existChannelCode = channelList.stream().map(a -> a.getChannelCode()).collect(Collectors.toList()); + if(channelList.size() { + if(a.getType().equals("4")){ + return; + } + if(!existChannelCode.contains(a.getChannelCode())){ + a.setErrorInfo(a.getErrorInfo()+"不存在该渠道编码;"); + } + }); + } + } + //有重复的key这个方法会报错 + //Map codeToChannaledId = channelList.stream().collect(Collectors.toMap(BmsChannel::getChannelCode, a->a)); + Map codeToChannaledId = channelList.stream() + .filter(a->a.getChannelCode()!=null) + .collect(Collectors.toMap(BmsChannel::getChannelCode, p -> p, (o, n) -> n)); + /** ----------------------------------------------------------------------------------- */ + /** ------------------------------- 查行政区域列表 ------------------------------------------------ */ + List bizRegionCodes = new ArrayList<>(); + bizRegionCodes.addAll(saveList.stream().map(BmsChannelPoint4ExcelBo::getBizRegionCode).filter(Objects::nonNull).collect(Collectors.toList())); + bizRegionCodes.addAll(updateList.stream().map(BmsChannelPoint4ExcelBo::getBizRegionCode).filter(Objects::nonNull).collect(Collectors.toList())); + bizRegionCodes = bizRegionCodes.stream().distinct().collect(Collectors.toList()); + List region2List = new ArrayList<>(); + if(bizRegionCodes.size()>0){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.in(BmsRegion2::getCode,bizRegionCodes); + region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); +// List existRegion2Code = region2List.stream().map(a -> a.getCode()).collect(Collectors.toList()); +// if(region2List.size() { +// if(a.getType().equals("4")){ +// return; +// } +// if(!existRegion2Code.contains(a.getBizRegionCode())){ +// a.setErrorInfo(a.getErrorInfo()+"不存在该行政区域编码;"); +// } +// }); +// } + } + Map codeToBizRegion = region2List.stream().collect(Collectors.toMap(BmsRegion2::getCode, a->a)); + + /** ----------------------------------------------------------------------------------- */ + /** ------------------------------- 校验新增 ------------------------------------------------ */ + + if(saveList.size()>0) { + List saveCodes = saveList.stream().filter(a->StringUtils.hasText(a.getPointCode())).map(a->a.getPointCode()).distinct().collect(Collectors.toList()); + if(saveCodes.size()>0) { + LambdaQueryWrapper checkSavePointCodeLqw = new LambdaQueryWrapper<>(); + checkSavePointCodeLqw.in(BmsChannelPoint::getPointCode, saveCodes); + List checkSavePointList = bmsChannelPointService.list(checkSavePointCodeLqw); + if (checkSavePointList.size() > 0) { + List existSaveCodes = checkSavePointList.stream().map(a -> a.getPointCode()).collect(Collectors.toList()); + param.forEach(a -> { + if (a.getType().equals("1")) { + if (existSaveCodes.contains(a.getPointCode())) { + a.setErrorInfo(a.getErrorInfo() + "新增已存在网点编码;"); + } + } + }); + } + } + } + /** ----------------------------------------------------------------------------------- */ + /** ------------------------------- 校验更新 ------------------------------------------------ */ + if(updateList.size()>0) { + List updateCheckCodes = updateList.stream().filter(a -> StringUtils.hasText(a.getPointCode())).map(a -> a.getPointCode()).distinct().collect(Collectors.toList()); + if(updateCheckCodes.size()==0){ + param.forEach(a -> { + if (a.getType().equals("2")) { + a.setErrorInfo(a.getErrorInfo() + "更新不存在网点编码;"); + } + }); + }else { + LambdaQueryWrapper checkUpdategetPointCodeLqw = new LambdaQueryWrapper<>(); + checkUpdategetPointCodeLqw.in(BmsChannelPoint::getPointCode, updateCheckCodes); + List checkUpdateChannelList = bmsChannelPointService.list(checkUpdategetPointCodeLqw); + List existSaveCodes = checkUpdateChannelList.stream().map(a -> a.getPointCode()).collect(Collectors.toList()); + param.forEach(a -> { + if (a.getType().equals("2")) { + if (!existSaveCodes.contains(a.getPointCode())) { + a.setErrorInfo(a.getErrorInfo() + "更新不存在网点编码;"); + } + } + }); + } + } + /** ----------------------------------------------------------------------------------- */ + /** ------------------------------- 删除更新 ------------------------------------------------ */ + if(deleteList.size()>0) { + List deleteCheckCodes = deleteList.stream().filter(a -> StringUtils.hasText(a.getPointCode())).map(a -> a.getPointCode()).distinct().collect(Collectors.toList()); + if(deleteCheckCodes.size()==0){ + param.forEach(a -> { + if (a.getType().equals("3")) { + a.setErrorInfo(a.getErrorInfo() + "删除不存在网点编码;"); + } + }); + }else { + LambdaQueryWrapper checkdeleteChannelCode = new LambdaQueryWrapper<>(); + checkdeleteChannelCode.in(BmsChannelPoint::getPointCode, deleteCheckCodes); + List checkdeleteChannelList = bmsChannelPointService.list(checkdeleteChannelCode); + if (checkdeleteChannelList.size() > 0) { + List existSaveCodes = checkdeleteChannelList.stream().map(a -> a.getPointCode()).collect(Collectors.toList()); + param.forEach(a -> { + if (a.getType().equals("3")) { + if (!existSaveCodes.contains(a.getPointCode())) { + a.setErrorInfo(a.getErrorInfo() + "删除不存在网点编码;"); + } + } + }); + } + } + } + + /** ----------------------------------------------------------------------------------- */ + /** ------------------------------- 返回错误 ------------------------------------------- */ + if(param.stream().filter(a->a.getErrorInfo()!=null&&a.getErrorInfo().length()>0).count()>0) { + return R.ok(param, "导入失败,请打开EXCEL查询错误详情!"); + } + + /** ----------------------------------------------------------------------------------- */ + /** ------------------------------- 保存新增 ------------------------------------------------ */ + if(saveList.size()>0) { + List saveBmsChannels = saveList.stream().map(a->{ + BmsChannelPoint bmsChannelPoint = new BmsChannelPoint(); + CopierUtil.copy(a, bmsChannelPoint); + if(!StringUtils.hasText(bmsChannelPoint.getPointCode())){ + bmsChannelPoint.setPointCode("D"+StringUtils.genShortId()); + } + BmsChannel channel = codeToChannaledId.get(a.getChannelCode()); + BmsRegion2 region2 = codeToBizRegion.get(a.getBizRegionCode()); + bmsChannelPoint.setChannelId(channel.getId()); + bmsChannelPoint.setChannelName(channel.getChannelName()); + bmsChannelPoint.setChannelType(channel.getChannelType()); + if(region2!=null) { + bmsChannelPoint.setBizRegionId(region2.getId()); + bmsChannelPoint.setBizRegionPath(region2.getPathNames()); + bmsChannelPoint.setBizRegionPathIds(region2.getPathIds()); + } + return bmsChannelPoint; + }).collect(Collectors.toList()); + bmsChannelPointService.saveBatch(saveBmsChannels); + } + /** ----------------------------------------------------------------------------------- */ + /** ------------------------------- 更新数据 ------------------------------------------------ */ + if(updateList.size()>0) { + List updateBmsChannelPoints = updateList.stream().map(a -> { + BmsChannelPoint bmsChannelPoint = new BmsChannelPoint(); + CopierUtil.copy(a, bmsChannelPoint); + BmsChannel channel = codeToChannaledId.get(a.getChannelCode()); + BmsRegion2 region2 = codeToBizRegion.get(a.getBizRegionCode()); + bmsChannelPoint.setChannelId(channel.getId()); + bmsChannelPoint.setChannelName(channel.getChannelName()); + bmsChannelPoint.setChannelType(channel.getChannelType()); + if(region2!=null) { + bmsChannelPoint.setBizRegionId(region2.getId()); + bmsChannelPoint.setBizRegionPath(region2.getPathNames()); + bmsChannelPoint.setBizRegionPathIds(region2.getPathIds()); + } + return bmsChannelPoint; + }).collect(Collectors.toList()); + List updateCodes = updateBmsChannelPoints.stream().map(a -> a.getPointCode()).collect(Collectors.toList()); + LambdaQueryWrapper bmsChannelLambdaQueryWrapper = new LambdaQueryWrapper<>(); + bmsChannelLambdaQueryWrapper.in(BmsChannelPoint::getPointCode, updateCodes); + List oriBmsChannelList = bmsChannelPointService.list(bmsChannelLambdaQueryWrapper); + Map codeToChannelId = oriBmsChannelList.stream().collect(Collectors.toMap(BmsChannelPoint::getPointCode, BmsChannelPoint::getId)); + updateBmsChannelPoints = updateBmsChannelPoints.stream().map(a -> { + a.setId(codeToChannelId.get(a.getPointCode())); + return a; + }).collect(Collectors.toList()); + bmsChannelPointService.updateBatchById(updateBmsChannelPoints); + } + + /** ----------------------------------------------------------------------------------- */ + /** ------------------------------- 删除数据 ------------------------------------------------ */ + if(deleteList.size()>0) { + List deleteBmsChannelPoints = deleteList.stream().map(a -> { + BmsChannelPoint bmsChannel = new BmsChannelPoint(); + CopierUtil.copy(a, bmsChannel); + return bmsChannel; + }).collect(Collectors.toList()); + List deleteCodes = deleteBmsChannelPoints.stream().map(a -> a.getPointCode()).collect(Collectors.toList()); + LambdaQueryWrapper bmsChannelLambdaQueryWrapper = new LambdaQueryWrapper<>(); + bmsChannelLambdaQueryWrapper.in(BmsChannelPoint::getPointCode, deleteCodes); + List oriBmsChannelList = bmsChannelPointService.list(bmsChannelLambdaQueryWrapper); + Map codeToChannelId = oriBmsChannelList.stream().collect(Collectors.toMap(BmsChannelPoint::getPointCode, BmsChannelPoint::getId)); + deleteBmsChannelPoints = deleteBmsChannelPoints.stream().map(a -> { + a.setId(codeToChannelId.get(a.getPointCode())); + return a; + }).collect(Collectors.toList()); + List deleteIds = deleteBmsChannelPoints.stream().map(a -> a.getId()).collect(Collectors.toList()); + bmsChannelPointService.removeBatchByIds(deleteIds); + } + /** ----------------------------------------------------------------------------------- */ + return R.ok(); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BASE, title = "渠道站点", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:channelPoint:delete')") + public R deleteById(@PathVariable("id") Long id){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivityChannelPoint::getPointId,id); + if(activityChannelPointService.count(lqw)>0){ + return R.error("活动含当前站点,删除失败"); + } + BmsChannelPoint point = bmsChannelPointService.getById(id); + if(point==null){ + return R.error("已删除"); + } + boolean result = bmsChannelPointService.removeById(id); + //删除权限关联 + bmsMasterUserService.removeMgrUser(MasterUserType.Point,id+""); + hisUserChannelPointService.removeByPointId(id); + //添加日志 + businessLogService.buildLog4Delete(BusinessLogType.Point,id+"",point.getPointCode(),point.getPointName(),null); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsCostCenterController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsCostCenterController.java new file mode 100644 index 0000000..809557a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsCostCenterController.java @@ -0,0 +1,320 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.enums.BizType; +import com.qs.serve.common.model.enums.SystemModule; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bir.entity.so.BirBudgetTargetSo; +import com.qs.serve.modules.bir.service.BirBudgetTargetService; +import com.qs.serve.modules.bms.common.MasterUserType; +import com.qs.serve.modules.bms.entity.BmsCenterRegion; +import com.qs.serve.modules.bms.entity.BmsMasterUser; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.bo.BmsCostCenterBo; +import com.qs.serve.modules.bms.entity.so.BmsCostCenterTreeSo; +import com.qs.serve.modules.bms.entity.vo.BmsCostCenterTreeVo; +import com.qs.serve.modules.bms.service.BmsCenterRegionService; +import com.qs.serve.modules.bms.service.BmsMasterUserService; +import com.qs.serve.modules.bms.service.BmsRegionService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.tbs.common.TbsCenterType; +import com.qs.serve.modules.tbs.entity.TbsActivityCenter; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.service.TbsActivityCenterService; +import com.qs.serve.modules.tbs.service.TbsBudgetService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.BmsCostCenter; +import com.qs.serve.modules.bms.service.BmsCostCenterService; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 基础档案 成本中心 + * @author YenHex + * @since 2022-10-13 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/costCenter") +public class BmsCostCenterController { + + private BmsCostCenterService bmsCostCenterService; + private BmsMasterUserService bmsMasterUserService; + private TbsActivityCenterService activityCenterService; + private TbsBudgetService tbsBudgetService; + private BmsRegionService regionService; + private BmsCenterRegionService bmsCenterRegionService; + private BirBudgetTargetService birBudgetTargetService; + + /** + * 树查询 + * @param so loadByCurrent 值=1,过滤当前用户负责数据 + * @return + */ + @GetMapping("/tree") + @PreAuthorize("hasRole('bms:costCenter:query')") + public R> getTree(BmsCostCenterTreeSo so){ + if(so.getLoadByCurrent()!=null&&so.getLoadByCurrent().equals(1)){ + return getTreeByCurrentUser(); + } + if(so.getLoadByCurrent()!=null&&so.getLoadByCurrent().equals(2)){ + return getListByCustomerId(so); + } + List list = bmsCostCenterService.list(new LambdaQueryWrapper().orderByDesc(BmsCostCenter::getId)); + List treeVoList = list.stream().map(obj->{ + BmsCostCenterTreeVo treeNode = CopierUtil.copy(obj,new BmsCostCenterTreeVo()); + treeNode.setId(obj.getId().toString()); + treeNode.setParentId(obj.getPid().toString()); + treeNode.setSort(0); + return treeNode; + }).collect(Collectors.toList()); + return R.ok(TreeUtil.buildByRecursive(treeVoList,TreeUtil.DEFAULT_PID_STRING)); + } + + public R> getListByCustomerId(BmsCostCenterTreeSo so) { + BirBudgetTargetSo query = new BirBudgetTargetSo(); + query.setLoadType(so.getType()); + query.setSelectCenterFlag(1); + query.setTargetId(so.getTargetId()); + query.setYearMonthStart(so.getYearMonthStart()); + query.setYearMonthEnd(so.getYearMonthEnd()); + List centerIds = birBudgetTargetService.getCenterByTargetId(query); + if(centerIds.size()==0){ + return R.ok(new ArrayList()); + } + LambdaQueryWrapper centerLambdaQueryWrapper = new LambdaQueryWrapper<>(); + centerLambdaQueryWrapper.in(BmsCostCenter::getId,centerIds); + List costCenters = bmsCostCenterService.list(centerLambdaQueryWrapper); + List treeVoList = costCenters.stream().map(obj->{ + BmsCostCenterTreeVo treeNode = CopierUtil.copy(obj,new BmsCostCenterTreeVo()); + treeNode.setId(obj.getId().toString()); + treeNode.setParentId(obj.getPid().toString()); + treeNode.setSort(0); + return treeNode; + }).collect(Collectors.toList()); + return R.ok(treeVoList); + } + + public R> getTreeByCurrentUser(){ + String userId = AuthContextUtils.getSysUserId(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsMasterUser::getUserId,userId); + lqw.eq(BmsMasterUser::getType, MasterUserType.Center); + List masterUsers = bmsMasterUserService.list(lqw); + List centerIds = masterUsers.stream().map(BmsMasterUser::getTargetId).collect(Collectors.toList()); + //防止空指针 + centerIds.add("0"); + LambdaQueryWrapper centerLambdaQueryWrapper = new LambdaQueryWrapper<>(); + centerLambdaQueryWrapper.in(BmsCostCenter::getId,centerIds).or().eq(BmsCostCenter::getVisibleFlag,1); + List costCenters = bmsCostCenterService.list(centerLambdaQueryWrapper); + Map> listMap = costCenters.stream().collect(Collectors.groupingBy(BmsCostCenter::getLevel)); + List list1 = listMap.get(1)==null?new ArrayList<>():listMap.get(1); + List list2 = listMap.get(2)==null?new ArrayList<>():listMap.get(2); + List list3 = listMap.get(3)==null?new ArrayList<>():listMap.get(3); + list3.forEach(obj3->{ + boolean exist = false; + for (BmsCostCenter obj2 : list2) { + if(obj2.getId().equals(obj3.getPid())){ + List childList = obj2.getChildNode()==null?new ArrayList<>():obj2.getChildNode(); + childList.add(obj3); + obj2.setChildNode(childList); + exist = true; + break; + } + } + if(!exist){ + list2.add(obj3); + } + }); + list2.forEach(obj2->{ + boolean exist = false; + for (BmsCostCenter obj1 : list1) { + if(obj1.getId().equals(obj2.getPid())){ + List childList = obj1.getChildNode()==null?new ArrayList<>():obj1.getChildNode(); + childList.add(obj2); + obj1.setChildNode(childList); + exist = true; + break; + } + } + if(!exist){ + list1.add(obj2); + } + }); + List treeVoList = toTreeNode(list1); + return R.ok(treeVoList); + } + + private List toTreeNode(List list){ + List treeVoList = new ArrayList<>(); + for (BmsCostCenter costCenter : list) { + BmsCostCenterTreeVo treeNode = CopierUtil.copy(costCenter,new BmsCostCenterTreeVo()); + treeNode.setId(costCenter.getId().toString()); + treeNode.setParentId(costCenter.getPid().toString()); + treeNode.setSort(0); + if(CollectionUtil.isNotEmpty(costCenter.getChildNode())){ + List childList = toTreeNode(costCenter.getChildNode()); + for (BmsCostCenterTreeVo treeVo : childList) { + treeNode.addChildren(treeVo); + } + } + treeVoList.add(treeNode); + } + return treeVoList; + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "成本中心", biz = BizType.QUERY) + @PreAuthorize("hasRole('bms:costCenter:query')") + public R getById(@PathVariable("id") String id){ + BmsCostCenter bmsCostCenter = bmsCostCenterService.getById(id); + if(bmsCostCenter.getPid()!=null&&!bmsCostCenter.getPid().equals(0L)){ + BmsCostCenter parentCostCenter = bmsCostCenterService.getById(bmsCostCenter.getPid()); + bmsCostCenter.setParentInfo(parentCostCenter); + } + LambdaQueryWrapper centerRegionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + centerRegionLambdaQueryWrapper.eq(BmsCenterRegion::getCenterId,bmsCostCenter.getId()); + List bmsCenterRegionList = bmsCenterRegionService.list(centerRegionLambdaQueryWrapper); + if(CollectionUtil.isNotEmpty(bmsCenterRegionList)){ + List regionList = regionService.listByIds( + bmsCenterRegionList.stream().map(a->a.getRegionId()).collect(Collectors.toList()) + ); + bmsCostCenter.setSaleRegionInfo(regionList); + } + return R.ok(bmsCostCenter); + } + + + + /** + * 根据ID更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "成本中心", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:costCenter:update')") + public R updateById(@RequestBody @Valid BmsCostCenterBo param){ + commonEdit(param); + return R.ok(); + } + + private void commonEdit(BmsCostCenterBo param){ + BmsCostCenter costCenter = CopierUtil.copy(param,new BmsCostCenter()); + BmsCostCenter dbCostCenter = bmsCostCenterService.getById(costCenter.getId()); + BmsCostCenter parent = bmsCostCenterService.getById(costCenter.getPid()); + if(costCenter.getPid()==null||costCenter.getPid().equals(0L)){ + costCenter.setPid(0L); + costCenter.setLevel(1); + }else { + costCenter.setLevel(parent.getLevel()+1); + } + if(dbCostCenter!=null && !dbCostCenter.getPid().equals(costCenter.getPid())){ + if(!costCenter.getPid().equals(0L)) { + Integer level = parent.getLevel(); + if(level>1){ + checkRepeat(parent,dbCostCenter.getId()); + } + costCenter.setLevel(parent.getLevel()+1); + } + } + bmsCostCenterService.saveOrUpdate(costCenter); + if(CollectionUtil.isNotEmpty(param.getSaleRegionId())){ + LambdaQueryWrapper centerRegionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + centerRegionLambdaQueryWrapper.eq(BmsCenterRegion::getCenterId,costCenter.getId()); + bmsCenterRegionService.remove(centerRegionLambdaQueryWrapper); + + List bmsCenterRegionList = param.getSaleRegionId().stream().map(a->{ + BmsCenterRegion bcr = new BmsCenterRegion(); + bcr.setCenterId(costCenter.getId()); + bcr.setRegionId(a); + return bcr; + }).collect(Collectors.toList()); + + bmsCenterRegionService.saveBatch(bmsCenterRegionList); + }else{ + LambdaQueryWrapper centerRegionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + centerRegionLambdaQueryWrapper.eq(BmsCenterRegion::getCenterId,costCenter.getId()); + bmsCenterRegionService.remove(centerRegionLambdaQueryWrapper); + } + } + + private void checkRepeat(BmsCostCenter parent,Long id){ + if(parent.getId().equals(id)){ + Assert.throwEx("数据出现循环递归,保存失败"); + } + if(parent.getLevel()>1){ + BmsCostCenter netParent = bmsCostCenterService.getById(parent.getPid()); + checkRepeat(netParent, id); + } + } + + /** + * 新增成本中心 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "成本中心", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:costCenter:insert')") + public R save(@RequestBody @Valid BmsCostCenterBo param){ + commonEdit(param); + return R.ok(); + } + + /** + * 删除成本中心 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BASE, title = "成本中心", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:costCenter:delete')") + public R deleteById(@PathVariable("id") Long id){ + //未校验已用不能删,预算和费用申请 + LambdaQueryWrapper budgetLambdaQueryWrapper = new LambdaQueryWrapper<>(); + budgetLambdaQueryWrapper.eq(TbsBudget::getCenterType,TbsCenterType.center); + budgetLambdaQueryWrapper.eq(TbsBudget::getCenterId,id); + if(0 lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivityCenter::getCenterId,id); + lqw.eq(TbsActivityCenter::getCenterType, TbsCenterType.center.name()); + if(activityCenterService.count(lqw)>0){ + return R.error("活动含当前成本中心,删除失败"); + } + boolean result = bmsCostCenterService.listChild(id).size()>0; + if(result){ + return R.error("存在子节点无法删除"); + } + + //bmsCostCenterService + LambdaQueryWrapper centerRegionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + centerRegionLambdaQueryWrapper.eq(BmsCenterRegion::getCenterId,id); + boolean centerRegionExist = bmsCenterRegionService.count(centerRegionLambdaQueryWrapper)>0; + if(centerRegionExist){ + return R.error("区域使用中,删除失败"); + } + bmsCostCenterService.removeById(id); + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsDutyInfoController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsDutyInfoController.java new file mode 100644 index 0000000..cee9107 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsDutyInfoController.java @@ -0,0 +1,37 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.R; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.BmsDutyInfo; +import com.qs.serve.modules.bms.service.BmsDutyInfoService; + +import java.util.List; + +/** + * 基础档案 税务信息 + * @author YenHex + * @since 2023-08-30 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/dutyInfo") +public class BmsDutyInfoController { + + private BmsDutyInfoService bmsDutyInfoService; + + @GetMapping("/list") + public R> getList(){ + List list = bmsDutyInfoService.list( + new LambdaQueryWrapper() + .eq(BmsDutyInfo::getShowFlag,1) + ); + return R.ok(list); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsFactoryController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsFactoryController.java new file mode 100644 index 0000000..a413601 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsFactoryController.java @@ -0,0 +1,113 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.CollectionUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.common.FactoryIdOperation; +import com.qs.serve.modules.bms.service.BmsRegionService; +import com.qs.serve.modules.goods.service.GoodsSpecValueService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.BmsFactory; +import com.qs.serve.modules.bms.service.BmsFactoryService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 基础档案 工厂产地 + * @author YenHex + * @since 2022-10-20 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/factory") +public class BmsFactoryController { + + private BmsFactoryService bmsFactoryService; + private BmsRegionService bmsRegionService; + private GoodsSpecValueService goodsSpecValueService; + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('bms:factory:query')") + public R> getPage(BmsFactory param){ + PageUtil.startPage(); + LambdaQueryWrapper factoryWrapper = new LambdaQueryWrapper<>(param); + factoryWrapper.orderByDesc(BmsFactory::getCreateTime); + List list = bmsFactoryService.list(factoryWrapper); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "工厂产地", biz = BizType.QUERY) + @PreAuthorize("hasRole('bms:factory:query')") + public R getById(@PathVariable("id") String id){ + BmsFactory bmsFactory = bmsFactoryService.getById(id); + return R.ok(bmsFactory); + } + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "工厂产地", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:factory:update')") + public R updateById(@RequestBody @Valid BmsFactory param){ + param.setCode(null); + param.setName(null); + boolean result = bmsFactoryService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "工厂产地", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:factory:insert')") + public R save(@RequestBody @Valid BmsFactory param){ + boolean result = bmsFactoryService.save(param); + bmsRegionService.updateAllFactoryIdsByFactoryId(param.getId(), FactoryIdOperation.Add); + return R.isTrue(result); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BASE, title = "工厂产地", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:factory:delete')") + public R deleteById(@PathVariable("id") String id){ + boolean result = bmsFactoryService.removeById(id); + bmsRegionService.updateAllFactoryIdsByFactoryId(id, FactoryIdOperation.Del); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsMasterUserController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsMasterUserController.java new file mode 100644 index 0000000..0791310 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsMasterUserController.java @@ -0,0 +1,274 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.bms.common.MasterUserType; +import com.qs.serve.modules.bms.entity.*; +import com.qs.serve.modules.bms.entity.vo.BmsMasterUserCenterVo; +import com.qs.serve.modules.bms.entity.vo.BmsMasterUserChannelVo; +import com.qs.serve.modules.bms.mapper.BmsMasterUserMapper; +import com.qs.serve.modules.bms.service.BmsChannelPointService; +import com.qs.serve.modules.bms.service.BmsChannelService; +import com.qs.serve.modules.bms.service.BmsCostCenterService; +import com.qs.serve.modules.his.entity.HisUserChannelPoint; +import com.qs.serve.modules.his.service.HisUserChannelPointService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.vo.BmsMasterUserVo; +import com.qs.serve.modules.bms.entity.bo.BmsMasterUserBo; +import com.qs.serve.modules.bms.service.BmsMasterUserService; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 基础档案 负责人 + * @author YenHex + * @since 2022-11-10 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/masterUser") +public class BmsMasterUserController { + + private BmsChannelService bmsChannelService; + private BmsChannelPointService bmsChannelPointService; + private BmsMasterUserService bmsMasterUserService; + private BmsMasterUserMapper bmsMasterUserMapper; + private BmsCostCenterService costCenterService; + private SysUserService sysUserService; + private HisUserChannelPointService hisUserChannelPointService; + private BmsChannelService channelService; + + /** + * 负责人列表(渠道) + * @param userChannel + * @return + */ + @GetMapping("/list4Channel") + public R> getList(BmsMasterUserChannelVo userChannel){ + List list = bmsMasterUserMapper.selectChannelMasterUserList(userChannel); + return R.ok(list); + } + + /** + * 负责人翻页(渠道) + * @param param + * @return + */ + @GetMapping("/page4Channel") + public R> getPage(BmsMasterUser param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + lqw.eq(BmsMasterUser::getType,MasterUserType.Channel); + PageUtil.startPage(); + List list = bmsMasterUserService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * 负责人列表(网点) + * @param param + * @return + */ + @GetMapping("/list4Point") + public R> list4Point(BmsMasterUser param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + lqw.eq(BmsMasterUser::getType,MasterUserType.Point); + List list = bmsMasterUserService.list(lqw); + return R.ok(list); + } + + /** + * 负责人翻页(网点) + * @param param + * @return + */ + @GetMapping("/page4Point") + public R> page4Point(BmsMasterUser param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + lqw.eq(BmsMasterUser::getType,MasterUserType.Point); + PageUtil.startPage(); + List list = bmsMasterUserService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * 负责人列表(成本中心) + * @param param + * @return + */ + @GetMapping("/list4center") + public R> list4center(BmsMasterUser param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + lqw.eq(BmsMasterUser::getType,MasterUserType.Center); + List list = bmsMasterUserService.list(lqw); + return R.ok(list); + } + + /** + * 负责人翻页(成本中心) + * @param param + * @return + */ + @GetMapping("/page4center") + public R> page4center(BmsMasterUser param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + lqw.eq(BmsMasterUser::getType,MasterUserType.Center); + PageUtil.startPage(); + List list = bmsMasterUserService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "负责人", biz = BizType.QUERY) + @PreAuthorize("hasRole('bms:masterUser:query')") + public R getById(@PathVariable("id") String id){ + BmsMasterUser bmsMasterUser = bmsMasterUserService.getById(id); + SysUser sysUser = sysUserService.getById(bmsMasterUser.getUserId()); + bmsMasterUser.setUserInfo(sysUser.toSysUserVo()); + if(bmsMasterUser.getType().equals(MasterUserType.Channel)){ + BmsChannel channel = bmsChannelService.getById(bmsMasterUser.getTargetId()); + bmsMasterUser.setObjectInfo(channel); + }else if(bmsMasterUser.getType().equals(MasterUserType.Point)){ + BmsChannelPoint point = bmsChannelPointService.getById(bmsMasterUser.getTargetId()); + bmsMasterUser.setObjectInfo(point); + } + return R.ok(bmsMasterUser); + } + + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/saveBatch") + @SysLog(module = SystemModule.BASE, title = "负责人", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:masterUser:insert')") + public R save(@RequestBody @Valid BmsMasterUserBo param){ + String type = param.getType(); + if(!type.equals(MasterUserType.Center) && !type.equals(MasterUserType.Channel) && !type.equals(MasterUserType.Point )){ + Assert.throwEx("没有对应的"+param.getType()+"类型!"); + } + List masterUsers = new ArrayList<>(); + for (String userId : param.getUserIds()) { + SysUser sysUser = sysUserService.getById(userId); + for (String targetId : param.getTargetIds()) { + bmsMasterUserService.removeMgrUser(type,targetId,userId); + BmsMasterUser masterUser = new BmsMasterUser(); + masterUser.setType(type); + masterUser.setTargetId(targetId); + masterUser.setUserId(userId); + if(type.equals(MasterUserType.Point)){ + BmsChannelPoint channelPoint = bmsChannelPointService.getById(targetId); + BmsChannel bmsChannel = channelService.getById(channelPoint.getChannelId()); + masterUser.setChannelName(bmsChannel.getChannelName()); + masterUser.setChannelCode(bmsChannel.getChannelCode()); + masterUser.setPointCode(channelPoint.getPointCode()); + masterUser.setPointName(channelPoint.getPointName()); + }else if (type.equals(MasterUserType.Channel)){ + BmsChannel bmsChannel = channelService.getById(targetId); + masterUser.setChannelName(bmsChannel.getChannelName()); + masterUser.setChannelCode(bmsChannel.getChannelCode()); + }else { + BmsCostCenter costCenter = costCenterService.getById(targetId); + masterUser.setCenterCode(costCenter.getCode()); + masterUser.setCenterName(costCenter.getName()); + } + masterUser.setUserName(sysUser.getName()); + masterUser.setUserCode(sysUser.getCode()); + masterUsers.add(masterUser); + } + } + bmsMasterUserService.saveBatch(masterUsers); + if(type.equals(MasterUserType.Point)){ + List channelPointList = bmsChannelPointService.listByIds(param.getTargetIds()); + for (BmsChannelPoint channelPoint : channelPointList) { + hisUserChannelPointService.flushPoint(channelPoint.getId(),channelPoint.getSaleRegionPathIds(),channelPoint.getBizRegionPathIds()); + } + }else { + for (String targetId : param.getTargetIds()) { + hisUserChannelPointService.flushByChannelId(Long.parseLong(targetId)); + } + } + return R.ok(); + } + + /** + * 设置为主要负责人 + * @param id + * @return + */ + @PostMapping("/setMaster/{id}") + @SysLog(module = SystemModule.BASE, title = "区域负责人", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:regionUser:update')") + public R updateById(@PathVariable("id")Long id){ + bmsMasterUserService.setMaster(id); + return R.ok(); + } + + /** + * 取消主要负责人 + * @param id + * @return + */ + @PostMapping("/cancelMaster/{id}") + @SysLog(module = SystemModule.BASE, title = "区域负责人", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:masterUser:update')") + public R cancelMaster(@PathVariable("id")Long id){ + BmsMasterUser regionUser = new BmsMasterUser(); + regionUser.setId(id); + regionUser.setMasterFlag(0); + bmsMasterUserService.updateById(regionUser); + return R.ok(); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BASE, title = "负责人", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:masterUser:delete')") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + List masterUserList = bmsMasterUserService.listByIds(idsLong); + if(CollectionUtil.isNotEmpty(masterUserList)){ + for (BmsMasterUser masterUser : masterUserList) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + if(masterUser.getType().equals(MasterUserType.Point)){ + lqw.eq(HisUserChannelPoint::getPointId,masterUser.getTargetId()); + lqw.eq(HisUserChannelPoint::getSourceType,0); + hisUserChannelPointService.remove(lqw); + }else if (masterUser.getType().equals(MasterUserType.Channel)){ + lqw.eq(HisUserChannelPoint::getSourceIds,masterUser.getTargetId()); + lqw.eq(HisUserChannelPoint::getSourceType,3); + hisUserChannelPointService.remove(lqw); + } + } + } + boolean result = bmsMasterUserService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsRegion2Controller.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsRegion2Controller.java new file mode 100644 index 0000000..b959873 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsRegion2Controller.java @@ -0,0 +1,458 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.annotation.LimitSubmit; +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.so.BirBudgetTargetSo; +import com.qs.serve.modules.bir.service.BirBudgetTargetService; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsRegionUser; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.bo.BmsRegionBatchBo; +import com.qs.serve.modules.bms.entity.so.BmsBizRegionTreeSo; +import com.qs.serve.modules.bms.entity.vo.BmsRegionTreeVo; +import com.qs.serve.modules.bms.service.*; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.tbs.common.TbsCenterType; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.service.TbsBudgetService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.Nullable; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 基础档案 行政区域 + * @author YenHex + * @since 2022-10-10 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/bizRegion") +public class BmsRegion2Controller { + + private BmsRegion2Service bmsRegion2Service; + private BmsSupplierService bmsSupplierService; + private BmsRuleRegionService bmsRuleRegionService; + private BmsChannelPointService bmsChannelPointService; + private BmsRegionUserService bmsRegionUserService; + private TbsBudgetService tbsBudgetService; + private BirBudgetTargetService birBudgetTargetService; + private SysPostUserService postUserService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + @PreAuthorize("hasRole('bms:region:query')") + public R> getList(BmsRegion2 param){ + LambdaQueryWrapper regionWrapper = new LambdaQueryWrapper<>(param); + List list = bmsRegion2Service.list(regionWrapper); + return R.ok(list); + } + + /** + * 树查询(当前负责人) + * @return + */ + private List treeByCurrentUser(String supplierId){ + String userId = AuthContextUtils.getSysUserId(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRegionUser::getType,1); + lqw.eq(BmsRegionUser::getUserId,userId); + List regionUsers = bmsRegionUserService.list(lqw); + List regionIds = regionUsers.stream().map(BmsRegionUser::getRegionId).collect(Collectors.toList()); + if(StringUtils.hasText(supplierId)){ + BmsSupplier supplier = bmsSupplierService.getById(supplierId); + if(supplier.listBizRegionIds()!=null){ + regionIds.addAll(supplier.listBizRegionIds()); + } + } + return buildTreeSortUpward(regionIds); + } + + /** + * 树查询(当前负责人及区域负责人) + * @return + */ + private List treeByCurrentUserAndRegionMgr(String supplierId){ + String userId = AuthContextUtils.getSysUserId(); + List userIds = postUserService.listByChildIds(userId); + userIds.add(userId); + + Set regionIds = new HashSet<>(); + for (String uid : userIds) { + BmsSupplier param = new BmsSupplier(); + param.setCurrUserId(uid); + List list = bmsSupplierService.selectSupplierList(param); + for (BmsSupplier supplier : list) { + regionIds.addAll(supplier.listBizRegionIds()); + } + } + + if(StringUtils.hasText(supplierId)){ + BmsSupplier supplier = bmsSupplierService.getById(supplierId); + if(supplier.listBizRegionIds()!=null){ + regionIds.addAll(supplier.listBizRegionIds()); + } + } + return buildTreeSortUpward(new ArrayList<>(regionIds)); + } + + /** + * 向上创建树数据 + * @param regionIds + * @return + */ + @Nullable + private List buildTreeSortUpward(List regionIds) { + if(regionIds.size()>0){ + List regionList = bmsRegion2Service.listByIds(regionIds); + Map> listMap = regionList.stream().collect(Collectors.groupingBy(BmsRegion2::getLevel)); + List list1 = listMap.get(1)==null?new ArrayList<>():listMap.get(1); + List list2 = listMap.get(2)==null?new ArrayList<>():listMap.get(2); + List list3 = listMap.get(3)==null?new ArrayList<>():listMap.get(3); + List list4 = listMap.get(4)==null?new ArrayList<>():listMap.get(4); + + List allList = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(list1)){ + allList.addAll(list1); + List lv01Pids = list1.stream().map(BmsRegion2::getId).collect(Collectors.toList()); + List level02List = bmsRegion2Service.listChild(lv01Pids); + if(CollectionUtil.isNotEmpty(level02List)){ + allList.addAll(level02List); + //list2 去重 + list2 = removeExistList(list2, level02List); + List lv02Pids = level02List.stream().map(BmsRegion2::getId).collect(Collectors.toList()); + List level03List = bmsRegion2Service.listChild(lv02Pids); + if(CollectionUtil.isNotEmpty(level03List)){ + allList.addAll(level03List); + //list3 去重 + list3 = removeExistList(list3,level03List); + List lv03Pids = level03List.stream().map(BmsRegion2::getId).collect(Collectors.toList()); + List level04List = bmsRegion2Service.listChild(lv03Pids); + //list4 去重 + list4 = removeExistList(list4,level04List); + allList.addAll(level04List); + } + } + } + + if(CollectionUtil.isNotEmpty(list2)){ + List lv02Pids = list2.stream().map(BmsRegion2::getId).collect(Collectors.toList()); + List level03List = bmsRegion2Service.listChild(lv02Pids); + if(CollectionUtil.isNotEmpty(level03List)){ + allList.addAll(level03List); + //list3 去重 + list3 = removeExistList(list3,level03List); + List lv03Pids = level03List.stream().map(BmsRegion2::getId).collect(Collectors.toList()); + List level04List = bmsRegion2Service.listChild(lv03Pids); + //list4 去重 + list4 = removeExistList(list4,level04List); + allList.addAll(level04List); + } + list2.forEach(a->a.setPid("0")); + allList.addAll(list2); + } + + if(CollectionUtil.isNotEmpty(list3)){ + List lv03Pids = list3.stream().map(BmsRegion2::getId).collect(Collectors.toList()); + List level04List = bmsRegion2Service.listChild(lv03Pids); + //list4 去重 + list4 = removeExistList(list4,level04List); + allList.addAll(level04List); + list3.forEach(a->a.setPid("0")); + allList.addAll(list3); + } + + if(CollectionUtil.isNotEmpty(list4)){ + //list4 去重 + list4.forEach(a->a.setPid("0")); + allList.addAll(list4); + } + return toTreeNodeList2(allList); + + } + return null; + } + + /** + * 移除包含的列 + * @param settingList + * @param byPidLoadList + * @return + */ + private List removeExistList(List settingList, List byPidLoadList) { + if(CollectionUtil.isNotEmpty(settingList)&&CollectionUtil.isNotEmpty(byPidLoadList)){ + settingList = settingList.stream().filter(a-> + byPidLoadList.stream().noneMatch(b->b.getId().equals(a.getId())) + ).collect(Collectors.toList()); + } + return settingList; + } + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('bms:region:query')") + public R> getPage(BmsRegion2 param){ + PageUtil.startPage(); + LambdaQueryWrapper regionWrapper = new LambdaQueryWrapper<>(param); + List list = bmsRegion2Service.list(regionWrapper); + return R.byPageHelperList(list); + } + + /** + * 树查询 + * @param so + * @return + */ + @GetMapping("/tree") + @PreAuthorize("hasRole('bms:region:query')") + public R> getTree(BmsBizRegionTreeSo so){ + // 用于审批辅助 + if(so.getLoadByCurrent()!=null&&so.getLoadByCurrent().equals(2)) { + BirBudgetTargetSo query = new BirBudgetTargetSo(); + query.setLoadType(so.getType()); + query.setSelectCenterFlag(3); + query.setTargetId(so.getTargetId()); + query.setYearMonthStart(so.getYearMonthStart()); + query.setYearMonthEnd(so.getYearMonthEnd()); + List regionIds = birBudgetTargetService.getCenterByTargetId(query); + if(regionIds.size()==0){ + return R.ok(new ArrayList()); + } + List regionList = bmsRegion2Service.listByIds(regionIds); + List treeVoList = new ArrayList<>(); + for (BmsRegion2 region : regionList) { + BmsRegionTreeVo treeNode = CopierUtil.copy(region,new BmsRegionTreeVo()); + treeNode.setId(region.getId()); + treeNode.setSort(0); + treeVoList.add(treeNode); + } + return R.ok(treeVoList); + } + // 当前负责人 + if(so.getLoadByCurrent()!=null&&so.getLoadByCurrent().equals(1)){ + if(so.getOnlySupplierFlag()!=null&&so.getOnlySupplierFlag().equals(1)){ + BmsSupplier supplier = bmsSupplierService.getById(so.getSupplierId()); + List rlist = bmsRegion2Service.listByIds(supplier.listBizRegionIds()); + List treeVoList = new ArrayList<>(); + for (BmsRegion2 region2 : rlist) { + BmsRegionTreeVo treeNode = CopierUtil.copy(region2,new BmsRegionTreeVo()); + treeNode.setId(region2.getId()); + treeNode.setParentId(region2.getPid()); + treeNode.setSort(0); + treeVoList.add(treeNode); + } + return R.ok(treeVoList); + }else { + return R.ok(treeByCurrentUser(so.getSupplierId())); + } + } + // 当前负责人及区域负责人 + if(so.getLoadByCurrent()!=null&&so.getLoadByCurrent().equals(3)){ + if(so.getOnlySupplierFlag()!=null&&so.getOnlySupplierFlag().equals(1)){ + BmsSupplier supplier = bmsSupplierService.getById(so.getSupplierId()); + List rlist = bmsRegion2Service.listByIds(supplier.listBizRegionIds()); + List treeVoList = new ArrayList<>(); + for (BmsRegion2 region2 : rlist) { + BmsRegionTreeVo treeNode = CopierUtil.copy(region2,new BmsRegionTreeVo()); + treeNode.setId(region2.getId()); + treeNode.setParentId(region2.getPid()); + treeNode.setSort(0); + treeVoList.add(treeNode); + } + return R.ok(treeVoList); + }else { + return R.ok(treeByCurrentUserAndRegionMgr(so.getSupplierId())); + } + } + return R.ok(bmsRegion2Service.getTree(so.getListUserFlag()!=null&&so.getListUserFlag().equals(1))); + } + + private List toTreeNodeList2(List list){ + List treeVoList = new ArrayList<>(); + for (BmsRegion2 region2 : list) { + BmsRegionTreeVo treeNode = CopierUtil.copy(region2,new BmsRegionTreeVo()); + treeNode.setId(region2.getId()); + treeNode.setParentId(region2.getPid()); + treeNode.setSort(0); + treeVoList.add(treeNode); + } + return TreeUtil.build(treeVoList,TreeUtil.DEFAULT_PID_STRING); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "区域档案", biz = BizType.QUERY) + @PreAuthorize("hasRole('bms:region:query')") + public R getById(@PathVariable("id") String id){ + BmsRegion2 msRegion2 = bmsRegion2Service.getById(id); + if(StringUtils.hasText(msRegion2.getPid())&&msRegion2.getPid().equals("0")){ + msRegion2.setPid(null); + } + if(msRegion2.getPid()!=null&&!msRegion2.getPid().equals("0")){ + BmsRegion2 bmsRegion2 = bmsRegion2Service.getById(msRegion2.getPid()); + msRegion2.setParentInfo(bmsRegion2); + } + return R.ok(msRegion2); + } + + /** + * 更新 + * @param regionBo + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "区域档案", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:region:update')") + public R updateById(@RequestBody @Valid BmsRegionBatchBo.BmsRegionBo regionBo){ + long count = bmsRegion2Service.count(new LambdaQueryWrapper() + .ne(BmsRegion2::getId,regionBo.getId()) + .eq(BmsRegion2::getName,regionBo.getName()) + ); + if(count>0){ + return R.isTrue(false,"名称重复"); + } + BmsRegion2 param = new BmsRegion2(); + param.setId(regionBo.getId()); + param.setName(regionBo.getName()); + param.setPid(regionBo.getPid()); + param.setRemark(regionBo.getRemark()); + param.setSysCode1(regionBo.getSysCode1()); + param.setSysCode2(regionBo.getSysCode2()); + param.setSysCode3(regionBo.getSysCode3()); + boolean result = bmsRegion2Service.updateBizRegionById(param); + return R.isTrue(result); + } + + /** + * 更新工厂 + * @param regionBo + * @return + */ + @PostMapping("/updateFactory") + @SysLog(module = SystemModule.BASE, title = "区域档案", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:region:update')") + public R updateFactory(@RequestBody BmsRegion2 regionBo){ + BmsRegion2 param = new BmsRegion2(); + param.setId(regionBo.getId()); + boolean result = bmsRegion2Service.updateBmsRegion2ById(param); + return R.isTrue(result); + } + + /** + * 新增区域档案 + * @param regionBo + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "区域档案", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:region:insert')") + public R save(@RequestBody @Valid BmsRegionBatchBo.BmsRegionBo regionBo){ + long count = bmsRegion2Service.count(new LambdaQueryWrapper() + .eq(BmsRegion2::getName,regionBo.getName()) + ); + if(count>0){ + return R.isTrue(false,"名称重复"); + } + BmsRegion2 param = CopierUtil.copy(regionBo,new BmsRegion2()); + if(param.getId()==null){ + param.setId("B"+IdUtil.getSnowFlakeId()); + } + boolean result = bmsRegion2Service.saveBmsRegion2(param); + return R.isTrue(result); + } + + /** + * 更新祖级数据 + * @return + */ + @LimitSubmit(interval = 15000) + @GetMapping("/updateLevel") + public R updateLevel(){ + bmsRegion2Service.flushAllLevel(true); + return R.ok(); + } + + /** + * (批量)编辑(更新,只允许改名称) + * @param regionBo + * @return + */ + //@PostMapping("/editBatch") + //@SysLog(module = SystemModule.BASE, title = "区域档案", biz = BizType.INSERT) + //@PreAuthorize("hasRole('bms:region:insert')") + public R editBatch(@RequestBody @Valid BmsRegionBatchBo regionBo){ + ValidateTools.valid(regionBo.getRegionList()); + for (BmsRegionBatchBo.BmsRegionBo BmsRegion2Bo : regionBo.getRegionList()) { + BmsRegion2 dbRegion = bmsRegion2Service.getByCode(BmsRegion2Bo.getCode()); + if(dbRegion==null){ + BmsRegion2 region = CopierUtil.copy(BmsRegion2Bo,new BmsRegion2()); + bmsRegion2Service.save(region); + }else { + BmsRegion2 param = new BmsRegion2(); + param.setId(BmsRegion2Bo.getId()); + param.setName(BmsRegion2Bo.getName()); + bmsRegion2Service.updateById(param); + } + } + bmsRegion2Service.flushAllLevel(true); + return R.ok(); + } + + /** + * 删除区域档案 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BASE, title = "区域档案", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:region:delete')") + public R deleteById(@PathVariable("id") String id){ + if(bmsRegion2Service.listChild(id).size()>0){ + return R.error("含有子区域无法删除"); + } + //如果有供应商则不允许删除 + if(bmsSupplierService.listByRegion2Id(id).size()>0){ + return R.error("地区含有供应商无法删除"); + } + if(bmsChannelPointService.listBySaleRegionId(id).size()>0){ + return R.error("地区含有网点无法删除"); + } + LambdaQueryWrapper budgetLambdaQueryWrapper = new LambdaQueryWrapper<>(); + budgetLambdaQueryWrapper.eq(TbsBudget::getCenterType, TbsCenterType.bizRegion); + budgetLambdaQueryWrapper.eq(TbsBudget::getCenterId,id); + if(0> getList(BmsRegion param){ + LambdaQueryWrapper regionWrapper = new LambdaQueryWrapper<>(param); + List list = bmsRegionService.list(regionWrapper); + return R.ok(list); + } + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('bms:region:query')") + public R> getPage(BmsRegion param){ + PageUtil.startPage(); + LambdaQueryWrapper regionWrapper = new LambdaQueryWrapper<>(param); + List list = bmsRegionService.list(regionWrapper); + return R.byPageHelperList(list); + } + + /** + * 树查询 + * @param so listUserFlag 加载我负责的用户所属的区域 loadByCurrent 值=1,过滤当前用户负责数据(优先级最高) stopFlag (0,1)是否停用,2->加载所有 + * @return + */ + @GetMapping("/tree") + @PreAuthorize("hasRole('bms:region:query')") + public R> getTree(BmsSaleRegionTreeSo so){ + if(so.getLoadByCurrent()!=null&&so.getLoadByCurrent().equals(2)) { + BirBudgetTargetSo query = new BirBudgetTargetSo(); + query.setLoadType(so.getType()); + query.setSelectCenterFlag(4); + query.setTargetId(so.getTargetId()); + query.setYearMonthStart(so.getYearMonthStart()); + query.setYearMonthEnd(so.getYearMonthEnd()); + List regionIds = birBudgetTargetService.getCenterByTargetId(query); + if(regionIds.size()==0){ + return R.ok(new ArrayList()); + } + List regionList = bmsRegionService.listByIds(regionIds); + List treeVoList = new ArrayList<>(); + for (BmsRegion region : regionList) { + BmsRegionTreeVo treeNode = CopierUtil.copy(region,new BmsRegionTreeVo()); + treeNode.setId(region.getId()); + treeNode.setSort(0); + treeVoList.add(treeNode); + } + return R.ok(treeVoList); + } + if(so.getStopFlag()==null){ + so.setStopFlag(0); + } + // 当前负责人 + if(so.getLoadByCurrent()!=null&&so.getLoadByCurrent().equals(1)){ + return R.ok(treeByCurrentUser(so.getSupplierId(),so.getStopFlag())); + } + // 当前负责人及下属负责人 + if(so.getLoadByCurrent()!=null&&so.getLoadByCurrent().equals(3)){ + return R.ok(treeByCurrentUserAndChildUser(so.getSupplierId(),so.getStopFlag())); + } + return R.ok(bmsRegionService.getTree(so.getListUserFlag()!=null&&so.getListUserFlag().equals(1), so.getStopFlag())); + } + + + /** + * 加载当前负责人的 + * @param supplierId + * @param stopFlag + * @return + */ + public List treeByCurrentUser(String supplierId,Integer stopFlag){ + String userId = AuthContextUtils.getSysUserId(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRegionUser::getType,0); + lqw.eq(BmsRegionUser::getUserId,userId); + List regionUsers = bmsRegionUserService.list(lqw); + List regionIds = regionUsers.stream().map(BmsRegionUser::getRegionId).collect(Collectors.toList()); + if(StringUtils.hasText(supplierId)){ + BmsSupplier supplier = bmsSupplierService.getById(supplierId); + regionIds.addAll(supplier.listSaleRegionIds()); + } + return buildRegionTreeByRegionIds(stopFlag, regionIds); + } + + /** + * 加载当前负责人和下属的 + * @param supplierId + * @param stopFlag + * @return + */ + public List treeByCurrentUserAndChildUser(String supplierId,Integer stopFlag){ + String userId = AuthContextUtils.getSysUserId(); + List userIds = postUserService.listByChildIds(userId); + userIds.add(userId); + + Set regionIds = new HashSet<>(); + for (String uid : userIds) { + BmsSupplier param = new BmsSupplier(); + param.setCurrUserId(uid); + List list = bmsSupplierService.selectSupplierList(param); + for (BmsSupplier supplier : list) { + regionIds.addAll(supplier.listBizRegionIds()); + } + } + + if(StringUtils.hasText(supplierId)){ + BmsSupplier supplier = bmsSupplierService.getById(supplierId); + regionIds.addAll(supplier.listSaleRegionIds()); + } + return buildRegionTreeByRegionIds(userIds,stopFlag, new ArrayList<>(regionIds)); + } + + @Nullable + private List buildRegionTreeByRegionIds(Integer stopFlag, List regionIds){ + return this.buildRegionTreeByRegionIds(null,stopFlag,regionIds); + } + + @Nullable + private List buildRegionTreeByRegionIds(List userIds,Integer stopFlag, List regionIds) { + List supplierIds; + if(CollectionUtil.isNotEmpty(userIds)){ + BmsSupplier supplier = new BmsSupplier(); + supplier.setSelectUserIdsFlag(true); + supplier.setSelectUserIds(userIds); + supplierIds = hisUserSupplierService.selectHisSupplier(supplier,false); + }else { + supplierIds = hisUserSupplierService.selectHisSupplier(null,false); + } + supplierIds.add(0L); + List supplierList = bmsSupplierService.listByIds(supplierIds); + List firstRegionIds = supplierList.stream().map(a->a.getRegionFirst()).collect(Collectors.toList()); + List secondRegionIds = supplierList.stream().map(a->a.getRegionSecond()).collect(Collectors.toList()); + List thirdRegionIds = supplierList.stream().map(a->a.getRegionThird()).collect(Collectors.toList()); + List fourthlyRegionIds = supplierList.stream().map(a->a.getRegionFourthly()).collect(Collectors.toList()); + regionIds.addAll(firstRegionIds); + regionIds.addAll(secondRegionIds); + regionIds.addAll(thirdRegionIds); + regionIds.addAll(fourthlyRegionIds); + + regionIds = regionIds.stream().distinct().collect(Collectors.toList()); + if(regionIds.size()>0){ + List allSelectList = new ArrayList<>(); + + List regionList = bmsRegionService.listByIds(regionIds); + if(regionList.size()==0){ + return toTreeNodeList2(allSelectList, stopFlag); + } + + List pathIds = regionList.stream().filter(b->b.getPathIds()!=null) + .map(BmsRegion::getPathIds).collect(Collectors.toList()); + List idList = pathIds.stream() + .flatMap(pathId -> Arrays.stream(pathId.split("_"))) + .collect(Collectors.toList()); + regionList = bmsRegionService.listByIds(idList); + return toTreeNodeList2(regionList, stopFlag); + + } + return null; + } + + /** + * 移除包含的列 + * @param settingList + * @param byPidLoadList + * @return + */ + private List removeExistList(List settingList, List byPidLoadList) { + if(CollectionUtil.isNotEmpty(settingList)&&CollectionUtil.isNotEmpty(byPidLoadList)){ + settingList = settingList.stream().filter(a-> + byPidLoadList.stream().noneMatch(b->b.getId().equals(a.getId())) + ).collect(Collectors.toList()); + } + return settingList; + } + + + private List toTreeNodeList2(List list,Integer stopFlag){ + List treeVoList = new ArrayList<>(); + for (BmsRegion region2 : list) { + //跳过停用的或未停用的 + if(stopFlag!=2&&!region2.getStopFlag().equals(stopFlag)){ + continue; + } + BmsRegionTreeVo treeNode = CopierUtil.copy(region2,new BmsRegionTreeVo()); + treeNode.setId(region2.getId()); + treeNode.setParentId(region2.getPid()); + treeNode.setSort(0); + treeVoList.add(treeNode); + } + return TreeUtil.build(treeVoList,TreeUtil.DEFAULT_PID_STRING); + } + + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "区域档案", biz = BizType.QUERY) + @PreAuthorize("hasRole('bms:region:query')") + public R getById(@PathVariable("id") String id){ + BmsRegion bmsRegion = bmsRegionService.getById(id); + if(StringUtils.hasText(bmsRegion.getPid())&&bmsRegion.getPid().equals("0")){ + bmsRegion.setPid(null); + } + if(bmsRegion.getPid()!=null){ + BmsRegion bmsRegion2 = bmsRegionService.getById(bmsRegion.getPid()); + bmsRegion.setParentInfo(bmsRegion2); + } + List defaultFactories = bmsFactoryService.list(); + if(CollectionUtil.isNotEmpty(bmsRegion.getFactoryIds())){ + List factories = new ArrayList<>(); + for (String factoryId : bmsRegion.getFactoryIds()) { + for (BmsFactory factory : defaultFactories) { + if(factory.getId().equals(factoryId)){ + factories.add(factory); + } + } + } + bmsRegion.setFactoryInfos(factories); + }else { + bmsRegion.setFactoryInfos(defaultFactories); + } + return R.ok(bmsRegion); + } + + /** + * 更新 + * @param regionBo + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "区域档案", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:region:update')") + public R updateById(@RequestBody @Valid BmsRegionBatchBo.BmsRegionBo regionBo){ + BmsRegion param = new BmsRegion(); + param.setId(regionBo.getId()); + param.setName(regionBo.getName()); + param.setPid(regionBo.getPid()); + param.setAliasRegion(regionBo.getAliasRegion()); + param.setStopFlag(regionBo.getStopFlag()); + param.setRemark(regionBo.getRemark()); + param.setSysCode1(regionBo.getSysCode1()); + param.setSysCode2(regionBo.getSysCode2()); + param.setSysCode3(regionBo.getSysCode3()); + boolean result = bmsRegionService.updateSaleRegionById(param); + hisUserSupplierService.cleanTable(); + return R.isTrue(result); + } + + /** + * 更新工厂 + * @param regionBo + * @return + */ + @PostMapping("/updateFactory") + @SysLog(module = SystemModule.BASE, title = "区域档案", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:region:update')") + public R updateFactory(@RequestBody BmsRegion regionBo){ + BmsRegion param = new BmsRegion(); + param.setId(regionBo.getId()); + param.setFactoryIds(regionBo.getFactoryIds()); + boolean result = bmsRegionService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增区域档案 + * @param regionBo + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "区域档案", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:region:insert')") + public R save(@RequestBody @Valid BmsRegionBatchBo.BmsRegionBo regionBo){ + BmsRegion param = CopierUtil.copy(regionBo,new BmsRegion()); + if(param.getId()==null){ + param.setId("A"+IdUtil.getSnowFlakeId()); + } + if (param.getCode()==null){ + param.setCode(CodeGenUtil.getDataCode(CodeGenUtil.SourceDataKey.SaleRegion)); + } + boolean result = bmsRegionService.saveBmsRegion(param); + return R.isTrue(result); + } + + + /** + * 更新祖级数据 + * @return + */ + @LimitSubmit(interval = 15000) + @GetMapping("/updateLevel") + public R updateLevel(){ + bmsRegionService.flushAllLevel(true); + return R.ok(); + } + + /** + * (批量)编辑(更新,只允许改名称) + * @param regionBo + * @return + */ + //@PostMapping("/editBatch") + @SysLog(module = SystemModule.BASE, title = "区域档案", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:region:insert')") + public R editBatch(@RequestBody @Valid BmsRegionBatchBo regionBo){ + ValidateTools.valid(regionBo.getRegionList()); + for (BmsRegionBatchBo.BmsRegionBo bmsRegionBo : regionBo.getRegionList()) { + BmsRegion dbRegion = bmsRegionService.getByCode(bmsRegionBo.getCode()); + if(dbRegion==null){ + BmsRegion region = CopierUtil.copy(bmsRegionBo,new BmsRegion()); + bmsRegionService.save(region); + }else { + BmsRegion param = new BmsRegion(); + param.setId(bmsRegionBo.getId()); + param.setName(bmsRegionBo.getName()); + bmsRegionService.updateById(param); + } + } + bmsRegionService.flushAllLevel(false); + //清空临时表 + hisUserSupplierService.cleanTable(); + return R.ok(); + } + + + /** + * 删除区域档案 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BASE, title = "区域档案", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:region:delete')") + public R deleteById(@PathVariable("id") String id){ + //删除区域档案 + if(bmsRegionService.listChild(id).size()>0){ + return R.error("含有子区域无法删除"); + } + //如果有供应商则不允许删除 + if(bmsSupplierService.listByRegionId(id).size()>0){ + return R.error("地区含有供应商无法删除"); + } + if(bmsChannelPointService.listByBizRegionId(id).size()>0){ + return R.error("地区含有网点无法删除"); + } + + LambdaQueryWrapper budgetLambdaQueryWrapper = new LambdaQueryWrapper<>(); + budgetLambdaQueryWrapper.eq(TbsBudget::getCenterType, TbsCenterType.saleRegion); + budgetLambdaQueryWrapper.eq(TbsBudget::getCenterId,id); + if(0> getPage(BmsRegionUserBo param){ + BmsRegionUser regionUser = CopierUtil.copy(param,new BmsRegionUser()); + LambdaQueryWrapper regionUserWrapper = new LambdaQueryWrapper<>(regionUser); + List list = bmsRegionUserService.list(regionUserWrapper); + if(list.size()<1){ + return R.ok(new ArrayList<>()); + } + List userIds = list.stream().map(BmsRegionUser::getUserId).collect(Collectors.toList()); + List sysUsers = sysUserService.listByIds(userIds); + for (BmsRegionUser bmsRegionUser : list) { + for (SysUser sysUser : sysUsers) { + if(bmsRegionUser.getUserId().equals(sysUser.getId())){ + bmsRegionUser.setUserName(sysUser.getName()); + bmsRegionUser.setUserCode(sysUser.getCode()); + } + } + } + + Map> listMap = list.stream().collect(Collectors.groupingBy(BmsRegionUser::getType)); + List list1 = listMap.get(0); + if(CollectionUtil.isNotEmpty(list1)){ + List regionIds = list1.stream().map(BmsRegionUser::getRegionId).collect(Collectors.toList()); + List regionList = bmsRegionService.listByIds(regionIds); + for (BmsRegion region : regionList) { + for (BmsRegionUser bmsRegionUser : list) { + if(bmsRegionUser.getRegionId().equals(region.getId())){ + bmsRegionUser.setRegionCode(region.getCode()); + bmsRegionUser.setRegionName(region.getName()); + } + } + } + } + List list2 = listMap.get(1); + if(CollectionUtil.isNotEmpty(list2)){ + List regionIds = list2.stream().map(BmsRegionUser::getRegionId).collect(Collectors.toList()); + List regionList = bmsRegion2Service.listByIds(regionIds); + for (BmsRegion2 region : regionList) { + for (BmsRegionUser bmsRegionUser : list) { + if(bmsRegionUser.getRegionId().equals(region.getId())){ + bmsRegionUser.setRegionCode(region.getCode()); + bmsRegionUser.setRegionName(region.getName()); + } + } + } + } + return R.ok(list); + } + + /** + * 批量保存 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "区域负责人", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:regionUser:insert')") + @Transactional(rollbackFor = Exception.class) + public R save(@RequestBody @Valid BmsRegionUserSaveBo param){ + Integer type = param.getType(); + List bmsRegionUsers = new ArrayList<>(); + for (String regionId : param.getRegionIds()) { + for (String userId : param.getUserIds()) { + BmsRegionUser regionUser = bmsRegionUserService.getByParam(type,regionId,userId); + if(regionUser==null){ + boolean isSale = type.equals(0); + String pathIds; + String pathName; + if(isSale){ + BmsRegion region = bmsRegionService.getById(regionId); + pathIds = region.getPathIds(); + pathName = region.getPathNames(); + }else { + BmsRegion2 region = bmsRegion2Service.getById(regionId); + pathIds = region.getPathIds(); + pathName = region.getPathNames(); + } + regionUser = new BmsRegionUser(); + regionUser.setType(type); + regionUser.setRegionId(regionId); + regionUser.setUserId(userId); + regionUser.setPathIds(pathIds); + regionUser.setPathNames(pathName); + bmsRegionUsers.add(regionUser); + } + } + } + bmsRegionUserService.saveBatch(bmsRegionUsers); + List userIds = param.getUserIds(); + // 类型:0=销售区域;1=行政区域 + if(type.equals(0)){ + List regionList = bmsRegionService.listByIds(param.getRegionIds()); + for (BmsRegion region : regionList) { + LambdaQueryWrapper pointLqw = new LambdaQueryWrapper<>(); + pointLqw.and(plqw->{ + plqw.eq(BmsChannelPoint::getSaleRegionId,region.getId()) + .or() + .likeRight(BmsChannelPoint::getSaleRegionPathIds,region.getPathIds()+"_"); + }); + pointLqw.select(BmsChannelPoint::getId); + //区域有那些网点 + List pointList = channelPointService.list(pointLqw); + List pointIds = pointList.stream().map(BmsChannelPoint::getId) + .distinct().collect(Collectors.toList()); + String pathIds = region.getPathIds(); + hisUserChannelPointService.flushBatchUserRegion(userIds,pointIds,2,pathIds); + } + }else { + List regionList = bmsRegion2Service.listByIds(param.getRegionIds()); + for (BmsRegion2 region : regionList) { + LambdaQueryWrapper pointLqw = new LambdaQueryWrapper<>(); + pointLqw.and(plqw->{ + plqw.eq(BmsChannelPoint::getBizRegionId,region.getId()) + .or() + .likeRight(BmsChannelPoint::getBizRegionPathIds,region.getPathIds()+"_"); + }); + pointLqw.select(BmsChannelPoint::getId); + //区域有那些网点 + List pointList = channelPointService.list(pointLqw); + List pointIds = pointList.stream().map(BmsChannelPoint::getId) + .distinct().collect(Collectors.toList()); + String pathIds = region.getPathIds(); + hisUserChannelPointService.flushBatchUserRegion(userIds,pointIds,1,pathIds); + } + } + //清空临时表 + hisUserSupplierService.cleanTable(); + return R.ok(); + } + + /** + * 设置为主要负责人 + * @param id + * @return + */ + @PostMapping("/setMaster/{id}") + @SysLog(module = SystemModule.BASE, title = "区域负责人", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:regionUser:update')") + public R updateById(@PathVariable("id")Long id){ + bmsRegionUserService.setMaster(id); + return R.ok(); + } + + /** + * 取消主要负责人 + * @param id + * @return + */ + @PostMapping("/cancelMaster/{id}") + @SysLog(module = SystemModule.BASE, title = "区域负责人", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:regionUser:update')") + public R cancelMaster(@PathVariable("id")Long id){ + BmsRegionUser regionUser = new BmsRegionUser(); + regionUser.setId(id); + regionUser.setMasterFlag(0); + bmsRegionUserService.updateById(regionUser); + hisUserSupplierService.cleanTable(); + return R.ok(); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BASE, title = "区域负责人", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:regionUser:delete')") + public R deleteById(@PathVariable String ids){ + List idsLong = StringUtils.splitIdLong(ids); + List regionUserList = bmsRegionUserService.listByIds(idsLong); + for (BmsRegionUser regionUser : regionUserList) { + if(regionUser.getType().equals(0)){ + BmsRegion region = bmsRegionService.getById(regionUser.getRegionId()); + hisUserChannelPointService.removeUserRegion(regionUser.getUserId(),region.getPathIds(),null); + }else { + BmsRegion2 region = bmsRegion2Service.getById(regionUser.getRegionId()); + hisUserChannelPointService.removeUserRegion(regionUser.getUserId(),null,region.getPathIds()); + } + } + bmsRegionUserService.removeByIds(idsLong); + hisUserSupplierService.cleanTable(); + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsRuleController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsRuleController.java new file mode 100644 index 0000000..e32060f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsRuleController.java @@ -0,0 +1,250 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.CollectionUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRuleRegion; +import com.qs.serve.modules.bms.entity.BmsRuleSku; +import com.qs.serve.modules.bms.entity.bo.BmsRuleBo; +import com.qs.serve.modules.bms.service.*; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.vo.GoodSkuVo; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.BmsRule; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 基础档案 规则 + * @author YenHex + * @since 2022-10-19 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/rule") +public class BmsRuleController { + + private BmsRuleService bmsRuleService; + private BmsRuleRegionService bmsRuleRegionService; + private BmsRuleSkuService bmsRuleSkuService; + private BmsRegionService bmsRegionService; + private GoodsSkuService goodsSkuService; + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('bms:rule:query')") + public R> getPage(BmsRule param){ + PageUtil.startPage(); + LambdaQueryWrapper ruleWrapper = new LambdaQueryWrapper<>(param); + List list = bmsRuleService.list(ruleWrapper); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "规则", biz = BizType.QUERY) + @PreAuthorize("hasRole('bms:rule:query')") + public R getById(@PathVariable("id") String id){ + BmsRule bmsRule = bmsRuleService.getById(id); + return R.ok(bmsRule); + } + + /** + * 规则商品列表 + * @param id + * @return + */ + @GetMapping("/listRuleProducts/{id}") + @SysLog(module = SystemModule.BASE, title = "规则", biz = BizType.QUERY) + @PreAuthorize("hasRole('bms:rule:query')") + public R> listRuleProducts(@PathVariable("id") String id){ + PageUtil.startPage(); + List ruleSkus = bmsRuleSkuService.listSkuIdsByRuleId(Long.parseLong(id)); + if(CollectionUtil.isNotEmpty(ruleSkus)){ + GoodsSku param = new GoodsSku(); + List skuIds = ruleSkus.stream().map(BmsRuleSku::getSkuId).collect(Collectors.toList()); + param.setSelectSkuIds(skuIds); + List skuVos = goodsSkuService.selectSkuVo(param); + R.byPageHelperList(ruleSkus,skuVos); + } + return R.byEmptyList(); + } + + /** + * 规则地区列表 + * @param ruleId + * @param type 0只售 1禁售 + * @return + */ + @GetMapping("/listRuleRegion") + @SysLog(module = SystemModule.BASE, title = "规则", biz = BizType.QUERY) + @PreAuthorize("hasRole('bms:rule:query')") + public R> listRuleProducts(@NotNull Long ruleId, + @NotNull Integer type){ + PageUtil.startPage(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRuleRegion::getRuleId,ruleId); + lqw.eq(BmsRuleRegion::getTypeFlag,type); + List ruleRegions = bmsRuleRegionService.list(lqw); + if(CollectionUtil.isNotEmpty(ruleRegions)){ + List regionIds = ruleRegions.stream().map(BmsRuleRegion::getRegionId).collect(Collectors.toList()); + List regionList = bmsRegionService.listByIds(regionIds); + return R.byPageHelperList(regionIds,regionList); + } + return R.byEmptyList(); + } + + /** + * 编辑规则 + * @param bmsRule + * @return + */ + @PostMapping("/saveOrUpdate") + @SysLog(module = SystemModule.BASE, title = "规则", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:rule:update')") + public R save(@RequestBody @Valid BmsRule bmsRule){ + bmsRuleService.saveOrUpdate(bmsRule); + return R.ok(); + } + + /** + * 规则 添加项 + * @param bmsRule + * @return + */ + @PostMapping("/addItem") + @SysLog(module = SystemModule.BASE, title = "规则", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:rule:update')") + public R addItem(@RequestBody @Valid BmsRuleBo bmsRule){ + Long ruleId = bmsRule.getId(); + List skuIds = bmsRule.getSkuIds(); + List banSaleRegionIds = bmsRule.getBanSaleRegionIds(); + List onlySaleRegionIds = bmsRule.getOnlySaleRegionIds(); + if(CollectionUtil.isNotEmpty(bmsRule.getSkuIds())){ + List ruleSkuList = new ArrayList<>(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRuleSku::getRuleId,ruleId); + lqw.in(BmsRuleSku::getSkuId,skuIds); + bmsRuleSkuService.remove(lqw); + GoodsSku param = new GoodsSku(); + param.setSelectSkuIds(skuIds); + List goodSkuVos = goodsSkuService.selectSkuVo(param); + for (GoodSkuVo goodSkuVo : goodSkuVos) { + BmsRuleSku ruleSku = new BmsRuleSku(); + ruleSku.setRuleId(ruleId); + ruleSku.setSpuId(goodSkuVo.getSpuId()); + ruleSku.setSkuId(goodSkuVo.getId()); + ruleSkuList.add(ruleSku); + } + bmsRuleSkuService.saveBatch(ruleSkuList); + } + //去重 + if(CollectionUtil.isNotEmpty(banSaleRegionIds)&&CollectionUtil.isNotEmpty(onlySaleRegionIds)){ + onlySaleRegionIds = onlySaleRegionIds.stream().filter(onlySaleRegionId-> + banSaleRegionIds.stream().noneMatch(banId->banId.equals(onlySaleRegionId)) + ).collect(Collectors.toList()); + } + if(CollectionUtil.isNotEmpty(banSaleRegionIds)){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRuleRegion::getRuleId,ruleId); + lqw.in(BmsRuleRegion::getRegionId,banSaleRegionIds); + bmsRuleRegionService.remove(lqw); + List ruleRegions = banSaleRegionIds.stream().map(regionId->{ + BmsRuleRegion ruleRegion = new BmsRuleRegion(); + ruleRegion.setRegionId(regionId); + ruleRegion.setRuleId(ruleId); + ruleRegion.setTypeFlag(1); + return ruleRegion; + }).collect(Collectors.toList()); + bmsRuleRegionService.saveBatch(ruleRegions); + } + if(CollectionUtil.isNotEmpty(onlySaleRegionIds)){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRuleRegion::getRuleId,ruleId); + lqw.in(BmsRuleRegion::getRegionId,onlySaleRegionIds); + bmsRuleRegionService.remove(lqw); + List ruleRegions = onlySaleRegionIds.stream().map(regionId->{ + BmsRuleRegion ruleRegion = new BmsRuleRegion(); + ruleRegion.setRegionId(regionId); + ruleRegion.setRuleId(ruleId); + ruleRegion.setTypeFlag(0); + return ruleRegion; + }).collect(Collectors.toList()); + bmsRuleRegionService.saveBatch(ruleRegions); + } + return R.ok(); + } + + /** + * 规则 移除项 + * @param bmsRule + * @return + */ + @PostMapping("/removeItem") + @SysLog(module = SystemModule.BASE, title = "规则", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:rule:update')") + public R removeItem(@RequestBody @Valid BmsRuleBo bmsRule){ + Long ruleId = bmsRule.getId(); + List skuIds = bmsRule.getSkuIds(); + List banSaleRegionIds = bmsRule.getBanSaleRegionIds(); + List onlySaleRegionIds = bmsRule.getOnlySaleRegionIds(); + if(CollectionUtil.isNotEmpty(bmsRule.getSkuIds())){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRuleSku::getRuleId,ruleId); + lqw.in(BmsRuleSku::getSkuId,skuIds); + bmsRuleSkuService.remove(lqw); + } + if(CollectionUtil.isNotEmpty(banSaleRegionIds)){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRuleRegion::getRuleId,ruleId); + lqw.in(BmsRuleRegion::getRegionId,banSaleRegionIds); + bmsRuleRegionService.remove(lqw); + } + if(CollectionUtil.isNotEmpty(onlySaleRegionIds)){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRuleRegion::getRuleId,ruleId); + lqw.in(BmsRuleRegion::getRegionId,onlySaleRegionIds); + bmsRuleRegionService.remove(lqw); + } + return R.ok(); + } + + /** + * 删除规则 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BASE, title = "规则", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:rule:delete')") + public R deleteById(@PathVariable("id") Long id){ + boolean result = bmsRuleService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSkuSupplierController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSkuSupplierController.java new file mode 100644 index 0000000..97fd3ab --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSkuSupplierController.java @@ -0,0 +1,119 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.CopierUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.bms.entity.bo.BmsSkuSupplierBo; +import com.qs.serve.modules.bms.entity.bo.BmsSkuSupplierBo2; +import com.qs.serve.modules.bms.entity.vo.BmsSkuSupplierVo; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.BmsSkuSupplier; +import com.qs.serve.modules.bms.service.BmsSkuSupplierService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 基础档案 指定客户的商品规则 + * @author YenHex + * @since 2022-10-17 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/skuSupplier") +public class BmsSkuSupplierController { + + private BmsSkuSupplierService bmsSkuSupplierService; + private GoodsSkuService goodsSkuService; + + /** + * 翻页查询 + * @apiNote skuId=0 标识是商品规则 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('bms:skuSupplier:query')") + public R> getPage(BmsSkuSupplierVo param){ + PageUtil.startPage(); + List list = bmsSkuSupplierService.selectList(param); + return R.byPageHelperList(list); + } + + /** + * 客户指定SKU(优先级最高) + * @param param + * @return + */ + @PostMapping("/update4Sku") + @SysLog(module = SystemModule.BASE, title = "sku供应商关联", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:skuSupplier:update')") + public R updateById(@RequestBody @Valid BmsSkuSupplierBo param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSkuSupplier::getSupplierId,param.getSupplierId()); + lqw.eq(BmsSkuSupplier::getSkuId,param.getSkuId()); + BmsSkuSupplier skuSupplier = bmsSkuSupplierService.getOne(lqw,false); + if(skuSupplier==null){ + GoodsSku goodsSku = goodsSkuService.getById(param.getSkuId()); + skuSupplier = CopierUtil.copy(param,new BmsSkuSupplier()); + skuSupplier.setSpuId(goodsSku.getSpuId()); + bmsSkuSupplierService.save(skuSupplier); + }else { + skuSupplier.setBanStatus(param.getBanStatus()); + bmsSkuSupplierService.updateById(skuSupplier); + } + return R.ok(); + } + + /** + * 客户指定SPU(优先级级比区域设置高) + * @param param + * @return + */ + @PostMapping("/update4Spu") + @SysLog(module = SystemModule.BASE, title = "sku供应商关联", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:skuSupplier:update')") + public R updateById(@RequestBody @Valid BmsSkuSupplierBo2 param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSkuSupplier::getSupplierId,param.getSupplierId()); + lqw.eq(BmsSkuSupplier::getSpuId,param.getSpuId()); + lqw.eq(BmsSkuSupplier::getSkuId,0); + BmsSkuSupplier skuSupplier = bmsSkuSupplierService.getOne(lqw,false); + if(skuSupplier==null){ + skuSupplier = CopierUtil.copy(param,new BmsSkuSupplier()); + skuSupplier.setSkuId(0L); + bmsSkuSupplierService.save(skuSupplier); + }else { + skuSupplier.setBanStatus(param.getBanStatus()); + bmsSkuSupplierService.updateById(skuSupplier); + } + return R.ok(); + } + + /** + * 删除 + * @return + */ + @PostMapping("/deleteById") + @SysLog(module = SystemModule.BASE, title = "sku供应商关联", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:skuSupplier:delete')") + public R updateById(@PathVariable("id") Long id){ + bmsSkuSupplierService.removeById(id); + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSubjectController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSubjectController.java new file mode 100644 index 0000000..f1282f8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSubjectController.java @@ -0,0 +1,317 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.bms.entity.*; +import com.qs.serve.modules.bms.entity.bo.BmsCostCenterBo; +import com.qs.serve.modules.bms.entity.vo.BmsRegionTreeVo; +import com.qs.serve.modules.bms.entity.vo.BmsSubjectTreeVo; +import com.qs.serve.modules.bms.mapper.BmsSubjectMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.*; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.tbs.entity.TbsActivitySubject; +import com.qs.serve.modules.tbs.service.TbsActivitySubjectService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 基础档案 科目 + * @author YenHex + * @since 2022-11-07 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/subject") +public class BmsSubjectController { + + private BmsSubjectService bmsSubjectService; + private BmsSubjectMapper bmsSubjectMapper; + private TbsActivitySubjectService activitySubjectService; + private BmsSubjectFormService bmsSubjectFormService; + private BmsSubjectRegionService bmsSubjectRegionService; + private BmsRegionService bmsRegionService; + private BmsRegion2Service bmsRegion2Service; + private BmsSupplierService bmsSupplierService; + + /** + * 返回树节点列表 + * @apiNote 用于模板,通过ids查询 + * @param param + * @return + */ + @PostMapping("/listByParam") + public R> listTreeVoBySelect(@RequestBody BmsSubject param) { + if(CollectionUtil.isEmpty(param.getSelectIds())){ + return R.ok(); + } + LambdaQueryWrapper subjectWrapper = new LambdaQueryWrapper<>(); + subjectWrapper.in(BmsSubject::getId,param.getSelectIds()); + List subjectList = bmsSubjectService.list(subjectWrapper); + return R.ok(subjectList); + } + + /** + * 树查询 + * @param supplierId + * @return + */ + @GetMapping("/tree") + @PreAuthorize("hasRole('bms:subject:query')") + public R> getPage(String supplierId,Integer slottingFlag){ + List subjectList = bmsSubjectService.list(new LambdaQueryWrapper().orderByAsc(BmsSubject::getSubjectCode)); + List treeVoList = subjectList.stream().map(subject->{ + BmsSubjectTreeVo treeNode = CopierUtil.copy(subject,new BmsSubjectTreeVo()); + treeNode.setId(subject.getId().toString()); + treeNode.setParentId(subject.getPid().toString()); + treeNode.setApiSelectAble(0); + treeNode.setSort(0); + return treeNode; + }).collect(Collectors.toList()); + if(slottingFlag!=null && slottingFlag==1){ + List slottingList = treeVoList.stream().filter(a->a.getSlottingFlag().equals(1)).collect(Collectors.toList()); + List newTreeVoList = new ArrayList<>(); + newTreeVoList.addAll(slottingList); + for(BmsSubjectTreeVo vo : slottingList) { + findParentVoAndAddToList(treeVoList, newTreeVoList,vo); + } + treeVoList = newTreeVoList.stream().distinct().collect(Collectors.toList()); + } + treeVoList = TreeUtil.buildByRecursive(treeVoList,TreeUtil.DEFAULT_PID_STRING); + if(StringUtils.hasText(supplierId)&&!supplierId.equals("0")){ + BmsSupplier bmsSupplier = bmsSupplierService.getById(supplierId); + if(bmsSupplier!=null){ + LambdaQueryWrapper subjectLqw = new LambdaQueryWrapper<>(); + subjectLqw.eq(BmsSubject::getBizRegionFlag,0).or().eq(BmsSubject::getSaleRegionFlag,0); + List bmsSubjectList = bmsSubjectService.list(subjectLqw); + List subjectRegionList = bmsSubjectRegionService.listByRegionIds(bmsSupplier.listBizRegionIds(),1); + List subjectRegionList2 = bmsSubjectRegionService.listByRegionIds(bmsSupplier.listSaleRegionIds(),0); + subjectRegionList.addAll(subjectRegionList2); + List subjectIds = bmsSubjectList.stream().map(a->a.getId().toString()).collect(Collectors.toList()); + //加载允许适用的科目 + List subjectIds2 = subjectRegionList.stream().map(a->a.getSubjectId().toString()) + .distinct().collect(Collectors.toList()); + subjectIds.addAll(subjectIds2); + recursionToSetSelectAble(treeVoList, subjectIds,null); + } + } + + return R.ok(treeVoList); + } + + private void findParentVoAndAddToList(List treeVoList, List newTreeVoList,BmsSubjectTreeVo vo){ + List pVos = treeVoList.stream().filter(a->a.getId().equals(vo.getParentId())).collect(Collectors.toList()); + if(pVos.size()==0){ + return; + }else{ + BmsSubjectTreeVo pVo = pVos.get(0); + newTreeVoList.add(pVo); + findParentVoAndAddToList(treeVoList,newTreeVoList,pVo); + } + } + + /** + * 递归设置可选 + * @param treeVoList + * @param subjectIds + * @param parentNode + */ + private void recursionToSetSelectAble(List treeVoList, List subjectIds,BmsSubjectTreeVo parentNode) { + if(CollectionUtil.isEmpty(treeVoList)){ + return; + } + for (Object object : treeVoList) { + BmsSubjectTreeVo subjectTreeVo = (BmsSubjectTreeVo)object; + 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); + } + } + } + } + if(CollectionUtil.isNotEmpty(subjectTreeVo.getChildren())){ + if(parentNode.getApiSelectAble().equals(0)){ + recursionToSetSelectAble(subjectTreeVo.getChildren(),subjectIds,subjectTreeVo); + }else { + recursionToSetSelectAble(subjectTreeVo.getChildren(),subjectIds,subjectTreeVo); + } + } + } + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "科目", biz = BizType.QUERY) + @PreAuthorize("hasRole('bms:subject:query')") + public R getById(@PathVariable("id") String id){ + BmsSubject bmsSubject = bmsSubjectService.getById(id); + if(bmsSubject.getPid()!=null && bmsSubject.getPid()!=0L){ + BmsSubject par = bmsSubjectService.getById(bmsSubject.getPid()); + if(par!=null){ + bmsSubject.setParName(par.getSubjectName()); + } + } + if(bmsSubject.getFormId()!=null){ + BmsSubjectForm subjectForm = bmsSubjectFormService.getById(bmsSubject.getFormId()); + bmsSubject.setSubjectFormInfo(subjectForm); + } + if(bmsSubject.getFormIdForCostApply()!=null){ + BmsSubjectForm subjectForm = bmsSubjectFormService.getById(bmsSubject.getFormIdForCostApply()); + bmsSubject.setSubjectFormInfo4CostApply(subjectForm); + } + if(bmsSubject.getSaleRegionFlag().equals(1)){ + List subjectRegionList = bmsSubjectRegionService.listBySubjectId(bmsSubject.getId(),0); + bmsSubject.setSaleRegionInfos(subjectRegionList); + } + if(bmsSubject.getBizRegionFlag().equals(1)){ + List subjectRegionList = bmsSubjectRegionService.listBySubjectId(bmsSubject.getId(),1); + bmsSubject.setBizRegionInfos(subjectRegionList); + } + return R.ok(bmsSubject); + } + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "科目", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:subject:update')") + public R updateById(@RequestBody @Valid BmsSubject param){ + if(param.getId()==null){ + return R.error("资源不存在或被移除"); + } + commonEdit(param); + return R.ok(); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "科目", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:subject:insert')") + public R save(@RequestBody @Valid BmsSubject param){ + param.setId(null); + commonEdit(param); + return R.ok(); + } + + + @Transactional(rollbackFor = Exception.class) + public void commonEdit(BmsSubject subject){ + if(subject.getPid()==null||subject.getPid().equals(0L)){ + subject.setPid(0L); + subject.setLevel(1); + subject.setPathNames(subject.getSubjectName()); + }else { + BmsSubject parent = bmsSubjectService.getById(subject.getPid()); + if(parent.getLevel()+1>3){ + Assert.throwEx("最多支持3级"); + } + subject.setLevel(parent.getLevel()+1); + subject.setPathNames(parent.getPathNames()+"_"+subject.getSubjectName()); + } + if(subject.getId()==null){ + BmsSubject subject1 = bmsSubjectService.getByCode(subject.getSubjectCode()); + if (subject1!=null){ + Assert.throwEx("科目编号不可重复"); + } + bmsSubjectService.save(subject); + }else { + //异常历史的适用区域 + bmsSubjectRegionService.removeBySubjectId(subject.getId(),0); + bmsSubjectRegionService.removeBySubjectId(subject.getId(),1); + BmsSubject ori = bmsSubjectService.getById(subject.getId()); + bmsSubjectService.updateById(subject); + if(!subject.getSubjectName().equals(ori.getSubjectName())) { + bmsSubjectService.updatePathNameByParent(subject); + } + } + if(subject.getSaleRegionFlag().equals(1)){ + List saleRegionList = bmsRegionService.listByIds(subject.getSaleRegionIds()); + List subjectRegionList = saleRegionList.stream().map(region->{ + BmsSubjectRegion subjectRegion = new BmsSubjectRegion(); + subjectRegion.setSubjectId(subject.getId()); + subjectRegion.setRegionId(region.getId()); + subjectRegion.setRegionName(region.getName()); + subjectRegion.setType(0); + return subjectRegion; + }).collect(Collectors.toList()); + if(CollectionUtil.isNotEmpty(subjectRegionList)){ + bmsSubjectRegionService.saveBatch(subjectRegionList); + } + } + if(subject.getBizRegionFlag().equals(1)){ + List bizRegionList = bmsRegion2Service.listByIds(subject.getBizRegionIds()); + List subjectRegionList = bizRegionList.stream().map(region->{ + BmsSubjectRegion subjectRegion = new BmsSubjectRegion(); + subjectRegion.setSubjectId(subject.getId()); + subjectRegion.setRegionId(region.getId()); + subjectRegion.setRegionName(region.getName()); + subjectRegion.setType(1); + return subjectRegion; + }).collect(Collectors.toList()); + if(CollectionUtil.isNotEmpty(subjectRegionList)){ + bmsSubjectRegionService.saveBatch(subjectRegionList); + } + } + if(subject.getFormId()==null){ + bmsSubjectMapper.removeFormId(subject.getId()); + } + if(subject.getFormIdForCostApply()==null){ + bmsSubjectMapper.removeFormIdForCost(subject.getId()); + } + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BASE, title = "科目", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:subject:delete')") + public R deleteById(@PathVariable("id") Long id){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivitySubject::getSubjectId,id); + if(activitySubjectService.count(lqw)>0){ + return R.error("活动含当前的科目,删除失败"); + } + boolean result = bmsSubjectService.removeSelfAndChildById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSubjectFormController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSubjectFormController.java new file mode 100644 index 0000000..e755ac2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSubjectFormController.java @@ -0,0 +1,122 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.entity.BmsSubject; +import com.qs.serve.modules.bms.service.BmsSubjectService; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.BmsSubjectForm; +import com.qs.serve.modules.bms.service.BmsSubjectFormService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 基础档案 科目表单 + * @author YenHex + * @since 2023-02-03 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/subjectForm") +public class BmsSubjectFormController { + + private BmsSubjectFormService bmsSubjectFormService; + private BmsSubjectService bmsSubjectService; + + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('bms:subject:query')") + public R> getPage(BmsSubjectForm param){ + BmsSubjectForm entity = CopierUtil.copy(param,new BmsSubjectForm()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + lqw.orderByDesc(BmsSubjectForm::getId); + PageUtil.startPage(); + List list = bmsSubjectFormService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "科目表单", biz = BizType.QUERY) + @PreAuthorize("hasRole('bms:subject:query')") + public R getById(@PathVariable("id") String id){ + BmsSubjectForm bmsSubjectForm = bmsSubjectFormService.getById(id); + return R.ok(bmsSubjectForm); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "科目表单", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:subject:update')") + public R updateById(@RequestBody @Valid BmsSubjectForm param){ + BmsSubjectForm entity = CopierUtil.copy(param,new BmsSubjectForm()); + boolean result = bmsSubjectFormService.updateById(entity); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "科目表单", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:subject:insert')") + public R save(@RequestBody @Valid BmsSubjectForm param){ + BmsSubjectForm entity = CopierUtil.copy(param,new BmsSubjectForm()); + bmsSubjectFormService.save(entity); + return R.ok(entity); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BASE, title = "科目表单", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:subject:delete')") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(BmsSubject::getFormId,idsLong) + .or() + .in(BmsSubject::getFormIdForCostApply,idsLong); + if(bmsSubjectService.count(lqw)>0){ + return R.error("表单被使用中,删除失败"); + } + boolean result = bmsSubjectFormService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierAddressController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierAddressController.java new file mode 100644 index 0000000..2a6dec0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierAddressController.java @@ -0,0 +1,153 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.JsonUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 基础档案 客户收货地址 + * @author YenHex + * @since 2022-10-12 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/supplierAddress") +public class BmsSupplierAddressController { + + private BmsSupplierAddressService bmsSupplierAddressService; + private BmsSupplierService bmsSupplierService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('bms:supplierAddress:query')") + public R> getPage(BmsSupplierAddress param){ + PageUtil.startPage(); + List list = bmsSupplierAddressService.selectBmsSupplierAddressList(param); + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "供应商地址", biz = BizType.QUERY) + @PreAuthorize("hasRole('bms:supplierAddress:query')") + public R getById(@PathVariable("id") String id){ + BmsSupplierAddress bmsSupplierAddress = bmsSupplierAddressService.getById(id); + BmsSupplier supplier = bmsSupplierService.getById(bmsSupplierAddress.getSupplierId()); + bmsSupplierAddress.setSupplierName(supplier.getName()); + return R.ok(bmsSupplierAddress); + } + + + + /** + * 根据ID更新默认 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "供应商地址", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:supplierAddress:update')") + public R updateById(@RequestBody @Valid BmsSupplierAddress param){ + LambdaQueryWrapper supplierAddrLqw = new LambdaQueryWrapper<>(); + supplierAddrLqw.eq(BmsSupplierAddress::getTmsSysId,param.getTmsSysId()); + supplierAddrLqw.ne(BmsSupplierAddress::getId,param.getId()); + long count = bmsSupplierAddressService.count(supplierAddrLqw); + if(count>0){ + return R.error("tms_sys_id is exist!!"); + } + bmsSupplierAddressService.updateById(param); + return R.ok(param); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "供应商地址", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:supplierAddress:insert')") + public R save(@RequestBody @Valid BmsSupplierAddress param){ + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getDefault(param.getSupplierId()); + if(supplierAddress==null){ + param.setDefaultFlag(1); + }else { + param.setDefaultFlag(0); + } + LambdaQueryWrapper supplierAddrLqw = new LambdaQueryWrapper<>(); + supplierAddrLqw.eq(BmsSupplierAddress::getTmsSysId,param.getTmsSysId()); + long count = bmsSupplierAddressService.count(supplierAddrLqw); + if(count>0){ + return R.error("tms_sys_id is exist!!"); + } + bmsSupplierAddressService.save(param); + return R.ok(param); + } + + /** + * 设置默认的地址 + * @param id 地址ID + * @return + */ + @PostMapping("/setDefault/{id}") + @SysLog(module = SystemModule.BASE, title = "供应商地址", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:supplierAddress:insert')") + @Transactional(rollbackFor = Exception.class) + public R setDefault(@PathVariable("id") Long id){ + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(id); + List list = bmsSupplierAddressService.listBySupplierId(supplierAddress.getSupplierId()); + //设置其它 + for (BmsSupplierAddress address : list) { + if(!address.getId().equals(id)){ + address.setDefaultFlag(0); + bmsSupplierAddressService.updateById(address); + } + } + //设置默认 + supplierAddress.setDefaultFlag(1); + bmsSupplierAddressService.updateById(supplierAddress); + return R.ok(); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BASE, title = "供应商地址", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:supplierAddress:delete')") + public R deleteById(@PathVariable("id") Long id){ + boolean result = bmsSupplierAddressService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierBandController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierBandController.java new file mode 100644 index 0000000..d8a6e9a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierBandController.java @@ -0,0 +1,111 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.BmsSupplierBand; +import com.qs.serve.modules.bms.service.BmsSupplierBandService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 基础档案 客户银行信息 + * @author YenHex + * @since 2022-10-12 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/supplierBand") +public class BmsSupplierBandController { + + private BmsSupplierBandService bmsSupplierBandService; + private BmsSupplierService bmsSupplierService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('bms:supplierBand:query')") + public R> getPage(BmsSupplierBand param){ + PageUtil.startPage(); + LambdaQueryWrapper supplierBandWrapper = new LambdaQueryWrapper<>(param); + List list = bmsSupplierBandService.list(supplierBandWrapper); + for (BmsSupplierBand supplierBand : list) { + BmsSupplier supplier = bmsSupplierService.getById(supplierBand.getSupplierId()); + supplierBand.setSupplierName(supplier.getName()); + } + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "供应商地址", biz = BizType.QUERY) + @PreAuthorize("hasRole('bms:supplierBand:query')") + public R getById(@PathVariable("id") String id){ + BmsSupplierBand bmsSupplierBand = bmsSupplierBandService.getById(id); + BmsSupplier supplier = bmsSupplierService.getById(bmsSupplierBand.getSupplierId()); + bmsSupplierBand.setSupplierName(supplier.getName()); + return R.ok(bmsSupplierBand); + } + + /** + * 根据ID更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "供应商地址", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:supplierBand:update')") + public R updateById(@RequestBody @Valid BmsSupplierBand param){ + boolean result = bmsSupplierBandService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "供应商地址", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:supplierBand:insert')") + public R save(@RequestBody @Valid BmsSupplierBand param){ + boolean result = bmsSupplierBandService.save(param); + return R.isTrue(result); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BASE, title = "供应商地址", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:supplierBand:delete')") + public R deleteById(@PathVariable("id") Long id){ + boolean result = bmsSupplierBandService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierChannelController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierChannelController.java new file mode 100644 index 0000000..0d84866 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierChannelController.java @@ -0,0 +1,154 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.CollectionUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.entity.BmsChannel; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.bo.BmsSupplierChannelBo; +import com.qs.serve.modules.bms.service.BmsChannelService; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.BmsSupplierChannel; +import com.qs.serve.modules.bms.service.BmsSupplierChannelService; + +import javax.validation.Valid; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 基础档案 客户渠道关系 + * @author YenHex + * @since 2022-11-03 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/supplierChannel") +public class BmsSupplierChannelController { + + private BmsSupplierChannelService bmsSupplierChannelService; + private BmsChannelService bmsChannelService; + private BmsSupplierService bmsSupplierService; + + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/list") + @PreAuthorize("hasRole('bms:supplierChannel:query')") + public R> getList(BmsSupplierChannel param){ + if(param.getSupplierId()==null&¶m.getChannelId()==null){ + return R.ok(); + } + List list = bmsSupplierChannelService.selectSupplierChannelList(param); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('bms:supplierChannel:query')") + public R> getPage(BmsSupplierChannel param){ + PageUtil.startPage(); + List list = bmsSupplierChannelService.selectSupplierChannelList(param); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "客户渠道关系", biz = BizType.QUERY) + @PreAuthorize("hasRole('bms:supplierChannel:query')") + public R getById(@PathVariable("id") String id){ + BmsSupplierChannel bmsSupplierChannel = bmsSupplierChannelService.getById(id); + BmsChannel channel = bmsChannelService.getById(bmsSupplierChannel.getChannelId()); + bmsSupplierChannel.setChannelName(channel.getChannelName()); + BmsSupplier supplier = bmsSupplierService.getById(bmsSupplierChannel.getSupplierId().toString()); + bmsSupplierChannel.setSupplierCode(supplier.getCode()); + bmsSupplierChannel.setSupplierName(supplier.getName()); + return R.ok(bmsSupplierChannel); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "客户渠道关系", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:supplierChannel:update')") + public R updateById(@RequestBody @Valid BmsSupplierChannel param){ + boolean result = bmsSupplierChannelService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "客户渠道关系", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:supplierChannel:insert')") + public R save(@RequestBody @Valid BmsSupplierChannelBo param){ + for (Long channelId : param.getChannelIds()) { + for (Long supplierId : param.getSupplierIds()) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplierChannel::getChannelId,channelId); + lqw.eq(BmsSupplierChannel::getSupplierId,supplierId); + boolean exist = bmsSupplierChannelService.count(lqw)>0; + if(!exist){ + BmsSupplierChannel supplierChannel = new BmsSupplierChannel(); + supplierChannel.setSupplierId(supplierId); + supplierChannel.setChannelId(channelId); + bmsSupplierChannelService.save(supplierChannel); + } + } + } + return R.ok(); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BASE, title = "客户渠道关系", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:supplierChannel:delete')") + public R deleteById(@PathVariable("ids") String ids){ + if(ids.contains(",")){ + List idArr = Arrays.asList(ids.split(",")) + .stream().map(a->Long.parseLong(a)) + .collect(Collectors.toList()); + bmsSupplierChannelService.removeByIds(idArr); + }else { + bmsSupplierChannelService.removeById(Long.parseLong(ids)); + } + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierChannelPointController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierChannelPointController.java new file mode 100644 index 0000000..7b0428a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierChannelPointController.java @@ -0,0 +1,129 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.modules.bms.entity.BmsChannel; +import com.qs.serve.modules.bms.entity.BmsChannelPoint; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierChannel; +import com.qs.serve.modules.bms.entity.bo.BmsSupplierChannelBo; +import com.qs.serve.modules.bms.service.BmsChannelPointService; +import com.qs.serve.modules.bms.service.BmsChannelService; +import com.qs.serve.modules.bms.service.BmsSupplierChannelService; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 基础档案 客户渠道关系2 + * @author YenHex + * @since 2022-11-03 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/supplierRelate") +public class BmsSupplierChannelPointController { + + private BmsSupplierChannelService bmsSupplierChannelService; + private BmsChannelService bmsChannelService; + private BmsChannelPointService bmsChannelPointService; + private BmsSupplierService bmsSupplierService; + + + /** + * 供应商ID加载渠道列表 + * @param supplierId + * @return + */ + @GetMapping("/listChannelBySupplier") + public R> listChannelBySupplier(String supplierId,BmsChannel query){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplierChannel::getSupplierId,supplierId); + List supplierChannels = bmsSupplierChannelService.list(lqw); + List channelIds = supplierChannels.stream().map(BmsSupplierChannel::getChannelId).distinct().collect(Collectors.toList()); + if(channelIds.size()<1){ + return R.ok(); + } + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(query); + lqw2.in(BmsChannel::getId,channelIds); + List bmsChannels = bmsChannelService.list(lqw2); + return R.ok(bmsChannels); + } + + /** + * 供应商ID加载渠道列表 + * @param supplierId + * @return + */ + @GetMapping("/pageChannelBySupplier") + public R> pageChannelBySupplier(String supplierId,BmsChannel query){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplierChannel::getSupplierId,supplierId); + List supplierChannels = bmsSupplierChannelService.list(lqw); + List channelIds = supplierChannels.stream().map(BmsSupplierChannel::getChannelId).distinct().collect(Collectors.toList()); + if(channelIds.size()<1){ + return R.byEmptyList(); + } + PageUtil.startPage(); + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(query); + lqw2.in(BmsChannel::getId,channelIds); + List bmsChannels = bmsChannelService.list(lqw2); + return R.byPageHelperList(bmsChannels); + } + + /** + * 供应商ID加载网点列表 + * @param supplierId + * @return + */ + @GetMapping("/listPointBySupplier") + public R> listPointBySupplier(String supplierId,BmsChannelPoint query){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplierChannel::getSupplierId,supplierId); + List supplierChannels = bmsSupplierChannelService.list(lqw); + List channelIds = supplierChannels.stream().map(BmsSupplierChannel::getChannelId).distinct().collect(Collectors.toList()); + if(channelIds.size()<1){ + return R.ok(); + } + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(query); + lqw2.in(BmsChannelPoint::getChannelId,channelIds); + List channelPoints = bmsChannelPointService.list(lqw2); + return R.ok(channelPoints); + } + + /** + * 供应商ID加载网点列表 + * @param supplierId + * @return + */ + @GetMapping("/pagePointBySupplier") + public R> pagePointBySupplier(String supplierId,BmsChannelPoint query){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplierChannel::getSupplierId,supplierId); + List supplierChannels = bmsSupplierChannelService.list(lqw); + List channelIds = supplierChannels.stream().map(BmsSupplierChannel::getChannelId).distinct().collect(Collectors.toList()); + if(channelIds.size()<1){ + return R.byEmptyList(); + } + PageUtil.startPage(); + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(query); + lqw2.in(BmsChannelPoint::getChannelId,channelIds); + List channelPoints = bmsChannelPointService.list(lqw2); + return R.byPageHelperList(channelPoints); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierContactsController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierContactsController.java new file mode 100644 index 0000000..aed4e2e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierContactsController.java @@ -0,0 +1,166 @@ +package com.qs.serve.modules.bms.controller; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.sys.common.enums.BusinessLogOption; +import com.qs.serve.modules.sys.common.enums.BusinessLogType; +import com.qs.serve.modules.sys.entity.SysBusinessLog; +import com.qs.serve.modules.sys.service.SysBusinessLogService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.so.BmsSupplierContactsSo; +import com.qs.serve.modules.bms.entity.bo.BmsSupplierContactsBo; +import com.qs.serve.modules.bms.entity.BmsSupplierContacts; +import com.qs.serve.modules.bms.service.BmsSupplierContactsService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 基础档案 供应商联系人 + * @author YenHex + * @since 2023-04-19 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/supplierContacts") +public class BmsSupplierContactsController { + + private BmsSupplierContactsService bmsSupplierContactsService; + private SysBusinessLogService businessLogService; + private BmsSupplierService bmsSupplierService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(BmsSupplierContactsSo param){ + BmsSupplierContacts entity = CopierUtil.copy(param,new BmsSupplierContacts()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + List list = bmsSupplierContactsService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BmsSupplierContactsSo param){ + BmsSupplierContacts entity = CopierUtil.copy(param,new BmsSupplierContacts()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + PageUtil.startPage(); + List list = bmsSupplierContactsService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + BmsSupplierContacts bmsSupplierContacts = bmsSupplierContactsService.getById(id); + return R.ok(bmsSupplierContacts); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "供应商联系人", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid BmsSupplierContactsBo param){ + BmsSupplierContacts entity = CopierUtil.copy(param,new BmsSupplierContacts()); + if(StrUtil.isEmpty(param.getContactsName())&&StrUtil.isEmpty(param.getContactsPost())){ + Assert.throwEx("姓名和职务至少填一个"); + } + BmsSupplier supplier = bmsSupplierService.getById(param.getSupplierId()); + entity.setSupplierCode(supplier.getCode()); + entity.setSupplierName(supplier.getName()); + BmsSupplierContacts orgContacts = bmsSupplierContactsService.getById(param.getId()); + boolean result = bmsSupplierContactsService.updateById(entity); + //记录变更人 + businessLogService.buildLog4Change( + BusinessLogType.SupplierContacts, + supplier.getId(), + supplier.getCode(), + supplier.getName(), + param.getId()+"", + orgContacts, + entity); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "供应商联系人", biz = BizType.INSERT) + public R save(@RequestBody @Valid BmsSupplierContactsBo param){ + BmsSupplierContacts entity = CopierUtil.copy(param,new BmsSupplierContacts()); + if(StrUtil.isEmpty(param.getContactsName())&&StrUtil.isEmpty(param.getContactsPost())){ + Assert.throwEx("姓名和职务至少填一个"); + } + BmsSupplier supplier = bmsSupplierService.getById(param.getSupplierId()); + entity.setSupplierCode(supplier.getCode()); + entity.setSupplierName(supplier.getName()); + bmsSupplierContactsService.save(entity); + //记录变更人 + businessLogService.buildLog4Save( + BusinessLogType.SupplierContacts, + supplier.getId(), + supplier.getCode(), + supplier.getName(), + param.getId()+"", + entity); + return R.ok(entity); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BASE, title = "供应商联系人", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + assert idsLong != null; + for (Long id : idsLong) { + BmsSupplierContacts supplierContacts = bmsSupplierContactsService.getById(id); + BmsSupplier supplier = bmsSupplierService.getById(supplierContacts.getSupplierId()); + businessLogService.buildLog4Delete( + BusinessLogType.SupplierContacts, + supplier.getId(), + supplier.getCode(), + supplier.getName(), + id+""); + } + boolean result = bmsSupplierContactsService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierController.java new file mode 100644 index 0000000..98f23b1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierController.java @@ -0,0 +1,1480 @@ +package com.qs.serve.modules.bms.controller; + +import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.pagehelper.PageHelper; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.consts.RedisCacheKeys; +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.so.BirBudgetTargetSo; +import com.qs.serve.modules.bir.service.BirBudgetTargetService; +import com.qs.serve.modules.bms.controller.my.BmsSupplierMyController; +import com.qs.serve.modules.bms.entity.*; +import com.qs.serve.modules.bms.entity.bo.BmsSupplierBo; +import com.qs.serve.modules.bms.entity.bo.BmsSupplierExcelBo; +import com.qs.serve.modules.bms.entity.bo.BmsSupplierParentBo; +import com.qs.serve.modules.bms.entity.vo.BmsRegionTreeVo; +import com.qs.serve.modules.bms.entity.vo.BmsSupplierTreeVo; +import com.qs.serve.modules.bms.mapper.BmsSupplierComRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.*; +import com.qs.serve.modules.his.entity.HisUserSupplier; +import com.qs.serve.modules.his.service.HisUserSupplierService; +import com.qs.serve.modules.his.service.impl.HisUserSupplierServiceImpl; +import com.qs.serve.modules.sys.entity.SysPostUser; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.entity.bo.SysRelateSuppliersParam; +import com.qs.serve.modules.sys.entity.bo.SysRelateSuppliersParam2; +import com.qs.serve.modules.sys.entity.dto.SysUserSimpleVo; +import com.qs.serve.modules.sys.entity.dto.SysUserVo; +import com.qs.serve.modules.sys.service.SysAttachService; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsCenterType; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplate; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.service.TbsActivityTemplateService; +import com.qs.serve.modules.tbs.service.TbsBudgetService; +import com.qs.serve.modules.tbs.service.TbsCostApplyService; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 基础档案 客户 + * @author YenHex + * @since 2022-10-10 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/supplier") +public class BmsSupplierController { + + private TbsActivityTemplateService tbsActivityTemplateService; + private BmsSupplierService bmsSupplierService; + private BmsSupplierComRegionMapper supplierComRegionMapper; + private BmsSupplierAddressService bmsSupplierAddressService; + private BmsSupplierVisitAddressService bmsSupplierVisitAddressService; + private BmsSupplierContactsService bmsSupplierContactsService; + private BmsSupplierChannelService bmsSupplierChannelService; + private BmsRegionService bmsRegionService; + private BmsRegion2Service bmsRegion2Service; + private SysUserService sysUserService; + private SysPostUserService sysPostUserService; + private BmsSupplierMapper bmsSupplierMapper; + private HisUserSupplierService hisUserSupplierService; + private RedisService redisService; + private TbsBudgetService tbsBudgetService; + private BmsSupplierMyController supplierMyController; + private SysAttachService attachService; + private BirBudgetTargetService birBudgetTargetService; + private HisUserSupplierServiceImpl hisUserSupplierServiceImpl; + private BmsSupplierMapper supplierMapper; + private TbsCostApplyService tbsCostApplyService; + + + /** + * 临时方法,用于紧急修复用户直属负责的客户 + * @param userId + * @return + */ + @GetMapping("/initUserSupplier") + public R initUserSupplier(String userId){ + hisUserSupplierServiceImpl.rebuildOnlyOneUserSuppliers(userId); + return R.ok(); + } + + @GetMapping("/queryList") + public R> getQueryList(BmsSupplier param){ + PageUtil.startPage(); + List list = bmsSupplierService.list(new QueryWrapper<>(param)); + return R.byPageHelperList(list); + } + + + /** + * 翻页查询 + * @param param + * @return + */ + @PostMapping("/list") + @PreAuthorize("hasRole('bms:supplier:query')") + public R> getList(@RequestBody BmsSupplier param){ + + param = this.initQueryParam(param); + + String userId = param.getUserId(); + if(param.getLoadByCurrent()!=null&¶m.getLoadByCurrent().equals(1)){ + List userIds = sysPostUserService.listByChildIds(userId); + userIds.add(userId); + param.setSelectUserIds(userIds); + }else { + param.setCurrUserId(userId); + } + + List list = bmsSupplierService.selectSupplierList(param); + initSupplierList(list); + initParentList(list); + for (BmsSupplier supplier : list) { + supplier.setMasterFlag(0); + if(supplier.getUserId()!=null&&supplier.getUserId().equals(userId)){ + supplier.setMasterFlag(1); + break; + } + } + return R.ok(list); + } + + + /** + * 翻页查询,值=1,过滤当前用户负责数据 + * @param param + * @return + */ + @PostMapping("/page") + @PreAuthorize("hasRole('bms:supplier:query')") + public R> getPage(@RequestBody BmsSupplier param){ + if(param.getLoadByCurrent()!=null && param.getLoadByCurrent().equals(2)){ + BirBudgetTargetSo query = new BirBudgetTargetSo(); + query.setLoadType(param.getType()); + query.setSelectCenterFlag(2); + query.setTargetId(param.getTargetId()); + query.setYearMonthStart(param.getYearMonthStart()); + query.setYearMonthEnd(param.getYearMonthEnd()); + List supplierIds = birBudgetTargetService.getCenterByTargetId(query); + if(supplierIds.size()==0){ + return R.byPageHelperList(new ArrayList()); + } + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(BmsSupplier::getId,supplierIds); + List list = bmsSupplierService.list(lambdaQueryWrapper); + return R.byPageHelperList(list); + } + + param = this.initQueryParam(param); + + if(param.getLoadByCurrent()!=null&¶m.getLoadByCurrent().equals(1)){ + PageUtil.setPageSize(param.getPageSize()+""); + PageUtil.setPageNum(param.getPageNum()+""); + return supplierMyController.getUnderlingAndMinePage(param); + } + + PageHelper.startPage(param.getPageNum(),param.getPageSize()); + List list = bmsSupplierService.selectSupplierList(param); + initSupplierList(list); + initParentList(list); + //拦截活动模板不可选的客户 + if(param.getActivityTemplateId()!=null){ + TbsActivityTemplate template = tbsActivityTemplateService.getById(param.getActivityTemplateId()); + if(template!=null && list.size()>0){ + List supplierIds = tbsCostApplyService.checkTemplateId(list,template); + for (BmsSupplier supplier : list) { + if(supplierIds.stream().noneMatch(a->a.equals(supplier.getId()))){ + supplier.setDisableFlag(1); + } + } + } + } + return R.byPageHelperList(list); + } + + @PostMapping("/exportExcel") + @PreAuthorize("hasRole('bms:supplier:query')") + public R> exportExcel(@RequestBody BmsSupplier param){ + + param = this.initQueryParam(param); + + List list = bmsSupplierService.selectSupplierList(param); + initSupplierList(list); + initParentList(list); + + List boList = list.stream().map(BmsSupplierExcelBo::toExcelBo).collect(Collectors.toList()); + + return R.ok(boList); + } + + private BmsSupplier initQueryParam(BmsSupplier param){ + //兼容 前端接错参数 + if(param.getSupplierName()!=null){ + param.setName(param.getSupplierName()); + } + if(param.getSupplierCode()!=null){ + param.setCode(param.getSupplierCode()); + } + + if(StringUtils.hasText(param.getRegion2Label())){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.like(BmsRegion2::getPathNames,param.getRegion2Label()); + List region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + if(region2List.size()>0) { + param.setRegion2Ids(region2List.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setRegion2Ids(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegion2FirstName())){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.like(BmsRegion2::getName,param.getSearchRegion2FirstName()); + List region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + if(region2List.size()>0) { + param.setSearchRegion2First(region2List.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegion2First(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegion2SecondName())){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.like(BmsRegion2::getName,param.getSearchRegion2SecondName()); + List region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + if(region2List.size()>0) { + param.setSearchRegion2Second(region2List.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegion2Second(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegion2ThirdName())){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.like(BmsRegion2::getName,param.getSearchRegion2ThirdName()); + List region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + if(region2List.size()>0) { + param.setSearchRegion2Third(region2List.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegion2Third(Arrays.asList("#")); + } + } + + if(StringUtils.hasText(param.getRegionLabel())){ + LambdaQueryWrapper regionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + regionLambdaQueryWrapper.like(BmsRegion::getPathNames,param.getRegionLabel()); + List regionList = bmsRegionService.list(regionLambdaQueryWrapper); + if(regionList.size()>0) { + param.setRegionIds(regionList.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setRegion2Ids(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegionFirstName())){ + LambdaQueryWrapper regionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + regionLambdaQueryWrapper.like(BmsRegion::getName,param.getSearchRegionFirstName()); + List regionList = bmsRegionService.list(regionLambdaQueryWrapper); + if(regionList.size()>0) { + param.setSearchRegionFirst(regionList.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegionFirst(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegionSecondName())){ + LambdaQueryWrapper regionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + regionLambdaQueryWrapper.like(BmsRegion::getName,param.getSearchRegionSecondName()); + List regionList = bmsRegionService.list(regionLambdaQueryWrapper); + if(regionList.size()>0) { + param.setSearchRegionSecond(regionList.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegionSecond(Arrays.asList("#")); + } + } + return param; + } + + /** + * 树查询 + * @param param + * @return + */ + @GetMapping("/tree") + @PreAuthorize("hasRole('bms:supplier:query')") + public R getTree(BmsSupplier param){ + String json = redisService.getString(RedisCacheKeys.SUPPLIER_RELATE_TREE); + if(json==null){ + List list = bmsSupplierService.selectSupplierList(param); + initSupplierList(list); + List list2 = list.stream().map(supplier->{ + BmsSupplierTreeVo treeNode = CopierUtil.copy(supplier,new BmsSupplierTreeVo()); + treeNode.setId(supplier.getId()); + treeNode.setParentId(supplier.getPid()); + treeNode.setSort(0); + return treeNode; + }).collect(Collectors.toList()); + list2 = TreeUtil.buildByRecursive(list2,TreeUtil.DEFAULT_PID_STRING); + String jsonString = JsonUtil.objectToJson(list2); + redisService.set(RedisCacheKeys.SUPPLIER_RELATE_TREE,jsonString); + return R.ok(list2); + } + return R.ok(JSONArray.parseArray(json)); + } + + + + /** + * 更改客户授权(用户页面) + * @return + */ + @PostMapping("/relateSuppliers") + @PreAuthorize("hasRole('bms:supplier:update')") + public R relateSuppliers(@RequestBody @Valid SysRelateSuppliersParam param){ + List supplierIds = param.getSupplierIds(); + String userId = param.getUserId(); + List list = bmsSupplierService.listByIds(supplierIds); + for (BmsSupplier supplier : list) { + if(userId.equals(supplier.getUserId())){ + continue; + } + if(CollectionUtil.isNotEmpty(supplier.getOtherUserIds())){ + boolean exist = false; + for (String otherUserId : supplier.getOtherUserIds()) { + if(userId.equals(otherUserId)){ + exist = true; + break; + } + } + if(exist){ + continue; + } + } + List otherUserIds = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(supplier.getOtherUserIds())){ + otherUserIds.addAll(Arrays.asList(supplier.getOtherUserIds())); + } + otherUserIds.add(userId); + //更新次要负责人 + BmsSupplier supplierParam = new BmsSupplier(); + supplierParam.setId(supplier.getId()); + supplierParam.setOtherUserIds(otherUserIds.toArray(new String[otherUserIds.size()])); + bmsSupplierService.updateById(supplierParam); + } + initSupplierOtherInfo(supplierIds); + //清空临时表 + hisUserSupplierService.cleanTable(); + return R.ok(); + } + + /** + * 更改客户授权(客户页面) + * @return + */ + @PostMapping("/relateSuppliers2") + @PreAuthorize("hasRole('bms:supplier:update')") + public R relateSuppliers2(@RequestBody SysRelateSuppliersParam2 param){ + BmsSupplier supplier = bmsSupplierService.getById(param.getSupplierId()); + if(CollectionUtil.isNotEmpty(supplier.getOtherUserIds())){ + for (String userId : supplier.getOtherUserIds()) { + param.getUserIds().add(userId); + } + } + List uids = param.getUserIds().stream() + .filter(uid->supplier.getUserId()==null || !supplier.getUserId().equals(uid)) + .collect(Collectors.toList()); + BmsSupplier bmsSupplier = new BmsSupplier(); + bmsSupplier.setId(param.getSupplierId().toString()); + bmsSupplier.setStopFlagDate(supplier.getStopFlagDate()); + bmsSupplier.setCooperatePauseFlagDate(supplier.getCooperatePauseFlagDate()); + bmsSupplier.setOtherUserIds(param.getUserIds()==null?new String[]{}:uids.toArray(new String[uids.size()])); + bmsSupplierService.updateById(bmsSupplier); + initSupplierOtherInfo(Arrays.asList(supplier.getId())); + //清空临时表 + hisUserSupplierService.cleanTable(); + this.saveTOHis(param.getUserIds(), supplier); + return R.ok(); + } + + + /** + * 删除客户分配 + * @return + */ + @PostMapping("/relateRemove") + @PreAuthorize("hasRole('bms:supplier:update')") + public R relateRemove(@RequestBody SysRelateSuppliersParam param){ + List supplierIds = param.getSupplierIds(); + String userId = param.getUserId(); + List list = bmsSupplierService.listByIds(supplierIds); + for (BmsSupplier supplier : list) { + if(userId.equals(supplier.getUserId())){ + bmsSupplierMapper.removeRelateUserInfo(Long.parseLong(supplier.getId())); + } + if(CollectionUtil.isNotEmpty(supplier.getOtherUserIds())){ + List otherUserIds = new ArrayList<>(); + for (String otherUserId : supplier.getOtherUserIds()) { + if(userId.equals(otherUserId)){ + continue; + } + otherUserIds.add(otherUserId); + } + //更新次要负责人 + BmsSupplier supplierParam = new BmsSupplier(); + supplierParam.setId(supplier.getId()); + supplierParam.setOtherUserIds(otherUserIds.toArray(new String[otherUserIds.size()])); + bmsSupplierService.updateById(supplierParam); + } + } + initSupplierOtherInfo(supplierIds); + //清空临时表 + hisUserSupplierService.cleanTable(); + redisService.remove(RedisCacheKeys.SUPPLIER_RELATE_TREE); + return R.ok(); + } + + /** + * 删除客户分配 + * @return + */ + @PostMapping("/relateRemove2") + @PreAuthorize("hasRole('bms:supplier:update')") + public R relateRemove2(@RequestBody SysRelateSuppliersParam2 param){ + List userIds = param.getUserIds(); + BmsSupplier supplier = bmsSupplierService.getById(param.getSupplierId()); + for (String userId : userIds) { + if(supplier.getUserId()!=null && userId.equals(supplier.getUserId())){ + bmsSupplierMapper.removeRelateUserInfo(Long.parseLong(supplier.getId())); + } + } + if(CollectionUtil.isNotEmpty(supplier.getOtherUserIds())){ + List otherUserIds = new ArrayList<>(); + for (String otherUserId : supplier.getOtherUserIds()) { + if(!userIds.contains(otherUserId)){ + otherUserIds.add(otherUserId); + } + } + BmsSupplier supplier1 = new BmsSupplier(); + supplier1.setId(supplier.getId()); + supplier1.setCooperatePauseFlagDate(supplier.getCooperatePauseFlagDate()); + supplier1.setStopFlagDate(supplier.getStopFlagDate()); + supplier1.setOtherUserIds(otherUserIds.toArray(new String[otherUserIds.size()])); + if(otherUserIds.size()<1){ + supplier1.setOtherUserNames(""); + supplier1.setOtherUserCodes(""); + }else { + List sysUsers = sysUserService.listByIds(otherUserIds); + String names = sysUsers.stream().map(SysUser::getName).collect(Collectors.joining(",")); + String codes = sysUsers.stream().map(SysUser::getCode).collect(Collectors.joining(",")); + supplier1.setOtherUserNames(names); + supplier1.setOtherUserCodes(codes); + } + bmsSupplierService.updateById(supplier1); + } + initSupplierOtherInfo(Arrays.asList(supplier.getId())); + //清空临时表 + hisUserSupplierService.cleanTable(); + redisService.remove(RedisCacheKeys.SUPPLIER_RELATE_TREE); + //移除客户直属负责人 + LambdaQueryWrapper rmLqw = new LambdaQueryWrapper<>(); + rmLqw.in(HisUserSupplier::getUserId,userIds); + rmLqw.eq(HisUserSupplier::getSupplierId,supplier.getId()); + rmLqw.eq(HisUserSupplier::getType,2); + hisUserSupplierService.remove(rmLqw); + return R.ok(); + } + + + + /** + * 设置主要负责人 + * @param supplierId + * @param userId + * @return + */ + @GetMapping("/setMainUser") + @PreAuthorize("hasRole('bms:supplier:update')") + public R setMainUser(String supplierId,String userId){ + BmsSupplier supplier = bmsSupplierService.getById(supplierId); + if(supplier.getUserId()!=null&&supplier.getUserId().equals(userId)){ + return R.ok(); + } + SysUser sysUser = sysUserService.getById(userId); + BmsSupplier supplierParam = new BmsSupplier(); + supplierParam.setId(supplierId); + supplierParam.setUserId(sysUser.getId()); + supplierParam.setUserName(sysUser.getName()); + supplierParam.setUserCode(sysUser.getCode()); + if(CollectionUtil.isNotEmpty(supplier.getOtherUserIds())){ + List otherUserIds = new ArrayList<>(Arrays.asList(supplier.getOtherUserIds())); + if(supplier.getUserId() != null){ + otherUserIds.add(supplier.getUserId()); + } + otherUserIds = otherUserIds.stream().filter(uid->!uid.equals(userId)).collect(Collectors.toList()); + Set otherUserIdSet = new HashSet<>(otherUserIds); + String[] otherArr = otherUserIdSet.toArray(new String[otherUserIdSet.size()]); + supplierParam.setOtherUserIds(otherArr); + } + bmsSupplierService.updateById(supplierParam); + initSupplierOtherInfo(Arrays.asList(supplier.getId())); + return R.ok(); + } + + + + /** + * 移除主要负责人 + * @param supplierId + * @return + */ + @GetMapping("/setOtherUser") + @PreAuthorize("hasRole('bms:supplier:update')") + public R setOtherUser(Long supplierId){ + BmsSupplier supplier = bmsSupplierService.getById(supplierId); + List userIds = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(supplier.getOtherUserIds())){ + userIds = Arrays.asList(supplier.getOtherUserIds()); + } + if(supplier.getUserId()==null){ + return R.ok(); + } + Set otherUserIdSet = new HashSet<>(userIds); + otherUserIdSet.add(supplier.getUserId()); + String[] otherArr = otherUserIdSet.toArray(new String[otherUserIdSet.size()]); + bmsSupplierMapper.removeRelateUserInfo(supplierId); + BmsSupplier bmsSupplier = new BmsSupplier(); + bmsSupplier.setId(supplier.getId()); + bmsSupplier.setOtherUserIds(otherArr); + bmsSupplierService.updateById(bmsSupplier); + //清空临时表 + hisUserSupplierService.cleanTable(); + initSupplierOtherInfo(Arrays.asList(supplierId.toString())); + return R.ok(); + } + + /** + * 获取负责人接口(用于后续成本中心) + * @param supplierId + * @return + */ + @GetMapping("/getMgrUser") + public R> getMgrUser(Long supplierId){ + BmsSupplier supplier = bmsSupplierService.getById(supplierId); + List userIds = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(supplier.getOtherUserIds())){ + userIds = Arrays.asList(supplier.getOtherUserIds()); + } + Set otherUserIdSet = new HashSet<>(userIds); + if(StringUtils.hasText(supplier.getUserId())){ + otherUserIdSet.add(supplier.getUserId()); + } + if(otherUserIdSet.size()<1){ + return R.ok(); + } + List userList = sysUserService.listByIds(otherUserIdSet); + List sysUsers = userList.stream().map(SysUser::toSysUserVo).collect(Collectors.toList()); + + for (SysUserVo user : sysUsers) { + boolean isOther = userIds.stream().anyMatch(aa->aa.equals(user.getId())); + user.setSupplierMainFlag(isOther?0:1); + } + + return R.ok(sysUsers); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "供应商", biz = BizType.QUERY) + @PreAuthorize("hasRole('bms:supplier:query')") + public R getById(@PathVariable("id") String id,Integer loadRegionInfo){ + BmsSupplier bmsSupplier = bmsSupplierService.getById(id); + if(StringUtils.hasText(bmsSupplier.getPid())&&!bmsSupplier.getPid().equals("0")){ + BmsSupplier parentInfo = bmsSupplierService.getById(bmsSupplier.getPid()); + bmsSupplier.setParentRegionInfo(parentInfo); + }else { + bmsSupplier.setPid(null); + } + BmsRegion region = bmsRegionService.getById(bmsSupplier.getRegionLast()); + if(region!=null){ + bmsSupplier.setRegionLabel(region.getName()); + } + BmsRegion2 region2 = bmsRegion2Service.getById(bmsSupplier.getRegion2Last()); + if(region2!=null){ + bmsSupplier.setRegion2Label(region2.getName()); + } + List userVos = new ArrayList<>(); + if(StringUtils.hasText(bmsSupplier.getUserId())){ + SysUser sysUser = sysUserService.getById(bmsSupplier.getUserId()); + SysUserSimpleVo simpleVo = sysUser.toSimpleVo(true); + simpleVo.setSupplierMainFlag(1); + userVos.add(simpleVo); + } + if(CollectionUtil.isNotEmpty(bmsSupplier.getOtherUserIds())){ + List userList = sysUserService.listByIds(Arrays.asList(bmsSupplier.getOtherUserIds())); + List userVos2 = userList.stream().map(ur->{ + SysUserSimpleVo simpleVo = ur.toSimpleVo(true); + simpleVo.setSupplierMainFlag(0); + return simpleVo; + }).collect(Collectors.toList()); + userVos.addAll(userVos2); + } + if(loadRegionInfo!=null&&loadRegionInfo.equals(1)){ + BmsRegion obj1 = bmsRegionService.getById(bmsSupplier.getRegionFirst()); + BmsRegion obj2 = bmsRegionService.getById(bmsSupplier.getRegionSecond()); + BmsRegion obj3 = bmsRegionService.getById(bmsSupplier.getRegionThird()); + BmsRegion obj4 = bmsRegionService.getById(bmsSupplier.getRegionFourthly()); + bmsSupplier.setRegionFirstInfo(obj1); + bmsSupplier.setRegionSecondInfo(obj2); + bmsSupplier.setRegionThirdInfo(obj3); + bmsSupplier.setRegionFourthlyInfo(obj4); + BmsRegion2 obj11 = bmsRegion2Service.getById(bmsSupplier.getRegion2First()); + BmsRegion2 obj22 = bmsRegion2Service.getById(bmsSupplier.getRegion2Second()); + BmsRegion2 obj33 = bmsRegion2Service.getById(bmsSupplier.getRegion2Third()); + BmsRegion2 obj44 = bmsRegion2Service.getById(bmsSupplier.getRegion2Fourthly()); + bmsSupplier.setRegion2FirstInfo(obj11); + bmsSupplier.setRegion2SecondInfo(obj22); + bmsSupplier.setRegion2ThirdInfo(obj33); + bmsSupplier.setRegion2FourthlyInfo(obj44); + } + if(bmsSupplier.getSupplierAttachIds()!=null&&bmsSupplier.getSupplierAttachIds().length>0){ + bmsSupplier.setSupplierAttachInfoList(attachService.listByIds(Arrays.asList(bmsSupplier.getSupplierAttachIds()))); + } + bmsSupplier.setUserVos(userVos); + + initSupplierList(Arrays.asList(bmsSupplier)); + + return R.ok(bmsSupplier); + } + + /** + * 根据ID更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "供应商", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:supplier:update')") + public R updateById(@RequestBody BmsSupplierBo param){ + if(param.getId()==null){ + return R.error("id不能为空"); + } + bmsSupplierService.edit(param); + redisService.remove(RedisCacheKeys.SUPPLIER_RELATE_TREE); + hisUserSupplierService.cleanTable(); + return R.ok(); + } + + /** + * 根据ID更新供应商标识 + * @apiNote (SupplierFlag,id)不能为空 + * @param param + * @return + */ + @PostMapping("/updateSupplierFlagById") + @SysLog(module = SystemModule.BASE, title = "供应商标识", biz = BizType.UPDATE) + public R updateSupplierFlagById(@RequestBody BmsSupplierBo param){ + if(param.getId()==null){ + return R.error("id不能为空"); + } + BmsSupplier entity = new BmsSupplier(); + entity.setId(param.getId()); + entity.setSupplierFlag(param.getSupplierFlag()); + bmsSupplierService.updateById(entity); + return R.ok(); + } + + @GetMapping("/updateSupplierPath") + public R updateSupplierPath(){ + List supplierList = bmsSupplierService.list( + new LambdaQueryWrapper() + .select( + BmsSupplier::getId,BmsSupplier::getRegion2Third, + BmsSupplier::getRegionThird, + BmsSupplier::getCooperatePauseFlagDate, + BmsSupplier::getStopFlagDate + ) + ); + for (BmsSupplier supplier : supplierList) { + if(supplier.getRegion2Third()!=null){ + BmsRegion2 region2 = bmsRegion2Service.getById(supplier.getRegion2Third()); + if(region2!=null){ + String[] ids = region2.getPathIds().split("_"); + if(ids.length>0){ + supplier.setRegion2First(ids[0]); + } + if(ids.length>1){ + supplier.setRegion2Second(ids[1]); + } + if(ids.length>2){ + supplier.setRegion2Third(ids[2]); + } + } + } + if(supplier.getRegionThird()!=null){ + BmsRegion region1 = bmsRegionService.getById(supplier.getRegionThird()); + if(region1!=null){ + String[] ids = region1.getPathIds().split("_"); + if(ids.length>0){ + supplier.setRegionFirst(ids[0]); + } + if(ids.length>1){ + supplier.setRegionSecond(ids[1]); + } + if(ids.length>2){ + supplier.setRegionThird(ids[2]); + } + } + } + + if(supplier.getRegionThird()!=null || supplier.getRegion2Third()!=null){ + bmsSupplierService.updateById(supplier); + } + } + return R.ok(); + } + + /** + * 更新父级ID + * @param param + * @return + */ + @PostMapping("/updateParent") + @SysLog(module = SystemModule.BASE, title = "供应商", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:supplier:update')") + public R updateParent(@RequestBody BmsSupplierParentBo param){ + BmsSupplier supplier = new BmsSupplier(); + BmsSupplier supplierdb = null; + if(param.getId()!=null){ + supplier.setId(param.getId()); + supplierdb = bmsSupplierService.getById(param.getId()); + } + if(supplierdb!=null && !supplierdb.getPid().equals(param.getPid())){ + List childList = bmsSupplierService.listChildByPathIds(supplierdb.getPathIds()); + if(param.getPid()==null||param.getPid().equals("0")){ + supplier.setPid("0"); + supplier.setParentCode("0"); + supplier.setPathIds("0_"+supplier.getId()); + }else { + BmsSupplier parentNode = bmsSupplierService.getById(param.getPid()); + supplier.setPid(param.getPid()); + String[] pids = parentNode.getPathIds().split("_"); + for (String pid : pids) { + if(pid.equals(supplier.getId())){ + return R.error("数据出现循环递归,保存失败"); + } + } + supplier.setPathIds(parentNode.getPathIds()+"_"+supplier.getId()); + supplier.setParentCode(parentNode.getCode()); + } + for (BmsSupplier bmsSupplier : childList) { + BmsSupplier bmsSupplier2 = new BmsSupplier(); + bmsSupplier2.setPathIds(bmsSupplier.getPathIds().replace(supplierdb.getPathIds(),supplier.getPathIds())); + bmsSupplier2.setId(bmsSupplier.getId()); + bmsSupplierService.updateById(bmsSupplier2); + } + } + bmsSupplierService.updateById(supplier); + redisService.remove(RedisCacheKeys.SUPPLIER_RELATE_TREE); + return R.ok(); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "供应商", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:supplier:insert')") + public R save(@RequestBody @Valid BmsSupplierBo param){ + bmsSupplierService.edit(param); + //清空临时表 + hisUserSupplierService.cleanTable(); + redisService.remove(RedisCacheKeys.SUPPLIER_RELATE_TREE); + return R.ok(); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BASE, title = "供应商", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:supplier:delete')") + public R deleteById(@PathVariable("id") String id){ + if(bmsSupplierService.listChild(id).size()>0){ + return R.error("含有子客户无法删除"); + } + LambdaQueryWrapper budgetLambdaQueryWrapper = new LambdaQueryWrapper<>(); + budgetLambdaQueryWrapper.eq(TbsBudget::getCenterType, TbsCenterType.customer); + budgetLambdaQueryWrapper.eq(TbsBudget::getCenterId,id); + if(0 list) { + //设置销售区域 + List regionIds = list.stream() + .filter(sup -> sup.getRegionLast() != null && !sup.getRegionLast().equals("0")) + .map(BmsSupplier::getRegionLast).collect(Collectors.toList()); + regionIds.addAll(list.stream() + .filter(sup -> sup.getRegionFirst() != null && !sup.getRegionFirst().equals("0")) + .map(BmsSupplier::getRegionFirst).collect(Collectors.toList())); + regionIds.addAll(list.stream() + .filter(sup -> sup.getRegionSecond() != null && !sup.getRegionSecond().equals("0")) + .map(BmsSupplier::getRegionSecond).collect(Collectors.toList())); + regionIds.addAll(list.stream() + .filter(sup -> sup.getRegionThird() != null && !sup.getRegionThird().equals("0")) + .map(BmsSupplier::getRegionThird).collect(Collectors.toList())); + regionIds.addAll(list.stream() + .filter(sup -> sup.getRegionFourthly() != null && !sup.getRegionFourthly().equals("0")) + .map(BmsSupplier::getRegionFourthly).collect(Collectors.toList())); + + List regionList = null; + if (CollectionUtil.isNotEmpty(regionIds)) { + regionList = bmsRegionService.listByIds(regionIds); + } + if (CollectionUtil.isNotEmpty(regionList)){ + for (BmsSupplier supplier : list) { + String regionId = supplier.getRegionLast(); + String regionFirst = supplier.getRegionFirst(); + String regionSecond = supplier.getRegionSecond(); + String regionThird = supplier.getRegionThird(); + String regionFourthly = supplier.getRegionFourthly(); + + for (BmsRegion region : regionList) { + if (region.getId().equals(regionId)) { + supplier.setRegionLabel(region.getName()); + } + if (region.getId().equals(regionFirst)) { + supplier.setRegionFirstInfo(region); + } + if (region.getId().equals(regionSecond)) { + supplier.setRegionSecondInfo(region); + } + if (region.getId().equals(regionThird)) { + supplier.setRegionThirdInfo(region); + } + if (region.getId().equals(regionFourthly)) { + supplier.setRegionFourthlyInfo(region); + } + } + } + } + //设置行政区域 + List region2Ids = list.stream() + .filter(sup->sup.getRegion2Last()!=null&&!sup.getRegion2Last().equals("0")) + .map(BmsSupplier::getRegion2Last).collect(Collectors.toList()); + region2Ids.addAll(list.stream() + .filter(sup -> sup.getRegion2First() != null && !sup.getRegion2First().equals("0")) + .map(BmsSupplier::getRegion2First).collect(Collectors.toList())); + region2Ids.addAll(list.stream() + .filter(sup -> sup.getRegion2Second() != null && !sup.getRegion2Second().equals("0")) + .map(BmsSupplier::getRegion2Second).collect(Collectors.toList())); + region2Ids.addAll(list.stream() + .filter(sup -> sup.getRegion2Third() != null && !sup.getRegion2Third().equals("0")) + .map(BmsSupplier::getRegion2Third).collect(Collectors.toList())); + region2Ids.addAll(list.stream() + .filter(sup -> sup.getRegion2Fourthly() != null && !sup.getRegion2Fourthly().equals("0")) + .map(BmsSupplier::getRegion2Fourthly).collect(Collectors.toList())); + + List region2List = null; + if(CollectionUtil.isNotEmpty(region2Ids)){ + region2List = bmsRegion2Service.listByIds(region2Ids); + } + if(CollectionUtil.isNotEmpty(region2List)){ + for (BmsSupplier supplier : list) { + String region2Id = supplier.getRegion2Last(); + String regionFirst = supplier.getRegion2First(); + String regionSecond = supplier.getRegion2Second(); + String regionThird = supplier.getRegion2Third(); + String regionFourthly = supplier.getRegion2Fourthly(); + + for (BmsRegion2 region : region2List) { + String regionId = region.getId(); + + if (regionId.equals(region2Id)) { + supplier.setRegion2Label(region.getName()); + } + if (region.getId().equals(regionFirst)) { + supplier.setRegion2FirstInfo(region); + } + if (region.getId().equals(regionSecond)) { + supplier.setRegion2SecondInfo(region); + } + if (region.getId().equals(regionThird)) { + supplier.setRegion2ThirdInfo(region); + } + if (region.getId().equals(regionFourthly)) { + supplier.setRegion2FourthlyInfo(region); + } + } + } + } + } + + + private void initParentList(List list){ + for (BmsSupplier supplier : list) { + if(StringUtils.hasText(supplier.getPid())&&!supplier.getPid().equals("0")){ + BmsSupplier parentInfo = bmsSupplierService.getById(supplier.getPid()); + supplier.setParentRegionInfo(parentInfo); + }else { + supplier.setPid(null); + } + } + } + + /** + * 初始化其它信息 + * @param supplierIds + */ + private void initSupplierOtherInfo(List supplierIds){ + List suppliers = bmsSupplierService.listByIds(supplierIds); + List updParams = new ArrayList<>(); + for (BmsSupplier supplier : suppliers) { + if(CollectionUtil.isNotEmpty(supplier.getOtherUserIds())){ + List otherUserIds = Arrays.asList(supplier.getOtherUserIds()); + BmsSupplier param = new BmsSupplier(); + param.setId(supplier.getId()); + if(otherUserIds.size()>0){ + List userList = sysUserService.listByIds(otherUserIds); + String codes = userList.stream().map(SysUser::getCode).collect(Collectors.joining(",")); + String names = userList.stream().map(SysUser::getName).collect(Collectors.joining(",")); + param.setOtherUserCodes(codes); + param.setOtherUserNames(names); + }else { + param.setOtherUserCodes(""); + param.setOtherUserNames(""); + } + param.setCooperatePauseFlagDate(supplier.getCooperatePauseFlagDate()); + param.setStopFlagDate(supplier.getStopFlagDate()); + updParams.add(param); + } + } + if(CollectionUtil.isNotEmpty(updParams)){ + bmsSupplierService.updateBatchById(updParams); + } + } + + /** + * 获取大区下来列表 + * @return + */ + @GetMapping("/getComRegion") + public R> getComRegion(){ + List supplierComRegions = supplierComRegionMapper.selectList(new QueryWrapper<>()); + return R.ok(supplierComRegions); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/importExcel") +// @SysLog(module = SystemModule.BASE, title = "供应商", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:supplier:insert')") + public R importExcel(@RequestBody List param){ + param.forEach(a->{ + a.setErrorInfo(""); + if(a.getType().equals("4")){ + return; + } + if(!StringUtils.hasText(a.getCustomerCode())){ + a.setErrorInfo(a.getErrorInfo()+"客户编号不能为空;"); + } + if(a.getType().equals("3")){ + return; + } + if(!StringUtils.hasText(a.getCustomerName())){ + a.setErrorInfo(a.getErrorInfo()+"客户名称不能为空;"); + } + if(!StringUtils.hasText(a.getSalesRegionName())){ + a.setErrorInfo(a.getErrorInfo()+"销售区域不能为空;"); + } + if(a.getSupplierInfoFlag()==null){ + a.setErrorInfo(a.getErrorInfo()+"供应商信息是否必填不能空;"); + } + if(a.getSupplierInfoFlag()!=null&&a.getSupplierInfoFlag().equals(1)){ + if(!StringUtils.hasText(a.getSupplierTaxNumber())){ + a.setErrorInfo(a.getErrorInfo()+"税号不能为空;"); + } + if(!StringUtils.hasText(a.getSupplierUser())){ + a.setErrorInfo(a.getErrorInfo()+"供应商联系人不能为空;"); + } + if(!StringUtils.hasText(a.getSupplierLicenseImg())){ + a.setErrorInfo(a.getErrorInfo()+"营业执照地址不能为空;"); + } + } + + if(!StringUtils.hasText(a.getFirstLevelAdministrativeRegionName())){ + a.setErrorInfo(a.getErrorInfo()+"省不能为空;"); + } + if(!StringUtils.hasText(a.getSecondaryLevelAdministrativeRegionName())){ + a.setErrorInfo(a.getErrorInfo()+"市不能为空;"); + } + if(!StringUtils.hasText(a.getAdministrativeRegionName())){ + a.setErrorInfo(a.getErrorInfo()+"行政区域不能为空;"); + } + if(a.getIsSupplier()==null){ + a.setErrorInfo(a.getErrorInfo()+"是否供应商字段不能为空;"); + } +// if(!StringUtils.hasText(a.getMinorHeadCodes()) && !StringUtils.hasText(a.getMainHeadCode())){ +// a.setErrorInfo(a.getErrorInfo()+"负责人不能为空;"); +// } + if(a.getIsExpendableExpense()==null){ + a.setErrorInfo(a.getErrorInfo()+"是否投放费用字段不能为空;"); + } +// if(a.getCloseAccountStatus()==null){ +// a.setErrorInfo(a.getErrorInfo()+"闭户状态不能为空;"); +// } + }); + List saveList = param.stream().filter(a->a.getType().equals("1")).collect(Collectors.toList()); + List updateList = param.stream().filter(a->a.getType().equals("2")).collect(Collectors.toList()); + List deleteList = param.stream().filter(a->a.getType().equals("3")).collect(Collectors.toList()); + + /** --------------------------------------------------------------------------- **/ + List bmsRegionNames = new ArrayList<>(); + bmsRegionNames.addAll( + saveList.stream().filter(a->a.getSalesRegionName()!=null) + .map(a->a.getSalesRegionName()).collect(Collectors.toList()) + ); + bmsRegionNames.addAll( + updateList.stream().filter(a->a.getSalesRegionName()!=null) + .map(a->a.getSalesRegionName()).collect(Collectors.toList()) + ); + bmsRegionNames = bmsRegionNames.stream().distinct().collect(Collectors.toList()); + List regionList = new ArrayList<>(); + if(bmsRegionNames.size()>0){ + LambdaQueryWrapper bmsRegionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + bmsRegionLambdaQueryWrapper.in(BmsRegion::getName,bmsRegionNames); + regionList = bmsRegionService.list(bmsRegionLambdaQueryWrapper); + List existBmsRegionName = regionList.stream().map(a->a.getName()).collect(Collectors.toList()); + if(regionList.size(){ + if(a.getType().equals("4")){ + return; + } + if(!existBmsRegionName.contains(a.getSalesRegionName())){ + a.setErrorInfo(a.getErrorInfo()+"不存在销售区域"+a.getSalesRegionName()+";"); + } + }); + + } + } + + List bmsBizRegionNames = new ArrayList<>(); + List bizRegionList = new ArrayList<>(); + + bmsBizRegionNames.addAll( + saveList.stream().filter(a->a.getSecondaryLevelAdministrativeRegionName()!=null + && a.getFirstLevelAdministrativeRegionName()!=null && a.getAdministrativeRegionName()!=null) + .map(a->a.getFirstLevelAdministrativeRegionName()+"_"+a.getSecondaryLevelAdministrativeRegionName()+"_"+a.getAdministrativeRegionName()).collect(Collectors.toList()) + ); + bmsBizRegionNames.addAll( + updateList.stream().filter(a->a.getSecondaryLevelAdministrativeRegionName()!=null + && a.getFirstLevelAdministrativeRegionName()!=null && a.getAdministrativeRegionName()!=null) + .map(a->a.getFirstLevelAdministrativeRegionName()+"_"+a.getSecondaryLevelAdministrativeRegionName()+"_"+a.getAdministrativeRegionName()).collect(Collectors.toList()) + ); + bmsBizRegionNames = bmsBizRegionNames.stream().distinct().collect(Collectors.toList()); + if(bmsBizRegionNames.size()>0){ + LambdaQueryWrapper bmsRegion2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + bmsRegion2LambdaQueryWrapper.in(BmsRegion2::getPathNames,bmsBizRegionNames); + bizRegionList = bmsRegion2Service.list(bmsRegion2LambdaQueryWrapper); + List exsitBizRegeionName = bizRegionList.stream().map(BmsRegion2::getPathNames).collect(Collectors.toList()); + if(bizRegionList.size(){ + if(a.getType().equals("4")){ + return; + } + if(!exsitBizRegeionName.contains( + a.getFirstLevelAdministrativeRegionName()+"_"+a.getSecondaryLevelAdministrativeRegionName()+"_"+a.getAdministrativeRegionName()) + ){ + a.setErrorInfo(a.getErrorInfo()+"不存在行政区域"+a.getFirstLevelAdministrativeRegionName()+"_"+a.getSecondaryLevelAdministrativeRegionName()+"_"+a.getAdministrativeRegionName()+";"); + } + }); + } + } + /** ------------------------------- 校验负责人 ------------------------------------------------ */ + Set userCodes = new HashSet<>(); + userCodes.addAll( + saveList.stream().filter(a->StringUtils.hasText(a.getMainHeadCode())) + .map(a->Arrays.asList(a.getMainHeadCode().split(";"))) + .flatMap(List::stream).collect(Collectors.toList()) + ); + userCodes.addAll( + saveList.stream().filter(a->StringUtils.hasText(a.getMinorHeadCodes())) + .map(a->Arrays.asList(a.getMinorHeadCodes().split(";"))) + .flatMap(List::stream).collect(Collectors.toList()) + ); + userCodes.addAll( + updateList.stream().filter(a->StringUtils.hasText(a.getMainHeadCode())) + .map(a->Arrays.asList(a.getMainHeadCode().split(";"))) + .flatMap(List::stream).collect(Collectors.toList()) + ); + userCodes.addAll( + updateList.stream().filter(a->StringUtils.hasText(a.getMinorHeadCodes())) + .map(a->Arrays.asList(a.getMinorHeadCodes().split(";"))) + .flatMap(List::stream).collect(Collectors.toList()) + ); + userCodes = userCodes.stream().filter(StringUtils::hasText).collect(Collectors.toSet()); + List userList = new ArrayList<>(); + if(userCodes.size()>0){ + LambdaQueryWrapper sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>(); + sysUserLambdaQueryWrapper.in(SysUser::getCode,userCodes); + userList = sysUserService.list(sysUserLambdaQueryWrapper); + List exsitUserCodes = userList.stream().map(a->a.getCode()).collect(Collectors.toList()); + if(userList.size(){ + if(a.getType().equals("4")){ + return; + } + if(a.getType().equals("3")){ + return; + } + List userCodeTemp = new ArrayList<>(); + if(StringUtils.hasText(a.getMainHeadCode())){ + userCodeTemp.addAll(Arrays.asList(a.getMainHeadCode().split(";"))); + } + if(StringUtils.hasText(a.getMinorHeadCodes())){ + userCodeTemp.addAll(Arrays.asList(a.getMinorHeadCodes().split(";"))); + } + List noExistUserCode = userCodeTemp.stream().filter(b->!exsitUserCodes.contains(b)).collect(Collectors.toList()); + if(noExistUserCode.size()>0){ + a.setErrorInfo(a.getErrorInfo()+"不存在人员"+noExistUserCode.stream().collect(Collectors.joining(","))); + } + }); + } + } + /** --------------------------------------------------------------------------- **/ + + /** --------------------------------------------------------------------------- **/ + /** ------------------------------- 校验新增 ------------------------------------------------ */ + if(saveList.size()>0){ + List saveCodes = saveList.stream().filter(a->StringUtils.hasText(a.getCustomerCode())).map(a->a.getCustomerCode()).distinct().collect(Collectors.toList()); + if(saveCodes.size()>0){ + LambdaQueryWrapper checkSave = new LambdaQueryWrapper<>(); + checkSave.in(BmsSupplier::getCode,saveCodes); + List checkSaveSupplier = bmsSupplierService.list(checkSave); + if(checkSaveSupplier.size()>0){ + List existSaveCodes = checkSaveSupplier.stream().map(a->a.getCode()).collect(Collectors.toList()); + param.forEach(a->{ + if(a.getType().equals("1")){ + if(existSaveCodes.contains(a.getCustomerCode())){ + a.setErrorInfo(a.getErrorInfo()+"已存在客户编码"); + } + } + }); + } + } + } + + + /** --------------------------------------------------------------------------- **/ + + /** ------------------------------- 校验更新 ------------------------------------------------ */ + if(updateList.size()>0){ + List updateCheckCodes = updateList.stream().filter(a->StringUtils.hasText(a.getCustomerCode())).map(a->a.getCustomerCode()).distinct().collect(Collectors.toList()); + if(updateCheckCodes.size()==0){ + param.forEach(a->{ + if(a.getType().equals("2")){ + a.setErrorInfo(a.getErrorInfo()+"更新不存在客户编码;"); + } + }); + + }else{ + LambdaQueryWrapper checkUpdateCustomerCode = new LambdaQueryWrapper<>(); + checkUpdateCustomerCode.in(BmsSupplier::getCode,updateCheckCodes); + List checkUpdateSupplierList = bmsSupplierService.list(checkUpdateCustomerCode); + List existUpdateCodes = checkUpdateSupplierList.stream().map(a->a.getCode()).collect(Collectors.toList()); + param.forEach(a->{ + if(a.getType().equals("2")){ + if(!existUpdateCodes.contains(a.getCustomerCode())){ + a.setErrorInfo(a.getErrorInfo()+"更新不存在客户编码;"); + } + } + }); + } + } + /** ----------------------------------------------------------------------------------- */ + + /** ------------------------------- 删除更新 ------------------------------------------------ */ + if(deleteList.size()>0){ + List deleteCheckCodes = deleteList.stream().map(a->a.getCustomerCode()).collect(Collectors.toList()); + if(deleteCheckCodes.size()==0){ + param.forEach(a->{ + if(a.getType().equals("3")){ + a.setErrorInfo(a.getErrorInfo()+"删除不存在客户编码"); + } + }); + }else{ + LambdaQueryWrapper checkDeleteCustomerCode = new LambdaQueryWrapper<>(); + checkDeleteCustomerCode.in(BmsSupplier::getCode,deleteCheckCodes); + List checkDeleteSupplierList = bmsSupplierService.list(checkDeleteCustomerCode); + List existDeleteCodes = checkDeleteSupplierList.stream().map(a->a.getCode()).collect(Collectors.toList()); + param.forEach(a->{ + if(a.getType().equals("3")){ + if(!existDeleteCodes.contains(a.getCustomerCode())){ + a.setErrorInfo(a.getErrorInfo()+"删除不存在客户编码;"); + } + } + }); + } + } + /** ----------------------------------------------------------------------------------- */ + + /** ------------------------------- 返回错误 ------------------------------------------- */ + if(param.stream().filter(a->a.getErrorInfo().length()>0).count()>0) { + return R.ok(param, "导入失败,请打开EXCEL查询错误详情!"); + } + /** ----------------------------------------------------------------------------------- */ + + Map bizRegionMap = bizRegionList.stream().collect(Collectors.toMap(BmsRegion2::getPathNames, a->a)); + Map saleRegionMap = regionList.stream().collect(Collectors.toMap(BmsRegion::getName, a->a)); + Map sysUserMap = userList.stream().collect(Collectors.toMap(SysUser::getCode, a->a)); + + /** ------------------------------- 保存新增 ------------------------------------------------ */ + if(saveList.size()>0) { + List saveBmsSuppliers = saveList.stream().map(a->{ + BmsSupplier supplier = new BmsSupplier(); + supplier.setName(a.getCustomerName()); + supplier.setCode(a.getCustomerCode()); + supplier.setBelong(a.getAffiliatedCompany()); + supplier.setCostFlag(a.getIsExpendableExpense()); + supplier.setStopFlag(a.getCloseAccountStatus()); + supplier.setCdOrderFlag(a.getCdOrderFlag()); + supplier.setStopFlagDate(a.getCloseAccountDate()); + supplier.setCooperatePauseFlag(a.getSuspendCooperationStatus()); + supplier.setCooperatePauseFlagDate(a.getSuspendCooperationDate()); + supplier.setSupplierFlag(a.getIsSupplier()); + supplier.setSupplierInfoFlag(a.getSupplierInfoFlag()); + supplier.setSupplierLicenseImg(a.getSupplierLicenseImg()); + supplier.setSupplierUser(a.getSupplierUser()); + supplier.setSupplierTaxNumber(a.getSupplierTaxNumber()); + supplier.setTransportVisible(a.getTransportVisible()); + if(StringUtils.hasText(a.getMainHeadCode())){ + SysUser sysUser = sysUserMap.get(a.getMainHeadCode()); + supplier.setUserId(sysUser.getId()); + supplier.setUserCode(sysUser.getCode()); + supplier.setUserName(sysUser.getName()); + } + + if(StringUtils.hasText(a.getMinorHeadCodes())){ + List otherUserCodes = Arrays.asList(a.getMinorHeadCodes().split(";")); + List otherUserNames = new ArrayList<>(); + List otherUserIds = new ArrayList<>(); + otherUserCodes.forEach(b->{ + SysUser sysUser = sysUserMap.get(b); + otherUserNames.add(sysUser.getName()); + otherUserIds.add(sysUser.getId()); + }); + supplier.setOtherUserCodes(otherUserCodes.stream().collect(Collectors.joining(","))); + supplier.setOtherUserNames(otherUserNames.stream().collect(Collectors.joining(","))); + supplier.setOtherUserIds(otherUserIds.toArray(new String[otherUserIds.size()])); + } + + if(StringUtils.hasText(a.getSalesRegionName())){ + BmsRegion saleRegion = saleRegionMap.get(a.getSalesRegionName()); + supplier.setRegionLast(saleRegion.getId()); + supplier.setRegionSecond(saleRegion.getId()); + supplier.setRegionFirst(saleRegion.getPid()); + } + + if(StringUtils.hasText(a.getSecondaryLevelAdministrativeRegionName()) + && StringUtils.hasText(a.getFirstLevelAdministrativeRegionName()) + && StringUtils.hasText(a.getAdministrativeRegionName())){ + BmsRegion2 bizRegion = bizRegionMap.get(a.getFirstLevelAdministrativeRegionName()+"_"+a.getSecondaryLevelAdministrativeRegionName()+"_"+a.getAdministrativeRegionName()); + supplier.setRegion2Third(bizRegion.getId()); + supplier.setRegion2Second(bizRegion.getPid()); + String firstRegion2Id = bizRegion.getPathIds().split("_")[0]; + supplier.setRegion2First(firstRegion2Id); + supplier.setRegion2Last(bizRegion.getId()); + } + + return supplier; + }).collect(Collectors.toList()); + bmsSupplierService.saveBatch(saveBmsSuppliers); + } + /** ----------------------------------------------------------------------------------- */ + /** ------------------------------- 保存更新 ------------------------------------------------ */ + if(updateList.size()>0) { + LambdaQueryWrapper oriBmsLqw = new LambdaQueryWrapper<>(); + oriBmsLqw.in(BmsSupplier::getCode,updateList.stream().map(b->b.getCustomerCode()).collect(Collectors.toList())); + List oriBmsSuppliers = bmsSupplierService.list(oriBmsLqw); + Map codeToSupplierId = oriBmsSuppliers.stream().collect(Collectors.toMap(BmsSupplier::getCode, BmsSupplier::getId)); + + List updateBmsSuppliers = updateList.stream().map(a->{ + BmsSupplier supplier = new BmsSupplier(); + + supplier.setId(codeToSupplierId.get(a.getCustomerCode())); + supplier.setName(a.getCustomerName()); + supplier.setCode(a.getCustomerCode()); + supplier.setCostFlag(a.getIsExpendableExpense()); + supplier.setBelong(a.getAffiliatedCompany()); + supplier.setStopFlag(a.getCloseAccountStatus()); + supplier.setCdOrderFlag(a.getCdOrderFlag()); + supplier.setStopFlagDate(a.getCloseAccountDate()); + supplier.setCooperatePauseFlag(a.getSuspendCooperationStatus()); + supplier.setCooperatePauseFlagDate(a.getSuspendCooperationDate()); + supplier.setSupplierFlag(a.getIsSupplier()); + supplier.setSupplierInfoFlag(a.getSupplierInfoFlag()); + supplier.setSupplierLicenseImg(a.getSupplierLicenseImg()); + supplier.setSupplierUser(a.getSupplierUser()); + supplier.setSupplierTaxNumber(a.getSupplierTaxNumber()); + if(StringUtils.hasText(a.getMainHeadCode())){ + SysUser sysUser = sysUserMap.get(a.getMainHeadCode()); + supplier.setUserId(sysUser.getId()); + supplier.setUserCode(sysUser.getCode()); + supplier.setUserName(sysUser.getName()); + } + + if(StringUtils.hasText(a.getMinorHeadCodes())){ + List otherUserCodes = Arrays.asList(a.getMinorHeadCodes().split(";")); + List otherUserNames = new ArrayList<>(); + List otherUserIds = new ArrayList<>(); + otherUserCodes.forEach(b->{ + SysUser sysUser = sysUserMap.get(b); + if(sysUser!=null){ + otherUserNames.add(sysUser.getName()); + otherUserIds.add(sysUser.getId()); + } + }); + supplier.setOtherUserCodes(otherUserCodes.stream().collect(Collectors.joining(","))); + supplier.setOtherUserNames(otherUserNames.stream().collect(Collectors.joining(","))); + supplier.setOtherUserIds(otherUserIds.toArray(new String[otherUserIds.size()])); + } + + if(StringUtils.hasText(a.getSalesRegionName())){ + BmsRegion saleRegion = saleRegionMap.get(a.getSalesRegionName()); + supplier.setRegionLast(saleRegion.getId()); + String[] ids = saleRegion.getPathIds().split("_"); + supplier.setRegionFirst(ids[0]); + if(ids.length>1){ + supplier.setRegionSecond(ids[1]); + }else { + supplier.setRegionSecond("0"); + } + if(ids.length>2){ + supplier.setRegionThird(ids[2]); + }else { + supplier.setRegionThird("0"); + } + } + + if(StringUtils.hasText(a.getSecondaryLevelAdministrativeRegionName()) + && StringUtils.hasText(a.getFirstLevelAdministrativeRegionName()) + && StringUtils.hasText(a.getAdministrativeRegionName())){ + String region2Key = a.getFirstLevelAdministrativeRegionName()+"_"+a.getSecondaryLevelAdministrativeRegionName()+"_"+a.getAdministrativeRegionName(); + BmsRegion2 bizRegion = bizRegionMap.get(region2Key); + if(bizRegion==null){ + Assert.throwEx("区域缺失:"+region2Key); + } + supplier.setRegion2Last(bizRegion.getId()); + String[] ids = bizRegion.getPathIds().split("_"); + supplier.setRegion2First(ids[0]); + if(ids.length>1){ + supplier.setRegion2Second(ids[1]); + }else { + supplier.setRegion2Second("0"); + } + if(ids.length>2){ + supplier.setRegion2Third(ids[2]); + }else { + supplier.setRegion2Third("0"); + } + } + + return supplier; + }).collect(Collectors.toList()); + bmsSupplierService.updateBatchById(updateBmsSuppliers); + + List updateBmsSuppliersUserNullById = updateList.stream() + .filter(a->!StringUtils.hasText(a.getMainHeadCode())) + .map(a-> codeToSupplierId.get(a.getCustomerCode())).collect(Collectors.toList()); + + if(updateBmsSuppliersUserNullById.size()>0){ + bmsSupplierService.updateBmsSuppliersUserNullById(updateBmsSuppliersUserNullById); + } + + List updateBmsSuppliersOtherUserNullById = updateList.stream() + .filter(a->!StringUtils.hasText(a.getMinorHeadCodes())) + .map(a-> codeToSupplierId.get(a.getCustomerCode())).collect(Collectors.toList()); + + if(updateBmsSuppliersOtherUserNullById.size()>0){ + bmsSupplierService.updateBmsSuppliersOtherUserNullById(updateBmsSuppliersOtherUserNullById); + } + } + /** ----------------------------------------------------------------------------------- */ + /** ------------------------------- 删除数据 ------------------------------------------------ */ + if(deleteList.size()>0) { + LambdaQueryWrapper oriBmsLqw = new LambdaQueryWrapper<>(); + oriBmsLqw.in(BmsSupplier::getCode,deleteList.stream().map(b->b.getCustomerCode()).collect(Collectors.toList())); + List oriBmsSuppliers = bmsSupplierService.list(oriBmsLqw); +// Map codeToSupplierId = oriBmsSuppliers.stream().collect(Collectors.toMap(BmsSupplier::getCode, BmsSupplier::getId)); + List deleteIds = oriBmsSuppliers.stream().map(a->a.getId()).collect(Collectors.toList()); + bmsSupplierService.removeBatchByIds(deleteIds); + } + /** ----------------------------------------------------------------------------------- */ + + return R.ok(); + } + + + /** + * 直属负责人,直接添加到his表 + * @param userIds + * @param supplier + */ + private void saveTOHis(List userIds, BmsSupplier supplier) { + //直属负责人,直接添加到his表 + for (String userId : userIds) { + HisUserSupplier hisUserSupplier = new HisUserSupplier(); + hisUserSupplier.setUserId(userId); + hisUserSupplier.setSupplierId(Long.parseLong(supplier.getId())); + hisUserSupplier.setSupplierName(supplier.getName()); + hisUserSupplier.setSupplierCode(supplier.getCode()); + hisUserSupplier.setType(2); + hisUserSupplier.setSaleRegionFirst(supplier.getRegionFirst()); + hisUserSupplier.setSaleRegionSecond(supplier.getRegionSecond()); + hisUserSupplier.setSaleRegionThird(supplier.getRegionThird()); + hisUserSupplier.setSaleRegionFourthly(supplier.getRegionFourthly()); + hisUserSupplier.setMasterFlag(1); + hisUserSupplier.setCreateTime(LocalDateTime.now()); + hisUserSupplier.setBizRegionFirst(supplier.getRegion2First()); + hisUserSupplier.setBizRegionSecond(supplier.getRegion2Second()); + hisUserSupplier.setBizRegionThird(supplier.getRegion2Third()); + hisUserSupplier.setBizRegionFourthly(supplier.getRegion2Fourthly()); + hisUserSupplier.setCostFlag(supplier.getCostFlag()); + hisUserSupplier.setSupplierFlag(supplier.getSupplierFlag()); + hisUserSupplier.setStopFlag(supplier.getStopFlag()); + hisUserSupplier.setStopFlagDate(supplier.getStopFlagDate()); + hisUserSupplier.setCooperatePauseFlag(supplier.getCooperatePauseFlag()); + hisUserSupplier.setCooperatePauseFlagDate(supplier.getCooperatePauseFlagDate()); + hisUserSupplierService.save(hisUserSupplier); + } + } + + + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierStatementController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierStatementController.java new file mode 100644 index 0000000..5acae2c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierStatementController.java @@ -0,0 +1,112 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.BmsSupplierStatement; +import com.qs.serve.modules.bms.service.BmsSupplierStatementService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 基础档案 客户货款对账单 + * @author YenHex + * @since 2024-03-22 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/supplierStatement") +public class BmsSupplierStatementController { + + private BmsSupplierStatementService bmsSupplierStatementService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(BmsSupplierStatement param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = bmsSupplierStatementService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BmsSupplierStatement param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = bmsSupplierStatementService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "客户货款对账单", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + BmsSupplierStatement bmsSupplierStatement = bmsSupplierStatementService.getById(id); + return R.ok(bmsSupplierStatement); + } + + + + /** + * 更新 + * @param param + * @return + */ + //@PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "客户货款对账单", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid BmsSupplierStatement param){ + boolean result = bmsSupplierStatementService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "客户货款对账单", biz = BizType.INSERT) + public R save(@RequestBody @Valid BmsSupplierStatement param){ + boolean result = bmsSupplierStatementService.saveBmsSupplierStatement(param); + return R.isTrue(result); + } + + /** + * 删除 + * @param jslId + * @return + */ + @DeleteMapping("/deleteById/{jslId}") + @SysLog(module = SystemModule.BASE, title = "客户货款对账单", biz = BizType.DELETE) + public R deleteById(@PathVariable("jslId") String jslId){ + boolean result = bmsSupplierStatementService.deleteBmsSupplierStatement(jslId); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierVisitAddressController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierVisitAddressController.java new file mode 100644 index 0000000..2a38168 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierVisitAddressController.java @@ -0,0 +1,270 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.github.pagehelper.PageHelper; +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.baz.common.BazTargetTypeConsts; +import com.qs.serve.modules.baz.entity.BazVisitInfo; +import com.qs.serve.modules.baz.service.BazVisitFlowService; +import com.qs.serve.modules.baz.service.BazVisitInfoService; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.bo.BmsSupplierVisitDefaultAddressBo; +import com.qs.serve.modules.bms.entity.so.BmsSupplierVisitSo; +import com.qs.serve.modules.bms.service.*; +import com.qs.serve.modules.his.entity.HisUserSupplier; +import com.qs.serve.modules.his.entity.dto.HisUserSupplierAddressVo; +import com.qs.serve.modules.his.mapper.HisUserSupplierMapper; +import com.qs.serve.modules.his.service.HisUserSupplierService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.common.enums.BusinessLogType; +import com.qs.serve.modules.sys.service.SysBusinessLogService; +import com.qs.serve.modules.sys.service.SysPostUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.BmsSupplierVisitAddress; + +import javax.validation.Valid; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 基础档案 供应商拜访地址 + * @author YenHex + * @since 2023-03-28 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/supplierVisitAddress") +public class BmsSupplierVisitAddressController { + + private SysBusinessLogService businessLogService; + private BazVisitInfoService bazVisitInfoService; + private BmsSupplierVisitAddressService bmsSupplierVisitAddressService; + private BmsSupplierService bmsSupplierService; + private HisUserSupplierService hisUserSupplierService; + private HisUserSupplierMapper hisUserSupplierMapper; + private BazVisitFlowService bazVisitFlowService; + private SysPostUserService sysPostUserService; + + /** + * 翻页查询,过滤当前用户负责数据 + * @param param + * @return + */ + @PostMapping("/getPageForVisit") + public R> getPageForVisit(@Valid @RequestBody BmsSupplierVisitSo param){ + String userId = AuthContextUtils.getSysUserId(); + HisUserSupplier userSupplier = new HisUserSupplier(); + //userSupplier.setUserId(userId); + userSupplier.setSupplierName(param.getSupplierName()); + userSupplier.setSupplierCode(param.getSupplierCode()); + userSupplier.setQueryAddress(param.getAddress()); + userSupplier.setQueryValue(param.getSearchValue()); + userSupplier.setLocalX(param.getLocalX()); + userSupplier.setLocalY(param.getLocalY()); + userSupplier.setStopFlag(param.getStopFlag()); + userSupplier.setCooperatePauseFlag(param.getCooperatePauseFlag()); + List userIds = sysPostUserService.listByChildIds(userId); + userIds.add(userId); + userSupplier.setSelectUserIds(userIds); + PageHelper.startPage(param.getPageNum(),param.getPageSize()); + + List list = hisUserSupplierMapper.selectHisUserSupplierAddressList(userSupplier); + List supplierIds = list.stream().map(HisUserSupplierAddressVo::getSupplierId).collect(Collectors.toList()); + if(CollectionUtil.isNotEmpty(supplierIds)){ + List supplierList = bmsSupplierService.listByIds(supplierIds); + for (HisUserSupplierAddressVo addressVo : list) { + for (BmsSupplier supplier : supplierList) { + if(addressVo.getSupplierId().equals(supplier.getId())){ + addressVo.setSupplierCode(supplier.getCode()); + addressVo.setSupplierName(supplier.getName()); + if(addressVo.getAddressId()!=null){ + BmsSupplierVisitAddress visitAddress = bmsSupplierVisitAddressService.getById(addressVo.getAddressId()); + //BmsSupplierVisit visitInfo = bmsSupplierVisitService.getOne(new LambdaQueryWrapper().eq(BmsSupplierVisit::getSupplierId,supplier.getId()),false); + addressVo.setAddressInfo(visitAddress); + } + LambdaQueryWrapper visitInfoLqw = new LambdaQueryWrapper<>(); + visitInfoLqw.eq(BazVisitInfo::getTargetType, BazTargetTypeConsts.CUSTOMER); + visitInfoLqw.eq(BazVisitInfo::getTargetId,supplier.getId()); + visitInfoLqw.eq(BazVisitInfo::getUserId,userId); + BazVisitInfo visitInfo = bazVisitInfoService.getOne(visitInfoLqw,false); + addressVo.setVisitInfo(visitInfo); + break; + } + } + } + } + return R.byPageHelperList(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('bms:supplierVisitAddress:query')") + public R> getPage(BmsSupplierVisitAddress param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + lqw.orderByDesc(BmsSupplierVisitAddress::getCreateTime); + List list = bmsSupplierVisitAddressService.list(lqw); + for (BmsSupplierVisitAddress visitAddress : list) { + BmsSupplier supplier = bmsSupplierService.getById(visitAddress.getSupplierId()); + if(supplier!=null){ + visitAddress.setSupplierName(supplier.getName()); + visitAddress.setSupplierCode(supplier.getCode()); + } + } + return R.byPageHelperList(list); + } + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(BmsSupplierVisitAddress param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = bmsSupplierVisitAddressService.list(lqw); + for (BmsSupplierVisitAddress visitAddress : list) { + BmsSupplier supplier = bmsSupplierService.getById(visitAddress.getSupplierId()); + visitAddress.setSupplierName(supplier.getName()); + visitAddress.setSupplierCode(supplier.getCode()); + } + return R.ok(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "供应商拜访地址", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + BmsSupplierVisitAddress bmsSupplierVisitAddress = bmsSupplierVisitAddressService.getById(id); + BmsSupplier supplier = bmsSupplierService.getById(bmsSupplierVisitAddress.getSupplierId()); + bmsSupplierVisitAddress.setSupplierName(supplier.getName()); + bmsSupplierVisitAddress.setSupplierCode(supplier.getCode()); + return R.ok(bmsSupplierVisitAddress); + } + + /** + * 获取默认地址 + * @param supplierId + * @return + */ + @GetMapping("/getByDefaultAddress/{supplierId}") + @SysLog(module = SystemModule.BASE, title = "供应商拜访地址", biz = BizType.QUERY) + public R getByDefaultAddress(@PathVariable("supplierId") String supplierId){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplierVisitAddress::getSupplierId,supplierId); + lqw.eq(BmsSupplierVisitAddress::getDefaultFlag,1); + return R.ok(bmsSupplierVisitAddressService.list(lqw)); + } + + /** + * 设置默认 + * @param defaultAddressBo + * @return + */ + @PostMapping("/setDefault") + public R setDefault(@RequestBody BmsSupplierVisitDefaultAddressBo defaultAddressBo){ + BmsSupplierVisitAddress bmsSupplierVisitAddress = bmsSupplierVisitAddressService.getById(defaultAddressBo.getAddressId()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplierVisitAddress::getAddressType,bmsSupplierVisitAddress.getAddressType()); + lqw.eq(BmsSupplierVisitAddress::getSupplierId,bmsSupplierVisitAddress.getSupplierId()); + BmsSupplierVisitAddress address = new BmsSupplierVisitAddress(); + address.setDefaultFlag(0); + bmsSupplierVisitAddressService.update(address,lqw); + bmsSupplierVisitAddress.setDefaultFlag(1); + bmsSupplierVisitAddressService.updateById(bmsSupplierVisitAddress); + return R.ok(); + } + + /** + * 取消默认 + * @param defaultAddressBo + * @return + */ + @PostMapping("/cancelDefault") + public R cancelDefault(@RequestBody BmsSupplierVisitDefaultAddressBo defaultAddressBo){ + BmsSupplierVisitAddress bmsSupplierVisitAddress = new BmsSupplierVisitAddress(); + bmsSupplierVisitAddress.setId(defaultAddressBo.getAddressId()); + bmsSupplierVisitAddress.setDefaultFlag(1); + bmsSupplierVisitAddressService.updateById(bmsSupplierVisitAddress); + return R.ok(); + } + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "供应商拜访地址", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:supplierVisitAddress:update')") + public R updateById(@RequestBody @Valid BmsSupplierVisitAddress param){ + BmsSupplierVisitAddress dbData = bmsSupplierVisitAddressService.getById(param.getId()); + if(!dbData.getAddressType().equals(param.getAddressType())){ + param.setDefaultFlag(0); + } + boolean result = bmsSupplierVisitAddressService.updateById(param); + businessLogService.buildLog4Change(BusinessLogType.SupplierAddress,dbData.getSupplierId().toString(), + dbData.getSupplierCode(),dbData.getSupplierName(),dbData.getId(),dbData,param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "供应商拜访地址", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:supplierVisitAddress:insert')") + public R save(@RequestBody @Valid BmsSupplierVisitAddress param){ + businessLogService.buildLog4Save(BusinessLogType.SupplierAddress,param.getSupplierId().toString(), + param.getSupplierCode(),param.getSupplierName(),param.getId(),param); + bmsSupplierVisitAddressService.save(param); + return R.ok(param); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BASE, title = "供应商拜访地址", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:supplierVisitAddress:delete')") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdString(ids); +// LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); +// lqw.in(BazVisitFlow::getFormId,idsLong); +// long count = bazVisitFlowService.count(lqw); +// if(count>0){ +// return R.error("含有使用表单的业务,无法删除"); +// } + List visitAddressList = bmsSupplierVisitAddressService.listByIds(idsLong); + for (BmsSupplierVisitAddress visitAddress : visitAddressList) { + businessLogService.buildLog4Delete(BusinessLogType.SupplierAddress,visitAddress.getSupplierId().toString(), + visitAddress.getSupplierCode(),visitAddress.getSupplierName(),visitAddress.getId()); + } + boolean result = bmsSupplierVisitAddressService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierVisitFormController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierVisitFormController.java new file mode 100644 index 0000000..e55ab5f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierVisitFormController.java @@ -0,0 +1,128 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.baz.entity.BazVisitFlow; +import com.qs.serve.modules.baz.service.BazVisitFlowService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.BmsSupplierVisitForm; +import com.qs.serve.modules.bms.service.BmsSupplierVisitFormService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 基础档案 拜访类型表单 + * @author YenHex + * @since 2023-03-28 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/supplierVisitForm") +public class BmsSupplierVisitFormController { + + private BmsSupplierVisitFormService bmsSupplierVisitFormService; + private BazVisitFlowService bazVisitFlowService; + + /** + * 列表 + * @param param + * @return + */ + //@GetMapping("/list") + @PreAuthorize("hasRole('bms:supplierVisitForm:query')") + public R> getList(BmsSupplierVisitForm param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = bmsSupplierVisitFormService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('bms:supplierVisitForm:query')") + public R> getPage(BmsSupplierVisitForm param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + lqw.orderByDesc(BmsSupplierVisitForm::getCreateTime); + List list = bmsSupplierVisitFormService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "科目表单", biz = BizType.QUERY) + @PreAuthorize("hasRole('bms:supplierVisitForm:query')") + public R getById(@PathVariable("id") String id){ + BmsSupplierVisitForm bmsSupplierVisitForm = bmsSupplierVisitFormService.getById(id); + return R.ok(bmsSupplierVisitForm); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "科目表单", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:supplierVisitForm:update')") + public R updateById(@RequestBody @Valid BmsSupplierVisitForm param){ + boolean result = bmsSupplierVisitFormService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "科目表单", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:supplierVisitForm:insert')") + public R save(@RequestBody @Valid BmsSupplierVisitForm param){ + boolean result = bmsSupplierVisitFormService.save(param); + return R.ok(param); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BASE, title = "科目表单", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:supplierVisitForm:delete')") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + LambdaQueryWrapper visitLqw = new LambdaQueryWrapper<>(); + visitLqw.in(BazVisitFlow::getFormId,idsLong); + if( 0< bazVisitFlowService.count(visitLqw)){ + return R.error("拜访模块使用了表单,删除失败"); + } + boolean result = bmsSupplierVisitFormService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierVisitTypeController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierVisitTypeController.java new file mode 100644 index 0000000..3a5ced5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/BmsSupplierVisitTypeController.java @@ -0,0 +1,127 @@ +package com.qs.serve.modules.bms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.entity.BmsSupplierVisitForm; +import com.qs.serve.modules.bms.service.BmsSupplierVisitFormService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.bms.entity.BmsSupplierVisitType; +import com.qs.serve.modules.bms.service.BmsSupplierVisitTypeService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 基础档案 拜访类型 + * @author YenHex + * @since 2023-03-28 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("bms/supplierVisitType") +public class BmsSupplierVisitTypeController { + + private BmsSupplierVisitTypeService bmsSupplierVisitTypeService; + private BmsSupplierVisitFormService bmsSupplierVisitFormService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + @PreAuthorize("hasRole('bms:supplierVisitType:query')") + public R> getList(BmsSupplierVisitType param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = bmsSupplierVisitTypeService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('bms:supplierVisitType:query')") + public R> getPage(BmsSupplierVisitType param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + lqw.orderByDesc(BmsSupplierVisitType::getCreateTime); + List list = bmsSupplierVisitTypeService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "拜访类型", biz = BizType.QUERY) + @PreAuthorize("hasRole('bms:supplierVisitType:query')") + public R getById(@PathVariable("id") String id){ + BmsSupplierVisitType bmsSupplierVisitType = bmsSupplierVisitTypeService.getById(id); + if(bmsSupplierVisitType.getTypeFormId()!=null){ + Object info = bmsSupplierVisitFormService.getById(bmsSupplierVisitType.getTypeFormId()); + bmsSupplierVisitType.setFormInfo(info); + } + return R.ok(bmsSupplierVisitType); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.BASE, title = "拜访类型", biz = BizType.UPDATE) + @PreAuthorize("hasRole('bms:supplierVisitType:update')") + public R updateById(@RequestBody @Valid BmsSupplierVisitType param){ + boolean result = bmsSupplierVisitTypeService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.BASE, title = "拜访类型", biz = BizType.INSERT) + @PreAuthorize("hasRole('bms:supplierVisitType:insert')") + public R save(@RequestBody @Valid BmsSupplierVisitType param){ + boolean result = bmsSupplierVisitTypeService.save(param); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.BASE, title = "拜访类型", biz = BizType.DELETE) + @PreAuthorize("hasRole('bms:supplierVisitType:delete')") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = bmsSupplierVisitTypeService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/api/BmsRegionApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/api/BmsRegionApi.java new file mode 100644 index 0000000..c836ec9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/api/BmsRegionApi.java @@ -0,0 +1,47 @@ +package com.qs.serve.modules.bms.controller.api; + +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.vo.BmsRegionTreeVo; +import com.qs.serve.modules.bms.service.BmsRegionService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * API基础档案 区域档案 + * @author YenHex + * @since 2022-10-10 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/api/region") +public class BmsRegionApi { + + private BmsRegionService bmsRegionService; + + /** + * 树查询 + * @return + */ + @GetMapping("/tree") + public R> getTree(){ + return R.ok(bmsRegionService.getTree(false,0)); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + BmsRegion bmsRegion = bmsRegionService.getById(id); + return R.ok(bmsRegion); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/api/BmsSupplierAddressApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/api/BmsSupplierAddressApi.java new file mode 100644 index 0000000..df20d7d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/api/BmsSupplierAddressApi.java @@ -0,0 +1,169 @@ +package com.qs.serve.modules.bms.controller.api; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * API基础档案 客户收货地址 + * @author YenHex + * @since 2022-10-12 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("api/supplierAddress") +public class BmsSupplierAddressApi { + + private BmsSupplierAddressService bmsSupplierAddressService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BmsSupplierAddress param){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + param.setSupplierId(Long.parseLong(supplier.getId())); + PageUtil.startPage(); + LambdaQueryWrapper supplierAddressWrapper = new LambdaQueryWrapper<>(param); + List list = bmsSupplierAddressService.list(supplierAddressWrapper); + return R.byPageHelperList(list); + } + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(BmsSupplierAddress param){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + param.setSupplierId(Long.parseLong(supplier.getId())); + LambdaQueryWrapper supplierAddressWrapper = new LambdaQueryWrapper<>(param); + List list = bmsSupplierAddressService.list(supplierAddressWrapper); + return R.ok(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + BmsSupplierAddress bmsSupplierAddress = bmsSupplierAddressService.getById(id); + return R.ok(bmsSupplierAddress); + } + + /** + * 获取默认地址 + * @return + */ + @GetMapping("/getDefaultOne") + public R getDefaultOne(){ + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getDefault(AuthContextUtils.getSupplierId()); + return R.ok(supplierAddress); + } + + /** + * 根据ID更新 + * @param param + * @return + */ + @PostMapping("/updateById") + public R updateById(@RequestBody @Valid BmsSupplierAddress param){ + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(param.getId()); + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + if(supplierAddress.getSupplierId().toString().equals(supplier.getId())){ + param.setDefaultFlag(null); + boolean result = bmsSupplierAddressService.updateById(param); + return R.isTrue(result); + } + return R.error("错误id"); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + public R save(@RequestBody @Valid BmsSupplierAddress param){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + param.setSupplierId(param.getSupplierId()); + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getDefault(Long.parseLong(supplier.getId())); + if(param.getDefaultFlag().equals(1)){ + if(supplierAddress!=null){ + supplierAddress.setDefaultFlag(0); + bmsSupplierAddressService.updateById(supplierAddress); + } + }else { + if(supplierAddress==null){ + param.setDefaultFlag(1); + }else { + param.setDefaultFlag(0); + } + } + boolean result = bmsSupplierAddressService.save(param); + return R.isTrue(result); + } + + /** + * 设置默认的地址 + * @param id 地址ID + * @return + */ + @GetMapping("/setDefault") + @Transactional(rollbackFor = Exception.class) + public R setDefault(Long id){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(id); + if(!supplierAddress.getSupplierId().toString().equals(supplier.getId())){ + return R.error("错误id"); + } + List list = bmsSupplierAddressService.listBySupplierId(supplierAddress.getSupplierId()); + //设置其它 + for (BmsSupplierAddress address : list) { + if(!address.getId().equals(id)){ + address.setDefaultFlag(0); + bmsSupplierAddressService.updateById(address); + } + } + //设置默认 + supplierAddress.setDefaultFlag(1); + bmsSupplierAddressService.updateById(supplierAddress); + return R.ok(); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + public R deleteById(@PathVariable("id") Long id){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(id); + if(!supplierAddress.getSupplierId().toString().equals(supplier.getId())){ + return R.error("错误id"); + } + boolean result = bmsSupplierAddressService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/api/BmsSupplierApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/api/BmsSupplierApi.java new file mode 100644 index 0000000..c4c97cd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/api/BmsSupplierApi.java @@ -0,0 +1,93 @@ +package com.qs.serve.modules.bms.controller.api; + +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.CopierUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.TreeUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.vo.BmsSupplierTreeVo; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.wx.entity.WxUser; +import com.qs.serve.modules.wx.service.WxUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * API基础档案 客户 + * @author YenHex + * @since 2022-10-10 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/api/supplier") +public class BmsSupplierApi { + + private final BmsSupplierService bmsSupplierService; + private final WxUserService wxUserService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BmsSupplier param){ + WxUser wxUser = wxUserService.getCurrentWxUser(); + if(wxUser.getSysUserId()==null||wxUser.getSysUserId().equals("0")){ + return R.byEmptyList(); + } + param.setCurrUserId(wxUser.getSysUserId()); + param.setStopFlag(0); + PageUtil.startPage(); + List list = bmsSupplierService.selectSupplierList(param); + return R.byPageHelperList(list); + } + + /** + * 树查询 + * @param param + * @return + */ + //@GetMapping("/tree") + public R> getTree(BmsSupplier param){ + WxUser wxUser = wxUserService.getCurrentWxUser(); + if(wxUser.getSysUserId()==null||wxUser.getSysUserId().equals("0")){ + return R.ok(new ArrayList<>()); + } + param.setCurrUserId(wxUser.getSysUserId()); + List list = bmsSupplierService.selectSupplierList(param); + List list2 = list.stream().map(supplier->{ + BmsSupplierTreeVo treeNode = CopierUtil.copy(supplier,new BmsSupplierTreeVo()); + treeNode.setId(supplier.getId()); + treeNode.setParentId(supplier.getPid()); + treeNode.setSort(0); + return treeNode; + }).collect(Collectors.toList()); + list2 = TreeUtil.buildByRecursive(list2,TreeUtil.DEFAULT_PID_STRING); + return R.ok(list2); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + BmsSupplier bmsSupplier = bmsSupplierService.getById(id); + return R.ok(bmsSupplier); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/api/BmsSupplierBandApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/api/BmsSupplierBandApi.java new file mode 100644 index 0000000..0220194 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/api/BmsSupplierBandApi.java @@ -0,0 +1,115 @@ +package com.qs.serve.modules.bms.controller.api; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierBand; +import com.qs.serve.modules.bms.service.BmsSupplierBandService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * API基础档案 客户银行信息 + * @author YenHex + * @since 2022-10-12 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/api/supplierBand") +public class BmsSupplierBandApi { + + private BmsSupplierBandService bmsSupplierBandService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BmsSupplierBand param){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + param.setSupplierId(Long.parseLong(supplier.getId())); + PageUtil.startPage(); + LambdaQueryWrapper supplierBandWrapper = new LambdaQueryWrapper<>(param); + List list = bmsSupplierBandService.list(supplierBandWrapper); + return R.byPageHelperList(list); + } + + /** + * 列表查询 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(BmsSupplierBand param){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + param.setSupplierId(Long.parseLong(supplier.getId())); + LambdaQueryWrapper supplierBandWrapper = new LambdaQueryWrapper<>(param); + List list = bmsSupplierBandService.list(supplierBandWrapper); + return R.ok(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + BmsSupplierBand bmsSupplierBand = bmsSupplierBandService.getById(id); + return R.ok(bmsSupplierBand); + } + + + + /** + * 根据ID更新 + * @param param + * @return + */ + @PostMapping("/updateById") + public R updateById(@RequestBody @Valid BmsSupplierBand param){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + param.setSupplierId(Long.parseLong(supplier.getId())); + BmsSupplierBand bmsSupplierBand = bmsSupplierBandService.getById(param.getId()); + if(!bmsSupplierBand.getSupplierId().toString().equals(supplier.getId())){ + return R.error("未授权"); + } + boolean result = bmsSupplierBandService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + public R save(@RequestBody @Valid BmsSupplierBand param){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + param.setSupplierId(Long.parseLong(supplier.getId())); + boolean result = bmsSupplierBandService.save(param); + return R.isTrue(result); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + public R deleteById(@PathVariable("id") Long id){ + boolean result = bmsSupplierBandService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/my/BmsChannelMyController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/my/BmsChannelMyController.java new file mode 100644 index 0000000..f4a949a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/my/BmsChannelMyController.java @@ -0,0 +1,169 @@ +package com.qs.serve.modules.bms.controller.my; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.bms.common.MasterUserType; +import com.qs.serve.modules.bms.entity.*; +import com.qs.serve.modules.bms.service.*; +import com.qs.serve.modules.sys.service.SysPostUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 基础档案 渠道(我的) + * @author YenHex + * @since 2022-11-03 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("my/channel") +public class BmsChannelMyController { + + private BmsChannelService bmsChannelService; + private BmsMasterUserService bmsMasterUserService; + private SysPostUserService postUserService; + private BmsSupplierService bmsSupplierService; + private BmsSupplierChannelService bmsSupplierChannelService; + + /** + * 翻页(我负责的) + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BmsChannel param){ + PageUtil.startPage(); + List list = bmsChannelService.selectChannelList(param, Arrays.asList(AuthContextUtils.getSysUserId()),null); + list.forEach(a->{ + BmsSupplierChannel searchSupplierChannel = new BmsSupplierChannel(); + searchSupplierChannel.setChannelId(a.getId()); + List bmsSupplierChannelList = bmsSupplierChannelService.selectSupplierChannelList(searchSupplierChannel); + a.setSupplierNames(bmsSupplierChannelList.stream().map(b->b.getSupplierName()).collect(Collectors.toList())); + }); + return R.byPageHelperList(list); + } + + /** + * 导出列表 + * @param param + * @return + */ + @GetMapping("/export") + public R> export(BmsChannel param){ + + LambdaQueryWrapper channelWrapper = new LambdaQueryWrapper<>(param); + channelWrapper.orderByDesc(BmsChannel::getCreateTime); + if(param.getSelectStartTime()!=null) { + channelWrapper.ge(BmsChannel::getCreateTime, param.getSelectStartTime()); + channelWrapper.isNotNull(BmsChannel::getCreateBy); + } + if(param.getSelectEndTime()!=null) { + channelWrapper.le(BmsChannel::getCreateTime, param.getSelectEndTime()); + channelWrapper.isNotNull(BmsChannel::getCreateBy); + } + if(CollectionUtil.isNotEmpty(param.getSelectIds())){ + channelWrapper.in(BmsChannel::getId, param.getSelectIds()); + } + + //过滤为当前负责人 + LambdaQueryWrapper masterLqw = new LambdaQueryWrapper<>(); + masterLqw.eq(BmsMasterUser::getType,MasterUserType.Channel); + masterLqw.eq(BmsMasterUser::getUserId,AuthContextUtils.getSysUserId()); + List masterUsers = bmsMasterUserService.list(masterLqw); + List ids = masterUsers.stream().map(BmsMasterUser::getTargetId).collect(Collectors.toList()); + ids.add("#"); + channelWrapper.in(BmsChannel::getId,ids); + + if(param.getExportNum() != null && param.getExportNum()!= 0){ + channelWrapper.last(" limit "+param.getExportNum()); + } + + List list = bmsChannelService.list(channelWrapper); + + List channelIds = list.stream().map(a->a.getId()).collect(Collectors.toList()); + if(channelIds.size()>0) { + LambdaQueryWrapper supplierChannelLambdaQueryWrapper = new LambdaQueryWrapper<>(); + supplierChannelLambdaQueryWrapper.in(BmsSupplierChannel::getChannelId, channelIds); + List supplierChannelList = bmsSupplierChannelService.list(supplierChannelLambdaQueryWrapper); + List supplierIds = supplierChannelList.stream().map(a->a.getSupplierId().toString()).distinct().collect(Collectors.toList()); + if(supplierIds.size()>0){ + LambdaQueryWrapper supplierLqw = new LambdaQueryWrapper(); + supplierLqw.in(BmsSupplier::getId,supplierIds); + List supplierList = bmsSupplierService.list(supplierLqw); + list.forEach(a->{ + List supplierIdList = supplierChannelList.stream().filter(b->b.getChannelId().equals(a.getId())).map(b->b.getSupplierId()+"").collect(Collectors.toList()); + List supplierNames = supplierList.stream().filter(b->supplierIdList.contains(b.getId())).map(b->b.getName()).collect(Collectors.toList()); + a.setSupplierNames(supplierNames); + }); + } + } + return R.ok(list); + } + + + /** + * 翻页(下属负责的渠道) + * @param param + * @return + */ + @GetMapping("/page4Under") + public R> getPage4Under(BmsChannel param){ + String loginUserId = AuthContextUtils.getSysUserId(); + List userIds = postUserService.listByChildIds(loginUserId); + if(CollectionUtil.isEmpty(userIds)){ + return R.byEmptyList(); + } + PageUtil.startPage(); + List list = bmsChannelService.selectChannelList(param, userIds,null); + list.forEach(a->{ + BmsSupplierChannel searchSupplierChannel = new BmsSupplierChannel(); + searchSupplierChannel.setChannelId(a.getId()); + List bmsSupplierChannelList = bmsSupplierChannelService.selectSupplierChannelList(searchSupplierChannel); + a.setSupplierNames(bmsSupplierChannelList.stream().map(b->b.getSupplierName()).collect(Collectors.toList())); + }); + return R.byPageHelperList(list); + } + + /** + * 翻页(下属负责的渠道) + * @param param + * @return + */ + @GetMapping("/page4UnderAndMine") + public R> getPage4UnderAndMine(BmsChannel param){ + String loginUserId = AuthContextUtils.getSysUserId(); + List userIds = postUserService.listByChildIds(loginUserId); + userIds.add(loginUserId); + +// if(StringUtils.hasText(param.getSeachSupplierName())){ +// BmsSupplierChannel searchSupplierChannel = new BmsSupplierChannel(); +// searchSupplierChannel.setSupplierName(param.getSeachSupplierName()); +// List bmsSupplierChannelList = bmsSupplierChannelService.selectSupplierChannelList(searchSupplierChannel); +// List supplierIds = bmsSupplierChannelList.stream().map(a->a.getSupplierId()).collect(Collectors.toList()); +// param.setSupplierIds(supplierIds); +// } + + PageUtil.startPage(); + List list = bmsChannelService.selectChannelList(param, userIds,param.getSupplierIdForFindChild()); + + list.forEach(a->{ + BmsSupplierChannel searchSupplierChannel = new BmsSupplierChannel(); + searchSupplierChannel.setChannelId(a.getId()); + List bmsSupplierChannelList = bmsSupplierChannelService.selectSupplierChannelList(searchSupplierChannel); + a.setSupplierNames(bmsSupplierChannelList.stream().map(b->b.getSupplierName()).collect(Collectors.toList())); + }); + return R.byPageHelperList(list); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/my/BmsChannelPointMyController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/my/BmsChannelPointMyController.java new file mode 100644 index 0000000..479d3db --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/my/BmsChannelPointMyController.java @@ -0,0 +1,313 @@ +package com.qs.serve.modules.bms.controller.my; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.annotation.LimitSubmit; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.dto.RowParam; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.baz.service.BazVisitInfoService; +import com.qs.serve.modules.bms.entity.*; +import com.qs.serve.modules.bms.mapper.BmsChannelPointMapper; +import com.qs.serve.modules.bms.service.*; +import com.qs.serve.modules.his.service.HisUserChannelPointService; +import com.qs.serve.modules.his.service.HisUserSupplierService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.service.TbsActivityChannelPointService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 基础档案 渠道站点(我的) + * @author YenHex + * @since 2022-11-03 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("my/channelPoint") +public class BmsChannelPointMyController { + + private BazVisitInfoService bazVisitInfoService; + private BmsChannelPointService bmsChannelPointService; + private BmsRegionService bmsRegionService; + private BmsRegion2Service bmsRegion2Service; + private TbsActivityChannelPointService activityChannelPointService; + private BmsChannelPointMapper channelPointMapper; + private HisUserChannelPointService hisUserChannelPointService; + private HisUserSupplierService hisUserSupplierService; + private SysUserService sysUserService; + private BmsRegionUserService bmsRegionUserService; + private SysPostUserService postUserService; + private BmsChannelService bmsChannelService; + private BmsMasterUserService bmsMasterUserService; + private BmsSupplierChannelService bmsSupplierChannelService; + + /** + * 导出 + * @param param + * @return + */ + @GetMapping("/export") + @PreAuthorize("hasRole('bms:channelPoint:query')") + public R> export(BmsChannelPoint param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + lqw.orderByDesc(BmsChannelPoint::getCreateTime); + if(param.getSelectStartTime()!=null) { + lqw.ge(BmsChannelPoint::getCreateTime, param.getSelectStartTime()); + lqw.isNotNull(BmsChannelPoint::getCreateBy); + } + if(param.getSelectEndTime()!=null) { + lqw.le(BmsChannelPoint::getCreateTime, param.getSelectEndTime()); + lqw.isNotNull(BmsChannelPoint::getCreateBy); + } + if(CollectionUtil.isNotEmpty(param.getSelectIds())){ + lqw.in(BmsChannelPoint::getId, param.getSelectIds()); + } + RowParam rowParam = new RowParam(param.getStartNum(),param.getExportNum()); + List list = bmsChannelPointService.selectChannelPointMyList(param, Arrays.asList(AuthContextUtils.getSysUserId()),rowParam); + + + //取消,当下逻辑只加载直属负责人的数据 + //过滤为当前负责人 +// LambdaQueryWrapper masterLqw = new LambdaQueryWrapper<>(); +// masterLqw.in(BmsMasterUser::getType,MasterUserType.Channel,MasterUserType.Point); +// masterLqw.eq(BmsMasterUser::getUserId,AuthContextUtils.getSysUserId()); +// List masterUsers = bmsMasterUserService.list(masterLqw); +// Map> masterUsersMap = masterUsers.stream().collect(Collectors.groupingBy(BmsMasterUser::getType)); +// List channelMasterList = masterUsersMap.get(MasterUserType.Channel); +// List pointMasterList = masterUsersMap.get(MasterUserType.Point); +// List channelIds = new ArrayList<>(); +// List pointIds = new ArrayList<>(); +// channelIds.add("#"); +// pointIds.add("#"); +// if(CollectionUtil.isNotEmpty(channelMasterList)){ +// List channelMasterIdsTmp = channelMasterList.stream().map(BmsMasterUser::getTargetId).collect(Collectors.toList()); +// channelIds.addAll(channelMasterIdsTmp); +// } +// if(CollectionUtil.isNotEmpty(pointMasterList)){ +// List pointMasterIdsTmp = pointMasterList.stream().map(BmsMasterUser::getTargetId).collect(Collectors.toList()); +// pointIds.addAll(pointMasterIdsTmp); +// } +// lqw.and(qw->{ +// qw.in(BmsChannelPoint::getChannelId,channelIds).or().in(BmsChannelPoint::getId,pointIds); +// }); +// +// if(param.getExportNum() != null && param.getExportNum()!= 0 +// && param.getStartNum() != null && param.getStartNum()!= 0){ +// lqw.last(" limit "+param.getStartNum() + "," + param.getExportNum()); +// } +// +// List list = bmsChannelPointService.list(lqw); + List bizRegionIds = new ArrayList<>(); + bizRegionIds.addAll(list.stream().filter(a->a.getBizRegionId()!=null).map(a->a.getBizRegionId()).collect(Collectors.toList())); + bizRegionIds = bizRegionIds.stream().distinct().collect(Collectors.toList()); + List region2List = new ArrayList<>(); + if(bizRegionIds.size()>0){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.in(BmsRegion2::getId,bizRegionIds); + region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + } + Map idToBizRegion = region2List.stream().collect(Collectors.toMap(BmsRegion2::getId, a->a)); + + for (BmsChannelPoint channelPoint : list) { + Long channelId = channelPoint.getChannelId(); + BmsChannel channel = bmsChannelService.getById(channelId); + if(channel!=null){ + channelPoint.setChannelName(channel.getChannelName()); + channelPoint.setChannelCode(channel.getChannelCode()); + channelPoint.setChannelType(channel.getChannelType()); + } + if(StringUtils.hasText(channelPoint.getBizRegionPath())){ + String[] bizRegions = channelPoint.getBizRegionPath().split("_"); + if(bizRegions.length>0){ + channelPoint.setBizRegionName(bizRegions[bizRegions.length-1]); + } + BmsRegion2 region2 = idToBizRegion.get(channelPoint.getBizRegionId()); + if(region2!=null){ + channelPoint.setBizRegionCode(region2.getCode()); + } + } + if(StringUtils.hasText(channelPoint.getSaleRegionPath())){ + String[] regions = channelPoint.getSaleRegionPath().split("_"); + if(regions.length>0){ + channelPoint.setSaleRegionName(regions[regions.length-1]); + } + } + } + return R.ok(list); + } + + + /** + * 我负责的网店 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BmsChannelPoint param){ + Long count = bmsChannelPointService.selectCountChannelPointMyList(param, Arrays.asList(AuthContextUtils.getSysUserId())); + if(count<1L){ + return R.byEmptyList(); + } + List list = bmsChannelPointService.selectChannelPointMyList(param, Arrays.asList(AuthContextUtils.getSysUserId()),new RowParam(true)); + + List bizRegionIds = new ArrayList<>(); + bizRegionIds.addAll(list.stream().filter(a->a.getBizRegionId()!=null).map(a->a.getBizRegionId()).collect(Collectors.toList())); + bizRegionIds = bizRegionIds.stream().distinct().collect(Collectors.toList()); + List region2List = new ArrayList<>(); + if(bizRegionIds.size()>0){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.in(BmsRegion2::getId,bizRegionIds); + region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + } + Map idToBizRegion = region2List.stream().collect(Collectors.toMap(BmsRegion2::getId, a->a)); + + for (BmsChannelPoint channelPoint : list) { + if(StringUtils.hasText(channelPoint.getBizRegionPath())){ + String[] bizRegions = channelPoint.getBizRegionPath().split("_"); + if(bizRegions.length>0){ + channelPoint.setBizRegionName(bizRegions[bizRegions.length-1]); + } + + BmsRegion2 region2 = idToBizRegion.get(channelPoint.getBizRegionId()); + if(region2!=null){ + channelPoint.setBizRegionCode(region2.getCode()); + } + } + if(StringUtils.hasText(channelPoint.getSaleRegionPath())){ + String[] regions = channelPoint.getSaleRegionPath().split("_"); + if(regions.length>0){ + channelPoint.setSaleRegionName(regions[regions.length-1]); + } + } + + BmsSupplierChannel searchSupplierChannel = new BmsSupplierChannel(); + searchSupplierChannel.setChannelId(channelPoint.getChannelId()); + List bmsSupplierChannelList = bmsSupplierChannelService.selectSupplierChannelList(searchSupplierChannel); + channelPoint.setSupplierNames(bmsSupplierChannelList.stream().map(b->b.getSupplierName()).collect(Collectors.toList())); + + } + return R.byPageList(count,list); + } + + + + /** + * 下属负责的网店 + * @param param + * @return + */ + @LimitSubmit(interval = 60000) + @GetMapping("/page4Under") + public R> getPage4Under(BmsChannelPoint param){ + String loginUserId = AuthContextUtils.getSysUserId(); + List userIds = postUserService.listByChildIds(loginUserId); + if(userIds.size() == 0){return R.byEmptyList();} + Long count = bmsChannelPointService.selectCountChannelPointMyList(param, userIds); + if(count < 1L){ + return R.byEmptyList(); + } + List pageList = bmsChannelPointService.selectChannelPointMyList(param, userIds,new RowParam(true)); + List bizRegionIds = new ArrayList<>(); + bizRegionIds.addAll(pageList.stream().filter(a->a.getBizRegionId()!=null).map(a->a.getBizRegionId()).collect(Collectors.toList())); + bizRegionIds = bizRegionIds.stream().distinct().collect(Collectors.toList()); + List region2List = new ArrayList<>(); + if(bizRegionIds.size()>0){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.in(BmsRegion2::getId,bizRegionIds); + region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + } + Map idToBizRegion = region2List.stream().collect(Collectors.toMap(BmsRegion2::getId, a->a)); + for (BmsChannelPoint channelPoint : pageList) { + if(StringUtils.hasText(channelPoint.getBizRegionPath())){ + String[] bizRegions = channelPoint.getBizRegionPath().split("_"); + if(bizRegions.length>0){ + channelPoint.setBizRegionName(bizRegions[bizRegions.length-1]); + } + BmsRegion2 region2 = idToBizRegion.get(channelPoint.getBizRegionId()); + if(region2!=null){ + channelPoint.setBizRegionCode(region2.getCode()); + } + } + if(StringUtils.hasText(channelPoint.getSaleRegionPath())){ + String[] regions = channelPoint.getSaleRegionPath().split("_"); + if(regions.length>0){ + channelPoint.setSaleRegionName(regions[regions.length-1]); + } + } + + + BmsSupplierChannel searchSupplierChannel = new BmsSupplierChannel(); + searchSupplierChannel.setChannelId(channelPoint.getChannelId()); + List bmsSupplierChannelList = bmsSupplierChannelService.selectSupplierChannelList(searchSupplierChannel); + channelPoint.setSupplierNames(bmsSupplierChannelList.stream().map(b->b.getSupplierName()).collect(Collectors.toList())); + + } + return R.byPageList(count,pageList); + } + + /** + * 下属负责的网店 + * @param param + * @return + */ + @GetMapping("/page4UnderAndMine") + public R> page4UnderAndMine(BmsChannelPoint param){ + String loginUserId = AuthContextUtils.getSysUserId(); + List userIds = postUserService.listByChildIds(loginUserId); + userIds.add(loginUserId); + Long count = bmsChannelPointService.selectCountChannelPointMyList(param, userIds); + if(count < 1L){ + return R.byEmptyList(); + } + List pageList = bmsChannelPointService.selectChannelPointMyList(param, userIds,new RowParam(true)); + List bizRegionIds = new ArrayList<>(); + bizRegionIds.addAll(pageList.stream().filter(a->a.getBizRegionId()!=null).map(a->a.getBizRegionId()).collect(Collectors.toList())); + bizRegionIds = bizRegionIds.stream().distinct().collect(Collectors.toList()); + List region2List = new ArrayList<>(); + if(bizRegionIds.size()>0){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.in(BmsRegion2::getId,bizRegionIds); + region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + } + Map idToBizRegion = region2List.stream().collect(Collectors.toMap(BmsRegion2::getId, a->a)); + for (BmsChannelPoint channelPoint : pageList) { + if(StringUtils.hasText(channelPoint.getBizRegionPath())){ + String[] bizRegions = channelPoint.getBizRegionPath().split("_"); + if(bizRegions.length>0){ + channelPoint.setBizRegionName(bizRegions[bizRegions.length-1]); + } + BmsRegion2 region2 = idToBizRegion.get(channelPoint.getBizRegionId()); + if(region2!=null){ + channelPoint.setBizRegionCode(region2.getCode()); + } + } + if(StringUtils.hasText(channelPoint.getSaleRegionPath())){ + String[] regions = channelPoint.getSaleRegionPath().split("_"); + if(regions.length>0){ + channelPoint.setSaleRegionName(regions[regions.length-1]); + } + } + BmsSupplierChannel searchSupplierChannel = new BmsSupplierChannel(); + searchSupplierChannel.setChannelId(channelPoint.getChannelId()); + List bmsSupplierChannelList = bmsSupplierChannelService.selectSupplierChannelList(searchSupplierChannel); + channelPoint.setSupplierNames(bmsSupplierChannelList.stream().map(b->b.getSupplierName()).collect(Collectors.toList())); + + } + return R.byPageList(count,pageList); + } + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/my/BmsSupplierContactsMyController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/my/BmsSupplierContactsMyController.java new file mode 100644 index 0000000..1cbc059 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/my/BmsSupplierContactsMyController.java @@ -0,0 +1,68 @@ +package com.qs.serve.modules.bms.controller.my; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.github.pagehelper.PageHelper; +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.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierContacts; +import com.qs.serve.modules.bms.entity.bo.BmsSupplierContactsBo; +import com.qs.serve.modules.bms.entity.so.BmsSupplierContactsSo; +import com.qs.serve.modules.bms.service.BmsSupplierContactsService; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.his.entity.HisUserSupplier; +import com.qs.serve.modules.his.service.HisUserSupplierService; +import com.qs.serve.modules.sys.common.enums.BusinessLogType; +import com.qs.serve.modules.sys.service.SysBusinessLogService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 基础档案 供应商联系人 + * @author YenHex + * @since 2023-04-19 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("my/supplierMyContacts") +public class BmsSupplierContactsMyController { + + private final HisUserSupplierService hisUserSupplierService; + private BmsSupplierContactsService bmsSupplierContactsService; + private BmsSupplierService bmsSupplierService; + + + /** + * 翻页(我负责的) + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BmsSupplierContactsSo param){ + //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); + contactsLambdaQueryWrapper.eq(BmsSupplierContacts::getSupplierId,supplierIds); + List supplierContactsList = bmsSupplierContactsService.list(contactsLambdaQueryWrapper); + return R.byPageHelperList(supplierContactsList); + } + + + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/my/BmsSupplierMyController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/my/BmsSupplierMyController.java new file mode 100644 index 0000000..76f7b53 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/controller/my/BmsSupplierMyController.java @@ -0,0 +1,476 @@ +package com.qs.serve.modules.bms.controller.my; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.bo.BmsSupplierExcelBo; +import com.qs.serve.modules.bms.service.BmsRegion2Service; +import com.qs.serve.modules.bms.service.BmsRegionService; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.his.service.HisUserSupplierService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.service.SysUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 基础档案 客户(我的) + * @author YenHex + * @since 2022-10-10 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/my/supplier") +public class BmsSupplierMyController { + + private BmsRegionService bmsRegionService; + private BmsRegion2Service bmsRegion2Service; + private BmsSupplierService bmsSupplierService; + private HisUserSupplierService hisUserSupplierService; + private SysPostUserService postUserService; + private SysUserService sysUserService; + + @PostMapping("/page") + public R> getPage4Post(@RequestBody BmsSupplier param){ + PageUtil.setPageSize(param.getPageSize()+""); + PageUtil.setPageNum(param.getPageNum()+""); + return this.getPage(param); + } + + /** + * 翻页查询(我负责的) + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(BmsSupplier param){ + if(StringUtils.hasText(param.getRegion2Label())){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.like(BmsRegion2::getPathNames,param.getRegion2Label()); + List region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + if(region2List.size()>0) { + param.setRegion2Ids(region2List.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setRegion2Ids(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegion2FirstName())){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.like(BmsRegion2::getName,param.getSearchRegion2FirstName()); + List region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + if(region2List.size()>0) { + param.setSearchRegion2First(region2List.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegion2First(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegion2SecondName())){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.like(BmsRegion2::getName,param.getSearchRegion2SecondName()); + List region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + if(region2List.size()>0) { + param.setSearchRegion2Second(region2List.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegion2Second(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegion2ThirdName())){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.like(BmsRegion2::getName,param.getSearchRegion2ThirdName()); + List region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + if(region2List.size()>0) { + param.setSearchRegion2Third(region2List.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegion2Third(Arrays.asList("#")); + } + } + + if(StringUtils.hasText(param.getRegionLabel())){ + LambdaQueryWrapper regionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + regionLambdaQueryWrapper.like(BmsRegion::getPathNames,param.getRegionLabel()); + List regionList = bmsRegionService.list(regionLambdaQueryWrapper); + if(regionList.size()>0) { + param.setRegionIds(regionList.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setRegion2Ids(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegionFirstName())){ + LambdaQueryWrapper regionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + regionLambdaQueryWrapper.like(BmsRegion::getName,param.getSearchRegionFirstName()); + List regionList = bmsRegionService.list(regionLambdaQueryWrapper); + if(regionList.size()>0) { + param.setSearchRegionFirst(regionList.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegionFirst(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegionSecondName())){ + LambdaQueryWrapper regionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + regionLambdaQueryWrapper.like(BmsRegion::getName,param.getSearchRegionSecondName()); + List regionList = bmsRegionService.list(regionLambdaQueryWrapper); + if(regionList.size()>0) { + param.setSearchRegionSecond(regionList.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegionSecond(Arrays.asList("#")); + } + } + PageVo pageVo = hisUserSupplierService.selectPageSupplier(param); + initSupplierList(pageVo.getList()); + return R.ok(pageVo); + } + + /** + * 下属翻页查询 + * @param param + * @return + */ + @PostMapping("/underlingPage") + public R> getUnderlingPage4Post(@RequestBody BmsSupplier param){ + PageUtil.setPageSize(param.getPageSize()+""); + PageUtil.setPageNum(param.getPageNum()+""); + return this.getUnderlingPage(param); + } + + /** + * 下属翻页查询 + * @param param + * @return + */ + @GetMapping("/underlingPage") + public R> getUnderlingPage(BmsSupplier param){ + if(StringUtils.hasText(param.getRegion2Label())){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.like(BmsRegion2::getPathNames,param.getRegion2Label()); + List region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + if(region2List.size()>0) { + param.setRegion2Ids(region2List.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setRegion2Ids(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegion2FirstName())){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.like(BmsRegion2::getName,param.getSearchRegion2FirstName()); + List region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + if(region2List.size()>0) { + param.setSearchRegion2First(region2List.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegion2First(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegion2SecondName())){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.like(BmsRegion2::getName,param.getSearchRegion2SecondName()); + List region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + if(region2List.size()>0) { + param.setSearchRegion2Second(region2List.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegion2Second(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegion2ThirdName())){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.like(BmsRegion2::getName,param.getSearchRegion2ThirdName()); + List region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + if(region2List.size()>0) { + param.setSearchRegion2Third(region2List.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegion2Third(Arrays.asList("#")); + } + } + + if(StringUtils.hasText(param.getRegionLabel())){ + LambdaQueryWrapper regionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + regionLambdaQueryWrapper.like(BmsRegion::getPathNames,param.getRegionLabel()); + List regionList = bmsRegionService.list(regionLambdaQueryWrapper); + if(regionList.size()>0) { + param.setRegionIds(regionList.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setRegion2Ids(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegionFirstName())){ + LambdaQueryWrapper regionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + regionLambdaQueryWrapper.like(BmsRegion::getName,param.getSearchRegionFirstName()); + List regionList = bmsRegionService.list(regionLambdaQueryWrapper); + if(regionList.size()>0) { + param.setSearchRegionFirst(regionList.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegionFirst(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegionSecondName())){ + LambdaQueryWrapper regionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + regionLambdaQueryWrapper.like(BmsRegion::getName,param.getSearchRegionSecondName()); + List regionList = bmsRegionService.list(regionLambdaQueryWrapper); + if(regionList.size()>0) { + param.setSearchRegionSecond(regionList.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegionSecond(Arrays.asList("#")); + } + } + List childIds = postUserService.listByChildIds(AuthContextUtils.getSysUserId()); + param.setSelectUserIds(childIds); + param.setSelectUserIdsFlag(true); + PageVo pageVo = hisUserSupplierService.selectPageSupplier(param); + initSupplierList(pageVo.getList()); + return R.ok(pageVo); + } + + /** + * 我的和下属的客户,翻页查询 + * @param param + * @return + */ + @GetMapping("/underlingAndMinePage") + public R> getUnderlingAndMinePage(BmsSupplier param){ + List childIds = postUserService.listByChildIds(AuthContextUtils.getSysUserId()); + childIds.add(AuthContextUtils.getSysUserId()); + param.setSelectUserIds(childIds); + param.setSelectUserIdsFlag(true); + PageVo pageVo = hisUserSupplierService.selectPageSupplier(param); + initSupplierList(pageVo.getList()); + return R.ok(pageVo); + } + + + @PostMapping("/exportExcel") + @PreAuthorize("hasRole('bms:supplier:query')") + public R> exportExcel(@RequestBody BmsSupplier param){ + param = this.initQueryParam(param); + param.setCurrUserId(AuthContextUtils.getSysUserId()); + List list = bmsSupplierService.selectSupplierList(param); + initSupplierList(list); + initParentList(list); + List boList = list.stream().map(a->BmsSupplierExcelBo.toExcelBo(a)).collect(Collectors.toList()); + return R.ok(boList); + } + + + private void initParentList(List list){ + for (BmsSupplier supplier : list) { + if(StringUtils.hasText(supplier.getPid())&&!supplier.getPid().equals("0")){ + BmsSupplier parentInfo = bmsSupplierService.getById(supplier.getPid()); + supplier.setParentRegionInfo(parentInfo); + }else { + supplier.setPid(null); + } + } + } + + + /** + * 显示关联 + * @param list + */ + private void initSupplierList(List list) { + //设置销售区域 + List regionIds = list.stream() + .filter(sup -> sup.getRegionLast() != null && !sup.getRegionLast().equals("0")) + .map(BmsSupplier::getRegionLast).collect(Collectors.toList()); + regionIds.addAll(list.stream() + .filter(sup -> sup.getRegionFirst() != null && !sup.getRegionFirst().equals("0")) + .map(BmsSupplier::getRegionFirst).collect(Collectors.toList())); + regionIds.addAll(list.stream() + .filter(sup -> sup.getRegionSecond() != null && !sup.getRegionSecond().equals("0")) + .map(BmsSupplier::getRegionSecond).collect(Collectors.toList())); + regionIds.addAll(list.stream() + .filter(sup -> sup.getRegionThird() != null && !sup.getRegionThird().equals("0")) + .map(BmsSupplier::getRegionThird).collect(Collectors.toList())); + regionIds.addAll(list.stream() + .filter(sup -> sup.getRegionFourthly() != null && !sup.getRegionFourthly().equals("0")) + .map(BmsSupplier::getRegionFourthly).collect(Collectors.toList())); + + List regionList = null; + if (CollectionUtil.isNotEmpty(regionIds)) { + regionList = bmsRegionService.listByIds(regionIds); + } + if (CollectionUtil.isNotEmpty(regionList)){ + for (BmsSupplier supplier : list) { + String regionId = supplier.getRegionLast(); + String regionFirst = supplier.getRegionFirst(); + String regionSecond = supplier.getRegionSecond(); + String regionThird = supplier.getRegionThird(); + String regionFourthly = supplier.getRegionFourthly(); + + for (BmsRegion region : regionList) { + if (region.getId().equals(regionId)) { + supplier.setRegionLabel(region.getName()); + } + if (region.getId().equals(regionFirst)) { + supplier.setRegionFirstInfo(region); + } + if (region.getId().equals(regionSecond)) { + supplier.setRegionSecondInfo(region); + } + if (region.getId().equals(regionThird)) { + supplier.setRegionThirdInfo(region); + } + if (region.getId().equals(regionFourthly)) { + supplier.setRegionFourthlyInfo(region); + } + } + } + } + //设置行政区域 + List region2Ids = list.stream() + .filter(sup->sup.getRegion2Last()!=null&&!sup.getRegion2Last().equals("0")) + .map(BmsSupplier::getRegion2Last).collect(Collectors.toList()); + region2Ids.addAll(list.stream() + .filter(sup -> sup.getRegion2First() != null && !sup.getRegion2First().equals("0")) + .map(BmsSupplier::getRegion2First).collect(Collectors.toList())); + region2Ids.addAll(list.stream() + .filter(sup -> sup.getRegion2Second() != null && !sup.getRegion2Second().equals("0")) + .map(BmsSupplier::getRegion2Second).collect(Collectors.toList())); + region2Ids.addAll(list.stream() + .filter(sup -> sup.getRegion2Third() != null && !sup.getRegion2Third().equals("0")) + .map(BmsSupplier::getRegion2Third).collect(Collectors.toList())); + region2Ids.addAll(list.stream() + .filter(sup -> sup.getRegion2Fourthly() != null && !sup.getRegion2Fourthly().equals("0")) + .map(BmsSupplier::getRegion2Fourthly).collect(Collectors.toList())); + + List region2List = null; + if(CollectionUtil.isNotEmpty(region2Ids)){ + region2List = bmsRegion2Service.listByIds(region2Ids); + } + if(CollectionUtil.isNotEmpty(region2List)){ + for (BmsSupplier supplier : list) { + String region2Id = supplier.getRegion2Last(); + String regionFirst = supplier.getRegion2First(); + String regionSecond = supplier.getRegion2Second(); + String regionThird = supplier.getRegion2Third(); + String regionFourthly = supplier.getRegion2Fourthly(); + + for (BmsRegion2 region : region2List) { + String regionId = region.getId(); + + if (regionId.equals(region2Id)) { + supplier.setRegion2Label(region.getName()); + } + if (region.getId().equals(regionFirst)) { + supplier.setRegion2FirstInfo(region); + } + if (region.getId().equals(regionSecond)) { + supplier.setRegion2SecondInfo(region); + } + if (region.getId().equals(regionThird)) { + supplier.setRegion2ThirdInfo(region); + } + if (region.getId().equals(regionFourthly)) { + supplier.setRegion2FourthlyInfo(region); + } + } + } + } + } + + + + @GetMapping("/syncAll") + public R> syncAll(BmsSupplier param){ + List userIds = sysUserService.list().stream().map(a->a.getId()).collect(Collectors.toList()); + param.setSelectUserIds(userIds); + param.setSelectUserIdsFlag(true); + hisUserSupplierService.selectListSupplier(param); + return R.ok(); + } + + + private BmsSupplier initQueryParam(BmsSupplier param){ + //兼容 前端接错参数 + if(param.getSupplierName()!=null){ + param.setName(param.getSupplierName()); + } + if(param.getSupplierCode()!=null){ + param.setCode(param.getSupplierCode()); + } + + if(StringUtils.hasText(param.getRegion2Label())){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.like(BmsRegion2::getPathNames,param.getRegion2Label()); + List region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + if(region2List.size()>0) { + param.setRegion2Ids(region2List.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setRegion2Ids(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegion2FirstName())){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.like(BmsRegion2::getName,param.getSearchRegion2FirstName()); + List region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + if(region2List.size()>0) { + param.setSearchRegion2First(region2List.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegion2First(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegion2SecondName())){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.like(BmsRegion2::getName,param.getSearchRegion2SecondName()); + List region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + if(region2List.size()>0) { + param.setSearchRegion2Second(region2List.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegion2Second(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegion2ThirdName())){ + LambdaQueryWrapper region2LambdaQueryWrapper = new LambdaQueryWrapper<>(); + region2LambdaQueryWrapper.like(BmsRegion2::getName,param.getSearchRegion2ThirdName()); + List region2List = bmsRegion2Service.list(region2LambdaQueryWrapper); + if(region2List.size()>0) { + param.setSearchRegion2Third(region2List.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegion2Third(Arrays.asList("#")); + } + } + + if(StringUtils.hasText(param.getRegionLabel())){ + LambdaQueryWrapper regionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + regionLambdaQueryWrapper.like(BmsRegion::getPathNames,param.getRegionLabel()); + List regionList = bmsRegionService.list(regionLambdaQueryWrapper); + if(regionList.size()>0) { + param.setRegionIds(regionList.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setRegion2Ids(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegionFirstName())){ + LambdaQueryWrapper regionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + regionLambdaQueryWrapper.like(BmsRegion::getName,param.getSearchRegionFirstName()); + List regionList = bmsRegionService.list(regionLambdaQueryWrapper); + if(regionList.size()>0) { + param.setSearchRegionFirst(regionList.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegionFirst(Arrays.asList("#")); + } + } + if(StringUtils.hasText(param.getSearchRegionSecondName())){ + LambdaQueryWrapper regionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + regionLambdaQueryWrapper.like(BmsRegion::getName,param.getSearchRegionSecondName()); + List regionList = bmsRegionService.list(regionLambdaQueryWrapper); + if(regionList.size()>0) { + param.setSearchRegionSecond(regionList.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + param.setSearchRegionSecond(Arrays.asList("#")); + } + } + return param; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsAccount.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsAccount.java new file mode 100644 index 0000000..ebc3d13 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsAccount.java @@ -0,0 +1,97 @@ +package com.qs.serve.modules.bms.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-04-11 + */ +@Data +@TableName("bms_account") +public class BmsAccount implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 账套名称 */ + @Length(max = 255,message = "账套名称长度不能超过255字") + private String bookName; + + /** 账套编码 */ + @Length(max = 255,message = "账套编码长度不能超过255字") + private String bookCode; + + /** 是否停用 */ + private Integer stopFlag; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + + public static BmsAccount toNewObject(BmsAccount source){ + BmsAccount account = new BmsAccount(); + account.setId(source.getId()); + account.setBookName(source.getBookName()); + account.setBookCode(source.getBookCode()); + account.setStopFlag(source.getStopFlag()); + account.setRemark(source.getRemark()); + account.setCreateTime(source.getCreateTime()); + account.setCreateBy(source.getCreateBy()); + account.setUpdateTime(source.getUpdateTime()); + account.setUpdateBy(source.getUpdateBy()); + account.setDelFlag(source.getDelFlag()); + account.setTenantId(source.getTenantId()); + return account; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsAccountUser.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsAccountUser.java new file mode 100644 index 0000000..b565296 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsAccountUser.java @@ -0,0 +1,117 @@ +package com.qs.serve.modules.bms.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-04-11 + */ +@Data +@TableName("bms_account_user") +public class BmsAccountUser implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 账套ID */ + @NotNull(message = "账套ID不能为空") + private Long bookId; + + /** 账套编码 */ + @Length(max = 255,message = "账套编码长度不能超过255字") + private String bookCode; + + /** 账套名称 */ + @Length(max = 255,message = "账套名称长度不能超过255字") + private String bookName; + + /** 用户ID */ + @Length(max = 255,message = "用户ID长度不能超过255字") + private String userId; + + /** 用户编码 */ + @Length(max = 255,message = "用户编码长度不能超过255字") + private String userCode; + + /** 用户名称 */ + @Length(max = 255,message = "用户名称长度不能超过255字") + private String userName; + + /** 是否显示 */ + private Integer stopFlag; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + + public static BmsAccountUser toNewObject(BmsAccountUser source){ + BmsAccountUser accountUser = new BmsAccountUser(); + accountUser.setId(source.getId()); + accountUser.setBookId(source.getBookId()); + accountUser.setBookCode(source.getBookCode()); + accountUser.setBookName(source.getBookName()); + accountUser.setUserId(source.getUserId()); + accountUser.setUserCode(source.getUserCode()); + accountUser.setUserName(source.getUserName()); + accountUser.setStopFlag(source.getStopFlag()); + accountUser.setRemark(source.getRemark()); + accountUser.setCreateTime(source.getCreateTime()); + accountUser.setCreateBy(source.getCreateBy()); + accountUser.setUpdateTime(source.getUpdateTime()); + accountUser.setUpdateBy(source.getUpdateBy()); + accountUser.setDelFlag(source.getDelFlag()); + accountUser.setTenantId(source.getTenantId()); + return accountUser; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsApplyMessage.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsApplyMessage.java new file mode 100644 index 0000000..6291884 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsApplyMessage.java @@ -0,0 +1,101 @@ +package com.qs.serve.modules.bms.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 2023-09-18 + */ +@Data +@TableName("bms_apply_message") +public class BmsApplyMessage implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 业务类型 */ + @NotBlank(message = "业务类型不能为空") + @Length(max = 30,message = "业务类型长度不能超过30字") + private String type; + + /** 表达式 */ + private String express; + + /** 启用状态 */ + private Integer enableFlag; + + /** 信息 */ + private String message; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + public static BmsApplyMessage toNewObject(BmsApplyMessage source){ + BmsApplyMessage applyMessage = new BmsApplyMessage(); + applyMessage.setId(source.getId()); + applyMessage.setType(source.getType()); + applyMessage.setExpress(source.getExpress()); + applyMessage.setEnableFlag(source.getEnableFlag()); + applyMessage.setMessage(source.getMessage()); + applyMessage.setRemark(source.getRemark()); + applyMessage.setCreateTime(source.getCreateTime()); + applyMessage.setUpdateTime(source.getUpdateTime()); + applyMessage.setTenantId(source.getTenantId()); + applyMessage.setCreateBy(source.getCreateBy()); + applyMessage.setUpdateBy(source.getUpdateBy()); + applyMessage.setDelFlag(source.getDelFlag()); + return applyMessage; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsCenterExtend.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsCenterExtend.java new file mode 100644 index 0000000..4e14bdb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsCenterExtend.java @@ -0,0 +1,150 @@ +package com.qs.serve.modules.bms.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; +import java.util.List; +/** + * 后继成本中心 实体类 + * @author YenHex + * @since 2023-05-30 + */ +@Data +@TableName("bms_center_extend") +public class BmsCenterExtend implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 编号 */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 来源id */ + @NotNull(message = "来源id不能为空") + private Long sourceId; + + /** 成本中心类型 */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 255,message = "成本中心类型长度不能超过255字") + private String centerType; + + /** 成本中心id */ + @NotBlank(message = "成本中心id不能为空") + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 50,message = "成本中心编码长度不能超过50字") + @TableField(condition = SqlCondition.LIKE) + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 200,message = "成本中心名称长度不能超过200字") + @TableField(condition = SqlCondition.LIKE) + private String centerName; + + /** 开始时间 */ + @NotNull(message = "开始时间不能为空") + @Length(max = 0,message = "开始时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime startTime; + + /** 结束时间 */ + @Length(max = 0,message = "结束时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime stopTime; + + /** 结束标识 */ + @NotNull(message = "结束标识不能为空") + private Integer stopFlag; + + /** 权重 */ + @NotNull(message = "权重不能为空") + private BigDecimal weightRate; + + /** 备注 */ + @Length(max = 600,message = "备注长度不能超过600字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 组合id */ + @TableField(exist = false) + private String comboId; + + /** 子列表 */ + @TableField(exist = false) + private List childList; + + /** 人员列表 */ + @TableField(exist = false) + private List userList; + + public static BmsCenterExtend toNewObject(BmsCenterExtend source){ + BmsCenterExtend centerExtend = new BmsCenterExtend(); + centerExtend.setId(source.getId()); + centerExtend.setSourceId(source.getSourceId()); + centerExtend.setCenterType(source.getCenterType()); + centerExtend.setCenterId(source.getCenterId()); + centerExtend.setCenterCode(source.getCenterCode()); + centerExtend.setCenterName(source.getCenterName()); + centerExtend.setStartTime(source.getStartTime()); + centerExtend.setStopTime(source.getStopTime()); + centerExtend.setStopFlag(source.getStopFlag()); + centerExtend.setWeightRate(source.getWeightRate()); + centerExtend.setRemark(source.getRemark()); + centerExtend.setCreateTime(source.getCreateTime()); + centerExtend.setUpdateTime(source.getUpdateTime()); + centerExtend.setTenantId(source.getTenantId()); + centerExtend.setCreateBy(source.getCreateBy()); + centerExtend.setUpdateBy(source.getUpdateBy()); + centerExtend.setDelFlag(source.getDelFlag()); + return centerExtend; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsCenterExtendBuild.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsCenterExtendBuild.java new file mode 100644 index 0000000..955e8cf --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsCenterExtendBuild.java @@ -0,0 +1,148 @@ +package com.qs.serve.modules.bms.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 2023-07-17 + */ +@Data +@TableName("bms_center_extend_build") +public class BmsCenterExtendBuild implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 编号 */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 创建类型 data,tree */ + private String buildType; + + /** 来源id */ + @NotNull(message = "来源id不能为空") + private Long rowId; + + private String pathCenterIds; + + private String pathCenterCodes; + + private String pathCenterNames; + + /** 成本中心类型 */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 255,message = "成本中心类型长度不能超过255字") + private String centerType; + + /** 成本中心id */ + @NotBlank(message = "成本中心id不能为空") + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 50,message = "成本中心编码长度不能超过50字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 200,message = "成本中心名称长度不能超过200字") + private String centerName; + + /** 开始时间 */ + @NotNull(message = "开始时间不能为空") + @Length(max = 0,message = "开始时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime startTime; + + /** 结束时间 */ + @Length(max = 0,message = "结束时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime stopTime; + + /** 结束标识 */ + @NotNull(message = "结束标识不能为空") + private Integer stopFlag; + + /** 仅用于测试 */ + private Integer lastType; + + /** 权重 */ + @NotNull(message = "权重不能为空") + private BigDecimal weightRate; + + /** 备注 */ + @Length(max = 600,message = "备注长度不能超过600字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + public static BmsCenterExtendBuild toNewObject(BmsCenterExtendBuild source){ + BmsCenterExtendBuild centerExtendBuild = new BmsCenterExtendBuild(); + centerExtendBuild.setId(source.getId()); + centerExtendBuild.setCenterType(source.getCenterType()); + centerExtendBuild.setCenterId(source.getCenterId()); + centerExtendBuild.setCenterCode(source.getCenterCode()); + centerExtendBuild.setCenterName(source.getCenterName()); + centerExtendBuild.setStartTime(source.getStartTime()); + centerExtendBuild.setStopTime(source.getStopTime()); + centerExtendBuild.setStopFlag(source.getStopFlag()); + centerExtendBuild.setWeightRate(source.getWeightRate()); + centerExtendBuild.setRemark(source.getRemark()); + centerExtendBuild.setCreateTime(source.getCreateTime()); + centerExtendBuild.setUpdateTime(source.getUpdateTime()); + centerExtendBuild.setTenantId(source.getTenantId()); + centerExtendBuild.setCreateBy(source.getCreateBy()); + centerExtendBuild.setUpdateBy(source.getUpdateBy()); + centerExtendBuild.setDelFlag(source.getDelFlag()); + return centerExtendBuild; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsCenterExtendUser.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsCenterExtendUser.java new file mode 100644 index 0000000..39a7797 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsCenterExtendUser.java @@ -0,0 +1,138 @@ +package com.qs.serve.modules.bms.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 2023-05-31 + */ +@Data +@TableName("bms_center_extend_user") +public class BmsCenterExtendUser implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 编号 */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 子继承id */ + @NotNull(message = "子继承id不能为空") + private Long childExtId; + + /** 来源id */ + @NotNull(message = "来源id不能为空") + private Long sourceId; + + /** 成本中心类型 */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 255,message = "成本中心类型长度不能超过255字") + private String centerType; + + /** 成本中心id */ + @NotBlank(message = "成本中心id不能为空") + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 50,message = "成本中心编码长度不能超过50字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 200,message = "成本中心名称长度不能超过200字") + private String centerName; + + /** */ + @NotBlank(message = "不能为空") + @Length(max = 255,message = "长度不能超过255字") + private String userId; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String userCode; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String userName; + + /** 权重 */ + @NotNull(message = "权重不能为空") + private BigDecimal weightRate; + + /** 备注 */ + @Length(max = 600,message = "备注长度不能超过600字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + public static BmsCenterExtendUser toNewObject(BmsCenterExtendUser source){ + BmsCenterExtendUser centerExtendUser = new BmsCenterExtendUser(); + centerExtendUser.setId(source.getId()); + centerExtendUser.setChildExtId(source.getChildExtId()); + centerExtendUser.setSourceId(source.getSourceId()); + centerExtendUser.setCenterType(source.getCenterType()); + centerExtendUser.setCenterId(source.getCenterId()); + centerExtendUser.setCenterCode(source.getCenterCode()); + centerExtendUser.setCenterName(source.getCenterName()); + centerExtendUser.setUserId(source.getUserId()); + centerExtendUser.setUserCode(source.getUserCode()); + centerExtendUser.setUserName(source.getUserName()); + centerExtendUser.setWeightRate(source.getWeightRate()); + centerExtendUser.setRemark(source.getRemark()); + centerExtendUser.setCreateTime(source.getCreateTime()); + centerExtendUser.setUpdateTime(source.getUpdateTime()); + centerExtendUser.setTenantId(source.getTenantId()); + centerExtendUser.setCreateBy(source.getCreateBy()); + centerExtendUser.setUpdateBy(source.getUpdateBy()); + centerExtendUser.setDelFlag(source.getDelFlag()); + return centerExtendUser; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsCenterRegion.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsCenterRegion.java new file mode 100644 index 0000000..4d5b84c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsCenterRegion.java @@ -0,0 +1,57 @@ +package com.qs.serve.modules.bms.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 2023-07-20 + */ +@Data +@TableName("bms_center_region") +public class BmsCenterRegion implements Serializable { + + private static final long serialVersionUID = 1L; + + /** */ + @TableId(type = IdType.AUTO) + private Long id; + + /** */ + private Long centerId; + + /** */ + @Length(max = 32,message = "长度不能超过32字") + private String regionId; + + /** */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + public static BmsCenterRegion toNewObject(BmsCenterRegion source){ + BmsCenterRegion centerRegion = new BmsCenterRegion(); + centerRegion.setId(source.getId()); + centerRegion.setCenterId(source.getCenterId()); + centerRegion.setRegionId(source.getRegionId()); + centerRegion.setDelFlag(source.getDelFlag()); + return centerRegion; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsChannel.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsChannel.java new file mode 100644 index 0000000..7676a93 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsChannel.java @@ -0,0 +1,132 @@ +package com.qs.serve.modules.bms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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; +import java.util.List; +/** + * 渠道 实体类 + * @author YenHex + * @since 2022-11-07 + */ +@Data +@TableName("bms_channel") +public class BmsChannel implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 渠道编码 */ + @TableField(condition = SqlCondition.LIKE) + private String channelCode; + + /** 渠道名称 */ + @NotBlank(message = "渠道名称不能为空") + @Length(max = 30,message = "渠道名称长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String channelName; + + /** 渠道类型(读取数据字典) */ + @Length(max = 255,message = "渠道类型(读取数据字典)长度不能超过255字") + private String channelType; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + + /** 可投放费用标识 */ + private Integer costFlag; + + private Long headChannelId; + /** 总公司渠道 */ + private String headChannel; + + private String headChannelCode; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + + /** 值=1,过滤当前用户及下属负责数据 */ + @TableField(exist = false) + private Integer loadByCurrent; + + /** 用于接参查询 */ + @TableField(exist = false) + private String supplierIdForFindChild; + + /** 选择的渠道ID */ + @TableField(exist = false) + private List selectIds; + + /** 选择的渠道开始时间 */ + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime selectStartTime; + + /** 选择的渠道结束时间 */ + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime selectEndTime; + + /** 选择的供应商ID,用于新增 */ + @TableField(exist = false) + private List supplierIds; + + /** 用于导入 */ +// @TableField(exist = false) +// private List supplierCodes; + + @TableField(exist = false) + private List supplierNames; + + @TableField(exist = false) + private String seachSupplierName; + + @TableField(exist = false) + private Integer exportNum; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsChannelPoint.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsChannelPoint.java new file mode 100644 index 0000000..e8f1d48 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsChannelPoint.java @@ -0,0 +1,230 @@ +package com.qs.serve.modules.bms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import com.qs.serve.common.model.annotation.BusinessDifference; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +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 2022-11-07 + */ +@Data +@TableName(value = "bms_channel_point",autoResultMap = true) +public class BmsChannelPoint implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 渠道名称 */ + @NotNull(message = "渠道名称不能为空") + private Long channelId; + + private String channelCode; + + @TableField(condition = SqlCondition.LIKE) + private String channelName; + + /** 站点编码 */ + @NotBlank(message = "站点编码不能为空") + @Length(max = 50,message = "站点编码长度不能超过50字") + @TableField(condition = SqlCondition.LIKE) + private String pointCode; + + /** 站点名称 */ + @NotBlank(message = "站点名称不能为空") + @Length(max = 30,message = "站点名称长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + @BusinessDifference("网点名称") + private String pointName; + + /** 店铺面积 */ + @NotBlank(message = "店铺面积不能为空") + @Length(max = 255,message = "店铺面积长度不能超过255字") + private String shopArea; + + /** 收银台数量 */ + @NotNull(message = "收银台数量不能为空") + private Integer countCheckstand; + + /** 站点等级(读取字典值) */ + @Length(max = 255,message = "站点等级(读取字典值)长度不能超过255字") + private String pointLevel; + + /** 站点类型(读取字典值) */ + private String pointType; + + /** 详细地址 */ + @Length(max = 255,message = "详细地址长度不能超过255字") + @BusinessDifference("详细地址") + private String address; + + /** 销售区域id */ + @NotNull(message = "销售区域id不能为空") + private String saleRegionId; + + /** 销售区域 */ + @NotBlank(message = "销售区域不能为空") + @Length(max = 255,message = "销售区域长度不能超过255字") + @BusinessDifference("销售区域") + private String saleRegionPath; + + private String saleRegionPathIds; + + /** 行政区域id */ + @NotNull(message = "行政区域id不能为空") + private String bizRegionId; + + /** 行政区域 */ + @NotBlank(message = "行政区域不能为空") + @Length(max = 255,message = "行政区域长度不能超过255字") + @BusinessDifference("行政区域") + private String bizRegionPath; + + private String bizRegionPathIds; + + /** 纬度 */ + @Length(max = 255,message = "纬度长度不能超过255字") + private String localX; + + /** 经度 */ + @Length(max = 255,message = "经度长度不能超过255字") + private String localY; + + /** 地图地址 */ + @Length(max = 255,message = "地图地址长度不能超过255字") + private String mapAddress; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 图片多张用句号隔开 */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] photos; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonSerialize(using = LocalDateTimeSerializer.class) + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonSerialize(using = LocalDateTimeSerializer.class) + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 可投放费用标识,默认=1 */ + private Integer costFlag; + + /** 可拜访网点,默认=1 */ + private Integer visitFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + @TableField(exist = false) + private String saleRegionName; + + @TableField(exist = false) + private String bizRegionName; + + @TableField(exist = false) + private String bizRegionCode; + + @TableField(exist = false) + private String supplierId; + + /** 后端参数 */ + @TableField(exist = false) + private String userId; + + /** 后端参数 */ + @TableField(exist = false) + private List sourceIdsList; + + /** 后端参数 */ + @TableField(exist = false) + private List userIdList; + + /** 值=1,过滤当前用户及下属负责数据 */ + @TableField(exist = false) + private Integer loadByCurrent; + + + /** 选择的ID */ + @TableField(exist = false) + private List selectIds; + + /** 选择的开始时间 */ + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime selectStartTime; + + /** 选择的结束时间 */ + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime selectEndTime; + + @TableField(exist = false) + private String channelType; + + @TableField(exist = false) + private String seachSupplierName; + + @TableField(exist = false) + private List seachChannelIds; + + @TableField(exist = false) + private List supplierNames; + + @TableField(exist = false) + private Integer exportNum; + + @TableField(exist = false) + private Integer startNum; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsChannelPointExt.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsChannelPointExt.java new file mode 100644 index 0000000..264f474 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsChannelPointExt.java @@ -0,0 +1,44 @@ +package com.qs.serve.modules.bms.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +/** + * @author YenHex + * @since 2025/3/11 + */ +@Data +@TableName("bms_channel_point_ext") +public class BmsChannelPointExt { + + @TableId + private String pointId; + + /** 省 */ + private String extProvince; + + /** 城市 */ + private String extCity; + + /** 区 */ + private String extRegionArea; + + /** 乡镇 */ + private String extTownship; + + /** 街道 */ + private String extStreet; + + /** 街道编号 */ + private String extStreetNumber; + /** 纬度 */ + private String localX; + + /** 经度 */ + private String localY; + + private String address; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsCostCenter.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsCostCenter.java new file mode 100644 index 0000000..50e500b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsCostCenter.java @@ -0,0 +1,106 @@ +package com.qs.serve.modules.bms.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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 2022-11-11 + */ +@Data +@TableName("bms_cost_center") +public class BmsCostCenter implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 编码 */ + @NotBlank(message = "编码不能为空") + @Length(max = 20,message = "编码长度不能超过20字") + private String code; + + /** 名称 */ + @NotBlank(message = "名称不能为空") + @Length(max = 20,message = "名称长度不能超过20字") + private String name; + + /** 层级 */ + @NotNull(message = "层级不能为空") + private Integer level; + + /** 是否所有人可见 */ + private Integer visibleFlag; + + /** 是否销售费用 */ + private Integer saleCostFlag; + + /** 父级节点 */ + @NotNull(message = "父级节点不能为空") + private Long pid; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 子节点 */ + @TableField(exist = false) + List childNode; + + /** 父级节点 */ + @TableField(exist = false) + private Object parentInfo; + + /** 成本中心信息 */ + @TableField(exist = false) + private List saleRegionInfo; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsDutyInfo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsDutyInfo.java new file mode 100644 index 0000000..55b13d4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsDutyInfo.java @@ -0,0 +1,100 @@ +package com.qs.serve.modules.bms.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 2023-08-30 + */ +@Data +@TableName("bms_duty_info") +public class BmsDutyInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 公司名称 */ + @Length(max = 255,message = "公司名称长度不能超过255字") + private String comName; + + /** 税号 */ + @Length(max = 255,message = "税号长度不能超过255字") + private String dutyCode; + + /** 致远的部门id */ + private String oaDeptId; + + /** 是否显示 */ + private Integer showFlag; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** */ + @JsonIgnore + @JsonProperty + private String tenantId; + + + public static BmsDutyInfo toNewObject(BmsDutyInfo source){ + BmsDutyInfo dutyInfo = new BmsDutyInfo(); + dutyInfo.setId(source.getId()); + dutyInfo.setComName(source.getComName()); + dutyInfo.setDutyCode(source.getDutyCode()); + dutyInfo.setShowFlag(source.getShowFlag()); + dutyInfo.setRemark(source.getRemark()); + dutyInfo.setCreateTime(source.getCreateTime()); + dutyInfo.setCreateBy(source.getCreateBy()); + dutyInfo.setUpdateTime(source.getUpdateTime()); + dutyInfo.setUpdateBy(source.getUpdateBy()); + dutyInfo.setDelFlag(source.getDelFlag()); + dutyInfo.setTenantId(source.getTenantId()); + return dutyInfo; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsFactory.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsFactory.java new file mode 100644 index 0000000..8e39e68 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsFactory.java @@ -0,0 +1,76 @@ +package com.qs.serve.modules.bms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-10-20 + */ +@Data +@TableName("bms_factory") +public class BmsFactory implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private String id; + + /** 名称 */ + @NotBlank(message = "名称不能为空") + @Length(max = 20,message = "名称长度不能超过20字") + private String name; + + /** 编码 */ + @NotBlank(message = "编码不能为空") + @Length(max = 20,message = "编码长度不能超过20字") + private String code; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsMasterUser.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsMasterUser.java new file mode 100644 index 0000000..4141527 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsMasterUser.java @@ -0,0 +1,133 @@ +package com.qs.serve.modules.bms.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 2022-11-10 + */ +@Data +@TableName("bms_master_user") +public class BmsMasterUser implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 类型:channel、point、center */ + @NotBlank(message = "类型不能为空") + @Length(max = 10,message = "类型长度不能超过10字") + private String type; + + /** 目标id */ + @NotBlank(message = "目标id不能为空") + @Length(max = 32,message = "目标id长度不能超过32字") + private String targetId; + + /** 用户id */ + @NotBlank(message = "用户id不能为空") + @Length(max = 32,message = "用户id长度不能超过32字") + private String userId; + + /** 主要负责人 */ + @NotNull(message = "主要负责人不能为空") + private Integer masterFlag; + + /** 渠道 */ + @Length(max = 255,message = "渠道长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String channelName; + + /** 渠道 */ + @Length(max = 255,message = "渠道长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String channelCode; + + /** 网点 */ + @Length(max = 255,message = "网点长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String pointName; + + /** 网点 */ + @Length(max = 255,message = "网点长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String pointCode; + + /** 用户 */ + @Length(max = 255,message = "用户长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String userCode; + + /** 用户 */ + @Length(max = 255,message = "用户长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String userName; + + /** 成本中心 */ + @TableField(condition = SqlCondition.LIKE) + private String centerCode; + + /** 成本中心 */ + @TableField(condition = SqlCondition.LIKE) + private String centerName; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + @TableField(exist = false) + private Object userInfo; + + @TableField(exist = false) + private Object objectInfo; + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsRegion.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsRegion.java new file mode 100644 index 0000000..2c58e9d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsRegion.java @@ -0,0 +1,123 @@ +package com.qs.serve.modules.bms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * 区域档案 实体类 + * @author YenHex + * @since 2022-10-10 + */ +@Data +@TableName(value = "bms_region",autoResultMap = true) +public class BmsRegion implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.INPUT) + private String id; + + /** 名称 */ + @Length(max = 20,message = "名称长度不能超过20字") + private String name; + + /** 别名 */ + private String aliasRegion; + + /** 编码 */ + @Length(max = 20,message = "编码长度不能超过20字") + private String code; + + /** 父级ID */ + @Length(max = 32,message = "父级ID长度不能超过32字") + private String pid; + + /** 备注 */ + private String remark; + + /** 层级 */ + private Integer level; + + /** 祖级id */ + private String pathIds; + + /** 祖级id */ + private String pathNames; + + /** 是否停用 */ + private Integer stopFlag; + + /** 工厂产地ID */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] factoryIds; + + /** 系统编码1 */ + private String sysCode1; + /** 系统编码2 */ + private String sysCode2; + /** 系统编码3 */ + private String sysCode3; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** 工厂列表 */ + @TableField(exist = false) + private List factoryInfos; + + @TableField(exist = false) + private List regionUsers; + + @TableField(exist = false) + private Object parentInfo; + + /** + * 子节点 + */ + @TableField(exist = false) + List childNodes; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsRegion2.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsRegion2.java new file mode 100644 index 0000000..7bf9e64 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsRegion2.java @@ -0,0 +1,104 @@ +package com.qs.serve.modules.bms.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 区域档案 实体类 + * @author YenHex + * @since 2022-10-10 + */ +@Data +@TableName(value = "bms_region2") +public class BmsRegion2 implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.INPUT) + private String id; + + /** 名称 */ + @Length(max = 20,message = "名称长度不能超过20字") + private String name; + + /** 编码 */ + @Length(max = 20,message = "编码长度不能超过20字") + private String code; + + /** 父级ID */ + @Length(max = 32,message = "父级ID长度不能超过32字") + private String pid; + + /** 层级 */ + private Integer level; + + /** 祖级id */ + private String pathIds; + + /** 祖级id */ + private String pathNames; + + private String remark; + + /** 系统编码1 */ + private String sysCode1; + /** 系统编码2 */ + private String sysCode2; + /** 系统编码3 */ + private String sysCode3; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + @TableField(exist = false) + private List regionUsers; + + @TableField(exist = false) + private Object parentInfo; + + /** + * 子节点 + */ + @TableField(exist = false) + List childNodes; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsRegionUser.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsRegionUser.java new file mode 100644 index 0000000..8de0900 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsRegionUser.java @@ -0,0 +1,103 @@ +package com.qs.serve.modules.bms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-11-02 + */ +@Data +@TableName("bms_region_user") +public class BmsRegionUser implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 类型:0=销售区域;1=行政区域 */ + @NotNull(message = "类型:0=销售区域;1=行政区域不能为空") + private Integer type; + + /** 区域id */ + @NotBlank(message = "区域id不能为空") + @Length(max = 32,message = "区域id长度不能超过32字") + private String regionId; + + /** 用户id */ + @NotBlank(message = "用户id不能为空") + @Length(max = 32,message = "用户id长度不能超过32字") + private String userId; + + /** 主要负责人 */ + @NotNull(message = "主要负责人不能为空") + private Integer masterFlag; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** 祖级id */ + private String pathIds; + + /** 祖级id */ + private String pathNames; + + /** 区域名称 */ + @TableField(exist = false) + private String regionName; + + /** 区域编码 */ + @TableField(exist = false) + private String regionCode; + + /** 用户名称 */ + @TableField(exist = false) + private String userName; + + /** 用户编码 */ + @TableField(exist = false) + private String userCode; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsRule.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsRule.java new file mode 100644 index 0000000..6a7a8e1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsRule.java @@ -0,0 +1,89 @@ +package com.qs.serve.modules.bms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; +import java.util.List; + +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 2022-10-19 + */ +@Data +@TableName("bms_rule") +public class BmsRule implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 规则名称 */ + @NotBlank(message = "规则名称不能为空") + @Length(max = 255,message = "规则名称长度不能超过255字") + private String name; + + /** 状态:0->关闭;1->启用; */ + @NotNull(message = "状态:0->关闭;1->启用;不能为空") + private Integer status; + + /** 开始时间 */ + @Length(max = 0,message = "开始时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime startTime; + + /** 结束时间 */ + @Length(max = 0,message = "结束时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime endTime; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsRuleRegion.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsRuleRegion.java new file mode 100644 index 0000000..ff61160 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsRuleRegion.java @@ -0,0 +1,75 @@ +package com.qs.serve.modules.bms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-10-21 + */ +@Data +@TableName("bms_rule_region") +public class BmsRuleRegion implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 规则ID */ + @NotNull(message = "规则ID不能为空") + private Long ruleId; + + /** 区域ID */ + @NotNull(message = "区域ID不能为空") + private String regionId; + + /** 类型:0->只售;1->禁售 */ + @NotNull(message = "类型:0->只售;1->禁售不能为空") + private Integer typeFlag; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsRuleSku.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsRuleSku.java new file mode 100644 index 0000000..af1db90 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsRuleSku.java @@ -0,0 +1,83 @@ +package com.qs.serve.modules.bms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; +import java.util.List; + +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; + +/** + * 规则sku 实体类 + * @author YenHex + * @since 2022-10-21 + */ +@Data +@TableName("bms_rule_sku") +public class BmsRuleSku implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 规则id */ + @NotNull(message = "规则id不能为空") + private Long ruleId; + + /** skuId */ + @NotNull(message = "skuId不能为空") + private Long skuId; + + /** spuId */ + @NotNull(message = "spuId不能为空") + private Long spuId; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + @TableField(exist = false) + List selectSkuIds; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSkuSupplier.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSkuSupplier.java new file mode 100644 index 0000000..035ef2d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSkuSupplier.java @@ -0,0 +1,79 @@ +package com.qs.serve.modules.bms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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; + +/** + * sku供应商关联 实体类 + * @author YenHex + * @since 2022-10-17 + */ +@Data +@TableName("bms_sku_supplier") +public class BmsSkuSupplier implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 商品id */ + @NotNull(message = "商品id不能为空") + private Long spuId; + + /** skuId */ + @NotNull(message = "skuId不能为空") + private Long skuId; + + /** 供应商id */ + @NotNull(message = "供应商id不能为空") + private Long supplierId; + + /** 禁售状态 */ + @NotNull(message = "禁售状态不能为空") + private Integer banStatus; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSubject.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSubject.java new file mode 100644 index 0000000..978357b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSubject.java @@ -0,0 +1,136 @@ +package com.qs.serve.modules.bms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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; +import java.util.List; +/** + * 科目 实体类 + * @author YenHex + * @since 2022-11-07 + */ +@Data +@TableName("bms_subject") +public class BmsSubject implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + + + private String pathNames; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 父级id */ + @NotNull(message = "父级id不能为空") + private Long pid; + + /** 销售区域:0全部可见;1-部分可见;2-全部不可见 */ + private Integer saleRegionFlag; + + /** 行政区域:0全部可见;1-部分可见;2-全部不可见 */ + private Integer bizRegionFlag; + + /** 是否进场费用 */ + private Integer slottingFlag; + + @TableField(exist = false) + private String parName; + + private Integer level; + + /** 应用与发布费用时,必选网点拦截 */ + private Integer pointSelectFlag; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + private String thirdCode; + + private String thirdName; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 表单ID */ + private Long formId; + + /** 表单id(费用申请) */ + private Long formIdForCostApply; + + @TableField(exist = false) + private Object subjectFormInfo; + + @TableField(exist = false) + private Object subjectFormInfo4CostApply; + + /** 销售区域id */ + @TableField(exist = false) + private List saleRegionIds; + + /** 行政区域id */ + @TableField(exist = false) + private List bizRegionIds; + + /** 销售区域 */ + @TableField(exist = false) + private List saleRegionInfos; + + /** 行政区域 */ + @TableField(exist = false) + private List bizRegionInfos; + + @TableField(exist = false) + private List selectIds; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSubjectForm.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSubjectForm.java new file mode 100644 index 0000000..2956238 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSubjectForm.java @@ -0,0 +1,91 @@ +package com.qs.serve.modules.bms.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 2023-02-03 + */ +@Data +@TableName("bms_subject_form") +public class BmsSubjectForm implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 类型:0->核销模板;1->费用模板 + */ + private Integer formType; + + /** 标题 */ + @NotBlank(message = "标题不能为空") + @Length(max = 40,message = "标题长度不能超过40字") + @TableField(condition = SqlCondition.LIKE) + private String title; + + /** 子标题 */ + @Length(max = 255,message = "子标题长度不能超过255字") + private String subtitle; + + /** 描述 */ + @Length(max = 255,message = "描述长度不能超过255字") + private String descr; + + /** 表单json */ + @NotBlank(message = "表单json不能为空") + private String formContext; + + /** 表单版本 */ + private Integer version; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSubjectRegion.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSubjectRegion.java new file mode 100644 index 0000000..97c5912 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSubjectRegion.java @@ -0,0 +1,96 @@ +package com.qs.serve.modules.bms.entity; + +import java.io.Serializable; +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 2023-03-09 + */ +@Data +@TableName("bms_subject_region") +public class BmsSubjectRegion implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 类型:0=销售区域;1=行政区域 */ + @NotNull(message = "类型:0=销售区域;1=行政区域不能为空") + private Integer type; + + /** 区域id */ + @NotBlank(message = "区域id不能为空") + @Length(max = 32,message = "区域id长度不能超过32字") + private String regionId; + + /** 区域 */ + private String regionName; + + /** 客户id */ + @NotBlank(message = "客户id不能为空") + @Length(max = 32,message = "客户id长度不能超过32字") + private Long subjectId; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + + public static BmsSubjectRegion toNewObject(BmsSubjectRegion source){ + BmsSubjectRegion subjectRegion = new BmsSubjectRegion(); + subjectRegion.setId(source.getId()); + subjectRegion.setType(source.getType()); + subjectRegion.setRegionId(source.getRegionId()); + subjectRegion.setSubjectId(source.getSubjectId()); + subjectRegion.setCreateTime(source.getCreateTime()); + subjectRegion.setCreateBy(source.getCreateBy()); + subjectRegion.setUpdateTime(source.getUpdateTime()); + subjectRegion.setUpdateBy(source.getUpdateBy()); + subjectRegion.setTenantId(source.getTenantId()); + subjectRegion.setDelFlag(source.getDelFlag()); + return subjectRegion; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplier.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplier.java new file mode 100644 index 0000000..7f5a2f1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplier.java @@ -0,0 +1,549 @@ +package com.qs.serve.modules.bms.entity; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.his.entity.HisUserSupplier; +import com.qs.serve.modules.his.entity.HisUserSupplierTemp; +import com.qs.serve.modules.tag.entity.so.TagQuery; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +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 2022-10-11 + */ +@Data +@TableName(value = "bms_supplier",autoResultMap = true) +public class BmsSupplier implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private String id; + + /** 一级区域ID */ + private String regionFirst; + + /** 二级区域ID */ + private String regionSecond; + + /** 三级区域ID */ + private String regionThird; + + /** 四级区域ID */ + private String regionFourthly; + + /** 最子级区域ID */ + private String regionLast; + + /** 行政一级区域ID */ + private String region2First; + + /** 行政二级区域ID */ + private String region2Second; + + /** 行政三级区域ID */ + private String region2Third; + + /** 行政四级区域ID */ + private String region2Fourthly; + + /** 行政最子级区域ID */ + private String region2Last; + + /** 详细地址 */ + private String address; + + /** 名称 */ + @NotBlank(message = "名称不能为空") + @TableField(condition = SqlCondition.LIKE) + private String name; + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + @TableField(condition = SqlCondition.LIKE) + private String code; + + /** 父级id */ + private String pid; + + private String pathIds; + + private String parentCode; + + /** 负责人 */ + private String userId; + + /** 负责人 */ + private String userCode; + + /** 负责人 */ + private String userName; + + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] otherUserIds; + + private String otherUserNames; + + private String otherUserCodes; + + /** 闭户 */ + private Integer stopFlag; + + /** + * CD订单 + * 0-> 非必填 + * 1-> 下单时必须填写CD订单信息 + */ + private Integer cdOrderFlag; + + /** 闭户日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(updateStrategy = FieldStrategy.IGNORED) + private LocalDateTime stopFlagDate; + + /** 所属账套 */ + private String belong; + + /** 是否供应商 */ + private Integer supplierFlag; + + /** 供应商是否填写信息 */ + @NotNull(message = "供应商是否填写信息不能为空") + private Integer supplierInfoFlag; + + /** 供应商税号 */ + @Length(max = 255,message = "供应商税号长度不能超过255字") + private String supplierTaxNumber; + + /** 供应商联系人 */ + @Length(max = 255,message = "供应商联系人长度不能超过255字") + private String supplierUser; + + /** 营业执照地址 */ + @Length(max = 255,message = "营业执照地址长度不能超过255字") + private String supplierLicenseImg; + + /** 附件列表 */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] supplierAttachIds; + + private Integer cooperatePauseFlag; + + /** 暂不合作日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(updateStrategy = FieldStrategy.IGNORED) + private LocalDateTime cooperatePauseFlagDate; + + /** 开始户时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime openTime; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + private String comRegion; + + private String comRegionCode; + + private String bookCode; + + /** 初始化当前欠费 */ + @NotNull(message = "初始化当前欠费不能为空") + private BigDecimal initCurAmount; + + /** 初始化欠费(历史记录) */ + @NotNull(message = "初始化欠费(历史记录)不能为空") + private BigDecimal initHisAmount; + + /** 可投放费用标识 */ + private Integer costFlag; + + /** 在线下单 */ + private Integer orderOnlineFlag; + + /** 线下下单 */ + private Integer orderOfflineFlag; + + /** 运输方式是否可见 */ + private Integer transportVisible; + + /** 统计维护的地址数量 */ + @TableField(exist = false) + private Integer countAddr; + + + /** + * 查询维护的地址 + * countAddrFlag=0 表示未维护的收货地址 + * countAddrFlag=1 表示已维护的收货地址 + */ + @TableField(exist = false) + private Integer countAddrFlag; + + /** 当前用户ID */ + @TableField(exist = false) + private String currUserId; + + /** 多选:销售区域ID */ + @TableField(exist = false) + private List regionIds; + + /** 多选:行政区域ID */ + @TableField(exist = false) + private List region2Ids; + + /** 销售区域 */ + @TableField(exist = false) + private String regionLabel; + + /** 行政区域 */ + @TableField(exist = false) + private String region2Label; + + /** 父级ID信息 */ + @TableField(exist = false) + private Object parentRegionInfo; + + /** 主要负责人标识 */ + @TableField(exist = false) + private Integer masterFlag; + + /** 其它负责人列表 */ + @TableField(exist = false) + List userVos; + + /** + * 搜索:负责人 + */ + @TableField(exist = false) + private String searchUserName; + + /** + * 搜索:负责人编码 + */ + @TableField(exist = false) + private String searchUserCode; + + /** + * 值=1,过滤当前用户及下属负责数据 + */ + @TableField(exist = false) + private Integer loadByCurrent; + + /** 一级区域 */ + @TableField(exist = false) + private Object regionFirstInfo; + + /** 二级区域 */ + @TableField(exist = false) + private Object regionSecondInfo; + + /** 三级区域 */ + @TableField(exist = false) + private Object regionThirdInfo; + + /** 四级区域 */ + @TableField(exist = false) + private Object regionFourthlyInfo; + + /** 行政一级区域 */ + @TableField(exist = false) + private Object region2FirstInfo; + + /** 行政二级区域 */ + @TableField(exist = false) + private Object region2SecondInfo; + + /** 行政三级区域 */ + @TableField(exist = false) + private Object region2ThirdInfo; + + /** 行政四级区域 */ + @TableField(exist = false) + private Object region2FourthlyInfo; + + /** 翻页参数 */ + @TableField(exist = false) + private Integer pageNum; + + /** 翻页参数2 */ + @TableField(exist = false) + private Integer pageSize; + + /** 供应商附件 */ + @TableField(exist = false) + private List supplierAttachInfoList; + + @TableField(exist = false) + private List selectSaleRegionIds; + + @TableField(exist = false) + private List selectBizRegionIds; + + @TableField(exist = false) + private List selectUserIds; + + @TableField(exist = false) + private Boolean selectUserIdsFlag; + + @TableField(exist = false) + private String supplierName; + + @TableField(exist = false) + private String supplierCode; + + @TableField(exist = false) + private String isRegionNull; + + /** 关键字 */ + @TableField(exist = false) + private String keyword; + + /*-------------- ----------------- */ + @TableField(exist = false) + private String searchRegionFirstName; + + @TableField(exist = false) + private List searchRegionFirst; + + @TableField(exist = false) + private String searchRegionSecondName; + + @TableField(exist = false) + private List searchRegionSecond; + + /*-------------- ----------------- */ + @TableField(exist = false) + private String searchRegion2FirstName; + + @TableField(exist = false) + private List searchRegion2First; + + @TableField(exist = false) + private String searchRegion2SecondName; + + @TableField(exist = false) + private List searchRegion2Second; + + @TableField(exist = false) + private String searchRegion2ThirdName; + + @TableField(exist = false) + private List searchRegion2Third; + /*-------------- ----------------- */ + + @TableField(exist = false) + private List searchInIds; + /*-------------- ----------------- */ + + @TableField(exist = false) + private String otherUserIdsString; + + /** 标签查询 */ + @TableField(exist = false) + List tagQueryList; + + /** + * 过滤活动模板的可选范围时必传 + */ + @TableField(exist = false) + private Long activityTemplateId; + + /** + * 根据activityTemplateId更新值 + */ + @TableField(exist = false) + private Integer disableFlag = 0; + + /** + * 对应是supplierFlag + */ + @TableField(exist = false) + private List selectSupplierTypes; + + //查询审批辅助的参数 + @TableField(exist = false) + private Integer type; + + @TableField(exist = false) + private String targetId; + + @TableField(exist = false) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime yearMonthStart; + + @TableField(exist = false) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime yearMonthEnd; + + public List listBizRegionIds(){ + List list = new ArrayList<>(); + list.add(this.getRegion2First()); + list.add(this.getRegion2Second()); + list.add(this.getRegion2Third()); + list.add(this.getRegion2Fourthly()); + return list.stream().filter(Objects::nonNull).collect(Collectors.toList()); + } + + public List listSaleRegionIds(){ + List list = new ArrayList<>(); + list.add(this.getRegionFirst()); + list.add(this.getRegionSecond()); + list.add(this.getRegionThird()); + list.add(this.getRegionFourthly()); + return list.stream().filter(Objects::nonNull).collect(Collectors.toList()); + } + + 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())); + } + 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()); + userSupplier.setSaleRegionSecond(this.getRegionSecond()); + userSupplier.setSaleRegionThird(this.getRegionThird()); + userSupplier.setSaleRegionFourthly(this.getRegionFourthly()); + userSupplier.setBizRegionFirst(this.getRegion2First()); + userSupplier.setBizRegionSecond(this.getRegion2Second()); + userSupplier.setBizRegionThird(this.getRegion2Third()); + userSupplier.setBizRegionFourthly(this.getRegion2Fourthly()); + userSupplier.setSupplierFlag(this.getSupplierFlag()); + userSupplier.setType(type); + userSupplier.setCountAddr(this.getCountAddr()); + userSupplier.setCountAddrFlag(this.getCountAddrFlag()); + userSupplier.setCostFlag(this.costFlag); + userSupplier.setTagQueryList(this.tagQueryList); + return userSupplier; + } + + public HisUserSupplierTemp toHisUserSupplierTemp(String userId, Integer type){ + HisUserSupplierTemp userSupplier = new HisUserSupplierTemp(); + userSupplier.setUserId(userId); + if(this.getUserId()!=null){ + userSupplier.setSupplierId(Long.parseLong(this.getId())); + } + if(this.getId()!=null){ + userSupplier.setSupplierId(Long.parseLong(this.getId())); + } + userSupplier.setSupplierName(this.getName()); + userSupplier.setSupplierCode(this.getCode()); + userSupplier.setSaleRegionFirst(this.getRegionFirst()); + userSupplier.setSaleRegionSecond(this.getRegionSecond()); + userSupplier.setSaleRegionThird(this.getRegionThird()); + userSupplier.setSaleRegionFourthly(this.getRegionFourthly()); + userSupplier.setBizRegionFirst(this.getRegion2First()); + userSupplier.setBizRegionSecond(this.getRegion2Second()); + userSupplier.setBizRegionThird(this.getRegion2Third()); + 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); + userSupplier.setCooperatePauseFlag(this.cooperatePauseFlag); + userSupplier.setCooperatePauseFlagDate(this.getCooperatePauseFlagDate()); + userSupplier.setOrderOfflineFlag(this.orderOfflineFlag); + userSupplier.setOrderOnlineFlag(this.orderOnlineFlag); + return userSupplier; + } + + public String handleSaleRegionId(){ + if(isValid(this.getRegionLast())){ + return this.getRegionLast(); + }else if(isValid(this.getRegionFourthly())){ + return this.getRegionFourthly(); + }else if(isValid(this.getRegionThird())){ + return this.getRegionThird(); + }else if(isValid(this.getRegionSecond())){ + return this.getRegionSecond(); + }else if(isValid(this.getRegionFirst())){ + return this.getRegionFirst(); + }else { + return null; + } + } + + public String handleBizRegionId(){ + if(isValid(this.getRegion2Last())){ + return this.getRegion2Last(); + }else if(isValid(this.getRegion2Fourthly())){ + return this.getRegion2Fourthly(); + }else if(isValid(this.getRegion2Third())){ + return this.getRegion2Third(); + }else if(isValid(this.getRegion2Second())){ + return this.getRegion2Second(); + }else if(isValid(this.getRegion2First())){ + return this.getRegion2First(); + }else { + return null; + } + } + + private boolean isValid(String region){ + return StringUtils.hasText(region)&&!"0".equals(region); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierAddress.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierAddress.java new file mode 100644 index 0000000..f104546 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierAddress.java @@ -0,0 +1,129 @@ +package com.qs.serve.modules.bms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-10-21 + */ +@Data +@TableName("bms_supplier_address") +public class BmsSupplierAddress implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 供应商id */ + @NotNull(message = "供应商id不能为空") + private Long supplierId; + + /** 是否默认 */ + @NotNull(message = "是否默认不能为空") + private Integer defaultFlag; + + /** 省编码 */ + @Length(max = 20,message = "省编码长度不能超过20字") + private String provinceCode; + + /** 省 */ + @NotBlank(message = "省不能为空") + @Length(max = 12,message = "省长度不能超过12字") + private String province; + + /** 市编码 */ + @Length(max = 20,message = "市编码长度不能超过20字") + private String cityCode; + + /** 市 */ + @NotBlank(message = "市不能为空") + @Length(max = 20,message = "市长度不能超过20字") + private String city; + + /** 区编码 */ + @Length(max = 20,message = "区编码长度不能超过20字") + private String areaCode; + + /** 区 */ + @NotBlank(message = "区不能为空") + @Length(max = 20,message = "区长度不能超过20字") + private String area; + + /** 详细地址 */ + @NotBlank(message = "详细地址不能为空") + @Length(max = 255,message = "详细地址长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String detail; + + /** 手机号 */ + @NotBlank(message = "手机号不能为空") + @Length(max = 250,message = "手机号长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String phone; + + /** 收件人 */ + @NotBlank(message = "收件人不能为空") + @TableField(condition = SqlCondition.LIKE) + private String receiver; + + /** 物流系统的id */ + private String tmsSysId; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 客户名称 */ + @TableField(exist = false) + private String supplierName; + + /** 客户编码 */ + @TableField(exist = false) + private String supplierCode; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierBand.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierBand.java new file mode 100644 index 0000000..f3c09ca --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierBand.java @@ -0,0 +1,92 @@ +package com.qs.serve.modules.bms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-10-12 + */ +@Data +@TableName("bms_supplier_band") +public class BmsSupplierBand implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 供应商id */ + @NotNull(message = "供应商id不能为空") + private Long supplierId; + + /** 开户银行 */ + @NotBlank(message = "开户银行不能为空") + @Length(max = 20,message = "开户银行长度不能超过20字") + @TableField(condition = SqlCondition.LIKE) + private String cardBank; + + /** 银行卡号 */ + @NotBlank(message = "银行卡号不能为空") + @Length(max = 30,message = "银行卡号长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String cardNum; + + /** 持卡人 */ + @NotBlank(message = "持卡人不能为空") + @Length(max = 20,message = "持卡人长度不能超过20字") + @TableField(condition = SqlCondition.LIKE) + private String cardUser; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 客户名称 */ + @TableField(exist = false) + private String supplierName; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierChannel.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierChannel.java new file mode 100644 index 0000000..fd546b7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierChannel.java @@ -0,0 +1,91 @@ +package com.qs.serve.modules.bms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-11-03 + */ +@Data +@TableName("bms_supplier_channel") +public class BmsSupplierChannel implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 渠道id */ + @NotNull(message = "渠道id不能为空") + private Long channelId; + + /** 客户id */ + @NotNull(message = "客户id不能为空") + private Long supplierId; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 渠道名称 */ + @TableField(exist = false) + private String channelName; + + /** 渠道编码 */ + @TableField(exist = false) + private String channelCode; + + /** 渠道编码 */ + @TableField(exist = false) + private String channelType; + + /** 客户名称 */ + @TableField(exist = false) + private String supplierName; + + /** 客户编码 */ + @TableField(exist = false) + private String supplierCode; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierComRegion.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierComRegion.java new file mode 100644 index 0000000..8f9151e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierComRegion.java @@ -0,0 +1,93 @@ +package com.qs.serve.modules.bms.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 2023-12-30 + */ +@Data +@TableName("bms_supplier_com_region") +public class BmsSupplierComRegion implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 大区编码 */ + @Length(max = 255,message = "大区编码长度不能超过255字") + private String regionCode; + + /** 大区名称 */ + @Length(max = 255,message = "大区名称长度不能超过255字") + private String regionName; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + + public static BmsSupplierComRegion toNewObject(BmsSupplierComRegion source){ + BmsSupplierComRegion supplierComRegion = new BmsSupplierComRegion(); + supplierComRegion.setId(source.getId()); + supplierComRegion.setRegionCode(source.getRegionCode()); + supplierComRegion.setRegionName(source.getRegionName()); + supplierComRegion.setRemark(source.getRemark()); + supplierComRegion.setCreateTime(source.getCreateTime()); + supplierComRegion.setUpdateTime(source.getUpdateTime()); + supplierComRegion.setTenantId(source.getTenantId()); + supplierComRegion.setDelFlag(source.getDelFlag()); + supplierComRegion.setCreateBy(source.getCreateBy()); + supplierComRegion.setUpdateBy(source.getUpdateBy()); + return supplierComRegion; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierContacts.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierContacts.java new file mode 100644 index 0000000..c48dff7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierContacts.java @@ -0,0 +1,127 @@ +package com.qs.serve.modules.bms.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 com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.qs.serve.common.model.annotation.BusinessDifference; +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 2023-04-19 + */ +@Data +@TableName("bms_supplier_contacts") +public class BmsSupplierContacts implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 经销商id */ + private Long supplierId; + + /** 经销商名称 */ + @Length(max = 255,message = "经销商名称长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String supplierName; + + /** 经销商编码 */ + @Length(max = 255,message = "经销商编码长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String supplierCode; + + /** 联系号码 */ + @Length(max = 255,message = "联系号码长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + @BusinessDifference("联系号码") + private String contactsNumber; + + /** 联系名称 */ + @Length(max = 255,message = "联系名称长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + @BusinessDifference("联系名称") + private String contactsName; + + /** 联系岗位 */ + @Length(max = 255,message = "联系岗位长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + @BusinessDifference("联系岗位") + private String contactsPost; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonSerialize(using = LocalDateTimeSerializer.class) + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonSerialize(using = LocalDateTimeSerializer.class) + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + + public static BmsSupplierContacts toNewObject(BmsSupplierContacts source){ + BmsSupplierContacts supplierContacts = new BmsSupplierContacts(); + supplierContacts.setId(source.getId()); + supplierContacts.setSupplierId(source.getSupplierId()); + supplierContacts.setSupplierName(source.getSupplierName()); + supplierContacts.setSupplierCode(source.getSupplierCode()); + supplierContacts.setContactsNumber(source.getContactsNumber()); + supplierContacts.setContactsName(source.getContactsName()); + supplierContacts.setContactsPost(source.getContactsPost()); + supplierContacts.setCreateTime(source.getCreateTime()); + supplierContacts.setCreateBy(source.getCreateBy()); + supplierContacts.setUpdateTime(source.getUpdateTime()); + supplierContacts.setUpdateBy(source.getUpdateBy()); + supplierContacts.setTenantId(source.getTenantId()); + supplierContacts.setDelFlag(source.getDelFlag()); + return supplierContacts; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierStatement.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierStatement.java new file mode 100644 index 0000000..a6653fe --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierStatement.java @@ -0,0 +1,107 @@ +package com.qs.serve.modules.bms.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-03-22 + */ +@Data +@TableName("bms_supplier_statement") +public class BmsSupplierStatement implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + @NotNull + private String jslId; + + /** 供应商ID */ + @Length(max = 20,message = "供应商ID长度不能超过20字") + private String supplierId; + + /** 供应商编码 */ + @Length(max = 255,message = "供应商编码长度不能超过255字") + @NotNull + private String supplierCode; + + /** 供应商名称 */ + @Length(max = 255,message = "供应商名称长度不能超过255字") + private String supplierName; + + private String title; + /** 内容 */ + private String content; + + /** 状态 */ + @Length(max = 255,message = "状态长度不能超过255字") + private String status; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + + public static BmsSupplierStatement toNewObject(BmsSupplierStatement source){ + BmsSupplierStatement supplierStatement = new BmsSupplierStatement(); + supplierStatement.setId(source.getId()); + supplierStatement.setSupplierId(source.getSupplierId()); + supplierStatement.setSupplierCode(source.getSupplierCode()); + supplierStatement.setSupplierName(source.getSupplierName()); + supplierStatement.setContent(source.getContent()); + supplierStatement.setStatus(source.getStatus()); + supplierStatement.setCreateTime(source.getCreateTime()); + supplierStatement.setCreateBy(source.getCreateBy()); + supplierStatement.setUpdateTime(source.getUpdateTime()); + supplierStatement.setUpdateBy(source.getUpdateBy()); + supplierStatement.setTenantId(source.getTenantId()); + supplierStatement.setDelFlag(source.getDelFlag()); + return supplierStatement; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierTarget.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierTarget.java new file mode 100644 index 0000000..ac296b8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierTarget.java @@ -0,0 +1,77 @@ +package com.qs.serve.modules.bms.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 2023-09-13 + */ +@Data +@TableName("bms_supplier_target") +public class BmsSupplierTarget implements Serializable { + + private static final long serialVersionUID = 1L; + + /** */ + @TableId(type = IdType.AUTO) + private Long id; + + /** */ + private Long supplierId; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String supplierCode; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String supplierName; + + /** 对应tbs_schedule的ID */ + private Long scheduleId; + + /** 对应tbs_schedule_item的ID */ + private Long scheduleItemId; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String scheduleItemName; + + /** */ + private BigDecimal targetDispatchAmount; + + /** */ + private BigDecimal targetCostAmount; + + + public static BmsSupplierTarget toNewObject(BmsSupplierTarget source){ + BmsSupplierTarget supplierTarget = new BmsSupplierTarget(); + supplierTarget.setId(source.getId()); + supplierTarget.setSupplierId(source.getSupplierId()); + supplierTarget.setSupplierCode(source.getSupplierCode()); + supplierTarget.setSupplierName(source.getSupplierName()); + supplierTarget.setScheduleId(source.getScheduleId()); + supplierTarget.setScheduleItemId(source.getScheduleItemId()); + supplierTarget.setScheduleItemName(source.getScheduleItemName()); + supplierTarget.setTargetDispatchAmount(source.getTargetDispatchAmount()); + supplierTarget.setTargetCostAmount(source.getTargetCostAmount()); + return supplierTarget; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierVisit.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierVisit.java new file mode 100644 index 0000000..aeabf5c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierVisit.java @@ -0,0 +1,106 @@ +package com.qs.serve.modules.bms.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 2023-03-28 + */ +@Data +@TableName("bms_supplier_visit") +public class BmsSupplierVisit implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 供应商id */ + @NotNull(message = "供应商id不能为空") + private String supplierId; + + /** 拜访次数 */ + @NotNull(message = "拜访次数不能为空") + private Integer visitCount; + + /** 上次拜访时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime lastVisitTime; + + /** 下次拜访时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate nextVisitDate; + + + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + + public static BmsSupplierVisit toNewObject(BmsSupplierVisit source){ + BmsSupplierVisit supplierVisit = new BmsSupplierVisit(); + supplierVisit.setId(source.getId()); + supplierVisit.setSupplierId(source.getSupplierId()); + supplierVisit.setVisitCount(source.getVisitCount()); + supplierVisit.setLastVisitTime(source.getLastVisitTime()); + supplierVisit.setRemark(source.getRemark()); + supplierVisit.setCreateTime(source.getCreateTime()); + supplierVisit.setUpdateTime(source.getUpdateTime()); + supplierVisit.setTenantId(source.getTenantId()); + supplierVisit.setDelFlag(source.getDelFlag()); + supplierVisit.setCreateBy(source.getCreateBy()); + supplierVisit.setUpdateBy(source.getUpdateBy()); + return supplierVisit; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierVisitAddress.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierVisitAddress.java new file mode 100644 index 0000000..f398d99 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierVisitAddress.java @@ -0,0 +1,136 @@ +package com.qs.serve.modules.bms.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 com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import com.qs.serve.common.model.annotation.BusinessDifference; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +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 2023-03-28 + */ +@Data +@TableName(value = "bms_supplier_visit_address",autoResultMap = true) +public class BmsSupplierVisitAddress implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 供应商id */ + @NotNull(message = "供应商id不能为空") + private Long supplierId; + + /** 图片 */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] photos; + + /** 详细地址 */ + @NotBlank(message = "详细地址不能为空") + @Length(max = 255,message = "详细地址长度不能超过255字") + @BusinessDifference("详细地址") + private String addressDetail; + + /** 地址类型 */ + @BusinessDifference("地址类型") + private String addressType; + + @BusinessDifference("定位地址") + private String localAddress; + + private Integer defaultFlag; + + /** 纬度 */ + @Length(max = 255,message = "纬度长度不能超过255字") + @BusinessDifference("纬度") + private String localX; + + /** 经度 */ + @Length(max = 255,message = "经度长度不能超过255字") + @BusinessDifference("经度") + private String localY; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonSerialize(using = LocalDateTimeSerializer.class) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonSerialize(using = LocalDateTimeSerializer.class) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + @TableField(exist = false) + private String supplierName; + + @TableField(exist = false) + private String supplierCode; + + public static BmsSupplierVisitAddress toNewObject(BmsSupplierVisitAddress source){ + BmsSupplierVisitAddress supplierVisitAddress = new BmsSupplierVisitAddress(); + supplierVisitAddress.setId(source.getId()); + supplierVisitAddress.setSupplierId(source.getSupplierId()); + supplierVisitAddress.setAddressDetail(source.getAddressDetail()); + supplierVisitAddress.setLocalX(source.getLocalX()); + supplierVisitAddress.setLocalY(source.getLocalY()); + supplierVisitAddress.setRemark(source.getRemark()); + supplierVisitAddress.setCreateTime(source.getCreateTime()); + supplierVisitAddress.setUpdateTime(source.getUpdateTime()); + supplierVisitAddress.setTenantId(source.getTenantId()); + supplierVisitAddress.setDelFlag(source.getDelFlag()); + supplierVisitAddress.setCreateBy(source.getCreateBy()); + supplierVisitAddress.setUpdateBy(source.getUpdateBy()); + return supplierVisitAddress; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierVisitForm.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierVisitForm.java new file mode 100644 index 0000000..764b1b5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierVisitForm.java @@ -0,0 +1,105 @@ +package com.qs.serve.modules.bms.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 2023-03-28 + */ +@Data +@TableName("bms_supplier_visit_form") +public class BmsSupplierVisitForm implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 标题 */ + @NotBlank(message = "标题不能为空") + @Length(max = 40,message = "标题长度不能超过40字") + @TableField(condition = SqlCondition.LIKE) + private String title; + + /** 子标题 */ + @Length(max = 255,message = "子标题长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String subtitle; + + /** 描述 */ + @Length(max = 255,message = "描述长度不能超过255字") + private String descr; + + /** 表单json */ + @NotBlank(message = "表单json不能为空") + private String formContext; + + /** 表单版本 */ + private Integer version; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + + public static BmsSupplierVisitForm toNewObject(BmsSupplierVisitForm source){ + BmsSupplierVisitForm supplierVisitForm = new BmsSupplierVisitForm(); + supplierVisitForm.setId(source.getId()); + supplierVisitForm.setTitle(source.getTitle()); + supplierVisitForm.setSubtitle(source.getSubtitle()); + supplierVisitForm.setDescr(source.getDescr()); + supplierVisitForm.setFormContext(source.getFormContext()); + supplierVisitForm.setVersion(source.getVersion()); + supplierVisitForm.setCreateTime(source.getCreateTime()); + supplierVisitForm.setCreateBy(source.getCreateBy()); + supplierVisitForm.setUpdateTime(source.getUpdateTime()); + supplierVisitForm.setUpdateBy(source.getUpdateBy()); + supplierVisitForm.setTenantId(source.getTenantId()); + supplierVisitForm.setDelFlag(source.getDelFlag()); + return supplierVisitForm; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierVisitType.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierVisitType.java new file mode 100644 index 0000000..913ecfd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/BmsSupplierVisitType.java @@ -0,0 +1,101 @@ +package com.qs.serve.modules.bms.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 2023-03-28 + */ +@Data +@TableName("bms_supplier_visit_type") +public class BmsSupplierVisitType implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 类型名称 */ + @Length(max = 255,message = "类型名称长度不能超过255字") + private String typeName; + + /** 模板id */ + private Long typeFormId; + + /** 排序 */ + private Integer sort; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** + * 表单信息 + */ + @TableField(exist = false) + private Object formInfo; + + public static BmsSupplierVisitType toNewObject(BmsSupplierVisitType source){ + BmsSupplierVisitType supplierVisitType = new BmsSupplierVisitType(); + supplierVisitType.setId(source.getId()); + supplierVisitType.setTypeName(source.getTypeName()); + supplierVisitType.setTypeFormId(source.getTypeFormId()); + supplierVisitType.setSort(source.getSort()); + supplierVisitType.setRemark(source.getRemark()); + supplierVisitType.setCreateTime(source.getCreateTime()); + supplierVisitType.setUpdateTime(source.getUpdateTime()); + supplierVisitType.setTenantId(source.getTenantId()); + supplierVisitType.setDelFlag(source.getDelFlag()); + supplierVisitType.setCreateBy(source.getCreateBy()); + supplierVisitType.setUpdateBy(source.getUpdateBy()); + return supplierVisitType; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsAccountUserBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsAccountUserBo.java new file mode 100644 index 0000000..a891ba5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsAccountUserBo.java @@ -0,0 +1,36 @@ +package com.qs.serve.modules.bms.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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; + +/** + * 账套的用户 Bo + * @author YenHex + * @since 2024-04-11 + */ +@Data +public class BmsAccountUserBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 账套ID */ + private Long bookId; + + /** 用户ID列表 */ + private List userIds; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsApplyMessageTestBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsApplyMessageTestBo.java new file mode 100644 index 0000000..e8e8987 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsApplyMessageTestBo.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.bms.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2023/9/19 + */ +@Data +public class BmsApplyMessageTestBo { + + /** + * targetType=CostBill,targetId为费用申请 cost_apply_id + * targetType=CheckCost,targetId为活动 activity_id + */ + @NotNull + String targetId; + + @NotNull + String targetType; + + String testJsString; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsCenterExtendBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsCenterExtendBo.java new file mode 100644 index 0000000..9063f16 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsCenterExtendBo.java @@ -0,0 +1,76 @@ +package com.qs.serve.modules.bms.entity.bo; + +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; + +/** + * @author YenHex + * @since 2023/5/30 + */ +@Data +public class BmsCenterExtendBo { + + /** + * 后继成本中心id(仅用于更新) + */ + Long id; + + /** 成本中心类型(更新可忽略) + center, + customer, + bizRegion, + saleRegion, + */ + String type; + + String sourceCenterId; + + List targetCenters; + + /** + * 继承时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + LocalDate extendDate; + + @Data + public static class Item{ + + /** + * 后继成本中心id(仅用于更新) + */ + Long id; + + /** + * 权重 + */ + BigDecimal weightRate; + + String targetCenterId; + + /** + * 当值=1,更新用户列表(仅用于更新) + */ + Integer updateUserListFlag; + + List userList; + + } + + @Data + public static class AllocationUser{ + + /** + * 权重 + */ + BigDecimal weightRate; + + String userId; + + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsChannel4ExcelBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsChannel4ExcelBo.java new file mode 100644 index 0000000..9e97902 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsChannel4ExcelBo.java @@ -0,0 +1,53 @@ +package com.qs.serve.modules.bms.entity.bo; + +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.NotBlank; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 渠道 实体类 + * @author YenHex + * @since 2022-11-07 + */ +@Data +public class BmsChannel4ExcelBo implements Serializable { + + + /** type */ + /** 增加 修改 删除 */ + private String type; + + /** 渠道编码 */ + private String channelCode; + + /** 渠道名称 */ + private String channelName; + + /** 渠道类型(读取数据字典) */ + private String channelType; + + /** 备注 */ + private String remark; + + private Integer costFlag; + + /** 所属租户 */ + private String tenantId; + +// private List supplierCodes; + + private List supplierNames; + + private String errorInfo; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsChannelPoint4ExcelBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsChannelPoint4ExcelBo.java new file mode 100644 index 0000000..81fddaa --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsChannelPoint4ExcelBo.java @@ -0,0 +1,96 @@ +package com.qs.serve.modules.bms.entity.bo; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import com.qs.serve.common.model.annotation.BusinessDifference; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 渠道站点 实体类 + * @author YenHex + * @since 2022-11-07 + */ +@Data +public class BmsChannelPoint4ExcelBo implements Serializable { + + private String type; + + private String channelCode; + + private String channelName; + + private String pointCode; + + /** 站点名称 */ + private String pointName; + + /** 店铺面积 */ + private String shopArea; + + /** 收银台数量 */ + private Integer countCheckstand; + + /** 站点等级(读取字典值) */ + private String pointLevel; + + /** 站点类型(读取字典值) */ + private String pointType; + + /** 详细地址 */ + @Length(max = 255,message = "详细地址长度不能超过255字") + @BusinessDifference("详细地址") + private String address; + + /** 行政区域id */ + private String bizRegionCode; + + /** 行政区域 */ + @Length(max = 255,message = "行政区域长度不能超过255字") + @BusinessDifference("行政区域") + private String bizRegionPath; + + private String bizRegionPathIds; + + /** 纬度 */ + @Length(max = 255,message = "纬度长度不能超过255字") + private String localX; + + /** 经度 */ + @Length(max = 255,message = "经度长度不能超过255字") + private String localY; + + /** 地图地址 */ + @Length(max = 255,message = "地图地址长度不能超过255字") + private String mapAddress; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 所属租户 */ + private String tenantId; + + /** 可投放费用标识 */ + private Integer costFlag; + + private String errorInfo; + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsChannelPointBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsChannelPointBo.java new file mode 100644 index 0000000..5198fbc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsChannelPointBo.java @@ -0,0 +1,93 @@ +package com.qs.serve.modules.bms.entity.bo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/11/7 + */ +@Data +public class BmsChannelPointBo { + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 渠道名称 */ + @NotNull(message = "渠道名称不能为空") + private Long channelId; + + + /** 站点名称 */ + @NotBlank(message = "站点名称不能为空") + @Length(max = 30,message = "站点名称长度不能超过30字") + private String pointName; + + /** 店铺面积 */ + @NotBlank(message = "店铺面积不能为空") + @Length(max = 255,message = "店铺面积长度不能超过255字") + private String shopArea; + + /** 收银台数量 */ + @NotNull(message = "收银台数量不能为空") + private Integer countCheckstand; + + /** 站点等级(读取字典值) */ + @Length(max = 255,message = "站点等级(读取字典值)长度不能超过255字") + private String pointLevel; + + /** 站点类型(读取字典值) */ + private String pointType; + + /** 详细地址 */ + @Length(max = 255,message = "详细地址长度不能超过255字") + private String address; + + /** 销售区域id */ + private String saleRegionId; + + /** 行政区域id */ + private String bizRegionId; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 可投放费用标识 */ + private Integer costFlag; + + /** 可拜访网点 */ + private Integer visitFlag; + + /** 纬度 */ + @Length(max = 255,message = "纬度长度不能超过255字") + private String localX; + + /** 经度 */ + @Length(max = 255,message = "经度长度不能超过255字") + private String localY; + + /** 地图地址 */ + @Length(max = 255,message = "地图地址长度不能超过255字") + private String mapAddress; + + /** 行政区域 */ + @Length(max = 255,message = "行政区域长度不能超过255字") + private String bizRegionPath; + + private String bizRegionPathIds; + + + /** 图片多张用句号隔开 */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] photos; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsChannelPointMapInfoBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsChannelPointMapInfoBo.java new file mode 100644 index 0000000..76644c5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsChannelPointMapInfoBo.java @@ -0,0 +1,41 @@ +package com.qs.serve.modules.bms.entity.bo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/11/7 + */ +@Data +public class BmsChannelPointMapInfoBo { + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + + /** 纬度 */ + @Length(max = 255,message = "纬度长度不能超过255字") + private String localX; + + /** 经度 */ + @Length(max = 255,message = "经度长度不能超过255字") + private String localY; + + /** 地图地址 */ + @Length(max = 255,message = "地图地址长度不能超过255字") + private String mapAddress; + + private String address; + + private String adCode; + + private String[] photos; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsCostCenterBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsCostCenterBo.java new file mode 100644 index 0000000..61099d8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsCostCenterBo.java @@ -0,0 +1,54 @@ +package com.qs.serve.modules.bms.entity.bo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author YenHex + * @since 2022/11/11 + */ +@Data +public class BmsCostCenterBo { + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 编码 */ + @NotBlank(message = "编码不能为空") + @Length(max = 20,message = "编码长度不能超过20字") + private String code; + + /** 名称 */ + @NotBlank(message = "名称不能为空") + @Length(max = 20,message = "名称长度不能超过20字") + private String name; + + /** 层级 */ +// @NotNull(message = "层级不能为空") + private Integer level; + + /** 父级节点 */ + @NotNull(message = "父级节点不能为空") + private Long pid; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 是否所有人可见 */ + private Integer visibleFlag; + + /** 是否销售费用 */ + private Integer saleCostFlag; + + /** 销售区域id */ + private List saleRegionId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsMasterUserBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsMasterUserBo.java new file mode 100644 index 0000000..d307082 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsMasterUserBo.java @@ -0,0 +1,39 @@ +package com.qs.serve.modules.bms.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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; + +/** + * 负责人 Bo + * @author YenHex + * @since 2022-11-10 + */ +@Data +public class BmsMasterUserBo implements Serializable { + + /** id列表 */ + private List targetIds; + + /** 类型 */ + @NotNull(message = "类型不能为空") + private String type; + + /** 用户id列表 */ + @NotNull(message = "用户id不能为空") + private List userIds; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsRegionBatchBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsRegionBatchBo.java new file mode 100644 index 0000000..6e47f3d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsRegionBatchBo.java @@ -0,0 +1,50 @@ +package com.qs.serve.modules.bms.entity.bo; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author YenHex + * @since 2022/10/10 + */ +@Data +public class BmsRegionBatchBo { + + private List regionList; + + @Data + public static class BmsRegionBo{ + /** id */ + private String id; + + /** 名称 */ + @Length(max = 20,message = "名称长度不能超过20字") + private String name; + + /** 编码 */ + @Length(max = 20,message = "编码长度不能超过20字") + private String code; + + /** 父级ID */ + @Length(max = 32,message = "父级ID长度不能超过32字") + private String pid; + + /** 别名 */ + private String aliasRegion; + + private Integer stopFlag; + + private String remark; + + /** 系统编码1 */ + private String sysCode1; + /** 系统编码2 */ + private String sysCode2; + /** 系统编码3 */ + private String sysCode3; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsRegionUserBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsRegionUserBo.java new file mode 100644 index 0000000..c859c5d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsRegionUserBo.java @@ -0,0 +1,40 @@ +package com.qs.serve.modules.bms.entity.bo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/11/2 + */ +@Data +public class BmsRegionUserBo { + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 类型:0=销售区域;1=行政区域 */ + @NotNull(message = "类型:0=销售区域;1=行政区域不能为空") + private Integer type; + + /** 区域id */ + @NotBlank(message = "区域id不能为空") + @Length(max = 32,message = "区域id长度不能超过32字") + private String regionId; + + /** 用户id */ + @NotBlank(message = "用户id不能为空") + @Length(max = 32,message = "用户id长度不能超过32字") + private String userId; + + /** 主要负责人 */ + @NotNull(message = "主要负责人不能为空") + private Integer masterFlag; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsRegionUserSaveBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsRegionUserSaveBo.java new file mode 100644 index 0000000..5a261ce --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsRegionUserSaveBo.java @@ -0,0 +1,28 @@ +package com.qs.serve.modules.bms.entity.bo; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author YenHex + * @since 2022/11/2 + */ +@Data +public class BmsRegionUserSaveBo { + + /** 区域id列表 */ + private List regionIds; + + /** 类型:0=销售区域;1=行政区域 */ + @NotNull(message = "类型:0=销售区域;1=行政区域不能为空") + private Integer type; + + /** 用户id列表 */ + @NotNull(message = "用户id不能为空") + private List userIds; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsRuleBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsRuleBo.java new file mode 100644 index 0000000..b664b80 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsRuleBo.java @@ -0,0 +1,32 @@ +package com.qs.serve.modules.bms.entity.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author YenHex + * @since 2022/10/17 + */ +@Data +public class BmsRuleBo { + + /** + * 规则id + */ + @NotNull + private Long id; + + private List skuIds; + + /** 只售区域id */ + private List onlySaleRegionIds; + + /** 禁售区域id */ + private List banSaleRegionIds; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSkuSupplierBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSkuSupplierBo.java new file mode 100644 index 0000000..15815bd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSkuSupplierBo.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.bms.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/10/17 + */ +@Data +public class BmsSkuSupplierBo { + + /** skuId */ + @NotNull(message = "skuId不能为空") + private Long skuId; + + /** 供应商id */ + @NotNull(message = "供应商id不能为空") + private Long supplierId; + + /** 禁售状态 0可售 1禁售 */ + @NotNull(message = "禁售状态不能为空") + private Integer banStatus; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSkuSupplierBo2.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSkuSupplierBo2.java new file mode 100644 index 0000000..a29a27c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSkuSupplierBo2.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.bms.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/10/17 + */ +@Data +public class BmsSkuSupplierBo2 { + + /** 商品Id */ + @NotNull(message = "skuId不能为空") + private Long spuId; + + /** 供应商id */ + @NotNull(message = "供应商id不能为空") + private Long supplierId; + + /** 禁售状态 0可售 1禁售 */ + @NotNull(message = "禁售状态不能为空") + private Integer banStatus; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierBatchBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierBatchBo.java new file mode 100644 index 0000000..6cbdc81 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierBatchBo.java @@ -0,0 +1,51 @@ +package com.qs.serve.modules.bms.entity.bo; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import java.util.List; + +/** + * @author YenHex + * @since 2022/10/13 + */ +@Data +public class BmsSupplierBatchBo { + + @NotNull + private List supplierList; + + @Data + public static class BmsSupplierDto{ + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + @Length(max = 20,message = "客户编码长度不能超过20字") + private String code; + + /** 客户父级编码(空为无父级) */ + private String parentCode; + + /** 销售区域编码 */ + private String regionCode; + + /** 行政区域编码 */ + private String region2Code; + + /** 客户地址 */ + private String address; + + /** 客户名称 */ + @NotBlank(message = "名称不能为空") + private String name; + + /** 账套编码 */ + @NotBlank(message = "账套编码不能为空") + private String belong; + + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierBo.java new file mode 100644 index 0000000..f840d63 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierBo.java @@ -0,0 +1,119 @@ +package com.qs.serve.modules.bms.entity.bo; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * @author YenHex + * @since 2022/10/11 + */ +@Data +public class BmsSupplierBo { + + /** id */ + private String id; + + /** 销售区域ID */ + @NotNull(message = "销售区域不能为空") + private String regionId; + + /** 行政区域ID */ + @NotNull(message = "行政区域不能为空") + private String regionId2; + + /** 详细地址 */ + private String address; + + /** 名称 */ + @NotBlank(message = "名称不能为空") + private String name; + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + private String code; + + /** 父级id,0表总公司无上级 */ + private Long pid; + + /** 负责人ID */ + private String mgrId; + + /** 其它负责人 */ + private String[] otherMgrIds; + + /** 可投放费用标识 */ + private Integer costFlag; + + /** 是否供应商 */ + private Integer supplierFlag; + + /** 供应商是否填写信息 */ + @NotNull(message = "供应商是否填写信息不能为空") + private Integer supplierInfoFlag; + + /** 供应商税号 */ + @Length(max = 255,message = "供应商税号长度不能超过255字") + private String supplierTaxNumber; + + /** 供应商联系人 */ + @Length(max = 255,message = "供应商联系人长度不能超过255字") + private String supplierUser; + + /** 营业执照地址 */ + @Length(max = 255,message = "营业执照地址长度不能超过255字") + private String supplierLicenseImg; + + /** 附件列表 */ + private String[] supplierAttachIds; + + private String belong; + + /** 闭户 */ + private Integer stopFlag; + + /** 闭户日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime stopFlagDate; + + /** 暂不合作 */ + private Integer cooperatePauseFlag; + + /** 暂不合作日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime cooperatePauseFlagDate; + + private String comRegion; + + private String comRegionCode; + + /** + * CD订单 + * 0-> 非必填 + * 1-> 下单时必须填写CD订单信息 + */ + private Integer cdOrderFlag; + + /** 运输方式是否可见 */ + private Integer transportVisible; + + /** 开始户时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime openTime; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierChannelBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierChannelBo.java new file mode 100644 index 0000000..8c94902 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierChannelBo.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.bms.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author YenHex + * @since 2022/11/10 + */ +@Data +public class BmsSupplierChannelBo { + + /** 渠道id */ + @NotNull(message = "渠道id不能为空") + private List channelIds; + + /** 客户id */ + @NotNull(message = "客户id不能为空") + private List supplierIds; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierContactsBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierContactsBo.java new file mode 100644 index 0000000..3230ba1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierContactsBo.java @@ -0,0 +1,50 @@ +package com.qs.serve.modules.bms.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 供应商联系人 Bo + * @author YenHex + * @since 2023-04-19 + */ +@Data +public class BmsSupplierContactsBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 经销商id */ + private Long supplierId; + + /** 联系号码 */ + @Length(max = 255,message = "联系号码长度不能超过255字") + private String contactsNumber; + + /** 联系名称 */ + @Length(max = 255,message = "联系名称长度不能超过255字") + private String contactsName; + + /** 联系岗位 */ + @Length(max = 255,message = "联系岗位长度不能超过255字") + private String contactsPost; + + /** 备注 */ + private String remark; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierExcelBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierExcelBo.java new file mode 100644 index 0000000..e7b5f02 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierExcelBo.java @@ -0,0 +1,184 @@ +package com.qs.serve.modules.bms.entity.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * @author YenHex + * @since 2022/10/11 + */ +@Data +public class BmsSupplierExcelBo { + + // 序号 + private String id; + + private String type; + + // 客户名称 + private String customerName; + + // 客户编码 + private String customerCode; + + // 销售大区名称 + private String firstLevelSalesRegionName; + + // 销售区域名称 + private String salesRegionName; + + // 省 + private String firstLevelAdministrativeRegionName; + + // 市 + private String secondaryLevelAdministrativeRegionName; + + // 区 + private String administrativeRegionName; + + // 是否供应商 + private Integer isSupplier; + + // 所属公司 + private String affiliatedCompany; + + // 主要负责人 + private String mainHeadName; + + private String mainHeadCode; + + // 次要负责人 + private String minorHeadNames; + + private String minorHeadCodes; + // 是否可投放费用 + private Integer isExpendableExpense; + + // 闭户状态 + private Integer closeAccountStatus; + + /** + * CD订单 + * 0-> 非必填 + * 1-> 下单时必须填写CD订单信息 + */ + private Integer cdOrderFlag; + + /** 运输方式是否可见 */ + private Integer transportVisible; + + // 闭户日期 + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime closeAccountDate; + + // 暂不合作状态 + private Integer suspendCooperationStatus; + + // 暂不合作日期 + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime suspendCooperationDate; + + /** 供应商是否填写信息 */ + @NotNull(message = "供应商是否填写信息不能为空") + private Integer supplierInfoFlag; + + /** 供应商税号 */ + @Length(max = 255,message = "供应商税号长度不能超过255字") + private String supplierTaxNumber; + + /** 供应商联系人 */ + @Length(max = 255,message = "供应商联系人长度不能超过255字") + private String supplierUser; + + /** 营业执照地址 */ + @Length(max = 255,message = "营业执照地址长度不能超过255字") + private String supplierLicenseImg; + + // 创建时间 + private LocalDateTime createTime; + + // 更新时间 + private LocalDateTime updateTime; + + private String errorInfo; + + public static BmsSupplierExcelBo toExcelBo(BmsSupplier bmsSupplier){ + BmsSupplierExcelBo bo = new BmsSupplierExcelBo(); + bo.setId(bmsSupplier.getId()); + bo.setCustomerName(bmsSupplier.getName()); + bo.setCustomerCode(bmsSupplier.getCode()); + bo.setIsSupplier(bmsSupplier.getSupplierFlag()); + bo.setSupplierInfoFlag(bmsSupplier.getSupplierInfoFlag()==null?0:bmsSupplier.getSupplierInfoFlag()); + bo.setSupplierTaxNumber(bmsSupplier.getSupplierTaxNumber()); + bo.setSupplierUser(bmsSupplier.getSupplierUser()); + bo.setSupplierLicenseImg(bmsSupplier.getSupplierLicenseImg()); + bo.setCdOrderFlag(bmsSupplier.getCdOrderFlag()); + bo.setTransportVisible(bmsSupplier.getTransportVisible()==null?0:bmsSupplier.getTransportVisible()); + if(bmsSupplier.getRegionFirstInfo()!=null) { + BmsRegion firstRegion = (BmsRegion)bmsSupplier.getRegionFirstInfo(); + bo.setFirstLevelSalesRegionName(firstRegion.getName()); + } + if(bmsSupplier.getRegionSecondInfo()!=null) { + BmsRegion secRegion = (BmsRegion)bmsSupplier.getRegionSecondInfo(); + bo.setSalesRegionName(secRegion.getName()); + } + if(bmsSupplier.getRegionThirdInfo()!=null) { + BmsRegion secRegion = (BmsRegion)bmsSupplier.getRegionThirdInfo(); + bo.setSalesRegionName(secRegion.getName()); + } + if(bmsSupplier.getRegionFourthlyInfo()!=null) { + BmsRegion secRegion = (BmsRegion)bmsSupplier.getRegionFourthlyInfo(); + if(StringUtils.hasText(secRegion.getName())){ + bo.setSalesRegionName(secRegion.getName()); + } + } + if(bmsSupplier.getRegion2FirstInfo()!=null) { + BmsRegion2 first2Region = (BmsRegion2)bmsSupplier.getRegion2FirstInfo(); + bo.setFirstLevelAdministrativeRegionName(first2Region.getName()); + } + if(bmsSupplier.getRegion2SecondInfo()!=null) { + BmsRegion2 sec2Region = (BmsRegion2)bmsSupplier.getRegion2SecondInfo(); + bo.setSecondaryLevelAdministrativeRegionName(sec2Region.getName()); + } + if(bmsSupplier.getRegion2ThirdInfo()!=null) { + BmsRegion2 third2Region = (BmsRegion2)bmsSupplier.getRegion2ThirdInfo(); + bo.setAdministrativeRegionName(third2Region.getName()); + } + bo.setIsSupplier(bmsSupplier.getSupplierFlag()); + bo.setAffiliatedCompany(bmsSupplier.getBelong()); + if(StringUtils.hasText(bmsSupplier.getUserName())) { + bo.setMainHeadName(bmsSupplier.getUserName().replaceAll(",", ";")); + } + if(StringUtils.hasText(bmsSupplier.getUserCode())) { + bo.setMainHeadCode(bmsSupplier.getUserCode().replaceAll(",", ";")); + } + if(StringUtils.hasText(bmsSupplier.getOtherUserNames())) { + bo.setMinorHeadNames(bmsSupplier.getOtherUserNames().replaceAll(",", ";")); + } + if(StringUtils.hasText(bmsSupplier.getOtherUserCodes())) { + bo.setMinorHeadCodes(bmsSupplier.getOtherUserCodes().replaceAll(",", ";")); + } + bo.setIsExpendableExpense(bmsSupplier.getCostFlag()); + bo.setCloseAccountDate(bmsSupplier.getStopFlagDate()); + bo.setCloseAccountStatus(bmsSupplier.getStopFlag()); + bo.setSuspendCooperationDate(bmsSupplier.getCooperatePauseFlagDate()); + bo.setSuspendCooperationStatus(bmsSupplier.getCooperatePauseFlag()); + + bo.setCreateTime(bmsSupplier.getCreateTime()); + bo.setUpdateTime(bmsSupplier.getUpdateTime()); + return bo; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierParentBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierParentBo.java new file mode 100644 index 0000000..02c6b76 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierParentBo.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.bms.entity.bo; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/10/11 + */ +@Data +public class BmsSupplierParentBo { + + /** id */ + @NotBlank + private String id; + + /** 父级id,0表总公司无上级 */ + private String pid; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierVisitDefaultAddressBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierVisitDefaultAddressBo.java new file mode 100644 index 0000000..12b69e7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/bo/BmsSupplierVisitDefaultAddressBo.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.entity.bo; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/4/21 + */ +@Data +public class BmsSupplierVisitDefaultAddressBo { + + private String addressId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsBizRegionTreeSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsBizRegionTreeSo.java new file mode 100644 index 0000000..aa359b0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsBizRegionTreeSo.java @@ -0,0 +1,44 @@ +package com.qs.serve.modules.bms.entity.so; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 后继成本中心 查询参数 + * @author YenHex + * @since 2023-05-30 + */ +@Data +public class BmsBizRegionTreeSo implements Serializable { + + private static final long serialVersionUID = 1L; + +// * @param listUserFlag 加载我负责的用户所属的区域 +// * @param loadByCurrent 值=1,过滤当前用户负责数据(优先级最高) +// * @param supplierId +// * @param stopFlag (0,1)是否停用,2->加载所有 + + private Integer listUserFlag; + + private Integer loadByCurrent; + + private String supplierId; + + private Integer onlySupplierFlag; + + private Integer type; + + private String targetId; + + @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; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsCenterExtendSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsCenterExtendSo.java new file mode 100644 index 0000000..c3c83d2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsCenterExtendSo.java @@ -0,0 +1,55 @@ +package com.qs.serve.modules.bms.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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 2023-05-30 + */ +@Data +public class BmsCenterExtendSo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 来源id */ + private Long sourceId; + + /** 成本中心类型 */ + private String centerType; + + /** 成本中心id */ + private String centerId; + + /** 成本中心编码 */ + private String centerCode; + + /** 成本中心名称 */ + private String centerName; + + /** 开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + /** 结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime stopTime; + + /** 结束标识 */ + private Integer stopFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsCostCenterTreeSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsCostCenterTreeSo.java new file mode 100644 index 0000000..89719ae --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsCostCenterTreeSo.java @@ -0,0 +1,33 @@ +package com.qs.serve.modules.bms.entity.so; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 后继成本中心 查询参数 + * @author YenHex + * @since 2023-05-30 + */ +@Data +public class BmsCostCenterTreeSo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer loadByCurrent; + + private Integer type; + + private String targetId; + + @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; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsPointVisitSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsPointVisitSo.java new file mode 100644 index 0000000..fb3913c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsPointVisitSo.java @@ -0,0 +1,28 @@ +package com.qs.serve.modules.bms.entity.so; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/4/7 + */ +@Data +public class BmsPointVisitSo { + + String pointCode; + + String pointName; + + Double localY; + + Double localX; + + /** 忽略这个参数,后端设值 */ + String userId; + + /** 忽略这个参数,后端设值 */ + String tenantId; + + Integer visitFlag; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsSaleRegionTreeSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsSaleRegionTreeSo.java new file mode 100644 index 0000000..5e2ab12 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsSaleRegionTreeSo.java @@ -0,0 +1,44 @@ +package com.qs.serve.modules.bms.entity.so; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 后继成本中心 查询参数 + * @author YenHex + * @since 2023-05-30 + */ +@Data +public class BmsSaleRegionTreeSo implements Serializable { + + private static final long serialVersionUID = 1L; + +// * @param listUserFlag 加载我负责的用户所属的区域 +// * @param loadByCurrent 值=1,过滤当前用户负责数据(优先级最高) +// * @param supplierId +// * @param stopFlag (0,1)是否停用,2->加载所有 + + private Integer listUserFlag; + + private Integer loadByCurrent; + + private String supplierId; + + private Integer stopFlag; + + private Integer type; + + private String targetId; + + @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; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsSupplierContactsSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsSupplierContactsSo.java new file mode 100644 index 0000000..c511ae2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsSupplierContactsSo.java @@ -0,0 +1,47 @@ +package com.qs.serve.modules.bms.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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 2023-04-19 + */ +@Data +public class BmsSupplierContactsSo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 经销商名称 */ + private String supplierName; + + private Long supplierId; + + /** 经销商编码 */ + private String supplierCode; + + /** 联系号码 */ + private String contactsNumber; + + /** 联系名称 */ + private String contactsName; + + /** 联系岗位 */ + private String contactsPost; + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsSupplierSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsSupplierSo.java new file mode 100644 index 0000000..f32d8c9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsSupplierSo.java @@ -0,0 +1,51 @@ +package com.qs.serve.modules.bms.entity.so; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import com.qs.serve.modules.his.entity.HisUserSupplier; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 供应商 实体类 + * @author YenHex + * @since 2022-10-11 + */ +@Data +public class BmsSupplierSo implements Serializable { + + + /** 名称 */ + @NotBlank(message = "名称不能为空") + @Length(max = 20,message = "名称长度不能超过20字") + private String name; + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + @Length(max = 20,message = "客户编码长度不能超过20字") + private String code; + + /** 生成费用开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime queryStartTime; + + /** 生成费用结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime queryEndTime; + + private Integer loadChild; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsSupplierVisitSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsSupplierVisitSo.java new file mode 100644 index 0000000..a69fcd7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/so/BmsSupplierVisitSo.java @@ -0,0 +1,55 @@ +package com.qs.serve.modules.bms.entity.so; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2023/3/28 + */ +@Data +public class BmsSupplierVisitSo { + + /** + * 供应商名称 + */ + String supplierName; + + /** + * 供应商编码 + */ + String supplierCode; + + /** + * 供应商地址 + */ + String address; + + /** + * 搜索值 + */ + String searchValue; + + Double localY; + + Double localX; + + /** 翻页参数 */ + private Integer pageNum; + + private Integer pageRow; + + /** 翻页参数2 */ + private Integer pageSize; + + + /** 闭户 */ + private Integer stopFlag; + + + /** 暂不合作 */ + private Integer cooperatePauseFlag; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsCenterExtendTreeVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsCenterExtendTreeVo.java new file mode 100644 index 0000000..027a47b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsCenterExtendTreeVo.java @@ -0,0 +1,92 @@ +package com.qs.serve.modules.bms.entity.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.SqlCondition; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.qs.serve.common.model.dto.TreeNode; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author YenHex + * @since 2023/7/17 + */ +@Data +public class BmsCenterExtendTreeVo { + + private Long id; + + //结束行id + private Long stopRowId; + + //组合id + private String comboId; + + //组合id + private String comboParentId; + + private List children; + + private String pathCenterIds; + + private String pathCenterCodes; + + private String pathCenterNames; + + /** 来源id */ + @NotNull(message = "来源id不能为空") + private Long sourceId; + + /** 成本中心类型 */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 255,message = "成本中心类型长度不能超过255字") + private String centerType; + + /** 成本中心id */ + @NotBlank(message = "成本中心id不能为空") + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 50,message = "成本中心编码长度不能超过50字") + @TableField(condition = SqlCondition.LIKE) + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 200,message = "成本中心名称长度不能超过200字") + @TableField(condition = SqlCondition.LIKE) + private String centerName; + + /** 开始时间 */ + @NotNull(message = "开始时间不能为空") + @Length(max = 0,message = "开始时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime startTime; + + /** 结束时间 */ + @Length(max = 0,message = "结束时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime stopTime; + + /** 结束标识 */ + @NotNull(message = "结束标识不能为空") + private Integer stopFlag; + + /** 权重 */ + @NotNull(message = "权重不能为空") + private BigDecimal weightRate; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsCostCenterTreeVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsCostCenterTreeVo.java new file mode 100644 index 0000000..6091292 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsCostCenterTreeVo.java @@ -0,0 +1,42 @@ +package com.qs.serve.modules.bms.entity.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.qs.serve.common.model.dto.TreeNode; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/11/11 + */ +@Data +public class BmsCostCenterTreeVo extends TreeNode { + + /** 科目名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 50,message = "成本中心名称长度不能超过50字") + private String name; + + /** 科目编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 50,message = "成本中心编码长度不能超过50字") + private String code; + + /** 父级id */ + @NotNull(message = "父级id不能为空") + private Long pid; + + /** 是否销售费用 */ + private Integer saleCostFlag; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 是否所有人可见 */ + private Integer visibleFlag; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsCostCenterVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsCostCenterVo.java new file mode 100644 index 0000000..0abb7e4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsCostCenterVo.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.bms.entity.vo; + +import lombok.Data; + +/** + * @author YenHex + * @since 2022/11/11 + */ +@Data +public class BmsCostCenterVo { + + /** 科目名称 */ + private String name; + + /** 科目编码 */ + private String code; + + /** 备注 */ + private String remark; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsMasterUserCenterVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsMasterUserCenterVo.java new file mode 100644 index 0000000..68b4df3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsMasterUserCenterVo.java @@ -0,0 +1,21 @@ +package com.qs.serve.modules.bms.entity.vo; + +import com.qs.serve.modules.bms.entity.BmsMasterUser; +import lombok.Data; + +/** + * @author YenHex + * @since 2022/11/15 + */ +@Data +public class BmsMasterUserCenterVo extends BmsMasterUser { + + private String userCode; + + private String userName; + + private String centerCode; + + private String centerName; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsMasterUserChannelVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsMasterUserChannelVo.java new file mode 100644 index 0000000..cf5c36e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsMasterUserChannelVo.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.bms.entity.vo; + +import com.qs.serve.modules.bms.entity.BmsMasterUser; +import lombok.Data; + +/** + * @author YenHex + * @since 2022/11/11 + */ +@Data +public class BmsMasterUserChannelVo extends BmsMasterUser { + + private String userCode; + + private String userName; + + private String channelName; + + private String channelCode; + + private String pointName; + + private String pointCode; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsMasterUserVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsMasterUserVo.java new file mode 100644 index 0000000..c5cc461 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsMasterUserVo.java @@ -0,0 +1,80 @@ +package com.qs.serve.modules.bms.entity.vo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 负责人 VO + * @author YenHex + * @since 2022-11-10 + */ +@Data +public class BmsMasterUserVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 类型 */ + private String type; + + /** 目标id */ + private String targetId; + + /** 用户id */ + private String userId; + + /** 主要负责人 */ + private Integer masterFlag; + + /** 拓展字段1 */ + private String sp1; + + /** 拓展字段2 */ + private String sp2; + + /** 拓展字段3 */ + private String sp3; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 创建人 */ + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 更新人 */ + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsRegionTreeVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsRegionTreeVo.java new file mode 100644 index 0000000..6b7a088 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsRegionTreeVo.java @@ -0,0 +1,43 @@ +package com.qs.serve.modules.bms.entity.vo; + +import com.qs.serve.common.model.dto.TreeNode; +import com.qs.serve.modules.bms.entity.BmsRegionUser; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import java.util.List; + +/** + * @author YenHex + * @since 2022/10/10 + */ +@Data +public class BmsRegionTreeVo extends TreeNode { + + /** id */ + private String id; + + /** 名称 */ + @Length(max = 20,message = "名称长度不能超过20字") + private String name; + + /** 编码 */ + @Length(max = 20,message = "编码长度不能超过20字") + private String code; + + /** 父级ID */ + @Length(max = 32,message = "父级ID长度不能超过32字") + private String pid; + + private String aliasRegion; + + /** 是否停用 */ + private Integer stopFlag; + + /** 层级 */ + private Integer level; + + private List regionUsers; + + private String remark; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsSkuSupplierVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsSkuSupplierVo.java new file mode 100644 index 0000000..b71aa61 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsSkuSupplierVo.java @@ -0,0 +1,33 @@ +package com.qs.serve.modules.bms.entity.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.qs.serve.modules.bms.entity.BmsSkuSupplier; +import lombok.Data; + +/** + * @author YenHex + * @since 2022/10/17 + */ +@Data +public class BmsSkuSupplierVo extends BmsSkuSupplier { + + /** 规格编码*/ + private String skuCode; + + /** 商品编码 */ + private String spuCode; + + /** 规格值 */ + private String specInfos; + + /** 商品标题 */ + private String spuTitle; + + private String supplierName; + + private String supplierCode; + + /** 搜索值 */ + private String searchValue; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsSubjectTreeVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsSubjectTreeVo.java new file mode 100644 index 0000000..ce3ed1f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsSubjectTreeVo.java @@ -0,0 +1,56 @@ +package com.qs.serve.modules.bms.entity.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.qs.serve.common.model.dto.TreeNode; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/11/7 + */ +@Data +public class BmsSubjectTreeVo extends TreeNode { + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + private String pathNames; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 父级id */ + @NotNull(message = "父级id不能为空") + private Long pid; + + /** 销售区域:0全部可见;1-部分可见;2-全部不可见 */ + private Integer saleRegionFlag; + + /** 行政区域:0全部可见;1-部分可见;2-全部不可见 */ + private Integer bizRegionFlag; + + private Integer level; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** supplierId,编辑客户费用申请时,科目是否可选 */ + private Integer apiSelectAble; + + /** 是否进场费用 */ + private Integer slottingFlag; + + /** 应用与发布费用时,必选网点拦截 */ + private Integer pointSelectFlag; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsSupplierExtRegionVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsSupplierExtRegionVo.java new file mode 100644 index 0000000..b5c489a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsSupplierExtRegionVo.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.bms.entity.vo; + + +import lombok.Data; + +/** + * @author YenHex + * @since 2024/11/22 + */ +@Data +public class BmsSupplierExtRegionVo { + + private String id; + private String name; + private String code; + private String bookCode; + private String salRegionCode; + private String salRegionName; + private String salRegionCode2; + private String salRegionName2; + private String salRegionCode3; + private String salRegionName3; + private String bigRegion; + private String bizRegionCode; + private String bizRegionName; + private String bizRegionCode2; + private String bizRegionName2; + private String bizRegionCode3; + private String bizRegionName3; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsSupplierTreeVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsSupplierTreeVo.java new file mode 100644 index 0000000..6a07e65 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsSupplierTreeVo.java @@ -0,0 +1,84 @@ +package com.qs.serve.modules.bms.entity.vo; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.model.dto.TreeNode; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import java.time.LocalDateTime; + +/** + * @author YenHex + * @since 2022/10/12 + */ +@Data +public class BmsSupplierTreeVo extends TreeNode { + + /** id */ + @TableId(type = IdType.AUTO) + private String id; + + /** 一级区域ID */ + private String regionFirst; + + /** 二级区域ID */ + private String regionSecond; + + /** 三级区域ID */ + private String regionThird; + + /** 详细地址 */ + private String address; + + /** 名称 */ + private String name; + + /** 客户编码 */ + private String code; + + /** 父级id */ + private String pid; + + /** 区域ID */ + private String regionId; + + private String regionLabel; + + /** 所属ERP信息 */ + private String belongLabel; + + /** 最子级区域ID */ + private String regionLast; + + + private String parentCode; + + /** 归属ERP编码,如JSL、JSB、KL 对应ERP信息表作显示 */ + @NotBlank(message = "客户编码不能为空") + private String belong; + + /** 行政一级区域ID */ + private String region2First; + + /** 行政二级区域ID */ + private String region2Second; + + /** 行政三级区域ID */ + private String region2Third; + + /** 行政最子级区域ID */ + private String region2Last; + + /** 行政标题 */ + private String region2Label; + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsUserPoint4VisitVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsUserPoint4VisitVo.java new file mode 100644 index 0000000..6d7a113 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/entity/vo/BmsUserPoint4VisitVo.java @@ -0,0 +1,39 @@ +package com.qs.serve.modules.bms.entity.vo; + +import com.qs.serve.modules.bms.entity.BmsMasterUser; +import lombok.Data; + +/** + * @author YenHex + * @since 2022/11/11 + */ +@Data +public class BmsUserPoint4VisitVo { + + /** 网点id */ + String pointId; + + /** 网点编码 */ + String pointCode; + + /** 网点名称 */ + String pointName; + + /** */ + String channelName; + + /** 地址*/ + String address; + + /** 地图地址*/ + String mapAddress; + + /** 距离 */ + Double distance; + + String localX; + String localY; + + Object visitInfo; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsAccountMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsAccountMapper.java new file mode 100644 index 0000000..f3cdf22 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsAccountMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsAccount; + +/** + * 账套 Mapper + * @author YenHex + * @date 2024-04-11 + */ +public interface BmsAccountMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsAccountUserMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsAccountUserMapper.java new file mode 100644 index 0000000..85f0468 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsAccountUserMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsAccountUser; + +/** + * 账套的用户 Mapper + * @author YenHex + * @date 2024-04-11 + */ +public interface BmsAccountUserMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsApplyMessageMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsApplyMessageMapper.java new file mode 100644 index 0000000..74f9659 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsApplyMessageMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsApplyMessage; + +/** + * 申请信息 Mapper + * @author YenHex + * @date 2023-09-18 + */ +public interface BmsApplyMessageMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsCenterExtendBuildMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsCenterExtendBuildMapper.java new file mode 100644 index 0000000..a0b7ef1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsCenterExtendBuildMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsCenterExtendBuild; + +/** + * 后继成本中心 Mapper + * @author YenHex + * @date 2023-07-17 + */ +public interface BmsCenterExtendBuildMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsCenterExtendMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsCenterExtendMapper.java new file mode 100644 index 0000000..c22d6d0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsCenterExtendMapper.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsCenterExtend; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 后继成本中心 Mapper + * @author YenHex + * @date 2023-05-30 + */ +public interface BmsCenterExtendMapper extends BaseMapper { + + @Select("select center_type,center_id,source_id,id from bms_center_extend GROUP BY center_type,center_id HAVING count(1)=1") + List selectTopList(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsCenterExtendUserMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsCenterExtendUserMapper.java new file mode 100644 index 0000000..da4c203 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsCenterExtendUserMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsCenterExtendUser; + +/** + * 后继负责人 Mapper + * @author YenHex + * @date 2023-05-31 + */ +public interface BmsCenterExtendUserMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsCenterRegionMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsCenterRegionMapper.java new file mode 100644 index 0000000..0562c45 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsCenterRegionMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsCenterRegion; + +/** + * Mapper + * @author YenHex + * @date 2023-07-20 + */ +public interface BmsCenterRegionMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsChannelMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsChannelMapper.java new file mode 100644 index 0000000..c3008f4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsChannelMapper.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsChannel; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 渠道 Mapper + * @author YenHex + * @date 2022-11-03 + */ +public interface BmsChannelMapper extends BaseMapper { + + List selectChannelList(@Param("query") BmsChannel channel, @Param("userIds") List userIds,@Param("supplierId") String supplierId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsChannelPointExtMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsChannelPointExtMapper.java new file mode 100644 index 0000000..d81c1df --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsChannelPointExtMapper.java @@ -0,0 +1,15 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsCenterRegion; +import com.qs.serve.modules.bms.entity.BmsChannelPointExt; + +/** + * Mapper + * @author YenHex + * @date 2023-07-20 + */ +public interface BmsChannelPointExtMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsChannelPointMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsChannelPointMapper.java new file mode 100644 index 0000000..0f43582 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsChannelPointMapper.java @@ -0,0 +1,73 @@ +package com.qs.serve.modules.bms.mapper; + + +import java.util.List; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.RowParam; +import com.qs.serve.modules.bms.entity.BmsChannelPoint; +import com.qs.serve.modules.bms.entity.so.BmsPointVisitSo; +import com.qs.serve.modules.bms.entity.vo.BmsUserPoint4VisitVo; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +/** + * 渠道站点 Mapper + * @author YenHex + * @date 2022-11-03 + */ +public interface BmsChannelPointMapper extends BaseMapper { + + @InterceptorIgnore(tenantLine = "1") + @Update("update bms_channel_point set sale_region_path = #{saleRegionPath} where sale_region_id = #{saleRegionId}") + int udpateSaleRegionPathBySaleRegionId(@Param("saleRegionPath") String saleRegionPath,String saleRegionId); + + @InterceptorIgnore(tenantLine = "1") + @Update("update bms_channel_point set biz_region_path = #{bizRegionPath} where biz_region_id = #{bizRegionId}") + int udpateBizRegionPathByBizRegionId(@Param("bizRegionPath") String bizRegionPath,String bizRegionId); + + @InterceptorIgnore(tenantLine = "1") + @Update("update bms_channel_point set local_x = null,local_y=null where id = #{id}") + int updateSetNullOfMapInfo(@Param("id") Long id); + + List selectChannelPointList(@Param("query") BmsChannelPoint channelPoint); + + List selectPointByUserIds(@Param("query")BmsChannelPoint channelPoint, @Param("userIds")List userIds,@Param("supplierId") String supplierId, @Param("rowInfo") RowParam rowParam); + + Long selectCountPointByUserIds(@Param("query")BmsChannelPoint channelPoint, @Param("userIds")List userIds,@Param("supplierId") String supplierId); + + /** + * 直属管理人 + * @param param + * @return + */ + @InterceptorIgnore(tenantLine = "1") + List selectUserPointList4Visit(@Param("query") BmsPointVisitSo param, @Param("userIds")List userIds, @Param("rowInfo") RowParam rowParam); + + /** + * 直属管理人 + * @param param + * @return + */ + @InterceptorIgnore(tenantLine = "1") + Long selectCountUserPointList4Visit(@Param("query") BmsPointVisitSo param,@Param("userIds")List userIds); + + + /** + * 直属管理人 + * @param param + * @return + */ + @InterceptorIgnore(tenantLine = "1") + List selectUserPointList4My(@Param("query") BmsChannelPoint param); + + /** + * 下属管理人 + * @param param + * @return + */ + @InterceptorIgnore(tenantLine = "1") + List selectUserPointList4MyUnder(@Param("query") BmsChannelPoint param); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsCostCenterMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsCostCenterMapper.java new file mode 100644 index 0000000..08a8374 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsCostCenterMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsCostCenter; + +/** + * 成本中心 Mapper + * @author YenHex + * @date 2022-10-13 + */ +public interface BmsCostCenterMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsDutyInfoMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsDutyInfoMapper.java new file mode 100644 index 0000000..c726194 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsDutyInfoMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsDutyInfo; + +/** + * 税务信息表 Mapper + * @author YenHex + * @date 2023-08-30 + */ +public interface BmsDutyInfoMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsFactoryMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsFactoryMapper.java new file mode 100644 index 0000000..56da43e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsFactoryMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsFactory; + +/** + * 工厂产地 Mapper + * @author YenHex + * @date 2022-10-20 + */ +public interface BmsFactoryMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsMasterUserMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsMasterUserMapper.java new file mode 100644 index 0000000..370db81 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsMasterUserMapper.java @@ -0,0 +1,36 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsMasterUser; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.vo.BmsMasterUserCenterVo; +import com.qs.serve.modules.bms.entity.vo.BmsMasterUserChannelVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 负责人 Mapper + * @author YenHex + * @date 2022-11-10 + */ +public interface BmsMasterUserMapper extends BaseMapper { + + /** + * 查询渠道负责人 + * @param userChannel + * @return + */ + List selectChannelMasterUserList(@Param("query") BmsMasterUserChannelVo userChannel); + + + /** + * 查询成本中心负责人 + * @param userChannel + * @return + */ + List selectCenterMasterUserList(@Param("query") BmsMasterUser userChannel); + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsRegion2Mapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsRegion2Mapper.java new file mode 100644 index 0000000..6bbce9a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsRegion2Mapper.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +/** + * 区域档案 Mapper + * @author YenHex + * @date 2022-10-10 + */ +public interface BmsRegion2Mapper extends BaseMapper { + + @Update("update bms_region2 set path_ids = null , path_names = null,level = -1") + int updateSetPathNull(); + + + @Select("select count(1) from bms_region2 where del_flag = 1 and sys_code1 = #{sysCode} and id != #{neId}") + Long countSysCode1(@Param("sysCode") String sysCode, @Param("neId")String neId); + + @Select("select count(1) from bms_region2 where del_flag = 1 and sys_code2 = #{sysCode} and id != #{neId}") + Long countSysCode2(@Param("sysCode") String sysCode,@Param("neId")String neId); + + @Select("select count(1) from bms_region2 where del_flag = 1 and sys_code3 = #{sysCode} and id != #{neId}") + Long countSysCode3(@Param("sysCode") String sysCode,@Param("neId")String neId); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsRegionMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsRegionMapper.java new file mode 100644 index 0000000..b22fe52 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsRegionMapper.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsRegion; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +/** + * 区域档案 Mapper + * @author YenHex + * @date 2022-10-10 + */ +public interface BmsRegionMapper extends BaseMapper { + + @Update("update bms_region set path_ids = null , path_names = null,level = -1") + int updateSetPathNull(); + + @Select("select count(1) from bms_region where del_flag = 1 and sys_code1 = #{sysCode} and id != #{neId}") + Long countSysCode1(@Param("sysCode") String sysCode, @Param("neId")String neId); + + @Select("select count(1) from bms_region where del_flag = 1 and sys_code2 = #{sysCode} and id != #{neId}") + Long countSysCode2(@Param("sysCode") String sysCode,@Param("neId")String neId); + + @Select("select count(1) from bms_region where del_flag = 1 and sys_code3 = #{sysCode} and id != #{neId}") + Long countSysCode3(@Param("sysCode") String sysCode,@Param("neId")String neId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsRegionUserMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsRegionUserMapper.java new file mode 100644 index 0000000..7d3121e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsRegionUserMapper.java @@ -0,0 +1,40 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsRegionUser; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import java.util.List; +/** + * 区域负责人 Mapper + * @author YenHex + * @date 2022-11-02 + */ +public interface BmsRegionUserMapper extends BaseMapper { + + /** + * 我的销售区域 + * @param userId + * @return + */ + @Select("SELECT path_ids FROM" + + " ( SELECT region_id FROM `bms_region_user` " + + " WHERE `bms_region_user`.type = '0' AND `bms_region_user`.del_flag = 0 and `bms_region_user`.user_id = #{userId}" + + " ) reg_user" + + " LEFT JOIN `bms_region` `bms_region` ON reg_user.region_id = `bms_region`.`id` ") + List selectMySaleRegion(@Param("userId")String userId); + + /** + * 我的行政区域 + * @param userId + * @return + */ + @Select(" SELECT path_ids FROM" + + " ( SELECT region_id FROM `bms_region_user`" + + " WHERE `bms_region_user`.type = '1' AND `bms_region_user`.del_flag = 0 and `bms_region_user`.user_id = #{userId}" + + " ) reg_user " + + " LEFT JOIN `bms_region2` `bms_region2` ON reg_user.region_id = `bms_region2`.`id`;") + List selectMyBizRegion(@Param("userId")String userId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsRuleMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsRuleMapper.java new file mode 100644 index 0000000..42290b5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsRuleMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsRule; + +/** + * 规则 Mapper + * @author YenHex + * @date 2022-10-19 + */ +public interface BmsRuleMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsRuleRegionMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsRuleRegionMapper.java new file mode 100644 index 0000000..2b8bd9e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsRuleRegionMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsRuleRegion; + +/** + * 规则区域 Mapper + * @author YenHex + * @date 2022-10-21 + */ +public interface BmsRuleRegionMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsRuleSkuMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsRuleSkuMapper.java new file mode 100644 index 0000000..f186f11 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsRuleSkuMapper.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsRuleSku; + +import java.util.List; + +/** + * 规则sku Mapper + * @author YenHex + * @date 2022-10-21 + */ +public interface BmsRuleSkuMapper extends BaseMapper { + + /** + * 关联规则查询可用的sku + * @param ruleSku + * @return + */ + List listEnableRule(BmsRuleSku ruleSku); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSkuSupplierMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSkuSupplierMapper.java new file mode 100644 index 0000000..2377e72 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSkuSupplierMapper.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsSkuSupplier; +import com.qs.serve.modules.bms.entity.vo.BmsSkuSupplierVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * sku供应商关联 Mapper + * @author YenHex + * @date 2022-10-17 + */ +public interface BmsSkuSupplierMapper extends BaseMapper { + + @InterceptorIgnore(tenantLine = "1") + List selectList2(@Param("query") BmsSkuSupplierVo skuSupplier); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSubjectFormMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSubjectFormMapper.java new file mode 100644 index 0000000..3d7fa75 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSubjectFormMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsSubjectForm; + +/** + * 科目表单 Mapper + * @author YenHex + * @date 2023-02-03 + */ +public interface BmsSubjectFormMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSubjectMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSubjectMapper.java new file mode 100644 index 0000000..781420a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSubjectMapper.java @@ -0,0 +1,35 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsSubject; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +/** + * 科目 Mapper + * @author YenHex + * @date 2022-11-07 + */ +public interface BmsSubjectMapper extends BaseMapper { + + @InterceptorIgnore(tenantLine = "1") + @Update("update bms_subject set form_id = null where id = #{id}") + int removeFormId(@Param("id") Long id); + + @InterceptorIgnore(tenantLine = "1") + @Update("update bms_subject set form_id_for_cost_apply = null where id = #{id}") + int removeFormIdForCost(@Param("id") Long id); + + /** + * 解决code重复方案 + * @param newCode + * @param id + * @return + */ + @InterceptorIgnore(tenantLine = "1") + @Update("update bms_subject set del_flag = 1,subject_code = #{newCode} where id = #{id}") + int updateToDelete(@Param("newCode")String newCode,@Param("id")Long id); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSubjectRegionMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSubjectRegionMapper.java new file mode 100644 index 0000000..ab62e65 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSubjectRegionMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsSubjectRegion; + +/** + * 客户适用区域 Mapper + * @author YenHex + * @date 2023-03-09 + */ +public interface BmsSubjectRegionMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierAddressMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierAddressMapper.java new file mode 100644 index 0000000..5017838 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierAddressMapper.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +/** + * 供应商地址 Mapper + * @author YenHex + * @date 2022-10-12 + */ +public interface BmsSupplierAddressMapper extends BaseMapper { + + List selectBmsSupplierAddressList(@Param("query") BmsSupplierAddress query); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierBandMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierBandMapper.java new file mode 100644 index 0000000..6b18291 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierBandMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsSupplierBand; + +/** + * 供应商地址 Mapper + * @author YenHex + * @date 2022-10-12 + */ +public interface BmsSupplierBandMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierChannelMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierChannelMapper.java new file mode 100644 index 0000000..0076ac2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierChannelMapper.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsSupplierChannel; +import org.apache.ibatis.annotations.Param; +import java.util.List; +/** + * 客户渠道关系 Mapper + * @author YenHex + * @date 2022-11-03 + */ +public interface BmsSupplierChannelMapper extends BaseMapper { + + List selectSupplierChannelList(@Param("query") BmsSupplierChannel supplierChannel); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierComRegionMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierComRegionMapper.java new file mode 100644 index 0000000..355a11d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierComRegionMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsSupplierComRegion; + +/** + * 客户大区 Mapper + * @author YenHex + * @date 2023-12-30 + */ +public interface BmsSupplierComRegionMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierContactsMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierContactsMapper.java new file mode 100644 index 0000000..f273e6f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierContactsMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsSupplierContacts; + +/** + * 供应商联系人 Mapper + * @author YenHex + * @date 2023-04-19 + */ +public interface BmsSupplierContactsMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierMapper.java new file mode 100644 index 0000000..2cc9ac6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierMapper.java @@ -0,0 +1,87 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.vo.BmsSupplierExtRegionVo; +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 + * @date 2022-10-10 + */ +public interface BmsSupplierMapper extends BaseMapper { + + @InterceptorIgnore(tenantLine = "1") + List selectSupplierList(@Param("query") BmsSupplier bmsSupplier); + + + /** + * 客户档案管理区域信息 + * @param supplierId + * @return + */ + @Select("select DISTINCT " + + "su.id, " + + "su.`name`, " + + "su.`code`, " + + "book_code, " + + "re.code as sal_region_code, " + + "re.name as sal_region_name, " + + "re2.code as sal_region_code2, " + + "re2.name as sal_region_name2, " + + "re3.code as sal_region_code3, " + + "re3.name as sal_region_name3, " + + "biz1.area as big_region, " + + "biz1.`code` as biz_region_code, " + + "biz1.`name` as biz_region_name, " + + "biz2.`code` as biz_region_code2, " + + "biz2.`name` as biz_region_name2, " + + "biz3.`code` as biz_region_code3, " + + "biz3.`name` as biz_region_name3 " + + "from bms_supplier su " + + "left join bms_region re on re.id = su.region_first " + + "left join bms_region re2 on re2.id = su.region_second " + + "left join bms_region re3 on re3.id = su.region_third " + + "left join bms_region2 biz1 on biz1.id = su.region2_first " + + "left join bms_region2 biz2 on biz2.id = su.region2_second " + + "left join bms_region2 biz3 on biz3.id = su.region2_third " + + "where su.del_flag = 0 " + + "and su.`id` = #{id} ") + @InterceptorIgnore(tenantLine = "1") + BmsSupplierExtRegionVo getBmsSupplierExtRegionVo(@Param("id") String supplierId); + + /** + * + * @param query + * @return + */ + @InterceptorIgnore(tenantLine = "1") + @Update("update bms_supplier" + + " set user_id = #{query.userId}" + + ",user_code = #{query.userCode}" + + ",user_name = #{query.userName}" + + ",other_user_ids = #{query.otherUserIdsString}" + + ",other_user_names = #{query.otherUserNames}" + + ",other_user_codes = #{query.otherUserCodes}" + + " where id = #{query.id}") + int updateRelateUserInfo(@Param("query") BmsSupplier query); + + @InterceptorIgnore(tenantLine = "1") + @Update("update bms_supplier set user_id = null,user_code = null, user_name = null where id = #{supplierId}") + int removeRelateUserInfo(@Param("supplierId") Long supplierId); + + @InterceptorIgnore(tenantLine = "1") + void updateBmsSuppliersUserNullById(@Param("list") List ids); + + @InterceptorIgnore(tenantLine = "1") + void updateBmsSuppliersOtherUserNullById(@Param("list") List ids); + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierStatementMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierStatementMapper.java new file mode 100644 index 0000000..933e660 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierStatementMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsSupplierStatement; + +/** + * 客户货款对账单 Mapper + * @author YenHex + * @date 2024-03-22 + */ +public interface BmsSupplierStatementMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierTargetMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierTargetMapper.java new file mode 100644 index 0000000..6650e58 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierTargetMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsSupplierTarget; + +/** + * Mapper + * @author YenHex + * @date 2023-09-13 + */ +public interface BmsSupplierTargetMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierVisitAddressMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierVisitAddressMapper.java new file mode 100644 index 0000000..d545b5e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierVisitAddressMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsSupplierVisitAddress; + +/** + * 供应商拜访地址 Mapper + * @author YenHex + * @date 2023-03-28 + */ +public interface BmsSupplierVisitAddressMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierVisitFormMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierVisitFormMapper.java new file mode 100644 index 0000000..8f49970 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierVisitFormMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsSupplierVisitForm; + +/** + * 科目表单 Mapper + * @author YenHex + * @date 2023-03-28 + */ +public interface BmsSupplierVisitFormMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierVisitMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierVisitMapper.java new file mode 100644 index 0000000..83cbb02 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierVisitMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsSupplierVisit; + +/** + * 供应商拜访信息 Mapper + * @author YenHex + * @date 2023-03-28 + */ +public interface BmsSupplierVisitMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierVisitTypeMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierVisitTypeMapper.java new file mode 100644 index 0000000..dda96cd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/mapper/BmsSupplierVisitTypeMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.bms.entity.BmsSupplierVisitType; + +/** + * 拜访类型 Mapper + * @author YenHex + * @date 2023-03-28 + */ +public interface BmsSupplierVisitTypeMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsAccountService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsAccountService.java new file mode 100644 index 0000000..62b192c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsAccountService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsAccount; + +/** + * 账套 服务接口 + * @author YenHex + * @date 2024-04-11 + */ +public interface BmsAccountService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsAccountUserService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsAccountUserService.java new file mode 100644 index 0000000..3be153a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsAccountUserService.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsAccountUser; +import com.qs.serve.modules.bms.entity.bo.BmsAccountUserBo; + +/** + * 账套的用户 服务接口 + * @author YenHex + * @date 2024-04-11 + */ +public interface BmsAccountUserService extends IService { + + void modify(BmsAccountUserBo param); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsApplyMessageService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsApplyMessageService.java new file mode 100644 index 0000000..469804e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsApplyMessageService.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsApplyMessage; +import com.qs.serve.modules.bms.entity.bo.BmsApplyMessageTestBo; + +import java.util.List; + +/** + * 申请信息 服务接口 + * @author YenHex + * @date 2023-09-18 + */ +public interface BmsApplyMessageService extends IService { + + List getSeeYonData(BmsApplyMessageTestBo param); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsCenterExtendBuildService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsCenterExtendBuildService.java new file mode 100644 index 0000000..1200df5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsCenterExtendBuildService.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsCenterExtendBuild; + +/** + * 后继成本中心 服务接口 + * @author YenHex + * @date 2023-07-17 + */ +public interface BmsCenterExtendBuildService extends IService { + + /** + * 初始化建数据,调用时,清空本`bms_center_extend_build`表 + */ + void initData(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsCenterExtendService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsCenterExtendService.java new file mode 100644 index 0000000..f05ddd0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsCenterExtendService.java @@ -0,0 +1,34 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsCenterExtend; +import com.qs.serve.modules.bms.entity.bo.BmsCenterExtendBo; +import com.qs.serve.modules.bms.entity.vo.BmsCenterExtendTreeVo; +import java.util.List; + +/** + * 后继成本中心 服务接口 + * @author YenHex + * @date 2023-05-30 + */ +public interface BmsCenterExtendService extends IService { + + /** + * 转换成树结构 + * @return + */ + List transferTree(); + + boolean checkIsStop(String type, String centerId); + + BmsCenterExtend allocation(BmsCenterExtendBo param); + + + /** + * 删除所有均摊节点 + * @param id + */ + void deleteAndReply(Long id); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsCenterExtendUserService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsCenterExtendUserService.java new file mode 100644 index 0000000..bdfca35 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsCenterExtendUserService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsCenterExtendUser; + +/** + * 后继负责人 服务接口 + * @author YenHex + * @date 2023-05-31 + */ +public interface BmsCenterExtendUserService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsCenterRegionService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsCenterRegionService.java new file mode 100644 index 0000000..7afd860 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsCenterRegionService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsCenterRegion; + +/** + * 服务接口 + * @author YenHex + * @date 2023-07-20 + */ +public interface BmsCenterRegionService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsChannelPointService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsChannelPointService.java new file mode 100644 index 0000000..a409c59 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsChannelPointService.java @@ -0,0 +1,37 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.common.model.dto.RowParam; +import com.qs.serve.modules.bms.entity.BmsChannelPoint; +import com.qs.serve.modules.bms.entity.bo.BmsChannelPointBo; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; +import java.util.List; + +/** + * 渠道站点 服务接口 + * @author YenHex + * @date 2022-11-03 + */ +public interface BmsChannelPointService extends IService { + + boolean modify(BmsChannelPointBo param); + + List selectChannelPointList(BmsChannelPoint channelPoint); + + List selectChannelPointMyList(BmsChannelPoint channelPoint, List userIds, RowParam rowParam); + + Long selectCountChannelPointMyList(BmsChannelPoint channelPoint, List userIds); + + List selectChannelPointMyList(BmsChannelPoint channelPoint); + List selectChannelPointMyUnderList(BmsChannelPoint channelPoint); + + List listByBizRegionId(String id); + + List listBySaleRegionId(String id); + + List listByChannelId(Long id); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsChannelService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsChannelService.java new file mode 100644 index 0000000..a71c033 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsChannelService.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsChannel; +import java.util.List; + +/** + * 渠道 服务接口 + * @author YenHex + * @date 2022-11-03 + */ +public interface BmsChannelService extends IService { + + List selectChannelList(BmsChannel channel,List userIds,String supplierId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsCostCenterService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsCostCenterService.java new file mode 100644 index 0000000..51990a1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsCostCenterService.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsCostCenter; + +import java.util.List; + +/** + * 成本中心 服务接口 + * @author YenHex + * @date 2022-10-13 + */ +public interface BmsCostCenterService extends IService { + + BmsCostCenter getByCode(String code); + BmsCostCenter getByName(String name); + BmsCostCenter getByNameOrCode(String value); + List listChild(Long pid); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsDutyInfoService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsDutyInfoService.java new file mode 100644 index 0000000..773beb1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsDutyInfoService.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsDutyInfo; + +/** + * 税务信息表 服务接口 + * @author YenHex + * @date 2023-08-30 + */ +public interface BmsDutyInfoService extends IService { + + BmsDutyInfo getByDutyNumber(String code); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsFactoryService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsFactoryService.java new file mode 100644 index 0000000..03e6c45 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsFactoryService.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsFactory; + +/** + * 工厂产地 服务接口 + * @author YenHex + * @date 2022-10-20 + */ +public interface BmsFactoryService extends IService { + + BmsFactory getByCode(String code); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsMasterUserService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsMasterUserService.java new file mode 100644 index 0000000..e3d08c7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsMasterUserService.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsMasterUser; +import com.qs.serve.modules.bms.entity.BmsRegionUser; +import java.util.List; +/** + * 负责人 服务接口 + * @author YenHex + * @date 2022-11-10 + */ +public interface BmsMasterUserService extends IService { + + void removeMgrUser(String type, String targetId, String userId); + void removeMgrUser(String type, String targetId); + + BmsMasterUser getByParam(String type, String targetId, String userId); + + /** + * 设置主要负责人 + * @param id + */ + void setMaster(Long id); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRegion2Service.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRegion2Service.java new file mode 100644 index 0000000..6f3c119 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRegion2Service.java @@ -0,0 +1,46 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.vo.BmsRegionTreeVo; + +import java.util.List; + +/** + * 区域档案 服务接口 + * @author YenHex + * @date 2022-10-10 + */ +public interface BmsRegion2Service extends IService { + + List getTree(boolean listUserFlag); + + List listChild(String pid); + List listChild(List pid); + + BmsRegion2 getByCode(String code); + + BmsRegion2 getByName(String name,Integer level); + + BmsRegion2 getByNameOrCode(String value); +// void flushLevel(BmsRegion2 param); + + void flushAllLevel(boolean batchUpdate); + + boolean saveBmsRegion2(BmsRegion2 param); + + boolean updateBmsRegion2ById(BmsRegion2 param); + + /** + * 深度加载子集 + * @param pid + * @param parentLevel 用于防止递归错误设置 + * @return + */ + List listTreeChildByDeep(String pid,Integer parentLevel); + + boolean updateBizRegionById(BmsRegion2 param); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRegionService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRegionService.java new file mode 100644 index 0000000..4022b9d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRegionService.java @@ -0,0 +1,41 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.vo.BmsRegionTreeVo; + +import java.util.List; + +/** + * 区域档案 服务接口 + * @author YenHex + * @date 2022-10-10 + */ +public interface BmsRegionService extends IService { + + List getTree(boolean listUserFlag,Integer stopFlag); + + List listChild(String pid); + + List listChildRightLike(String parentIdPath); + + List listChild(List pids); + + BmsRegion getByCode(String code); + + BmsRegion getByName(String name,Integer level); + + BmsRegion getByNameOrCode(String value); + + void flushAllLevel(boolean batchUpdate); + + boolean saveBmsRegion(BmsRegion param); + + boolean updateSaleRegionById(BmsRegion param); + + boolean updateBmsRegionById(BmsRegion param); + + void updateAllFactoryIdsByFactoryId(String id,String addOrDel); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRegionUserService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRegionUserService.java new file mode 100644 index 0000000..3723eec --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRegionUserService.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsRegionUser; + +/** + * 区域负责人 服务接口 + * @author YenHex + * @date 2022-11-02 + */ +public interface BmsRegionUserService extends IService { + + BmsRegionUser getByParam(Integer type,String regionId,String userId); + + /** + * 设置主要负责人 + * @param id + */ + void setMaster(Long id); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRuleMainService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRuleMainService.java new file mode 100644 index 0000000..0191a09 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRuleMainService.java @@ -0,0 +1,135 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.entity.BmsRuleRegion; +import com.qs.serve.modules.bms.entity.BmsRuleSku; +import com.qs.serve.modules.bms.entity.BmsSkuSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.service.GoodsSkuSpecValueService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.oms.service.OmsShoppingCartService; +import com.qs.serve.modules.wx.service.WxUserService; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2022/10/20 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsRuleMainService { + + private BmsSkuSupplierService bmsSkuSupplierService; + private BmsRuleSkuService bmsRuleSkuService; + private BmsRuleRegionService bmsRuleRegionService; + + /** + * 返回错误的规格id列表 + * @param supplier + * @param goodsSkus + * @return + */ + public List checkErrSkuIds(BmsSupplier supplier,List goodsSkus){ + //返回的错误sku + List errSkuIds = new ArrayList<>(); + List skuIds = goodsSkus.stream().map(GoodsSku::getId).collect(Collectors.toList()); + List spuIds = goodsSkus.stream().map(GoodsSku::getSpuId).collect(Collectors.toList()); + List skuSupplierRules = this.getSkuSupplierRules(supplier.getId(),skuIds); + if(skuSupplierRules.size()>0){ + for (BmsSkuSupplier supplierRule : skuSupplierRules) { + if (supplierRule.getBanStatus().equals(1)){ + errSkuIds.add(supplierRule.getSkuId()); + } + } + //过滤已设置的sku + skuIds = skuIds.stream().filter(skuId-> + skuSupplierRules.stream().noneMatch(rule-> rule.getSkuId().equals(skuId)) + ).collect(Collectors.toList()); + } + List spuSupplierRules = this.getSpuSupplierRules(supplier.getId(),spuIds); + if(spuSupplierRules.size()>0){ + //禁止的规格 + final List banedSpuIds = spuSupplierRules.stream() + .filter(spuSupplier -> spuSupplier.getBanStatus().equals(1)) + .map(skuSupplier -> skuSupplier.getSpuId()) + .collect(Collectors.toList()); + + if(banedSpuIds.size()>0){ + List invalidSkuIds = goodsSkus.stream().filter(sku->banedSpuIds.stream().anyMatch(spuId->sku.getSpuId().equals(spuId))) + .map(sku->sku.getId()).collect(Collectors.toList()); + errSkuIds.addAll(invalidSkuIds); + } + //已通过的规格 + List passSpuIds = spuSupplierRules.stream() + .filter(spuSupplier -> spuSupplier.getBanStatus().equals(0)) + .map(skuSupplier -> skuSupplier.getSpuId()) + .collect(Collectors.toList()); + if(passSpuIds.size()>0){ + List passSkuIds = goodsSkus.stream() + .filter(goodsSku->passSpuIds.contains(goodsSku.getSpuId())) + .map(GoodsSku::getId) + .collect(Collectors.toList()); + if(passSkuIds.size()>0){ + skuIds = skuIds.stream().filter(skuId->!passSkuIds.contains(skuId)).collect(Collectors.toList()); + } + } + } + if(CollectionUtil.isEmpty(skuIds)){ + List enableRuleSkus = bmsRuleSkuService.listEnableRuleWithSkuIds(skuIds); + List ruleIds = enableRuleSkus.stream().map(BmsRuleSku::getRuleId).distinct().collect(Collectors.toList()); + if(CollectionUtil.isEmpty(ruleIds)){ + List regionIds = new ArrayList<>(); + if(StringUtils.hasText(supplier.getRegionFirst())){ + regionIds.add(supplier.getRegionFirst()); + } + if(StringUtils.hasText(supplier.getRegionSecond())){ + regionIds.add(supplier.getRegionSecond()); + } + if(StringUtils.hasText(supplier.getRegionThird())){ + regionIds.add(supplier.getRegionThird()); + } + if(StringUtils.hasText(supplier.getRegionFourthly())){ + regionIds.add(supplier.getRegionFourthly()); + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(BmsRuleRegion::getRuleId,ruleIds); + lqw.in(BmsRuleRegion::getRegionId,regionIds); + List ruleRegions = bmsRuleRegionService.list(lqw); + for (BmsRuleRegion ruleRegion : ruleRegions) { + if(ruleRegion.getTypeFlag().equals(1)){ + errSkuIds.addAll(skuIds); + return errSkuIds; + } + } + } + } + return errSkuIds; + } + + public List getSkuSupplierRules(String supplierId, List skuIds) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSkuSupplier::getSkuId,skuIds); + lqw.eq(BmsSkuSupplier::getSupplierId,supplierId); + return bmsSkuSupplierService.list(lqw); + } + + public List getSpuSupplierRules(String supplierId, List spuIds) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(BmsSkuSupplier::getSpuId,spuIds); + lqw.eq(BmsSkuSupplier::getSkuId,0); + lqw.eq(BmsSkuSupplier::getSupplierId,supplierId); + return bmsSkuSupplierService.list(lqw); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRuleRegionService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRuleRegionService.java new file mode 100644 index 0000000..6338227 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRuleRegionService.java @@ -0,0 +1,21 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsRuleRegion; + +/** + * 规则区域 服务接口 + * @author YenHex + * @date 2022-10-21 + */ +public interface BmsRuleRegionService extends IService { + + /** + * 通过区域id删除 + * @param regionId + * @return + */ + boolean removeByRegionId(String regionId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRuleService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRuleService.java new file mode 100644 index 0000000..d966bcc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRuleService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsRule; + +/** + * 规则 服务接口 + * @author YenHex + * @date 2022-10-19 + */ +public interface BmsRuleService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRuleSkuService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRuleSkuService.java new file mode 100644 index 0000000..d6b7933 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsRuleSkuService.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsRuleSku; + +import java.util.List; + +/** + * 规则sku 服务接口 + * @author YenHex + * @date 2022-10-21 + */ +public interface BmsRuleSkuService extends IService { + + List listSkuIdsByRuleId(Long ruleId); + + List listEnableRuleWithSkuIds(List skuIds); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSkuSupplierService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSkuSupplierService.java new file mode 100644 index 0000000..0f7206d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSkuSupplierService.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsSkuSupplier; +import com.qs.serve.modules.bms.entity.vo.BmsSkuSupplierVo; + +import java.util.List; + +/** + * sku供应商关联 服务接口 + * @author YenHex + * @date 2022-10-17 + */ +public interface BmsSkuSupplierService extends IService { + + List selectList(BmsSkuSupplierVo skuSupplier); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSubjectFormService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSubjectFormService.java new file mode 100644 index 0000000..d2c287d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSubjectFormService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsSubjectForm; + +/** + * 科目表单 服务接口 + * @author YenHex + * @date 2023-02-03 + */ +public interface BmsSubjectFormService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSubjectRegionService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSubjectRegionService.java new file mode 100644 index 0000000..2b6a63d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSubjectRegionService.java @@ -0,0 +1,37 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsSubjectRegion; +import java.util.List; +/** + * 客户适用区域 服务接口 + * @author YenHex + * @date 2023-03-09 + */ +public interface BmsSubjectRegionService extends IService { + + /** + * 移除适用区域 + * @param subjectId + * @param regionType 类型:0=销售区域;1=行政区域 + */ + void removeBySubjectId(Long subjectId,Integer regionType); + + /** + * 获取适用区域 + * @param subjectId + * @param regionType 类型:0=销售区域;1=行政区域 + * @return + */ + List listBySubjectId(Long subjectId,Integer regionType); + + /** + * 获取适用区域 + * @param regionIds + * @param regionType 类型:0=销售区域;1=行政区域 + * @return + */ + List listByRegionIds(List regionIds,Integer regionType); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSubjectService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSubjectService.java new file mode 100644 index 0000000..7bc080f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSubjectService.java @@ -0,0 +1,51 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsSubject; +import com.qs.serve.modules.tbs.entity.bo.TbsBudgetBatchBo; + +import java.util.List; +import java.util.Map; + +/** + * 科目 服务接口 + * @author YenHex + * @date 2022-11-07 + */ +public interface BmsSubjectService extends IService { + + /** + * 加载编码 + * @param subjectCodes + * @param throwInvalidCode 含无效编码抛出异常 + * @return + */ + Map loadByNameOrCode(List subjectCodes,Boolean throwInvalidCode); + + + /** + * 加载编码 + * @param subjectCodes + * @param param param + * @return + */ + Map loadByCode(List subjectCodes, TbsBudgetBatchBo param); + + /** + * id加载列表 + * @param ids + * @param noInIds 不在列表 + * @return + */ + List listByIds(List ids,List noInIds); + + List listChild(Long pid); + + void updatePathNameByParent(BmsSubject subject); + + BmsSubject getByName(String name); + BmsSubject getByCode(String code); + + boolean removeSelfAndChildById(Long id); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierAddressService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierAddressService.java new file mode 100644 index 0000000..f7d4338 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierAddressService.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 供应商地址 服务接口 + * @author YenHex + * @date 2022-10-12 + */ +public interface BmsSupplierAddressService extends IService { + + BmsSupplierAddress getDefault(Long supplierId); + + List listBySupplierId(Long supplierId); + + List selectBmsSupplierAddressList(BmsSupplierAddress query); + + void removeBySupplierId(String supplierId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierBandService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierBandService.java new file mode 100644 index 0000000..0802d80 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierBandService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsSupplierBand; + +/** + * 供应商地址 服务接口 + * @author YenHex + * @date 2022-10-12 + */ +public interface BmsSupplierBandService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierChannelService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierChannelService.java new file mode 100644 index 0000000..322afbf --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierChannelService.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsSupplierChannel; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 客户渠道关系 服务接口 + * @author YenHex + * @date 2022-11-03 + */ +public interface BmsSupplierChannelService extends IService { + + List selectSupplierChannelList(BmsSupplierChannel supplierChannel); + + void deleteBySupplierId(String id); + void deleteByChannelId(String id); + + void deleteBatchByChannelIds(List ids); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierContactsService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierContactsService.java new file mode 100644 index 0000000..c2df13a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierContactsService.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsSupplierContacts; + +/** + * 供应商联系人 服务接口 + * @author YenHex + * @date 2023-04-19 + */ +public interface BmsSupplierContactsService extends IService { + + void deleteBySupplierId(String id); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierService.java new file mode 100644 index 0000000..ed56577 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierService.java @@ -0,0 +1,54 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.bo.BmsSupplierBatchBo; +import com.qs.serve.modules.bms.entity.bo.BmsSupplierBo; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 供应商 服务接口 + * @author YenHex + * @date 2022-10-10 + */ +public interface BmsSupplierService extends IService { + + List selectSupplierList(BmsSupplier bmsSupplier); + + void edit(BmsSupplierBo param); + + BmsSupplier getByCode(String code,String belong); + + BmsSupplier getByName(String String); + + BmsSupplier getByNameOrCode(String value); + + List listChild(String pid); + + List listChildByPathIds(String pathIds); + + List listByRegionId(String regionId); + + List listByRegion2Id(String regionId); + + List listByRegionIds(List regionIds,Integer level); + + void editBatch(BmsSupplierBatchBo param); + + void flashParentId(); + + void updateBmsSuppliersUserNullById(List ids); + + void updateBmsSuppliersOtherUserNullById(List ids); + + /** + * 根据客户编码获取报价单金额 + * @param supplierCode + * @return + */ + BigDecimal getErpQuoAmount(String supplierCode); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierStatementService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierStatementService.java new file mode 100644 index 0000000..42d74e1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierStatementService.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsSupplierStatement; + +/** + * 客户货款对账单 服务接口 + * @author YenHex + * @date 2024-03-22 + */ +public interface BmsSupplierStatementService extends IService { + boolean saveBmsSupplierStatement(BmsSupplierStatement param); + + boolean deleteBmsSupplierStatement(String jslId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierVisitAddressService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierVisitAddressService.java new file mode 100644 index 0000000..6bf0980 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierVisitAddressService.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsSupplierVisitAddress; + +/** + * 供应商拜访地址 服务接口 + * @author YenHex + * @date 2023-03-28 + */ +public interface BmsSupplierVisitAddressService extends IService { + + void removeBySupplierId(String supplierId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierVisitFormService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierVisitFormService.java new file mode 100644 index 0000000..ba520a3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierVisitFormService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsSupplierVisitForm; + +/** + * 科目表单 服务接口 + * @author YenHex + * @date 2023-03-28 + */ +public interface BmsSupplierVisitFormService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierVisitService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierVisitService.java new file mode 100644 index 0000000..79ead82 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierVisitService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsSupplierVisit; + +/** + * 供应商拜访信息 服务接口 + * @author YenHex + * @date 2023-03-28 + */ +public interface BmsSupplierVisitService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierVisitTypeService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierVisitTypeService.java new file mode 100644 index 0000000..aaf0acc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/BmsSupplierVisitTypeService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsSupplierVisitType; + +/** + * 拜访类型 服务接口 + * @author YenHex + * @date 2023-03-28 + */ +public interface BmsSupplierVisitTypeService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsAccountServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsAccountServiceImpl.java new file mode 100644 index 0000000..ca8634b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsAccountServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsAccount; +import com.qs.serve.modules.bms.service.BmsAccountService; +import com.qs.serve.modules.bms.mapper.BmsAccountMapper; + +/** + * 账套 服务实现类 + * @author YenHex + * @since 2024-04-11 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsAccountServiceImpl extends ServiceImpl implements BmsAccountService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsAccountUserServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsAccountUserServiceImpl.java new file mode 100644 index 0000000..f477be5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsAccountUserServiceImpl.java @@ -0,0 +1,56 @@ +package com.qs.serve.modules.bms.service.impl; + +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.modules.bms.entity.BmsAccount; +import com.qs.serve.modules.bms.entity.bo.BmsAccountUserBo; +import com.qs.serve.modules.bms.mapper.BmsAccountMapper; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsAccountUser; +import com.qs.serve.modules.bms.service.BmsAccountUserService; +import com.qs.serve.modules.bms.mapper.BmsAccountUserMapper; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 账套的用户 服务实现类 + * @author YenHex + * @since 2024-04-11 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsAccountUserServiceImpl extends ServiceImpl implements BmsAccountUserService { + + private SysUserMapper sysUserMapper; + private BmsAccountMapper bmsAccountMapper; + + @Override + public void modify(BmsAccountUserBo param) { + BmsAccount account = bmsAccountMapper.selectById(param.getBookId()); + List userList = sysUserMapper.selectList(new LambdaQueryWrapper() + .select(SysUser::getId,SysUser::getName,SysUser::getCode) + .in(SysUser::getId,param.getUserIds()) + ); + List accountUserList = userList.stream().map(user->{ + BmsAccountUser accUser = new BmsAccountUser(); + accUser.setBookId(account.getId()); + accUser.setBookCode(account.getBookCode()); + accUser.setBookName(account.getBookName()); + accUser.setUserId(user.getId()); + accUser.setUserCode(user.getCode()); + accUser.setUserName(user.getName()); + accUser.setStopFlag(0); + return accUser; + }).collect(Collectors.toList()); + this.saveBatch(accountUserList); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsApplyMessageServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsApplyMessageServiceImpl.java new file mode 100644 index 0000000..cf7efb1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsApplyMessageServiceImpl.java @@ -0,0 +1,78 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.consts.ApplyTypeConst; +import com.qs.serve.common.util.JsonUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.entity.bo.BmsApplyMessageTestBo; +import com.qs.serve.modules.tbs.service.TbsCostApplyService; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsApplyMessage; +import com.qs.serve.modules.bms.service.BmsApplyMessageService; +import com.qs.serve.modules.bms.mapper.BmsApplyMessageMapper; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 申请信息 服务实现类 + * @author YenHex + * @since 2023-09-18 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsApplyMessageServiceImpl extends ServiceImpl implements BmsApplyMessageService { + + private final TbsCostApplyService tbsCostApplyService; + private final VtbVerificationService vtbVerificationService; + + @Override + public List getSeeYonData(BmsApplyMessageTestBo param) { + Map seeyonData = null; + if(param.getTargetType().equals(ApplyTypeConst.CostBill)){ + seeyonData = tbsCostApplyService.getOAData(param.getTargetId()); + }else if (param.getTargetType().equals(ApplyTypeConst.CheckCost)){ + seeyonData = vtbVerificationService.buildSeeYonVerificationData(param.getTargetId()); + } + if(seeyonData==null){ + return new ArrayList<>(); + } + String jsonString = JsonUtil.objectToJson(seeyonData); + List result = new ArrayList<>(); + if(param.getTestJsString()!=null){ + String js = "function checkCostRate (){" + + "\n var jsonStr = '"+jsonString+"';" + + "\n var data= JSON.parse(jsonStr);" + + //"\n console.log('checkCostRate() data',data);" + + param.getTestJsString() + + "\n}"; + result.add(js); + }else { + LambdaQueryWrapper msgLqw = new LambdaQueryWrapper<>(); + msgLqw.eq(BmsApplyMessage::getType, param.getTargetType()); + msgLqw.eq(BmsApplyMessage::getEnableFlag,1); + List applyMessageList = super.list(msgLqw); + for (BmsApplyMessage applyMessage : applyMessageList) { + String js = "function checkCostRate (){" + + "\n var jsonStr = '"+jsonString+"';" + + "\n var data= JSON.parse(jsonStr);" + + //"\n console.log('checkCostRate() data',data);" + + applyMessage.getExpress() + + "\n}"; + result.add(js); + } + } + return result; + } + + + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterExtendBuildServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterExtendBuildServiceImpl.java new file mode 100644 index 0000000..4b6c697 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterExtendBuildServiceImpl.java @@ -0,0 +1,214 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.TreeNode; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.bms.common.CenterExtendBuildType; +import com.qs.serve.modules.bms.entity.vo.BmsCenterExtendTreeVo; +import com.qs.serve.modules.bms.service.BmsCenterExtendService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsCenterExtendBuild; +import com.qs.serve.modules.bms.service.BmsCenterExtendBuildService; +import com.qs.serve.modules.bms.mapper.BmsCenterExtendBuildMapper; + +import java.math.BigDecimal; +import java.util.*; + +/** + * 后继成本中心 服务实现类 + * @author YenHex + * @since 2023-07-17 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsCenterExtendBuildServiceImpl extends ServiceImpl implements BmsCenterExtendBuildService { + + private final BmsCenterExtendService centerExtendService; + + @Override + public void initData() { + List treeVoList = centerExtendService.transferTree(); + List buildTreeList = new ArrayList<>(); + List buildDataList = new ArrayList<>(); + this.recursionBuildExtendCenter(treeVoList,treeVoList, buildTreeList,buildDataList); + //this.saveBatch(buildTreeList); + this.saveBatch(buildDataList); + } + + private void recursionBuildExtendCenter(List allTreeList,List childList, List buildTreeList,List buildDataList) { + //存放上级对象 + for (BmsCenterExtendTreeVo source : childList) { + BmsCenterExtendBuild build = new BmsCenterExtendBuild(); + build.setBuildType(CenterExtendBuildType.TREE); + build.setRowId(source.getId()); + + String[] centerIds = source.getPathCenterIds().split("_"); + Set centerIdsSet = new HashSet<>(Arrays.asList(centerIds)); + if(centerIds.length!=centerIdsSet.size()){ + build.setBuildType(CenterExtendBuildType.ERROR); + } + build.setPathCenterIds(source.getPathCenterIds()); + build.setPathCenterCodes(source.getPathCenterCodes()); + build.setPathCenterNames(source.getPathCenterNames()); + + build.setCenterType(source.getCenterType()); + build.setCenterId(source.getCenterId()); + build.setCenterCode(source.getCenterCode()); + build.setCenterName(source.getCenterName()); + build.setStartTime(source.getStartTime()); + build.setStopTime(source.getStopTime()); + build.setStopFlag(source.getStopFlag()); + build.setWeightRate(source.getWeightRate()); + //是否有子节点 + boolean lastFlag = source.getChildren()==null||source.getChildren().size()==0; + build.setLastType(1); + buildTreeList.add(build); + + //判断是否最后一级 + if(lastFlag){ + //自下而上查询返回所有占比 + BmsCenterExtendBuild buildData = buildDataByTreeVo(source,source.getWeightRate()); + buildData.setPathCenterIds(build.getPathCenterIds()); + buildData.setPathCenterCodes(build.getPathCenterCodes()); + buildData.setPathCenterNames(build.getPathCenterNames()); + //自身lastType==2 + buildData.setLastType(2); + buildDataList.add(buildData); + + List parents = new ArrayList<>(); + List allTreeToList = new ArrayList<>(); + this.buildAllTreeToList(allTreeList,allTreeToList); + this.filterParentTreeList(allTreeToList, build.getCenterType(), build.getPathCenterIds(), parents); + //修改为 从上往下 + Collections.reverse(parents); + for (int i = 0; i < parents.size(); i++) { + BmsCenterExtendTreeVo treeVo = parents.get(i); + //TODO:感觉不对,需要测试 计算父级节点比率 + BigDecimal currParentWeightRate = treeVo.getWeightRate(); + for (int j = i+1; j < parents.size(); j++) { + BmsCenterExtendTreeVo nextTreeVo = parents.get(j); + //解决分叉,问题导致费用率异常 + if(nextTreeVo.getPathCenterIds().contains(treeVo.getPathCenterIds())){ + currParentWeightRate = currParentWeightRate.multiply(nextTreeVo.getWeightRate()) + .divide(new BigDecimal("100"),2,BigDecimal.ROUND_DOWN); + }else { + break; + } + } + BmsCenterExtendBuild buildParentData = this.buildDataByTreeVo(source, currParentWeightRate); + buildParentData.setRowId(treeVo.getId()); + buildParentData.setPathCenterIds(treeVo.getPathCenterIds()); + buildParentData.setPathCenterCodes(treeVo.getPathCenterCodes()); + buildParentData.setPathCenterNames(treeVo.getPathCenterNames()); + buildParentData.setLastType(3); + buildDataList.add(buildParentData); + } + + /*//提取父级节点(有分支的) + List parents = new ArrayList<>(); + List allTreeToList = new ArrayList<>(); + this.buildAllTreeToList(allTreeList,allTreeToList); + this.filterParents(allTreeToList, source, parents); + //修改为 从上往下 + Collections.reverse(parents); + for (int i = 0; i < parents.size(); i++) { + BmsCenterExtendTreeVo treeVo = parents.get(i); + //计算父级节点比率 + BigDecimal currParentWeightRate = treeVo.getWeightRate(); + for (int j = i+1; j < parents.size(); j++) { + BmsCenterExtendTreeVo nextTreeVo = parents.get(j); + currParentWeightRate = currParentWeightRate.multiply(nextTreeVo.getWeightRate()) + .divide(new BigDecimal("100"),2,BigDecimal.ROUND_DOWN); + } + BmsCenterExtendBuild buildParentData = this.buildDataByTreeVo(source, currParentWeightRate); + buildParentData.setRowId(treeVo.getId()); + buildParentData.setPathCenterIds(treeVo.getPathCenterIds()); + buildParentData.setPathCenterCodes(treeVo.getPathCenterCodes()); + buildParentData.setPathCenterNames(treeVo.getPathCenterNames()); + buildParentData.setLastType(3); + buildDataList.add(buildParentData); + }*/ + }else { + //递归调用 + this.recursionBuildExtendCenter(allTreeList,source.getChildren(), buildTreeList,buildDataList); + } + } + } + + /** + * 过滤父级列表 + * @param allTreeList + * @param centerType + * @param pathCenterIds + * @param outDataParents + */ + private void filterParentTreeList(List allTreeList, String centerType, String pathCenterIds, List outDataParents) { + if(pathCenterIds.contains("_")){ + pathCenterIds = pathCenterIds.substring(0,pathCenterIds.lastIndexOf("_")); + for (BmsCenterExtendTreeVo treeVo : allTreeList) { + if(treeVo.getCenterType().equals(centerType)&& treeVo.getPathCenterIds().equals(pathCenterIds)){ + outDataParents.add(treeVo); + this.filterParentTreeList(allTreeList,centerType,treeVo.getPathCenterIds(),outDataParents); + } + } + } + } + + /** + * 建立数据类型对象 + * @param source + * @param currParentWeightRate + * @return + */ + private BmsCenterExtendBuild buildDataByTreeVo(BmsCenterExtendTreeVo source, BigDecimal currParentWeightRate) { + BmsCenterExtendBuild parentData = new BmsCenterExtendBuild(); + parentData.setRowId(source.getId()); + parentData.setBuildType(CenterExtendBuildType.DATA); + parentData.setCenterType(source.getCenterType()); + parentData.setCenterId(source.getCenterId()); + parentData.setCenterCode(source.getCenterCode()); + parentData.setCenterName(source.getCenterName()); + parentData.setStartTime(source.getStartTime()); + parentData.setStopTime(source.getStopTime()); + parentData.setStopFlag(source.getStopFlag()); + parentData.setWeightRate(currParentWeightRate); + return parentData; + } + + /** + * 树数据转list + * @param allTreeList + * @param outDataList + */ + private void buildAllTreeToList(List allTreeList,List outDataList){ + outDataList.addAll(allTreeList); + for (BmsCenterExtendTreeVo treeVo : allTreeList) { + if(CollectionUtil.isNotEmpty(treeVo.getChildren())){ + this.buildAllTreeToList(treeVo.getChildren(),outDataList); + } + } + } + + /** + * 过滤获取父级节点(自下而上) + * @param allTreeList + * @param source + * @param parents + */ + private void filterParents(List allTreeList, BmsCenterExtendTreeVo source, List parents) { + String pid = source.getComboParentId(); + for (BmsCenterExtendTreeVo treeVo : allTreeList) { + if(treeVo.getComboId().equals(pid)){ + parents.add(treeVo); + if(!treeVo.getComboParentId().equals("0")){ + this.filterParents(allTreeList,treeVo,parents); + } + } + } + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterExtendServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterExtendServiceImpl.java new file mode 100644 index 0000000..adc2d6d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterExtendServiceImpl.java @@ -0,0 +1,274 @@ +package com.qs.serve.modules.bms.service.impl; + +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.CollectionUtil; +import com.qs.serve.common.util.TreeUtil; +import com.qs.serve.modules.bms.entity.BmsCenterExtendUser; +import com.qs.serve.modules.bms.entity.BmsCostCenter; +import com.qs.serve.modules.bms.entity.bo.BmsCenterExtendBo; +import com.qs.serve.modules.bms.entity.vo.BmsCenterExtendTreeVo; +import com.qs.serve.modules.bms.mapper.*; +import com.qs.serve.modules.bms.service.BmsCenterExtendUserService; +import com.qs.serve.modules.goods.entity.dto.TbsCenterDto; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.tbs.service.TbsCenterDtoService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsCenterExtend; +import com.qs.serve.modules.bms.service.BmsCenterExtendService; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; +import java.util.List; +/** + * 后继成本中心 服务实现类 + * @author YenHex + * @since 2023-05-30 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsCenterExtendServiceImpl extends ServiceImpl implements BmsCenterExtendService { + + private TbsCenterDtoService centerDtoService; + private BmsCenterExtendUserService centerExtendUserService; + private SysUserMapper sysUserMapper; + + @Override + public List transferTree() { + //查询最高层级 + List rootList = this.baseMapper.selectTopList(); + rootList = rootList.stream().filter(a->a.getSourceId().equals(0L)).collect(Collectors.toList()); + + //查询所有减少查询 + List listAll = this.list(); + listAll.forEach(ext->ext.setComboId(ext.getCenterType()+"_"+ext.getCenterId())); + + //设置最高层级树节点 + List treeRoot = new ArrayList<>(); + for (BmsCenterExtend root : rootList) { + for (BmsCenterExtend node : listAll) { + if(root.getId().equals(node.getId())){ + BmsCenterExtendTreeVo treeVo = this.toTreeVo(node,"0",node.getCenterId(),node.getCenterCode(),node.getCenterName()); + treeRoot.add(treeVo); + break; + } + } + } + + Map> listMapBySourId = listAll.stream() + .collect(Collectors.groupingBy(BmsCenterExtend::getSourceId)); + + //停用的节点 + List stopRows = listMapBySourId.get(0L); + //主要业务 + for (BmsCenterExtendTreeVo treeVo : treeRoot) { + Long sourceId = treeVo.getId(); + //source查找的子节点 + this.buildTreeVoData(listMapBySourId, stopRows, treeVo, sourceId); + } + return treeRoot; + } + + private void buildTreeVoData(Map> listMapBySourId, List stopRows, + BmsCenterExtendTreeVo treeVo, Long sourceId) { + List sourceList = listMapBySourId.get(sourceId); + if(CollectionUtil.isNotEmpty(sourceList)){ + List children = new ArrayList<>(); + for (BmsCenterExtend ext : sourceList) { + String comboId = ext.getComboId(); + String centerIds = treeVo.getPathCenterIds()+"_"+ext.getCenterId(); + String centerCodes = treeVo.getPathCenterCodes()+"_"+ext.getCenterName(); + String centerNames = treeVo.getPathCenterNames()+"_"+ext.getCenterName(); + BmsCenterExtendTreeVo entity = this.toTreeVo(ext, treeVo.getComboId(),centerIds,centerCodes,centerNames); + for (BmsCenterExtend stopRow : stopRows) { + if(stopRow.getComboId().equals(comboId)){ + //支持多继承,若中断为单继承 + this.buildTreeVoData(listMapBySourId,stopRows,entity,stopRow.getId()); + } + } + children.add(entity); + } + treeVo.setChildren(children); + } + } + + /** + * 转换对象 + * @param exCenter + * @param parentId + * @param centerIds + * @param centerCodes + * @param centerNames + * @return + */ + private BmsCenterExtendTreeVo toTreeVo(BmsCenterExtend exCenter,String parentId, + String centerIds,String centerCodes,String centerNames){ + BmsCenterExtendTreeVo treeNode = new BmsCenterExtendTreeVo(); + treeNode.setComboId(exCenter.getCenterType()+"_"+exCenter.getCenterId()); + treeNode.setComboParentId(parentId); + treeNode.setId(exCenter.getId()); + treeNode.setPathCenterCodes(centerCodes); + treeNode.setPathCenterIds(centerIds); + treeNode.setPathCenterNames(centerNames); + treeNode.setSourceId(exCenter.getSourceId()); + treeNode.setCenterType(exCenter.getCenterType()); + treeNode.setCenterId(exCenter.getCenterId()); + treeNode.setCenterCode(exCenter.getCenterCode()); + treeNode.setCenterName(exCenter.getCenterName()); + treeNode.setStartTime(exCenter.getStartTime()); + treeNode.setStopTime(exCenter.getStopTime()); + treeNode.setStopFlag(exCenter.getStopFlag()); + //这是分配的比率,不是自身(除ComboParentId=0) + treeNode.setWeightRate(exCenter.getWeightRate()); + return treeNode; + } + + @Override + public boolean checkIsStop(String type, String centerId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsCenterExtend::getCenterType,type); + lqw.eq(BmsCenterExtend::getCenterId,centerId); + lqw.eq(BmsCenterExtend::getStopFlag,1); + return this.count(lqw)>0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public BmsCenterExtend allocation(BmsCenterExtendBo param) { + //校验 + String type = param.getType(); + String centerId = param.getSourceCenterId(); + BigDecimal n100 = new BigDecimal("100"); + List targetCenters = param.getTargetCenters(); + BigDecimal totalRate = BigDecimal.ZERO; + for (BmsCenterExtendBo.Item center : targetCenters) { + totalRate=totalRate.add(center.getWeightRate()); + } + if(totalRate.compareTo(n100)!=0){ + Assert.throwEx("权重合计必须百分百"); + } + for (BmsCenterExtendBo.Item targetCenter : targetCenters) { + if(targetCenter.getTargetCenterId().equals(param.getSourceCenterId())){ + Assert.throwEx("后继成本中心与当前成本中心相同"); + } + } + + TbsCenterDto centerDto = centerDtoService.getCenterDto(type,centerId); + //停止时间 + LocalDateTime nowTime = param.getExtendDate().atStartOfDay(); + + BmsCenterExtend currentCenter; + if(param.getId()!=null){ + //代办更新,删除历史数据 + LambdaQueryWrapper rmLqw1 = new LambdaQueryWrapper<>(); + rmLqw1.eq(BmsCenterExtend::getSourceId,param.getId()); + this.remove(rmLqw1); + + currentCenter = this.getById(param.getId()); + currentCenter.setStopTime(nowTime); + this.updateById(currentCenter); + }else { + //防止递归 + if (this.checkIsStop(type,centerId)){ + Assert.throwEx("当前成本中心已分配"); + } + for (BmsCenterExtendBo.Item targetCenter : targetCenters) { + boolean b = this.checkIsStop(type,targetCenter.getTargetCenterId()); + if(b){ + Assert.throwEx("部分后继成本中心已分配"); + } + } + //查询是否已有基础 +// LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); +// lqw.eq(BmsCenterExtend::getCenterType,type); +// lqw.eq(BmsCenterExtend::getCenterId,centerId); +// BmsCenterExtend orgEx = this.getOne(lqw,false); + //代办新增 + currentCenter = new BmsCenterExtend(); + currentCenter.setSourceId(0L); + + currentCenter.setCenterType(type); + currentCenter.setCenterId(centerId); + currentCenter.setCenterCode(centerDto.getCenterCode()); + currentCenter.setCenterName(centerDto.getCenterName()); + currentCenter.setStartTime(centerDto.getCreateTime()); + currentCenter.setStopTime(nowTime); + currentCenter.setStopFlag(1); + currentCenter.setWeightRate(n100); + this.save(currentCenter); + } + + //新的继承节点 + for (BmsCenterExtendBo.Item targetCenter : targetCenters) { + TbsCenterDto centerDto2 = centerDtoService.getCenterDto(currentCenter.getCenterType(),targetCenter.getTargetCenterId()); + BigDecimal weightRate = currentCenter.getWeightRate() + .multiply(targetCenter.getWeightRate()) + .divide(n100); + BmsCenterExtend currentChildCenter = new BmsCenterExtend(); + currentChildCenter.setSourceId(currentCenter.getId()); + currentChildCenter.setCenterType(currentCenter.getCenterType()); + currentChildCenter.setCenterId(centerDto2.getId()); + currentChildCenter.setCenterCode(centerDto2.getCenterCode()); + currentChildCenter.setCenterName(centerDto2.getCenterName()); + currentChildCenter.setStartTime(nowTime); + currentChildCenter.setStopFlag(0); + currentChildCenter.setWeightRate(weightRate); + this.save(currentChildCenter); + //保持后继人员 + this.toSaveExtendUser( currentCenter, targetCenter.getUserList(), centerDto2, currentChildCenter.getId()); + } + return currentCenter; + } + + private void toSaveExtendUser(BmsCenterExtend currentCenter, List userList, TbsCenterDto centerDto2, Long childExtendId) { + BigDecimal n100 = new BigDecimal("100"); + BigDecimal totalUser = BigDecimal.ZERO; + List extendUserList = new ArrayList<>(); + for (BmsCenterExtendBo.AllocationUser allocationUser : userList) { + totalUser = totalUser.add(allocationUser.getWeightRate()); + BmsCenterExtendUser extendUser = new BmsCenterExtendUser(); + SysUser sysUser = sysUserMapper.selectById(allocationUser.getUserId()); + extendUser.setChildExtId(childExtendId); + extendUser.setSourceId(currentCenter.getId()); + extendUser.setCenterType(currentCenter.getCenterType()); + extendUser.setCenterId(centerDto2.getId()); + extendUser.setCenterCode(centerDto2.getCenterCode()); + extendUser.setCenterName(centerDto2.getCenterName()); + extendUser.setUserId(sysUser.getId()); + extendUser.setUserCode(sysUser.getCode()); + extendUser.setUserName(sysUser.getName()); + extendUser.setWeightRate(allocationUser.getWeightRate()); + extendUserList.add(extendUser); + } + if(totalUser.compareTo(n100)!=0){ + Assert.throwEx("["+ centerDto2.getCenterName()+"]人员比例异常"); + } + centerExtendUserService.saveBatch(extendUserList); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAndReply(Long id) { + LambdaQueryWrapper delUsrLqw = new LambdaQueryWrapper<>(); + delUsrLqw.eq(BmsCenterExtendUser::getSourceId,id); + centerExtendUserService.remove(delUsrLqw); + + LambdaQueryWrapper delChildLqw = new LambdaQueryWrapper<>(); + delChildLqw.eq(BmsCenterExtend::getSourceId,id); + this.remove(delChildLqw); + + this.removeById(id); + + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterExtendUserServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterExtendUserServiceImpl.java new file mode 100644 index 0000000..b3de8ae --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterExtendUserServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsCenterExtendUser; +import com.qs.serve.modules.bms.service.BmsCenterExtendUserService; +import com.qs.serve.modules.bms.mapper.BmsCenterExtendUserMapper; + +/** + * 后继负责人 服务实现类 + * @author YenHex + * @since 2023-05-31 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsCenterExtendUserServiceImpl extends ServiceImpl implements BmsCenterExtendUserService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterRegionServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterRegionServiceImpl.java new file mode 100644 index 0000000..a2aa0ad --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCenterRegionServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsCenterRegion; +import com.qs.serve.modules.bms.service.BmsCenterRegionService; +import com.qs.serve.modules.bms.mapper.BmsCenterRegionMapper; + +/** + * 服务实现类 + * @author YenHex + * @since 2023-07-20 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsCenterRegionServiceImpl extends ServiceImpl implements BmsCenterRegionService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsChannelPointServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsChannelPointServiceImpl.java new file mode 100644 index 0000000..7d5273a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsChannelPointServiceImpl.java @@ -0,0 +1,176 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.RowParam; +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.common.MasterUserType; +import com.qs.serve.modules.bms.entity.*; +import com.qs.serve.modules.bms.entity.bo.BmsChannelPointBo; +import com.qs.serve.modules.bms.mapper.BmsMasterUserMapper; +import com.qs.serve.modules.bms.service.BmsChannelService; +import com.qs.serve.modules.bms.service.BmsRegion2Service; +import com.qs.serve.modules.bms.service.BmsRegionService; +import com.qs.serve.modules.his.service.HisUserChannelPointService; +import com.qs.serve.modules.sys.common.enums.BusinessLogType; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.sys.service.SysBusinessLogService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.service.BmsChannelPointService; +import com.qs.serve.modules.bms.mapper.BmsChannelPointMapper; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 渠道站点 服务实现类 + * @author YenHex + * @since 2022-11-03 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsChannelPointServiceImpl extends ServiceImpl implements BmsChannelPointService { + + private BmsRegionService bmsRegionService; + private BmsRegion2Service bmsRegion2Service; + private BmsChannelService bmsChannelService; + private HisUserChannelPointService hisUserChannelPointService; + private SysBusinessLogService sysBusinessLogService; + + private SysUserMapper sysUserMapper; + private BmsMasterUserMapper bmsMasterUserMapper; + + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean modify(BmsChannelPointBo param) { + BmsChannelPoint channelPoint = CopierUtil.copy(param,new BmsChannelPoint()); + BmsChannel channel = null; + if(channelPoint.getChannelId()!=null){ + channel = bmsChannelService.getById(channelPoint.getChannelId()); + if(channel!=null) { + channelPoint.setChannelName(channel.getChannelName()); + channelPoint.setChannelCode(channel.getChannelCode()); + }else{ + Assert.throwEx("无相关渠道信息"); + } + } + + if(param.getSaleRegionId()!=null){ + BmsRegion bmsRegion = bmsRegionService.getById(param.getSaleRegionId()); + if(bmsRegion!=null) { + channelPoint.setSaleRegionPath(bmsRegion.getPathNames()); + channelPoint.setSaleRegionPathIds(bmsRegion.getPathIds()); + } + } + if(param.getBizRegionId()!=null){ + BmsRegion2 bmsRegion2 = bmsRegion2Service.getById(param.getBizRegionId()); + if(bmsRegion2!=null) { + channelPoint.setBizRegionPath(bmsRegion2.getPathNames()); + channelPoint.setBizRegionPathIds(bmsRegion2.getPathIds()); + } + } + if(channelPoint.getId()==null){ + channelPoint.setPointCode("D"+StringUtils.genShortId()); + this.save(channelPoint); + sysBusinessLogService.buildLog4Save(BusinessLogType.Point,channelPoint.getId()+"",channelPoint.getPointCode(),channelPoint.getPointName(),null,channelPoint); + //添加默认为该网点联系人 + SysUser sysUser = sysUserMapper.selectById(AuthContextUtils.getSysUserId()); + BmsMasterUser masterUser = new BmsMasterUser(); + masterUser.setType(MasterUserType.Point); + masterUser.setTargetId(channelPoint.getId()+""); + masterUser.setChannelName(channel.getChannelName()); + masterUser.setChannelCode(channel.getChannelCode()); + masterUser.setPointCode(channelPoint.getPointCode()); + masterUser.setPointName(channelPoint.getPointName()); + masterUser.setUserId(sysUser.getId()); + masterUser.setUserName(sysUser.getName()); + masterUser.setUserCode(sysUser.getCode()); + bmsMasterUserMapper.insert(masterUser); + //更新底层的关联表 + //hisUserChannelPointService.initSetupByPointId(channelPoint.getId()); + }else { + //编码不可重复 + Long count = this.count(new LambdaQueryWrapper() + .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); + this.updateById(channelPoint); + } + LambdaQueryWrapper mgrLqw = new LambdaQueryWrapper<>(); + mgrLqw.eq(BmsMasterUser::getType, MasterUserType.Point); + mgrLqw.eq(BmsMasterUser::getTargetId,channelPoint.getId()); + List masterUserList = bmsMasterUserMapper.selectList(mgrLqw); + for (BmsMasterUser masterUser : masterUserList) { + masterUser.setPointName(channelPoint.getPointName()); + masterUser.setPointCode(channelPoint.getPointCode()); + bmsMasterUserMapper.updateById(masterUser); + } + //hisUserChannelPointService.flushPoint(channelPoint.getId(),channelPoint.getSaleRegionPathIds(),channelPoint.getBizRegionPathIds()); + return true; + } + + @Override + public List selectChannelPointList(BmsChannelPoint channelPoint) { + return baseMapper.selectChannelPointList(channelPoint); + } + + @Override + public List selectChannelPointMyList(BmsChannelPoint channelPoint, List userIds,RowParam rowParam) { + return baseMapper.selectPointByUserIds(channelPoint, userIds,channelPoint.getSupplierId(),rowParam); + } + + @Override + public Long selectCountChannelPointMyList(BmsChannelPoint channelPoint, List userIds) { + return baseMapper.selectCountPointByUserIds(channelPoint, userIds,channelPoint.getSupplierId()); + } + + @Override + public List selectChannelPointMyList(BmsChannelPoint channelPoint) { + return baseMapper.selectUserPointList4My(channelPoint); + } + + @Override + public List selectChannelPointMyUnderList(BmsChannelPoint channelPoint) { + return baseMapper.selectUserPointList4MyUnder(channelPoint); + } + + @Override + public List listByBizRegionId(String id) { + LambdaQueryWrapper channelPointWrapper = new LambdaQueryWrapper<>(); + channelPointWrapper.eq(BmsChannelPoint::getBizRegionId,id); + List list = this.list(channelPointWrapper); + return list; + } + + @Override + public List listBySaleRegionId(String id) { + LambdaQueryWrapper channelPointWrapper = new LambdaQueryWrapper<>(); + channelPointWrapper.eq(BmsChannelPoint::getSaleRegionId,id); + List list = this.list(channelPointWrapper); + return list; + } + + @Override + public List listByChannelId(Long id) { + LambdaQueryWrapper channelPointWrapper = new LambdaQueryWrapper<>(); + channelPointWrapper.eq(BmsChannelPoint::getChannelId,id); + List list = this.list(channelPointWrapper); + return list; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsChannelServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsChannelServiceImpl.java new file mode 100644 index 0000000..ab5108d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsChannelServiceImpl.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsChannel; +import com.qs.serve.modules.bms.service.BmsChannelService; +import com.qs.serve.modules.bms.mapper.BmsChannelMapper; + +import java.util.List; + +/** + * 渠道 服务实现类 + * @author YenHex + * @since 2022-11-03 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsChannelServiceImpl extends ServiceImpl implements BmsChannelService { + + @Override + public List selectChannelList(BmsChannel channel, List userIds,String supplierId) { + return baseMapper.selectChannelList(channel, userIds, supplierId); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCostCenterServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCostCenterServiceImpl.java new file mode 100644 index 0000000..3271ac6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsCostCenterServiceImpl.java @@ -0,0 +1,56 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.bms.entity.BmsSubject; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsCostCenter; +import com.qs.serve.modules.bms.service.BmsCostCenterService; +import com.qs.serve.modules.bms.mapper.BmsCostCenterMapper; + +import java.util.List; + +/** + * 成本中心 服务实现类 + * @author YenHex + * @since 2022-10-13 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsCostCenterServiceImpl extends ServiceImpl implements BmsCostCenterService { + + @Override + public BmsCostCenter getByCode(String code) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsCostCenter::getCode,code); + return this.getOne(lqw,false); + } + + @Override + public BmsCostCenter getByName(String name) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsCostCenter::getName,name); + return this.getOne(lqw,true); + } + + @Override + public BmsCostCenter getByNameOrCode(String value) { + return this.getOne(new LambdaQueryWrapper() + .eq(BmsCostCenter::getName,value) + .or() + .eq(BmsCostCenter::getCode,value) + ,true); + } + + @Override + public List listChild(Long pid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsCostCenter::getPid,pid); + return this.list(lqw); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsDutyInfoServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsDutyInfoServiceImpl.java new file mode 100644 index 0000000..ab0fe33 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsDutyInfoServiceImpl.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsDutyInfo; +import com.qs.serve.modules.bms.service.BmsDutyInfoService; +import com.qs.serve.modules.bms.mapper.BmsDutyInfoMapper; + +/** + * 税务信息表 服务实现类 + * @author YenHex + * @since 2023-08-30 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsDutyInfoServiceImpl extends ServiceImpl implements BmsDutyInfoService { + + @Override + public BmsDutyInfo getByDutyNumber(String code) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsDutyInfo::getDutyCode,code); + return getOne(lqw,false); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsFactoryServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsFactoryServiceImpl.java new file mode 100644 index 0000000..9103a2e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsFactoryServiceImpl.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsFactory; +import com.qs.serve.modules.bms.service.BmsFactoryService; +import com.qs.serve.modules.bms.mapper.BmsFactoryMapper; + +/** + * 工厂产地 服务实现类 + * @author YenHex + * @since 2022-10-20 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsFactoryServiceImpl extends ServiceImpl implements BmsFactoryService { + + @Override + public BmsFactory getByCode(String code) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsFactory::getCode,code); + return getOne(lqw,false); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsMasterUserServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsMasterUserServiceImpl.java new file mode 100644 index 0000000..97ac51c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsMasterUserServiceImpl.java @@ -0,0 +1,62 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.bms.entity.BmsRegionUser; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsMasterUser; +import com.qs.serve.modules.bms.service.BmsMasterUserService; +import com.qs.serve.modules.bms.mapper.BmsMasterUserMapper; + +/** + * 负责人 服务实现类 + * @author YenHex + * @since 2022-11-10 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsMasterUserServiceImpl extends ServiceImpl implements BmsMasterUserService { + + @Override + public void removeMgrUser(String type, String targetId, String userId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsMasterUser::getTargetId,targetId); + lqw.eq(BmsMasterUser::getType,type); + lqw.eq(BmsMasterUser::getUserId,userId); + this.remove(lqw); + } + + @Override + public void removeMgrUser(String type, String targetId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsMasterUser::getTargetId,targetId); + lqw.eq(BmsMasterUser::getType,type); + this.remove(lqw); + } + + @Override + public BmsMasterUser getByParam(String type, String targetId, String userId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsMasterUser::getTargetId,targetId); + lqw.eq(BmsMasterUser::getType,type); + lqw.eq(BmsMasterUser::getUserId,userId); + return this.getOne(lqw,false); + } + + @Override + public void setMaster(Long id) { + BmsMasterUser masterUser = this.getById(id); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsMasterUser::getTargetId,masterUser.getTargetId()); + lqw.eq(BmsMasterUser::getType,masterUser.getType()); + BmsMasterUser param = new BmsMasterUser(); + param.setMasterFlag(0); + this.update(param,lqw); + masterUser.setMasterFlag(1); + this.updateById(masterUser); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsRegion2ServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsRegion2ServiceImpl.java new file mode 100644 index 0000000..54f1269 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsRegion2ServiceImpl.java @@ -0,0 +1,421 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.TreeNode; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsRegionUser; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.vo.BmsRegionTreeVo; +import com.qs.serve.modules.bms.mapper.BmsChannelPointMapper; +import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsRegion2Service; +import com.qs.serve.modules.bms.service.BmsRegionUserService; +import com.qs.serve.modules.his.service.HisUserChannelPointService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 区域档案 服务实现类 + * @author YenHex + * @since 2022-10-10 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsRegion2ServiceImpl extends ServiceImpl implements BmsRegion2Service { + + private BmsRegionUserService bmsRegionUserService; + private SysUserService sysUserService; + private BmsChannelPointMapper bmsChannelPointMapper; + private HisUserChannelPointService hisUserChannelPointService; + private BmsSupplierApplicationService bmsSupplierApplicationService; + private BmsSupplierMapper bmsSupplierMapper; + + @Override + public boolean saveBmsRegion2(BmsRegion2 param){ + this.checkSysCodes(param); + param = this.toSetLevel(param); + return this.save(param); + } + + + private void checkSysCodes(BmsRegion2 param) { + if(StringUtils.hasText(param.getSysCode1())){ + long count1 = baseMapper.countSysCode1(param.getSysCode1(), param.getId());if(count1>0){ + Assert.throwEx("系统编码1不可重复"); + } + } + if(StringUtils.hasText(param.getSysCode2())){ + long count1 = baseMapper.countSysCode1(param.getSysCode2(), param.getId());if(count1>0){ + Assert.throwEx("系统编码2不可重复"); + } + } + if(StringUtils.hasText(param.getSysCode3())){ + long count1 = baseMapper.countSysCode3(param.getSysCode3(), param.getId());if(count1>0){ + Assert.throwEx("系统编码3不可重复"); + } + } + } + @Transactional(rollbackFor = Exception.class) + @Override + public boolean updateBizRegionById(BmsRegion2 newRegion) { + String regionId = newRegion.getId(); + this.checkSysCodes(newRegion); + this.toSetLevel(newRegion); + BmsRegion2 orgRegion = this.getById(regionId); + boolean changePid = !orgRegion.getPid().equals(newRegion.getPid()); + if(changePid){ + //更变子级,拦截递归的错误设置 + List childTree = this.listTreeChildByDeep(regionId,newRegion.getLevel()); + //罗列相关的客户进行更新 + List supplierList = bmsSupplierMapper.selectList(new LambdaQueryWrapper() + .select(BmsSupplier::getId,BmsSupplier::getRegion2First,BmsSupplier::getRegion2Second,BmsSupplier::getRegion2Third) + .eq(BmsSupplier::getRegion2First,regionId) + .or() + .eq(BmsSupplier::getRegion2Second,regionId) + .or() + .eq(BmsSupplier::getRegion2Third,regionId) + .or() + .eq(BmsSupplier::getRegion2Fourthly,regionId) + ); + + //利用有序 + List sortList = new ArrayList<>(); + sortList.add(newRegion.getId()); + if (!newRegion.getPid().equals("0")){ + BmsRegion2 p1 = this.getById(newRegion.getPid()); + sortList.add(p1.getId()); + if(!p1.getPid().equals("0")){ + BmsRegion2 p2 = this.getById(p1.getPid()); + sortList.add(p2.getId()); + } + } + // size对应层级数 + int size = sortList.size(); + for (BmsSupplier supplier : supplierList) { + if(size==3){ + //3级 + supplier.setRegion2First(sortList.get(2)); + supplier.setRegion2Second(sortList.get(1)); + supplier.setRegion2Third(sortList.get(0)); + supplier.setRegion2Last(sortList.get(0)); + log.debug("3级变动"); + }else if (size==2){ + //二级 + supplier.setRegion2First(sortList.get(1)); + ////supplier.setRegion2Last(sortList.get(0)); + //supplier.setRegion2Second(sortList.get(0)); + if (orgRegion.getLevel() > (newRegion.getLevel())){ + supplier.setRegion2Second(sortList.get(0)); + log.debug("层级变小,由三级变二级"); + supplier.setRegion2Third("0"); + }if (orgRegion.getLevel() < (newRegion.getLevel())){ + log.debug("层级变大,由一级变二级"); + supplier.setRegion2Third(supplier.getRegion2Second()); + supplier.setRegion2Second(sortList.get(0)); + }else { + log.debug("二级,平级更新"); + supplier.setRegion2Second(sortList.get(0)); + if(!StringUtils.hasText(supplier.getRegion2Third())){ + supplier.setRegion2Last(supplier.getRegion2Second()); + } + } + }else { + //一级 + log.debug("更换变一级"); + supplier.setRegion2First(sortList.get(0)); + supplier.setRegion2Last(sortList.get(0)); + if (orgRegion.getLevel() > (newRegion.getLevel())){ + log.debug("层级变小,由二级变一级"); + Assert.throwEx("二级变一级不支持"); + supplier.setRegion2Second(supplier.getRegion2Third()); + supplier.setRegion2Third("0"); + }else { + supplier.setRegion2Second("0"); + supplier.setRegion2Third("0"); + } + } + bmsSupplierMapper.updateById(supplier); + } + } + this.updateById(newRegion); + //this.flushAllLevel(true); + return true; + } + + @Override + public List listTreeChildByDeep(String pid,Integer parentLevel){ + List list = this.listChild(pid); + if(parentLevel > 2 && CollectionUtil.isNotEmpty(list)){ + Assert.throwEx("最高只能设置3层级"); + } + for (BmsRegion2 region2 : list) { + List childList = listTreeChildByDeep(region2.getId(),parentLevel++); + region2.setChildNodes(childList); + } + return list; + } + + @Override + public boolean updateBmsRegion2ById(BmsRegion2 param){ + this.checkSysCodes(param); + BmsRegion2 ori = this.getById(param.getId()); + param = this.toSetLevel(param); + boolean changePid = !ori.getPid().equals(param.getPid()); + if(changePid){ + Assert.throwEx("当前版本限制上下级变更"); + } + boolean b = updateById(param); + if(!ori.getName().equals(param.getName())||changePid) { + BmsRegion2 parentRegion = this.updatePathByPid(param.getId()); + if(changePid){ + hisUserChannelPointService.removeRegion(1,ori.getPathIds()); + hisUserChannelPointService.flushRegion(1,parentRegion.getPathIds()); + + BmsRegion2 currentRegion = this.getById(param.getId()); + List regionSupplierList = bmsSupplierApplicationService.listByRegionIds(Arrays.asList(ori.getId()),ori.getLevel()); + if(CollectionUtil.isNotEmpty(regionSupplierList)){ + String[] ids = currentRegion.getPathIds().split("_"); + String region1 = "0"; + String region2 = "0"; + String region3 = "0"; + String region4 = "0"; + String regionLast = "0"; + if(ids.length>0){ + region1 = ids[0]; + regionLast = region1; + } + if(ids.length>1){ + region2 = ids[1]; + regionLast = region2; + } + if(ids.length>2){ + region3 = ids[2]; + regionLast = region3; + } + if(ids.length>3){ + region4 = ids[3]; + regionLast = region4; + } + for (BmsSupplier supplier : regionSupplierList) { + supplier.setRegion2First(region1); + supplier.setRegion2Second(region2); + supplier.setRegion2Third(region3); + supplier.setRegion2Fourthly(region4); + supplier.setRegion2Last(regionLast); + bmsSupplierMapper.updateById(supplier); + } + } + } + } + return b; + } + + @Override + public List getTree(boolean listUserFlag) { + LambdaQueryWrapper regionWrapper = new LambdaQueryWrapper<>(); + List list = this.list(regionWrapper); + if(listUserFlag){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRegionUser::getType,1); + List regionUsers = bmsRegionUserService.list(lqw); + List userIds = regionUsers.stream().map(BmsRegionUser::getUserId).collect(Collectors.toList()); + List sysUsers; + if(userIds.size()<1000){ + if(userIds.size()==0){ + sysUsers = new ArrayList<>(); + }else { + sysUsers = sysUserService.listByIds(userIds); + } + }else { + sysUsers = sysUserService.list(); + } + for (BmsRegionUser bmsRegionUser : regionUsers) { + for (SysUser sysUser : sysUsers) { + if(bmsRegionUser.getUserId().equals(sysUser.getId())){ + bmsRegionUser.setUserName(sysUser.getName()); + bmsRegionUser.setUserCode(sysUser.getCode()); + break; + } + } + } + for (BmsRegion2 bmsRegion2 : list) { + bmsRegion2.setRegionUsers(regionUsers.stream() + .filter(user->bmsRegion2.getId().equals(user.getRegionId())) + .collect(Collectors.toList())); + } + } + List treeVoList = list.stream().map(region->{ + BmsRegionTreeVo treeNode = CopierUtil.copy(region,new BmsRegionTreeVo()); + treeNode.setId(region.getId()); + treeNode.setParentId(region.getPid()); + treeNode.setSort(0); + treeNode.setRegionUsers(region.getRegionUsers()); + return treeNode; + }).collect(Collectors.toList()); + return TreeUtil.buildByRecursive(treeVoList,TreeUtil.DEFAULT_PID_STRING); + } + + @Override + public List listChild(String pid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRegion2::getPid,pid); + return this.list(lqw); + } + + @Override + public List listChild(List pid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(BmsRegion2::getPid,pid); + return this.list(lqw); + } + + @Override + public BmsRegion2 getByCode(String code) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRegion2::getCode,code); + return this.getOne(lqw,false); + } + + @Override + public BmsRegion2 getByName(String name, Integer level) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRegion2::getName,name); + if(level!=null){ + lqw.eq(BmsRegion2::getLevel,level); + } + return this.getOne(lqw,true); + } + + @Override + public BmsRegion2 getByNameOrCode(String value) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRegion2::getName,value) + .or() + .eq(BmsRegion2::getCode,value); + List region2List = this.list(lqw); + if(region2List.size()>0){ + return region2List.get(0); + } + return null; + } + + public BmsRegion2 toSetLevel(BmsRegion2 param) { + if(StringUtils.hasText(param.getPid()) && !param.getPid().equals("0")){ + BmsRegion2 parent = this.getById(param.getPid()); + if(parent!=null){ + if(parent.getLevel()>2){ + Assert.throwEx("最高支持3层级"); + } + param.setLevel(parent.getLevel()+1); + param.setPathIds(parent.getPathIds()+"_"+param.getId()); + param.setPathNames(parent.getPathNames()+"_"+param.getName()); + }else { + Assert.throwEx("无相关父级数据"); + } + }else { + param.setPid("0"); + param.setLevel(1); + param.setPathIds(param.getId()); + param.setPathNames(param.getName()); + } + return param; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void flushAllLevel(boolean batchUpdate) { + this.baseMapper.updateSetPathNull(); + List treeVoList = this.getTree(false); + for (BmsRegionTreeVo firstTree : treeVoList) { + if(firstTree.getLevel()==null||firstTree.getLevel()!=1||batchUpdate){ + String pathIds = firstTree.getId(); + String pathNames = firstTree.getName(); + BmsRegion2 param = this.getUpdLevelParam(firstTree.getId(),1,pathIds,pathNames); + this.updateById(param); + } + if(CollectionUtil.isNotEmpty(firstTree.getChildren())){ + for (TreeNode secondTreeNode : firstTree.getChildren()) { + BmsRegionTreeVo secondTree = (BmsRegionTreeVo)secondTreeNode; + if(secondTree.getLevel()==null||secondTree.getLevel()!=2||batchUpdate){ + String pathIds = firstTree.getId()+"_"+secondTree.getId(); + String pathNames = firstTree.getName()+"_"+secondTree.getName(); + BmsRegion2 param = this.getUpdLevelParam(secondTree.getId(),2,pathIds,pathNames); + this.updateById(param); + } + if(CollectionUtil.isNotEmpty(secondTree.getChildren())){ + for (TreeNode thirdTreeNode : secondTree.getChildren()) { + BmsRegionTreeVo thirdTree = (BmsRegionTreeVo)thirdTreeNode; + if(thirdTree.getLevel()==null||thirdTree.getLevel()!=3||batchUpdate){ + String pathIds = firstTree.getId()+"_"+secondTree.getId()+"_"+thirdTree.getId(); + String pathNames = firstTree.getName()+"_"+secondTree.getName()+"_"+thirdTree.getName(); + BmsRegion2 param = this.getUpdLevelParam(thirdTree.getId(),3,pathIds,pathNames); + this.updateById(param); + } + if(CollectionUtil.isNotEmpty(thirdTree.getChildren())){ + for (TreeNode fourthlyTreeNode : thirdTree.getChildren()) { + BmsRegionTreeVo fourthlyTree = (BmsRegionTreeVo)fourthlyTreeNode; + if(fourthlyTree.getLevel()==null||fourthlyTree.getLevel()!=4||batchUpdate){ + String pathIds = firstTree.getId()+"_"+secondTree.getId()+"_"+thirdTree.getId()+"_"+fourthlyTree.getId(); + String pathNames = firstTree.getName()+"_"+secondTree.getName()+"_"+thirdTree.getName()+"_"+fourthlyTree.getName(); + BmsRegion2 param = this.getUpdLevelParam(fourthlyTree.getId(),4,pathIds,pathNames); + this.updateById(param); + } + } + } + } + } + } + } + } + } + + + public BmsRegion2 getUpdLevelParam(String id, Integer level,String pathIds,String pathName) { + BmsRegion2 param = new BmsRegion2(); + param.setId(id); + param.setLevel(level); + param.setPathIds(pathIds); + param.setPathNames(pathName); + return param; + } + + private BmsRegion2 updatePathByPid(String pid){ + BmsRegion2 parRegion = this.getById(pid); + List regionList = listChild(pid); + if(regionList.size()>0){ + regionList = regionList.stream().map(a->{ + String[] pars = parRegion.getPathIds().split("_"); + if(Arrays.stream(pars).anyMatch(v->v.equals(a.getId()))||pars.length>4){ + Assert.throwEx("出现递归数据"); + } + a.setPathIds(parRegion.getPathIds()+"_"+a.getId()); + a.setPathNames(parRegion.getPathNames()+"_"+a.getName()); + return a; + }).collect(Collectors.toList()); + boolean updateFlag = this.updateBatchById(regionList); + if(!updateFlag){ + Assert.throwEx("更新区域链失败!"); + } + for(BmsRegion2 re:regionList){ + bmsChannelPointMapper.udpateBizRegionPathByBizRegionId(re.getPathNames(),re.getId()); + this.updatePathByPid(re.getId()); + } + } + return parRegion; + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsRegionServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsRegionServiceImpl.java new file mode 100644 index 0000000..a805b87 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsRegionServiceImpl.java @@ -0,0 +1,495 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.TreeNode; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.common.FactoryIdOperation; +import com.qs.serve.modules.bms.entity.*; +import com.qs.serve.modules.bms.entity.vo.BmsRegionTreeVo; +import com.qs.serve.modules.bms.mapper.BmsChannelPointMapper; +import com.qs.serve.modules.bms.mapper.BmsFactoryMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsFactoryService; +import com.qs.serve.modules.bms.service.BmsRegionUserService; +import com.qs.serve.modules.his.service.HisUserChannelPointService; +import com.qs.serve.modules.his.service.HisUserSupplierService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.service.BmsRegionService; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 区域档案 服务实现类 + * @author YenHex + * @since 2022-10-10 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsRegionServiceImpl extends ServiceImpl implements BmsRegionService { + + private BmsRegionUserService bmsRegionUserService; + private SysUserService sysUserService; + private BmsChannelPointMapper bmsChannelPointMapper; + private BmsFactoryService bmsFactoryService; + private BmsSupplierApplicationService bmsSupplierApplicationService; + private BmsSupplierMapper bmsSupplierMapper; + + + @Override + public boolean saveBmsRegion(BmsRegion param){ + this.checkSysCodes(param); + param = this.flushSetLevel(param); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.orderByAsc(BmsFactory::getCode); + String[] FactoryIds = bmsFactoryService.list(lqw).stream().map(a->a.getId()).toArray(String[]::new); + param.setFactoryIds(FactoryIds); + return this.save(param); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean updateSaleRegionById(BmsRegion newRegion) { + String regionId = newRegion.getId(); + this.checkSysCodes(newRegion); + this.toSetLevel(newRegion); + BmsRegion orgRegion = this.getById(regionId); + boolean changePid = !orgRegion.getPid().equals(newRegion.getPid()); + if(changePid){ + //更变子级,拦截递归的错误设置 + List childTree = this.listTreeChildByDeep(regionId,newRegion.getLevel()); + + //罗列相关的客户进行更新 + List supplierList = bmsSupplierMapper.selectList(new LambdaQueryWrapper() + .select(BmsSupplier::getId,BmsSupplier::getRegionFirst,BmsSupplier::getRegionSecond,BmsSupplier::getRegionThird) + .eq(BmsSupplier::getRegionFirst,regionId) + .or() + .eq(BmsSupplier::getRegionSecond,regionId) + .or() + .eq(BmsSupplier::getRegionThird,regionId) + .or() + .eq(BmsSupplier::getRegionFourthly,regionId) + ); + //利用有序 + List sortList = new ArrayList<>(); + sortList.add(newRegion.getId()); + if (!newRegion.getPid().equals("0")){ + BmsRegion p1 = this.getById(newRegion.getPid()); + sortList.add(p1.getId()); + if(!p1.getPid().equals("0")){ + BmsRegion p2 = this.getById(p1.getPid()); + sortList.add(p2.getId()); + } + } + + // size对应层级数 + int size = sortList.size(); + for (BmsSupplier supplier : supplierList) { + if(size==3){ + //3级 + supplier.setRegionFirst(sortList.get(2)); + supplier.setRegionSecond(sortList.get(1)); + supplier.setRegionThird(sortList.get(0)); + supplier.setRegionLast(sortList.get(0)); + log.debug("3级变动"); + }else if (size==2){ + //二级 + supplier.setRegionFirst(sortList.get(1)); + if (orgRegion.getLevel() > (newRegion.getLevel())){ + supplier.setRegionSecond(sortList.get(0)); + log.debug("层级变小,由三级变二级"); + supplier.setRegion2Third("0"); + }if (orgRegion.getLevel() < (newRegion.getLevel())){ + log.debug("层级变大,由一级变二级"); + supplier.setRegionThird(supplier.getRegion2Second()); + supplier.setRegionSecond(sortList.get(0)); + }else { + log.debug("二级,平级更新"); + supplier.setRegionSecond(sortList.get(0)); + if(!StringUtils.hasText(supplier.getRegion2Third())){ + supplier.setRegionLast(supplier.getRegion2Second()); + } + } + }else { + //一级 + log.debug("更换变一级"); + supplier.setRegionFirst(sortList.get(0)); + supplier.setRegionLast(sortList.get(0)); + if (orgRegion.getLevel() > (newRegion.getLevel())){ + log.debug("层级变小,由二级变一级"); + Assert.throwEx("二级变一级不支持"); + supplier.setRegionSecond(supplier.getRegion2Third()); + supplier.setRegionThird("0"); + }else { + supplier.setRegionSecond("0"); + supplier.setRegionThird("0"); + } + } + bmsSupplierMapper.updateById(supplier); + } + + } + this.updateById(newRegion); + return true; + } + + private void checkSysCodes(BmsRegion param) { + if(StringUtils.hasText(param.getSysCode1())){ + long count1 = baseMapper.countSysCode1(param.getSysCode1(), param.getId());if(count1>0){ + Assert.throwEx("系统编码1不可重复"); + } + } + if(StringUtils.hasText(param.getSysCode2())){ + long count1 = baseMapper.countSysCode1(param.getSysCode2(), param.getId());if(count1>0){ + Assert.throwEx("系统编码2不可重复"); + } + } + if(StringUtils.hasText(param.getSysCode3())){ + long count1 = baseMapper.countSysCode3(param.getSysCode3(), param.getId());if(count1>0){ + Assert.throwEx("系统编码3不可重复"); + } + } + } + + @Override + public boolean updateBmsRegionById(BmsRegion param){ + this.checkSysCodes(param); + BmsRegion ori = this.getById(param.getId()); + param = this.flushSetLevel(param); + boolean changePid = !ori.getPid().equals(param.getPid()); + boolean b = super.updateById(param); + if(!ori.getName().equals(param.getName())||changePid) { + String[] paths = ori.getPathIds().split("_"); + for (String path : paths) { + if(path.equals(ori.getPid())){ + Assert.throwEx("不能选子节点为父级节点"); + } + } + //更新相关表(网点) + this.updatePathByPid(param.getId()); + if(changePid){ + //更新客户 + BmsRegion currentRegion = this.getById(param.getId()); + List regionSupplierList = bmsSupplierApplicationService.listByRegionIds(Arrays.asList(ori.getId()),ori.getLevel()); + if(CollectionUtil.isNotEmpty(regionSupplierList)){ + String[] ids = currentRegion.getPathIds().split("_"); + String region1 = "0"; + String region2 = "0"; + String region3 = "0"; + String region4 = "0"; + String regionLast = "0"; + if(ids.length>0){ + region1 = ids[0]; + regionLast = region1; + } + if(ids.length>1){ + region2 = ids[1]; + regionLast = region2; + } + if(ids.length>2){ + region3 = ids[2]; + regionLast = region3; + } + if(ids.length>3){ + region4 = ids[3]; + regionLast = region4; + } + for (BmsSupplier supplier : regionSupplierList) { + supplier.setRegionFirst(region1); + supplier.setRegionSecond(region2); + supplier.setRegionThird(region3); + supplier.setRegionFourthly(region4); + supplier.setRegionLast(regionLast); + bmsSupplierMapper.updateById(supplier); + } + } + } + } + return b; + } + + @Override + public List getTree(boolean listUserFlag,Integer stopFlag) { + LambdaQueryWrapper regionWrapper = new LambdaQueryWrapper<>(); + if(stopFlag!=2){ + regionWrapper.eq(BmsRegion::getStopFlag,stopFlag); + } + List list = this.list(regionWrapper); + if(listUserFlag){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRegionUser::getType,0); + List regionUsers = bmsRegionUserService.list(lqw); + List userIds = regionUsers.stream().map(BmsRegionUser::getUserId).collect(Collectors.toList()); + List sysUsers; + if(userIds.size()<1000){ + if(userIds.size()==0){ + sysUsers = new ArrayList<>(); + }else { + sysUsers = sysUserService.listByIds(userIds); + } + }else { + sysUsers = sysUserService.list(); + } + for (BmsRegionUser bmsRegionUser : regionUsers) { + for (SysUser sysUser : sysUsers) { + if(bmsRegionUser.getUserId().equals(sysUser.getId())){ + bmsRegionUser.setUserName(sysUser.getName()); + bmsRegionUser.setUserCode(sysUser.getCode()); + break; + } + } + } + for (BmsRegion bmsRegion : list) { + List regionUserList = regionUsers.stream() + .filter(user->bmsRegion.getId().equals(user.getRegionId())) + .collect(Collectors.toList()); + bmsRegion.setRegionUsers(regionUserList); + } + } + List treeVoList = list.stream().map(region->{ + BmsRegionTreeVo treeNode = CopierUtil.copy(region,new BmsRegionTreeVo()); + treeNode.setId(region.getId()); + treeNode.setParentId(region.getPid()); + treeNode.setSort(0); + treeNode.setRegionUsers(region.getRegionUsers()); + return treeNode; + }).collect(Collectors.toList()); + return TreeUtil.buildByRecursive(treeVoList,TreeUtil.DEFAULT_PID_STRING); + } + + @Override + public List listChild(String pid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRegion::getPid,pid); + return this.list(lqw); + } + + @Override + public List listChildRightLike(String parentIdPath) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.likeRight(BmsRegion::getPathIds,parentIdPath+"_"); + return this.list(lqw); + } + + @Override + public List listChild(List pid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(BmsRegion::getPid,pid); + return this.list(lqw); + } + + @Override + public BmsRegion getByCode(String code) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRegion::getCode,code); + return this.getOne(lqw,false); + } + + @Override + public BmsRegion getByName(String name, Integer level) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRegion::getName,name); + if(level!=null){ + lqw.eq(BmsRegion::getLevel,level); + } + return this.getOne(lqw,true); + } + + @Override + public BmsRegion getByNameOrCode(String value) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRegion::getName,value).or().eq(BmsRegion::getCode,value); + return this.getOne(lqw,true); + } + + public BmsRegion flushSetLevel(BmsRegion param) { + if(StringUtils.hasText(param.getPid()) && !param.getPid().equals("0") ){ + BmsRegion parent = this.getById(param.getPid()); + if(parent!=null){ + if(parent.getLevel()>3){ + Assert.throwEx("最高支持4层级"); + } + param.setLevel(parent.getLevel()+1); + param.setPathIds(parent.getPathIds()+"_"+param.getId()); + param.setPathNames(parent.getPathNames()+"_"+param.getName()); + }else { + Assert.throwEx("无相关父级数据"); + } + }else { + param.setPid("0"); + param.setLevel(1); + param.setPathIds(param.getId()); + param.setPathNames(param.getName()); + } + return param; + } + + @Override + public void flushAllLevel(boolean batchUpdate) { + this.baseMapper.updateSetPathNull(); + List treeVoList = this.getTree(false,2); + for (BmsRegionTreeVo firstTree : treeVoList) { + if(firstTree.getLevel()==null||firstTree.getLevel()!=1||batchUpdate){ + String pathIds = firstTree.getId(); + String pathNames = firstTree.getName(); + this.updateLevel(firstTree.getId(),1,pathIds,pathNames); + } + if(CollectionUtil.isNotEmpty(firstTree.getChildren())){ + for (TreeNode secondTreeNode : firstTree.getChildren()) { + BmsRegionTreeVo secondTree = (BmsRegionTreeVo)secondTreeNode; + if(secondTree.getLevel()==null||secondTree.getLevel()!=2||batchUpdate){ + String pathIds = firstTree.getId()+"_"+secondTree.getId(); + String pathNames = firstTree.getName()+"_"+secondTree.getName(); + this.updateLevel(secondTree.getId(),2,pathIds,pathNames); + } + if(CollectionUtil.isNotEmpty(secondTree.getChildren())){ + for (TreeNode thirdTreeNode : secondTree.getChildren()) { + BmsRegionTreeVo thirdTree = (BmsRegionTreeVo)thirdTreeNode; + if(thirdTree.getLevel()==null||thirdTree.getLevel()!=3||batchUpdate){ + String pathIds = firstTree.getId()+"_"+secondTree.getId()+"_"+thirdTree.getId(); + String pathNames = firstTree.getName()+"_"+secondTree.getName()+"_"+thirdTree.getName(); + this.updateLevel(thirdTree.getId(),3,pathIds,pathNames); + } + if(CollectionUtil.isNotEmpty(thirdTreeNode.getChildren())){ + for (TreeNode fourthlyTreeNode : thirdTreeNode.getChildren()) { + BmsRegionTreeVo fourthlyTree = (BmsRegionTreeVo)fourthlyTreeNode; + if(fourthlyTree.getLevel()==null||fourthlyTree.getLevel()!=4||batchUpdate){ + String pathIds = firstTree.getId()+"_"+secondTree.getId()+"_"+thirdTree.getId()+"_"+fourthlyTree.getId(); + String pathNames = firstTree.getName()+"_"+secondTree.getName()+"_"+thirdTree.getName()+"_"+fourthlyTree.getName(); + this.updateLevel(fourthlyTree.getId(),4,pathIds,pathNames); + } + } + } + } + } + } + } + } + } + + public void updateLevel(String id, Integer level,String pathIds,String pathName) { + BmsRegion param = new BmsRegion(); + param.setId(id); + param.setLevel(level); + param.setPathIds(pathIds); + param.setPathNames(pathName); + this.updateById(param); + } + + /** + * 更新含路径相关的表,如网点 + * @param pid + * @return + */ + private BmsRegion updatePathByPid(String pid){ + BmsRegion parRegion = this.getById(pid); + List regionList = this.listChild(pid); + if(regionList.size()>0){ + regionList = regionList.stream().map(a->{ + String[] arr = parRegion.getPathIds().split("_"); + if(arr.length>3){ + Assert.throwEx("层级不能超过三级"); + } + for (String id : arr) { + if(id.equals(a.getId())){ + Assert.throwEx("节点出现循环"); + } + } + a.setPathIds(parRegion.getPathIds()+"_"+a.getId()); + a.setPathNames(parRegion.getPathNames()+"_"+a.getName()); + return a; + }).collect(Collectors.toList()); + boolean updateFlag = this.updateBatchById(regionList); + if(!updateFlag){ + Assert.throwEx("更新区域链失败!"); + } + for(BmsRegion re:regionList){ + bmsChannelPointMapper.udpateSaleRegionPathBySaleRegionId(re.getPathNames(),re.getId()); + this.updatePathByPid(re.getId()); + } + } + return parRegion; + } + + @Override + public void updateAllFactoryIdsByFactoryId(String id, String addOrDel){ + List regionList = this.list(); + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.orderByAsc(BmsFactory::getCode); + String[] FactoryIds = bmsFactoryService.list(lqw).stream().map(a->a.getId()).toArray(String[]::new); + + for(BmsRegion region:regionList){ + if(CollectionUtil.isNotEmpty(region.getFactoryIds())) { + if (addOrDel.equals(FactoryIdOperation.Add)) { + region = AddOneFactoryIds(region, id); + } else { + region = delOneFactoryIds(region, id); + } + }else { + region.setFactoryIds(FactoryIds); + } + } + this.updateBatchById(regionList); + } + + private BmsRegion delOneFactoryIds(BmsRegion region,String id){ + String[] newIds = Arrays.stream(region.getFactoryIds()) + .filter(e -> !e.equals(id)).toArray(String[]::new); + region.setFactoryIds(newIds); + return region; + } + + private BmsRegion AddOneFactoryIds(BmsRegion region,String id){ + List newIds = new ArrayList<>(Arrays.asList(region.getFactoryIds())); + newIds.add(id); + region.setFactoryIds(newIds.stream().toArray(String[]::new)); + return region; + } + + public BmsRegion toSetLevel(BmsRegion param) { + if(StringUtils.hasText(param.getPid()) && !param.getPid().equals("0")){ + BmsRegion parent = this.getById(param.getPid()); + if(parent!=null){ + if(parent.getLevel()>2){ + Assert.throwEx("最高支持3层级"); + } + param.setLevel(parent.getLevel()+1); + param.setPathIds(parent.getPathIds()+"_"+param.getId()); + param.setPathNames(parent.getPathNames()+"_"+param.getName()); + }else { + Assert.throwEx("无相关父级数据"); + } + }else { + param.setPid("0"); + param.setLevel(1); + param.setPathIds(param.getId()); + param.setPathNames(param.getName()); + } + return param; + } + + public List listTreeChildByDeep(String pid,Integer parentLevel){ + List list = this.listChild(pid); + if(parentLevel > 2 && CollectionUtil.isNotEmpty(list)){ + Assert.throwEx("最高只能设置3层级"); + } + for (BmsRegion region2 : list) { + List childList = listTreeChildByDeep(region2.getId(),parentLevel++); + region2.setChildNodes(childList); + } + return list; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsRegionUserServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsRegionUserServiceImpl.java new file mode 100644 index 0000000..e937f84 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsRegionUserServiceImpl.java @@ -0,0 +1,46 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsRegionUser; +import com.qs.serve.modules.bms.service.BmsRegionUserService; +import com.qs.serve.modules.bms.mapper.BmsRegionUserMapper; + +/** + * 区域负责人 服务实现类 + * @author YenHex + * @since 2022-11-02 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsRegionUserServiceImpl extends ServiceImpl implements BmsRegionUserService { + + @Override + public BmsRegionUser getByParam(Integer type, String regionId, String userId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRegionUser::getRegionId,regionId); + lqw.eq(BmsRegionUser::getType,type); + lqw.eq(BmsRegionUser::getUserId,userId); + return this.getOne(lqw,false); + } + + @Override + public void setMaster(Long id) { + BmsRegionUser regionUser = this.getById(id); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRegionUser::getRegionId,regionUser.getRegionId()); + lqw.eq(BmsRegionUser::getType,regionUser.getType()); + lqw.ne(BmsRegionUser::getUserId,regionUser.getUserId()); + BmsRegionUser param = new BmsRegionUser(); + param.setMasterFlag(0); + this.update(param,lqw); + regionUser.setMasterFlag(1); + this.updateById(regionUser); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsRuleRegionServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsRuleRegionServiceImpl.java new file mode 100644 index 0000000..4d1276e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsRuleRegionServiceImpl.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsRuleRegion; +import com.qs.serve.modules.bms.service.BmsRuleRegionService; +import com.qs.serve.modules.bms.mapper.BmsRuleRegionMapper; + +/** + * 规则区域 服务实现类 + * @author YenHex + * @since 2022-10-21 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsRuleRegionServiceImpl extends ServiceImpl implements BmsRuleRegionService { + + @Override + public boolean removeByRegionId(String regionId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRuleRegion::getRegionId,regionId); + return this.remove(lqw); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsRuleServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsRuleServiceImpl.java new file mode 100644 index 0000000..12c6df2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsRuleServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsRule; +import com.qs.serve.modules.bms.service.BmsRuleService; +import com.qs.serve.modules.bms.mapper.BmsRuleMapper; + +/** + * 规则 服务实现类 + * @author YenHex + * @since 2022-10-19 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsRuleServiceImpl extends ServiceImpl implements BmsRuleService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsRuleSkuServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsRuleSkuServiceImpl.java new file mode 100644 index 0000000..ec3959e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsRuleSkuServiceImpl.java @@ -0,0 +1,44 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.util.CollectionUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsRuleSku; +import com.qs.serve.modules.bms.service.BmsRuleSkuService; +import com.qs.serve.modules.bms.mapper.BmsRuleSkuMapper; + +import java.util.ArrayList; +import java.util.List; + +/** + * 规则sku 服务实现类 + * @author YenHex + * @since 2022-10-21 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsRuleSkuServiceImpl extends ServiceImpl implements BmsRuleSkuService { + + @Override + public List listSkuIdsByRuleId(Long ruleId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsRuleSku::getRuleId,ruleId); + return this.list(lqw); + } + + @Override + public List listEnableRuleWithSkuIds(List skuIds) { + if(CollectionUtil.isEmpty(skuIds)){ + return new ArrayList<>(); + } + BmsRuleSku ruleSku = new BmsRuleSku(); + ruleSku.setSelectSkuIds(skuIds); + return baseMapper.listEnableRule(ruleSku); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSkuSupplierService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSkuSupplierService.java new file mode 100644 index 0000000..3259cd7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSkuSupplierService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsSkuSupplier; + +/** + * sku供应商关联 服务接口 + * @author YenHex + * @date 2022-10-17 + */ +public interface BmsSkuSupplierService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSkuSupplierServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSkuSupplierServiceImpl.java new file mode 100644 index 0000000..cf3b648 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSkuSupplierServiceImpl.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.bms.entity.vo.BmsSkuSupplierVo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsSkuSupplier; +import com.qs.serve.modules.bms.service.BmsSkuSupplierService; +import com.qs.serve.modules.bms.mapper.BmsSkuSupplierMapper; + +import java.util.List; + +/** + * sku供应商关联 服务实现类 + * @author YenHex + * @since 2022-10-17 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsSkuSupplierServiceImpl extends ServiceImpl implements BmsSkuSupplierService { + + @Override + public List selectList(BmsSkuSupplierVo skuSupplier) { + return baseMapper.selectList2(skuSupplier); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSubjectFormServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSubjectFormServiceImpl.java new file mode 100644 index 0000000..e7d9b79 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSubjectFormServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsSubjectForm; +import com.qs.serve.modules.bms.service.BmsSubjectFormService; +import com.qs.serve.modules.bms.mapper.BmsSubjectFormMapper; + +/** + * 科目表单 服务实现类 + * @author YenHex + * @since 2023-02-03 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsSubjectFormServiceImpl extends ServiceImpl implements BmsSubjectFormService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSubjectRegionServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSubjectRegionServiceImpl.java new file mode 100644 index 0000000..ab3328d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSubjectRegionServiceImpl.java @@ -0,0 +1,53 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.util.CollectionUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsSubjectRegion; +import com.qs.serve.modules.bms.service.BmsSubjectRegionService; +import com.qs.serve.modules.bms.mapper.BmsSubjectRegionMapper; + +import java.util.ArrayList; +import java.util.List; + +/** + * 客户适用区域 服务实现类 + * @author YenHex + * @since 2023-03-09 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsSubjectRegionServiceImpl extends ServiceImpl implements BmsSubjectRegionService { + + @Override + public void removeBySubjectId(Long subjectId, Integer regionType) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSubjectRegion::getSubjectId,subjectId); + lqw.eq(BmsSubjectRegion::getType,regionType); + this.remove(lqw); + } + + @Override + public List listBySubjectId(Long subjectId, Integer regionType) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSubjectRegion::getSubjectId,subjectId); + lqw.eq(BmsSubjectRegion::getType,regionType); + return this.list(lqw); + } + + @Override + public List listByRegionIds(List regionIds, Integer regionType) { + if(CollectionUtil.isEmpty(regionIds)){ + return new ArrayList<>(); + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(BmsSubjectRegion::getRegionId,regionIds); + lqw.eq(BmsSubjectRegion::getType,regionType); + return this.list(lqw); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSubjectServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSubjectServiceImpl.java new file mode 100644 index 0000000..dd77f3d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSubjectServiceImpl.java @@ -0,0 +1,147 @@ +package com.qs.serve.modules.bms.service.impl; + +import cn.hutool.core.collection.CollUtil; +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.CollectionUtil; +import com.qs.serve.common.util.IdUtil; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.tbs.entity.bo.TbsBudgetBatchBo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsSubject; +import com.qs.serve.modules.bms.service.BmsSubjectService; +import com.qs.serve.modules.bms.mapper.BmsSubjectMapper; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collector; +import java.util.stream.Collectors; + +/** + * 科目 服务实现类 + * @author YenHex + * @since 2022-11-07 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsSubjectServiceImpl extends ServiceImpl implements BmsSubjectService { + + @Override + public Map loadByNameOrCode(List subjectCodes, Boolean throwInvalidCode) { + List subjectList = this.list( + new LambdaQueryWrapper() + .in(BmsSubject::getSubjectCode,subjectCodes) + .or() + .in(BmsSubject::getSubjectName,subjectCodes) + ); + if(throwInvalidCode && subjectCodes.size()>subjectList.size()){ + for (String subjectCode : subjectCodes) { + boolean exist = subjectList.stream().anyMatch(a->a.getSubjectCode().equals(subjectCode)); + if(!exist){ + Assert.throwEx("无效的科目编码:"+subjectCode); + } + } + } + Map subjectMap = new HashMap<>(); + for (BmsSubject subject : subjectList) { + subjectMap.put(subject.getSubjectCode(),subject); + } + return subjectMap; + } + + @Override + public Map loadByCode(List subjectCodes, TbsBudgetBatchBo param) { + if(CollUtil.isEmpty(subjectCodes)){ + return new HashMap<>(); + } + List subjectList = this.list( + new LambdaQueryWrapper() + .in(BmsSubject::getSubjectCode,subjectCodes) + ); + if(subjectCodes.size()>subjectList.size()){ + for (String subjectCode : subjectCodes) { + boolean exist = subjectList.stream().anyMatch(a->a.getSubjectCode().equals(subjectCode)); + if(!exist){ + for (TbsBudgetBatchBo.BudgetMain budgetMain : param.getBudgetList()) { + if(budgetMain.getSubjectCode().equals(subjectCode)){ + budgetMain.getErrorInfos().add("无效的科目编码:"+subjectCode); + param.setErrorFlag(true); + } + } + } + } + } + Map subjectMap = new HashMap<>(); + for (BmsSubject subject : subjectList) { + subjectMap.put(subject.getSubjectCode(),subject); + } + return subjectMap; + } + + @Override + public List listByIds(List ids, List noInIds) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(BmsSubject::getId,ids); + if(CollectionUtil.isNotEmpty(noInIds)){ + lqw.notIn(BmsSubject::getId,noInIds); + } + return this.list(lqw); + } + + @Override + public List listChild(Long pid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSubject::getPid,pid); + return this.list(lqw); + } + + @Override + public void updatePathNameByParent(BmsSubject parent){ + List subjectList = listChild(parent.getId()); + if(subjectList.size()>0){ + subjectList = subjectList.stream().map(a->{ + a.setPathNames(parent.getPathNames()+"_"+a.getSubjectName()); + return a; + }).collect(Collectors.toList()); + boolean updateFlag = this.updateBatchById(subjectList); + if(!updateFlag){ + Assert.throwEx("更新科目链失败!"); + } + } + } + + @Override + public BmsSubject getByName(String name) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSubject::getSubjectName,name); + return getOne(lqw,false); + } + + @Override + public BmsSubject getByCode(String code) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSubject::getSubjectCode,code); + return getOne(lqw,false); + } + + @Override + public boolean removeSelfAndChildById(Long id) { + BmsSubject bmsSubject = this.getById(id); + List list = listChild(id); + for(BmsSubject subject:list){ + boolean result = removeSelfAndChildById(subject.getId()); + if(!result){ + return false; + } + } + String newCode = bmsSubject.getSubjectCode()+"_del_"+ IdUtil.getSnowflakeNextIdStr(); + baseMapper.updateToDelete(newCode,id); + return true; + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierAddressServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierAddressServiceImpl.java new file mode 100644 index 0000000..8167a32 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierAddressServiceImpl.java @@ -0,0 +1,51 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; +import com.qs.serve.modules.bms.mapper.BmsSupplierAddressMapper; + +import java.util.List; + +/** + * 供应商地址 服务实现类 + * @author YenHex + * @since 2022-10-12 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsSupplierAddressServiceImpl extends ServiceImpl implements BmsSupplierAddressService { + + @Override + public BmsSupplierAddress getDefault(Long supplierId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplierAddress::getSupplierId,supplierId); + lqw.eq(BmsSupplierAddress::getDefaultFlag,1); + return this.getOne(lqw,false); + } + + @Override + public List listBySupplierId(Long supplierId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplierAddress::getSupplierId,supplierId); + return this.list(lqw); + } + + @Override + public List selectBmsSupplierAddressList(BmsSupplierAddress query) { + return baseMapper.selectBmsSupplierAddressList(query); + } + + @Override + public void removeBySupplierId(String supplierId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplierAddress::getSupplierId,supplierId); + this.remove(lqw); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierApplicationService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierApplicationService.java new file mode 100644 index 0000000..0f41785 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierApplicationService.java @@ -0,0 +1,387 @@ +package com.qs.serve.modules.bms.service.impl; + +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.common.util.CopierUtil; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.tbs.common.TbsCenterType; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.mapper.TbsActivityMapper; +import com.qs.serve.modules.tbs.mapper.TbsBudgetConditionMapper; +import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; +import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudgetMapper; +import com.qs.serve.modules.tbs.service.TbsBudgetLogService; +import com.qs.serve.modules.tbs.service.TbsCostUnItemService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/2/8 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsSupplierApplicationService { + +// private BmsRegionMapper regionMapper; +// private BmsRegion2Mapper bmsRegion2Mapper; +// private TbsCostUnItemService costUnItemService; +// private TbsBudgetMapper budgetMapper; +// private TbsBudgetConditionMapper budgetConditionMapper; +// private TbsScheduleItemBudgetMapper scheduleItemBudgetMapper; +// private TbsActivityMapper activityMapper; + private BmsSupplierMapper bmsSupplierMapper; + + /** + * 移除用户所有的客户权限 + * @param leaveUser 离职用户 + * @param enterUser 入职用户(可空) + */ + public void removeUserOfSupplierList(final SysUser leaveUser,SysUser enterUser){ + String leaveUserId = leaveUser.getId(); + BmsSupplier query = new BmsSupplier(); + query.setCurrUserId(leaveUser.getId()); + query.setDelFlag(false); + List supplierList = bmsSupplierMapper.selectSupplierList(query); + String enterUserId = ""; + String enterUserCode = ""; + String enterUserName = ""; + if(enterUser!=null){ + enterUserId = enterUser.getId(); + enterUserCode = enterUser.getCode(); + enterUserName = enterUser.getName(); + } + + for (BmsSupplier supplier : supplierList) { + //主要负责人 + if(leaveUserId.equals(supplier.getUserId())){ + supplier.setUserId(enterUserId); + if(enterUser==null){ + supplier.setUserName(""); + supplier.setUserCode(""); + }else { + supplier.setUserName(enterUser.getName()); + supplier.setUserCode(enterUser.getCode()); + } + } + //其它负责人 + List otherUserIdList = new ArrayList<>(); + if(supplier.getOtherUserIds()!=null){ + for (String otherUserId : supplier.getOtherUserIds()) { + if(otherUserId.equals(leaveUserId)){ + if(enterUserId==null){ + continue; + }else { + otherUserIdList.add(enterUserId); + continue; + } + } + otherUserIdList.add(otherUserId); + } + } + if(otherUserIdList.size()>0){ + String userIds = otherUserIdList.stream().distinct().collect(Collectors.joining(",")); + supplier.setOtherUserIdsString(userIds); + String otherName = supplier.getOtherUserNames().replace(leaveUser.getName(),enterUserName); + String otherCode = supplier.getOtherUserCodes().replace(leaveUser.getCode(),enterUserCode); + supplier.setOtherUserNames(otherName); + supplier.setOtherUserCodes(otherCode); + }else { + supplier.setOtherUserNames(""); + supplier.setOtherUserCodes(""); + } + bmsSupplierMapper.updateRelateUserInfo(supplier); + } + } + +// /** +// * 客户更新区域时,预算政策统计 +// * @param supplierId +// * @param regionType +// * @param orgRegionId +// * @param newRegionId +// */ +// public void migratePolicyBudget(String supplierId, String regionType, String orgRegionId, String newRegionId){ +// +// } +// +// /** +// * 客户更新区域时,预算统计调整 +// * @param supplierId +// * @param regionType +// * @param orgRegionId +// * @param newRegionId +// */ +// public void migrateRegion(String supplierId, String regionType, String orgRegionId, String newRegionId) { +// LocalDateTime nowTime = LocalDateTime.now(); +// String newRegionCode; +// String newRegionName; +// if(regionType.equals(TbsCenterType.saleRegion.name())){ +// BmsRegion bmsRegion = regionMapper.selectById(newRegionId); +// newRegionCode = bmsRegion.getCode(); +// newRegionName = bmsRegion.getName(); +// }else { +// BmsRegion2 bmsRegion2 = bmsRegion2Mapper.selectById(newRegionId); +// newRegionCode = bmsRegion2.getCode(); +// newRegionName = bmsRegion2.getName(); +// } +// //this.migrateActivityBudget(supplierId, regionType, orgRegionId, newRegionId, nowTime, newRegionCode, newRegionName); +// //this.migratePolicyBudget(supplierId, regionType, orgRegionId, newRegionId, nowTime, newRegionCode, newRegionName); +// } +// +// /** +// * 调整政策预算 +// * @param supplierId +// * @param regionType +// * @param orgRegionId +// * @param newRegionId +// * @param nowTime +// * @param newRegionCode +// * @param newRegionName +// */ +// private void migratePolicyBudget(String supplierId, String regionType, String orgRegionId, String newRegionId, LocalDateTime nowTime, String newRegionCode, String newRegionName) { +// // 方案未落实 +// } +// +// /** +// * 调整活动预算 +// * @param supplierId +// * @param regionType +// * @param orgRegionId +// * @param newRegionId +// * @param nowTime +// * @param newRegionCode +// * @param newRegionName +// */ +// private void migrateActivityBudget(String supplierId, String regionType, String orgRegionId, String newRegionId, LocalDateTime nowTime, String newRegionCode, String newRegionName) { +// LambdaQueryWrapper lqw4log = new LambdaQueryWrapper<>(); +// lqw4log.eq(TbsBudgetLog::getMigrateFlag,0); +// lqw4log.eq(TbsBudgetLog::getRollbackFlag,0); +// lqw4log.eq(TbsBudgetLog::getSupplierId, supplierId); +// lqw4log.eq(TbsBudgetLog::getCenterType, regionType); +// lqw4log.eq(TbsBudgetLog::getCenterId, orgRegionId); +// lqw4log.isNotNull(TbsBudgetLog::getActivityId); +// List budgetLogList = budgetLogService.list(lqw4log); +// if(CollectionUtil.isNotEmpty(budgetLogList)){ +// //查找符合条件的活动 +// final List activityIds = budgetLogList.stream().map(TbsBudgetLog::getActivityId).distinct().collect(Collectors.toList()); +// LambdaQueryWrapper lqwAct = new LambdaQueryWrapper<>(); +// lqwAct.in(TbsActivity::getId,activityIds); +// List activityList = activityMapper.selectList(lqwAct); +// //查询符合条件的预算 +// final List subjectIds = budgetLogList.stream().map(TbsBudgetLog::getSubjectId).distinct().collect(Collectors.toList()); +// LambdaQueryWrapper lqwBudget = new LambdaQueryWrapper<>(); +// lqwBudget.eq(TbsBudget::getCenterType, regionType); +// lqwBudget.eq(TbsBudget::getCenterId, newRegionId); +// lqwBudget.eq(TbsBudget::getBudgetState,1); +// lqwBudget.and(wq->{ +// wq.eq(TbsBudget::getSubjectId,0).or().in(TbsBudget::getSubjectId,subjectIds); +// }); +// // 将有科目条件的前置 +// lqwBudget.orderByDesc(TbsBudget::getSubjectId); +// List budgetList = budgetMapper.selectList(lqwBudget); +// //查询预算考核期 +// List budgetIds = budgetList.stream().map(TbsBudget::getId).distinct().collect(Collectors.toList()); +// Map> scheduleItemBudgetsMap = null; +// if(CollectionUtil.isNotEmpty(budgetIds)){ +// LambdaQueryWrapper budgetItemLqw = new LambdaQueryWrapper<>(); +// budgetItemLqw.in(TbsScheduleItemBudget::getBudgetId,budgetIds); +// List scheduleItemBudgets = scheduleItemBudgetMapper.selectList(budgetItemLqw); +// scheduleItemBudgetsMap = scheduleItemBudgets.stream().collect(Collectors.groupingBy(TbsScheduleItemBudget::getBudgetId)); +// } +// //查询预算条件 +// List conditionBudgetIds = budgetList.stream() +// .filter(a->a.getConditionFlag().equals(1)) +// .map(TbsBudget::getId).distinct().collect(Collectors.toList()); +// Map> budgetConditionsMap = null; +// if(conditionBudgetIds.size()>0){ +// LambdaQueryWrapper conditionLqw = new LambdaQueryWrapper<>(); +// conditionLqw.in(TbsBudgetCondition::getBudgetId,conditionBudgetIds); +// List budgetConditions = budgetConditionMapper.selectList(conditionLqw); +// budgetConditionsMap = budgetConditions.stream().collect(Collectors.groupingBy(TbsBudgetCondition::getBudgetId)); +// } +// //用于循环筛选条件 +// TbsGoodsType[] goodsTypes = new TbsGoodsType[]{ +// TbsGoodsType.sku, +// TbsGoodsType.spu, +// TbsGoodsType.series, +// TbsGoodsType.category, +// TbsGoodsType.brand +// }; +// //已占用预算进行调增 +// final BudgetLogOptFlag optType4Diff = regionType.equals(TbsCenterType.saleRegion.name())? +// BudgetLogOptFlag.State_8:BudgetLogOptFlag.State_10; +// final BudgetLogOptFlag optType4Add = regionType.equals(TbsCenterType.saleRegion.name())? +// BudgetLogOptFlag.State_7:BudgetLogOptFlag.State_9; +// List budgetLog4Adds = budgetLogList.stream().map(budgetLog->{ +// TbsBudgetLog obj = CopierUtil.copy(budgetLog,new TbsBudgetLog()); +// obj.setId(null); +// obj.setOptType(optType4Add.getCode()); +// obj.setMigrateFlag(1); +// obj.setMigrateTime(nowTime); +// obj.setAmount(TbsBudgetLogBuildUtil.buildAmount(obj.getAmount(),optType4Add)); +// return obj; +// }).collect(Collectors.toList()); +// //规则:品类条件比科目条件优先级更高 +// List budgetLog4Diff = new ArrayList<>(); +// //无匹配的费用支出 +// List costUnItemList = new ArrayList<>(); +// for (TbsBudgetLog budgetLog : budgetLogList) { +// //当前活动 +// TbsActivity currActivity = null; +// for (TbsActivity activity : activityList) { +// if(budgetLog.getActivityId().equals(activity.getId())){ +// currActivity = activity; +// break; +// } +// } +// //(数据结构:value=预算id列表,key=商品类型) +// Map> matchConditionBudgetIdsMap = new HashMap<>(); +// if(budgetConditionsMap!=null){ +// for (Long budgetId : budgetConditionsMap.keySet()) { +// List budgetConditions = budgetConditionsMap.get(budgetId); +// String pathName = budgetLog.getTargetLevelPathNames(); +// for (TbsBudgetCondition condition : budgetConditions) { +// if(pathName.contains(condition.getTargetLevelPathNames())){ +// List tempList = matchConditionBudgetIdsMap.get(condition.getTargetType()); +// if(tempList==null){ +// tempList = new ArrayList<>(); +// } +// tempList.add(budgetId); +// matchConditionBudgetIdsMap.put(condition.getTargetType(),tempList); +// break; +// } +// } +// } +// } +// //记录匹配品类条件的预算 +// List matchBudgetConditionList = new ArrayList<>(); +// List matchBudgetConditionList_tmp = new ArrayList<>(); +// for (TbsBudget budget : budgetList) { +// if(budget.getConditionFlag().equals(1)){ +// for (TbsGoodsType goodsType : goodsTypes) { +// List tempList = matchConditionBudgetIdsMap.get(goodsType.name()); +// if(CollectionUtil.isNotEmpty(tempList)){ +// for (Long budgetId01 : tempList) { +// if(budgetId01.equals(budget.getId())){ +// matchBudgetConditionList.add(budget); +// } +// } +// } +// } +// }else { +// matchBudgetConditionList_tmp.add(budget); +// } +// } +// //有条件预算优先级更高 +// matchBudgetConditionList.addAll(matchBudgetConditionList_tmp); +// //第一个预算为最有匹配预算 +// TbsBudget matchBudget = null; +// TbsScheduleItemBudget matchItemBudget = null; +// //记录匹配到的预算 +// if(scheduleItemBudgetsMap!=null){ +// for (TbsBudget budget : matchBudgetConditionList) { +// if(matchBudget!=null){ +// break; +// } +// List scheduleItemBudgets = scheduleItemBudgetsMap.get(budget.getId()); +// for (TbsScheduleItemBudget itemBudget : scheduleItemBudgets) { +// LocalDateTime actStartDate = currActivity.getPreStartDate().atStartOfDay(); +// LocalDateTime actEndDate = LocalDateTime.of(currActivity.getPreStartDate(), LocalTime.MAX); +// if(actStartDate.isAfter(itemBudget.getStartDate())&&actEndDate.isBefore(itemBudget.getEndDate())){ +// matchBudget = budget; +// matchItemBudget = itemBudget; +// break; +// } +// } +// } +// } +// if(matchBudget!=null){ +// //有匹配的预算 +// TbsBudgetLog newLog = CopierUtil.copy(budgetLog,new TbsBudgetLog()); +// newLog.setId(null); +// newLog.setOptType(optType4Diff.getCode()); +// newLog.setBudgetId(matchBudget.getId()); +// newLog.setBudgetCode(matchBudget.getBudgetCode()); +// newLog.setScheduleOrgId(budgetLog.getScheduleId()); +// newLog.setScheduleItemOrgId(budgetLog.getScheduleItemId()); +// newLog.setScheduleItemBudgetOrgId(budgetLog.getScheduleItemBudgetId()); +// //匹配到的项 +// newLog.setScheduleId(matchItemBudget.getScheduleId()); +// newLog.setScheduleItemId(matchItemBudget.getScheduleItemId()); +// newLog.setScheduleItemBudgetId(matchItemBudget.getId()); +// //设置新的成本中心 +// newLog.setCenterOrgId(newLog.getCenterId()); +// newLog.setCenterOrgCode(newLog.getCenterCode()); +// newLog.setCenterOrgName(newLog.getCenterName()); +// newLog.setCenterId(newRegionId); +// newLog.setCenterCode(newRegionCode); +// newLog.setCenterName(newRegionName); +// budgetLog4Diff.add(newLog); +// }else { +// //无匹配的预算 +// TbsCostUnItem costUnItem = budgetLog.toTbsCostUnItem(currActivity); +// costUnItemList.add(costUnItem); +// } +// } +// //保存 +// budgetLogService.saveBatch(budgetLog4Adds); +// if(CollectionUtil.isNotEmpty(budgetLog4Diff)){ +// budgetLogService.saveBatch(budgetLog4Diff); +// } +// if(CollectionUtil.isNotEmpty(costUnItemList)){ +// costUnItemService.saveBatch(costUnItemList); +// } +// //设置已迁移状态 +// List budgetLogIds = budgetLogList.stream().map(TbsBudgetLog::getId).collect(Collectors.toList()); +// TbsBudgetLog updLogParam = new TbsBudgetLog(); +// updLogParam.setMigrateFlag(1); +// updLogParam.setMigrateTime(nowTime); +// LambdaQueryWrapper updLogLqw = new LambdaQueryWrapper<>(); +// updLogLqw.in(TbsBudgetLog::getId,budgetLogIds); +// budgetLogService.update(updLogParam,updLogLqw); +// } +// } + + public List listByRegionIds(List regionIds, Integer level) { + if(regionIds.size()>0){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + if(level.equals(1)){ + lqw.and( + aa->aa.in(BmsSupplier::getRegionFirst,regionIds) + .or().in(BmsSupplier::getRegion2First,regionIds) + ); + }else if(level.equals(2)){ + lqw.and( + aa->aa.in(BmsSupplier::getRegionSecond,regionIds) + .or().in(BmsSupplier::getRegion2Second,regionIds) + ); + }else if(level.equals(3)){ + lqw.and( + aa->aa.in(BmsSupplier::getRegionThird,regionIds) + .or().in(BmsSupplier::getRegion2Third,regionIds) + ); + } + return bmsSupplierMapper.selectList(lqw); + } + return new ArrayList<>(); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierBandServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierBandServiceImpl.java new file mode 100644 index 0000000..aed9468 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierBandServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsSupplierBand; +import com.qs.serve.modules.bms.service.BmsSupplierBandService; +import com.qs.serve.modules.bms.mapper.BmsSupplierBandMapper; + +/** + * 供应商地址 服务实现类 + * @author YenHex + * @since 2022-10-12 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsSupplierBandServiceImpl extends ServiceImpl implements BmsSupplierBandService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierChannelServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierChannelServiceImpl.java new file mode 100644 index 0000000..098c715 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierChannelServiceImpl.java @@ -0,0 +1,52 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsSupplierChannel; +import com.qs.serve.modules.bms.service.BmsSupplierChannelService; +import com.qs.serve.modules.bms.mapper.BmsSupplierChannelMapper; + +import java.util.List; + +/** + * 客户渠道关系 服务实现类 + * @author YenHex + * @since 2022-11-03 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsSupplierChannelServiceImpl extends ServiceImpl implements BmsSupplierChannelService { + + @Override + public List selectSupplierChannelList(BmsSupplierChannel supplierChannel) { + return baseMapper.selectSupplierChannelList(supplierChannel); + } + + + @Override + public void deleteByChannelId(String id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplierChannel::getChannelId,id); + this.remove(lqw); + } + + @Override + public void deleteBatchByChannelIds(List ids) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(BmsSupplierChannel::getChannelId,ids); + this.remove(lqw); + } + + @Override + public void deleteBySupplierId(String id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplierChannel::getSupplierId,id); + this.remove(lqw); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierContactsServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierContactsServiceImpl.java new file mode 100644 index 0000000..66de6fa --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierContactsServiceImpl.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsSupplierContacts; +import com.qs.serve.modules.bms.service.BmsSupplierContactsService; +import com.qs.serve.modules.bms.mapper.BmsSupplierContactsMapper; + +/** + * 供应商联系人 服务实现类 + * @author YenHex + * @since 2023-04-19 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsSupplierContactsServiceImpl extends ServiceImpl implements BmsSupplierContactsService { + + @Override + public void deleteBySupplierId(String id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplierContacts::getSupplierId,id); + this.remove(lqw); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierServiceImpl.java new file mode 100644 index 0000000..7b72a0f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierServiceImpl.java @@ -0,0 +1,334 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.tag.util.TagFiledUtil; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.bo.BmsSupplierBatchBo; +import com.qs.serve.modules.bms.entity.bo.BmsSupplierBo; +import com.qs.serve.modules.bms.service.BmsRegion2Service; +import com.qs.serve.modules.bms.service.BmsRegionService; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.third.entity.ThirtyVerification; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.List; + +import static com.qs.serve.modules.tbs.common.TbsSeeYonConst.ERP_CUS_AMOUNT_QUO; + +/** + * 供应商 服务实现类 + * @author YenHex + * @since 2022-10-10 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsSupplierServiceImpl extends ServiceImpl implements BmsSupplierService { + + private BmsRegionService regionService; + private BmsRegion2Service region2Service; + private SysUserService sysUserService; + private BmsSupplierApplicationService supplierApplicationService; + private SeeYonRequestBaseService seeYonRequestBaseService; + + @Override + public List selectSupplierList(BmsSupplier bmsSupplier) { + TagFiledUtil.BmsSupplierPage(bmsSupplier); + return baseMapper.selectSupplierList(bmsSupplier); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void edit(BmsSupplierBo param) { + BmsSupplier supplier = CopierUtil.copy(param,new BmsSupplier()); + String orgSaleRegionId = null; + String orgBizRegionId = null; + String editId = param.getId(); + if(supplier.getId()!=null){ + BmsSupplier dbSupplier = this.getById(param.getId()); + orgSaleRegionId = dbSupplier.getRegionLast(); + orgBizRegionId = dbSupplier.getRegion2Last(); + }else if(StringUtils.hasText(param.getCode())){ + LambdaQueryWrapper checkCode = new LambdaQueryWrapper<>(); + checkCode.eq(BmsSupplier::getCode,param.getCode()); + long count = baseMapper.selectCount(checkCode); + if(count>0){ + Assert.throwEx("编码重复"); + } + } + if(StringUtils.hasText(param.getMgrId())){ + SysUser sysUser = sysUserService.getById(param.getMgrId()); + supplier.setUserId(sysUser.getId()); + supplier.setUserName(sysUser.getName()); + supplier.setUserCode(sysUser.getCode()); + } + if(CollectionUtil.isNotEmpty(param.getOtherMgrIds())){ + supplier.setOtherUserIds(param.getOtherMgrIds()); + } + if(!StringUtils.hasText(supplier.getId())){ + if(param.getPid()==null||param.getPid().equals(0L)){ + supplier.setPid("0"); + supplier.setParentCode("0"); + }else { + BmsSupplier parentNode = this.getById(param.getPid()); + supplier.setPid(parentNode.getId()); + supplier.setParentCode(parentNode.getCode()); + } + }else { + supplier.setPid(null); + supplier.setParentCode(null); + } + String saleRegion = param.getRegionId(); + if(saleRegion!=null){ + //绑定销售区域逻辑 + this.initRegion(supplier,saleRegion); + //判断是否需要迁移数据 +// if(editId!=null +// && orgSaleRegionId!=null +// &&!orgSaleRegionId.equals(saleRegion)){ +// supplierApplicationService.migrateRegion(editId,TbsCenterType.saleRegion.name(), orgSaleRegionId,saleRegion); +// } + } + String bizRegion = param.getRegionId2(); + if(bizRegion!=null){ + //绑定行政区域逻辑 + this.initRegion2(supplier,bizRegion); + //判断是否需要迁移数据 +// if(editId!=null +// &&orgBizRegionId != null +// &&!orgBizRegionId.equals(bizRegion)){ +// supplierApplicationService.migrateRegion(editId,TbsCenterType.bizRegion.name(), orgBizRegionId, bizRegion); +// } + } + if(param.getSupplierInfoFlag()==null||!param.getSupplierInfoFlag().equals(1)){ + param.setSupplierTaxNumber(""); + param.setSupplierUser(""); + param.setSupplierLicenseImg(""); + param.setSupplierAttachIds(new String[]{}); + } + String bookCode = ThirtyVerification.getInitBookCode(null,supplier.getCode()); + supplier.setBookCode(bookCode); + this.saveOrUpdate(supplier); + } + + + + @Override + public BmsSupplier getByCode(String code,String belong) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplier::getCode,code); + if(belong!=null&&!belong.equals("ALL")){ + lqw.and(a->a.eq(BmsSupplier::getBelong,belong).or().isNull(BmsSupplier::getBelong)); + } + return this.getOne(lqw,false); + } + + @Override + public BmsSupplier getByName(String String) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplier::getName,String); + return this.getOne(lqw,true); + } + + @Override + public BmsSupplier getByNameOrCode(String value) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplier::getName,value).or().eq(BmsSupplier::getCode,value); + return this.getOne(lqw,false); + } + + @Override + public List listChild(String pid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplier::getPid,pid); + return this.list(lqw); + } + + @Override + public List listChildByPathIds(String pathIds) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.likeRight(BmsSupplier::getPathIds,pathIds+"_"); + return this.list(lqw); + } + + @Override + public List listByRegionId(String regionId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.and(w-> + w.eq(BmsSupplier::getRegionFirst,regionId) + .or().eq(BmsSupplier::getRegionSecond,regionId) + .or().eq(BmsSupplier::getRegionThird,regionId)) + .or().eq(BmsSupplier::getRegionFourthly,regionId); + return this.list(lqw); + } + + @Override + public List listByRegion2Id(String regionId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.and(w-> + w.eq(BmsSupplier::getRegion2First,regionId) + .or().eq(BmsSupplier::getRegion2Second,regionId) + .or().eq(BmsSupplier::getRegion2Third,regionId) + .or().eq(BmsSupplier::getRegion2Fourthly,regionId)); + return this.list(lqw); + } + + @Override + public List listByRegionIds(List regionIds, Integer level) { + return supplierApplicationService.listByRegionIds(regionIds, level); + } + + @Override + public void editBatch(BmsSupplierBatchBo batchBo) { + for (BmsSupplierBatchBo.BmsSupplierDto param : batchBo.getSupplierList()) { + BmsSupplier dbSupplier = this.getByCode(param.getCode(),param.getBelong()); + BmsSupplier parentNode = this.getByCode(param.getParentCode(),param.getBelong()); + BmsSupplier supplier = CopierUtil.copy(param,dbSupplier==null?new BmsSupplier():dbSupplier); + if(parentNode!=null){ + supplier.setPid(parentNode.getId()); + }else { + supplier.setPid("-1"); + } + BmsRegion region = regionService.getByCode(param.getRegionCode()); + this.initRegion(supplier,region.getId()); + BmsRegion2 region2 = region2Service.getByCode(param.getRegion2Code()); + this.initRegion(supplier,region2.getId()); + if(supplier.getId()!=null){ + this.updateById(supplier); + }else { + this.save(supplier); + } + } + this.flashParentId(); + } + + @Override + public void flashParentId() { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplier::getPid,"-1"); + List suppliers = this.list(lqw); + for (BmsSupplier supplier : suppliers) { + BmsSupplier parentSupplier = this.getByCode(supplier.getParentCode(),supplier.getBelong()); + if(parentSupplier==null){ + log.warn("无效的供应商父级编码:{}",supplier.getParentCode()); + supplier.setPid("0"); + }else { + supplier.setPid(parentSupplier.getPid()); + } + this.updateById(supplier); + } + } + + /** + * 初始化区域等级 + * @param supplier + * @param regionId + */ + private void initRegion(BmsSupplier supplier,String regionId){ + supplier.setRegionFirst("0"); + supplier.setRegionSecond("0"); + supplier.setRegionThird("0"); + supplier.setRegionFourthly("0"); + supplier.setRegionLast("0"); + if(regionId==null||regionId.equals("0")){ + return; + } + List childList = regionService.listChild(regionId); + //判断是否有子级节点 + if(childList.size()>0){ +// Assert.throwEx("请选择最后一级销售区域"); + } + BmsRegion currentRegion = regionService.getById(regionId); + if(StringUtils.hasText(currentRegion.getPathIds())){ + String[] regionIds = currentRegion.getPathIds().split("_"); + for (int i = 0; i < regionIds.length; i++) { + if(i==0){ + supplier.setRegionFirst(regionIds[i]); + }else if(i==1){ + supplier.setRegionSecond(regionIds[i]); + }else if(i==2){ + supplier.setRegionThird(regionIds[i]); + }else if(i==3){ + supplier.setRegionFourthly(regionIds[i]); + } + } + supplier.setRegionLast(currentRegion.getId()); + } + } + + /** + * 初始化区域等级 + * @param supplier + * @param regionId + */ + private void initRegion2(BmsSupplier supplier,String regionId){ + supplier.setRegion2First("0"); + supplier.setRegion2Second("0"); + supplier.setRegion2Third("0"); + supplier.setRegion2Fourthly("0"); + supplier.setRegion2Last("0"); + if(regionId==null||regionId.equals("0")){ + return; + } + List childList = region2Service.listChild(regionId); + //判断是否有子级节点 + if(childList.size()>0){ +// Assert.throwEx("请选择最后一级行政区域"); + } + BmsRegion2 currentRegion = region2Service.getById(regionId); + String[] regionIds = currentRegion.getPathIds().split("_"); + for (int i = 0; i < regionIds.length; i++) { + if(i==0){ + supplier.setRegion2First(regionIds[i]); + }else if(i==1){ + supplier.setRegion2Second(regionIds[i]); + }else if(i==2){ + supplier.setRegion2Third(regionIds[i]); + }else if(i==3){ + supplier.setRegion2Fourthly(regionIds[i]); + } + } + supplier.setRegion2Last(currentRegion.getId()); + } + + @Override + public void updateBmsSuppliersUserNullById(List ids){ + this.baseMapper.updateBmsSuppliersUserNullById(ids); + } + + @Override + public void updateBmsSuppliersOtherUserNullById(List ids){ + this.baseMapper.updateBmsSuppliersOtherUserNullById(ids); + } + + @Override + public BigDecimal getErpQuoAmount(String supplierCode) { + R reqResult = seeYonRequestBaseService.getBase(ERP_CUS_AMOUNT_QUO+"?supplierCode="+supplierCode,"获取客户报价单累计["+supplierCode+"]金额"); + if(reqResult==null || !reqResult.getStatus().equals(200)||reqResult.getData()==null){ + //有错误退出 + log.warn("获取客户报价单累计金额,结果失败,cusCode:{}",supplierCode); + return null; + } + try { + return new BigDecimal(reqResult.getData()); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierStatementServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierStatementServiceImpl.java new file mode 100644 index 0000000..fcd50ff --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierStatementServiceImpl.java @@ -0,0 +1,68 @@ +package com.qs.serve.modules.bms.service.impl; + +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.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsSupplierStatement; +import com.qs.serve.modules.bms.service.BmsSupplierStatementService; +import com.qs.serve.modules.bms.mapper.BmsSupplierStatementMapper; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 客户货款对账单 服务实现类 + * @author YenHex + * @since 2024-03-22 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsSupplierStatementServiceImpl extends ServiceImpl implements BmsSupplierStatementService { + + @Autowired + private BmsSupplierService bmsSupplierService; + + public boolean saveBmsSupplierStatement(BmsSupplierStatement param){ + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplier::getCode,param.getSupplierCode()); + List supplierList = bmsSupplierService.list(lqw); + if(supplierList.size()==0){ + Assert.throwEx("没有找到该客户["+param.getSupplierCode()+"]"); + } + + LambdaQueryWrapper statementLambdaQueryWrapper = new LambdaQueryWrapper<>(); + statementLambdaQueryWrapper.eq(BmsSupplierStatement::getJslId,param.getSupplierCode()); + List statementList = this.list(statementLambdaQueryWrapper); + if(statementList.size()>0){ + Assert.throwEx("已存在该ID["+param.getJslId()+"]"); + } + + BmsSupplier supplier = supplierList.get(0); + param.setSupplierId(supplier.getId()); + param.setSupplierName(supplier.getName()); + return this.save(param); + } + + public boolean deleteBmsSupplierStatement(String jslId){ + + LambdaQueryWrapper statementLambdaQueryWrapper = new LambdaQueryWrapper<>(); + statementLambdaQueryWrapper.eq(BmsSupplierStatement::getJslId,jslId); + List statementList = this.list(statementLambdaQueryWrapper); + if(statementList.size()==0){ + Assert.throwEx("不存在该ID["+jslId+"]"); + } + + List ids = statementList.stream().map(a->a.getId()).collect(Collectors.toList()); + + return this.removeBatchByIds(ids); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierVisitAddressServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierVisitAddressServiceImpl.java new file mode 100644 index 0000000..0d6d868 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierVisitAddressServiceImpl.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsSupplierVisitAddress; +import com.qs.serve.modules.bms.service.BmsSupplierVisitAddressService; +import com.qs.serve.modules.bms.mapper.BmsSupplierVisitAddressMapper; + +/** + * 供应商拜访地址 服务实现类 + * @author YenHex + * @since 2023-03-28 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsSupplierVisitAddressServiceImpl extends ServiceImpl implements BmsSupplierVisitAddressService { + + @Override + public void removeBySupplierId(String supplierId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplierVisitAddress::getSupplierId,supplierId); + this.remove(lqw); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierVisitFormServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierVisitFormServiceImpl.java new file mode 100644 index 0000000..1b7637a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierVisitFormServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsSupplierVisitForm; +import com.qs.serve.modules.bms.service.BmsSupplierVisitFormService; +import com.qs.serve.modules.bms.mapper.BmsSupplierVisitFormMapper; + +/** + * 科目表单 服务实现类 + * @author YenHex + * @since 2023-03-28 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsSupplierVisitFormServiceImpl extends ServiceImpl implements BmsSupplierVisitFormService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierVisitServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierVisitServiceImpl.java new file mode 100644 index 0000000..a427934 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierVisitServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsSupplierVisit; +import com.qs.serve.modules.bms.service.BmsSupplierVisitService; +import com.qs.serve.modules.bms.mapper.BmsSupplierVisitMapper; + +/** + * 供应商拜访信息 服务实现类 + * @author YenHex + * @since 2023-03-28 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsSupplierVisitServiceImpl extends ServiceImpl implements BmsSupplierVisitService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierVisitTypeServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierVisitTypeServiceImpl.java new file mode 100644 index 0000000..d030d0b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/bms/service/impl/BmsSupplierVisitTypeServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.bms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.bms.entity.BmsSupplierVisitType; +import com.qs.serve.modules.bms.service.BmsSupplierVisitTypeService; +import com.qs.serve.modules.bms.mapper.BmsSupplierVisitTypeMapper; + +/** + * 拜访类型 服务实现类 + * @author YenHex + * @since 2023-03-28 + */ +@Slf4j +@Service +@AllArgsConstructor +public class BmsSupplierVisitTypeServiceImpl extends ServiceImpl implements BmsSupplierVisitTypeService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/controller/DataAffairCommitController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/controller/DataAffairCommitController.java new file mode 100644 index 0000000..fe9da94 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/controller/DataAffairCommitController.java @@ -0,0 +1,120 @@ +package com.qs.serve.modules.data.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.data.entity.DataAffairCommit; +import com.qs.serve.modules.data.service.DataAffairCommitService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 数据 + * @author YenHex + * @since 2023-08-07 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("data/affairCommit") +public class DataAffairCommitController { + + private DataAffairCommitService dataAffairCommitService; + + /** + * 列表 + * @param param + * @return + */ + //@GetMapping("/list") + //@PreAuthorize("hasRole('data:affairCommit:query')") + public R> getList(DataAffairCommit param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = dataAffairCommitService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + //@GetMapping("/page") + //@PreAuthorize("hasRole('data:affairCommit:query')") + public R> getPage(DataAffairCommit param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = dataAffairCommitService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + //@GetMapping("/getById/{id}") + @SysLog(module = SystemModule.DATA, title = "", biz = BizType.QUERY) + @PreAuthorize("hasRole('data:affairCommit:query')") + public R getById(@PathVariable("id") String id){ + DataAffairCommit dataAffairCommit = dataAffairCommitService.getById(id); + return R.ok(dataAffairCommit); + } + + + + /** + * 更新 + * @param param + * @return + */ + //@PostMapping("/updateById") + @SysLog(module = SystemModule.DATA, title = "", biz = BizType.UPDATE) + //@PreAuthorize("hasRole('data:affairCommit:update')") + public R updateById(@RequestBody @Valid DataAffairCommit param){ + boolean result = dataAffairCommitService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + //@PostMapping("/save") + @SysLog(module = SystemModule.DATA, title = "", biz = BizType.INSERT) + //@PreAuthorize("hasRole('data:affairCommit:insert')") + public R save(@RequestBody @Valid DataAffairCommit param){ + DataAffairCommit entity = CopierUtil.copy(param,new DataAffairCommit()); + boolean result = dataAffairCommitService.save(entity); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + //@DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.DATA, title = "", biz = BizType.DELETE) + //@PreAuthorize("hasRole('data:affairCommit:delete')") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = dataAffairCommitService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/controller/DataSignetController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/controller/DataSignetController.java new file mode 100644 index 0000000..e0315bd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/controller/DataSignetController.java @@ -0,0 +1,42 @@ +package com.qs.serve.modules.data.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.data.mapper.DataSignetMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.data.entity.DataSignet; + +import java.util.List; + +/** + * 数据 印章数据 + * @author YenHex + * @since 2023-07-26 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("data/signet") +public class DataSignetController { + + private DataSignetMapper dataSignetMapper; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(DataSignet param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = dataSignetMapper.selectList(lqw); + return R.ok(list); + } + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/entity/DataAffairCommit.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/entity/DataAffairCommit.java new file mode 100644 index 0000000..51c453b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/entity/DataAffairCommit.java @@ -0,0 +1,119 @@ +package com.qs.serve.modules.data.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +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 2023-08-07 + */ +@Data +@TableName(value = "data_affair_commit",autoResultMap = true) +public class DataAffairCommit implements Serializable { + + private static final long serialVersionUID = 1L; + + /** affairId */ + @TableId(type = IdType.INPUT) + private String id; + + /** 模板编码 */ + @Length(max = 30,message = "模板编码长度不能超过30字") + private String targetCode; + + /** 审批值 */ + @Length(max = 36,message = "审批值长度不能超过36字") + private String targetId; + + /** 评论 */ + @Length(max = 255,message = "评论长度不能超过255字") + private String commentVal; + + /** 释放费用 */ + private Integer releaseFlag; + + /** 状态:0-否定,1-同意,2-退回,3->加签 */ + private Integer state; + + /** 用户id */ + @Length(max = 64,message = "用户id长度不能超过64字") + private String userId; + + /** 用户编码 */ + @Length(max = 40,message = "用户编码长度不能超过40字") + private String userCode; + + /** 用户 */ + @Length(max = 30,message = "用户长度不能超过30字") + private String userName; + + /** 返回的结果 */ + private String resultData; + + /** 附件id */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] attachIds; + + /** 释放的核销ID,用于批量释放回显 */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] verificationIdsRelease; + + /** 备注 */ + @Length(max = 600,message = "备注长度不能超过600字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** + * 释放列表 + */ + @TableField(exist = false) + private List releaseList; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/entity/DataSignet.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/entity/DataSignet.java new file mode 100644 index 0000000..01268c1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/entity/DataSignet.java @@ -0,0 +1,83 @@ +package com.qs.serve.modules.data.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 2023-07-26 + */ +@Data +@TableName("data_signet") +public class DataSignet implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 印章名称 */ + @NotBlank(message = "印章名称不能为空") + @Length(max = 255,message = "印章名称长度不能超过255字") + private String name; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + + public static DataSignet toNewObject(DataSignet source){ + DataSignet signet = new DataSignet(); + signet.setId(source.getId()); + signet.setName(source.getName()); + signet.setRemark(source.getRemark()); + signet.setCreateTime(source.getCreateTime()); + signet.setUpdateTime(source.getUpdateTime()); + signet.setCreateBy(source.getCreateBy()); + signet.setUpdateBy(source.getUpdateBy()); + signet.setTenantId(source.getTenantId()); + return signet; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/mapper/DataAffairCommitMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/mapper/DataAffairCommitMapper.java new file mode 100644 index 0000000..640ed46 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/mapper/DataAffairCommitMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.data.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.data.entity.DataAffairCommit; + +/** + * Mapper + * @author YenHex + * @date 2023-08-07 + */ +public interface DataAffairCommitMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/mapper/DataSignetMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/mapper/DataSignetMapper.java new file mode 100644 index 0000000..1bed611 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/mapper/DataSignetMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.data.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.data.entity.DataSignet; + +/** + * 印章数据 Mapper + * @author YenHex + * @date 2023-07-26 + */ +public interface DataSignetMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/service/DataAffairCommitService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/service/DataAffairCommitService.java new file mode 100644 index 0000000..08d72b9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/service/DataAffairCommitService.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.data.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.data.entity.DataAffairCommit; + +/** + * 服务接口 + * @author YenHex + * @date 2023-08-07 + */ +public interface DataAffairCommitService extends IService { + + Integer getState(String templateCode,String targetId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/service/impl/DataAffairCommitServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/service/impl/DataAffairCommitServiceImpl.java new file mode 100644 index 0000000..f8ec0fb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/data/service/impl/DataAffairCommitServiceImpl.java @@ -0,0 +1,38 @@ +package com.qs.serve.modules.data.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.data.entity.DataAffairCommit; +import com.qs.serve.modules.data.service.DataAffairCommitService; +import com.qs.serve.modules.data.mapper.DataAffairCommitMapper; +import java.util.List; + +/** + * 服务实现类 + * @author YenHex + * @since 2023-08-07 + */ +@Slf4j +@Service +@AllArgsConstructor +public class DataAffairCommitServiceImpl extends ServiceImpl implements DataAffairCommitService { + + @Override + public Integer getState(String templateCode, String targetId) { + LambdaQueryWrapper affairRecord = new LambdaQueryWrapper<>(); + affairRecord.eq(DataAffairCommit::getTargetCode,templateCode); + affairRecord.eq(DataAffairCommit::getTargetId,targetId); + List dataAffairCommits = this.list(affairRecord); + DataAffairCommit max = null; + for (DataAffairCommit commit : dataAffairCommits) { + if(max==null||max.getCreateTime().isBefore(commit.getCreateTime())){ + max = commit; + } + } + return max==null?null:max.getState(); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/controller/ErpCustomerController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/controller/ErpCustomerController.java new file mode 100644 index 0000000..525e9e4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/controller/ErpCustomerController.java @@ -0,0 +1,91 @@ +package com.qs.serve.modules.erp.controller; + +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.sync.AsyncFactory; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.erp.entity.dto.ErpCustomerAmountResult; +import com.qs.serve.modules.erp.service.ErpCustomerService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.math.BigDecimal; + + +/** + * ERP客户 + * @author YenHex + * @since 2023/9/5 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("erp/customer") +public class ErpCustomerController { + + private final ErpCustomerService erpCustomerService; + private final BmsSupplierService supplierService; + + /** + * 获取客户帐余 + * @param code + * @return + */ + @GetMapping("/getAmount/{code}") + public R getAmount(@PathVariable String code){ + BmsSupplier supplier = supplierService.getByCode(code,null); + if(supplier!=null){ + ErpCustomerAmountResult amountResult = erpCustomerService.getCustomerAmount(code); + if(amountResult==null){ + //初始化帐余 + erpCustomerService.initAmount(code); + return new R(201,"客户帐余初始中"); + } + return R.ok(amountResult); + } + return R.error(); + } + + /** + * 获取客户帐余(同步) + * @param code + * @return + */ + @GetMapping("/getAmountSync/{code}") + public R getAmountSync(@PathVariable String code){ + ErpCustomerAmountResult amountResult = new ErpCustomerAmountResult(); + String amount = AsyncFactory.getCumSurplusPrice(AuthContextUtils.getSysUserId(),code); + BigDecimal quoAmount = supplierService.getErpQuoAmount(code); + amountResult.setQuoAmount(quoAmount); + amountResult.setPreAmount(new BigDecimal(amount)); + if(amount.equals("-1")){ + amountResult.setAmount(BigDecimal.ONE.negate()); + }else if (quoAmount!=null){ + amountResult.setAmount(amountResult.getPreAmount().subtract(quoAmount)); + }else { + amountResult.setAmount(amountResult.getPreAmount()); + } + return R.ok(amountResult); + } + + /** + * 初始化客户帐余 + * @param code + * @return + */ + @GetMapping("/initAmount/{code}") + public R initAmount(@PathVariable String code){ + BmsSupplier supplier = supplierService.getByCode(code,null); + if(supplier!=null){ + erpCustomerService.initAmount(code); + return R.ok(); + } + return R.error(); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/entity/ErpDispatchData.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/entity/ErpDispatchData.java new file mode 100644 index 0000000..a8ff62e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/entity/ErpDispatchData.java @@ -0,0 +1,134 @@ +package com.qs.serve.modules.erp.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 2023-06-06 + */ +@Data +@TableName("erp_dispatch_data") +public class ErpDispatchData implements Serializable { + + private static final long serialVersionUID = 1L; + + /** */ + @TableId(type = IdType.AUTO) + private Long id; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String place; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String dlCode; + + /** */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate date; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String cusCode; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String cusName; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String invCode; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String invName; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String invBatch; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String salesDepCode; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String depName; + + /** */ + private Integer qty; + + /** */ + private BigDecimal sumMoney; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String volume; + + /** */ + private Double netWeight; + + /** */ + private BigDecimal dispatchCost; + + /** */ + private BigDecimal invDispatchCost; + + /** */ + private BigDecimal invTransFee; + + /** */ + private BigDecimal invProduceCost; + + /** */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + private Integer delFlag; + + public static ErpDispatchData toNewObject(ErpDispatchData source){ + ErpDispatchData dispatchData = new ErpDispatchData(); + dispatchData.setId(source.getId()); + dispatchData.setPlace(source.getPlace()); + dispatchData.setDlCode(source.getDlCode()); + dispatchData.setDate(source.getDate()); + dispatchData.setCusCode(source.getCusCode()); + dispatchData.setCusName(source.getCusName()); + dispatchData.setInvCode(source.getInvCode()); + dispatchData.setInvName(source.getInvName()); + dispatchData.setInvBatch(source.getInvBatch()); + dispatchData.setSalesDepCode(source.getSalesDepCode()); + dispatchData.setDepName(source.getDepName()); + dispatchData.setQty(source.getQty()); + dispatchData.setSumMoney(source.getSumMoney()); + dispatchData.setVolume(source.getVolume()); + dispatchData.setNetWeight(source.getNetWeight()); + dispatchData.setDispatchCost(source.getDispatchCost()); + dispatchData.setInvDispatchCost(source.getInvDispatchCost()); + dispatchData.setInvTransFee(source.getInvTransFee()); + dispatchData.setInvProduceCost(source.getInvProduceCost()); + dispatchData.setCreateTime(source.getCreateTime()); + return dispatchData; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/entity/dto/ErpCustomerAmountResult.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/entity/dto/ErpCustomerAmountResult.java new file mode 100644 index 0000000..647dd0d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/entity/dto/ErpCustomerAmountResult.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.erp.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/9/5 + */ +@Data +public class ErpCustomerAmountResult { + + /** + * 余额 + */ + BigDecimal amount; + + /** + * 客户总帐 + */ + BigDecimal preAmount; + + /** + * 客户报价单金额累计 + */ + BigDecimal quoAmount; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/entity/dto/ErpDispatchSumVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/entity/dto/ErpDispatchSumVo.java new file mode 100644 index 0000000..5b8f23f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/entity/dto/ErpDispatchSumVo.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.erp.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/6/7 + */ +@Data +public class ErpDispatchSumVo { + + Integer yearMonth; + + String customerCode; + + BigDecimal dispatchSumCost; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/mapper/ErpDispatchDataMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/mapper/ErpDispatchDataMapper.java new file mode 100644 index 0000000..e2258e3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/mapper/ErpDispatchDataMapper.java @@ -0,0 +1,75 @@ +package com.qs.serve.modules.erp.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.erp.entity.ErpDispatchData; +import com.qs.serve.modules.erp.entity.dto.ErpDispatchSumVo; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; + +/** + * 发货单数据 Mapper + * @author YenHex + * @date 2023-06-06 + */ +public interface ErpDispatchDataMapper extends BaseMapper { + + /** + * 查询发货单合计 + * @param startNumber + * @param endNumber + * @return + */ + @InterceptorIgnore(tenantLine = "1") + BigDecimal getSumCost(@Param("startNumber")Integer startNumber, + @Param("endNumber")Integer endNumber); + + /** + * 查询发货单合计 + * @param startNumber + * @param endNumber + * @return + */ + @InterceptorIgnore(tenantLine = "1") + BigDecimal getSumCostGroup(@Param("startNumber")Integer startNumber, + @Param("endNumber")Integer endNumber); + + /** + * 查询发货单合计 + * @param startNumber + * @param endNumber + * @param cusCodes + * @return + */ + @InterceptorIgnore(tenantLine = "1") + List querySumCost(@Param("startNumber")Integer startNumber, + @Param("endNumber")Integer endNumber, + @Param("cusCodes")List cusCodes); + + + + @InterceptorIgnore(tenantLine = "1") + BigDecimal querySumCostAmt(@Param("startNumber")Integer startNumber, + @Param("endNumber")Integer endNumber, + @Param("cusCodes")List cusCodes); + + + @InterceptorIgnore(tenantLine = "1") + @Select("SELECT inv_code FROM `erp_dispatch_data` where `date` > #{lastTowMonth} and cus_code = #{cusCode}") + List selectLast2MonthInvCode(@Param("lastTowMonth") LocalDate lastTowMonth,@Param("cusCode")String cusCode); + + + /** + * 查询发货单合计 + * @param skuCodes + * @return + */ + @InterceptorIgnore(tenantLine = "1") + List querySumCost4BudgetTarger(@Param("skuCodes")List skuCodes); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/service/ErpCustomerService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/service/ErpCustomerService.java new file mode 100644 index 0000000..b18c4dd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/service/ErpCustomerService.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.erp.service; + +import com.qs.serve.modules.erp.entity.dto.ErpCustomerAmountResult; +import org.springframework.web.bind.annotation.PathVariable; + +/** + * @author YenHex + * @since 2023/9/5 + */ +public interface ErpCustomerService { + + /** + * 获取客户帐余额 + * @param supplierCode + * @return + */ + ErpCustomerAmountResult getCustomerAmount(String supplierCode); + + /** + * 初始化 + * @param code + */ + void initAmount( String code); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/service/ErpDispatchDataService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/service/ErpDispatchDataService.java new file mode 100644 index 0000000..a65a2c9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/service/ErpDispatchDataService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.erp.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.erp.entity.ErpDispatchData; + +/** + * 发货单数据 服务接口 + * @author YenHex + * @date 2023-06-06 + */ +public interface ErpDispatchDataService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/service/impl/ErpCustomerServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/service/impl/ErpCustomerServiceImpl.java new file mode 100644 index 0000000..70c73d4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/service/impl/ErpCustomerServiceImpl.java @@ -0,0 +1,61 @@ +package com.qs.serve.modules.erp.service.impl; + +import com.qs.serve.common.framework.manager.AsyncManager; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.modules.sync.AsyncFactory; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.erp.entity.dto.ErpCustomerAmountResult; +import com.qs.serve.modules.erp.service.ErpCustomerService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/9/5 + */ +@Slf4j +@Service +@AllArgsConstructor +public class ErpCustomerServiceImpl implements ErpCustomerService { + + private final RedisService redisService; + + @Override + public ErpCustomerAmountResult getCustomerAmount(String supplierCode) { + String userId = AuthContextUtils.getSysUserId(); + String priceDataKey = "customer_price_data:"+userId; + //数据格式:supplierCode_&_amount 如 A235654_&_612.00 + String data = redisService.getString(priceDataKey); + if(data != null){ + String[] vals = data.split("_&_"); + if(vals.length==2){ + String code = vals[0]; + String amountStr = vals[1]; + if(code.equals(supplierCode)){ + ErpCustomerAmountResult amountResult = new ErpCustomerAmountResult(); + amountResult.setAmount(new BigDecimal(amountStr)); + return amountResult; + } + } + } + this.initAmount(supplierCode); + return null; + } + + @Override + public void initAmount(String code) { + String userId = AuthContextUtils.getSysUserId(); + String lockKey = "customer_price_lock:"+userId+":"+code; + // lockState=1 锁 + Integer lockState = redisService.getInteger(lockKey); + log.debug("customer_price_lock_value:"+lockState); + if(lockState==null||lockState==0){ + //设置值到redis + AsyncManager.me().execute(AsyncFactory.initCustomerPrice(userId,code)); + } + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/service/impl/ErpDispatchDataServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/service/impl/ErpDispatchDataServiceImpl.java new file mode 100644 index 0000000..35cc03c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/erp/service/impl/ErpDispatchDataServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.erp.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.erp.entity.ErpDispatchData; +import com.qs.serve.modules.erp.service.ErpDispatchDataService; +import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper; + +/** + * 发货单数据 服务实现类 + * @author YenHex + * @since 2023-06-06 + */ +@Slf4j +@Service +@AllArgsConstructor +public class ErpDispatchDataServiceImpl extends ServiceImpl implements ErpDispatchDataService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/common/DataSupplierSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/common/DataSupplierSo.java new file mode 100644 index 0000000..e1ec0d2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/common/DataSupplierSo.java @@ -0,0 +1,34 @@ +package com.qs.serve.modules.excel.common; + +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; + +/** + * @author YenHex + * @since 2023/5/31 + */ +@Data +public class DataSupplierSo { + + /** + * 供应商id + */ + private String supplierId; + + /** + * 开始时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate startDate; + + /** + * 结束时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate endDate; + + private Integer saFlag; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/controller/DateCheckApplyController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/controller/DateCheckApplyController.java new file mode 100644 index 0000000..fa8d15b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/controller/DateCheckApplyController.java @@ -0,0 +1,105 @@ +package com.qs.serve.modules.excel.controller; + +import com.qs.serve.common.model.annotation.RepeatSubmit; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.consts.SysConfigKey; +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.Assert; +import com.qs.serve.modules.excel.common.DataSupplierSo; +import com.qs.serve.modules.excel.entity.DataCheckApplyDetailInfo; +import com.qs.serve.modules.excel.entity.DataCheckApplyMainInfo; +import com.qs.serve.modules.excel.entity.DataPayMainInfo; +import com.qs.serve.modules.excel.service.DateCheckApplyService; +import com.qs.serve.modules.sys.entity.SysConfig; +import com.qs.serve.modules.sys.service.SysConfigService; +import com.qs.serve.modules.vtb.entity.so.PayPaymentItemExtendSo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.LocalDate; + +/** + * 数据 对账单 + * @author YenHex + * @since 2023/5/31 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("data/checkApply") +public class DateCheckApplyController { + + private DateCheckApplyService dateCheckApplyService; + private SysConfigService configService; + + /** + * 汇总账单 + * @return + */ + @RepeatSubmit + @GetMapping("/summary") + @SysLog(module = SystemModule.Verification, title = "客户汇总账单", biz = BizType.EXPORT) + public R getSummary(DataSupplierSo param){ + if(param.getEndDate()==null) { + param.setEndDate(LocalDate.now()); + } + if(param.getSaFlag().equals(0)){ + SysConfig config = configService.getByKey(SysConfigKey.DateCheckApplyExcelYear); + if(config==null){ + Assert.throwEx("没有设置全局变量【导出明细时间段】"); + } + String year = config.getConfigValue(); + Integer yearNum = Integer.parseInt(year)-1; + + LocalDate startDate = LocalDate.of(LocalDate.now().getYear()-yearNum,1,1); + param.setStartDate(startDate); + } + DataCheckApplyMainInfo info = dateCheckApplyService.getDataCheckApplyMainInfo(param); + return R.ok(info); + } + + /** + * 明细帐 + * @return + */ + @RepeatSubmit + @GetMapping("/itemized") + @SysLog(module = SystemModule.Verification, title = "客户明细帐", biz = BizType.EXPORT) + public R getItemized(DataSupplierSo param){ + if(param.getEndDate()==null) { + param.setEndDate(LocalDate.now()); + } + if(param.getSaFlag().equals(0)){ + SysConfig config = configService.getByKey(SysConfigKey.DateCheckApplyExcelYear); + if(config==null){ + Assert.throwEx("没有设置全局变量【导出明细时间段】"); + } + String year = config.getConfigValue(); + Integer yearNum = Integer.parseInt(year)-1; + + LocalDate startDate = LocalDate.of(LocalDate.now().getYear()-yearNum,1,1); + if(param.getStartDate()==null || startDate.isAfter(param.getStartDate())) { + param.setStartDate(startDate); + } + } + DataCheckApplyDetailInfo detailInfo = dateCheckApplyService.getDataCheckApplyDetailInfo(param); + return R.ok(detailInfo); + } + + /** + * 明细帐 + * @return + */ + @RepeatSubmit + @GetMapping("/getPayJoinList") + public R getPayJoinList(PayPaymentItemExtendSo param){ + DataPayMainInfo result = dateCheckApplyService.pagePayPaymentItems(param); + return R.ok(result); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/entity/DataCheckApplyDetailInfo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/entity/DataCheckApplyDetailInfo.java new file mode 100644 index 0000000..dac931f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/entity/DataCheckApplyDetailInfo.java @@ -0,0 +1,57 @@ +package com.qs.serve.modules.excel.entity; + +import lombok.Data; + +import java.time.LocalDate; +import java.util.List; + +/** + * 对账单 + * @author YenHex + * @since 2023/5/30 + */ +@Data +public class DataCheckApplyDetailInfo { + + + /** + * 客户名 + */ + private String cusName; + + /** + * 客户地址 + */ + private String cusAddress; + + /** + * 客户编码 + */ + private String cusCode; + + /** + * 联系人用户 + */ + private String contactUser; + + /** + * 联系人 + */ + private String contactMobile; + + /** + * 起始日期 + */ + private LocalDate startDate; + + /** + * 截止日期 + */ + private LocalDate endDate; + + /** + * 明细列表 + */ + private List detailList; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/entity/DataCheckApplyDetailItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/entity/DataCheckApplyDetailItem.java new file mode 100644 index 0000000..06214b6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/entity/DataCheckApplyDetailItem.java @@ -0,0 +1,71 @@ +package com.qs.serve.modules.excel.entity; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 对账单 + * @author YenHex + * @since 2023/5/30 + */ +@Data +public class DataCheckApplyDetailItem { + + private String costApplyId; + /** + * 活动编号 + */ + private String activityCode; + + /** + * 申请时间 + */ + private String activityDate; + + /** + * 活动主题 + */ + private String activityTheme; + + /** + * 已批准(费用申请) + */ + private BigDecimal costApplyAmt; + + /** + * 已核销 + */ + private BigDecimal checkedAmt; + + /** + * 申请中 + */ + private BigDecimal checkingAmt; + + /** + * 未申请 + */ + private BigDecimal notCheckAmt; + + /** + * 不予核销 + */ + private BigDecimal dontCheckAmt; + + /** + * 已支付 + */ + private BigDecimal payAmt; + + /** + * 待支付 + */ + private BigDecimal unPayAmt; + + /** + * 不再支付 + */ + private BigDecimal notPayAmt; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/entity/DataCheckApplyMainInfo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/entity/DataCheckApplyMainInfo.java new file mode 100644 index 0000000..60c85b0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/entity/DataCheckApplyMainInfo.java @@ -0,0 +1,91 @@ +package com.qs.serve.modules.excel.entity; + +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + * 对账单 + * @author YenHex + * @since 2023/5/30 + */ +@Data +public class DataCheckApplyMainInfo { + + /** + * 已批准(费用申请) + */ + private BigDecimal costApplyAmt; + + /** + * 已核销 + */ + private BigDecimal checkedAmt; + + /** + * 申请中 + */ + private BigDecimal checkingAmt; + + /** + * 未申请 + */ + private BigDecimal notCheckAmt; + + /** + * 不予核销 + */ + private BigDecimal dontCheckAmt; + + /** + * 已支付 + */ + private BigDecimal payAmt; + + /** + * 待支付 + */ + private BigDecimal unPayAmt; + + /** + * 不再支付 + */ + private BigDecimal notPayAmt; + + /** + * 客户名 + */ + private String cusName; + + /** + * 客户地址 + */ + private String cusAddress; + + /** + * 客户编码 + */ + private String cusCode; + + /** + * 联系人用户 + */ + private String contactUser; + + /** + * 联系人 + */ + private String contactMobile; + + /** + * 起始日期 + */ + private LocalDate startDate; + + /** + * 截止日期 + */ + private LocalDate endDate; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/entity/DataPayMainInfo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/entity/DataPayMainInfo.java new file mode 100644 index 0000000..dcc7552 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/entity/DataPayMainInfo.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.excel.entity; + +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.modules.vtb.entity.dto.PayPaymentItemExtend; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author YenHex + * @since 2023/11/16 + */ +@Data +public class DataPayMainInfo { + + + /** + * 已支付 + */ + private BigDecimal payAmt; + + + PageVo pageInfo; + + + List list; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/service/DateCheckApplyService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/service/DateCheckApplyService.java new file mode 100644 index 0000000..68a3796 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/service/DateCheckApplyService.java @@ -0,0 +1,34 @@ +package com.qs.serve.modules.excel.service; + +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.modules.excel.common.DataSupplierSo; +import com.qs.serve.modules.excel.entity.DataCheckApplyDetailInfo; +import com.qs.serve.modules.excel.entity.DataCheckApplyMainInfo; +import com.qs.serve.modules.excel.entity.DataPayMainInfo; +import com.qs.serve.modules.vtb.entity.dto.PayPaymentItemExtend; +import com.qs.serve.modules.vtb.entity.so.PayPaymentItemExtendSo; + +/** + * @author YenHex + * @since 2023/6/2 + */ +public interface DateCheckApplyService { + + /** + * 获取明细帐 + * @param param + * @return + */ + DataCheckApplyDetailInfo getDataCheckApplyDetailInfo(DataSupplierSo param); + + /** + * 汇总单 + * @param param + * @return + */ + DataCheckApplyMainInfo getDataCheckApplyMainInfo(DataSupplierSo param); + + + DataPayMainInfo pagePayPaymentItems(PayPaymentItemExtendSo extendSo); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/service/impl/DateCheckApplyServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/service/impl/DateCheckApplyServiceImpl.java new file mode 100644 index 0000000..73face2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/excel/service/impl/DateCheckApplyServiceImpl.java @@ -0,0 +1,269 @@ +package com.qs.serve.modules.excel.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.RowParam; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierContacts; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsSupplierContactsService; +import com.qs.serve.modules.excel.common.DataSupplierSo; +import com.qs.serve.modules.excel.entity.DataCheckApplyDetailInfo; +import com.qs.serve.modules.excel.entity.DataCheckApplyDetailItem; +import com.qs.serve.modules.excel.entity.DataCheckApplyMainInfo; +import com.qs.serve.modules.excel.entity.DataPayMainInfo; +import com.qs.serve.modules.excel.service.DateCheckApplyService; +import com.qs.serve.modules.pay.common.PaymentType; +import com.qs.serve.modules.pay.entity.PayPaymentItem; +import com.qs.serve.modules.pay.mapper.PayPaymentItemMapper; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.entity.vo.TbsCostApplySumAmountVo; +import com.qs.serve.modules.tbs.mapper.TbsActivityMapper; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper; +import com.qs.serve.modules.tbs.mapper.TbsCostApplySumAmountMapper; +import com.qs.serve.modules.vtb.common.VtbVerificationState; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.entity.dto.PayPaymentItemExtend; +import com.qs.serve.modules.vtb.entity.so.PayPaymentItemExtendSo; +import com.qs.serve.modules.vtb.mapper.VtbVerForPayReportMapper; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/6/2 + */ +@Slf4j +@Service +@AllArgsConstructor +public class DateCheckApplyServiceImpl implements DateCheckApplyService { + + private final TbsActivityMapper activityMapper; + private final TbsCostApplyMapper costApplyMapper; + private final VtbVerificationMapper verificationMapper; + //private final PayPaymentMapper paymentMapper; + private final PayPaymentItemMapper payPaymentItemMapper; + private final BmsSupplierMapper supplierMapper; + private final BmsSupplierContactsService supplierContactsService; + private final TbsCostApplySumAmountMapper tbsCostApplySumAmountMapper; + private final VtbVerForPayReportMapper payReportMapper; + + @Override + public DataCheckApplyDetailInfo getDataCheckApplyDetailInfo(DataSupplierSo param) { + String supplierId = param.getSupplierId(); + BmsSupplier supplier = supplierMapper.selectById(supplierId); + LambdaQueryWrapper conLqw = new LambdaQueryWrapper<>(); + conLqw.eq(BmsSupplierContacts::getSupplierId,supplierId); + BmsSupplierContacts contacts = supplierContactsService.getOne(conLqw,false); + DataCheckApplyDetailInfo detailInfo = new DataCheckApplyDetailInfo(); + detailInfo.setCusName(supplier.getName()); + detailInfo.setCusAddress(supplier.getAddress()); + detailInfo.setCusCode(supplier.getCode()); + if(contacts!=null){ + detailInfo.setContactUser(contacts.getContactsName()); + detailInfo.setContactMobile(contacts.getContactsNumber()); + } + detailInfo.setStartDate(param.getStartDate()); + detailInfo.setEndDate(param.getEndDate()); + + LambdaQueryWrapper costApplyLambdaQueryWrapper = new LambdaQueryWrapper<>(); + costApplyLambdaQueryWrapper.eq(TbsCostApply::getSupplierId,supplierId); + if(param.getStartDate()!=null){ + costApplyLambdaQueryWrapper.ge(TbsCostApply::getSubmitTime,param.getStartDate()); + } + costApplyLambdaQueryWrapper.le(TbsCostApply::getSubmitTime,param.getEndDate().atTime(23,59,59)); + costApplyLambdaQueryWrapper.in(TbsCostApply::getChargeState,TbsCostApplyState.getPassCode()); + List costApplyList = costApplyMapper.selectList(costApplyLambdaQueryWrapper); + + + List detailItemList = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(costApplyList)){ + + List dataCheckApplyDetailItems = tbsCostApplySumAmountMapper.selectDataCheckApplyDetailItem(null,costApplyList.stream().map(a->a.getId()).collect(Collectors.toList())); + + detailItemList.addAll(dataCheckApplyDetailItems); + } + + detailInfo.setDetailList(detailItemList); + return detailInfo; + } + + @Override + public DataCheckApplyMainInfo getDataCheckApplyMainInfo(DataSupplierSo param) { + String supplierId = param.getSupplierId(); + BmsSupplier supplier = supplierMapper.selectById(supplierId); + LambdaQueryWrapper conLqw = new LambdaQueryWrapper<>(); + conLqw.eq(BmsSupplierContacts::getSupplierId,supplierId); + BmsSupplierContacts contacts = supplierContactsService.getOne(conLqw,false); + + LambdaQueryWrapper costApplyLambdaQueryWrapper = new LambdaQueryWrapper<>(); + costApplyLambdaQueryWrapper.eq(TbsCostApply::getSupplierId,supplierId); + if(param.getStartDate()!=null){ + costApplyLambdaQueryWrapper.ge(TbsCostApply::getSubmitTime,param.getStartDate()); + } + costApplyLambdaQueryWrapper.le(TbsCostApply::getSubmitTime,param.getEndDate().atTime(23,59,59)); + costApplyLambdaQueryWrapper.in(TbsCostApply::getChargeState,TbsCostApplyState.getPassCode()); + List costApplyList = costApplyMapper.selectList(costApplyLambdaQueryWrapper); + + DataCheckApplyMainInfo mainInfo; + if(CollectionUtil.isNotEmpty(costApplyList)) { + mainInfo = tbsCostApplySumAmountMapper.selectDataCheckApplyMainInfo(param.getSupplierId(), costApplyList.stream().map(a -> a.getId()).collect(Collectors.toList())); + }else{ + mainInfo = new DataCheckApplyMainInfo(); + } + + mainInfo.setCusName(supplier.getName()); + mainInfo.setCusAddress(supplier.getAddress()); + mainInfo.setCusCode(supplier.getCode()); + if (contacts != null) { + mainInfo.setContactUser(contacts.getContactsName()); + mainInfo.setContactMobile(contacts.getContactsNumber()); + } + mainInfo.setStartDate(param.getStartDate()); + mainInfo.setEndDate(param.getEndDate()); + return mainInfo; + +// LambdaQueryWrapper costApplyLambdaQueryWrapper = new LambdaQueryWrapper<>(); +// costApplyLambdaQueryWrapper.eq(TbsCostApply::getSupplierId,supplierId); +// if(param.getStartDate()!=null){ +// costApplyLambdaQueryWrapper.ge(TbsCostApply::getSubmitTime,param.getStartDate()); +// } +// costApplyLambdaQueryWrapper.le(TbsCostApply::getSubmitTime,param.getEndDate().atTime(23,59,59)); +// costApplyLambdaQueryWrapper.in(TbsCostApply::getChargeState,TbsCostApplyState.getPassCode()); +// List costApplyList = costApplyMapper.selectList(costApplyLambdaQueryWrapper); + +// List dataCheckApplyDetailItems = tbsCostApplySumAmountMapper.selectDataCheckApplyDetailItem(param.getSupplierId(),null); +// +// //申请总金额 +// BigDecimal totalAmount = null; +// if(costApplyList!=null && costApplyList.size()>0) { +// activityMapper.sumSupplierActivityCost(supplierId, costApplyList.stream().map(a -> a.getId()).collect(Collectors.toList())); +// } +// if(totalAmount==null){ +// totalAmount = BigDecimal.ZERO; +// } +// mainInfo.setCostApplyAmt(totalAmount); +// if(totalAmount.compareTo(BigDecimal.ZERO)==0){ +// mainInfo.setCostApplyAmt(totalAmount); +// mainInfo.setCheckedAmt(totalAmount); +// mainInfo.setCheckingAmt(totalAmount); +// mainInfo.setNotCheckAmt(totalAmount); +// mainInfo.setDontCheckAmt(totalAmount); +// mainInfo.setPayAmt(totalAmount); +// mainInfo.setUnPayAmt(totalAmount); +// mainInfo.setNotPayAmt(totalAmount); +// }else { +// LambdaQueryWrapper veriLqw = new LambdaQueryWrapper<>(); +// veriLqw.select(VtbVerification::getVerificationState,VtbVerification::getAmount); +// veriLqw.eq(VtbVerification::getSupplierId,supplierId); +// veriLqw.in(VtbVerification::getVerificationState, +// VtbVerificationState.Finished.getCode(), +// VtbVerificationState.Rollback.getCode(), +// VtbVerificationState.Commiting.getCode()); +// veriLqw.in(VtbVerification::getCostApplyId,costApplyList.stream().map(a->a.getId()).collect(Collectors.toList())); +// +// List vtbVerificationList = verificationMapper.selectList(veriLqw); +// List finishedVeriList= vtbVerificationList.stream() +// .filter(a->a.getVerificationState().equals(VtbVerificationState.Finished.getCode())).collect(Collectors.toList()); +// List unFinishVeriList= vtbVerificationList.stream() +// .filter(a->!a.getVerificationState().equals(VtbVerificationState.Finished.getCode())).collect(Collectors.toList()); +// +// BigDecimal checkedAmt = BigDecimal.ZERO; +// for (VtbVerification verification : finishedVeriList) { +// checkedAmt = checkedAmt.add(verification.getAmount()); +// } +// +// BigDecimal notCheckAmt = BigDecimal.ZERO; +// for (VtbVerification verification : unFinishVeriList) { +// notCheckAmt = notCheckAmt.add(verification.getAmount()); +// } +// //不再支付统计 +// BigDecimal dontCheckAmt = null; +// if(costApplyList!=null && costApplyList.size()>0) { +// activityMapper.sumSupplierNotCheckCost(supplierId, costApplyList.stream().map(a -> a.getId()).collect(Collectors.toList())); +// } +//// BigDecimal dontCheckAmt = activityMapper.sumSupplierNotCheckCost(supplierId); +// if(dontCheckAmt==null){ +// dontCheckAmt = BigDecimal.ZERO; +// } +// mainInfo.setCheckedAmt(checkedAmt); +// mainInfo.setCheckingAmt(notCheckAmt); +// mainInfo.setDontCheckAmt(dontCheckAmt); +// BigDecimal notCheckedAmt = mainInfo.getCostApplyAmt().subtract(mainInfo.getCheckedAmt()) +// .subtract(mainInfo.getCheckingAmt()) +// .subtract(mainInfo.getDontCheckAmt()); +// mainInfo.setNotCheckAmt(notCheckedAmt); +// +// if(checkedAmt.compareTo(BigDecimal.ZERO)>0){ +// +// //已支付 +// PayPaymentItem payItemQuery = new PayPaymentItem(); +// payItemQuery.setCancelFlag(0); +//// payItemQuery.setSupplierId(Long.parseLong(supplierId)); +// payItemQuery.setCostApplyIds(costApplyList.stream().map(a->a.getId()).collect(Collectors.toList())); +//// LambdaQueryWrapper payLqw = new LambdaQueryWrapper<>(); +//// payLqw.in(PayPaymentItem::getCostApplyId,costApplyList.stream().map(a->a.getId()).collect(Collectors.toList())); +//// payLqw.eq(PayPaymentItem::getCancelFlag,0); +// +// List allPayList = payPaymentItemMapper.selectPayPaymentItemList(payItemQuery); +// List payList = allPayList.stream().filter(a->a.getPayType().equals(PaymentType.PAYMENT)).collect(Collectors.toList()); +// List unPayList = allPayList.stream().filter(a->a.getPayType().equals(PaymentType.UN_PAYMENT)).collect(Collectors.toList()); +// +// //不再支付 +// BigDecimal notPayAmt = BigDecimal.ZERO; +// for (PayPaymentItem paymentItem : unPayList) { +// notPayAmt = notPayAmt.add(paymentItem.getItemPayAmount()); +// } +// +// BigDecimal payAmt = BigDecimal.ZERO; +// for (PayPaymentItem paymentItem : payList) { +// payAmt = payAmt.add(paymentItem.getItemPayAmount()); +// } +// //未支付 +// BigDecimal unPayAmt = checkedAmt.subtract(payAmt).subtract(notPayAmt); +// +// mainInfo.setPayAmt(payAmt); +// mainInfo.setUnPayAmt(unPayAmt); +// mainInfo.setNotPayAmt(notPayAmt); +// }else { +// mainInfo.setPayAmt(BigDecimal.ZERO); +// mainInfo.setUnPayAmt(BigDecimal.ZERO); +// mainInfo.setNotPayAmt(BigDecimal.ZERO); +// } +// +// } +// return mainInfo; + } + + + @Override + public DataPayMainInfo pagePayPaymentItems(PayPaymentItemExtendSo extendSo) { + DataPayMainInfo mainInfo = new DataPayMainInfo(); + Long count = payReportMapper.countPayItemList(extendSo); + PageVo pageVo = new PageVo<>(); + pageVo.initPageByTotal(count); + mainInfo.setPageInfo(pageVo); + if(count>0){ + //统计支付金额 + BigDecimal payAmt = payReportMapper.sumPayItemListAmt(extendSo); + mainInfo.setPayAmt(payAmt); + List list = payReportMapper.selectPayItemList(extendSo,new RowParam(true)); + mainInfo.setList(list); + } + return mainInfo; + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/common/ExlConst.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/common/ExlConst.java new file mode 100644 index 0000000..e77d046 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/common/ExlConst.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.exl.common; + +/** + * @author YenHex + * @since 2023/8/15 + */ +public interface ExlConst { + + String TABLE_NAME_PRE = "exd_"; + String TABLE_COMMENT_PRE = "excel数据-"; + + String DATETIME_TYPE = "datetime"; + String DATE_TYPE = "date"; + String TYPE_INT = "int"; + String TYPE_MONEY = "money"; + String TYPE_STRING = "string"; + + /** 业务类型 */ + String TYPE_CUSTOMER_CODE = "customerCode"; + String TYPE_USER_CODE = "userCode"; + + String TABLE_CONFIG_PARAM = "tb_config_cnf_id"; + + String PRE_COLUMN_START = "START--"; + String PRE_COLUMN_START_LABEL = "(开始时间)"; + + String PRE_COLUMN_END = "END--"; + String PRE_COLUMN_END_LABEL = "(结束时间)"; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/common/QsSqlSessionUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/common/QsSqlSessionUtil.java new file mode 100644 index 0000000..cff4b3e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/common/QsSqlSessionUtil.java @@ -0,0 +1,63 @@ +package com.qs.serve.modules.exl.common; + +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.session.SqlSession; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.SqlSessionUtils; + +import java.sql.PreparedStatement; +import java.sql.SQLException; + +/** + * @author YenHex + * @since 2023/8/14 + */ +@Slf4j +public class QsSqlSessionUtil { + + /** + * 获取sqlSession + * @return + */ + public static SqlSession getSqlSession(SqlSessionTemplate sqlSessionTemplate){ + return SqlSessionUtils.getSqlSession(sqlSessionTemplate.getSqlSessionFactory(), + sqlSessionTemplate.getExecutorType(), sqlSessionTemplate.getPersistenceExceptionTranslator()); + } + + /** + * 关闭sqlSession + * @param session + */ + public static void closeSqlSession(SqlSession session,SqlSessionTemplate sqlSessionTemplate) { + SqlSessionUtils.closeSqlSession(session, sqlSessionTemplate.getSqlSessionFactory()); + } + + /** + * 执行sql + * @param sql + * @param sqlSessionTemplate + * @return + */ + public static boolean executeSql(String sql,SqlSessionTemplate sqlSessionTemplate){ + PreparedStatement pst = null; + SqlSession session = getSqlSession(sqlSessionTemplate); + try { + pst = session.getConnection().prepareStatement(sql); + pst.execute(); + return true; + } catch (SQLException e) { + log.error("执行sql:[{}] \n msg:{}",sql,e.getMessage()); + }finally { + if(pst!=null){ + try { + pst.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + closeSqlSession(session,sqlSessionTemplate); + } + return false; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/common/TableCreateSqlUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/common/TableCreateSqlUtil.java new file mode 100644 index 0000000..c3d6a8d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/common/TableCreateSqlUtil.java @@ -0,0 +1,93 @@ +package com.qs.serve.modules.exl.common; + +import com.alibaba.fastjson.JSONObject; +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.exl.entity.ExlColumnConf; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.qs.serve.modules.exl.common.ExlConst.*; + +/** + * @author YenHex + * @since 2023/8/14 + */ +public class TableCreateSqlUtil { + + public static final Map MYSQL_DATA_MAP = new HashMap<>(); + + /** + * 业务的默认数据类型 + */ + public static final String DEFAULT_STRING = "string"; + + static { + //数据类型 + MYSQL_DATA_MAP.put("int","bigint"); + MYSQL_DATA_MAP.put("string","varchar(300)"); + MYSQL_DATA_MAP.put("date","date"); + MYSQL_DATA_MAP.put("money","decimal(11, 2)"); + MYSQL_DATA_MAP.put("datetime","datetime"); + //业务类型 + MYSQL_DATA_MAP.put(TYPE_CUSTOMER_CODE,"varchar(50)"); + MYSQL_DATA_MAP.put(TYPE_USER_CODE,"varchar(50)"); + } + + public static final String COLUMN_NULL = " null "; + public static final String COLUMN_NOT_NULL = " not null "; + public static final String COLUMN_COMMENT = "COMMENT"; + + public static String createMysqlTableSql(String tableName,String tableRemark, List columnList){ + StringBuffer result = new StringBuffer("CREATE TABLE `"+tableName+"` ("); + result.append(" `union_row_id` varchar(255) NOT NULL COMMENT 'union_row_id',"); + for (ExlColumnConf column : columnList) { + String typeParam = column.getColumnType(); + String columnType = MYSQL_DATA_MAP.get(typeParam)==null?column.getColumnType():MYSQL_DATA_MAP.get(typeParam); + String nullValue = column.getNotNullFlag().equals(1) ? COLUMN_NOT_NULL:COLUMN_NULL; + result.append("`"+column.getColumnName()+"` "+ + columnType + + nullValue + + COLUMN_COMMENT + " '"+ + column.getColumnHeader()+"',"); + //以下,拓展业务类型数据库列 + if(typeParam.equals(TYPE_CUSTOMER_CODE)){ + result.append("`"+column.getColumnName()+"_ext_cus_name` "+ + columnType + + COLUMN_NULL + + COLUMN_COMMENT + " '"+ + column.getColumnHeader().replace("编码","")+"名称',"); + } + if(typeParam.equals(TYPE_USER_CODE)){ + result.append("`"+column.getColumnName()+"_ext_usr_name` "+ + columnType + + COLUMN_NULL + + COLUMN_COMMENT + " '"+ + column.getColumnHeader().replace("编码","")+"名称',"); + } + } + result.append(" PRIMARY KEY (`union_row_id`) USING BTREE "); + return result.append(") COMMENT = '"+tableRemark+"' ").toString(); + } + + public static String buildUnionId(List columnList, JSONObject jsonObject ){ + StringBuilder unionId = new StringBuilder(); + for (ExlColumnConf columnConf : columnList) { + if(columnConf.getKeyFlag().equals(1)){ + String val = jsonObject.getString(columnConf.getColumnName()); + if(val==null){ + Assert.throwEx("["+columnConf.getColumnName()+"]不能为空"); + } + val = val.replace("_","-")+"_"; + unionId.append(val); + } + } + String tmp = unionId.toString().replace("null_",""); + if(tmp.length()<1){ + return null; + } + return unionId.toString(); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/controller/ExlTableConfController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/controller/ExlTableConfController.java new file mode 100644 index 0000000..ecb8fa8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/controller/ExlTableConfController.java @@ -0,0 +1,275 @@ +package com.qs.serve.modules.exl.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.exl.common.ExlConst; +import com.qs.serve.modules.exl.common.QsSqlSessionUtil; +import com.qs.serve.modules.exl.common.TableCreateSqlUtil; +import com.qs.serve.modules.exl.entity.ExlColumnConf; +import com.qs.serve.modules.exl.entity.ExlTableUser; +import com.qs.serve.modules.exl.entity.bo.ExlTableUserBo; +import com.qs.serve.modules.exl.entity.dto.ExlQueryFieldDto; +import com.qs.serve.modules.exl.entity.dto.ExlTableBo; +import com.qs.serve.modules.exl.service.ExlColumnConfService; +import com.qs.serve.modules.exl.service.ExlTableUserService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.SqlSessionTemplate; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.exl.entity.ExlTableConf; +import com.qs.serve.modules.exl.service.ExlTableConfService; + +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 动态Excel表 表配置 + * @author YenHex + * @since 2023-08-11 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("exl/tableConf") +public class ExlTableConfController { + + private SqlSessionTemplate sqlSessionTemplate; + private ExlTableConfService exlTableConfService; + private ExlColumnConfService exlColumnConfService; + private ExlTableUserService exlTableUserService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(ExlTableConf param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = exlTableConfService.list(lqw); + return R.ok(list); + } + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(ExlTableConf param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = exlTableConfService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Excel, title = "表配置", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + ExlTableConf exlTableConf = exlTableConfService.getById(id); + LambdaQueryWrapper columnLqw = new LambdaQueryWrapper<>(); + columnLqw.eq(ExlColumnConf::getTableConfId,id); + List columnConfList = exlColumnConfService.list(columnLqw); + //加载的列拓展 + List resultColumnConfList = new ArrayList<>(); + for (ExlColumnConf columnConf : columnConfList) { + columnConf.setHideOnEditFlag(0); + resultColumnConfList.add(columnConf); + if(columnConf.getColumnType().equals(ExlConst.TYPE_CUSTOMER_CODE)){ + ExlColumnConf conf = new ExlColumnConf(); + conf.setColumnName(columnConf.getColumnName()+"_ext_cus_name"); + conf.setColumnHeader(columnConf.getColumnHeader()+"(名称)"); + conf.setColumnType(TableCreateSqlUtil.DEFAULT_STRING); + conf.setSort(0); + conf.setHideOnEditFlag(1); + resultColumnConfList.add(conf); + } + if(columnConf.getColumnType().equals(ExlConst.TYPE_USER_CODE)){ + ExlColumnConf conf = new ExlColumnConf(); + conf.setColumnName(columnConf.getColumnName()+"_ext_usr_name"); + conf.setColumnHeader(columnConf.getColumnHeader()+"(名称)"); + conf.setColumnType(TableCreateSqlUtil.DEFAULT_STRING); + conf.setSort(0); + conf.setHideOnEditFlag(1); + resultColumnConfList.add(conf); + } + } + exlTableConf.setColumnList(resultColumnConfList); + //加载管理员 + LambdaQueryWrapper tableUserLqw = new LambdaQueryWrapper<>(); + tableUserLqw.eq(ExlTableUser::getTableConfId,id); + List tableUsers = exlTableUserService.list(tableUserLqw); + exlTableConf.setAdminList(tableUsers); + //组装查询参数列表 + List queryColumn = columnConfList.stream() + .filter(a->a.getConditionFlag().equals(1) + &&!a.getColumnType().equals(ExlConst.TYPE_MONEY)).collect(Collectors.toList()); + List queryFieldList = new ArrayList<>(); + for (ExlColumnConf columnConf : queryColumn) { + String columnType = columnConf.getColumnType(); + if(columnType.contains(ExlConst.DATE_TYPE)){ + ExlQueryFieldDto startDto = new ExlQueryFieldDto(); + startDto.setField(ExlConst.PRE_COLUMN_START + columnConf.getColumnName()); + startDto.setType(columnType); + startDto.setLabel(columnConf.getColumnHeader()+ExlConst.PRE_COLUMN_START_LABEL); + queryFieldList.add(startDto); + ExlQueryFieldDto fieldDto = new ExlQueryFieldDto(); + fieldDto.setField(ExlConst.PRE_COLUMN_END + columnConf.getColumnName()); + fieldDto.setType(columnType); + fieldDto.setLabel(columnConf.getColumnHeader()+ExlConst.PRE_COLUMN_END_LABEL); + queryFieldList.add(fieldDto); + }else { + if(columnType.equals(ExlConst.TYPE_CUSTOMER_CODE)){ + //业务类型-客户 + ExlQueryFieldDto fieldDto = new ExlQueryFieldDto(); + fieldDto.setField(columnConf.getColumnName()); + fieldDto.setType(TableCreateSqlUtil.DEFAULT_STRING); + fieldDto.setLabel(columnConf.getColumnHeader()); + queryFieldList.add(fieldDto); + //拓展名称 + ExlQueryFieldDto fieldDtoName = new ExlQueryFieldDto(); + fieldDtoName.setField(columnConf.getColumnName()+"_ext_cus_name"); + fieldDtoName.setType(TableCreateSqlUtil.DEFAULT_STRING); + fieldDtoName.setLabel(columnConf.getColumnHeader()+"(名称)"); + queryFieldList.add(fieldDtoName); + + }else if(columnType.equals(ExlConst.TYPE_USER_CODE)){ + //业务类型-用户 + ExlQueryFieldDto fieldDto = new ExlQueryFieldDto(); + fieldDto.setField(columnConf.getColumnName()); + fieldDto.setType(TableCreateSqlUtil.DEFAULT_STRING); + fieldDto.setLabel(columnConf.getColumnHeader()); + queryFieldList.add(fieldDto); + //拓展名称 + ExlQueryFieldDto fieldDtoName = new ExlQueryFieldDto(); + fieldDtoName.setField(columnConf.getColumnName()+"_ext_usr_name"); + fieldDtoName.setType(TableCreateSqlUtil.DEFAULT_STRING); + fieldDtoName.setLabel(columnConf.getColumnHeader()+"(名称)"); + queryFieldList.add(fieldDtoName); + }else { + //非业务类型 + ExlQueryFieldDto fieldDto = new ExlQueryFieldDto(); + fieldDto.setField(columnConf.getColumnName()); + fieldDto.setType(columnConf.getColumnType()); + fieldDto.setLabel(columnConf.getColumnHeader()); + queryFieldList.add(fieldDto); + } + } + } + exlTableConf.setQueryList(queryFieldList); + exlTableConf.setAdminFlag(exlTableUserService.checkAdmin(exlTableConf.getId(), AuthContextUtils.getSysUserId())); + return R.ok(exlTableConf); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.Excel, title = "表配置", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid ExlTableBo param){ + if(param.getId()==null){ + return R.error("id is null"); + } + ExlTableConf tableConf = exlTableConfService.modify(param); + return R.ok(tableConf); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.Excel, title = "表配置", biz = BizType.INSERT) + public R save(@RequestBody @Valid ExlTableBo param){ + if(param.getId()!=null){ + return R.error("id should be null"); + } + ExlTableConf tableConf = exlTableConfService.modify(param); + return R.ok(tableConf); + } + + /** + * 启用配置 + * @param tableId + * @return + */ + @PostMapping("/enable/{tableId}") + @SysLog(module = SystemModule.Excel, title = "表配置", biz = BizType.INSERT) + public R enable(@PathVariable("tableId") String tableId){ + ExlTableConf tableConf = exlTableConfService.getById(tableId); + LambdaQueryWrapper columnLqw = new LambdaQueryWrapper<>(); + columnLqw.eq(ExlColumnConf::getTableConfId,tableId); + List columnConfList = exlColumnConfService.list(columnLqw); + if(tableConf.getEnableFlag().equals(0)){ + String sql = TableCreateSqlUtil.createMysqlTableSql( + ExlConst.TABLE_NAME_PRE + tableConf.getTableName(), + ExlConst.TABLE_COMMENT_PRE + tableConf.getExcelTitle(), + columnConfList); + log.debug(sql); + boolean result = QsSqlSessionUtil.executeSql(sql,sqlSessionTemplate); + if(result){ + tableConf.setEnableFlag(1); + tableConf.setEnableTime(LocalDateTime.now()); + exlTableConfService.updateById(tableConf); + }else { + log.error("[ID:{}]创建表格失败,建表语句:{}",tableId,sql); + return R.error("创建失败"); + } + } + return R.ok(); + } + + + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.Excel, title = "表配置", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(ExlTableConf::getId,ids); + lqw.eq(ExlTableConf::getEnableFlag,1); + Long count = exlTableConfService.count(lqw); + if(count>0){ + return R.error("已启用的配置不可删除"); + } + boolean result = exlTableConfService.removeByIds(idsLong); + return R.isTrue(result); + } + + /** + * 配置数据中心管理员 + * @param param + * @return + */ + @PostMapping("/confAdmins") + public R tableUser(@RequestBody ExlTableUserBo param){ + exlTableUserService.confAdmins(param); + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/controller/ExlTableDataController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/controller/ExlTableDataController.java new file mode 100644 index 0000000..3746e49 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/controller/ExlTableDataController.java @@ -0,0 +1,416 @@ +package com.qs.serve.modules.exl.controller; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.exl.common.ExlConst; +import com.qs.serve.modules.exl.common.QsSqlSessionUtil; +import com.qs.serve.modules.exl.common.TableCreateSqlUtil; +import com.qs.serve.modules.exl.entity.ExlColumnConf; +import com.qs.serve.modules.exl.entity.ExlTableConf; +import com.qs.serve.modules.exl.entity.dto.ExlBatchSaveBo; +import com.qs.serve.modules.exl.entity.dto.ExlConditionDto; +import com.qs.serve.modules.exl.mapper.ExlTableConfMapper; +import com.qs.serve.modules.exl.service.ExlColumnConfService; +import com.qs.serve.modules.exl.service.ExlTableConfService; +import com.qs.serve.modules.exl.service.ExlTableUserService; +import com.qs.serve.modules.his.entity.HisUserSupplier; +import com.qs.serve.modules.his.mapper.HisUserSupplierMapper; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.sys.service.SysPostUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.mybatis.spring.SqlSessionTemplate; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.stream.Collectors; + +import static com.qs.serve.modules.exl.common.TableCreateSqlUtil.DEFAULT_STRING; + +/** + * 动态Excel表 数据查询 + * @author YenHex + * @since 2023-08-11 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("exl/tableData") +public class ExlTableDataController { + + private ExlTableConfService exlTableConfService; + private ExlColumnConfService exlColumnConfService; + private ExlTableUserService exlTableUserService; + private SqlSessionTemplate sqlSessionTemplate; + private ExlTableConfMapper exlTableConfMapper; + private SysUserMapper sysUserMapper; + private SysPostUserService postUserService; + private HisUserSupplierMapper hisUserSupplierMapper; + private BmsSupplierMapper bmsSupplierMapper; + + /** + * 翻页查询 + * @return + */ + @GetMapping("/page") + public R page(@RequestParam Map map){ + String tableConfigId = map.get(ExlConst.TABLE_CONFIG_PARAM); + map.remove(ExlConst.TABLE_CONFIG_PARAM); + // table + if(tableConfigId==null){ + return R.byEmptyList(); + } + ExlTableConf tableConf = exlTableConfService.getById(tableConfigId); + // columns + LambdaQueryWrapper columnLqw = new LambdaQueryWrapper<>(); + columnLqw.eq(ExlColumnConf::getTableConfId,tableConfigId); + columnLqw.orderByAsc(ExlColumnConf::getSort); + List columnList = exlColumnConfService.list(columnLqw); + // query + boolean adminFlag = exlTableUserService.checkAdmin(tableConf.getId(), AuthContextUtils.getSysUserId())>0; + Map queryMap = buildQueryMap(map, columnList,adminFlag); + String targetTableName = ExlConst.TABLE_NAME_PRE + tableConf.getTableName(); + Long count = exlTableConfMapper.countData(targetTableName,queryMap); + PageVo vo = new PageVo(); + vo.initPageByTotal(count); + if(count>0){ + // page + Integer pageSize = PageUtil.getPageSize(); + Integer startRow = PageUtil.getStartRow(); + queryMap.put("startRow",startRow); + queryMap.put("pageSize",pageSize); + List> list = exlTableConfMapper.pageData(targetTableName,queryMap); + this.formatListData(list); + vo.setList(list); + }else { + vo.setList(new ArrayList()); + } + return R.ok(vo); + } + + + @NotNull + private Map buildQueryMap(Map map, List columnList,Boolean adminFlag) { + Map queryMap = new HashMap<>(10); + // condition + List ge_conditions = new ArrayList<>(); + List le_conditions = new ArrayList<>(); + List eq_conditions = new ArrayList<>(); + List like_conditions = new ArrayList<>(); + List in_conditions = new ArrayList<>(); + + //map赋值业务参数的key + map.putIfAbsent(ExlConst.TYPE_USER_CODE, ""); + map.putIfAbsent(ExlConst.TYPE_CUSTOMER_CODE, ""); + + if(!map.isEmpty()){ + for (String columnName : map.keySet()) { + String searchValue = map.get(columnName); + ExlColumnConf currColumnConf = null; + String orgColumn = columnName.replace(ExlConst.PRE_COLUMN_START,"") + .replace(ExlConst.PRE_COLUMN_END,"").trim(); + for (ExlColumnConf columnConf : columnList) { + if(columnConf.getColumnName().equals(orgColumn)){ + currColumnConf = columnConf; + break; + } + //拓展业务查询条件 + String extColumnName = null; + if(columnConf.getColumnType().equals(ExlConst.TYPE_USER_CODE)){ + extColumnName = columnConf.getColumnName()+"_ext_usr_name"; + }else if (columnConf.getColumnType().equals(ExlConst.TYPE_CUSTOMER_CODE)){ + extColumnName = columnConf.getColumnName()+"_ext_cus_name"; + } + if(extColumnName!=null&&extColumnName.equals(orgColumn)){ + ExlColumnConf conf = new ExlColumnConf(); + conf.setColumnName(extColumnName); + conf.setColumnType(DEFAULT_STRING); + conf.setScope(0); + currColumnConf = conf; + break; + } + } + if(currColumnConf==null){ + continue; + } + String colType = currColumnConf.getColumnType(); + if(!adminFlag){ + // 权限范围:0->无;1->本人;2->下属;3->全部(本人级下属) + Integer scope = currColumnConf.getScope(); + Set values = new HashSet<>(); + // 业务类型 + String userId = AuthContextUtils.getSysUserId(); + SysUser sysUser = sysUserMapper.selectById(userId); + if(scope>0){ + if (colType.equals(ExlConst.TYPE_USER_CODE)){ + values.add("0"); + if(scope==1){ + values.add(sysUser.getCode()); + }else { + List childIds = postUserService.listByChildIds(AuthContextUtils.getSysUserId()); + if(childIds.size()>0){ + List sysUsers = sysUserMapper.selectBatchIds(childIds); + List codes = sysUsers.stream().map(a->a.getCode()).collect(Collectors.toList()); + values.addAll(codes); + } + if (scope==3){ + values.add(sysUser.getCode()); + } + } + ExlConditionDto conditionDto = new ExlConditionDto(orgColumn,values); + in_conditions.add(conditionDto); + }else if (colType.equals(ExlConst.TYPE_CUSTOMER_CODE)){ + values.add("0"); + List userIds = new ArrayList<>(); + userIds.add(userId); + if(scope>1){ + List childIds = postUserService.listByChildIds(AuthContextUtils.getSysUserId()); + userIds.addAll(childIds); + } + LambdaQueryWrapper husLqw = new LambdaQueryWrapper<>(); + husLqw.in(HisUserSupplier::getUserId,userIds); + husLqw.select(HisUserSupplier::getSupplierCode); + List hisUserSuppliers = hisUserSupplierMapper.selectList(husLqw); + List supplierCodes = hisUserSuppliers.stream() + .map(HisUserSupplier::getSupplierCode).distinct().collect(Collectors.toList()); + values.addAll(supplierCodes); + ExlConditionDto conditionDto = new ExlConditionDto(orgColumn,values); + in_conditions.add(conditionDto); + } + } + } + + //基础的数据类型 + if(columnName.contains(ExlConst.PRE_COLUMN_START)){ + ExlConditionDto conditionDto = new ExlConditionDto(orgColumn,searchValue); + ge_conditions.add(conditionDto); + }else if (columnName.contains(ExlConst.PRE_COLUMN_END)){ + ExlConditionDto conditionDto = new ExlConditionDto(orgColumn,searchValue); + if(colType.equals(ExlConst.DATETIME_TYPE)){ + conditionDto.setValue(searchValue+" 23:59:59"); + } + le_conditions.add(conditionDto); + }else { + ExlConditionDto conditionDto = new ExlConditionDto(columnName,searchValue); + if (colType.equals(ExlConst.TYPE_INT)){ + eq_conditions.add(conditionDto); + }else{ + like_conditions.add(conditionDto); + } + } + } + } + queryMap.put("leList",le_conditions); + queryMap.put("geList",ge_conditions); + queryMap.put("eqList",eq_conditions); + queryMap.put("likeList",like_conditions); + queryMap.put("inBizList",in_conditions); + return queryMap; + } + + /** + * 导出数据 + * @param map + * @return + */ + @GetMapping("/export") + public R export(@RequestParam Map map){ + String tableConfigId = map.get(ExlConst.TABLE_CONFIG_PARAM); + map.remove(ExlConst.TABLE_CONFIG_PARAM); + // table + ExlTableConf tableConf = exlTableConfService.getById(tableConfigId); + // columns + LambdaQueryWrapper columnLqw = new LambdaQueryWrapper<>(); + columnLqw.eq(ExlColumnConf::getTableConfId,tableConfigId); + columnLqw.orderByAsc(ExlColumnConf::getSort); + List columnList = exlColumnConfService.list(columnLqw); + // query + boolean adminFlag = exlTableUserService.checkAdmin(tableConf.getId(),AuthContextUtils.getSysUserId())>0; + Map queryMap = buildQueryMap(map, columnList,adminFlag); + String targetTableName = ExlConst.TABLE_NAME_PRE + tableConf.getTableName(); + List> list = exlTableConfMapper.listData(targetTableName,queryMap); + this.formatListData(list); + return R.ok(list); + } + + /** + * 新增 + * @param saveBo + * @return + */ + @PostMapping("/batchSave") + public R batchSave( @RequestBody ExlBatchSaveBo saveBo){ + final String ErrMsgKey = "errMsg"; + List param = saveBo.getParam(); + String tableConfigId = saveBo.getTb_config_cnf_id(); + // table + ExlTableConf tableConf = exlTableConfService.getById(tableConfigId); + // columns + LambdaQueryWrapper columnLqw = new LambdaQueryWrapper<>(); + columnLqw.eq(ExlColumnConf::getTableConfId,tableConfigId); + columnLqw.orderByAsc(ExlColumnConf::getSort); + List columnList = exlColumnConfService.list(columnLqw); + + String targetTableName = ExlConst.TABLE_NAME_PRE + tableConf.getTableName(); + boolean executeFlag = true; + //移除旧历史判断参数 + int keyCount = (int) columnList.stream().filter(a -> a.getKeyFlag().equals(1)).count(); + //insert into table (cloumns) values (vals),(vals) + StringBuilder insertSql = new StringBuilder("insert into "+targetTableName +"( `union_row_id`,"); + for (int i = 0; i < columnList.size(); i++) { + ExlColumnConf columnConf = columnList.get(i); + insertSql.append(" `"+columnConf.getColumnName()+"` "); + if(columnConf.getColumnType().equals(ExlConst.TYPE_USER_CODE)){ + insertSql.append(","); + insertSql.append(" `"+columnConf.getColumnName()+"_ext_usr_name` "); + }else if(columnConf.getColumnType().equals(ExlConst.TYPE_CUSTOMER_CODE)){ + insertSql.append(","); + insertSql.append(" `"+columnConf.getColumnName()+"_ext_cus_name` "); + } + if(i+1 errorResult = new ArrayList<>(); + for (int k = 0; k < param.size(); k++) { + Object obj = param.get(k); + insertSql.append("("); + JSONObject jsonObject = JSONObject.parseObject(JsonUtil.objectToJson(obj)); + String unionId = TableCreateSqlUtil.buildUnionId(columnList,jsonObject); + if(unionId==null){ + unionId = IdUtil.nanoId(); + } + insertSql.append("'"+unionId+"',"); + for (int i = 0; i < columnList.size(); i++) { + ExlColumnConf columnConf = columnList.get(i); + String string = jsonObject.getString(columnConf.getColumnName()); + if(string==null|| "null".equals(string)){ + string = ""; + } + if(!StringUtils.hasText(string) && columnConf.getNotNullFlag().equals(1)){ + executeFlag = false; + this.appendErrorMsg(ErrMsgKey, jsonObject, columnConf); + continue; + } + + /** + * date、datetime类型设置了非必填,如果导入excel是空的,则导入失败。应该是代码处理时插入空白值报错,而不是null值,需修复 + */ + if(columnConf.getColumnType().equals(ExlConst.DATE_TYPE)&&!StringUtils.hasText(string)){ + insertSql.append(" null "); + }else if(columnConf.getColumnType().equals(ExlConst.DATETIME_TYPE)&&!StringUtils.hasText(string)){ + insertSql.append(" null "); + }else { + insertSql.append("'"+string+"'"); + } + + if(columnConf.getColumnType().equals(ExlConst.TYPE_USER_CODE)){ + insertSql.append(","); + String name = ""; + if(string.length()>0){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SysUser::getCode,string); + lqw.select(SysUser::getCode,SysUser::getName); + List sysUsers = sysUserMapper.selectList(lqw); + if (sysUsers.size()>0){ + name = sysUsers.get(0).getName(); + } + } + if(!StringUtils.hasText(name) && columnConf.getScope()>0){ + executeFlag = false; + this.appendErrorMsg(ErrMsgKey, jsonObject, columnConf); + continue; + } + insertSql.append("'"+name+"'"); + }else if(columnConf.getColumnType().equals(ExlConst.TYPE_CUSTOMER_CODE)){ + insertSql.append(","); + String name = ""; + if(string.length()>0){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BmsSupplier::getCode,string); + lqw.select(BmsSupplier::getCode,BmsSupplier::getName); + List supplierList = bmsSupplierMapper.selectList(lqw); + if (supplierList.size()>0){ + name = supplierList.get(0).getName(); + } + } + if(!StringUtils.hasText(name) && columnConf.getScope()>0){ + executeFlag = false; + this.appendErrorMsg(ErrMsgKey, jsonObject, columnConf); + continue; + } + insertSql.append("'"+name+"'"); + } + if(i+10){ +// StringBuilder removeSql = new StringBuilder("delete from "+targetTableName+" where union_row_id in ("); +// for (int k = 0;k < param.size(); k++) { +// Object obj = param.get(k); +// JSONObject jsonObject = JSONObject.parseObject(JsonUtil.objectToJson(obj)); +// String unionId = TableCreateSqlUtil.buildUnionId(columnList,jsonObject); +// removeSql.append("'"+unionId+"'"); +// if(k+1 objectMap = new HashMap<>(); +// objectMap.put("columnList",columnList); +// objectMap.put("data",errorResult); + return R.ok(errorResult,"数据异常"); + } + + private void appendErrorMsg(String ErrMsgKey, JSONObject jsonObject, ExlColumnConf columnConf) { + String tmp = jsonObject.getString(ErrMsgKey); + if(tmp==null){ + tmp = ""; + } + jsonObject.put(ErrMsgKey,tmp+ columnConf.getColumnHeader()+"数据无效或为空;"); + } + + + private void formatListData(List> list) { + for (Map objectMap : list) { + for (String field : objectMap.keySet()) { + Object value = objectMap.get(field); + if(value!=null&&value.getClass().getName().equals("java.sql.Timestamp")){ + if(value.toString().contains(".")){ + objectMap.put(field,value.toString().split("\\.")[0]); + } + } + } + } + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/ExlColumnConf.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/ExlColumnConf.java new file mode 100644 index 0000000..f146add --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/ExlColumnConf.java @@ -0,0 +1,119 @@ +package com.qs.serve.modules.exl.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 2023-08-14 + */ +@Data +@TableName("exl_column_conf") +public class ExlColumnConf implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @JsonIgnore + @TableId(type = IdType.AUTO) + private Long id; + + /** 非必传 */ + @JsonIgnore + private Long tableConfId; + + /** 列名 */ + @NotBlank(message = "列名不能为空") + @Length(max = 255,message = "列名长度不能超过255字") + private String columnName; + + /** excel头部 */ + @NotBlank(message = "excel头部不能为空") + @Length(max = 255,message = "excel头部长度不能超过255字") + private String columnHeader; + + /** 数据类型:string;int;money;date;datetime; */ + @Length(max = 20,message = "数据类型:string;int;money;date;datetime;长度不能超过255字") + private String columnType; + + //string-like;int-eq;date-between;datetime-between + /** 作为查询条件标识 */ + private Integer conditionFlag; + + /** 空值标识 */ + private Integer notNullFlag; + + /** 空值标识 */ + private Integer keyFlag; + + /** 权限范围:0->无;1->本人;2->下属;3->全部(本人级下属) */ + private Integer scope; + + private Integer sort; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 在编辑页隐藏标识(0:显示;1:隐藏) */ + @TableField(exist = false) + private Integer hideOnEditFlag; + + public static ExlColumnConf toNewObject(ExlColumnConf source){ + ExlColumnConf columnConf = new ExlColumnConf(); + columnConf.setId(source.getId()); + columnConf.setColumnName(source.getColumnName()); + columnConf.setColumnHeader(source.getColumnHeader()); + columnConf.setColumnType(source.getColumnType()); + columnConf.setConditionFlag(source.getConditionFlag()); + columnConf.setCreateTime(source.getCreateTime()); + columnConf.setUpdateTime(source.getUpdateTime()); + columnConf.setTenantId(source.getTenantId()); + columnConf.setCreateBy(source.getCreateBy()); + columnConf.setUpdateBy(source.getUpdateBy()); + columnConf.setDelFlag(source.getDelFlag()); + return columnConf; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/ExlDsConf.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/ExlDsConf.java new file mode 100644 index 0000000..7fccd98 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/ExlDsConf.java @@ -0,0 +1,105 @@ +package com.qs.serve.modules.exl.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 2023-08-11 + */ +@Data +@TableName("exl_ds_conf") +public class ExlDsConf implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 启用 */ + @NotNull(message = "启用不能为空") + private Integer enable; + + /** 用户名 */ + @NotBlank(message = "用户名不能为空") + @Length(max = 255,message = "用户名长度不能超过255字") + private String username; + + /** 密码 */ + @NotBlank(message = "密码不能为空") + @Length(max = 255,message = "密码长度不能超过255字") + private String password; + + /** url */ + @Length(max = 255,message = "url长度不能超过255字") + private String url; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + public static ExlDsConf toNewObject(ExlDsConf source){ + ExlDsConf dsConf = new ExlDsConf(); + dsConf.setId(source.getId()); + dsConf.setEnable(source.getEnable()); + dsConf.setUsername(source.getUsername()); + dsConf.setPassword(source.getPassword()); + dsConf.setUrl(source.getUrl()); + dsConf.setRemark(source.getRemark()); + dsConf.setCreateTime(source.getCreateTime()); + dsConf.setUpdateTime(source.getUpdateTime()); + dsConf.setTenantId(source.getTenantId()); + dsConf.setCreateBy(source.getCreateBy()); + dsConf.setUpdateBy(source.getUpdateBy()); + dsConf.setDelFlag(source.getDelFlag()); + return dsConf; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/ExlTableConf.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/ExlTableConf.java new file mode 100644 index 0000000..c9e0c52 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/ExlTableConf.java @@ -0,0 +1,129 @@ +package com.qs.serve.modules.exl.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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 2023-08-11 + */ +@Data +@TableName("exl_table_conf") +public class ExlTableConf implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 表名 */ + @NotBlank(message = "表名不能为空") + @Length(max = 255,message = "表名长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String tableName; + + /** excel标题 */ + @NotBlank(message = "excel标题不能为空") + @Length(max = 255,message = "excel标题长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String excelTitle; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 启用标识 (0/1) */ + private Integer enableFlag; + + /** 启用时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime enableTime; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** + * 列配置的列表 + */ + @TableField(exist = false) + private List columnList; + + /** + * 查询参数列表 + */ + @TableField(exist = false) + private List queryList; + + /** + * 管理员列表 + */ + @TableField(exist = false) + private List adminList; + + /** + * 是否管理员 + */ + @TableField(exist = false) + private Integer adminFlag; + + public static ExlTableConf toNewObject(ExlTableConf source){ + ExlTableConf tableConf = new ExlTableConf(); + tableConf.setId(source.getId()); + tableConf.setTableName(source.getTableName()); + tableConf.setExcelTitle(source.getExcelTitle()); + tableConf.setRemark(source.getRemark()); + tableConf.setCreateTime(source.getCreateTime()); + tableConf.setUpdateTime(source.getUpdateTime()); + tableConf.setTenantId(source.getTenantId()); + tableConf.setCreateBy(source.getCreateBy()); + tableConf.setUpdateBy(source.getUpdateBy()); + tableConf.setDelFlag(source.getDelFlag()); + return tableConf; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/ExlTableUser.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/ExlTableUser.java new file mode 100644 index 0000000..abc7375 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/ExlTableUser.java @@ -0,0 +1,106 @@ +package com.qs.serve.modules.exl.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 2023-09-25 + */ +@Data +@TableName("exl_table_user") +public class ExlTableUser implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 表配置id */ + @NotNull(message = "表配置id不能为空") + private Long tableConfId; + + /** 用户id */ + @NotBlank(message = "用户id不能为空") + @Length(max = 255,message = "用户id长度不能超过255字") + private String userId; + + /** 用户编码 */ + @NotBlank(message = "用户编码不能为空") + @Length(max = 255,message = "用户编码长度不能超过255字") + private String userCode; + + /** 用户名称 */ + @NotBlank(message = "用户名称不能为空") + @Length(max = 255,message = "用户名称长度不能超过255字") + private String userName; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + public static ExlTableUser toNewObject(ExlTableUser source){ + ExlTableUser tableUser = new ExlTableUser(); + tableUser.setId(source.getId()); + tableUser.setTableConfId(source.getTableConfId()); + tableUser.setUserId(source.getUserId()); + tableUser.setUserCode(source.getUserCode()); + tableUser.setUserName(source.getUserName()); + tableUser.setRemark(source.getRemark()); + tableUser.setCreateTime(source.getCreateTime()); + tableUser.setUpdateTime(source.getUpdateTime()); + tableUser.setTenantId(source.getTenantId()); + tableUser.setCreateBy(source.getCreateBy()); + tableUser.setUpdateBy(source.getUpdateBy()); + tableUser.setDelFlag(source.getDelFlag()); + return tableUser; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/bo/ExlTableUserBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/bo/ExlTableUserBo.java new file mode 100644 index 0000000..f0083c8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/bo/ExlTableUserBo.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.exl.entity.bo; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/9/25 + */ +@Data +public class ExlTableUserBo { + + private Long tableConfId; + + private List userIds; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/dto/ExlBatchSaveBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/dto/ExlBatchSaveBo.java new file mode 100644 index 0000000..a4276f3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/dto/ExlBatchSaveBo.java @@ -0,0 +1,21 @@ +package com.qs.serve.modules.exl.entity.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author YenHex + * @since 2023/8/16 + */ +@Data +public class ExlBatchSaveBo { + + @NotNull + String tb_config_cnf_id; + + @NotNull + List param; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/dto/ExlConditionDto.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/dto/ExlConditionDto.java new file mode 100644 index 0000000..d71ac34 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/dto/ExlConditionDto.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.exl.entity.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.Set; + +/** + * @author YenHex + * @since 2023/8/15 + */ +@Data +public class ExlConditionDto { + + String column; + + String value; + + Set values; + + + public ExlConditionDto(String column, String value) { + this.column = column; + this.value = value; + } + + public ExlConditionDto(String column, Set values) { + this.column = column; + this.values = values; + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/dto/ExlQueryFieldDto.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/dto/ExlQueryFieldDto.java new file mode 100644 index 0000000..17e2bb6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/dto/ExlQueryFieldDto.java @@ -0,0 +1,24 @@ +package com.qs.serve.modules.exl.entity.dto; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; + +/** + * @author YenHex + * @since 2023/8/14 + */ +@Data +public class ExlQueryFieldDto { + + /** 字段名 */ + private String field; + + /** 数据类型 */ + private String type; + + /** 显示标签 */ + private String label; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/dto/ExlTableBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/dto/ExlTableBo.java new file mode 100644 index 0000000..4549f26 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/entity/dto/ExlTableBo.java @@ -0,0 +1,44 @@ +package com.qs.serve.modules.exl.entity.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.qs.serve.modules.exl.entity.ExlColumnConf; +import com.qs.serve.modules.exl.entity.bo.ExlTableUserBo; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @author YenHex + * @since 2023/8/14 + */ +@Data +public class ExlTableBo { + + /** id(修改时参数) */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 表名 */ + @NotBlank(message = "表名不能为空") + @Length(max = 255,message = "表名长度不能超过255字") + private String tableName; + + /** excel标题 */ + @NotBlank(message = "excel标题不能为空") + @Length(max = 255,message = "excel标题长度不能超过255字") + private String excelTitle; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + private List columnList; + + /** 管理员配置 */ + private ExlTableUserBo administratorParam; + + private List userIds; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/mapper/ExlColumnConfMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/mapper/ExlColumnConfMapper.java new file mode 100644 index 0000000..9f45418 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/mapper/ExlColumnConfMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.exl.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.exl.entity.ExlColumnConf; + +/** + * 行配置 Mapper + * @author YenHex + * @date 2023-08-14 + */ +public interface ExlColumnConfMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/mapper/ExlDsConfMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/mapper/ExlDsConfMapper.java new file mode 100644 index 0000000..f6c1851 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/mapper/ExlDsConfMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.exl.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.exl.entity.ExlDsConf; + +/** + * 数据源配置 Mapper + * @author YenHex + * @date 2023-08-11 + */ +public interface ExlDsConfMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/mapper/ExlTableConfMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/mapper/ExlTableConfMapper.java new file mode 100644 index 0000000..3f170f0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/mapper/ExlTableConfMapper.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.exl.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.exl.entity.ExlTableConf; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 表配置 Mapper + * @author YenHex + * @date 2023-08-11 + */ +public interface ExlTableConfMapper extends BaseMapper { + + + @InterceptorIgnore(tenantLine = "1") + Long countData(@Param("tableName") String tableName,@Param("query")Map query); + + @InterceptorIgnore(tenantLine = "1") + List> pageData(@Param("tableName") String tableName,@Param("query")Map query); + + @InterceptorIgnore(tenantLine = "1") + List> listData(@Param("tableName") String tableName,@Param("query")Map query); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/mapper/ExlTableUserMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/mapper/ExlTableUserMapper.java new file mode 100644 index 0000000..d1135d0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/mapper/ExlTableUserMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.exl.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.exl.entity.ExlTableUser; + +/** + * Mapper + * @author YenHex + * @date 2023-09-25 + */ +public interface ExlTableUserMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/service/ExlColumnConfService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/service/ExlColumnConfService.java new file mode 100644 index 0000000..cc568bd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/service/ExlColumnConfService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.exl.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.exl.entity.ExlColumnConf; + +/** + * 行配置 服务接口 + * @author YenHex + * @date 2023-08-14 + */ +public interface ExlColumnConfService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/service/ExlTableConfService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/service/ExlTableConfService.java new file mode 100644 index 0000000..1a9d85a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/service/ExlTableConfService.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.exl.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.exl.entity.ExlTableConf; +import com.qs.serve.modules.exl.entity.dto.ExlTableBo; + +/** + * 表配置 服务接口 + * @author YenHex + * @date 2023-08-11 + */ +public interface ExlTableConfService extends IService { + + /** + * 编辑 + * @param param + * @return + */ + ExlTableConf modify(ExlTableBo param); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/service/ExlTableUserService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/service/ExlTableUserService.java new file mode 100644 index 0000000..75250df --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/service/ExlTableUserService.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.exl.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.exl.entity.ExlTableUser; +import com.qs.serve.modules.exl.entity.bo.ExlTableUserBo; + +/** + * 服务接口 + * @author YenHex + * @date 2023-09-25 + */ +public interface ExlTableUserService extends IService { + + void confAdmins(ExlTableUserBo param); + + Integer checkAdmin(Long tableConfId,String userId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/service/impl/ExlColumnConfServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/service/impl/ExlColumnConfServiceImpl.java new file mode 100644 index 0000000..5af7ca0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/service/impl/ExlColumnConfServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.exl.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.exl.entity.ExlColumnConf; +import com.qs.serve.modules.exl.service.ExlColumnConfService; +import com.qs.serve.modules.exl.mapper.ExlColumnConfMapper; + +/** + * 行配置 服务实现类 + * @author YenHex + * @since 2023-08-14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class ExlColumnConfServiceImpl extends ServiceImpl implements ExlColumnConfService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/service/impl/ExlTableConfServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/service/impl/ExlTableConfServiceImpl.java new file mode 100644 index 0000000..8235da2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/service/impl/ExlTableConfServiceImpl.java @@ -0,0 +1,105 @@ +package com.qs.serve.modules.exl.service.impl; + +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.modules.exl.common.ExlConst; +import com.qs.serve.modules.exl.entity.ExlColumnConf; +import com.qs.serve.modules.exl.entity.bo.ExlTableUserBo; +import com.qs.serve.modules.exl.entity.dto.ExlTableBo; +import com.qs.serve.modules.exl.service.ExlColumnConfService; +import com.qs.serve.modules.exl.service.ExlTableUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.exl.entity.ExlTableConf; +import com.qs.serve.modules.exl.service.ExlTableConfService; +import com.qs.serve.modules.exl.mapper.ExlTableConfMapper; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * 表配置 服务实现类 + * @author YenHex + * @since 2023-08-11 + */ +@Slf4j +@Service +@AllArgsConstructor +public class ExlTableConfServiceImpl extends ServiceImpl implements ExlTableConfService { + + private final ExlColumnConfService columnConfService; + private final ExlTableUserService tableUserService; + + @Override + @Transactional(rollbackFor = Exception.class) + public ExlTableConf modify(ExlTableBo param) { + String tableName = param.getTableName(); + // 定义正则表达式 只允许0-9数字和26个英文字母(区分大小写),以及下划线 + String regex = "^[A-Za-z0-9_]+$"; + boolean allowTableName = Pattern.matches(regex, tableName); + if(!allowTableName){ + Assert.throwEx("表名规范错误"); + } + ExlTableConf tableConf = new ExlTableConf(); + if(param.getId()==null){ + //save + tableConf.setTableName(param.getTableName()); + tableConf.setExcelTitle(param.getExcelTitle()); + tableConf.setRemark(param.getRemark()); + this.save(tableConf); + final Long tableId = tableConf.getId(); + List columnList = param.getColumnList(); + columnList.forEach(a->{ + a.setTableConfId(tableId); + a.setId(null); + }); + columnConfService.saveBatch(columnList); + ExlTableUserBo tableUserBo = param.getAdministratorParam(); + if(tableUserBo!=null){ + tableUserBo.setTableConfId(tableConf.getId()); + tableUserService.confAdmins(tableUserBo); + } + return tableConf; + }else { + //update + final Long tableId = param.getId(); + ExlTableConf dbData = this.getById(tableId); + if(dbData.getEnableFlag().equals(1)){ + Assert.throwEx("已启用的配置不可修改"); + } + tableConf.setId(tableId); + tableConf.setTableName(param.getTableName()); + tableConf.setExcelTitle(param.getExcelTitle()); + tableConf.setRemark(param.getRemark()); + this.updateById(tableConf); + LambdaQueryWrapper columnLqw = new LambdaQueryWrapper<>(); + columnLqw.eq(ExlColumnConf::getTableConfId,param.getId()); + columnConfService.remove(columnLqw); + List columnList = param.getColumnList().stream().filter( + //忽略业务拓展列 + a->!a.getColumnName().contains("_ext_cus_name") + &&!a.getColumnName().contains("_ext_usr_name") + ).collect(Collectors.toList()); + columnList.forEach(a->{ + a.setTableConfId(tableId); + if(a.getColumnType().equals(ExlConst.TYPE_MONEY)){ + a.setConditionFlag(0); + } + a.setId(null); + }); + columnConfService.saveBatch(columnList); + } + ExlTableUserBo tableUserBo = param.getAdministratorParam(); + if(tableUserBo!=null){ + tableUserBo.setTableConfId(tableConf.getId()); + tableUserService.confAdmins(tableUserBo); + } + return tableConf; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/service/impl/ExlTableUserServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/service/impl/ExlTableUserServiceImpl.java new file mode 100644 index 0000000..c2d4086 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/exl/service/impl/ExlTableUserServiceImpl.java @@ -0,0 +1,58 @@ +package com.qs.serve.modules.exl.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.exl.entity.bo.ExlTableUserBo; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.exl.entity.ExlTableUser; +import com.qs.serve.modules.exl.service.ExlTableUserService; +import com.qs.serve.modules.exl.mapper.ExlTableUserMapper; + +import java.util.ArrayList; +import java.util.List; +/** + * 服务实现类 + * @author YenHex + * @since 2023-09-25 + */ +@Slf4j +@Service +@AllArgsConstructor +public class ExlTableUserServiceImpl extends ServiceImpl implements ExlTableUserService { + + private SysUserMapper sysUserMapper; + + @Override + public void confAdmins(ExlTableUserBo param) { + LambdaQueryWrapper rmlqw = new LambdaQueryWrapper<>(); + rmlqw.eq(ExlTableUser::getTableConfId,param.getTableConfId()); + super.remove(rmlqw); + if(CollectionUtil.isNotEmpty(param.getUserIds())){ + List list = new ArrayList<>(); + for (String userId : param.getUserIds()) { + SysUser sysUser = sysUserMapper.selectById(userId); + ExlTableUser tableUser = new ExlTableUser(); + tableUser.setTableConfId(param.getTableConfId()); + tableUser.setUserId(sysUser.getId()); + tableUser.setUserCode(sysUser.getCode()); + tableUser.setUserName(sysUser.getName()); + list.add(tableUser); + } + super.saveBatch(list); + } + } + + @Override + public Integer checkAdmin(Long tableConfId, String userId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(ExlTableUser::getTableConfId,tableConfId); + lqw.eq(ExlTableUser::getUserId,userId); + return super.count(lqw)>0?1:0; + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/common/GoodsConst.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/common/GoodsConst.java new file mode 100644 index 0000000..46343ab --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/common/GoodsConst.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.goods.common; + +/** + * @author YenHex + * @since 2022/10/26 + */ +public class GoodsConst { + + /** + * 规格数量 + */ + public static final Integer SPEC_COUNT = 3; + public static final Integer CATE_MAX_LEVEL = 3; + //默认账套,开平 + public static String DEFAULT_PlaCE = "开平"; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/common/GoodsSpuColumnUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/common/GoodsSpuColumnUtil.java new file mode 100644 index 0000000..0e6da58 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/common/GoodsSpuColumnUtil.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.goods.common; + +import com.qs.serve.common.util.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author YenHex + * @since 2024/8/28 + */ +public class GoodsSpuColumnUtil { + + private static Map ORDER_SPU_COLUMN = new HashMap<>(); + + static { + ORDER_SPU_COLUMN.put("createTime","goods_spu.create_time"); + ORDER_SPU_COLUMN.put("updateTime","goods_spu.update_time"); + } + + + public static String getSpuColumn(String orderProp){ + if(!StringUtils.hasText(orderProp)){ + return null; + } + return ORDER_SPU_COLUMN.get(orderProp); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/common/GoodsType.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/common/GoodsType.java new file mode 100644 index 0000000..488634b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/common/GoodsType.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.goods.common; + +import lombok.AllArgsConstructor; + +/** + * @author YenHex + * @since 2023/7/28 + */ +@AllArgsConstructor +public enum GoodsType { + + SKU("sku","单品"), + SPU("spu","SKU"), + Category("category","品类"), + Series("series","系列"), + Brand("brand","品牌"), + ; + + String code; + String name; + + public static String getName(String code){ + for (GoodsType value : GoodsType.values()) { + if(value.code.equals(code)){ + return value.name; + } + } + return null; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsAccreditController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsAccreditController.java new file mode 100644 index 0000000..5d63d58 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsAccreditController.java @@ -0,0 +1,107 @@ +package com.qs.serve.modules.goods.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.goods.entity.bo.GoodsAccreditBo; +import com.qs.serve.modules.goods.entity.bo.GoodsAccreditImportBo; +import com.qs.serve.modules.goods.entity.dto.GoodsAccreditExt; +import com.qs.serve.modules.goods.entity.dto.GoodsAccreditQuery; +import com.qs.serve.modules.goods.entity.vo.GoodsAccreditResult; +import com.qs.serve.modules.goods.entity.vo.GoodsAccreditVo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.goods.entity.GoodsAccredit; +import com.qs.serve.modules.goods.service.GoodsAccreditService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 商品 授权规则 + * @author YenHex + * @since 2024-04-01 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/accredit") +public class GoodsAccreditController { + + private GoodsAccreditService goodsAccreditService; + + /** + * 辅助查询 + * @param query + * @return + * + */ + @GetMapping("/page") + public R> getPage(GoodsAccreditQuery query){ + PageVo data = goodsAccreditService.queryPage(query); + return R.ok(data); + } + + /** + * 辅助查询 + * @param query + * @return + */ + @GetMapping("/getAllList") + public R> getAllList(GoodsAccreditQuery query){ + List data = goodsAccreditService.queryList(query); + return R.ok(data); + } + + /** + * ID查询 + * @param cateId + * @param spuId + * @param skuId + * @return + */ + @GetMapping("/getById") + public R getById(String cateId,String spuId,String skuId){ + GoodsAccreditVo goodsAccredit = goodsAccreditService.getById(cateId,spuId,skuId); + return R.ok(goodsAccredit); + } + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.GOODS, title = "规则", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid GoodsAccreditBo param){ + goodsAccreditService.modify(param); + return R.ok(); + } + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/importData") + @SysLog(module = SystemModule.GOODS, title = "规则", biz = BizType.UPDATE) + public R importData(@RequestBody @Valid GoodsAccreditImportBo param){ + GoodsAccreditBo accreditBo = goodsAccreditService.tranGoodsAccreditBo(param); + if(param.getSuccessFlag()){ + goodsAccreditService.modify(accreditBo); + return R.ok(); + } + return R.errorImport(param); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsBrandController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsBrandController.java new file mode 100644 index 0000000..ca638f5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsBrandController.java @@ -0,0 +1,103 @@ +package com.qs.serve.modules.goods.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.goods.entity.GoodsBrand; +import com.qs.serve.modules.goods.service.GoodsBrandService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 商品 品牌 + * @author YenHex + * @since 2022-10-11 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/brand") +public class GoodsBrandController { + + private GoodsBrandService goodsBrandService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('goods:brand:query')") + public R> getPage(GoodsBrand param){ + PageUtil.startPage(); + LambdaQueryWrapper brandWrapper = new LambdaQueryWrapper<>(param); + List list = goodsBrandService.list(brandWrapper); + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.GOODS, title = "品牌", biz = BizType.QUERY) + @PreAuthorize("hasRole('goods:brand:query')") + public R getById(@PathVariable("id") String id){ + GoodsBrand goodsBrand = goodsBrandService.getById(id); + return R.ok(goodsBrand); + } + + + + /** + * 根据ID更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.GOODS, title = "品牌", biz = BizType.UPDATE) + @PreAuthorize("hasRole('goods:brand:update')") + public R updateById(@RequestBody @Valid GoodsBrand param){ + boolean result = goodsBrandService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增品牌 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.GOODS, title = "品牌", biz = BizType.INSERT) + @PreAuthorize("hasRole('goods:brand:insert')") + public R save(@RequestBody @Valid GoodsBrand param){ + boolean result = goodsBrandService.save(param); + return R.isTrue(result); + } + + /** + * 删除品牌 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.GOODS, title = "品牌", biz = BizType.DELETE) + @PreAuthorize("hasRole('goods:brand:delete')") + public R deleteById(@PathVariable("id") Long id){ + boolean result = goodsBrandService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsCategoryController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsCategoryController.java new file mode 100644 index 0000000..fa73a26 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsCategoryController.java @@ -0,0 +1,296 @@ +package com.qs.serve.modules.goods.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qs.serve.common.config.DevEnvironmentConfig; +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.dto.SimpleCountValue; +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.bms.common.BookAccountUtil; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.entity.bo.GoodsCategoryBo; +import com.qs.serve.modules.goods.entity.bo.GoodsCategoryLevelBo; +import com.qs.serve.modules.goods.entity.bo.GoodsCategoryTreeVo; +import com.qs.serve.modules.goods.mapper.GoodsCategoryMapper; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.entity.TbsActivityGoods; +import com.qs.serve.modules.tbs.entity.TbsBudgetCondition; +import com.qs.serve.modules.tbs.service.TbsActivityGoodsService; +import com.qs.serve.modules.tbs.service.TbsBudgetConditionService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.service.GoodsCategoryService; + +import javax.validation.Valid; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 商品 分类 + * @author YenHex + * @since 2022-10-09 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/category") +public class GoodsCategoryController { + + private GoodsCategoryMapper goodsCategoryMapper; + private GoodsCategoryService goodsCategoryService; + private GoodsSpuService goodsSpuService; + private TbsActivityGoodsService activityGoodsService; + private TbsBudgetConditionService budgetConditionService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('goods:category:query')") + public R> getMgrPage(GoodsCategory param){ + PageUtil.startPage(); + LambdaQueryWrapper categoryWrapper = new LambdaQueryWrapper<>(param); + categoryWrapper.orderByDesc(GoodsCategory::getId); + List list = goodsCategoryService.list(categoryWrapper); + return R.byPageHelperList(list); + } + + + + /** + * 查询 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(GoodsCategory param){ + param.setEnable(1); + LambdaQueryWrapper categoryWrapper = new LambdaQueryWrapper<>(param); + List list = goodsCategoryService.list(categoryWrapper); + return R.ok(list); + } + + /** + * 返回树节点列表 + * @apiNote 用于模板,通过ids查询 + * @param param + * @return + */ + @PostMapping("/listTreeVoByParam") + public R> listTreeVoBySelect(@RequestBody GoodsCategory param){ + if(CollectionUtil.isEmpty(param.getSelectIds())){ + return R.ok(); + } + LambdaQueryWrapper categoryWrapper = new LambdaQueryWrapper<>(); + categoryWrapper.eq(GoodsCategory::getEnable,1); + categoryWrapper.in(GoodsCategory::getId,param.getSelectIds()); + List list = goodsCategoryService.list(categoryWrapper); + list.forEach(GoodsCategory::initCategoryNameByPathsName); +// List treeNodes = list.stream().map(cate->{ +// GoodsCategoryTreeVo treeNode = CopierUtil.copy(cate,new GoodsCategoryTreeVo()); +// treeNode.setId(cate.getId()+""); +// treeNode.setParentId(cate.getParentId().toString()); +// treeNode.setCostFlag(cate.getCostFlag()); +// treeNode.setSort(cate.getSort()==null ? 0 : cate.getSort()); +// treeNode.setEnable(cate.getEnable()+""); +// return treeNode; +// }).collect(Collectors.toList()); + return R.ok(list); + } + + /** + * 树查询(组件接口) + * @param param + * @return + */ + @GetMapping("/enableTree") + public R> getPage(GoodsCategory param,Integer loadAll){ + boolean loadFlag = loadAll!=null&&loadAll.equals(1); + if(!loadFlag){ + param.setEnable(1); + } + return this.getTree(param); + } + + /** + * 树查询(管理) + * @param param + * @return + */ + @GetMapping("/tree") + @PreAuthorize("hasRole('goods:category:query')") + public R> getTree(GoodsCategory param){ + final boolean loadSpuData = param.getLoadSpuData()!=null&¶m.getLoadSpuData().equals(1); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + //param.setEnable(1); + + if(DevEnvironmentConfig.OPEN_TENANT_BOOK){ + lqw.in(GoodsCategory::getBookBelong,BookAccountUtil.getCurrentUserAccount()); + } + + if(CollectionUtil.isNotEmpty(param.getSelectIds())){ + lqw.in(GoodsCategory::getId,param.getSelectIds()); + } + + List list = goodsCategoryService.list(lqw); + + //统计Spu数量 + List cateCountList = goodsCategoryMapper.selectCateCountFirst(); + List cateCountSecond = goodsCategoryMapper.selectCateCountSecond(); + List cateCountLast = goodsCategoryMapper.selectCateCountLast(); + cateCountList.addAll(cateCountSecond); + cateCountList.addAll(cateCountLast); + + List treeVoList = list.stream().map(cate->{ + GoodsCategoryTreeVo treeNode = CopierUtil.copy(cate,new GoodsCategoryTreeVo()); + if(param.getRelateBrandFlag()!=null&¶m.getRelateBrandFlag().equals(1)){ + cate.initCategoryNameByPathsName(); + treeNode.setName("("+cate.getBrandLabel()+")"+treeNode.getName()); + } + treeNode.setId(cate.getId()+""); + treeNode.setParentId(cate.getParentId().toString()); + treeNode.setCostFlag(cate.getCostFlag()); + treeNode.setSort(cate.getSort()==null ? 0 : cate.getSort()); + treeNode.setEnable(cate.getEnable()+""); + + //绑定统计Spu数量 + for (SimpleCountValue countValue : cateCountList) { + if(treeNode.getId().equals(countValue.getId())){ + treeNode.setCountSpu(countValue.getCount()); + break; + } + } + + if(loadSpuData && cate.getLevel().equals(3)){ + LambdaQueryWrapper spuLqw = new LambdaQueryWrapper<>(); + spuLqw.eq(GoodsSpu::getCategoryThird,cate.getId( )); + spuLqw.eq(GoodsSpu::getShelf,1); + if(DevEnvironmentConfig.OPEN_TENANT_BOOK){ + spuLqw.in(GoodsSpu::getBookBelong,BookAccountUtil.getCurrentUserAccount()); + } + List spuList = goodsSpuService.list(spuLqw); + for (GoodsSpu goodsSpu : spuList) { + GoodsCategoryTreeVo spuNode = new GoodsCategoryTreeVo(); + spuNode.setId(goodsSpu.getId()+""); + spuNode.setEnable("1"); + spuNode.setCode(goodsSpu.getSpuCode()); + spuNode.setName(goodsSpu.getName()); + spuNode.setCostFlag(goodsSpu.getCostFlag()); + spuNode.setBookBelong(goodsSpu.getBookBelong()); + spuNode.setBookName(goodsSpu.getBookName()); + treeNode.addChildren(spuNode); + } + } + return treeNode; + }).collect(Collectors.toList()); + treeVoList.sort((o1,o2) -> (o2.getSort()-o1.getSort())); + treeVoList = TreeUtil.buildByRecursive(treeVoList,TreeUtil.DEFAULT_PID_STRING); + return R.ok(treeVoList); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.GOODS, title = "分类", biz = BizType.QUERY) + @PreAuthorize("hasRole('goods:category:query')") + public R getById(@PathVariable("id") String id){ + GoodsCategory goodsCategory = goodsCategoryService.getById(id); + if(!goodsCategory.getParentId().equals(0L)){ + goodsCategory.setParentInfo(goodsCategoryService.getById(goodsCategory.getParentId())); + } + return R.ok(goodsCategory); + } + + /** + * 根据ID更新基本信息 + * @param category + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.GOODS, title = "分类", biz = BizType.UPDATE) + @PreAuthorize("hasRole('goods:category:update')") + public R updateById(@RequestBody @Valid GoodsCategory category){ + if(category.getId()==null){ + return R.error(); + } + goodsCategoryService.modify(category); + return R.ok(); + } + + /** + * 迁移leve + * @param param + * @return + */ + @PostMapping("/updateLevel") + @SysLog(module = SystemModule.GOODS, title = "分类", biz = BizType.UPDATE) + @PreAuthorize("hasRole('goods:category:update')") + public R updateById(@RequestBody @Valid GoodsCategoryLevelBo param){ + goodsCategoryService.modifyLevel(param); + return R.ok(); + } + + /** + * 新增分类 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.GOODS, title = "分类", biz = BizType.INSERT) + @PreAuthorize("hasRole('goods:category:insert')") + public R save(@RequestBody @Valid GoodsCategory param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsCategory::getCode,param.getCode()); + if(goodsCategoryService.count(lqw)>0){ + Assert.throwEx("存在重复编码,不能新增!"); + } + param.setId(null); + goodsCategoryService.modify(param); + return R.ok(); + } + + /** + * 删除分类 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.GOODS, title = "分类", biz = BizType.DELETE) + @PreAuthorize("hasRole('goods:category:delete')") + public R deleteById(@PathVariable("id") Long id){ + QueryWrapper lqw = new QueryWrapper<>(); + lqw.in("target_type", TbsGoodsType.brand.name(),TbsGoodsType.category.name(),TbsGoodsType.series.name()); + lqw.eq("target_id",id); + if(activityGoodsService.count(lqw)>0){ + return R.error("活动含有当前分类,删除失败"); + } + if(budgetConditionService.count(lqw)>0){ + return R.error("预算含有当前分类,删除失败"); + } + LambdaQueryWrapper spuLqw = new LambdaQueryWrapper<>(); + spuLqw.and(slqw->slqw.eq(GoodsSpu::getCategoryFirst,id) + .or().eq(GoodsSpu::getCategorySecond,id) + .or().eq(GoodsSpu::getCategoryThird,id)); + if(goodsSpuService.count(spuLqw)>0){ + return R.error("含有商品,删除失败"); + } + goodsCategoryService.deleteCateById(id); + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsCategoryRuleController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsCategoryRuleController.java new file mode 100644 index 0000000..45c5943 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsCategoryRuleController.java @@ -0,0 +1,140 @@ +package com.qs.serve.modules.goods.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.goods.entity.bo.GoodsCategoryRuleBo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.goods.entity.GoodsCategoryRule; +import com.qs.serve.modules.goods.service.GoodsCategoryRuleService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 商品 品牌规则 + * @author YenHex + * @since 2023-09-18 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/categoryRule") +public class GoodsCategoryRuleController { + + private GoodsCategoryRuleService goodsCategoryRuleService; + + /** + * 列表 + * @param param + * @return + */ + //@GetMapping("/list") + public R> getList(GoodsCategoryRule param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = goodsCategoryRuleService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(GoodsCategoryRule param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + if(StringUtils.hasText(param.getBrandName())){ + lqw.like(GoodsCategoryRule::getBrandNames,param.getBrandName()); + } + PageUtil.startPage(); + lqw.orderByDesc(GoodsCategoryRule::getSort); + List list = goodsCategoryRuleService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.GOODS, title = "品牌规则", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + GoodsCategoryRule goodsCategoryRule = goodsCategoryRuleService.getById(id); + return R.ok(goodsCategoryRule); + } + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.GOODS, title = "品牌规则", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid GoodsCategoryRuleBo param){ + goodsCategoryRuleService.modify(param); + return R.ok(); + } + + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.GOODS, title = "品牌规则", biz = BizType.INSERT) + public R save(@RequestBody @Valid GoodsCategoryRuleBo param){ + goodsCategoryRuleService.modify(param); + return R.ok(); + } + + /** + * 设置默认 + * @param id + * @return + */ + @PostMapping("/setDefault/{id}") + @SysLog(module = SystemModule.GOODS, title = "品牌规则", biz = BizType.INSERT) + public R doSetDefault(@PathVariable("id") String id){ + goodsCategoryRuleService.doSetDefault(id); + return R.ok(); + } + + /** + * 设置默认 + * @return + */ + @GetMapping("/getDefaultRule") + @SysLog(module = SystemModule.GOODS, title = "品牌规则", biz = BizType.INSERT) + public R getDefaultRule(){ + GoodsCategoryRule rule = goodsCategoryRuleService.getOne(new LambdaQueryWrapper(). + eq(GoodsCategoryRule::getDefaultFlag,1),false); + return R.ok(rule); + } + + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.GOODS, title = "品牌规则", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = goodsCategoryRuleService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsCustomerPriceController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsCustomerPriceController.java new file mode 100644 index 0000000..73c6fb8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsCustomerPriceController.java @@ -0,0 +1,152 @@ +package com.qs.serve.modules.goods.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.config.DevEnvironmentConfig; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.common.BookAccountUtil; +import com.qs.serve.modules.goods.entity.bo.GoodsCustomerPriceBo; +import com.qs.serve.modules.goods.entity.bo.GoodsCustomerPriceSingleBo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.goods.entity.GoodsCustomerPrice; +import com.qs.serve.modules.goods.service.GoodsCustomerPriceService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 商品 客户价格关系表 + * @author YenHex + * @since 2024-01-08 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/customerPrice") +public class GoodsCustomerPriceController { + + private GoodsCustomerPriceService goodsCustomerPriceService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(GoodsCustomerPrice param){ + if(param.getSupplierId()==null){ + return R.error("请选择客户"); + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = goodsCustomerPriceService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(GoodsCustomerPrice param){ + if(DevEnvironmentConfig.OPEN_TENANT_BOOK){ + param.setBookCodeList(BookAccountUtil.getCurrentUserAccount()); + } + PageUtil.startPage(); + List list = goodsCustomerPriceService.selectGoodsCustomerPriceList(param); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.GOODS, title = "客户价格关系表", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + GoodsCustomerPrice goodsCustomerPrice = goodsCustomerPriceService.getById(id); + return R.ok(goodsCustomerPrice); + } + + /** + * 单个保存 + * @param param + * @return + */ + @PostMapping("/singleModify") + @SysLog(module = SystemModule.GOODS, title = "单个保存", biz = BizType.INSERT) + public R singleModify(@RequestBody @Valid GoodsCustomerPriceSingleBo param){ + return R.ok(goodsCustomerPriceService.singleModify(param)); + } + + /** + * 批量保存 + * @param param + * @return + */ + @PostMapping("/saveBatch") + @SysLog(module = SystemModule.GOODS, title = "批量保存", biz = BizType.INSERT) + public R saveBatch(@RequestBody @Valid GoodsCustomerPriceBo param){ + goodsCustomerPriceService.saveBatch(param); + return R.ok(); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.GOODS, title = "客户价格关系表", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = goodsCustomerPriceService.removeByIds(idsLong); + return R.isTrue(result); + } + + + /** + * 同步客户特殊价 + * @return + */ + @GetMapping("/sync") + public R syncCusInvPrice(){ + goodsCustomerPriceService.syncCustomerPrice(); + return R.ok(); + } + + + /** + * 同步客户特殊价 + * @return + */ + @GetMapping("/syncCus") + public R syncCusInvPrice(String cusCode){ + goodsCustomerPriceService.syncCustomerPrice(cusCode); + return R.ok(); + } + + /** + * 更新最近一个月价格有变动的客户价格(全量更新,比较慢) + * @return + */ + @GetMapping("/syncLastMonth") + public R syncLastMonth(){ + //更新最近一个月价格有变动的客户价格 + goodsCustomerPriceService.syncCustomerPrice(""); + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsFeedbackController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsFeedbackController.java new file mode 100644 index 0000000..8bfb88b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsFeedbackController.java @@ -0,0 +1,269 @@ +package com.qs.serve.modules.goods.controller; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.github.pagehelper.PageHelper; +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.dto.SimpleKeyValue; +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.goods.entity.GoodsFeedbackType; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.entity.bo.GoodsFeedbackBo; +import com.qs.serve.modules.goods.entity.bo.GoodsFeedbackCheckBo; +import com.qs.serve.modules.goods.entity.so.GoodsFeedbackQuery; +import com.qs.serve.modules.goods.entity.vo.GoodsFeedbackVo; +import com.qs.serve.modules.goods.mapper.GoodsFeedbackMapper; +import com.qs.serve.modules.goods.service.GoodsFeedbackTypeService; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysAttachService; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.service.SysUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.goods.entity.GoodsFeedback; +import com.qs.serve.modules.goods.service.GoodsFeedbackService; + +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 商品 问题反馈 + * @author YenHex + * @since 2024-10-25 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/feedback") +public class GoodsFeedbackController { + + private SysUserService sysUserService; + private GoodsFeedbackTypeService goodsFeedbackTypeService; + private GoodsFeedbackService goodsFeedbackService; + private GoodsFeedbackMapper goodsFeedbackMapper; + private SysPostUserService postUserService; + private GoodsSkuService goodsSkuService; + private GoodsSpuService goodsSpuService; + private SysAttachService attachService; + + /** + * 列表 + * @param param + * @return + */ + //@GetMapping("/list") + public R> getList(GoodsFeedback param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = goodsFeedbackService.list(lqw); + return R.ok(list); + } + + @GetMapping("typeOptions") + public R getOptions(){ + List types = goodsFeedbackMapper.selectHisTypes(); + Map> roots = new HashMap<>(); + for (String key : types) { + String[] parts = key.split(","); + SimpleKeyValue current = roots.computeIfAbsent(parts[0], k -> { + SimpleKeyValue root = new SimpleKeyValue(); + root.setValue( k ); + root.setLabel( k ); + root.setParentId("0"); + return root; + }); + for (int i = 1; i < parts.length; i++) { + current = this.findOrCreateChild(current, parts , i); + } + } + return R.ok(roots.values()); + } + + public SimpleKeyValue findOrCreateChild(SimpleKeyValue parent, String[] values,int idx) { + String finalValue = values[idx]; + for (SimpleKeyValue child : parent.getChildList()) { + if (child.getValue().equals(finalValue)) { + return child; + } + } + SimpleKeyValue newChild = new SimpleKeyValue(); + newChild.setValue(finalValue); + newChild.setLabel(finalValue); + newChild.setParentId(parent.getValue()); + parent.addChild(newChild); + return newChild; + } + + + /** + * 翻页(我的) + * @param param + * @return + */ + @PostMapping("/pageMy") + public R> getPageMy(@RequestBody GoodsFeedbackQuery param){ + PageHelper.startPage(param.getPageNum(),param.getPageSize()); + param.setSelectUserIds(Arrays.asList(AuthContextUtils.getSysUserId())); + List list = goodsFeedbackService.selectListVo(param); + return R.byPageHelperList(list); + } + + /** + * 翻页(我的和下属的) + * @param param + * @return + */ + @PostMapping("/pageMyAndChild") + public R> getPageMyAndChild(@RequestBody GoodsFeedbackQuery param){ + String userId = AuthContextUtils.getSysUserId(); + List userIds = postUserService.listByChildIds(userId); + userIds.add(userId); + PageHelper.startPage(param.getPageNum(),param.getPageSize()); + param.setSelectUserIds(userIds); + List list = goodsFeedbackService.selectListVo(param); + return R.byPageHelperList(list); + } + + + /** + * 翻页 + * @param param + * @return + */ + @PostMapping("/page") + public R> getPage(@RequestBody GoodsFeedbackQuery param){ + PageHelper.startPage(param.getPageNum(),param.getPageSize()); + List list = goodsFeedbackService.selectListVo(param); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.GOODS, title = "问题反馈", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + GoodsFeedback goodsFeedback = goodsFeedbackService.getById(id); + GoodsFeedbackVo feedbackVo = CopierUtil.copy(goodsFeedback,new GoodsFeedbackVo()); + if(feedbackVo.getSkuIds()!=null && feedbackVo.getSkuIds().length>0){ + List skuList = goodsSkuService.listByIds(Arrays.asList(feedbackVo.getSkuIds())); + feedbackVo.setGoodSkuList(skuList); + } + if(feedbackVo.getSpuIds()!=null && feedbackVo.getSpuIds().length>0){ + List list = goodsSpuService.listByIds(Arrays.asList(feedbackVo.getSpuIds())); + feedbackVo.setGoodSpuList(list); + } + List goodsFeedbackTypes = new ArrayList<>(); + String typeId = feedbackVo.getFeedbackTypeId(); + while (true){ + if(typeId.equals(TreeUtil.DEFAULT_PID_STRING)){ + break; + } + GoodsFeedbackType goodsFeedbackType = goodsFeedbackTypeService.getById(typeId); + if(goodsFeedbackType==null){ + break; + } + goodsFeedbackTypes.add(goodsFeedbackType); + typeId = goodsFeedbackType.getPid(); + } + if(CollUtil.isNotEmpty(goodsFeedbackTypes)){ + Collections.reverse(goodsFeedbackTypes); + String string = goodsFeedbackTypes.stream().map(GoodsFeedbackType::getName).collect(Collectors.joining("/")); + feedbackVo.setFeedBackTypes(goodsFeedbackTypes); + } + if(feedbackVo.getAttachIds()!=null&&feedbackVo.getAttachIds().length>0){ + List list2 = attachService.listByIds(Arrays.asList(feedbackVo.getAttachIds())); + feedbackVo.setAttachList(list2); + } + return R.ok(feedbackVo); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.GOODS, title = "问题反馈", biz = BizType.INSERT) + public R save(@RequestBody @Valid GoodsFeedbackBo param){ + goodsFeedbackService.modify(param); + return R.ok(); + } + + /** + * 核对反馈 + * @param param + * @return + */ + @PostMapping("/check") + @SysLog(module = SystemModule.GOODS, title = "问题反馈", biz = BizType.INSERT) + public R check(@RequestBody @Valid GoodsFeedbackCheckBo param){ + GoodsFeedback feedback = goodsFeedbackService.getById(param.getId()); + feedback.setGoodsCheckRemark(param.getGoodsCheckRemark()); + feedback.setGoodsCheckTime(LocalDateTime.now()); + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + feedback.setGoodsCheckerId(sysUser.getId()); + feedback.setGoodsChecker(sysUser.getName()); + goodsFeedbackService.updateById(feedback); + return R.ok(); + } + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.GOODS, title = "问题反馈", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid GoodsFeedback param){ + boolean result = goodsFeedbackService.updateById(param); + return R.isTrue(result); + } + + /** + * 删除(我的删除接口 30天内可删除) + * @param ids + * @return + */ + @DeleteMapping("/deleteMyById/{ids}") + @SysLog(module = SystemModule.GOODS, title = "问题反馈", biz = BizType.DELETE) + public R deleteMyById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = goodsFeedbackService.remove( + new LambdaQueryWrapper() + .in(GoodsFeedback::getId,idsLong) + .eq(GoodsFeedback::getUserId,AuthContextUtils.getSysUserId()) + .ge(GoodsFeedback::getCreateTime, LocalDateTime.now().plusDays(-30)) + ); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.GOODS, title = "问题反馈", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = goodsFeedbackService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsFeedbackTypeController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsFeedbackTypeController.java new file mode 100644 index 0000000..4b9e51e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsFeedbackTypeController.java @@ -0,0 +1,139 @@ +package com.qs.serve.modules.goods.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.common.util.TreeUtil; +import com.qs.serve.modules.biz.consts.GroupDataType; +import com.qs.serve.modules.bms.entity.vo.BmsRegionTreeVo; +import com.qs.serve.modules.goods.entity.bo.GoodsFeedbackTypeBo; +import com.qs.serve.modules.goods.entity.vo.GoodsFeedbackTypeTreeVo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.goods.entity.GoodsFeedbackType; +import com.qs.serve.modules.goods.service.GoodsFeedbackTypeService; + +import javax.validation.Valid; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 商品 问题反馈类型 + * @author YenHex + * @since 2024-11-01 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/feedbackType") +public class GoodsFeedbackTypeController { + + private GoodsFeedbackTypeService goodsFeedbackTypeService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/options") + public R> getOptions(GoodsFeedbackType param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + lqw.eq(GoodsFeedbackType::getHideFlag,0) + .orderByDesc(GoodsFeedbackType::getSort); + List list = goodsFeedbackTypeService.list(lqw); + List treeVoList = list.stream().map(obj->{ + GoodsFeedbackTypeTreeVo treeNode = CopierUtil.copy(obj,new GoodsFeedbackTypeTreeVo()); + treeNode.setId(obj.getId()); + treeNode.setParentId(obj.getPid()); + treeNode.setSort(obj.getSort()); + return treeNode; + }).collect(Collectors.toList()); + return R.ok(TreeUtil.buildByRecursive(treeVoList,TreeUtil.DEFAULT_PID_STRING)); + } + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/tree") + public R> getList(GoodsFeedbackType param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + lqw.orderByDesc(GoodsFeedbackType::getSort); + List list = goodsFeedbackTypeService.list(lqw); + List treeVoList = list.stream().map(obj->{ + GoodsFeedbackTypeTreeVo treeNode = CopierUtil.copy(obj,new GoodsFeedbackTypeTreeVo()); + treeNode.setId(obj.getId()); + treeNode.setParentId(obj.getPid()); + treeNode.setSort(obj.getSort()); + return treeNode; + }).collect(Collectors.toList()); + return R.ok(TreeUtil.buildByRecursive(treeVoList,TreeUtil.DEFAULT_PID_STRING)); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.GOODS, title = "问题反馈类型", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + GoodsFeedbackType goodsFeedbackType = goodsFeedbackTypeService.getById(id); + if(!goodsFeedbackType.getPid().equals(TreeUtil.DEFAULT_PID_STRING)){ + GoodsFeedbackType p = goodsFeedbackTypeService.getById(goodsFeedbackType.getPid()); + goodsFeedbackType.setParentInfo(p); + } + return R.ok(goodsFeedbackType); + } + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.GOODS, title = "问题反馈类型", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid GoodsFeedbackTypeBo param){ + GoodsFeedbackType entity = CopierUtil.copy(param,new GoodsFeedbackType()); + boolean result = goodsFeedbackTypeService.updateById(entity); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.GOODS, title = "问题反馈类型", biz = BizType.INSERT) + public R save(@RequestBody @Valid GoodsFeedbackTypeBo param){ + GoodsFeedbackType entity = CopierUtil.copy(param,new GoodsFeedbackType()); + boolean result = goodsFeedbackTypeService.save(entity); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.GOODS, title = "问题反馈类型", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = goodsFeedbackTypeService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsImminentBatchController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsImminentBatchController.java new file mode 100644 index 0000000..c4f09f1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsImminentBatchController.java @@ -0,0 +1,151 @@ +package com.qs.serve.modules.goods.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.config.DevEnvironmentConfig; +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.bms.common.BookAccountUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.goods.entity.GoodsCategoryRule; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.bo.GoodsImminentBatchBo; +import com.qs.serve.modules.goods.entity.so.GoodsImminentBatchQuery; +import com.qs.serve.modules.goods.entity.vo.GoodsImminentBatchVo; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.oms.entity.OmsOrderItem; +import com.qs.serve.modules.oms.service.OmsOrderItemService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.goods.entity.GoodsImminentBatch; +import com.qs.serve.modules.goods.service.GoodsImminentBatchService; + +import javax.validation.Valid; +import java.util.Arrays; +import java.util.List; + +/** + * 商品 临期批次 + * @author YenHex + * @since 2024-06-11 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/imminentBatch") +public class GoodsImminentBatchController { + + private OmsOrderItemService orderItemService; + private GoodsImminentBatchService goodsImminentBatchService; + private GoodsSkuService goodsSkuService; + + /** + * 翻页 + * @param param + * @return + */ +// @GetMapping("/page") +// public R> getPage(GoodsImminentBatch param){ +// LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); +// PageUtil.startPage(); +// List list = goodsImminentBatchService.list(lqw); +// list.forEach(a->a.setQuantity(a.getQuantity()-a.getOrderQuantity())); +// return R.byPageHelperList(list); +// } + + @GetMapping("/page") + public R> getPage(GoodsImminentBatchQuery param){ + //客户规则设置 + long total = goodsImminentBatchService.countVoList(param); + if(total<1){ + return R.byEmptyList(); + } + List list = goodsImminentBatchService.selectVoList(param); + list.forEach(a->a.setQuantity(a.getQuantity()-a.getOrderQuantity())); + return R.byPageList(total,list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.GOODS, title = "临期批次", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + GoodsImminentBatch a = goodsImminentBatchService.getById(id); + a.setQuantity(a.getQuantity()-a.getOrderQuantity()); + return R.ok(a); + } + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/update") + @SysLog(module = SystemModule.GOODS, title = "临期批次", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid GoodsImminentBatchBo param){ + param.setSkuId(null); + GoodsImminentBatch entity = CopierUtil.copy(param,new GoodsImminentBatch()); + if(goodsImminentBatchService.checkExist(param.getBatchCode(),param.getSkuId(),entity.getId())){ + return R.error("已重复"); + } + GoodsImminentBatch org = goodsImminentBatchService.getById(param.getId()); + if(!org.getBatchCode().equals(entity.getBatchCode())){ + long count = orderItemService.count( + new LambdaQueryWrapper() + .eq(OmsOrderItem::getSkuBatchId,param.getId()) + ); + if(count>0){ + return R.error("已存在订单,无法修改批号"); + } + } + + int rs = entity.getQuantity()+org.getOrderQuantity(); + entity.setQuantity(rs); + + boolean result = goodsImminentBatchService.updateById(entity); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.GOODS, title = "临期批次", biz = BizType.INSERT) + public R save(@RequestBody @Valid GoodsImminentBatchBo param){ + GoodsImminentBatch entity = CopierUtil.copy(param,new GoodsImminentBatch()); + GoodsSku goodsSku = goodsSkuService.getById(param.getSkuId()); + entity.setSkuCode(goodsSku.getSkuCode()); + entity.setSkuName(goodsSku.getSkuName()); + if(goodsImminentBatchService.checkExist(param.getBatchCode(),param.getSkuId(),0L)){ + return R.error("已重复"); + } + boolean result = goodsImminentBatchService.save(entity); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.GOODS, title = "临期批次", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = goodsImminentBatchService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsRuleController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsRuleController.java new file mode 100644 index 0000000..9755a66 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsRuleController.java @@ -0,0 +1,98 @@ +package com.qs.serve.modules.goods.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.bo.GoodsRuleBo; +import com.qs.serve.modules.goods.entity.bo.GoodsRuleImportBo; +import com.qs.serve.modules.goods.entity.dto.GoodsRuleBaseDTO; +import com.qs.serve.modules.goods.entity.vo.GoodsRuleVo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.goods.entity.GoodsRule; +import com.qs.serve.modules.goods.service.GoodsRuleService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 商品 规则 + * @author YenHex + * @since 2024-03-22 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/rule") +public class GoodsRuleController { + + private GoodsRuleService goodsRuleService; + + + /** + * ID查询 + * @param dto + * @return + */ + @GetMapping("/get") + @SysLog(module = SystemModule.GOODS, title = "规则", biz = BizType.QUERY) + public R getById(GoodsRuleBaseDTO dto){ + GoodsRuleVo goodsRule = goodsRuleService.getVoById(dto); + return R.ok(goodsRule); + } + + + /** + * 编辑 + * @param param + * @return + */ + @PostMapping("/modify") + @SysLog(module = SystemModule.GOODS, title = "规则", biz = BizType.INSERT) + public R save(@RequestBody @Valid GoodsRuleBo param){ + goodsRuleService.modify(param); + return R.ok(param); + } + + /** + * + * @param param + * @return + */ + @PostMapping("/import") + @SysLog(module = SystemModule.GOODS, title = "规则", biz = BizType.INSERT) + public R importData(@RequestBody @Valid GoodsRuleImportBo param){ + // 转换成GoodsRuleBo + GoodsRuleBo ruleBo = goodsRuleService.tranGoodsRuleBo(param); + if(param.getCheckOkFlag()!=null&&!param.getCheckOkFlag()){ + return R.errorImport(param); + } + goodsRuleService.modify(ruleBo); + return R.ok(); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.GOODS, title = "规则", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = goodsRuleService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSaleGroupController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSaleGroupController.java new file mode 100644 index 0000000..10c48a9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSaleGroupController.java @@ -0,0 +1,116 @@ +package com.qs.serve.modules.goods.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.goods.entity.GoodsSaleGroup; +import com.qs.serve.modules.goods.service.GoodsSaleGroupService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 商品 商品销售分组 + * @author YenHex + * @since 2023-08-21 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/saleGroup") +public class GoodsSaleGroupController { + + private GoodsSaleGroupService goodsSaleGroupService; + + /** + * 列表 + * @param param + * @return + */ + //@GetMapping("/list") + public R> getList(GoodsSaleGroup param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + lqw.orderByDesc(GoodsSaleGroup::getSort); + List list = goodsSaleGroupService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(GoodsSaleGroup param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + lqw.orderByDesc(GoodsSaleGroup::getSort); + List list = goodsSaleGroupService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.GOODS, title = "商品销售分组", biz = BizType.QUERY) + @PreAuthorize("hasRole('goods:saleGroup:query')") + public R getById(@PathVariable("id") String id){ + GoodsSaleGroup goodsSaleGroup = goodsSaleGroupService.getById(id); + return R.ok(goodsSaleGroup); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.GOODS, title = "商品销售分组", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid GoodsSaleGroup param){ + boolean result = goodsSaleGroupService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.GOODS, title = "商品销售分组", biz = BizType.INSERT) + public R save(@RequestBody @Valid GoodsSaleGroup param){ + boolean result = goodsSaleGroupService.save(param); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.GOODS, title = "商品销售分组", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = goodsSaleGroupService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSeriesController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSeriesController.java new file mode 100644 index 0000000..58bc34b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSeriesController.java @@ -0,0 +1,103 @@ +package com.qs.serve.modules.goods.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.goods.entity.GoodsSeries; +import com.qs.serve.modules.goods.service.GoodsSeriesService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 商品 系列 + * @author YenHex + * @since 2022-10-11 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/series") +public class GoodsSeriesController { + + private GoodsSeriesService goodsSeriesService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('goods:series:query')") + public R> getPage(GoodsSeries param){ + PageUtil.startPage(); + LambdaQueryWrapper seriesWrapper = new LambdaQueryWrapper<>(param); + List list = goodsSeriesService.list(seriesWrapper); + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.GOODS, title = "系列", biz = BizType.QUERY) + @PreAuthorize("hasRole('goods:series:query')") + public R getById(@PathVariable("id") String id){ + GoodsSeries goodsSeries = goodsSeriesService.getById(id); + return R.ok(goodsSeries); + } + + + + /** + * 根据ID更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.GOODS, title = "系列", biz = BizType.UPDATE) + @PreAuthorize("hasRole('goods:series:update')") + public R updateById(@RequestBody @Valid GoodsSeries param){ + boolean result = goodsSeriesService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增系列 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.GOODS, title = "系列", biz = BizType.INSERT) + @PreAuthorize("hasRole('goods:series:insert')") + public R save(@RequestBody @Valid GoodsSeries param){ + boolean result = goodsSeriesService.save(param); + return R.isTrue(result); + } + + /** + * 删除系列 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.GOODS, title = "系列", biz = BizType.DELETE) + @PreAuthorize("hasRole('goods:series:delete')") + public R deleteById(@PathVariable("id") Long id){ + boolean result = goodsSeriesService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuController.java new file mode 100644 index 0000000..6678833 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuController.java @@ -0,0 +1,165 @@ +package com.qs.serve.modules.goods.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qs.serve.common.config.DevEnvironmentConfig; +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.CopierUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.common.BookAccountUtil; +import com.qs.serve.modules.goods.entity.GoodsSkuSpecValue; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.entity.bo.GoodsSkuBo; +import com.qs.serve.modules.goods.entity.bo.GoodsSkuImportBo; +import com.qs.serve.modules.goods.entity.bo.GoodsSpuImportBo; +import com.qs.serve.modules.goods.entity.vo.GoodSkuVo; +import com.qs.serve.modules.goods.entity.vo.GoodsSkuExportVo; +import com.qs.serve.modules.goods.entity.vo.GoodsSkuSpecValueVo; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.service.GoodsSkuSpecValueService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.sale.entity.SalePlanGoods; +import com.qs.serve.modules.sale.service.SalePlanGoodsService; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.entity.TbsActivityGoods; +import com.qs.serve.modules.tbs.entity.TbsBudgetCondition; +import com.qs.serve.modules.tbs.service.TbsActivityGoodsService; +import com.qs.serve.modules.tbs.service.TbsBudgetConditionService; +import com.qs.serve.modules.tzc.entity.TzcPolicyGoods; +import com.qs.serve.modules.tzc.service.TzcPolicyGoodsService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.service.GoodsSkuService; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.stream.Collectors; + +/** + * 商品SKU 查询相关接口 + * @author YenHex + * @since 2022-10-09 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/sku") +public class GoodsSkuController { + + private GoodsSkuMapper goodsSkuMapper; + private GoodsSkuService goodsSkuService; + private GoodsSpuService goodsSpuService; + private GoodsSkuSpecValueService goodsSkuSpecValueService; + private TbsActivityGoodsService activityGoodsService; + private TbsBudgetConditionService budgetConditionService; + private SalePlanGoodsService salePlanGoodsService; + private TzcPolicyGoodsService policyGoodsService; + + /** + * 列表(传入spuId获取spu规格列表) + * @param param + * @return + */ + @GetMapping("/list") + @PreAuthorize("hasRole('goods:sku:query')") + public R> getList(GoodsSku param){ + List list = goodsSkuService.selectSkuVo(param); + Random rd = new Random(); + for (GoodSkuVo goodSkuVo : list) { + goodSkuVo.setStock(rd.nextInt(3)); +// List skuSpecValueVos = goodsSkuSpecValueService.listSpecValueBySkuId(goodSkuVo.getId()); +// goodSkuVo.setSpecValueList(skuSpecValueVos); + } + return R.ok(list); + } + + /** + * 翻页(管理) + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(GoodsSku param, HttpServletRequest request){ + if(DevEnvironmentConfig.OPEN_TENANT_BOOK){ + param.setBookCodeList(BookAccountUtil.getCurrentUserAccount()); + } + PageUtil.startPage(); + + String spuName = request.getParameter("name"); + param.setSpuName(spuName); + + List list = goodsSkuService.selectSkuVo(param); + return R.byPageHelperList(list); + } + + /** + * 翻页(组件接口) + * @param param + * @return + */ + @GetMapping("/enablePage") + public R> getMgrPage(GoodsSku param){ + PageUtil.startPage(); + param.setEnable(1); + List list = goodsSkuService.selectSkuVo(param); + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.GOODS, title = "sku", biz = BizType.QUERY) + @PreAuthorize("hasRole('goods:sku:query')") + public R getById(@PathVariable("id") String id){ + GoodsSku goodsSku = goodsSkuService.getById(id); + List skuSpecValueVos = goodsSkuSpecValueService.listSpecValueBySkuId(goodsSku.getId()); + goodsSku.setSpecValueList(skuSpecValueVos); + return R.ok(goodsSku); + } + + /** + * 导出 + * @param param + * @return + */ + @GetMapping("/export") + public R> export(GoodsSku param){ + if(DevEnvironmentConfig.OPEN_TENANT_BOOK){ + param.setBookCodeList(BookAccountUtil.getCurrentUserAccount()); + } + List list = goodsSkuService.selectSkuVo(param); + List result = list.stream().map(a->{ + GoodsSkuExportVo skuExportVo = CopierUtil.copy(a,new GoodsSkuExportVo()); + return skuExportVo; + }).collect(Collectors.toList()); + return R.ok(result); + } + + /** + * 导出(Post) + * @param param + * @return + */ + @PostMapping("/export") + public R> export4Post(@RequestBody GoodsSku param){ + return this.export(param); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuOptionController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuOptionController.java new file mode 100644 index 0000000..b5386e3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuOptionController.java @@ -0,0 +1,413 @@ +package com.qs.serve.modules.goods.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qs.serve.common.config.DevEnvironmentConfig; +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.CopierUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.SpringUtils; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.common.BookAccountUtil; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSkuSpecValue; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.entity.bo.GoodsSkuBo; +import com.qs.serve.modules.goods.entity.bo.GoodsSkuImportBo; +import com.qs.serve.modules.goods.entity.bo.GoodsSkuSpecialBo; +import com.qs.serve.modules.goods.entity.bo.GoodsSkuStateBo; +import com.qs.serve.modules.goods.entity.vo.GoodSkuVo; +import com.qs.serve.modules.goods.entity.vo.GoodsSkuExportVo; +import com.qs.serve.modules.goods.entity.vo.GoodsSkuSpecValueVo; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.mapper.GoodsSpuMapper; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.service.GoodsSkuSpecValueService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.sale.entity.SalePlanGoods; +import com.qs.serve.modules.sale.service.SalePlanGoodsService; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.entity.TbsActivityGoods; +import com.qs.serve.modules.tbs.entity.TbsBudgetCondition; +import com.qs.serve.modules.tbs.service.TbsActivityGoodsService; +import com.qs.serve.modules.tbs.service.TbsBudgetConditionService; +import com.qs.serve.modules.tzc.service.TzcPolicyGoodsService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.stream.Collectors; + +/** + * 商品SKU 操作层接口 + * @author YenHex + * @since 2022-10-09 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/sku") +public class GoodsSkuOptionController { + + private GoodsSkuMapper goodsSkuMapper; + private GoodsSkuService goodsSkuService; + private GoodsSpuService goodsSpuService; + private GoodsSkuSpecValueService goodsSkuSpecValueService; + private TbsActivityGoodsService activityGoodsService; + private TbsBudgetConditionService budgetConditionService; + private SalePlanGoodsService salePlanGoodsService; + private TzcPolicyGoodsService policyGoodsService; + + + /** + * 批量编辑状态 + * @param param + * @return + */ + @PostMapping("/updateStateBatch") + @SysLog(module = SystemModule.GOODS, title = "sku", biz = BizType.UPDATE) + @PreAuthorize("hasRole('goods:sku:update')") + public R updateStateBatch(@RequestBody @Valid GoodsSkuStateBo param){ + param.initProp(); + GoodsSku goodsSku = new GoodsSku(); + goodsSku.setEnable(param.getEnable()); + goodsSku.setOrderFlag(param.getOrderFlag()); + goodsSku.setCostFlag(param.getCostFlag()); + goodsSku.setOrderOfflineFlag(param.getOrderOfflineFlag()); + goodsSku.setOrderOnlineFlag(param.getOrderOnlineFlag()); + goodsSkuService.update(goodsSku,new LambdaQueryWrapper() + .in(GoodsSku::getId,param.getSkuIds())); + //goodsSpuService.initSkuNum(); + return R.ok(); + } + + /** + * 批量编辑特殊品状态 + * @param param + * @return + */ + @PostMapping("/updateSpecialFlagBatch") + @SysLog(module = SystemModule.GOODS, title = "sku", biz = BizType.UPDATE) + @PreAuthorize("hasRole('goods:sku:update')") + public R updateSpecialFlagBatch(@RequestBody @Valid GoodsSkuSpecialBo param){ + Integer flag = param.getSpecialFlag(); + for (Long skuId : param.getSkuIds()) { + GoodsSku sku = goodsSkuService.getById(skuId); + LambdaQueryWrapper specialSkuLqw = new LambdaQueryWrapper<>(); + specialSkuLqw.eq(GoodsSku::getSpecialFlag,1); + specialSkuLqw.eq(GoodsSku::getSpuId,sku.getSpuId()); + List specialSkuList = goodsSkuService.list(specialSkuLqw); + if(specialSkuList.size()>0){ + GoodsSku goodsSku1 = specialSkuList.get(0); + GoodsSpuMapper spuMapper = SpringUtils.getBean(GoodsSpuMapper.class); + GoodsSpu spu = new GoodsSpu(); + spu.setId(goodsSku1.getSpuId()); + if(flag.equals(1)){ + spu.setSpecialSkuId(goodsSku1.getId()); + }else { + spu.setSpecialSkuId(0L); + } + spuMapper.updateById(spu); + } + sku.setSpecialFlag(flag); + goodsSkuService.updateById(sku); + } + //goodsSpuService.initSkuNum(); + return R.ok(); + } + + /** + * 编辑 + * @param param + * @return + */ + @PostMapping("/update") + @SysLog(module = SystemModule.GOODS, title = "sku", biz = BizType.UPDATE) + @PreAuthorize("hasRole('goods:sku:update')") + public R update(@RequestBody @Valid GoodsSkuBo param){ + if(param.getSkuId()==null){ + return R.error(); + } + goodsSkuService.editSku2(param); + goodsSpuService.updateOnlineOfflineFlat(param.getSpuId()); + return R.ok(); + } + + /** + * 开启/关闭sku + * @param skuId + * @param enable + * @return + */ + @GetMapping("/enable") + @SysLog(module = SystemModule.GOODS, title = "sku", biz = BizType.UPDATE) + @PreAuthorize("hasRole('goods:sku:update')") + public R update(Long skuId,Integer enable){ + GoodsSku param = new GoodsSku(); + param.setId(skuId); + param.setEnable(enable.equals(1)?1:0); + goodsSkuService.updateById(param); + return R.ok(); + } + + /** + * 保存 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.GOODS, title = "sku", biz = BizType.UPDATE) + @PreAuthorize("hasRole('goods:sku:update')") + public R save(@RequestBody @Valid GoodsSkuBo param){ + goodsSkuService.editSku2(param); + goodsSpuService.updateOnlineOfflineFlat(param.getSpuId()); + return R.ok(); + } + + /** + * 删除sku + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.GOODS, title = "sku", biz = BizType.DELETE) + @PreAuthorize("hasRole('goods:sku:delete')") + public R deleteById(@PathVariable("id") Long id){ + GoodsSku sku = goodsSkuService.getById(id); + QueryWrapper lqw1 = new QueryWrapper<>(); + lqw1.eq("target_type", TbsGoodsType.sku.name()); + lqw1.eq("target_id",id); + if(activityGoodsService.count(lqw1)>0){ + return R.error("活动含有当前商品,删除失败"); + } + if(budgetConditionService.count(lqw1)>0){ + return R.error("预算含有当前商品,删除失败"); + } + if(salePlanGoodsService.count(lqw1)>0){ + return R.error("销售计划含有当前商品,删除失败"); + } + if(policyGoodsService.count(lqw1)>0){ + return R.error("政策含有当前商品,删除失败"); + } + goodsSkuMapper.updateSkuCodeAndDelFlag(id, StringUtils.genShortId()); + //删除商品规格值 + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(); + lqw2.eq(GoodsSkuSpecValue::getSkuId,id); + goodsSkuSpecValueService.remove(lqw2); + goodsSpuService.updateOnlineOfflineFlat(sku.getSpuId()); + return R.ok(); + } + + + /** + * 通过skuCode对基本信息更新 + * @param param + * @return + */ + @PostMapping("/updateBySkuCode") + public R updateBySkuCode(@RequestBody GoodsSku param){ + param.setId(null); + param.setSpuId(null); + GoodsSku sku = goodsSkuService.getByCode(param.getSkuCode()); + if(sku==null){ + return R.errorNotFound(); + } + param.setId(sku.getId()); + if(param.getBelong()!=null&¶m.getBelong().contains("产")){ + param.setBelong(param.getBelong().replace("产","")); + } + goodsSkuService.updateById(param); + return R.ok(); + } + + /** + * 导入 + * @param param + * @return + */ + @PostMapping("/importSku") + @SysLog(module = SystemModule.GOODS, title = "import", biz = BizType.INSERT) + public R importSpu(@RequestBody @Valid GoodsSkuImportBo param){ + final String UPDATE = "2"; + final String DELETE = "3"; + final String SAVE = "1"; + boolean throwEx = false; + Map> skuItemList = param.getSkuList().stream() + .filter(a->a.getOpt()!=null).collect(Collectors.groupingBy(GoodsSkuImportBo.SkuItem::getOpt)); + + //处理删除 + List delList = skuItemList.get(DELETE); + if(delList!=null){ + List delSkuCodes = delList.stream().map(GoodsSkuImportBo.SkuItem::getSkuCode).collect(Collectors.toList()); + QueryWrapper lqw1 = new QueryWrapper<>(); + lqw1.eq("target_type", TbsGoodsType.sku.name()); + lqw1.in("target_code",delSkuCodes); + lqw1.select("target_code"); + List activityGoodsList = activityGoodsService.list(lqw1); + List budgetConditionList = budgetConditionService.list(lqw1); + List salePlanGoodsList = salePlanGoodsService.list(lqw1); + for (TbsActivityGoods item : activityGoodsList) { + for (GoodsSkuImportBo.SkuItem skuItem : param.getSkuList()) { + if(item.getTargetCode().equals(skuItem.getSkuCode())&&DELETE.equals(skuItem.getOpt())){ + skuItem.setErrMsg(skuItem.getErrMsg()==null?"活动含有当前商品,删除失败;":skuItem.getErrMsg()+"\n活动含有当前商品,删除失败;"); + throwEx = true; + } + } + } + for (TbsBudgetCondition item : budgetConditionList) { + for (GoodsSkuImportBo.SkuItem skuItem : param.getSkuList()) { + if(item.getTargetCode().equals(skuItem.getSkuCode())&&DELETE.equals(skuItem.getOpt())){ + skuItem.setErrMsg(skuItem.getErrMsg()==null?"预算含有当前商品,删除失败;":skuItem.getErrMsg()+"\n预算含有当前商品,删除失败;"); + throwEx = true; + } + } + } + for (SalePlanGoods item : salePlanGoodsList) { + for (GoodsSkuImportBo.SkuItem skuItem : param.getSkuList()) { + if(item.getTargetCode().equals(skuItem.getSkuCode())&&DELETE.equals(skuItem.getOpt())){ + skuItem.setErrMsg(skuItem.getErrMsg()==null?"销售计划含有当前商品,删除失败;":skuItem.getErrMsg()+"\n销售计划含有当前商品,删除失败;"); + throwEx = true; + } + } + } + //执行删除 + List skuCodeToDelList = param.getSkuList().stream() + .filter(a->a.getErrMsg()==null) + .map(GoodsSkuImportBo.SkuItem::getSkuCode) + .collect(Collectors.toList()); + if(skuCodeToDelList.size()>0){ + LambdaQueryWrapper delLqw = new LambdaQueryWrapper<>(); + delLqw.in(GoodsSku::getSkuCode,skuCodeToDelList); + goodsSkuService.remove(delLqw); + } + } + + //处理更新和新增 + List skuCodes = param.getSkuList().stream().map(GoodsSkuImportBo.SkuItem::getSkuCode).distinct().collect(Collectors.toList()); + List spuCodes = param.getSkuList().stream().map(GoodsSkuImportBo.SkuItem::getSpuCode).distinct().collect(Collectors.toList()); + List skuList = goodsSkuService.getByCodes(skuCodes); + List spuList = goodsSpuService.getByCodes(spuCodes); + for (GoodsSkuImportBo.SkuItem skuItem : param.getSkuList()) { + String opt = skuItem.getOpt(); + if(opt==null){ + continue; + } + if(opt.equals(DELETE)){ + continue; + } + GoodsSku sku = this.selectSku(skuList,skuItem.getSkuCode()); + GoodsSpu spu = this.selectSpu(spuList,skuItem.getSpuCode()); + + if(StringUtils.hasText(skuItem.getSpuCode())&&spu==null){ + skuItem.setErrMsg(skuItem.getErrMsg()==null?"无匹配SKU"+skuItem.getSpuCode()+"编码产品,更新失败;":skuItem.getErrMsg()+"\n无匹配编码产品,更新失败;"); + throwEx = true; + continue; + } + + if(UPDATE.equals(opt)){ + //更新 + if(sku==null){ + skuItem.setErrMsg(skuItem.getErrMsg()==null?"无匹配编码产品,更新失败;":skuItem.getErrMsg()+"\n无匹配编码产品,更新失败;"); + throwEx = true; + continue; + } + GoodsSku goodsSku = buildByImportItem(skuItem); + goodsSku.setId(sku.getId()); + + if(spu!=null){ + goodsSku.setSpuId(spu.getId()); + goodsSku.setBookName(spu.getBookName()); + goodsSku.setBookBelong(spu.getBookBelong()); + } + goodsSkuService.updateById(goodsSku); + }else if (SAVE.equals(opt)){ + //保存 + if(sku!=null){ + skuItem.setErrMsg(skuItem.getErrMsg()==null?"编码重复,新增失败;":skuItem.getErrMsg()+"\n编码重复,新增失败;"); + throwEx = true; + continue; + } + if(spu==null){ + skuItem.setErrMsg(skuItem.getErrMsg()==null?"SKU不存在,新增失败;":skuItem.getErrMsg()+"\nSKU不存在,新增失败;"); + throwEx = true; + continue; + } + GoodsSku addSku = buildByImportItem(skuItem); + addSku.setSpuId(spu.getId()); + addSku.setBookName(spu.getBookName()); + addSku.setBookBelong(spu.getBookBelong()); + goodsSkuService.save(addSku); + } + } + for (GoodsSpu spu : spuList) { + goodsSpuService.updateOnlineOfflineFlat(spu.getId()); + } + if(throwEx){ + return R.ok(param.getSkuList(),"错误数据"); + } + return R.ok(); + } + + private GoodsSku buildByImportItem(GoodsSkuImportBo.SkuItem skuItem){ + GoodsSku udpSku = new GoodsSku(); + udpSku.setSkuCode(skuItem.getSkuCode()); + udpSku.setSkuName(skuItem.getSkuName()); + udpSku.setSalesPrice(skuItem.getSalesPrice()); + udpSku.setMarketPrice(skuItem.getSalesPrice()); + udpSku.setCostPrice(skuItem.getSalesPrice()); + udpSku.setStock(skuItem.getStock()); + udpSku.setWeight(skuItem.getWeight()); + udpSku.setVolume(skuItem.getVolume()); + udpSku.setMinPurchase(skuItem.getMinPurchase()); + udpSku.setOrderFlag(skuItem.getOrderFlag()); + udpSku.setSpecialFlag(skuItem.getSpecialFlag()); + udpSku.setCostFlag(skuItem.getCostFlag()); + udpSku.setCostPrice(skuItem.getCostPrice()); + udpSku.setMarketPrice(skuItem.getMarketPrice()); + udpSku.setBelong(skuItem.getBelong()); + udpSku.setWrapVal(skuItem.getWrapVal()); + udpSku.setTasteVal(skuItem.getTasteVal()); + udpSku.setSpecInfos(skuItem.getBelong()+";"+skuItem.getTasteVal()+";"+skuItem.getWrapVal()); + udpSku.setRemark(skuItem.getRemark()); + udpSku.setEnable(skuItem.getEnable()); + udpSku.setInvUnitWeight(skuItem.getInvUnitWeight()); + return udpSku; + } + + private GoodsSku selectSku( List skuList, String skuCode){ + if(skuCode!=null){ + for (GoodsSku goodsSku : skuList) { + if(goodsSku.getSkuCode()==null){ + continue; + } + if(goodsSku.getSkuCode().equals(skuCode)){ + return goodsSku; + } + } + } + return null; + } + + private GoodsSpu selectSpu( List spuList, String skuCode){ + if(skuCode!=null){ + for (GoodsSpu goodsSpu : spuList) { + if(goodsSpu.getSpuCode().equals(skuCode)){ + return goodsSpu; + } + } + } + return null; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuSpecValueController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuSpecValueController.java new file mode 100644 index 0000000..1c3b691 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSkuSpecValueController.java @@ -0,0 +1,103 @@ +package com.qs.serve.modules.goods.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.goods.entity.GoodsSkuSpecValue; +import com.qs.serve.modules.goods.service.GoodsSkuSpecValueService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 商品 sku规格值 + * @author YenHex + * @since 2022-10-09 + */ +//@Slf4j +//@AllArgsConstructor +//@RestController +//@RequestMapping("goods/skuSpecValue") +public class GoodsSkuSpecValueController { + + private GoodsSkuSpecValueService goodsSkuSpecValueService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('goods:skuSpecValue:query')") + public R> getPage(GoodsSkuSpecValue param){ + PageUtil.startPage(); + LambdaQueryWrapper skuSpecValueWrapper = new LambdaQueryWrapper<>(param); + List list = goodsSkuSpecValueService.list(skuSpecValueWrapper); + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.GOODS, title = "sku规格值", biz = BizType.QUERY) + @PreAuthorize("hasRole('goods:skuSpecValue:query')") + public R getById(@PathVariable("id") String id){ + GoodsSkuSpecValue goodsSkuSpecValue = goodsSkuSpecValueService.getById(id); + return R.ok(goodsSkuSpecValue); + } + + + + /** + * 根据ID更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.GOODS, title = "sku规格值", biz = BizType.UPDATE) + @PreAuthorize("hasRole('goods:skuSpecValue:update')") + public R updateById(@RequestBody @Valid GoodsSkuSpecValue param){ + boolean result = goodsSkuSpecValueService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增sku规格值 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.GOODS, title = "sku规格值", biz = BizType.INSERT) + @PreAuthorize("hasRole('goods:skuSpecValue:insert')") + public R save(@RequestBody @Valid GoodsSkuSpecValue param){ + boolean result = goodsSkuSpecValueService.save(param); + return R.isTrue(result); + } + + /** + * 删除sku规格值 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.GOODS, title = "sku规格值", biz = BizType.DELETE) + @PreAuthorize("hasRole('goods:skuSpecValue:delete')") + public R deleteById(@PathVariable("id") String id){ + boolean result = goodsSkuSpecValueService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpecController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpecController.java new file mode 100644 index 0000000..1277fca --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpecController.java @@ -0,0 +1,103 @@ +package com.qs.serve.modules.goods.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.goods.entity.GoodsSpec; +import com.qs.serve.modules.goods.service.GoodsSpecService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 商品 规格 + * @author YenHex + * @since 2022-10-09 + */ +//@Slf4j +//@AllArgsConstructor +//@RestController +//@RequestMapping("goods/spec") +public class GoodsSpecController { + + private GoodsSpecService goodsSpecService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('goods:spec:query')") + public R> getPage(GoodsSpec param){ + PageUtil.startPage(); + LambdaQueryWrapper specWrapper = new LambdaQueryWrapper<>(param); + List list = goodsSpecService.list(specWrapper); + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.GOODS, title = "规格", biz = BizType.QUERY) + @PreAuthorize("hasRole('goods:spec:query')") + public R getById(@PathVariable("id") String id){ + GoodsSpec goodsSpec = goodsSpecService.getById(id); + return R.ok(goodsSpec); + } + + + + /** + * 根据ID更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.GOODS, title = "规格", biz = BizType.UPDATE) + @PreAuthorize("hasRole('goods:spec:update')") + public R updateById(@RequestBody @Valid GoodsSpec param){ + boolean result = goodsSpecService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增规格 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.GOODS, title = "规格", biz = BizType.INSERT) + @PreAuthorize("hasRole('goods:spec:insert')") + public R save(@RequestBody @Valid GoodsSpec param){ + boolean result = goodsSpecService.save(param); + return R.isTrue(result); + } + + /** + * 删除规格 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.GOODS, title = "规格", biz = BizType.DELETE) + @PreAuthorize("hasRole('goods:spec:delete')") + public R deleteById(@PathVariable("id") String id){ + boolean result = goodsSpecService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpecValueController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpecValueController.java new file mode 100644 index 0000000..2c1093d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpecValueController.java @@ -0,0 +1,154 @@ +package com.qs.serve.modules.goods.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSkuSpecValue; +import com.qs.serve.modules.goods.entity.GoodsSpec; +import com.qs.serve.modules.goods.service.GoodsSkuSpecValueService; +import com.qs.serve.modules.goods.service.GoodsSpecService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.goods.entity.GoodsSpecValue; +import com.qs.serve.modules.goods.service.GoodsSpecValueService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 商品 规格值 + * @author YenHex + * @since 2022-10-09 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/specValue") +public class GoodsSpecValueController { + + private GoodsSpecService goodsSpecService; + private GoodsSpecValueService goodsSpecValueService; + private GoodsSkuSpecValueService goodsSkuSpecValueService; + + /** + * 规格 列表 + * @param param + * @return + */ + @GetMapping("/specList") + @PreAuthorize("hasRole('goods:specValue:query')") + public R> getPage(GoodsSpec param){ + LambdaQueryWrapper specWrapper = new LambdaQueryWrapper<>(param); + List list = goodsSpecService.list(specWrapper); + return R.ok(list); + } + + /** + * 规格值 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('goods:specValue:query')") + public R> getPage(GoodsSpecValue param){ + List specs = goodsSpecService.list(); + PageUtil.startPage(); + LambdaQueryWrapper specValueWrapper = new LambdaQueryWrapper<>(param); + List list = goodsSpecValueService.list(specValueWrapper); + for (GoodsSpecValue specValue : list) { + for (GoodsSpec spec : specs) { + if(specValue.getSpecId().equals(spec.getId())){ + specValue.setSpecName(spec.getName()); + break; + } + } + } + return R.byPageHelperList(list); + } + + /** + * 规格值 列表 + * @apiNote 可传入specId进行过滤 + * @param param + * @return + */ + @GetMapping("/list") + @PreAuthorize("hasRole('goods:specValue:query')") + public R> getList(GoodsSpecValue param){ + LambdaQueryWrapper specValueWrapper = new LambdaQueryWrapper<>(param); + List list = goodsSpecValueService.list(specValueWrapper); + return R.ok(list); + } + + /** + * 规格值 ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.GOODS, title = "规格值", biz = BizType.QUERY) + @PreAuthorize("hasRole('goods:specValue:query')") + public R getById(@PathVariable("id") String id){ + GoodsSpecValue goodsSpecValue = goodsSpecValueService.getById(id); + return R.ok(goodsSpecValue); + } + + /** + * 规格值 ID更新 + * @param param + * @return + */ + //@PostMapping("/updateById") + @SysLog(module = SystemModule.GOODS, title = "规格值", biz = BizType.UPDATE) + @PreAuthorize("hasRole('goods:specValue:update')") + public R updateById(@RequestBody @Valid GoodsSpecValue param){ + boolean result = goodsSpecValueService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 规格值 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.GOODS, title = "规格值", biz = BizType.INSERT) + @PreAuthorize("hasRole('goods:specValue:insert')") + public R save(@RequestBody @Valid GoodsSpecValue param){ + if(param.getSpecId().equals(3L)){ + return R.error("产地规格不支持新增"); + } + boolean result = goodsSpecValueService.save(param); + return R.isTrue(result); + } + + /** + * 删除 规格值 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.GOODS, title = "规格值", biz = BizType.DELETE) + @PreAuthorize("hasRole('goods:specValue:delete')") + public R deleteById(@PathVariable("id") Long id){ + //含有正在使用的商品无法删除 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsSkuSpecValue::getSpecValueId,id); + long count = goodsSkuSpecValueService.count(lqw); + if(count>0L){ + return R.error("规格值使用中,删除失败"); + } + boolean result = goodsSpecValueService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuController.java new file mode 100644 index 0000000..b1fd788 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuController.java @@ -0,0 +1,604 @@ +package com.qs.serve.modules.goods.controller; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.github.pagehelper.PageHelper; +import com.qs.serve.common.config.DevEnvironmentConfig; +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.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.tag.util.TagFiledUtil; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.common.BookAccountUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper; +import com.qs.serve.modules.goods.common.GoodsConst; +import com.qs.serve.modules.goods.entity.*; +import com.qs.serve.modules.goods.entity.dto.GoodsAccrIdsDto; +import com.qs.serve.modules.goods.entity.dto.GoodsRuleItemDTO; +import com.qs.serve.modules.goods.entity.dto.InventoryCusPrice; +import com.qs.serve.modules.goods.entity.so.GoodsHisOrderQuery; +import com.qs.serve.modules.goods.entity.so.InventoryCusPriceQuery; +import com.qs.serve.modules.goods.entity.vo.GoodsSpuExportVo; +import com.qs.serve.modules.goods.entity.vo.GoodsSpuVo; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.mapper.GoodsSpuMapper; +import com.qs.serve.modules.goods.service.*; +import com.qs.serve.modules.oms.entity.dto.OmsSpuToSkuKey; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.service.TbsActivityGoodsService; +import com.qs.serve.modules.tbs.service.TbsBudgetConditionService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.time.LocalDate; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 商品SPU 查询相关接口 + * @author YenHex + * @since 2022-10-09 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/spu") +public class GoodsSpuController { + + private GoodsSpuMapper goodsSpuMapper; + private GoodsSkuMapper goodsSkuMapper; + private GoodsRuleService goodsRuleService; + private GoodsSkuService goodsSkuService; + private GoodsSpuService goodsSpuService; + private GoodsSpuSpecService goodsSpuSpecService; + private GoodsSkuSpecValueService goodsSkuSpecValueService; + private GoodsCategoryRuleService goodsCategoryRuleService; + private TbsActivityGoodsService activityGoodsService; + private TbsBudgetConditionService budgetConditionService; + private BmsSupplierService bmsSupplierService; + private GoodsCategoryService goodsCategoryService; + private SeeYonRequestBaseService seeYonRequestBaseService; + private ErpDispatchDataMapper dispatchDataMapper; + private GoodsAccreditService goodsAccreditService; + private GoodsCustomerPriceService goodsCustomerPriceService; + + + + /** + * 翻页搜索 + * @param param + * @return + */ + @GetMapping("/list") + @PreAuthorize("hasRole('goods:spu:query')") + public R> getList(GoodsSpu param){ + List spuList = goodsSpuService.selectSpuList(param); + return R.ok(spuList); + } + + /** + * 翻页搜索(组件接口) + * @param param + * @return + */ + @GetMapping("/shelfPage") + public R> getShelfPage(GoodsSpu param){ + param.setShelf(1); + return this.getPage(param); + } + + /** + * spu下单查询(已弃用) + * @param param + * @return + */ + //@GetMapping("/shelfPageToSku") + public R> shelfPageToSku(GoodsSpu param){ + PageVo result = this.getShelfPage(param).getData(); + List goodsSpuList = this.buildGoodsSpuInfo(param.getSupplierCode(),param.getSelectSpecialFlag(), result.getList()); + result.setList(goodsSpuList); + return R.ok(result); + } + + /** + * spu下单查询 + * @param param + * @return + */ + @GetMapping("/getSkuJoinSpuList") + public R> getSkuJoinSpuList(GoodsSpu param){ + GoodsCategoryRule categoryRule = goodsCategoryRuleService.getById(param.getSearchCateRuleId()); + if(categoryRule!=null&&categoryRule.getIgnoreBrandIds()!=null&&categoryRule.getIgnoreBrandIds().length>0){ + param.setSelectNotIntCateIds(Arrays.asList(categoryRule.getIgnoreBrandIds())); + log.warn("setSelectNotIntCateIds {}",JsonUtil.objectToJson(param)); + } + BmsSupplier supplier = bmsSupplierService.getByNameOrCode(param.getSupplierCode()); + if(supplier==null){ + return R.error("供应商不存在或停用"); + } + + //客户规则设置 + String userId = AuthContextUtils.getSysUserId(); + this.toSetSpuParam(param, supplier,userId); + //产品规则设置 + this.tiSetSpuParam2(param, supplier); + + if(DevEnvironmentConfig.OPEN_TENANT_BOOK){ + param.setBookCodeList(BookAccountUtil.getCurrentUserAccount()); + } + + Long total = goodsSpuService.selectCountSkuJoinSpuList(param); + if(total<1){ + return R.byEmptyList(); + } + List list = goodsSpuService.selectSkuJoinSpuList(param); + for (GoodsSpu spu : list) { + spu.setUuid(spu.getId()+"_"+spu.getSkuId()); + } + List skuCodes = list.stream().map(GoodsSpu::getSkuCode).collect(Collectors.toList()); + if(CollUtil.isNotEmpty(skuCodes)){ + this.initSpuWithCustomerPrice(param.getSupplierCode(), list, skuCodes); + } + return R.byPageList(total,list); + } + + private void tiSetSpuParam2(GoodsSpu param, BmsSupplier supplier) { + GoodsAccrIdsDto accrIdsDto = goodsAccreditService + .listIgnoreAcc2(supplier.getId(), supplier.listBizRegionIds(), supplier.listSaleRegionIds()); + param.setSubAccInfo(accrIdsDto); +// List ids = goodsSkuMapper.listByOtherIds( +// accrIdsDto.getCateIds(), +// accrIdsDto.getSpuIds(), +// accrIdsDto.getSkuIds(), +// accrIdsDto.getNotInCateIds(), +// accrIdsDto.getNotInSpuIds(), +// accrIdsDto.getNotInSkuIds() +// ); +// param.setNotInSkuIds(ids); + + } + + /** + * 设置Spu查询条件 + * @param param + * @param supplier + */ + private void toSetSpuParam(GoodsSpu param, BmsSupplier supplier,String userId) { + + //用户维度的客户规则 + List userRules = goodsRuleService.listByUserId(userId); + List ruleItems = goodsRuleService.listBySupplierId(supplier.getId()); + if(userRules!=null){ + if(ruleItems!=null){ + ruleItems.addAll(userRules); + }else { + ruleItems = userRules; + } + } + GoodsRuleItemDTO ruleItemDTO = goodsRuleService.buildGoodsRuleItemDTO(ruleItems); + if(ruleItemDTO!=null){ + + if(ruleItemDTO.getNotInCategoryIds()!=null){ + if(CollUtil.isEmpty(param.getSelectNotIntCateIds())){ + param.setSelectNotIntCateIds(ruleItemDTO.getNotInCategoryIds()); + }else{ + // 原方法报错 + //param.getSelectNotIntCateIds().addAll(ruleItemDTO.getNotInCategoryIds()); + // 新的方法 + List tmp = new ArrayList<>(); + for (String id : param.getSelectNotIntCateIds()) { + tmp.add(id); + } + for (String id : ruleItemDTO.getNotInCategoryIds()) { + tmp.add(id); + } + param.setSelectNotIntCateIds(tmp); + + } + } + + if(CollUtil.isNotEmpty(ruleItemDTO.getOnlyCategoryIds())){ + if (CollUtil.isEmpty(param.getSelectCateIds())){ + param.setSelectCateIds(ruleItemDTO.getOnlyCategoryIds()); + }else{ + List onlyIds = ruleItemDTO.getOnlyCategoryIds(); + List onlyCategoryList = goodsCategoryService.listByIds(onlyIds); + for (GoodsCategory category : onlyCategoryList) { + List childList = goodsCategoryService.list(new LambdaQueryWrapper() + .likeRight(GoodsCategory::getLevelPath,category.getLevelPath()+"_")); + if(CollUtil.isNotEmpty(childList)){ + List childIds = childList.stream().map(a->a.getId().toString()).collect(Collectors.toList()); + onlyIds.addAll(childIds); + } + } + List selectCateIds = param.getSelectCateIds(); + List goodsCategoryList = goodsCategoryService.listByIds(selectCateIds); + for (GoodsCategory category : goodsCategoryList) { + List childList = goodsCategoryService.list(new LambdaQueryWrapper() + .likeRight(GoodsCategory::getLevelPath,category.getLevelPath()+"_")); + if(CollUtil.isNotEmpty(childList)){ + List childIds = childList.stream().map(a->a.getId().toString()).collect(Collectors.toList()); + selectCateIds.addAll(childIds); + } + } + //交集 + Collection ids = cn.hutool.core.collection.CollectionUtil + .intersection(onlyIds, selectCateIds); + List idsList = new ArrayList<>(); + idsList.addAll(ids); + idsList.add("#"); + param.setSelectCateIds(idsList); + } + } + + if(CollUtil.isNotEmpty(ruleItemDTO.getOnlySpuIds())){ + if (CollUtil.isEmpty(param.getSelectIds())){ + List ids = ruleItemDTO.getOnlySpuIds().stream() + .filter(Objects::nonNull).map(Long::parseLong).collect(Collectors.toList()); + param.setSelectIds(ids); + }else{ + List ids = ruleItemDTO.getOnlySpuIds().stream() + .filter(Objects::nonNull).map(Long::parseLong).collect(Collectors.toList()); + //交集 + Collection id2s = cn.hutool.core.collection.CollectionUtil + .intersection(ids, param.getSelectIds()); + List idsList = new ArrayList<>(); + idsList.addAll(id2s); + idsList.add(-1L); + param.setSelectIds(idsList); + } + } + + if(CollUtil.isNotEmpty(ruleItemDTO.getNotInSpuIds())){ + if (CollUtil.isEmpty(param.getSelectNotInIds())){ + List ids = ruleItemDTO.getNotInSpuIds().stream() + .filter(Objects::nonNull).map(Long::parseLong).collect(Collectors.toList()); + param.setSelectNotInIds(ids); + }else{ + List ids = ruleItemDTO.getNotInSpuIds().stream() + .filter(Objects::nonNull).map(Long::parseLong).collect(Collectors.toList()); + param.getSelectNotInIds().addAll(ids); + } + } + + } + } + + /** + * 初始化spu的客户价格 + * @param cusCode + * @param list + * @param skuCodes + */ + private void initSpuWithCustomerPrice(String cusCode, List list, List skuCodes) { + List cusPriceList = this.getInventoryCusPrices(cusCode, skuCodes); + List skus = goodsSkuService.getByCodes(skuCodes); + for (GoodsSpu spu : list) { + for (GoodsSku sku : skus) { + if(sku.getSpuId().equals(spu.getId())){ + spu.setSkuAddCode(sku.getSkuAddCode()); + } + } + } + if(cusPriceList!=null){ + for (InventoryCusPrice cusPrice : cusPriceList) { + for (GoodsSpu spu : list) { + if(cusPrice.getInvCode().equals(spu.getSkuCode())){ + spu.setSkuPrice(cusPrice.getPrice()); + break; + } + } + } + } + + } + + + /** + * 获取最近两个月发货spu + * @param query + * @return + */ + @PostMapping("listLast2Month") + public R> listLast2Month(@RequestBody @Valid GoodsHisOrderQuery query){ + LocalDate date = LocalDate.now().plusMonths(-3); + List invCodes = dispatchDataMapper.selectLast2MonthInvCode(date,query.getSupplierCode()); + if(CollectionUtil.isNotEmpty(invCodes)){ + LambdaQueryWrapper skuLqw = new LambdaQueryWrapper<>(); + skuLqw.in(GoodsSku::getSkuCode,invCodes); + skuLqw.and(an->{ + an.eq(GoodsSku::getSpecialFlag,1).or().eq(GoodsSku::getOrderFlag,1); + }); + List goodsSkus = goodsSkuService.list(skuLqw); + + List spuIds = goodsSkus.stream().map(GoodsSku::getSpuId).distinct().collect(Collectors.toList()); + List spuSpecIds = goodsSkus.stream().filter(a->a.getSpecialFlag()!=null + &&a.getSpecialFlag().equals(1)).map(GoodsSku::getSpuId).distinct().collect(Collectors.toList()); + spuSpecIds.add(-1L); + spuIds.add(-1L); + + LambdaQueryWrapper spuLqw = new LambdaQueryWrapper<>(); + spuLqw.in(GoodsSpu::getId,spuIds); + spuLqw.eq(GoodsSpu::getShelf,1); + spuLqw.and(an->{ + an.eq(GoodsSpu::getOrderFlag,1) + .or().in(GoodsSpu::getId,spuSpecIds); + }); + spuLqw.eq(GoodsSpu::getOrderFlag,1); + if(CollectionUtil.isNotEmpty(query.getCateIds())){ + spuLqw.and(an->{ + an.in(GoodsSpu::getCategoryFirst,query.getCateIds()) + .or().in(GoodsSpu::getCategorySecond,query.getCateIds()) + .or().in(GoodsSpu::getCategoryThird,query.getCateIds()); + }); + } + + List goodsSpuList = goodsSpuService.list(spuLqw); + List resultSpuList = new ArrayList<>(); + for (GoodsSku sku : goodsSkus) { + GoodsSpu spu = null; + for (GoodsSpu goodsSpu : goodsSpuList) { + if(goodsSpu.getId().equals(sku.getSpuId())){ + spu = goodsSpu; + break; + } + } + if(spu==null){ + log.warn("无法匹配spuId skuCode:{}",sku.getSkuCode()); + continue; + } + GoodsCategory cate1 = goodsCategoryService.getById(spu.getCategoryFirst()); + if(cate1!=null){ + spu.setCateFirstLabel(cate1.getName()); + } + GoodsCategory cate2 = goodsCategoryService.getById(spu.getCategorySecond()); + if(cate2!=null){ + spu.setCateSecondLabel(cate2.getName()); + } + GoodsCategory cate3 = goodsCategoryService.getById(spu.getCategoryThird()); + if(cate3!=null){ + spu.setCateThirdLabel(cate3.getName()); + } + + spu.toSetSkuInfo(sku); + spu.setSkuSpecialFlag(sku.getSpecialFlag()); + resultSpuList.add(spu); + } + this.initSpuWithCustomerPrice(query.getSupplierCode(), resultSpuList,invCodes); + return R.ok(resultSpuList); + } + return R.ok(new ArrayList<>()); + } + + /** + * 翻页搜索(组件接口) + * @apiNote 用于加载模板选中的商品 + * @param param + * @return + */ + @PostMapping("/shelfPageByParam") + public R> shelfPageByParam(@RequestBody GoodsSpu param){ + if(CollectionUtil.isEmpty(param.getSelectIds())){ + return R.ok(); + } + param.setShelf(1); + List list = goodsSpuService.selectSpuList(param); + list.forEach(a->{ + if(StringUtils.hasText(a.getCategoryFirst())){ + GoodsCategory first = goodsCategoryService.getById(a.getCategoryFirst()); + if (first!=null) {a.setCateFirstLabel(first.getName());} + } + if(StringUtils.hasText(a.getCategorySecond())){ + GoodsCategory second = goodsCategoryService.getById(a.getCategorySecond()); + if (second!=null) {a.setCateSecondLabel(second.getName());} + } + if(StringUtils.hasText(a.getCategoryThird())){ + GoodsCategory third = goodsCategoryService.getById(a.getCategoryThird()); + if (third!=null) {a.setCateThirdLabel(third.getName());} + } + }); + return R.ok(list); + } + + /** + * 翻页搜索(管理) + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('goods:spu:query')") + public R> getPage(GoodsSpu param){ + + if(DevEnvironmentConfig.OPEN_TENANT_BOOK){ + param.setBookCodeList(BookAccountUtil.getCurrentUserAccount()); + } + + PageUtil.startPage(); + List list = goodsSpuService.selectSpuList(param); +// for (GoodsSpu goodsSpu : list) { +// LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); +// lqw.eq(GoodsSku::getSpuId,goodsSpu.getId()); +// goodsSkuService.list(lqw); +// } + return R.byPageHelperList(list); + } + + /** + * 翻页搜索(管理) post使用tagQueryList + * @param param + * @return + */ + @PostMapping("/pageByPost") + @PreAuthorize("hasRole('goods:spu:query')") + public R> getPageByPost(@RequestBody + GoodsSpu param){ + if(DevEnvironmentConfig.OPEN_TENANT_BOOK){ + param.setBookCodeList(BookAccountUtil.getCurrentUserAccount()); + } + PageHelper.startPage(param.getPageNum(),param.getPageSize()); + TagFiledUtil.GoodsSpuPage(param); + List list = goodsSpuService.selectSpuList(param); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.GOODS, title = "spu", biz = BizType.QUERY) + @PreAuthorize("hasRole('goods:spu:query')") + public R getById(@PathVariable("id") Long id){ + GoodsSpuVo goodsSpu = goodsSpuService.getVoById(id,null); + return R.ok(goodsSpu); + } + + /** + * 导出 + * @param param + * @return + */ + @PostMapping("/export") + public R> export4Post(@RequestBody GoodsSpu param){ + return this.export(param); + } + + /** + * 导出 + * @param param + * @return + */ + @GetMapping("/export") + public R> export(GoodsSpu param){ + if(DevEnvironmentConfig.OPEN_TENANT_BOOK){ + param.setBookCodeList(BookAccountUtil.getCurrentUserAccount()); + } + List list = goodsSpuService.selectSpuList(param); + List exportVoList = list.stream().map(a->{ + GoodsSpuExportVo vo = CopierUtil.copy(a,new GoodsSpuExportVo()); +// vo.setId(a.getId()); +// vo.setSpuCode(a.getSpuCode()); +// vo.setName(a.getName()); +// vo.setShelf(a.getShelf()); +// vo.setOrderFlag(a.getOrderFlag()); +// vo.setCostFlag(a.getCostFlag()); +// vo.setGoodsSaleType(a.getGoodsSaleType()); +// vo.setSpuCunhuoFlag(a.getSpuCunhuoFlag()); + vo.setCateCode(a.getCateThirdCode()); + vo.setCateName(a.getCateThirdLabel()); +// vo.setSaleNum(a.getSaleNum()); +// vo.setTasteValue(a.getTasteValue()); +// vo.setSkuNumVal(a.getSkuNumVal()); +// vo.setBookBelong(a.getBookBelong()); +// vo.setBookName(a.getBookName()); +// vo.setCateFirstLabel(a.getCateFirstLabel()); +// vo.setCateSecondLabel(a.getCateSecondLabel()); +// vo.setCateThirdLabel(a.getCateThirdLabel()); + return vo; + }).collect(Collectors.toList()); + return R.ok(exportVoList); + } + + /** + * 封装通用的spu信息(客户特殊价,转换并关联开平产SKU) + * @param supplierCode 客户编码 + * @param selectSpecialFlag 兼容特殊sku + * @param goodsSpuList + * @return + */ + @NotNull + private List buildGoodsSpuInfo(String supplierCode,Integer selectSpecialFlag, List goodsSpuList) { + List spuCodes = goodsSpuList.stream().map(GoodsSpu::getSpuCode).collect(Collectors.toList()); + List toSkuKeys = goodsSpuService.getSpuToSkuInfo(GoodsConst.DEFAULT_PlaCE,spuCodes); + List skuCodes = toSkuKeys.stream().map(OmsSpuToSkuKey::getInvCode).collect(Collectors.toList()); + + List inventoryCusPrices = getInventoryCusPrices(supplierCode, skuCodes); + + for (GoodsSpu spu : goodsSpuList) { + spu.setUuid(spu.getId()+"_"+spu.getSkuId()); + //兼容特殊sku + if(selectSpecialFlag!=null&& selectSpecialFlag.equals(1)){ + if(!spu.getSpecialSkuId().equals(0L)){ + GoodsSku goodsSku = goodsSkuService.getById(spu.getSpecialSkuId()); + spu.setSkuId(goodsSku.getId()); + spu.setSkuCode(goodsSku.getSkuCode()); + spu.setSkuName(goodsSku.getSkuName()); + spu.setSkuPrice(goodsSku.getSalesPrice()); + spu.setVolume(goodsSku.getVolume().toString()); + spu.setWeight(goodsSku.getWeight().toString()); + continue; + } + } + for (OmsSpuToSkuKey skuKey : toSkuKeys) { + if(spu.getSpuCode().equals(skuKey.getSkuCode())){ + GoodsSku goodsSku = goodsSkuService.getByCode(skuKey.getInvCode()); + spu.setSkuCode(goodsSku.getSkuCode()); + spu.setSkuId(goodsSku.getId()); + spu.setSkuName(goodsSku.getSkuName()); + spu.setSkuPrice(goodsSku.getSalesPrice()); + spu.setVolume(goodsSku.getVolume().toString()); + spu.setWeight(goodsSku.getWeight().toString()); + if(inventoryCusPrices!=null){ + for (InventoryCusPrice cusPrice : inventoryCusPrices) { + if(cusPrice.getPrice()!=null&&cusPrice.getInvCode().equals(skuKey.getInvCode())){ + spu.setSkuPrice(cusPrice.getPrice()); + break; + } + } + } + break; + } + } + } + return goodsSpuList; + } + + /** + * 获取客户特殊价格 + * @param supplierCode + * @param skuCodes + * @return + */ + @Nullable + private List getInventoryCusPrices(String supplierCode, List skuCodes) { + List inventoryCusPrices = null; + try { + if(skuCodes.size()>0){ +// +// List customerPrices = goodsCustomerPriceService.getBySupplierCodeAndCode(supplierCode,skuCodes); +// return customerPrices.stream().map(obj->{ +// InventoryCusPrice cusPrice = new InventoryCusPrice(); +// cusPrice.setCusCode(supplierCode); +// cusPrice.setInvCode(obj.getSkuCode()); +// cusPrice.setPrice(obj.getRealPrice()); +// return cusPrice; +// }).collect(Collectors.toList()); + + InventoryCusPriceQuery query = new InventoryCusPriceQuery(); + query.setCusCode(supplierCode); + query.setInvCodes(skuCodes); + R res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); + if(res.getStatus().equals(200)){ + inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); + } + } + } catch (Exception e) { + log.error("客户特殊价异常:{}",e.getMessage()); + } + return inventoryCusPrices; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuOptionController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuOptionController.java new file mode 100644 index 0000000..8048208 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuOptionController.java @@ -0,0 +1,370 @@ +package com.qs.serve.modules.goods.controller; + +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.model.annotation.SysLog; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.enums.BizType; +import com.qs.serve.common.model.enums.SystemModule; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper; +import com.qs.serve.modules.goods.entity.*; +import com.qs.serve.modules.goods.entity.bo.GoodsSpuBo; +import com.qs.serve.modules.goods.entity.bo.GoodsSpuImportBo; +import com.qs.serve.modules.goods.entity.bo.GoodsSpuStateBo; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.mapper.GoodsSpuMapper; +import com.qs.serve.modules.goods.service.*; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.service.TbsActivityGoodsService; +import com.qs.serve.modules.tbs.service.TbsBudgetConditionService; +import io.netty.util.internal.StringUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 商品SPU 操作层接口 + * @author YenHex + * @since 2022-10-09 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/spu") +public class GoodsSpuOptionController { + + private GoodsSpuMapper goodsSpuMapper; + private GoodsSkuMapper goodsSkuMapper; + private GoodsRuleService goodsRuleService; + private GoodsSkuService goodsSkuService; + private GoodsSpuService goodsSpuService; + private GoodsSpuSpecService goodsSpuSpecService; + private GoodsSkuSpecValueService goodsSkuSpecValueService; + private GoodsCategoryRuleService goodsCategoryRuleService; + private TbsActivityGoodsService activityGoodsService; + private TbsBudgetConditionService budgetConditionService; + private BmsSupplierService bmsSupplierService; + private GoodsCategoryService goodsCategoryService; + private SeeYonRequestBaseService seeYonRequestBaseService; + private ErpDispatchDataMapper dispatchDataMapper; + private GoodsAccreditService goodsAccreditService; + private GoodsCustomerPriceService goodsCustomerPriceService; + + + + /** + * 商品上下架 + * @param spuId + * @param shelf + * @return + */ + @GetMapping("/shelf") + @SysLog(module = SystemModule.GOODS, title = "spu", biz = BizType.UPDATE) + @PreAuthorize("hasRole('goods:spu:update')") + public R updateById(Long spuId,Integer shelf){ + GoodsSpu goodsSpu = new GoodsSpu(); + goodsSpu.setId(spuId); + goodsSpu.setShelf(shelf); + goodsSpuService.updateById(goodsSpu); + return R.ok(); + } + + /** + * 商品上下架,可下单状态,可投放费用状态(批量) + * @param param + * @return + */ + @PostMapping("/updateStateBatch") + @SysLog(module = SystemModule.GOODS, title = "spu", biz = BizType.UPDATE) + public R updateShelfBatch(@RequestBody GoodsSpuStateBo param){ + param.initProp(); + GoodsSpu goodsSpu = new GoodsSpu(); + goodsSpu.setShelf(param.getShelfState()); + goodsSpu.setOrderFlag(param.getOrderFlag()); + goodsSpu.setCostFlag(param.getCostFlag()); + goodsSpu.setOrderOfflineFlag(param.getOrderOfflineFlag()); + goodsSpu.setOrderOnlineFlag(param.getOrderOnlineFlag()); + goodsSpuService.update(goodsSpu,new LambdaQueryWrapper() + .in(GoodsSpu::getId,param.getSpuIds())); + return R.ok(); + } + + + /** + * 翻页搜索 + * @return + */ + @GetMapping("/initSkuNum") + public R> initSkuNum(){ + goodsSpuService.initSkuNum(); + return R.ok(); + } + + + /** + * 更新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); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.GOODS, title = "spu", biz = BizType.DELETE) + @PreAuthorize("hasRole('goods:spu:delete')") + public R deleteById(@PathVariable("id") Long id){ + QueryWrapper lqw1 = new QueryWrapper<>(); + lqw1.in("target_type", TbsGoodsType.spu.name()); + lqw1.eq("target_id",id); + if(activityGoodsService.count(lqw1)>0){ + return R.error("活动含有当前商品,删除失败"); + } + if(budgetConditionService.count(lqw1)>0){ + return R.error("预算含有当前商品,删除失败"); + } + goodsSpuMapper.updateSpuCodeAndDelFlag(id,IdUtil.timeStampId()); + //删除商品规格 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsSpuSpec::getSpuId,id); + goodsSpuSpecService.remove(lqw); + //删除商品规格值 + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(); + lqw2.eq(GoodsSkuSpecValue::getSpuId,id); + goodsSkuSpecValueService.remove(lqw2); + //删除商品sku + LambdaQueryWrapper lqw3 = new LambdaQueryWrapper<>(); + lqw3.eq(GoodsSku::getSpuId,id); + goodsSkuService.remove(lqw3); + return R.ok(); + } + + /** + * 保存 口味品类SPU + * @param param + * @return + */ + @PostMapping("/saveTasteSpu") + @SysLog(module = SystemModule.GOODS, title = "spu", biz = BizType.INSERT) + @PreAuthorize("hasRole('goods:spu:insert')") + public R saveTasteSpu(@RequestBody @Valid GoodsSpuBo param){ + param.setId(null); + if(StringUtil.isNullOrEmpty(param.getCategoryId())){ + return R.error("参数缺少"); + } + return R.ok(goodsSpuService.editTasteSpu(param)); + } + + /** + * 编辑 口味品类SPU + * @param param + * @return + */ + @PostMapping("/updTasteSpu") + @SysLog(module = SystemModule.GOODS, title = "spu", biz = BizType.INSERT) + @PreAuthorize("hasRole('goods:spu:update')") + public R updTasteSpu(@RequestBody @Valid GoodsSpuBo param){ + if(param.getId()==null){ + return R.error(); + } + return R.ok(goodsSpuService.editTasteSpu(param)); + } + + /** + * 导入 + * @param param + * @return + */ + @PostMapping("/importSpu") + @SysLog(module = SystemModule.GOODS, title = "import", biz = BizType.INSERT) + public R importSpu(@RequestBody @Valid GoodsSpuImportBo param){ + final String UPDATE = "2"; + final String DELETE = "3"; + final String SAVE = "1"; + final String NONE = "4"; + + Set spuCodeSet = param.getSpuList().stream() + .map(GoodsSpuImportBo.SpuItem::getSpuCode) + .collect(Collectors.toSet()); + + if(param.getSpuList().size()!=spuCodeSet.size()){ + Assert.throwEx("SKU编码不可重复"); + } + + //导入 + List spuCodes = new ArrayList<>(); + List cateCodes = new ArrayList<>(); + for (GoodsSpuImportBo.SpuItem item : param.getSpuList()) { + spuCodes.add(item.getSpuCode()); + //删除只需要spu编码 + if(StringUtils.hasText(item.getCategoryCode())&&!item.getOpt().equals(DELETE)){ + cateCodes.add(item.getCategoryCode()); + } + } + if(spuCodes.size()<1){ + return R.error("获取SKU编码失败"); + } + LambdaQueryWrapper spuLqw = new LambdaQueryWrapper<>(); + spuLqw.in(GoodsSpu::getSpuCode,spuCodes); + List spuList = goodsSpuService.list(spuLqw); + + List cateList = null; + if(cateCodes.size()>0){ + LambdaQueryWrapper cateLqw = new LambdaQueryWrapper<>(); + cateLqw.in(GoodsCategory::getCode,cateCodes); + cateLqw.eq(GoodsCategory::getLevel,3); + cateList = goodsCategoryService.list(cateLqw); + } + + boolean isError = false; + for (GoodsSpuImportBo.SpuItem item : param.getSpuList()) { + if(item.getOpt().equals(NONE)){ + continue; + } + spuCodes.add(item.getSpuCode()); + //更新或者保存,需要校验类目名称 + if(StringUtils.hasText(item.getCategoryCode())&&!item.getOpt().equals(DELETE)){ + if(cateList==null){ + isError = true; + item.setErrMsg("["+item.getCategoryCode()+"]类目不存在"); + }else { + String cateName = item.getCategoryCode(); + boolean existCate = cateList.stream().anyMatch(a->a.getCode().equals(cateName)); + if(!existCate){ + isError = true; + item.setErrMsg("["+item.getCategoryCode()+"]类目不存在"); + } + } + } + + + String spuCode = item.getSpuCode(); + boolean existSpu = spuList.stream().anyMatch(a->a.getSpuCode().equals(spuCode)); + + if(existSpu&&item.getOpt().equals(SAVE)){ + isError = true; + item.setErrMsg("SKU编码已存在"); + }else if(!existSpu && item.getOpt().equals(UPDATE)){ + 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){ + return R.ok(param,"数据错误"); + } + + List rmIds = new ArrayList<>(); + List spuUpdateList = new ArrayList<>(); + List spuSaveList = new ArrayList<>(); + + for (GoodsSpuImportBo.SpuItem spuItem : param.getSpuList()) { + + if(spuItem.getOpt().equals(SAVE)){ + GoodsSpu goodsSpu = new GoodsSpu(); + goodsSpu.setSpuCode(spuItem.getSpuCode()); + goodsSpu.setName(spuItem.getName()); + //修改类目 + this.toSetSpuCate(cateList, spuItem, goodsSpu); + goodsSpu.setShelf(spuItem.getShelf()); + goodsSpu.setCostFlag(spuItem.getCostFlag()); + goodsSpu.setOrderFlag(spuItem.getOrderFlag()); + goodsSpu.setSpuCunhuoFlag(spuItem.getSpuCunhuoFlag()); + spuSaveList.add(goodsSpu); + continue; + } + + for (GoodsSpu spu : spuList) { + if(spu.getSpuCode().equals(spuItem.getSpuCode())){ + if(spuItem.getOpt().equals(NONE)){ + continue; + } + //删除 + if(spuItem.getOpt().equals(DELETE)){ + rmIds.add(spu.getId()); + continue; + } + //更新start + if(StringUtils.hasText(spuItem.getName())){ + spu.setName(spuItem.getName()); + } + spu.setShelf(spuItem.getShelf()); + spu.setCostFlag(spuItem.getCostFlag()); + spu.setOrderFlag(spuItem.getOrderFlag()); + spu.setSpuCunhuoFlag(spuItem.getSpuCunhuoFlag()); + //修改类目 + this.toSetSpuCate(cateList, spuItem, spu); + //关联 + if(spuItem.getOpt().equals(UPDATE)){ + spuUpdateList.add(spu); + } + } + } + } + if(rmIds.size()>0){ + goodsSpuService.removeBatchByIds(rmIds); + } + if(spuUpdateList.size()>0){ + goodsSpuService.updateBatchById(spuUpdateList); + } + if(spuSaveList.size()>0){ + goodsSpuService.saveBatch(spuSaveList); + } + + return R.ok(); + } + + /** + * 修改类目 + * @param cateList + * @param spuItem + * @param spu + */ + private void toSetSpuCate(List cateList, GoodsSpuImportBo.SpuItem spuItem, GoodsSpu spu) { + if(cateList !=null){ + for (GoodsCategory category : cateList) { + if(category.getCode().equals(spuItem.getCategoryCode())){ + spu.setBookName(category.getBookName()); + spu.setBookBelong(category.getBookBelong()); + String[] cateIds = category.getLevelPath().split("_"); + if(cateIds.length==3){ + spu.setCategoryFirst(cateIds[0]); + spu.setCategorySecond(cateIds[1]); + spu.setCategoryThird(cateIds[2]); + spu.setCategoryLast(cateIds[2]); + } + } + } + } + } + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuSpecController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuSpecController.java new file mode 100644 index 0000000..193d7f0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSpuSpecController.java @@ -0,0 +1,105 @@ +package com.qs.serve.modules.goods.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.modules.goods.entity.GoodsSpec; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.goods.entity.GoodsSpuSpec; +import com.qs.serve.modules.goods.service.GoodsSpuSpecService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 商品 spu规格 + * @author YenHex + * @since 2022-10-09 + */ +//@Slf4j +//@AllArgsConstructor +//@RestController +//@RequestMapping("goods/spuSpec") +public class GoodsSpuSpecController { + + private GoodsSpuSpecService goodsSpuSpecService; + + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('goods:spuSpec:query')") + public R> getPage(GoodsSpuSpec param){ + PageUtil.startPage(); + LambdaQueryWrapper spuSpecWrapper = new LambdaQueryWrapper<>(param); + List list = goodsSpuSpecService.list(spuSpecWrapper); + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.GOODS, title = "spu规格", biz = BizType.QUERY) + @PreAuthorize("hasRole('goods:spuSpec:query')") + public R getById(@PathVariable("id") String id){ + GoodsSpuSpec goodsSpuSpec = goodsSpuSpecService.getById(id); + return R.ok(goodsSpuSpec); + } + + + + /** + * 根据ID更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.GOODS, title = "spu规格", biz = BizType.UPDATE) + @PreAuthorize("hasRole('goods:spuSpec:update')") + public R updateById(@RequestBody @Valid GoodsSpuSpec param){ + boolean result = goodsSpuSpecService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增spu规格 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.GOODS, title = "spu规格", biz = BizType.INSERT) + @PreAuthorize("hasRole('goods:spuSpec:insert')") + public R save(@RequestBody @Valid GoodsSpuSpec param){ + boolean result = goodsSpuSpecService.save(param); + return R.isTrue(result); + } + + /** + * 删除spu规格 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.GOODS, title = "spu规格", biz = BizType.DELETE) + @PreAuthorize("hasRole('goods:spuSpec:delete')") + public R deleteById(@PathVariable("id") String id){ + boolean result = goodsSpuSpecService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSyncController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSyncController.java new file mode 100644 index 0000000..8b259d2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsSyncController.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.goods.controller; + +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.goods.service.GoodsApplicationService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author YenHex + * @since 2023/11/22 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/sync") +public class GoodsSyncController { + + private GoodsApplicationService goodsApplicationService; + + @GetMapping("/stand") + public R toStandList(Integer fullUpdate){ + goodsApplicationService.syncStandGoods(fullUpdate!=null&&fullUpdate==1); + return R.ok(); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsUnitController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsUnitController.java new file mode 100644 index 0000000..4ce5d9a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/GoodsUnitController.java @@ -0,0 +1,103 @@ +package com.qs.serve.modules.goods.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.goods.entity.GoodsUnit; +import com.qs.serve.modules.goods.service.GoodsUnitService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 商品 单位 + * @author YenHex + * @since 2022-10-13 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/unit") +public class GoodsUnitController { + + private GoodsUnitService goodsUnitService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('goods:unit:query')") + public R> getPage(GoodsUnit param){ + PageUtil.startPage(); + LambdaQueryWrapper unitWrapper = new LambdaQueryWrapper<>(param); + List list = goodsUnitService.list(unitWrapper); + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.GOODS, title = "单位", biz = BizType.QUERY) + @PreAuthorize("hasRole('goods:unit:query')") + public R getById(@PathVariable("id") String id){ + GoodsUnit goodsUnit = goodsUnitService.getById(id); + return R.ok(goodsUnit); + } + + + + /** + * 根据ID更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.GOODS, title = "单位", biz = BizType.UPDATE) + @PreAuthorize("hasRole('goods:unit:update')") + public R updateById(@RequestBody @Valid GoodsUnit param){ + boolean result = goodsUnitService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增单位 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.GOODS, title = "单位", biz = BizType.INSERT) + @PreAuthorize("hasRole('goods:unit:insert')") + public R save(@RequestBody @Valid GoodsUnit param){ + boolean result = goodsUnitService.save(param); + return R.isTrue(result); + } + + /** + * 删除单位 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.GOODS, title = "单位", biz = BizType.DELETE) + @PreAuthorize("hasRole('goods:unit:delete')") + public R deleteById(@PathVariable("id") Long id){ + boolean result = goodsUnitService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/api/GoodsBrandApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/api/GoodsBrandApi.java new file mode 100644 index 0000000..8c783a1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/api/GoodsBrandApi.java @@ -0,0 +1,58 @@ +package com.qs.serve.modules.goods.controller.api; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.modules.goods.entity.GoodsBrand; +import com.qs.serve.modules.goods.service.GoodsBrandService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * API商品品牌 + * @author YenHex + * @since 2022/10/13 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("my/brand") +public class GoodsBrandApi { + + private GoodsBrandService goodsBrandService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getPage(GoodsBrand param){ + LambdaQueryWrapper brandWrapper = new LambdaQueryWrapper<>(param); + List list = goodsBrandService.list(brandWrapper); + return R.ok(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + GoodsBrand goodsBrand = goodsBrandService.getById(id); + return R.ok(goodsBrand); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/api/GoodsCategoryApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/api/GoodsCategoryApi.java new file mode 100644 index 0000000..ac70e72 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/api/GoodsCategoryApi.java @@ -0,0 +1,101 @@ +package com.qs.serve.modules.goods.controller.api; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.config.DevEnvironmentConfig; +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.dto.TreeNode; +import com.qs.serve.common.model.enums.BizType; +import com.qs.serve.common.model.enums.SystemModule; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.TreeUtil; +import com.qs.serve.modules.bms.common.BookAccountUtil; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.bo.GoodsCategoryTreeVo; +import com.qs.serve.modules.goods.service.GoodsCategoryService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * API商品分类 + * @author YenHex + * @since 2022-10-09 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/my/category") +public class GoodsCategoryApi { + + private GoodsCategoryService goodsCategoryService; + + /** + * 树查询 + * @return + */ + @GetMapping("/tree") + public R> getTree(){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + if(DevEnvironmentConfig.OPEN_TENANT_BOOK){ + lqw.in(GoodsCategory::getBookBelong, BookAccountUtil.getCurrentUserAccount()); + } + lqw.eq(GoodsCategory::getEnable,1); + List list = goodsCategoryService.list(lqw); + List treeVoList = list.stream().map(cate->{ + GoodsCategoryTreeVo treeNode = CopierUtil.copy(cate,new GoodsCategoryTreeVo()); + treeNode.setId(cate.getId()+""); + treeNode.setParentId(cate.getParentId().toString()); + treeNode.setSort(0); + return treeNode; + }).collect(Collectors.toList()); + treeVoList.sort((o1,o2) -> (o2.getSort()-o1.getSort())); + treeVoList = TreeUtil.buildByRecursive(treeVoList,TreeUtil.DEFAULT_PID_STRING); + for (GoodsCategoryTreeVo treeVo : treeVoList) { + //第二级为空,补充第二,三级 + if(CollUtil.isEmpty(treeVo.getChildren())){ + GoodsCategoryTreeVo treeVoLv2 = CopierUtil.copy(treeVo,new GoodsCategoryTreeVo()); + List vo2List = new ArrayList<>(); + vo2List.add(CopierUtil.copy(treeVo,new GoodsCategoryTreeVo())); + treeVoLv2.setChildren(vo2List); + + List voList = new ArrayList<>(); + voList.add(CopierUtil.copy(treeVoLv2,new GoodsCategoryTreeVo())); + treeVo.setChildren(voList); + }else { + for (TreeNode object : treeVo.getChildren()) { + //第三级为空,补充第三级 + if(CollUtil.isEmpty(object.getChildren())){ + GoodsCategoryTreeVo child2 = (GoodsCategoryTreeVo)object; + List voList = new ArrayList<>(); + voList.add(CopierUtil.copy(child2,new GoodsCategoryTreeVo())); + treeVo.setChildren(voList); + } + } + } + } + return R.ok(treeVoList); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + GoodsCategory goodsCategory = goodsCategoryService.getById(id); + return R.ok(goodsCategory); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/api/GoodsImminentBatchApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/api/GoodsImminentBatchApi.java new file mode 100644 index 0000000..5e3b9e4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/api/GoodsImminentBatchApi.java @@ -0,0 +1,245 @@ +package com.qs.serve.modules.goods.controller.api; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.config.DevEnvironmentConfig; +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.bms.common.BookAccountUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.goods.entity.*; +import com.qs.serve.modules.goods.entity.dto.GoodsAccrIdsDto; +import com.qs.serve.modules.goods.entity.dto.GoodsRuleItemDTO; +import com.qs.serve.modules.goods.entity.dto.InventoryCusPrice; +import com.qs.serve.modules.goods.entity.so.GoodsImminentBatchQuery; +import com.qs.serve.modules.goods.entity.so.InventoryCusPriceQuery; +import com.qs.serve.modules.goods.entity.vo.GoodsImminentBatchVo; +import com.qs.serve.modules.goods.service.*; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.Nullable; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 商品 临期批次 + * @author YenHex + * @since 2024-06-11 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("my/imminentBatch") +public class GoodsImminentBatchApi { + + private GoodsRuleService goodsRuleService; + private GoodsCategoryRuleService goodsCategoryRuleService; + private BmsSupplierService bmsSupplierService; + private GoodsCategoryService goodsCategoryService; + private GoodsAccreditService goodsAccreditService; + private GoodsImminentBatchService goodsImminentBatchService; + private SeeYonRequestBaseService seeYonRequestBaseService; + + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(GoodsImminentBatchQuery param){ + GoodsCategoryRule categoryRule = goodsCategoryRuleService.getById(param.getSearchCateRuleId()); + if(categoryRule!=null&&categoryRule.getIgnoreBrandIds()!=null&&categoryRule.getIgnoreBrandIds().length>0){ + param.setSelectNotIntCateIds(Arrays.asList(categoryRule.getIgnoreBrandIds())); + log.info("setSelectNotIntCateIds {}", JsonUtil.objectToJson(param)); + } + BmsSupplier supplier = bmsSupplierService.getByNameOrCode(param.getSupplierCode()); + if(supplier==null){ + return R.error("供应商不存在或停用"); + } + + //客户规则设置 + String userId = AuthContextUtils.getSysUserId(); + this.toSetSpuParam(param, supplier,userId); + //产品规则设置 + this.tiSetSpuParam2(param, supplier); + + if(DevEnvironmentConfig.OPEN_TENANT_BOOK){ + param.setBookCodeList(BookAccountUtil.getCurrentUserAccount()); + } + // 过滤可下单的 + param.setFilterFlag(1); + long total = goodsImminentBatchService.countVoList(param); + if(total<1){ + return R.byEmptyList(); + } + List list = goodsImminentBatchService.selectVoList(param); + List skuCodes = list.stream().map(GoodsImminentBatchVo::getSkuCode).collect(Collectors.toList()); + if(CollUtil.isNotEmpty(skuCodes)){ + List cusPriceList = this.getInventoryCusPrices(param.getSupplierCode(), skuCodes); + for (GoodsImminentBatchVo batchVo : list) { + if(cusPriceList!=null){ + for (InventoryCusPrice cusPrice : cusPriceList) { + if(cusPrice.getInvCode().equals(batchVo.getSkuCode())){ + batchVo.setSalesPrice(cusPrice.getPrice()); + batchVo.setCostPrice(cusPrice.getPrice()); + break; + } + } + } + } + } + return R.byPageList(total,list); + } + + + /** + * 获取客户特殊价格 + * @param supplierCode + * @param skuCodes + * @return + */ + @Nullable + private List getInventoryCusPrices(String supplierCode, List skuCodes) { + List inventoryCusPrices = null; + try { + if(skuCodes.size()>0){ + InventoryCusPriceQuery query = new InventoryCusPriceQuery(); + query.setCusCode(supplierCode); + query.setInvCodes(skuCodes); + R res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); + if(res.getStatus().equals(200)){ + inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); + } + } + } catch (Exception e) { + log.error("客户特殊价异常:{}",e.getMessage()); + } + return inventoryCusPrices; + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.GOODS, title = "临期批次", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + GoodsImminentBatch goodsImminentBatch = goodsImminentBatchService.getById(id); + return R.ok(goodsImminentBatch); + } + + + private void tiSetSpuParam2(GoodsImminentBatchQuery param, BmsSupplier supplier) { + GoodsAccrIdsDto accrIdsDto = goodsAccreditService + .listIgnoreAcc2(supplier.getId(), supplier.listBizRegionIds(), supplier.listSaleRegionIds()); + param.setSubAccInfo(accrIdsDto); + } + + /** + * 设置Spu查询条件 + * @param param + * @param supplier + */ + private void toSetSpuParam(GoodsImminentBatchQuery param, BmsSupplier supplier, String userId) { + + //用户维度的客户规则 + List userRules = goodsRuleService.listByUserId(userId); + List ruleItems = goodsRuleService.listBySupplierId(supplier.getId()); + if(userRules!=null){ + if(ruleItems!=null){ + ruleItems.addAll(userRules); + }else { + ruleItems = userRules; + } + } + GoodsRuleItemDTO ruleItemDTO = goodsRuleService.buildGoodsRuleItemDTO(ruleItems); + if(ruleItemDTO!=null){ + + if(ruleItemDTO.getNotInCategoryIds()!=null){ + if(CollUtil.isEmpty(param.getSelectNotIntCateIds())){ + param.setSelectNotIntCateIds(ruleItemDTO.getNotInCategoryIds()); + }else{ + param.getSelectNotIntCateIds().addAll(ruleItemDTO.getNotInCategoryIds()); + } + } + + if(CollUtil.isNotEmpty(ruleItemDTO.getOnlyCategoryIds())){ + if (CollUtil.isEmpty(param.getSelectCateIds())){ + param.setSelectCateIds(ruleItemDTO.getOnlyCategoryIds()); + }else{ + List onlyIds = ruleItemDTO.getOnlyCategoryIds(); + List onlyCategoryList = goodsCategoryService.listByIds(onlyIds); + for (GoodsCategory category : onlyCategoryList) { + List childList = goodsCategoryService.list(new LambdaQueryWrapper() + .likeRight(GoodsCategory::getLevelPath,category.getLevelPath()+"_")); + if(CollUtil.isNotEmpty(childList)){ + List childIds = childList.stream().map(a->a.getId().toString()).collect(Collectors.toList()); + onlyIds.addAll(childIds); + } + } + List selectCateIds = param.getSelectCateIds(); + List goodsCategoryList = goodsCategoryService.listByIds(selectCateIds); + for (GoodsCategory category : goodsCategoryList) { + List childList = goodsCategoryService.list(new LambdaQueryWrapper() + .likeRight(GoodsCategory::getLevelPath,category.getLevelPath()+"_")); + if(CollUtil.isNotEmpty(childList)){ + List childIds = childList.stream().map(a->a.getId().toString()).collect(Collectors.toList()); + selectCateIds.addAll(childIds); + } + } + //交集 + Collection ids = cn.hutool.core.collection.CollectionUtil + .intersection(onlyIds, selectCateIds); + List idsList = new ArrayList<>(); + idsList.addAll(ids); + idsList.add("#"); + param.setSelectCateIds(idsList); + } + } + + if(CollUtil.isNotEmpty(ruleItemDTO.getOnlySpuIds())){ + if (CollUtil.isEmpty(param.getSelectSpuIds())){ + List ids = ruleItemDTO.getOnlySpuIds().stream() + .filter(Objects::nonNull).map(Long::parseLong).collect(Collectors.toList()); + param.setSelectSpuIds(ids); + }else{ + List ids = ruleItemDTO.getOnlySpuIds().stream() + .filter(Objects::nonNull).map(Long::parseLong).collect(Collectors.toList()); + //交集 + Collection id2s = cn.hutool.core.collection.CollectionUtil + .intersection(ids, param.getSelectSpuIds()); + List idsList = new ArrayList<>(); + idsList.addAll(id2s); + idsList.add(-1L); + param.setSelectSpuIds(idsList); + } + } + + if(CollUtil.isNotEmpty(ruleItemDTO.getNotInSpuIds())){ + if (CollUtil.isEmpty(param.getSelectNotInSpuIds())){ + List ids = ruleItemDTO.getNotInSpuIds().stream() + .filter(Objects::nonNull).map(Long::parseLong).collect(Collectors.toList()); + param.setSelectNotInSpuIds(ids); + }else{ + List ids = ruleItemDTO.getNotInSpuIds().stream() + .filter(Objects::nonNull).map(Long::parseLong).collect(Collectors.toList()); + param.getSelectNotInSpuIds().addAll(ids); + } + } + + } + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/api/GoodsSaleGroupApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/api/GoodsSaleGroupApi.java new file mode 100644 index 0000000..111ea9e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/api/GoodsSaleGroupApi.java @@ -0,0 +1,48 @@ +package com.qs.serve.modules.goods.controller.api; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.goods.entity.GoodsSaleGroup; +import com.qs.serve.modules.goods.service.GoodsSaleGroupService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * API商品销售分组 + * @author YenHex + * @since 2023-08-21 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("my/saleGroup") +public class GoodsSaleGroupApi { + + private GoodsSaleGroupService goodsSaleGroupService; + + /** + * 列表 + * @return + */ + @GetMapping("/list") + public R> getList(){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsSaleGroup::getShowFlag,1); + lqw.orderByDesc(GoodsSaleGroup::getSort); + List list = goodsSaleGroupService.list(lqw); + return R.ok(list); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/api/GoodsSeriesApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/api/GoodsSeriesApi.java new file mode 100644 index 0000000..157344c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/api/GoodsSeriesApi.java @@ -0,0 +1,57 @@ +package com.qs.serve.modules.goods.controller.api; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.modules.goods.entity.GoodsSeries; +import com.qs.serve.modules.goods.service.GoodsSeriesService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * API商品系列 + * @author YenHex + * @since 2022-10-11 + */ +@Slf4j +@AllArgsConstructor +//@RestController +//@RequestMapping("/my/series") +public class GoodsSeriesApi { + + private GoodsSeriesService goodsSeriesService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getPage(GoodsSeries param){ + LambdaQueryWrapper seriesWrapper = new LambdaQueryWrapper<>(param); + List list = goodsSeriesService.list(seriesWrapper); + return R.ok(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + GoodsSeries goodsSeries = goodsSeriesService.getById(id); + return R.ok(goodsSeries); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/api/GoodsSpuApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/api/GoodsSpuApi.java new file mode 100644 index 0000000..a6f4d7a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/controller/api/GoodsSpuApi.java @@ -0,0 +1,86 @@ +package com.qs.serve.modules.goods.controller.api; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.entity.vo.GoodsSpuVo; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * API商品spu + * @author YenHex + * @since 2022-10-09 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/my/spu") +public class GoodsSpuApi { + + private GoodsSpuService goodsSpuService; + + /** + * 翻页搜索 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(GoodsSpu param){ + PageUtil.startPage(); + LambdaQueryWrapper spuWrapper = new LambdaQueryWrapper<>(param); + //销售分组id(默认0,表所有 不进行条件过滤) + if(param.getGoodsSaleGroupId()!=null&¶m.getGoodsSaleGroupId().equals(0L)){ + param.setGoodsSaleGroupId(null); + } + if(StringUtils.hasText(param.getSearchValue())){ + spuWrapper.like(GoodsSpu::getSpuCode,param.getSearchValue()); + spuWrapper.like(GoodsSpu::getName,param.getSearchValue()); + } + Long selectCateId = param.getSelectCategoryId(); + if(selectCateId!=null){ + spuWrapper.and(qw->{ + qw.eq(GoodsSpu::getCategoryFirst,selectCateId) + .or().eq(GoodsSpu::getCategoryLast,selectCateId) + .or().eq(GoodsSpu::getCategorySecond,selectCateId) + .or().eq(GoodsSpu::getCategoryThird,selectCateId); + }); + } + List selectCateIds = param.getSelectCateIds(); + if(selectCateIds!=null&&selectCateIds.size()>0){ + spuWrapper.and(qw->{ + qw.in(GoodsSpu::getCategoryFirst,selectCateIds) + .or().in(GoodsSpu::getCategoryLast,selectCateIds) + .or().in(GoodsSpu::getCategorySecond,selectCateIds) + .or().in(GoodsSpu::getCategoryThird,selectCateIds); + }); + } + spuWrapper.eq(GoodsSpu::getShelf,1); + spuWrapper.orderByDesc(GoodsSpu::getSort); + List list = goodsSpuService.list(spuWrapper); + return R.byPageHelperList(list); + } + + /** + * 获取详情 + * @param id spuId + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") Long id){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + GoodsSpuVo goodsSpu = goodsSpuService.getVoById(id, supplier.getCode()); + return R.ok(goodsSpu); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsAccredit.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsAccredit.java new file mode 100644 index 0000000..5d36f58 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsAccredit.java @@ -0,0 +1,102 @@ +package com.qs.serve.modules.goods.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-04-01 + */ +@Data +@TableName("goods_accredit") +public class GoodsAccredit implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 客户id */ + private Long spuId; + + private Long skuId; + + private String code; + + private String name; + + /** 销售区域id */ + @Length(max = 32,message = "销售区域id长度不能超过32字") + private String categoryId; + + /** 空标识 */ + private Integer emptyFlag; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + + public static GoodsAccredit toNewObject(GoodsAccredit source){ + GoodsAccredit accredit = new GoodsAccredit(); + accredit.setId(source.getId()); + accredit.setSpuId(source.getSpuId()); + accredit.setCategoryId(source.getCategoryId()); + accredit.setEmptyFlag(source.getEmptyFlag()); + accredit.setRemark(source.getRemark()); + accredit.setCreateTime(source.getCreateTime()); + accredit.setUpdateTime(source.getUpdateTime()); + accredit.setTenantId(source.getTenantId()); + accredit.setDelFlag(source.getDelFlag()); + accredit.setCreateBy(source.getCreateBy()); + accredit.setUpdateBy(source.getUpdateBy()); + return accredit; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsAccreditItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsAccreditItem.java new file mode 100644 index 0000000..6c4fe2c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsAccreditItem.java @@ -0,0 +1,95 @@ +package com.qs.serve.modules.goods.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; + +/** + * 商品sku规则 实体类 + * @author YenHex + * @since 2024-04-01 + */ +@Data +@TableName("goods_accredit_item") +public class GoodsAccreditItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 规则id */ + @NotNull(message = "规则id不能为空") + private Long accId; + + /** 0:in,1:not-in */ + private Integer accType; + + /** 维度类型:supplier-客户;bizRegion-行政区域;saleRegion-销售区域 */ + @NotNull(message = "维度类型:0-客户;1-行政区域;2-销售区域不能为空") + private String targetType; + + /** 维度编码 */ + @NotBlank(message = "维度编码不能为空") + @Length(max = 255,message = "维度编码长度不能超过255字") + private String targetCode; + + /** 维度名称 */ + @Length(max = 255,message = "维度名称长度不能超过255字") + private String targetName; + + /** 维度id */ + @NotBlank(message = "维度id不能为空") + @Length(max = 30,message = "维度id长度不能超过30字") + private String targetId; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsBrand.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsBrand.java new file mode 100644 index 0000000..b61c5f6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsBrand.java @@ -0,0 +1,83 @@ +package com.qs.serve.modules.goods.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-10-11 + */ +@Data +@TableName("goods_brand") +public class GoodsBrand implements Serializable { + + private static final long serialVersionUID = 1L; + + /** PK */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 编码 */ + @NotBlank(message = "编码不能为空") + @Length(max = 20,message = "编码长度不能超过20字") + private String code; + + /** 名称 */ + @Length(max = 16,message = "名称长度不能超过16字") + private String name; + + /** 描述 */ + @Length(max = 255,message = "描述长度不能超过255字") + private String description; + + /** 图片 */ + @Length(max = 255,message = "图片长度不能超过255字") + private String picUrl; + + /** 排序 */ + private Integer sort; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsCategory.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsCategory.java new file mode 100644 index 0000000..d69e815 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsCategory.java @@ -0,0 +1,146 @@ +package com.qs.serve.modules.goods.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.util.StringUtils; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; +import java.util.List; +import javax.validation.constraints.NotBlank; + +/** + * 分类 实体类 + * @author YenHex + * @since 2022-10-09 + */ +@Data +@TableName("goods_category") +public class GoodsCategory implements Serializable { + + private static final long serialVersionUID = 1L; + + /** PK */ + @TableId(type = IdType.AUTO) + private Long id; + + /** (1:开启;0:关闭) */ + private Integer enable; + + @NotBlank(message = "编码不能为空") + @TableField(condition = SqlCondition.LIKE) + private String code; + + /** 父分类编号 */ + private Long parentId; + + /** 名称 */ + @Length(max = 64,message = "名称长度不能超过16字") + @TableField(condition = SqlCondition.LIKE) + private String name; + + /** 排序 */ + private Integer level; + + /** 等级路径id */ + private String levelPath; + + /** 等级路径 */ + private String levelPathNames; + + /** 描述 */ + @Length(max = 255,message = "描述长度不能超过255字") + private String description; + + /** 图片 */ + @Length(max = 255,message = "图片长度不能超过255字") + private String picUrl; + + /** 账套编码 */ + private String bookBelong; + + /** 账套名称 */ + private String bookName; + + /** 排序 */ + private Integer sort; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 可投放费用标识 */ + private Integer costFlag; + + @TableField(exist = false) + private Object parentInfo; + + /** 加载spu */ + @TableField(exist = false) + private Integer loadSpuData; + + + @TableField(exist = false) + private List selectIds; + + @TableField(exist = false) + private String brandLabel; + + @TableField(exist = false) + private String categoryLabel; + + @TableField(exist = false) + private String seriseLabel; + + @TableField(exist = false) + private Integer relateBrandFlag; + + public void initCategoryNameByPathsName(){ + if(!StringUtils.hasText(this.levelPathNames)){ + return; + } + String[] names = this.levelPathNames.split("_"); + if(names.length==1){ + this.brandLabel = names[0]; + }else if(names.length==2){ + this.brandLabel = names[0]; + this.categoryLabel = names[1]; + }else if(names.length >=3){ + this.brandLabel = names[0]; + this.categoryLabel = names[1]; + this.seriseLabel = names[2]; + } + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsCategoryRule.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsCategoryRule.java new file mode 100644 index 0000000..c29b7d9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsCategoryRule.java @@ -0,0 +1,122 @@ +package com.qs.serve.modules.goods.entity; + +import java.io.Serializable; +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 com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +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 2023-09-18 + */ +@Data +@TableName(value = "goods_category_rule",autoResultMap = true) +public class GoodsCategoryRule implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 标题 */ + @NotBlank(message = "标题不能为空") + @Length(max = 255,message = "标题长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String label; + + /** 品牌id */ + @NotBlank(message = "品牌id不能为空") + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] brandIds; + + /** 品牌名称 */ + @NotBlank(message = "品牌名称不能为空") + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] brandNames; + + /** 排除的品牌id */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] ignoreBrandIds; + + /** 排除的品牌名称 */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] ignoreBrandNames; + + /** 启用状态 */ + @NotNull(message = "启用状态不能为空") + private Integer enableFlag; + + /** 是否默认规则 */ + private Integer defaultFlag; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + private Integer sort; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + @TableField(exist = false) + private String brandName; + + public static GoodsCategoryRule toNewObject(GoodsCategoryRule source){ + GoodsCategoryRule categoryRule = new GoodsCategoryRule(); + categoryRule.setId(source.getId()); + categoryRule.setLabel(source.getLabel()); + categoryRule.setBrandIds(source.getBrandIds()); + categoryRule.setBrandNames(source.getBrandNames()); + categoryRule.setEnableFlag(source.getEnableFlag()); + categoryRule.setRemark(source.getRemark()); + categoryRule.setCreateTime(source.getCreateTime()); + categoryRule.setUpdateTime(source.getUpdateTime()); + categoryRule.setTenantId(source.getTenantId()); + categoryRule.setDelFlag(source.getDelFlag()); + categoryRule.setCreateBy(source.getCreateBy()); + categoryRule.setUpdateBy(source.getUpdateBy()); + return categoryRule; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsCustomerPrice.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsCustomerPrice.java new file mode 100644 index 0000000..681e1a7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsCustomerPrice.java @@ -0,0 +1,131 @@ +package com.qs.serve.modules.goods.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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-01-08 + */ +@Data +@TableName("goods_customer_price") +public class GoodsCustomerPrice implements Serializable { + + private static final long serialVersionUID = 1L; + + /** */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 客户ID */ + private String supplierId; + + /** 客户编号 */ + @NotNull(message = "客户编号不能为空") + @TableField(condition = SqlCondition.LIKE) + private String supplierCode; + + /** 客户名称(冗余) */ + @Length(max = 50,message = "客户名称(冗余)长度不能超过50字") + @TableField(condition = SqlCondition.LIKE) + private String supplierName; + + /** 存货编码 */ + @NotNull(message = "存货编码不能为空") + private String skuId; + + /** 存货编码 */ + @NotNull(message = "存货编码不能为空") + @TableField(condition = SqlCondition.LIKE) + private String skuCode; + + /** 存货名称(冗余) */ + @Length(max = 255,message = "存货名称(冗余)长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String skuName; + + /** 计量单位 */ + @Length(max = 50,message = "计量单位长度不能超过50字") + private String skuUnit; + + /** 初始价格 */ + private BigDecimal initPrice; + + /** 真实价格 */ + @NotNull(message = "真实价格不能为空") + private BigDecimal realPrice; + + /** 定价人 */ + @Length(max = 50,message = "定价人长度不能超过50字") + @TableField(condition = SqlCondition.LIKE) + private String maker; + + /** 定价人编号 */ + @Length(max = 50,message = "定价人编号长度不能超过50字") + @TableField(condition = SqlCondition.LIKE) + private String makerCode; + + /** 定价时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime markTime; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** 账套编码 */ + @TableField(exist = false) + private String bookBelong; + + /** 账套名称 */ + @TableField(exist = false) + private String bookName; + + /** 账套编码列表 */ + @TableField(exist = false) + private List bookCodeList; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsFeedback.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsFeedback.java new file mode 100644 index 0000000..aae271e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsFeedback.java @@ -0,0 +1,157 @@ +package com.qs.serve.modules.goods.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 com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +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-10-25 + */ +@Data +@TableName(value = "goods_feedback",autoResultMap = true) +public class GoodsFeedback implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** spuId */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] spuIds; + + /** skuId */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] skuIds; + + /** 反馈图片 */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] imgUrls; + + /** 附件id */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] attachIds; + + /** 反馈类型 */ + @Length(max = 255,message = "反馈类型长度不能超过255字") + private String feedbackTypeId; + + /** 反馈类型拼接,格式: 缺陷/数量不足 */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] feedbackTypeNames; + + /** 反馈内容 */ + @Length(max = 255,message = "反馈内容长度不能超过255字") + private String feedbackText; + + /** 反馈人id */ + @Length(max = 64,message = "反馈人id长度不能超过64字") + private String userId; + + /** 反馈人编码 */ + @Length(max = 64,message = "反馈人编码长度不能超过64字") + private String userCode; + + /** 反馈人 */ + @Length(max = 64,message = "反馈人长度不能超过64字") + private String userName; + + /** 品控部人员id */ + @Length(max = 64,message = "品控部人员id长度不能超过64字") + private String goodsCheckerId; + + /** 品控部人员 */ + @Length(max = 255,message = "品控部人员长度不能超过255字") + private String goodsChecker; + + /** 品控部说明 */ + @Length(max = 255,message = "品控部说明长度不能超过255字") + private String goodsCheckRemark; + + /** 品控部核对时间 */ + @Length(max = 0,message = "品控部核对时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime goodsCheckTime; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 地图地址 */ + private String address; + + /** 纬度 */ + private String localX; + + /** 经度 */ + private String localY; + + /** 省 */ + private String extProvince; + + /** 城市 */ + private String extCity; + + /** 区 */ + private String extRegionArea; + + /** 乡镇 */ + private String extTownship; + + /** 街道 */ + private String extStreet; + + /** 街道编号 */ + private String extStreetNumber; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsFeedbackType.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsFeedbackType.java new file mode 100644 index 0000000..b2949e8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsFeedbackType.java @@ -0,0 +1,99 @@ +package com.qs.serve.modules.goods.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-11-01 + */ +@Data +@TableName("goods_feedback_type") +public class GoodsFeedbackType implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private String id; + + /** 反馈类目 */ + @Length(max = 255,message = "反馈类目长度不能超过255字") + private String name; + + /** 父级id */ + private String pid; + + /** 隐藏 */ + private Integer hideFlag; + + private Integer sort; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + @TableField(exist = false) + private Object parentInfo; + + public static GoodsFeedbackType toNewObject(GoodsFeedbackType source){ + GoodsFeedbackType feedbackType = new GoodsFeedbackType(); + feedbackType.setId(source.getId()); + feedbackType.setName(source.getName()); + feedbackType.setPid(source.getPid()); + feedbackType.setRemark(source.getRemark()); + feedbackType.setCreateTime(source.getCreateTime()); + feedbackType.setUpdateTime(source.getUpdateTime()); + feedbackType.setTenantId(source.getTenantId()); + feedbackType.setDelFlag(source.getDelFlag()); + feedbackType.setCreateBy(source.getCreateBy()); + feedbackType.setUpdateBy(source.getUpdateBy()); + return feedbackType; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsImminentBatch.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsImminentBatch.java new file mode 100644 index 0000000..d223542 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsImminentBatch.java @@ -0,0 +1,113 @@ +package com.qs.serve.modules.goods.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-11 + */ +@Data +@TableName("goods_imminent_batch") +public class GoodsImminentBatch implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** skuID */ + @NotBlank(message = "skuID不能为空") + @Length(max = 255,message = "skuID长度不能超过255字") + private String skuId; + + /** sku编码 */ + @Length(max = 255,message = "sku编码长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String skuCode; + + /** sku名称 */ + @Length(max = 255,message = "sku名称长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String skuName; + + /** 批号 */ + @NotBlank(message = "批号不能为空") + @Length(max = 255,message = "批号长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String batchCode; + + /** 数量 */ + private Integer quantity; + + /** 已下单数量 */ + private Integer orderQuantity; + + /** 截止销售时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate endDate; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 查询开始 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + @TableField(exist = false) + private LocalDate queryStartDate; + + /** 查询结束 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + @TableField(exist = false) + private LocalDate queryEndDate; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsRule.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsRule.java new file mode 100644 index 0000000..4d312be --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsRule.java @@ -0,0 +1,101 @@ +package com.qs.serve.modules.goods.entity; + +import java.io.Serializable; +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; + + +/** + * 规则 实体类 + * @author YenHex + * @since 2024-03-22 + */ +@Data +@TableName("goods_rule") +public class GoodsRule implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + private String code; + + private String name; + + /** 授权用户ID */ + private String userId; + + /** 客户id */ + private Long supplierId; + + /** 销售区域id */ + private String saleRegionId; + + /** 行政区域id */ + private String bizRegionId; + + /** 控规则 */ + private Integer emptyFlag; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + + public static GoodsRule toNewObject(GoodsRule source){ + GoodsRule rule = new GoodsRule(); + rule.setId(source.getId()); + rule.setSupplierId(source.getSupplierId()); + rule.setSaleRegionId(source.getSaleRegionId()); + rule.setBizRegionId(source.getBizRegionId()); + rule.setRemark(source.getRemark()); + rule.setCreateTime(source.getCreateTime()); + rule.setUpdateTime(source.getUpdateTime()); + rule.setTenantId(source.getTenantId()); + rule.setDelFlag(source.getDelFlag()); + rule.setCreateBy(source.getCreateBy()); + rule.setUpdateBy(source.getUpdateBy()); + return rule; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsRuleItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsRuleItem.java new file mode 100644 index 0000000..aaf2703 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsRuleItem.java @@ -0,0 +1,108 @@ +package com.qs.serve.modules.goods.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; + +/** + * 商品sku规则 实体类 + * @author YenHex + * @since 2024-03-22 + */ +@Data +@TableName("goods_rule_item") +public class GoodsRuleItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 规则id */ + @NotNull(message = "规则id不能为空") + private Long ruleId; + + /** 商品类型 :1只能选的分类;2不能选的分类;3只能选的SPU;4不能选的SPU*/ + @NotNull(message = "商品类型不能为空") + private Integer targetType; + + /** 品类编码 */ + @NotBlank(message = "品类编码不能为空") + @Length(max = 255,message = "品类编码长度不能超过255字") + private String targetCode; + + /** 品类名称 */ + private String targetName; + + /** 商品id */ + @NotBlank(message = "商品id不能为空") + @Length(max = 30,message = "商品id长度不能超过30字") + private String targetId; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + + public static GoodsRuleItem toNewObject(GoodsRuleItem source){ + GoodsRuleItem ruleItem = new GoodsRuleItem(); + ruleItem.setId(source.getId()); + ruleItem.setRuleId(source.getRuleId()); + ruleItem.setTargetType(source.getTargetType()); + ruleItem.setTargetCode(source.getTargetCode()); + ruleItem.setTargetId(source.getTargetId()); + ruleItem.setRemark(source.getRemark()); + ruleItem.setCreateTime(source.getCreateTime()); + ruleItem.setUpdateTime(source.getUpdateTime()); + ruleItem.setTenantId(source.getTenantId()); + ruleItem.setDelFlag(source.getDelFlag()); + ruleItem.setCreateBy(source.getCreateBy()); + ruleItem.setUpdateBy(source.getUpdateBy()); + return ruleItem; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSaleGroup.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSaleGroup.java new file mode 100644 index 0000000..361262c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSaleGroup.java @@ -0,0 +1,91 @@ +package com.qs.serve.modules.goods.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 2023-08-21 + */ +@Data +@TableName("goods_sale_group") +public class GoodsSaleGroup implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 标题 */ + @Length(max = 255,message = "标题长度不能超过255字") + private String label; + + /** 显示在页面标识 */ + private Integer showFlag; + + /** 排序 */ + private Integer sort; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + + public static GoodsSaleGroup toNewObject(GoodsSaleGroup source){ + GoodsSaleGroup saleGroup = new GoodsSaleGroup(); + saleGroup.setId(source.getId()); + saleGroup.setLabel(source.getLabel()); + saleGroup.setShowFlag(source.getShowFlag()); + saleGroup.setSort(source.getSort()); + saleGroup.setCreateTime(source.getCreateTime()); + saleGroup.setUpdateTime(source.getUpdateTime()); + saleGroup.setTenantId(source.getTenantId()); + saleGroup.setDelFlag(source.getDelFlag()); + saleGroup.setCreateBy(source.getCreateBy()); + saleGroup.setUpdateBy(source.getUpdateBy()); + return saleGroup; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSeries.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSeries.java new file mode 100644 index 0000000..b78efac --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSeries.java @@ -0,0 +1,83 @@ +package com.qs.serve.modules.goods.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-10-11 + */ +@Data +@TableName("goods_series") +public class GoodsSeries implements Serializable { + + private static final long serialVersionUID = 1L; + + /** PK */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 编码 */ + @NotBlank(message = "编码不能为空") + @Length(max = 20,message = "编码长度不能超过20字") + private String code; + + /** 名称 */ + @Length(max = 16,message = "名称长度不能超过16字") + private String name; + + /** 描述 */ + @Length(max = 255,message = "描述长度不能超过255字") + private String description; + + /** 图片 */ + @Length(max = 255,message = "图片长度不能超过255字") + private String picUrl; + + /** 排序 */ + private Integer sort; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSku.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSku.java new file mode 100644 index 0000000..3490db5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSku.java @@ -0,0 +1,230 @@ +package com.qs.serve.modules.goods.entity; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.io.Serializable; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.modules.goods.entity.vo.GoodsSkuSpecValueVo; +import jdk.nashorn.internal.ir.annotations.Ignore; +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; + +/** + * sku 实体类 + * @author YenHex + * @since 2022-10-09 + */ +@Data +@TableName("goods_sku") +public class GoodsSku implements Serializable { + + private static final long serialVersionUID = 1L; + + /** PK */ + @TableId(type = IdType.AUTO) + private Long id; + + /** sku编码 */ + @Length(max = 32,message = "sku编码长度不能超过32字") + private String skuCode; + + private String skuName; + + private String skuAddCode; + + /** 商品Id */ + @NotNull(message = "商品Id不能为空") + private Long spuId; + + /** 图片 */ + @Length(max = 500,message = "图片长度不能超过500字") + private String picUrl; + + /** 销售价格 */ + private BigDecimal salesPrice; + + /** 市场价 */ + private BigDecimal marketPrice; + + /** 成本价 */ + private BigDecimal costPrice; + + /** 规格值 */ + private String specInfos; + + /** 库存 */ + @NotNull(message = "库存不能为空") + private Integer stock; + + /** 重量(kg) */ + @NotNull(message = "重量(kg)不能为空") + private BigDecimal weight; + + /** 体积(m³) */ + @NotNull(message = "体积(m³)不能为空") + private BigDecimal volume; + + /** 净重 */ + private BigDecimal invUnitWeight; + + /** 最低起批数(0->不限制) */ + private Integer minPurchase; + + /** 是否开启 1、是;0否 */ + private Integer enable; + + /** 是否可以下单 1、是;0否 */ + private Integer orderFlag; + + private Integer specialFlag; + + /** 在线下单 */ + private Integer orderOnlineFlag; + + /** 线下下单 */ + private Integer orderOfflineFlag; + + /** 单位id */ + private Long unitId; + + /** 单位 */ + private String unitName; + + /** 版本号 */ + private Integer version; + + /** 备注 */ + private String remark; + + /** 账套编码 */ + private String bookBelong; + + /** 账套名称 */ + private String bookName; + + /** 产地 */ + @NotNull(message = "产地不能为空") + private String belong; + + /** 包装 */ + @NotNull(message = "包装不能为空") + private String wrapVal; + + /** 口味 */ + @NotNull(message = "口味不能为空") + private String tasteVal; + + /** 最后更新时间 */ + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 可投放费用标识 */ + private Integer costFlag; + + @TableField(exist = false) + private List selectSkuIds; + + /** 查询:是否上架(1是 0否) */ + @TableField(exist = false) + private Integer querySpuShelf; + + /** 账套编码列表 */ + @TableField(exist = false) + private List bookCodeList; + + /** 规格值信息 */ + @TableField(exist = false) + private List specValueList; + + /** + * 后台参数 + **/ + @Ignore + @TableField(exist = false) + private Integer qty; + + /** + * 品牌 + */ + @TableField(exist = false) + private String brandName; + /** + * 分类 + */ + @TableField(exist = false) + private String categoryName; + /** + * 系列 + */ + @TableField(exist = false) + private String seriesName; + + /** + * 品牌 + */ + @TableField(exist = false) + private String brandCode; + /** + * 分类 + */ + @TableField(exist = false) + private String categoryCode; + /** + * 系列 + */ + @TableField(exist = false) + private String seriesCode; + + + /** + * spuCode + */ + @TableField(exist = false) + private String spuCode; + + /** + * spu名称 + */ + @TableField(exist = false) + private String spuName; + + /** + * spu名称(用于excel导出) + */ + @TableField(exist = false) + private String name; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSkuSpecValue.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSkuSpecValue.java new file mode 100644 index 0000000..85da531 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSkuSpecValue.java @@ -0,0 +1,77 @@ +package com.qs.serve.modules.goods.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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; + +/** + * sku规格值 实体类 + * @author YenHex + * @since 2022-10-09 + */ +@Data +@TableName("goods_sku_spec_value") +public class GoodsSkuSpecValue implements Serializable { + + private static final long serialVersionUID = 1L; + + /** PK */ + @TableId(type = IdType.AUTO) + private Long id; + + /** spu_id */ + private Long spuId; + + /** sku_id */ + @NotNull(message = "sku_id不能为空") + private Long skuId; + + /** 规格值id */ + @NotNull(message = "规格值id不能为空") + private Long specValueId; + + /** 排序字段 */ + private Integer sort; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpec.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpec.java new file mode 100644 index 0000000..f8c4177 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpec.java @@ -0,0 +1,66 @@ +package com.qs.serve.modules.goods.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-10-09 + */ +@Data +@TableName("goods_spec") +public class GoodsSpec implements Serializable { + + private static final long serialVersionUID = 1L; + + /** PK */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 名称 */ + @NotBlank(message = "名称不能为空") + @Length(max = 50,message = "名称长度不能超过50字") + private String name; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpecValue.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpecValue.java new file mode 100644 index 0000000..88f7b4f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpecValue.java @@ -0,0 +1,74 @@ +package com.qs.serve.modules.goods.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-10-09 + */ +@Data +@TableName("goods_spec_value") +public class GoodsSpecValue implements Serializable { + + private static final long serialVersionUID = 1L; + + /** PK */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 规格Id */ + @NotNull(message = "规格Id不能为空") + private Long specId; + + /** 名称 */ + @NotBlank(message = "名称不能为空") + @Length(max = 50,message = "名称长度不能超过50字") + @TableField(condition = SqlCondition.LIKE) + private String name; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + @TableField(exist = false) + private String specName; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpu.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpu.java new file mode 100644 index 0000000..3e21774 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpu.java @@ -0,0 +1,308 @@ +package com.qs.serve.modules.goods.entity; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import com.qs.serve.modules.goods.entity.dto.GoodsAccrIdsDto; +import com.qs.serve.modules.tag.entity.so.TagQuery; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * spu 实体类 + * @author YenHex + * @since 2022-10-09 + */ +@Data +@TableName(value = "goods_spu",autoResultMap = true) +public class GoodsSpu implements Serializable { + + private static final long serialVersionUID = 1L; + + /** PK */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 商品编码 */ + @NotBlank(message = "商品编码不能为空") + @Length(max = 32,message = "商品编码长度不能超过32字") + @TableField(condition = SqlCondition.LIKE) + private String spuCode; + + /** 商品名字 */ + @NotBlank(message = "商品名字不能为空") + @Length(max = 200,message = "商品名字长度不能超过200字") + @TableField(condition = SqlCondition.LIKE) + private String name; + + /** 一级分类、品牌ID */ + @NotNull(message = "一级分类ID不能为空") + private String categoryFirst; + + /** 二级分类、类目ID */ + private String categorySecond; + + /** 三级分类、系列ID */ + private String categoryThird; + + /** 最后一级分类 */ + private String categoryLast; + + /** 商品图片 */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] picUrls; + + /** 上下架(1是 0否) */ + private Integer shelf; + + /** 是否可以下单 1、是;0否 */ + private Integer orderFlag; + + /** 排序字段 */ + @NotNull(message = "排序字段不能为空") + private Integer sort; + + /** 销量 */ + private Integer saleNum; + + + /** 产品口味(非sku规格值) */ + private String tasteValue; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 可投放费用标识 */ + private Integer costFlag; + + /** 账套编码 */ + private String bookBelong; + + /** 账套名称 */ + private String bookName; + + /** 在线下单 */ + private Integer orderOnlineFlag; + + /** 线下下单 */ + private Integer orderOfflineFlag; + + /** 存货标识 */ + private Integer spuCunhuoFlag; + + /** 特殊SKUID */ + private Long specialSkuId; + + /** 销售分组id(默认0,表所有) */ + private Long goodsSaleGroupId; + + /** 商品销售类型:0-普通商品;1-赠品 */ + private Integer goodsSaleType; + + private String skuNumVal; + + /** 展示的价格 */ + @TableField(exist = false) + private Double showPrice = 0D; + + /** 选中的类目ID */ + @TableField(exist = false) + private Long selectCategoryId; + + /** 一级类目:品牌名称 */ + @TableField(exist = false) + private String cateFirstLabel; + + /** 二级类目:类目名称 */ + @TableField(exist = false) + private String cateSecondLabel; + + /** 三级类目:系列名称 */ + @TableField(exist = false) + private String cateThirdLabel; + + /** 一级类目:品牌名称 */ + @TableField(exist = false) + private String cateFirstCode; + + /** 二级类目:类目名称 */ + @TableField(exist = false) + private String cateSecondCode; + + /** 三级类目:系列名称 */ + @TableField(exist = false) + private String cateThirdCode; + + /** 账套编码列表 */ + @TableField(exist = false) + private List bookCodeList; + + /** 搜索值,搜索sku标题及编码 */ + @TableField(exist = false) + private String searchValue; + + /** 搜索值,搜索sku标题及编码 */ + @TableField(exist = false) + private String skuAddCode; + + @TableField(exist = false) + private List selectIds; + + @TableField(exist = false) + private List selectNotInIds; + + @TableField(exist = false) + private List selectCateIds; + + @TableField(exist = false) + private List selectNotIntCateIds; + + @TableField(exist = false) + private List selectNotInSpuIds; + + @TableField(exist = false) + private Integer selectSpecialFlag; + + @TableField(exist = false) + private List notInSkuIds; + + @TableField(exist = false) + private BigDecimal skuPrice; + + @TableField(exist = false) + private Long skuId; + + @TableField(exist = false) + private String skuCode; + + @TableField(exist = false) + private String skuName; + + @TableField(exist = false) + private String skuBelong; + + @TableField(exist = false) + private String belong; + + /** 重量(kg) */ + @TableField(exist = false) + @NotNull(message = "重量(kg)不能为空") + private String weight; + + /** 体积(m³) */ + @TableField(exist = false) + @NotNull(message = "体积(m³)不能为空") + private String volume; + + /** 用于查询客户的sku价格 */ + @TableField(exist = false) + private String supplierCode; + + @TableField(exist = false) + private String uuid; + + @TableField(exist = false) + private String keyword; + + @TableField(exist = false) + private String spuCodeOrName; + + @TableField(exist = false) + private String keywordName; + + @TableField(exist = false) + private String keywordCode; + + @TableField(exist = false) + private Integer skuSpecialFlag; + + @TableField(exist = false) + private String searchCateRuleId; + + @TableField(exist = false) + private GoodsAccrIdsDto subAccInfo; + + /** + * 排序方式 asc desc + */ + @TableField(exist = false) + private String orderType; + + /** + * 列名 + */ + @TableField(exist = false) + private String orderProp; + + @TableField(exist = false) + private Integer pageNum; + + @TableField(exist = false) + private Integer pageSize; + + /** 标签查询 */ + @TableField(exist = false) + List tagQueryList; + + public List listCategoryIds(){ + List list = new ArrayList<>(); + list.add(this.getCategoryFirst()); + list.add(this.getCategorySecond()); + list.add(this.getCategoryThird()); + return list.stream().filter(Objects::nonNull).collect(Collectors.toList()); + } + + public void toSetSkuInfo(GoodsSku goodsSku){ + this.setSkuId(goodsSku.getId()); + this.setSkuName(goodsSku.getSkuName()); + this.setSkuCode(goodsSku.getSkuCode()); + this.setSkuPrice(goodsSku.getSalesPrice()); + this.setWeight(goodsSku.getWeight()==null?"0":goodsSku.getWeight().toString()); + this.setVolume(goodsSku.getVolume()==null?"0":goodsSku.getVolume().toString()); + this.setUuid(goodsSku.getSpuId()+"_"+goodsSku.getId()); + this.setSkuBelong(goodsSku.getBelong()); + + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpuSpec.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpuSpec.java new file mode 100644 index 0000000..55f764a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpuSpec.java @@ -0,0 +1,74 @@ +package com.qs.serve.modules.goods.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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; + +/** + * spu规格 实体类 + * @author YenHex + * @since 2022-10-09 + */ +@Data +@TableName("goods_spu_spec") +public class GoodsSpuSpec implements Serializable { + + private static final long serialVersionUID = 1L; + + /** PK */ + @TableId(type = IdType.AUTO) + private String id; + + /** spu_id */ + @NotNull(message = "spu_id不能为空") + private Long spuId; + + /** spec_id */ + @NotNull(message = "spec_id不能为空") + private Long specId; + + /** 排序字段 */ + private Integer sort; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsUnit.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsUnit.java new file mode 100644 index 0000000..5109525 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/GoodsUnit.java @@ -0,0 +1,71 @@ +package com.qs.serve.modules.goods.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-10-13 + */ +@Data +@TableName("goods_unit") +public class GoodsUnit implements Serializable { + + private static final long serialVersionUID = 1L; + + /** PK */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 名称 */ + @Length(max = 16,message = "名称长度不能超过16字") + private String name; + + /** 描述 */ + @Length(max = 255,message = "描述长度不能超过255字") + private String description; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodSkuInfoVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodSkuInfoVo.java new file mode 100644 index 0000000..0838218 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodSkuInfoVo.java @@ -0,0 +1,41 @@ +package com.qs.serve.modules.goods.entity.bo; + +import com.qs.serve.modules.goods.entity.GoodsSku; +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2022/10/11 + */ +@Data +public class GoodSkuInfoVo { + + private List skuList; + + + + //规格列表 + public static class SpecInfo{ + Integer sort; + String specName; + List specValues; + } + + public static class SpecValue{ + String specValueId; + String specValue; + } + + public static class SkuVo{ + //.... + + List skuSpecValueInfos; + } + + public static class SkuComboValue{ + + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsAccreditBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsAccreditBo.java new file mode 100644 index 0000000..52f8bb7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsAccreditBo.java @@ -0,0 +1,58 @@ +package com.qs.serve.modules.goods.entity.bo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/4/1 + */ +@Data +@NoArgsConstructor +public class GoodsAccreditBo { + + /** 授权ID(更新必传) */ + private Long accId; + + private String spuId; + + private String skuId; + + private String categoryId; + + /** 只能选的销售区域 */ + private List onlySaleRegionIds; + + /** 不能选的销售区域 */ + private List notInSaleRegionIds; + + /** 只能选的行政区域 */ + private List onlyBizRegionIds; + + /** 不能选的行政区域 */ + private List notInBizRegionIds; + + /** 只能选的客户 */ + private List onlySupplierIds; + + /** 不能选的客户 */ + private List notInSupplierIds; + + /** 只能选的客户 */ + private List onlyUserIds; + + /** 不能选的客户 */ + private List notInUserIds; + + /** 是否局部更新 */ + private boolean onlyPastUpdate = false; + + public GoodsAccreditBo(String categoryId,String spuId,String skuId){ + this.categoryId = categoryId; + this.spuId = spuId; + this.skuId = skuId; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsAccreditImportBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsAccreditImportBo.java new file mode 100644 index 0000000..722389f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsAccreditImportBo.java @@ -0,0 +1,62 @@ +package com.qs.serve.modules.goods.entity.bo; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/7/22 + */ +@Data +public class GoodsAccreditImportBo { + + /** 授权ID(更新必传) */ + private Long accId; + + private String spuId; + + private String skuId; + + private String categoryId; + + /** 只能选的销售区域 */ + private List onlySaleRegionCodes; + + /** 不能选的销售区域 */ + private List notInSaleRegionCodes; + + /** 只能选的行政区域 */ + private List onlyBizRegionCodes; + + /** 不能选的行政区域 */ + private List notInBizRegionCodes; + + /** 只能选的客户 */ + private List onlySupplierCodes; + + /** 不能选的客户 */ + private List notInSupplierCodes; + + private Boolean successFlag; + + + /** 只能选的销售区域 */ + private List errOnlySaleRegionCodes; + + /** 不能选的销售区域 */ + private List errNotInSaleRegionCodes; + + /** 只能选的行政区域 */ + private List errOnlyBizRegionCodes; + + /** 不能选的行政区域 */ + private List errNotInBizRegionCodes; + + /** 只能选的客户 */ + private List errOnlySupplierCodes; + + /** 不能选的客户 */ + private List errNotInSupplierCodes; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCategoryBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCategoryBo.java new file mode 100644 index 0000000..0da20bd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCategoryBo.java @@ -0,0 +1,42 @@ +package com.qs.serve.modules.goods.entity.bo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; + +/** + * @author YenHex + * @since 2022/11/3 + */ +@Data +public class GoodsCategoryBo { + + /** PK */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 名称 */ + @Length(max = 16,message = "名称长度不能超过16字") + private String name; + + /** 描述 */ + @Length(max = 255,message = "描述长度不能超过255字") + private String description; + + /** 图片 */ + @Length(max = 255,message = "图片长度不能超过255字") + private String picUrl; + + /** 排序 */ + private Integer sort; + + /** 可投放费用标识 */ + private Integer costFlag; + + /** (1:开启;0:关闭) */ + private Integer enable; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCategoryLevelBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCategoryLevelBo.java new file mode 100644 index 0000000..aeb102c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCategoryLevelBo.java @@ -0,0 +1,33 @@ +package com.qs.serve.modules.goods.entity.bo; + +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.NotBlank; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 分类 实体类 + * @author YenHex + * @since 2022-10-09 + */ +@Data +public class GoodsCategoryLevelBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** PK */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 父分类编号 */ + private Long parentId; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCategoryRuleBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCategoryRuleBo.java new file mode 100644 index 0000000..ff6ebce --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCategoryRuleBo.java @@ -0,0 +1,41 @@ +package com.qs.serve.modules.goods.entity.bo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2023/9/18 + */ +@Data +public class GoodsCategoryRuleBo { + + /** id */ + private Long id; + + /** 标题 */ + private String label; + + /** 品牌id */ + private String[] brandIds; + + /** 排除品牌id */ + private String[] ignoreBrandIds; + + /** 是否默认规则 */ + private Integer defaultFlag; + + /** 启用状态 */ + private Integer enableFlag; + + private Integer sort; + + /** 备注 */ + private String remark; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCategoryTreeVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCategoryTreeVo.java new file mode 100644 index 0000000..17b019f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCategoryTreeVo.java @@ -0,0 +1,69 @@ +package com.qs.serve.modules.goods.entity.bo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.qs.serve.common.model.dto.TreeNode; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; + +/** + * @author YenHex + * @since 2022/10/10 + */ +@Data +public class GoodsCategoryTreeVo extends TreeNode { + + /** PK */ + @TableId(type = IdType.AUTO) + private String id; + + /** (1:开启;0:关闭) */ + @NotBlank(message = "(1:开启;0:关闭)不能为空") + @Length(max = 2,message = "(1:开启;0:关闭)长度不能超过2字") + private String enable; + + @NotBlank(message = "编码不能为空") + private String code; + + /** 父分类编号 */ + @Length(max = 32,message = "父分类编号长度不能超过32字") + private String parentId; + + /** 等级路径id */ + private String levelPath; + + /** 等级路径 */ + private String levelPathNames; + + /** 名称 */ + @Length(max = 16,message = "名称长度不能超过16字") + private String name; + + /** 账套编码 */ + private String bookBelong; + + /** 账套名称 */ + private String bookName; + + /** 描述 */ + @Length(max = 255,message = "描述长度不能超过255字") + private String description; + + /** 图片 */ + @Length(max = 255,message = "图片长度不能超过255字") + private String picUrl; + + /** 排序 */ + private Integer sort; + + /** 等级 */ + private Integer level; + + /** 可投放费用标识 */ + private Integer costFlag; + + private long countSpu = 0; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCustomerPriceBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCustomerPriceBo.java new file mode 100644 index 0000000..be1c65f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCustomerPriceBo.java @@ -0,0 +1,46 @@ +package com.qs.serve.modules.goods.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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; + +/** + * 客户价格关系表 Bo + * @author YenHex + * @since 2024-01-08 + */ +@Data +public class GoodsCustomerPriceBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 客户ID */ + private String supplierId; + + private List skuPriceItemList; + + @Data + public static class SkuPriceItem{ + + /** sku编码 */ + private String skuCode; + + /** 客户价格 */ + private BigDecimal price; + + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCustomerPriceSingleBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCustomerPriceSingleBo.java new file mode 100644 index 0000000..400d72c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCustomerPriceSingleBo.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.goods.entity.bo; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 客户价格关系表 Bo + * @author YenHex + * @since 2024-01-08 + */ +@Data +public class GoodsCustomerPriceSingleBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 客户ID */ + private String supplierId; + + /** sku编码 */ + private String skuCode; + + /** 客户价格 */ + private BigDecimal price; + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsFeedbackBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsFeedbackBo.java new file mode 100644 index 0000000..0cddcc2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsFeedbackBo.java @@ -0,0 +1,66 @@ +package com.qs.serve.modules.goods.entity.bo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; + +/** + * @author YenHex + * @since 2024/10/28 + */ +@Data +public class GoodsFeedbackBo { + + /** spuId */ + private String[] spuIds; + + /** skuId */ + private String[] skuIds; + + /** 反馈图片 */ + private String[] imgUrls; + /** 附件id */ + private String[] attachIds; + /** 反馈类型 */ + private String feedbackTypeId; + + /** 反馈内容 */ + @Length(max = 255,message = "反馈内容长度不能超过255字") + private String feedbackText; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 地图地址 */ + private String address; + + /** 纬度 */ + private String localX; + + /** 经度 */ + private String localY; + + /** 省 */ + private String extProvince; + + /** 城市 */ + private String extCity; + + /** 区 */ + private String extRegionArea; + + /** 乡镇 */ + private String extTownship; + + /** 街道 */ + private String extStreet; + + /** 街道编号 */ + private String extStreetNumber; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsFeedbackCheckBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsFeedbackCheckBo.java new file mode 100644 index 0000000..9550a20 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsFeedbackCheckBo.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.goods.entity.bo; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +/** + * @author YenHex + * @since 2024/10/28 + */ +@Data +public class GoodsFeedbackCheckBo { + + String id; + + String goodsCheckRemark; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsFeedbackTypeBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsFeedbackTypeBo.java new file mode 100644 index 0000000..98247a5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsFeedbackTypeBo.java @@ -0,0 +1,11 @@ +package com.qs.serve.modules.goods.entity.bo; + +import lombok.Data; + +/** + * @author YenHex + * @since 2024/11/1 + */ +@Data +public class GoodsFeedbackTypeBo { +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsImminentBatchBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsImminentBatchBo.java new file mode 100644 index 0000000..486df7b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsImminentBatchBo.java @@ -0,0 +1,53 @@ +package com.qs.serve.modules.goods.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 临期批次 Bo + * @author YenHex + * @since 2024-06-11 + */ +@Data +public class GoodsImminentBatchBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** skuID */ + @NotBlank(message = "skuID不能为空") + @Length(max = 255,message = "skuID长度不能超过255字") + private String skuId; + + /** 批号 */ + @NotBlank(message = "批号不能为空") + @Length(max = 255,message = "批号长度不能超过255字") + private String batchCode; + + /** 数量 */ + private Integer quantity; + + /** 截止销售时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate endDate; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsRuleBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsRuleBo.java new file mode 100644 index 0000000..17090a5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsRuleBo.java @@ -0,0 +1,39 @@ +package com.qs.serve.modules.goods.entity.bo; + +import com.qs.serve.modules.goods.entity.dto.GoodsRuleBaseDTO; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author YenHex + * @since 2024/3/22 + */ +@Data +public class GoodsRuleBo extends GoodsRuleBaseDTO { + + /** 规则ID(更新必传) */ + private Long ruleId; + + /** 备注 */ + private String remark; + + /** 只能选的分类 */ + private List onlyCategoryIds; + + /** 不能选的分类 */ + private List notInCategoryIds; + + /** 只能选的SPU */ + private List onlySpuIds; + + /** 不能选的SPU */ + private List notInSpuIds; + + /** + * 用于区分导入时,excel未传入数据,导致删除 + */ + private List selectTargetTypes = new ArrayList<>(); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsRuleImportBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsRuleImportBo.java new file mode 100644 index 0000000..3336001 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsRuleImportBo.java @@ -0,0 +1,46 @@ +package com.qs.serve.modules.goods.entity.bo; + +import com.qs.serve.modules.goods.entity.dto.GoodsRuleBaseDTO; +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/3/22 + */ +@Data +public class GoodsRuleImportBo extends GoodsRuleBaseDTO { + + /** 规则ID(更新必传) */ + private Long ruleId; + + /** 备注 */ + private String remark; + + /** 只能选的分类 */ + private List onlyCategoryCodes; + + /** 不能选的分类 */ + private List notInCategoryCodes; + + /** 只能选的SPU */ + private List onlySpuCodes; + + /** 不能选的SPU */ + private List notInSpuCodes; + + private Boolean checkOkFlag; + + /** 只能选的分类 */ + private List errOnlyCategoryCodes; + + /** 不能选的分类 */ + private List errNotInCategoryCodes; + + /** 只能选的SPU */ + private List errOnlySpuCodes; + + /** 不能选的SPU */ + private List errNotInSpuCodes; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsShelfSpu.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsShelfSpu.java new file mode 100644 index 0000000..cd23068 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsShelfSpu.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.goods.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/10/25 + */ +@Data +public class GoodsShelfSpu { + + /** + * 商品ID + */ + @NotNull + private Long spuId; + + /** + * 0 下架 + * 1 上架 + */ + @NotNull + private Integer status; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSkuBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSkuBo.java new file mode 100644 index 0000000..136be25 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSkuBo.java @@ -0,0 +1,112 @@ +package com.qs.serve.modules.goods.entity.bo; + +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 java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * sku 实体类 + * @author YenHex + * @since 2022-10-09 + */ +@Data +@TableName("goods_sku") +public class GoodsSkuBo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long skuId; + + /** sku编码 */ + private String skuCode; + + private String skuAddCode; + + private String skuName; + + /** 商品Id */ + @NotNull(message = "商品Id不能为空") + private Long spuId; + + /** 图片 */ + private String picUrl; + + /** 销售价格 */ + private BigDecimal salesPrice; + + /** 市场价 */ + private BigDecimal marketPrice; + + /** 成本价 */ + private BigDecimal costPrice; + + /** 规格值 */ + private String specInfos; + + /** 重量(kg) */ + @NotNull(message = "重量(kg)不能为空") + private BigDecimal weight; + + /** 体积(m³) */ + @NotNull(message = "体积(m³)不能为空") + private BigDecimal volume; + + /** 最低起批数(0->不限制) */ + private Integer minPurchase; + + /** 版本号 */ + private Integer version; + + /** 备注 */ + private String remark; + + /** 已取消:规格值Ids(更新操作可为空) */ + private List specValueIds; + + /** 可投放费用标识 */ + private Integer costFlag; + + /** 下单标识 */ + private Integer orderFlag; + + /** 产地 */ + @NotNull(message = "产地不能为空") + private String belong; + + /** 包装 */ + @NotNull(message = "包装不能为空") + private String wrapVal; + + /** 口味 */ + @NotNull(message = "口味不能为空") + private String tasteVal; + + private Integer specialFlag; + + /** 在线下单 */ + private Integer orderOnlineFlag; + + /** 线下下单 */ + private Integer orderOfflineFlag; + + /** 净重 */ + private BigDecimal invUnitWeight; + + /** 单位id */ + private Long unitId; + + /** 单位 */ + private String unitName; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSkuImportBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSkuImportBo.java new file mode 100644 index 0000000..707a341 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSkuImportBo.java @@ -0,0 +1,89 @@ +package com.qs.serve.modules.goods.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; + +/** + * 口味品类 + * @author YenHex + * @since 2022/10/10 + */ +@Data +public class GoodsSkuImportBo { + + private List skuList; + + @Data + public static class SkuItem{ + + /** + * 操作方式:save,update,delete ,不能为空 + */ + @NotNull + private String opt; + + /** 商品编码(嘉士利SkuCode,新增时不能为空) */ + private String spuCode; + + /** 商品编码(嘉士利InvCode,不能为空) */ + @NotNull + private String skuCode; + + /** 商品名字(新增时不能为空) */ + private String skuName; + + /** 库存 */ + private Integer stock; + + /** 销售价格(元) */ + private BigDecimal salesPrice; + + /** 市场价 */ + private BigDecimal marketPrice; + + /** 成本价 */ + private BigDecimal costPrice; + + /** 重量(kg) */ + private BigDecimal weight; + + /** 体积(m³) */ + private BigDecimal volume; + + /** 最低起批数(0->不限制) */ + private Integer minPurchase; + + /** 可否下单 1、是;0否 */ + private Integer orderFlag; + + /** 是否特殊品 1、是;0否 */ + private Integer specialFlag; + + /** 是否特殊品 1、是;0否 */ + private Integer costFlag; + + /** 产地 */ + private String belong; + + /** 包装 */ + private String wrapVal; + + /** 口味 */ + private String tasteVal; + + /** 备注 */ + private String remark; + + /** 是否开启 1、是;0否 */ + private Integer enable; + + /** 净重 */ + private BigDecimal invUnitWeight; + + private String errMsg; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSkuSpecialBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSkuSpecialBo.java new file mode 100644 index 0000000..497caea --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSkuSpecialBo.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.goods.entity.bo; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/8/29 + */ +@Data +public class GoodsSkuSpecialBo { + + /** + * SKU-ID列表 + */ + private List skuIds; + + /** + * 线上下单 + */ + private Integer specialFlag; + + + public void initProp(){ + if(specialFlag!=null&&specialFlag!=1&&specialFlag!=0){ + specialFlag = null; + } + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSkuStateBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSkuStateBo.java new file mode 100644 index 0000000..4c66035 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSkuStateBo.java @@ -0,0 +1,60 @@ +package com.qs.serve.modules.goods.entity.bo; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/8/29 + */ +@Data +public class GoodsSkuStateBo { + + /** + * SKU-ID列表 + */ + private List skuIds; + + /** 是否开启 1、是;0否 */ + private Integer enable; + + /** + * 可下单状态 + */ + private Integer orderFlag; + + /** + * 可投放费用状态 + */ + private Integer costFlag; + + /** + * 线上下单 + */ + private Integer orderOfflineFlag; + + /** + * 线下下单 + */ + private Integer orderOnlineFlag; + + public void initProp(){ + if(enable!=null&&enable!=1&&enable!=0){ + enable = null; + } + if(orderFlag!=null&&orderFlag!=1&&orderFlag!=0){ + orderFlag = null; + } + if(costFlag!=null&&costFlag!=1&&costFlag!=0){ + costFlag = null; + } + if(orderOfflineFlag!=null&&orderOfflineFlag!=1&&orderOfflineFlag!=0){ + orderOfflineFlag = null; + } + if(orderOnlineFlag!=null&&orderOnlineFlag!=1&&orderOnlineFlag!=0){ + orderOnlineFlag = null; + } + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSpuBatchTasteBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSpuBatchTasteBo.java new file mode 100644 index 0000000..9208a09 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSpuBatchTasteBo.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.goods.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; +/** + * @author YenHex + * @since 2022/10/10 + */ +@Data +public class GoodsSpuBatchTasteBo { + + /** 口味商品数据列表 */ + @NotNull + List tasteProducts; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSpuBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSpuBo.java new file mode 100644 index 0000000..d70d3d9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSpuBo.java @@ -0,0 +1,73 @@ +package com.qs.serve.modules.goods.entity.bo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 口味品类 + * @author YenHex + * @since 2022/10/10 + */ +@Data +public class GoodsSpuBo { + + /** PK */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 商品编码 */ + private String spuCode; + + /** 商品名字 */ + private String name; + + /** 品牌id */ + private Long brandId; + + /** 系列id */ + private Long seriesId; + + /** 最后一级分类 */ + private String categoryId; + + /** 商品图片 */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] picUrls; + + /** 是否上架(1是 0否) */ + //private Integer shelf; + + /** 排序字段 */ + //@NotNull(message = "排序字段不能为空") + private Integer sort; + + /** 销量 */ + //private Integer saleNum; + + /** 0统一规格;1多规格 */ + //@Length(max = 2,message = "0统一规格;1多规格长度不能超过2字") + //private String specType; + + /** 产品口味(非sku规格值) */ + private String tasteValue; + + /** 可投放费用标识 */ + private Integer costFlag; + + /** 下单标识 */ + private Integer orderFlag; + + /** 存货标识 */ + private Integer spuCunhuoFlag; + + private String belong; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSpuEditBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSpuEditBo.java new file mode 100644 index 0000000..fdf025e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSpuEditBo.java @@ -0,0 +1,52 @@ +package com.qs.serve.modules.goods.entity.bo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/10/25 + */ +@Data +public class GoodsSpuEditBo { + + /** 商品编码 */ + @NotBlank(message = "商品编码不能为空") + private String spuCode; + + /** 商品名字 */ + @NotBlank(message = "商品名字不能为空") + private String name; + + /** 品牌id */ + private Long brandId; + + /** 系列id */ + private Long seriesId; + + /** 最后一级分类 */ + private String categoryId; + + /** 商品图片 */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] picUrls; + + /** 排序字段 */ + private Integer sort; + + /** 0统一规格;1多规格 */ + @Length(max = 2,message = "0统一规格;1多规格长度不能超过2字") + private String specType; + + /** 产品口味(非sku规格值) */ + private String tasteValue; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSpuImportBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSpuImportBo.java new file mode 100644 index 0000000..b49ae8e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSpuImportBo.java @@ -0,0 +1,56 @@ +package com.qs.serve.modules.goods.entity.bo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; + +import java.util.List; + +/** + * 口味品类 + * @author YenHex + * @since 2022/10/10 + */ +@Data +public class GoodsSpuImportBo { + + private List spuList; + + @Data + public static class SpuItem{ + /** + * 操作方式:save,update,delete + */ + private String opt; + + /** 商品编码 */ + private String spuCode; + + /** 商品名字 */ + private String name; + + /** 上下架 */ + private Integer shelf; + + /** 是否可以下单 1、是;0否 */ + private Integer orderFlag; + + /** 可投放费用标识 */ + private Integer costFlag; + + /** 存货标识 */ + private Integer spuCunhuoFlag; + + /** 分类名称 */ + private String categoryCode; + + /** 分类名称 */ + private String categoryName; + + private String errMsg; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSpuStateBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSpuStateBo.java new file mode 100644 index 0000000..39e5e6f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSpuStateBo.java @@ -0,0 +1,62 @@ +package com.qs.serve.modules.goods.entity.bo; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/8/29 + */ +@Data +public class GoodsSpuStateBo { + + /** + * SPU-ID列表 + */ + private List spuIds; + + /** + * 是否上架 + */ + private Integer shelfState; + + /** + * 可下单状态 + */ + private Integer orderFlag; + + /** + * 可投放费用状态 + */ + private Integer costFlag; + + /** + * 线上下单 + */ + private Integer orderOfflineFlag; + + /** + * 线下下单 + */ + private Integer orderOnlineFlag; + + public void initProp(){ + if(shelfState!=null&&shelfState!=1&&shelfState!=0){ + shelfState = null; + } + if(orderFlag!=null&&orderFlag!=1&&orderFlag!=0){ + orderFlag = null; + } + if(costFlag!=null&&costFlag!=1&&costFlag!=0){ + costFlag = null; + } + if(orderOfflineFlag!=null&&orderOfflineFlag!=1&&orderOfflineFlag!=0){ + orderOfflineFlag = null; + } + if(orderOnlineFlag!=null&&orderOnlineFlag!=1&&orderOnlineFlag!=0){ + orderOnlineFlag = null; + } + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSpuTasteBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSpuTasteBo.java new file mode 100644 index 0000000..fd8e9a9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsSpuTasteBo.java @@ -0,0 +1,77 @@ +package com.qs.serve.modules.goods.entity.bo; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 口味品类 + * @author YenHex + * @since 2022/10/10 + */ +@Data +public class GoodsSpuTasteBo { + + /** 商品编码 */ + @NotBlank(message = "商品编码不能为空") + @Length(max = 32,message = "商品编码长度不能超过32字") + private String productCode; + + /** 存货编码 */ + @NotBlank(message = "SKU编码不能为空") + @Length(max = 32,message = "商品编码长度不能超过32字") + private String invCode; + + /** 商品名字 */ + @NotBlank(message = "商品名字不能为空") + @Length(max = 200,message = "商品名字长度不能超过200字") + private String name; + + /** 分类编码(系列编码) */ + @NotNull(message = "分类编码不能为空") + private String categoryCode; + + /** 商品组图片 */ + private String[] picUrls; + + /** 存货商品图片 */ + private String invPicUrl; + + /** 味道 */ + @NotNull(message = "味道不能为空") + private String tasteValue; + + /** 包装 */ + @NotNull(message = "包装不能为空") + private String packValue; + + /** 产品口味 */ + private String productTasteValue; + + /** 产地编码 */ + @NotNull(message = "产地编码不能为空") + private String factoryCode; + + /** 销售价格 */ + @NotNull(message = "销售价格不能为空") + private BigDecimal salesPrice; + + /** 市场价 */ + @NotNull(message = "市场价不能为空") + private BigDecimal marketPrice; + + /** 重量(kg) */ + @NotNull(message = "重量(kg)不能为空") + private BigDecimal weight; + + /** 体积(m³) */ + @NotNull(message = "体积(m³)不能为空") + private BigDecimal volume; + + /** 产品单位 */ + private String unit; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodSpuSkuNum.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodSpuSkuNum.java new file mode 100644 index 0000000..50e1174 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodSpuSkuNum.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.goods.entity.dto; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/12/20 + */ +@Data +public class GoodSpuSkuNum { + + private Long spuId; + + private Long countOrder; + + private Long countSpec; + + private Long countSku; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodTargetParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodTargetParam.java new file mode 100644 index 0000000..74466e1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodTargetParam.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.goods.entity.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * @author YenHex + * @since 2023/2/20 + */ +@Data +@AllArgsConstructor +public class GoodTargetParam { + + private String goodsType; + private String goodsId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodsAccrIdsDto.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodsAccrIdsDto.java new file mode 100644 index 0000000..8fa38be --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodsAccrIdsDto.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.goods.entity.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/4/7 + */ +@Data +@AllArgsConstructor +public class GoodsAccrIdsDto { + + private List skuIds; + private List spuIds; + private List cateIds; + + + private List notInSkuIds; + private List notInSpuIds; + private List notInCateIds; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodsAccreditExt.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodsAccreditExt.java new file mode 100644 index 0000000..05732cc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodsAccreditExt.java @@ -0,0 +1,78 @@ +package com.qs.serve.modules.goods.entity.dto; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.qs.serve.modules.goods.entity.GoodsAccredit; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * @author YenHex + * @since 2024/4/8 + */ +@Data +public class GoodsAccreditExt { + + /** + * 拼接类型 rule ,accredit + */ + private String unionType; + + private Long id; + + private String code; + + private String name; + + /** 客户id */ + private Long spuId; + + private Long skuId; + + /** 销售区域id */ + private String categoryId; + + /** 0:in,1:not-in */ + private Integer accType; + + /** 维度类型:supplier-客户;bizRegion-行政区域;saleRegion-销售区域 */ + @NotNull(message = "维度类型:0-客户;1-行政区域;2-销售区域不能为空") + private String targetType; + + /** 维度编码 */ + @NotBlank(message = "维度编码不能为空") + @Length(max = 255,message = "维度编码长度不能超过255字") + private String targetCode; + + /** 维度名称 */ + @Length(max = 255,message = "维度名称长度不能超过255字") + private String targetName; + + /** 维度id */ + @NotBlank(message = "维度id不能为空") + @Length(max = 30,message = "维度id长度不能超过30字") + private String targetId; + + private String bizRegionId; + private String saleRegionId; + private String supplierId; + private String userId; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime createTime; + + /** 创建人 */ + private String createUser; + + /** 创建人 */ + private String createUserCode; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodsAccreditQuery.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodsAccreditQuery.java new file mode 100644 index 0000000..85bf0ba --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodsAccreditQuery.java @@ -0,0 +1,33 @@ +package com.qs.serve.modules.goods.entity.dto; + +import com.qs.serve.modules.goods.entity.GoodsAccredit; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Set; + +/** + * @author YenHex + * @since 2024/4/9 + */ +@Data +public class GoodsAccreditQuery { + + private String code = ""; + + private String name = ""; + + /** 维度编码 */ + private String targetCode = ""; + + /** 维度名称 */ + private String targetName = ""; + + private String userKeywords = ""; + + private Set codeList; + + private Set targetCodeList; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodsRuleBaseDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodsRuleBaseDTO.java new file mode 100644 index 0000000..6c9eb14 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodsRuleBaseDTO.java @@ -0,0 +1,24 @@ +package com.qs.serve.modules.goods.entity.dto; + +import lombok.Data; + +/** + * @author YenHex + * @since 2024/3/22 + */ +@Data +public class GoodsRuleBaseDTO { + + /** 客户id */ + private Long supplierId; + + /** 销售区域id */ + private String saleRegionId; + + /** 行政区域id */ + private String bizRegionId; + + /** 人员ID */ + private String userId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodsRuleItemDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodsRuleItemDTO.java new file mode 100644 index 0000000..8e5cb8b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodsRuleItemDTO.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.goods.entity.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/3/28 + */ +@Data +public class GoodsRuleItemDTO { + + /** 只能选的分类 */ + private List onlyCategoryIds; + + /** 不能选的分类 */ + private List notInCategoryIds; + + /** 只能选的SPU */ + private List onlySpuIds; + + /** 不能选的SPU */ + private List notInSpuIds; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodsTargetInfo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodsTargetInfo.java new file mode 100644 index 0000000..988e88e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/GoodsTargetInfo.java @@ -0,0 +1,34 @@ +package com.qs.serve.modules.goods.entity.dto; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2023/2/20 + */ +@Data +public class GoodsTargetInfo { + + /** 目标类型(brand、category、series、spu、sku) */ + private String targetType; + + /** 目标id */ + private Long targetId; + + /** 目标编码 */ + private String targetCode; + + /** 目标名称 */ + private String targetName; + + /** 目标等级id路径 */ + private String targetLevelPathIds; + + /** 目标等级名称路径 */ + private String targetLevelPathNames; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/InventoryCusPrice.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/InventoryCusPrice.java new file mode 100644 index 0000000..65d3baa --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/InventoryCusPrice.java @@ -0,0 +1,34 @@ +package com.qs.serve.modules.goods.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 客户存货商品价格 + * @author YenHex + * @since 2021/10/28 + */ +@Data +public class InventoryCusPrice { + + private Long rowId; + + private String cusCode; + + private String invCode; + + private BigDecimal price; + + /** + * 开始时间 + */ + private Date startDate; + + /** + * 结束时间 + */ + private Date endDate; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/StandInventory.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/StandInventory.java new file mode 100644 index 0000000..bb286bf --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/StandInventory.java @@ -0,0 +1,35 @@ +package com.qs.serve.modules.goods.entity.dto; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/11/21 + */ +@Data +public class StandInventory { + + private String id; + private String invCode; + private String invName; + private String invSku; + private String invSkuCode; + private String invAddCode; + private String invSeries; + private String invCategory; + private String invBrand; + private String invOrderStatus; + private String invCostStatus; + private String chestCasing; + private String invUnitWeight; + private String invUnit; + private String invVolume; + private String invWeight; + private String invGrossWeight; + private String invPlace; + private String invTaste; + private String invStartDate; + private String invEndDate; + private String rowCreateTime; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/TbsCenterDto.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/TbsCenterDto.java new file mode 100644 index 0000000..4fae9eb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/dto/TbsCenterDto.java @@ -0,0 +1,85 @@ +package com.qs.serve.modules.goods.entity.dto; + +import com.qs.serve.modules.bms.entity.BmsCostCenter; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import lombok.AllArgsConstructor; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author YenHex + * @since 2022/11/10 + */ +@Data +public class TbsCenterDto { + + String id; + + String centerCode; + + String centerName; + + String centerType; + + LocalDateTime createTime; + + /** 费用占比率,单位百分位(该成本中心在费用中占比) */ + @NotNull(message = "费用占比率不能为空") + private BigDecimal centerRate; + + /** 费用占比金额(该成本中心在费用金额) */ + @NotNull(message = "费用占比率不能为空") + private BigDecimal centerAmount; + + public TbsCenterDto(){ + + } + + public TbsCenterDto(String id, String centerCode, String centerName, String centerType,LocalDateTime createTime) { + this.id = id; + this.centerCode = centerCode; + this.centerName = centerName; + this.centerType = centerType; + this.createTime = createTime; + } + + public TbsCenterDto(String id, String centerCode, String centerName, String centerType) { + this.id = id; + this.centerCode = centerCode; + this.centerName = centerName; + this.centerType = centerType; + } + + public TbsCenterDto(BmsRegion bmsRegion){ + this.id = bmsRegion.getId(); + this.centerCode = bmsRegion.getCode(); + this.centerName = bmsRegion.getName(); + this.centerType = "saleRegion"; + } + + public TbsCenterDto(BmsRegion2 bmsRegion){ + this.id = bmsRegion.getId(); + this.centerCode = bmsRegion.getCode(); + this.centerName = bmsRegion.getName(); + this.centerType = "bizRegion"; + } + + public TbsCenterDto(BmsSupplier supplier){ + this.id = supplier.getId(); + this.centerCode = supplier.getCode(); + this.centerName = supplier.getName(); + this.centerType = "customer"; + } + + public TbsCenterDto(BmsCostCenter costCenter){ + this.id = costCenter.getId().toString(); + this.centerCode = costCenter.getCode(); + this.centerName = costCenter.getName(); + this.centerType = "center"; + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/so/GoodsFeedbackQuery.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/so/GoodsFeedbackQuery.java new file mode 100644 index 0000000..fb82870 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/so/GoodsFeedbackQuery.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.goods.entity.so; + +import com.qs.serve.modules.goods.entity.GoodsFeedback; +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/11/6 + */ +@Data +public class GoodsFeedbackQuery extends GoodsFeedback { + + String queryTypeName; + + List selectUserIds; + + List selectTypesIds; + + List feedbackTypeSelectNames; + + private Integer pageNum; + private Integer pageSize; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/so/GoodsHisOrderQuery.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/so/GoodsHisOrderQuery.java new file mode 100644 index 0000000..b839ccb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/so/GoodsHisOrderQuery.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.goods.entity.so; + +import lombok.Data; +import java.util.List; +/** + * @author YenHex + * @since 2023/11/16 + */ +@Data +public class GoodsHisOrderQuery { + + String supplierCode; + + List cateIds; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/so/GoodsImminentBatchQuery.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/so/GoodsImminentBatchQuery.java new file mode 100644 index 0000000..1960b21 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/so/GoodsImminentBatchQuery.java @@ -0,0 +1,55 @@ +package com.qs.serve.modules.goods.entity.so; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.qs.serve.modules.goods.entity.dto.GoodsAccrIdsDto; +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/6/12 + */ +@Data +public class GoodsImminentBatchQuery { + + /** 关键字查询 */ + private String skuName; + private String skuCode; + private String spuName; + private String spuCode; + private String skuAddCode; + private String batchCode; + + /** 供应商编码 */ + private String supplierCode; + private String spuCodeOrName; + + /** 选中的商品规则 */ + private String searchCateRuleId; + + private Integer selectSpecialFlag; + private Integer orderFlag; + private String belong; + + /** 账套编码列表 */ + private List bookCodeList; + private GoodsAccrIdsDto subAccInfo; + private List notInSkuIds; + private List selectSpuIds; + private List selectNotInSpuIds; + private List selectCateIds; + private List selectNotIntCateIds; + + /** 一级类目:品牌名称 */ + private String cateFirstLabel; + /** 二级类目:类目名称 */ + private String cateSecondLabel; + /** 三级类目:系列名称 */ + private String cateThirdLabel; + + /** + * 过滤可下单的 + */ + private Integer filterFlag; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/so/InventoryCusPriceQuery.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/so/InventoryCusPriceQuery.java new file mode 100644 index 0000000..96b81bf --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/so/InventoryCusPriceQuery.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.goods.entity.so; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/9/6 + */ +@Data +public class InventoryCusPriceQuery { + + String cusCode; + List invCodes; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodSkuBatchResult.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodSkuBatchResult.java new file mode 100644 index 0000000..1e25abb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodSkuBatchResult.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.goods.entity.vo; + +import lombok.Data; + +/** + * @author YenHex + * @since 2022/10/24 + */ +@Data +public class GoodSkuBatchResult { + + /** + * 结果 0-正常 其它为失败 + */ + private Integer errorCode; + + private String message; + + private String productCode; + + private String invCode; + + private String name; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodSkuVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodSkuVo.java new file mode 100644 index 0000000..92ce156 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodSkuVo.java @@ -0,0 +1,28 @@ +package com.qs.serve.modules.goods.entity.vo; + +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpecValue; +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2022/10/20 + */ +@Data +public class GoodSkuVo extends GoodsSku { + + private String name; + + private String spuCode; + + private Long spuId; + + /** 是否上架(1是 0否) */ + private Integer shelf; + + /** 规格值信息 */ + private List specValueList; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsAccreditResult.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsAccreditResult.java new file mode 100644 index 0000000..a23b43f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsAccreditResult.java @@ -0,0 +1,66 @@ +package com.qs.serve.modules.goods.entity.vo; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * @author YenHex + * @since 2024/4/8 + */ +@Data +public class GoodsAccreditResult { + + private String id; + + /** + * goods,supplier + */ + private String ruleType; + + private String goodType; + + private String code; + + private String name; + + /** 0:in,1:not-in */ + private String accType; + + /** 维度类型:supplier-客户;bizRegion-行政区域;saleRegion-销售区域 */ + @NotNull(message = "维度类型:0-客户;1-行政区域;2-销售区域不能为空") + private String targetType; + + /** 维度编码 */ + @NotBlank(message = "维度编码不能为空") + @Length(max = 255,message = "维度编码长度不能超过255字") + private String targetCode; + + /** 维度名称 */ + @Length(max = 255,message = "维度名称长度不能超过255字") + private String targetName; + + /** 维度id */ + @NotBlank(message = "维度id不能为空") + @Length(max = 30,message = "维度id长度不能超过30字") + private String targetId; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime createTime; + + /** 创建人 */ + private String createUser; + + /** 创建人 */ + private String createUserCode; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsAccreditVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsAccreditVo.java new file mode 100644 index 0000000..38835ee --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsAccreditVo.java @@ -0,0 +1,49 @@ +package com.qs.serve.modules.goods.entity.vo; + +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.sys.entity.dto.SysUserSimpleVo; +import com.qs.serve.modules.sys.entity.dto.SysUserVo; +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/4/1 + */ +@Data +public class GoodsAccreditVo { + + /** 规则ID(更新必传) */ + private Long accreditId; + + /** 备注 */ + private String remark; + + /** 可下单 销售区域 */ + private List onlySaleRegionList; + + /** 不可下单 销售区域 */ + private List notInSaleRegionList; + + /** 可下单 行政区域 */ + private List onlyBizRegionList; + + /** 不可下单 行政区域 */ + private List notInBizRegionList; + + /** 可下单 客户 */ + private List onlySupplierList; + + /** 不可下单 客户 */ + private List notInSupplierList; + + /** 可下单 客户 */ + private List onlyUserList; + + /** 不可下单 客户 */ + private List notInUserList; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsFeedbackTypeTreeVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsFeedbackTypeTreeVo.java new file mode 100644 index 0000000..60a89c5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsFeedbackTypeTreeVo.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.goods.entity.vo; + +import com.qs.serve.common.model.dto.TreeNode; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +/** + * @author YenHex + * @since 2024/11/1 + */ +@Data +public class GoodsFeedbackTypeTreeVo extends TreeNode { + + /** 反馈类目 */ + private String name; + + /** 隐藏 */ + private Integer hideFlag; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsFeedbackVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsFeedbackVo.java new file mode 100644 index 0000000..2782c90 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsFeedbackVo.java @@ -0,0 +1,24 @@ +package com.qs.serve.modules.goods.entity.vo; + +import com.qs.serve.modules.goods.entity.GoodsFeedback; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/10/31 + */ +@Data +public class GoodsFeedbackVo extends GoodsFeedback { + + List goodSkuList; + + List goodSpuList; + + List feedBackTypes; + + List attachList; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsImminentBatchVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsImminentBatchVo.java new file mode 100644 index 0000000..acebc23 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsImminentBatchVo.java @@ -0,0 +1,126 @@ +package com.qs.serve.modules.goods.entity.vo; + +import com.baomidou.mybatisplus.annotation.SqlCondition; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + * @author YenHex + * @since 2024/6/12 + */ +@Data +public class GoodsImminentBatchVo { + + /** 批次skuId */ + private Long id; + + private String batchCode; + + /** 数量 */ + private Integer quantity; + + /** 已下单数量 */ + private Integer orderQuantity; + + /** 截止销售时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate endDate; + + /** 批次备注 */ + private String remark; + + private String spuId; + + private String spuCode; + + private String spuName; + + private String skuId; + + private String skuCode; + + private String skuName; + + private String skuAddCode; + + /** 图片 */ + private String picUrl; + + /** 销售价格 */ + private BigDecimal salesPrice; + + /** 市场价 */ + private BigDecimal marketPrice; + + /** 成本价 */ + private BigDecimal costPrice; + + /** 规格值 */ + private String specInfos; + + /** 库存 */ + private Integer stock; + + /** 重量(kg) */ + private BigDecimal weight; + + /** 体积(m³) */ + private BigDecimal volume; + + /** 净重 */ + private BigDecimal invUnitWeight; + + /** 最低起批数(0->不限制) */ + private Integer minPurchase; + + /** 是否可以下单 1、是;0否 */ + private Integer orderFlag; + + private Integer specialFlag; + + /** 在线下单 */ + private Integer orderOnlineFlag; + + /** 线下下单 */ + private Integer orderOfflineFlag; + + /** 单位id */ + private Long unitId; + + /** 单位 */ + private String unitName; + + /** 账套编码 */ + private String bookBelong; + + /** 账套名称 */ + private String bookName; + + /** 产地 */ + private String belong; + + /** 包装 */ + private String wrapVal; + + /** 口味 */ + private String tasteVal; + + /** 一级类目:品牌名称 */ + private String cateFirstLabel; + + /** 二级类目:类目名称 */ + private String cateSecondLabel; + + /** 三级类目:系列名称 */ + private String cateThirdLabel; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsRuleVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsRuleVo.java new file mode 100644 index 0000000..972cd0f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsRuleVo.java @@ -0,0 +1,34 @@ +package com.qs.serve.modules.goods.entity.vo; + +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/3/22 + */ +@Data +public class GoodsRuleVo { + + /** 规则ID(更新必传) */ + private Long ruleId; + + /** 备注 */ + private String remark; + + /** 只能选的分类 */ + private List onlyCategoryList; + + /** 不能选的分类 */ + private List notInCategoryList; + + /** 只能选的SPU */ + private List onlySpuList; + + /** 不能选的SPU */ + private List notInSpuList; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSkuExportVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSkuExportVo.java new file mode 100644 index 0000000..132b135 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSkuExportVo.java @@ -0,0 +1,138 @@ +package com.qs.serve.modules.goods.entity.vo; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import jdk.nashorn.internal.ir.annotations.Ignore; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * sku 实体类 + * @author YenHex + * @since 2022-10-09 + */ +@Data +public class GoodsSkuExportVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** PK */ + @TableId(type = IdType.AUTO) + private Long id; + + /** sku编码 */ + @Length(max = 32,message = "sku编码长度不能超过32字") + private String skuCode; + + private String skuName; + + private String name; + + /** spu编码 */ + private String spuCode; + + /** 销售价格 */ + private BigDecimal salesPrice; + + /** 市场价 */ + private BigDecimal marketPrice; + + /** 成本价 */ + private BigDecimal costPrice; + + /** 库存 */ + @NotNull(message = "库存不能为空") + private Integer stock; + + /** 重量(kg) */ + @NotNull(message = "重量(kg)不能为空") + private BigDecimal weight; + + /** 体积(m³) */ + @NotNull(message = "体积(m³)不能为空") + private BigDecimal volume; + + /** 最低起批数(0->不限制) */ + private Integer minPurchase; + + /** 投放费用 1、是;0否 */ + private Integer enable; + + /** 是否可以下单 1、是;0否 */ + private Integer orderFlag; + + private Integer specialFlag; + + /** 备注 */ + private String remark; + + /** 产地 */ + @NotNull(message = "产地不能为空") + private String belong; + + /** 账套名称 */ + private String bookName; + /** 包装 */ + @NotNull(message = "包装不能为空") + private String wrapVal; + + /** 口味 */ + @NotNull(message = "口味不能为空") + private String tasteVal; + + /** 可投放费用标识 */ + private Integer costFlag; + + private String skuAddCode; + /** 规格值 */ + private String specInfos; + /** 净重 */ + private BigDecimal invUnitWeight; + /** 单位id */ + private Long unitId; + + /** 单位 */ + private String unitName; + + /** + * 品牌 + */ + @TableField(exist = false) + private String brandName; + /** + * 分类 + */ + @TableField(exist = false) + private String categoryName; + /** + * 系列 + */ + @TableField(exist = false) + private String seriesName; + + /** + * 品牌 + */ + @TableField(exist = false) + private String brandCode; + /** + * 分类 + */ + @TableField(exist = false) + private String categoryCode; + /** + * 系列 + */ + @TableField(exist = false) + private String seriesCode; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSkuSpecValueVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSkuSpecValueVo.java new file mode 100644 index 0000000..8141356 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSkuSpecValueVo.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.goods.entity.vo; + +import lombok.Data; + +/** + * @author YenHex + * @since 2022/10/11 + */ +@Data +public class GoodsSkuSpecValueVo { + + /** 库存单位 */ + private Long skuId; + + /** 规格ID */ + private Long specId; + + /** 规格 */ + private String specName; + + /** 规格值ID */ + private Long specValueId; + + /** 规格值 */ + private String specValue; + + /** 规格值排序 */ + private Integer specValueSort; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSpecValueVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSpecValueVo.java new file mode 100644 index 0000000..0d5053d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSpecValueVo.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.goods.entity.vo; + +import lombok.Data; + +/** + * @author YenHex + * @since 2022/10/11 + */ +@Data +public class GoodsSpecValueVo { + + /** 规格值ID */ + private Long specValueId; + + /** 规格值 */ + private String specValue; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSpuExportVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSpuExportVo.java new file mode 100644 index 0000000..46cb5a2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSpuExportVo.java @@ -0,0 +1,102 @@ +package com.qs.serve.modules.goods.entity.vo; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import com.qs.serve.modules.goods.entity.GoodsSku; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * spu 实体类 + * @author YenHex + * @since 2022-10-09 + */ +@Data +@TableName(value = "goods_spu",autoResultMap = true) +public class GoodsSpuExportVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** PK */ + private Long id; + + /** 商品编码 */ + private String spuCode; + + /** 商品名字 */ + private String name; + + /** 投放费用(1是 0否) */ + private Integer shelf; + + /** 是否可以下单 1、是;0否 */ + private Integer orderFlag; + + /** 可投放费用标识 */ + private Integer costFlag; + + /** 存货标识 */ + private Integer spuCunhuoFlag; + + /** 商品销售类型:0-普通商品;1-赠品 */ + private Integer goodsSaleType; + + /** 三级类目:系列编码 */ + private String cateCode; + + /** 三级类目:系列名称 */ + private String cateName; + + + /** 账套名称 */ + private String bookName; + + /** 销量 */ + private Integer saleNum; + + /** 产品口味(非sku规格值) */ + private String tasteValue; + + /** 可下单/特殊品/未启用数量 */ + private String skuNumVal; + + /** 账套编码 */ + private String bookBelong; + + /** 一级类目:品牌名称 */ + @TableField(exist = false) + private String cateFirstLabel; + + /** 二级类目:类目名称 */ + @TableField(exist = false) + private String cateSecondLabel; + + /** 三级类目:系列名称 */ + @TableField(exist = false) + private String cateThirdLabel; + + /** 一级类目:品牌名称 */ + @TableField(exist = false) + private String cateFirstCode; + + /** 二级类目:类目名称 */ + @TableField(exist = false) + private String cateSecondCode; + + /** 三级类目:系列名称 */ + @TableField(exist = false) + private String cateThirdCode; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSpuSpecVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSpuSpecVo.java new file mode 100644 index 0000000..cfeef2e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSpuSpecVo.java @@ -0,0 +1,24 @@ +package com.qs.serve.modules.goods.entity.vo; + +import lombok.Data; +import java.util.List; +/** + * @author YenHex + * @since 2022/10/11 + */ +@Data +public class GoodsSpuSpecVo { + + /** 规格id */ + private Long specId; + + /** 规格名称 */ + private String name; + + /** 规格排序 */ + private Integer sort; + + /** 规格值列表 */ + private List specValueList; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSpuVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSpuVo.java new file mode 100644 index 0000000..9e7b1a9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/entity/vo/GoodsSpuVo.java @@ -0,0 +1,73 @@ +package com.qs.serve.modules.goods.entity.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.qs.serve.modules.goods.entity.GoodsSku; +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2022/10/11 + */ +@Data +public class GoodsSpuVo { + + private Long id; + + /** 商品编码 */ + private String spuCode; + + /** 商品名字 */ + private String name; + + /** 一级分类ID */ + private String categoryFirst; + + /** 二级分类ID */ + private String categorySecond; + + /** 三级分类ID */ + private String categoryThird; + + /** 商品图片 */ + private String[] picUrls; + + /** 是否上架(1是 0否) */ + private String shelf; + + /** 排序字段 */ + private Integer sort; + + /** 销量 */ + private Integer saleNum; + + /** sku列表 */ + private List skuList; + + /** 规格列表 */ + private List specList; + + /** sku与规格 关联列表 */ + private List skuSpecValueList; + + /** 一级类目:品牌名称 */ + private String cateFirstLabel; + + /** 二级类目:类目名称 */ + private String cateSecondLabel; + + /** 三级类目:系列名称 */ + private String cateThirdLabel; + + private String belong; + + /** 是否可以下单 1、是;0否 */ + private Integer orderFlag; + + /** 可投放费用标识 */ + private Integer costFlag; + + /** 存货标识 */ + private Integer spuCunhuoFlag; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsAccreditItemMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsAccreditItemMapper.java new file mode 100644 index 0000000..76e10fb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsAccreditItemMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.goods.entity.GoodsAccreditItem; + +/** + * 商品sku规则 Mapper + * @author YenHex + * @date 2024-04-01 + */ +public interface GoodsAccreditItemMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsAccreditMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsAccreditMapper.java new file mode 100644 index 0000000..ef2df44 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsAccreditMapper.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.qs.serve.modules.goods.entity.GoodsAccredit; +import com.qs.serve.modules.goods.entity.dto.GoodsAccreditExt; +import com.qs.serve.modules.goods.entity.dto.GoodsAccreditQuery; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 规则 Mapper + * @author YenHex + * @date 2024-04-01 + */ +public interface GoodsAccreditMapper extends BaseMapper { + + List queryPage(@Param("query") GoodsAccreditQuery query); + + List queryPage2(@Param("query") GoodsAccreditQuery query); + + List queryUnionPage(@Param("query") GoodsAccreditQuery query); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsBrandMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsBrandMapper.java new file mode 100644 index 0000000..4bce7bf --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsBrandMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.goods.entity.GoodsBrand; + +/** + * 品牌 Mapper + * @author YenHex + * @date 2022-10-11 + */ +public interface GoodsBrandMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsCategoryMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsCategoryMapper.java new file mode 100644 index 0000000..6a62eba --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsCategoryMapper.java @@ -0,0 +1,35 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.common.model.dto.SimpleCountValue; +import com.qs.serve.modules.goods.entity.GoodsCategory; +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 + * @date 2022-10-09 + */ +public interface GoodsCategoryMapper extends BaseMapper { + + @Select("SELECT COUNT(1) as count ,category_last as id FROM `goods_spu` where del_flag = 0 group by category_last ") + List selectCateCountLast(); + + @Select("SELECT COUNT(1) as count ,category_second as id FROM `goods_spu` where del_flag = 0 group by category_second ") + List selectCateCountSecond(); + + @Select("SELECT COUNT(1) as count ,category_first as id FROM `goods_spu` where del_flag = 0 group by category_first ") + List selectCateCountFirst(); + + @Update("update goods_category set del_flag = 1 , `code`= #{obj.code} where id = #{obj.id}") + int deleteByCate(@Param("obj") GoodsCategory entity); + + @Select("SELECT MAX(code) FROM goods_category WHERE code LIKE CONCAT(#{prefix}, '%')") + String findMaxCodeStartingWith(String prefix); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsCategoryRuleMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsCategoryRuleMapper.java new file mode 100644 index 0000000..66daac6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsCategoryRuleMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.goods.entity.GoodsCategoryRule; + +/** + * 品牌规则 Mapper + * @author YenHex + * @date 2023-09-18 + */ +public interface GoodsCategoryRuleMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsCrmSkuMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsCrmSkuMapper.java new file mode 100644 index 0000000..08afbd9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsCrmSkuMapper.java @@ -0,0 +1,100 @@ +package com.qs.serve.modules.goods.mapper; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/11/21 + */ +public interface GoodsCrmSkuMapper { + + /** + * 上架商品 + * @param codes + * @return + */ + @Update("") + int updateShelfOnInCodes(@Param("invCodes")List codes); + + /** + * 下架商品 + * @param codes + * @return + */ + @Update("") + int updateShelfOffNotInCodes(@Param("invCodes")List codes); + + + /** + * 设置非特殊品 + * @param codes + * @return + */ + @Update("") + int updateSpecialNotInCodes(@Param("invCodes")List codes); + + /** + * 设置特殊品 + * @param codes + * @return + */ + @Update("") + int updateSpecialInCodes(@Param("invCodes")List codes); + + /** + * 根据sku修改spu非特殊品 + * @return + */ + @Update("update goods_spu set goods_spu.special_sku_id = 0 " + + "where goods_spu.id not in ( " + + " select spu_id from goods_sku where goods_spu.special_sku_id is not null and goods_spu.special_sku_id !=0 )") + int updateSpuSpecialIdBySku(); + + /** + * 根据sku状态,更新spu上架状态 + * @return + */ + @Update("update goods_spu set order_flag = 0 where goods_spu.id not in ( " + + " select goods_sku.spu_id from goods_sku where goods_sku.`enable` = 1 " + + ") ") + int updateSpuShelfBySku(); + + //设置错误的产地,下架 + //select concat(spu_id,'_',belong) tmp,count(1) from goods_sku where `enable` = 1 and special_flag = 0 group by tmp HAVING count(1)>1 + + /** + * 根据sku是否特殊商品更新spu特殊商品标识 + * @return + */ + @Update("update goods_spu " + + " left join " + + " (select goods_sku.spu_id,goods_sku.id as sku_id from goods_sku where goods_sku.`enable` = 1 and special_flag = 1) sku_tmp" + + " on sku_tmp.spu_id = goods_spu.id" + + " set goods_spu.special_sku_id = sku_tmp.sku_id " + + " where sku_tmp.sku_id is not null ") + int updateSpuSpecSkuId(); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsCustomerPriceMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsCustomerPriceMapper.java new file mode 100644 index 0000000..c23e291 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsCustomerPriceMapper.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.goods.entity.GoodsCustomerPrice; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 客户价格关系表 Mapper + * @author YenHex + * @date 2024-01-08 + */ +public interface GoodsCustomerPriceMapper extends BaseMapper { + + List selectGoodsCustomerPriceList(@Param("query") GoodsCustomerPrice query); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsFeedbackMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsFeedbackMapper.java new file mode 100644 index 0000000..467bb77 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsFeedbackMapper.java @@ -0,0 +1,28 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.goods.entity.GoodsFeedback; +import com.qs.serve.modules.goods.entity.so.GoodsFeedbackQuery; +import com.qs.serve.modules.goods.entity.vo.GoodsFeedbackVo; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 问题反馈 Mapper + * @author YenHex + * @date 2024-10-25 + */ +public interface GoodsFeedbackMapper extends BaseMapper { + + @InterceptorIgnore(tenantLine = "1") + @Select("select feedback_type_names from goods_feedback where del_flag = 0 and feedback_type_names is not null group by feedback_type_names") + List selectHisTypes(); + + @InterceptorIgnore(tenantLine = "1") + List selectGoodsFeedbackList(@Param("query") GoodsFeedbackQuery query); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsFeedbackTypeMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsFeedbackTypeMapper.java new file mode 100644 index 0000000..ba53fa1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsFeedbackTypeMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.goods.entity.GoodsFeedbackType; + +/** + * 问题反馈类型 Mapper + * @author YenHex + * @date 2024-11-01 + */ +public interface GoodsFeedbackTypeMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsImminentBatchMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsImminentBatchMapper.java new file mode 100644 index 0000000..d23143f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsImminentBatchMapper.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.common.model.dto.RowParam; +import com.qs.serve.modules.goods.entity.GoodsImminentBatch; +import com.qs.serve.modules.goods.entity.so.GoodsImminentBatchQuery; +import com.qs.serve.modules.goods.entity.vo.GoodsImminentBatchVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 临期批次 Mapper + * @author YenHex + * @date 2024-06-11 + */ +public interface GoodsImminentBatchMapper extends BaseMapper { + + @InterceptorIgnore(tenantLine = "1") + long countVoList(@Param("query") GoodsImminentBatchQuery query); + + @InterceptorIgnore(tenantLine = "1") + List selectVoList(@Param("query") GoodsImminentBatchQuery query, @Param("pageInfo") RowParam rowParam); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsRuleItemMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsRuleItemMapper.java new file mode 100644 index 0000000..b276c8d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsRuleItemMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.goods.entity.GoodsRuleItem; + +/** + * 商品sku规则 Mapper + * @author YenHex + * @date 2024-03-22 + */ +public interface GoodsRuleItemMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsRuleMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsRuleMapper.java new file mode 100644 index 0000000..3986bb1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsRuleMapper.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.goods.entity.GoodsRule; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +/** + * 规则 Mapper + * @author YenHex + * @date 2024-03-22 + */ +public interface GoodsRuleMapper extends BaseMapper { + + @Select("select * from goods_rule where supplier_id = #{supplierId} limit 1") + GoodsRule selectRuleBySupplierId(@Param("supplierId")Long supplierId); + + @Select("select * from goods_rule where sale_region_id = #{saleRegionId} limit 1") + GoodsRule selectRuleBySaleRegionId(@Param("saleRegionId")String saleRegionId); + + @Select("select * from goods_rule where biz_region_id = #{bizRegionId} limit 1 ") + GoodsRule selectRuleByBizRegionId(@Param("bizRegionId")String bizRegionId); + + @Select("select * from goods_rule where user_id = #{userId} limit 1 ") + GoodsRule selectRuleByUserId(@Param("userId")String userId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSaleGroupMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSaleGroupMapper.java new file mode 100644 index 0000000..c001ab1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSaleGroupMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.goods.entity.GoodsSaleGroup; + +/** + * 商品销售分组 Mapper + * @author YenHex + * @date 2023-08-21 + */ +public interface GoodsSaleGroupMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSeriesMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSeriesMapper.java new file mode 100644 index 0000000..392ce9f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSeriesMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.goods.entity.GoodsSeries; + +/** + * 系列 Mapper + * @author YenHex + * @date 2022-10-11 + */ +public interface GoodsSeriesMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSkuMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSkuMapper.java new file mode 100644 index 0000000..b1d968d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSkuMapper.java @@ -0,0 +1,69 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.vo.GoodSkuVo; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +/** + * sku Mapper + * @author YenHex + * @date 2022-10-09 + */ +public interface GoodsSkuMapper extends BaseMapper { + + @Select("select count(1) from goods_sku where del_flag = 0 and order_online_flag = 1 and spu_id = #{spuId} ") + long countSkuByOrderOnlineFla(@Param("spuId") Long spuId); + + @Select("select count(1) from goods_sku where del_flag = 0 and order_offline_flag = 1 and spu_id = #{spuId} ") + long countSkuByOrderOfflineFla(@Param("spuId") Long spuId); + + @Update("update goods_sku set del_flag = 1 , sku_code = concat(sku_code,'_del',#{str}) where id = #{skuId}") + void updateSkuCodeAndDelFlag(@Param("skuId") Long id,@Param("str") String str); + + List getBelongStringList(); + + /** + * 查询vo + * @param goodsSku + * @return + */ + List selectSkuVo(@Param("query") GoodsSku goodsSku); + + + @InterceptorIgnore(tenantLine = "1") + int updateBookInfo(@Param("categoryIds")List categoryIds,@Param("bookCode") String bookCode,@Param("bookName") String bookName); + + @InterceptorIgnore(tenantLine = "1") + List selectByCategoryIds(@Param("categoryIds")List categoryIds,@Param("tenantId")String tenantId); + + + @Select("select * from goods_sku where sku_code = #{skuCode} and del_flag = 0 limit 1 ") + GoodsSku selectBySkuCode(@Param("skuCode")String skuCode); + + + /** + * 列出skuId + * @param cateIds + * @param spuIds + * @param skuIds + * @param notInCateIds + * @param notInSpuIds + * @param notInSkuIds + * @return + */ + @InterceptorIgnore(tenantLine = "1") + List listByOtherIds(@Param("cateIds") List cateIds, + @Param("spuIds") List spuIds, + @Param("skuIds") List skuIds, + @Param("notInCateIds") List notInCateIds, + @Param("notInSpuIds") List notInSpuIds, + @Param("notInSkuIds") List notInSkuIds); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSkuSpecValueMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSkuSpecValueMapper.java new file mode 100644 index 0000000..497cce8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSkuSpecValueMapper.java @@ -0,0 +1,68 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.goods.entity.GoodsSkuSpecValue; +import com.qs.serve.modules.goods.entity.vo.GoodsSkuSpecValueVo; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * sku规格值 Mapper + * @author YenHex + * @date 2022-10-09 + */ +public interface GoodsSkuSpecValueMapper extends BaseMapper { + + /** + * 查询spu的规格值 + * @param spuId + * @return + */ + @InterceptorIgnore(tenantLine = "1") + @Select("SELECT " + + " `goods_sku_spec_value`.`sku_id` as `skuId`," + + " `goods_spec_value`.`spec_id` as `specId`," + + " `goods_spec`.`name` as `specName`," + + " `goods_sku_spec_value`.`spec_value_id` as `specValueId`," + + " `goods_spec_value`.`name` as `specValue`," + + " `goods_sku_spec_value`.`sort` as `specValueSort`" + + " FROM `goods_sku_spec_value` " + + " LEFT JOIN `goods_spec_value` " + + " ON `goods_sku_spec_value`.spec_value_id = `goods_spec_value`.`id` " + + " LEFT JOIN `goods_spec` " + + " ON `goods_spec_value`.`spec_id` = `goods_spec`.`id` " + + " WHERE `goods_sku_spec_value`.`spu_id` = #{spuId}" + + " ORDER BY `goods_sku_spec_value`.`sort` DESC") + List listSpecValueBySpuId(@Param("spuId") Long spuId); + + /** + * 查询sku的规格值 + * @param skuId + * @return + */ + @InterceptorIgnore(tenantLine = "1") + @Select("SELECT " + + " `goods_sku_spec_value`.`sku_id` as `skuId`," + + " `goods_spec_value`.`spec_id` as `specId`," + + " `goods_spec`.`name` as `specName`," + + " `goods_sku_spec_value`.`spec_value_id` as `specValueId`," + + " `goods_spec_value`.`name` as `specValue`," + + " `goods_sku_spec_value`.`sort` as `specValueSort`" + + " FROM `goods_sku_spec_value` " + + " LEFT JOIN `goods_spec_value` " + + " ON `goods_sku_spec_value`.spec_value_id = `goods_spec_value`.`id` " + + " LEFT JOIN `goods_spec` " + + " ON `goods_spec_value`.`spec_id` = `goods_spec`.`id` " + + " WHERE " + + " `goods_sku_spec_value`.del_flag=0 " + + " and `goods_spec_value`.del_flag=0 " + + " and `goods_spec`.del_flag=0 " + + " and `goods_sku_spec_value`.`sku_id` = #{skuId}" + + " ORDER BY `goods_sku_spec_value`.`sort` DESC") + List listSpecValueBySkuId(@Param("skuId") Long skuId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSpecMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSpecMapper.java new file mode 100644 index 0000000..bfe5f09 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSpecMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.goods.entity.GoodsSpec; + +/** + * 规格 Mapper + * @author YenHex + * @date 2022-10-09 + */ +public interface GoodsSpecMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSpecValueMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSpecValueMapper.java new file mode 100644 index 0000000..ce09c8f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSpecValueMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.goods.entity.GoodsSpecValue; + +/** + * 规格值 Mapper + * @author YenHex + * @date 2022-10-09 + */ +public interface GoodsSpecValueMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSpuMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSpuMapper.java new file mode 100644 index 0000000..31ee928 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSpuMapper.java @@ -0,0 +1,39 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.common.model.dto.RowParam; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.entity.dto.GoodSpuSkuNum; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +/** + * spu Mapper + * @author YenHex + * @date 2022-10-09 + */ +public interface GoodsSpuMapper extends BaseMapper { + + + @Update("update goods_spu set del_flag = 1 , spu_code = concat(spu_code,'_del',#{str}) where id = #{spuId}") + void updateSpuCodeAndDelFlag(@Param("spuId") Long id,@Param("str") String str); + + List selectSpuList(@Param("query") GoodsSpu goodsSpu); + + @InterceptorIgnore(tenantLine = "1") + Long selectCountSkuJoinSpuList(@Param("query") GoodsSpu goodsSpu); + + + @InterceptorIgnore(tenantLine = "1") + List selectSkuJoinSpuList(@Param("query") GoodsSpu goodsSpu, @Param("pageInfo")RowParam rowParam); + + @InterceptorIgnore(tenantLine = "1") + List selectLastChangeSpuId(); + + GoodSpuSkuNum getSpuSkuNumInfo(@Param("spuId") Long spuId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSpuSpecMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSpuSpecMapper.java new file mode 100644 index 0000000..0cdace4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsSpuSpecMapper.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.goods.entity.GoodsSpuSpec; +import com.qs.serve.modules.goods.entity.vo.GoodsSpuSpecVo; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +/** + * spu规格 Mapper + * @author YenHex + * @date 2022-10-09 + */ +public interface GoodsSpuSpecMapper extends BaseMapper { + + /** + * 商品规格列表 + * @param spuId + * @return + */ + @InterceptorIgnore(tenantLine = "1") + @Select("select goods_spec.id specId,goods_spec.`name`,goods_spu_spec.sort from goods_spu_spec " + + " LEFT JOIN goods_spec" + + " ON goods_spu_spec.spec_id = goods_spec.id" + + " WHERE spu_id = #{spuId} ORDER BY goods_spu_spec.sort DESC") + List listSpuSpecs(@Param("spuId") Long spuId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsUnitMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsUnitMapper.java new file mode 100644 index 0000000..a7a197c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/mapper/GoodsUnitMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.goods.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.goods.entity.GoodsUnit; + +/** + * 单位 Mapper + * @author YenHex + * @date 2022-10-13 + */ +public interface GoodsUnitMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsAccreditItemService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsAccreditItemService.java new file mode 100644 index 0000000..8b96a9e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsAccreditItemService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.goods.entity.GoodsAccreditItem; + +/** + * 商品sku规则 服务接口 + * @author YenHex + * @date 2024-04-01 + */ +public interface GoodsAccreditItemService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsAccreditService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsAccreditService.java new file mode 100644 index 0000000..3e2f5b9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsAccreditService.java @@ -0,0 +1,60 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.modules.goods.entity.GoodsAccredit; +import com.qs.serve.modules.goods.entity.GoodsAccreditItem; +import com.qs.serve.modules.goods.entity.GoodsRuleItem; +import com.qs.serve.modules.goods.entity.bo.GoodsAccreditBo; +import com.qs.serve.modules.goods.entity.bo.GoodsAccreditImportBo; +import com.qs.serve.modules.goods.entity.dto.GoodsAccrIdsDto; +import com.qs.serve.modules.goods.entity.dto.GoodsAccreditExt; +import com.qs.serve.modules.goods.entity.dto.GoodsAccreditQuery; +import com.qs.serve.modules.goods.entity.vo.GoodsAccreditResult; +import com.qs.serve.modules.goods.entity.vo.GoodsAccreditVo; + +import java.util.List; +import java.util.Map; + +/** + * 规则 服务接口 + * @author YenHex + * @date 2024-04-01 + */ +public interface GoodsAccreditService extends IService { + + GoodsAccreditBo tranGoodsAccreditBo(GoodsAccreditImportBo importBo); + + PageVo queryPage(GoodsAccreditQuery query); + + List queryList(GoodsAccreditQuery query); + + void modify(GoodsAccreditBo param); + + GoodsAccreditVo getById(String cateId, String spuId, String skuId); + + /** + * 查询忽略的授权规则 + * 1.过滤规则的品类和SPU + * 2.忽略过滤符合当前客户的品类和SPU + * 3.忽略特供的品类和SPU + * @param supplierId + * @param bizRegionIds + * @param saleRegionIds + * @return + */ + List listIgnoreAcc(String supplierId,List bizRegionIds,List saleRegionIds); + + GoodsAccrIdsDto listIgnoreAcc2(String supplierId, List bizRegionIds, List saleRegionIds); + + /** + * 检测sku是否符合规则 + * @param spuIds + * @param accreditList + * @param throwEx 不判断数量拦截,只条件拦截 + * @return + */ + boolean checkSkuCode(List spuIds, List accreditList, boolean throwEx); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsApplicationService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsApplicationService.java new file mode 100644 index 0000000..b2dbe3c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsApplicationService.java @@ -0,0 +1,320 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.JsonUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.entity.dto.GoodsTargetInfo; +import com.qs.serve.modules.goods.entity.dto.StandInventory; +import com.qs.serve.modules.goods.mapper.GoodsCrmSkuMapper; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/2/20 + */ +@Service +@AllArgsConstructor +public class GoodsApplicationService { + + + private final GoodsSkuService goodsSkuService; + private final GoodsSpuService goodsSpuService; + private final GoodsCategoryService goodsCategoryService; + private final SeeYonRequestBaseService seeYonRequestBaseService; + private final GoodsCrmSkuMapper goodsCrmSkuMapper; + + public void syncSkuPrice(){ + R result = seeYonRequestBaseService.getBase(TbsSeeYonConst.ERP_CUS_INV_SYNC_PRICE,""); + } + + public void syncStandGoodsSpu(){ + //兼容任务调度 + AuthContextUtils.setTenant("001"); + //获取stand表的存货 + R result = seeYonRequestBaseService.getBase(TbsSeeYonConst.ERP_CUS_INV_STAND,""); + String listJson = result.getData(); + List inventoryList = JsonUtil.jsonToList(listJson,StandInventory.class); + + LambdaQueryWrapper spuLqw = new LambdaQueryWrapper<>(); + spuLqw.eq(GoodsSpu::getCategoryFirst,"1"); + List goodsSpuList = goodsSpuService.list(spuLqw); + for(GoodsSpu spu:goodsSpuList) { + GoodsSpu finalSpu = spu; + List tempInvList = inventoryList.stream().filter(a->a.getInvSkuCode().equals(finalSpu.getSpuCode())).collect(Collectors.toList()); + StandInventory inventory = tempInvList.get(0); + spu = setCategoryInfo(inventory, spu); + goodsSpuService.updateById(spu); + } + } + + public void syncStandGoods(boolean isFullUpdate){ + //兼容任务调度 + AuthContextUtils.setTenant("001"); + //获取stand表的存货 + R result = seeYonRequestBaseService.getBase(TbsSeeYonConst.ERP_CUS_INV_STAND,""); + String listJson = result.getData(); + List inventoryList = JsonUtil.jsonToList(listJson,StandInventory.class); + + List spuCodes = inventoryList.stream().map(StandInventory::getInvSkuCode).distinct().collect(Collectors.toList()); + List skuCodes = inventoryList.stream().map(StandInventory::getInvCode).distinct().collect(Collectors.toList()); + LambdaQueryWrapper spuLqw = new LambdaQueryWrapper<>(); + spuLqw.select(GoodsSpu::getId,GoodsSpu::getSpuCode); + spuLqw.in(GoodsSpu::getSpuCode,spuCodes); + List goodsSpuList = goodsSpuService.list(spuLqw); + Map spuCodeGetIdMap = new HashMap<>(); + for (GoodsSpu spu : goodsSpuList) { + spuCodeGetIdMap.put(spu.getSpuCode(),spu.getId()); + } + + LambdaQueryWrapper skuLqw = new LambdaQueryWrapper<>(); + skuLqw.select(GoodsSku::getId,GoodsSku::getSkuCode); + skuLqw.in(GoodsSku::getSkuCode,skuCodes); + List skus = goodsSkuService.list(skuLqw); + Map skuCodeGetIdMap = new HashMap<>(); + for (GoodsSku sku : skus) { + skuCodeGetIdMap.put(sku.getSkuCode(),sku.getId()); + } + + //更新sku + for (StandInventory inventory : inventoryList) { + + //过滤错误的sku + if(!inventory.getInvCode().startsWith("3")){ + continue; + } + + //空值 默认开平 + if(inventory.getInvPlace()==null){ + inventory.setInvPlace("开平"); + } + //开平康力 改 康力 + if("开平康力".equals(inventory.getInvPlace())){ + inventory.setInvPlace("康力"); + } + //移除产字眼 + inventory.setInvPlace(inventory.getInvPlace().replace("产","")); + + Long skuId = skuCodeGetIdMap.get(inventory.getInvCode()); + Long spuId = spuCodeGetIdMap.get(inventory.getInvSkuCode()); + if(!isFullUpdate&&skuId!=null){ + continue; + } + if(spuId==null){ + //add new spu + GoodsSpu spu = new GoodsSpu(); + spu.setId(spuId); + spu.setSpuCode(inventory.getInvSkuCode()); + spu.setName(inventory.getInvSku()); + + spu = setCategoryInfo(inventory,spu); + + spu.setShelf(1); + spu.setOrderFlag(Integer.parseInt(inventory.getInvOrderStatus())); + spu.setCostFlag(Integer.parseInt(inventory.getInvCostStatus())); + goodsSpuService.save(spu); + //防止多次保存 + spuId = spu.getId(); + spuCodeGetIdMap.put(spu.getSpuCode(),spuId); + }else{ + GoodsSpu spu = new GoodsSpu(); + spu.setId(spuId); + spu.setName(inventory.getInvSku()); + spu.setShelf(1); +// spu.setOrderFlag(Integer.parseInt(inventory.getInvOrderStatus())); +// spu.setCostFlag(Integer.parseInt(inventory.getInvCostStatus())); + spu = setCategoryInfo(inventory,spu); + goodsSpuService.updateById(spu); + } + GoodsSku sku = new GoodsSku(); + sku.setId(skuId); + sku.setSkuCode(inventory.getInvCode()); + sku.setSkuAddCode(inventory.getInvAddCode()); + sku.setSkuName(inventory.getInvName()); + sku.setSpuId(spuId); + sku.setSpecInfos(inventory.getInvPlace()+";"+inventory.getInvTaste()+";"+inventory.getChestCasing()); + if(StringUtils.hasText(inventory.getInvWeight())){ + sku.setWeight(new BigDecimal(inventory.getInvWeight())); + } + if(StringUtils.hasText(inventory.getInvVolume())){ + sku.setVolume(new BigDecimal(inventory.getInvVolume())); + } + sku.setOrderFlag(Integer.parseInt(inventory.getInvOrderStatus())); + sku.setUnitId(0L); + sku.setUnitName(inventory.getInvUnit()); + sku.setBelong(inventory.getInvPlace()); + sku.setWrapVal(inventory.getChestCasing()); + sku.setTasteVal(inventory.getInvTaste()); + sku.setCostFlag(Integer.parseInt(inventory.getInvCostStatus())); + if(sku.getId()==null){ + sku.setSalesPrice(BigDecimal.ZERO); + sku.setMarketPrice(BigDecimal.ZERO); + sku.setCostPrice(BigDecimal.ZERO); + goodsSkuService.save(sku); + }else { + goodsSkuService.updateById(sku); + } + } + //更新商品状态 + seeYonRequestBaseService.getBase(TbsSeeYonConst.ERP_CUS_INV_SPECIAL,""); + seeYonRequestBaseService.getBase(TbsSeeYonConst.ERP_CUS_INV_SHELF,""); + } + + private GoodsSpu setCategoryInfo(StandInventory inventory, GoodsSpu spu) { + // 创建品牌级别的查询包装器 + LambdaQueryWrapper brandLqw = new LambdaQueryWrapper<>(); + brandLqw.eq(GoodsCategory::getName, inventory.getInvBrand()); + List brandList = goodsCategoryService.list(brandLqw); + + // 如果品牌不存在,则创建一个新的品牌类别 + if (brandList.size() == 0) { + GoodsCategory brand = new GoodsCategory(); + brand.setEnable(1); + brand.setParentId(null); // 设置父ID为null,表示这是顶级类别 + brand.setCode(goodsCategoryService.findMaxCodeStartingWith("B")); // 生成以"B"开头的最大代码 + brand.setName(inventory.getInvBrand()); // 设置品牌名称 + brand.setDescription(null); // 描述设置为null + brand.setCostFlag(1); // 设置成本标志 + brand.setSort(0); // 排序设置为0 + goodsCategoryService.modify(brand); // 保存新的品牌类别 + brandList = goodsCategoryService.list(brandLqw); // 重新获取品牌列表 + } + + // 如果品牌列表不为空,设置第一级类别ID + if (brandList.size() > 0) { + spu.setCategoryFirst(brandList.get(0).getId().toString()); + } + + // 创建类别级别的查询包装器 + LambdaQueryWrapper categoryLqw = new LambdaQueryWrapper<>(); + categoryLqw.eq(GoodsCategory::getParentId, Long.parseLong(spu.getCategoryFirst())); + categoryLqw.eq(GoodsCategory::getName, inventory.getInvCategory()); + List brandCategoryList = goodsCategoryService.list(categoryLqw); + + // 如果类别不存在,则创建一个新的类别 + if (brandCategoryList.size() == 0) { + GoodsCategory category = new GoodsCategory(); + category.setEnable(1); + category.setParentId(Long.parseLong(spu.getCategoryFirst())); // 设置父ID为第一级类别ID + category.setCode(goodsCategoryService.findMaxCodeStartingWith("C")); // 生成以"C"开头的最大代码 + category.setName(inventory.getInvCategory()); // 设置类别名称 + category.setDescription(null); // 描述设置为null + category.setCostFlag(1); // 设置成本标志 + category.setSort(0); // 排序设置为0 + goodsCategoryService.modify(category); // 保存新的类别 + brandCategoryList = goodsCategoryService.list(categoryLqw); // 重新获取类别列表 + } + + // 如果类别列表不为空,设置第二级类别ID + if (brandCategoryList.size() > 0) { + spu.setCategorySecond(brandCategoryList.get(0).getId().toString()); + } + + // 创建系列级别的查询包装器 + LambdaQueryWrapper seriesLqw = new LambdaQueryWrapper<>(); + seriesLqw.eq(GoodsCategory::getParentId, Long.parseLong(spu.getCategorySecond())); + seriesLqw.eq(GoodsCategory::getName, inventory.getInvSeries()); + List seriesList = goodsCategoryService.list(seriesLqw); + + // 如果系列不存在,则创建一个新的系列 + if (seriesList.size() == 0) { + GoodsCategory series = new GoodsCategory(); + series.setEnable(1); + series.setParentId(Long.parseLong(spu.getCategorySecond())); // 设置父ID为第二级类别ID + series.setCode(goodsCategoryService.findMaxCodeStartingWith("S")); // 生成以"S"开头的最大代码 + series.setName(inventory.getInvSeries()); // 设置系列名称 + series.setDescription(null); // 描述设置为null + series.setCostFlag(1); // 设置成本标志 + series.setSort(0); // 排序设置为0 + goodsCategoryService.modify(series); // 保存新的系列 + seriesList = goodsCategoryService.list(seriesLqw); // 重新获取系列列表 + } + + // 如果系列列表不为空,设置第三级和最终类别ID + if (seriesList.size() > 0) { + spu.setCategoryThird(seriesList.get(0).getId().toString()); + spu.setCategoryLast(spu.getCategoryThird()); + } + + // 如果最终类别为空,则设置默认类别 + if(spu.getCategoryLast() == null) { + spu.setCategoryFirst("1"); + spu.setCategorySecond("2"); + spu.setCategoryThird("3"); + spu.setCategoryLast("3"); + } + return spu; + } + + + public GoodsTargetInfo getGoodsTargetInfo(String goodsType,Long goodsIds){ + List list = this.getGoodsTargetInfo(goodsType, Arrays.asList(goodsIds)); + if(list.size()>0){ + return list.get(0); + } + return null; + } + + public List getGoodsTargetInfo(String goodsType,List goodsIds){ + List resultList = new ArrayList<>(); + if(goodsType.equals(TbsGoodsType.spu.name())){ + for (Long spuId : goodsIds) { + GoodsSpu goodsSpu = goodsSpuService.getById(spuId); + GoodsCategory category1 = goodsCategoryService.getById(goodsSpu.getCategoryFirst()); + GoodsCategory category2 = goodsCategoryService.getById(goodsSpu.getCategorySecond()); + GoodsCategory category3 = goodsCategoryService.getById(goodsSpu.getCategoryThird()); + GoodsTargetInfo targetInfo = new GoodsTargetInfo(); + targetInfo.setTargetType(goodsType); + targetInfo.setTargetId(goodsSpu.getId()); + targetInfo.setTargetCode(goodsSpu.getSpuCode()); + targetInfo.setTargetName(goodsSpu.getName()); + targetInfo.setTargetLevelPathIds(category1.getId()+"_"+category2.getId()+"_"+category3.getId()+"_"+goodsSpu.getId()); + targetInfo.setTargetLevelPathNames(category1.getName()+"_"+category2.getName()+"_"+category3.getName()+"_"+goodsSpu.getName()); + resultList.add(targetInfo); + } + }else if (goodsType.equals(TbsGoodsType.sku.name())){ + for (Long skuId : goodsIds) { + GoodsSku sku = goodsSkuService.getById(skuId); + GoodsSpu goodsSpu = goodsSpuService.getById(sku.getSpuId()); + GoodsCategory category1 = goodsCategoryService.getById(goodsSpu.getCategoryFirst()); + GoodsCategory category2 = goodsCategoryService.getById(goodsSpu.getCategorySecond()); + GoodsCategory category3 = goodsCategoryService.getById(goodsSpu.getCategoryThird()); + GoodsTargetInfo targetInfo = new GoodsTargetInfo(); + targetInfo.setTargetType(goodsType); + targetInfo.setTargetId(sku.getId()); + targetInfo.setTargetCode(sku.getSkuCode()); + targetInfo.setTargetName(sku.getSpecInfos()); + targetInfo.setTargetLevelPathIds(category1.getId()+"_"+category2.getId()+"_"+category3.getId()+"_"+goodsSpu.getId()+"_"+sku.getId()); + targetInfo.setTargetLevelPathNames(category1.getName()+"_"+category2.getName()+"_"+category3.getName()+"_"+goodsSpu.getName()+"_"+sku.getSpecInfos()); + resultList.add(targetInfo); + } + }else { + //品牌、品类、系列 + for (Long categoryId : goodsIds) { + GoodsCategory category = goodsCategoryService.getById(categoryId); + GoodsTargetInfo targetInfo = new GoodsTargetInfo(); + targetInfo.setTargetType(goodsType); + targetInfo.setTargetId(category.getId()); + targetInfo.setTargetCode(category.getCode()); + targetInfo.setTargetName(category.getName()); + targetInfo.setTargetLevelPathIds(category.getLevelPath()); + targetInfo.setTargetLevelPathNames(category.getLevelPathNames()); + resultList.add(targetInfo); + } + } + return resultList; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsBrandService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsBrandService.java new file mode 100644 index 0000000..f29939b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsBrandService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.goods.entity.GoodsBrand; + +/** + * 品牌 服务接口 + * @author YenHex + * @date 2022-10-11 + */ +public interface GoodsBrandService extends IService { + GoodsBrand getByCode(String code); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsCategoryRuleService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsCategoryRuleService.java new file mode 100644 index 0000000..35332de --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsCategoryRuleService.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.goods.entity.GoodsCategoryRule; +import com.qs.serve.modules.goods.entity.bo.GoodsCategoryRuleBo; + +/** + * 品牌规则 服务接口 + * @author YenHex + * @date 2023-09-18 + */ +public interface GoodsCategoryRuleService extends IService { + + void doSetDefault(String id); + + GoodsCategoryRule modify(GoodsCategoryRuleBo goodsCategoryRuleBo); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsCategoryService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsCategoryService.java new file mode 100644 index 0000000..9bc314e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsCategoryService.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.bo.GoodsCategoryLevelBo; + +/** + * 分类 服务接口 + * @author YenHex + * @date 2022-10-09 + */ +public interface GoodsCategoryService extends IService { + + GoodsCategory getByCode(String code); + + GoodsCategory getByName(String code,Integer level); + + void modify(GoodsCategory category); + + void modifyLevel(GoodsCategoryLevelBo category); + + void deleteCateById(Long id); + + String findMaxCodeStartingWith(String prefix); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsCustomerPriceService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsCustomerPriceService.java new file mode 100644 index 0000000..b558970 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsCustomerPriceService.java @@ -0,0 +1,45 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.goods.entity.GoodsCustomerPrice; +import com.qs.serve.modules.goods.entity.bo.GoodsCustomerPriceBo; +import com.qs.serve.modules.goods.entity.bo.GoodsCustomerPriceSingleBo; +import org.springframework.web.bind.annotation.RequestBody; + +import javax.validation.Valid; +import java.util.List; + +/** + * 客户价格关系表 服务接口 + * @author YenHex + * @date 2024-01-08 + */ +public interface GoodsCustomerPriceService extends IService { + + List selectGoodsCustomerPriceList(GoodsCustomerPrice query); + + void saveBatch(GoodsCustomerPriceBo param); + + GoodsCustomerPrice singleModify(GoodsCustomerPriceSingleBo param); + + GoodsCustomerPrice getBySupplierIdAndCode(String supplierId,String skuCode); + + GoodsCustomerPrice getByCusCodeAndSkuCode(String supplierCode,String skuCode); + + List getBySupplierCodeAndCode(String supplierCode, List skuCode); + + /** + * 同步客户特殊价() + */ + void syncCustomerPrice(); + + void syncCustomerPrice(String dictKey,String dictTitle,String url); + + /** + * 刷新客户所有的商品特殊价 + * @param cusCode + */ + void syncCustomerPrice(String cusCode); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsFeedbackService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsFeedbackService.java new file mode 100644 index 0000000..27ffed3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsFeedbackService.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.goods.entity.GoodsFeedback; +import com.qs.serve.modules.goods.entity.bo.GoodsFeedbackBo; +import com.qs.serve.modules.goods.entity.so.GoodsFeedbackQuery; +import com.qs.serve.modules.goods.entity.vo.GoodsFeedbackVo; + +import java.util.List; + +/** + * 问题反馈 服务接口 + * @author YenHex + * @date 2024-10-25 + */ +public interface GoodsFeedbackService extends IService { + + /** + * 编辑 + * @param param + */ + void modify(GoodsFeedbackBo param); + + List selectListVo(GoodsFeedbackQuery query); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsFeedbackTypeService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsFeedbackTypeService.java new file mode 100644 index 0000000..1650ef3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsFeedbackTypeService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.goods.entity.GoodsFeedbackType; + +/** + * 问题反馈类型 服务接口 + * @author YenHex + * @date 2024-11-01 + */ +public interface GoodsFeedbackTypeService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsImminentBatchService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsImminentBatchService.java new file mode 100644 index 0000000..c8f8cec --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsImminentBatchService.java @@ -0,0 +1,24 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.goods.entity.GoodsImminentBatch; +import com.qs.serve.modules.goods.entity.so.GoodsImminentBatchQuery; +import com.qs.serve.modules.goods.entity.vo.GoodsImminentBatchVo; + +import java.util.List; + +/** + * 临期批次 服务接口 + * @author YenHex + * @date 2024-06-11 + */ +public interface GoodsImminentBatchService extends IService { + + boolean checkExist(String batchCode,String skuId,Long rowId); + + long countVoList(GoodsImminentBatchQuery query); + + List selectVoList(GoodsImminentBatchQuery query); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsRuleItemService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsRuleItemService.java new file mode 100644 index 0000000..350550e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsRuleItemService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.goods.entity.GoodsRuleItem; + +/** + * 商品sku规则 服务接口 + * @author YenHex + * @date 2024-03-22 + */ +public interface GoodsRuleItemService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsRuleService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsRuleService.java new file mode 100644 index 0000000..01cd3ff --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsRuleService.java @@ -0,0 +1,69 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.modules.goods.entity.GoodsRule; +import com.qs.serve.modules.goods.entity.GoodsRuleItem; +import com.qs.serve.modules.goods.entity.bo.GoodsRuleBo; +import com.qs.serve.modules.goods.entity.bo.GoodsRuleImportBo; +import com.qs.serve.modules.goods.entity.dto.GoodsRuleBaseDTO; +import com.qs.serve.modules.goods.entity.dto.GoodsRuleItemDTO; +import com.qs.serve.modules.goods.entity.vo.GoodsRuleVo; + +import java.util.List; + +/** + * 规则 服务接口 + * @author YenHex + * @date 2024-03-22 + */ +public interface GoodsRuleService extends IService { + + void modify(GoodsRuleBo param); + + GoodsRuleBo tranGoodsRuleBo(GoodsRuleImportBo ruleImportBo); + + GoodsRuleVo getVoById(GoodsRuleBaseDTO baseDTO); + + List listByUserId(String userId); + + List listBySupplierId(String supplierId); + + GoodsRuleItemDTO buildGoodsRuleItemDTO(List ruleItems); + + /** + * 检测sku是否符合规则 + * @param skuCodes + * @param supplierId + * @param throwEx 不判断数量拦截,只条件拦截 + * @return + */ + boolean checkSkuCode(List skuCodes,String supplierId,boolean throwEx); + + /** + * 检测sku是否符合规则 + * @param skuCodes + * @param userId + * @param throwEx + * @return + */ + boolean checkSkuCodeByUserId(List skuCodes,String userId,boolean throwEx); + + /** + * 检测sku是否符合规则,返回不和规范的ID + * @param supplierId + * @param skuIds + * @return + */ + List checkSkuCode(String supplierId,List skuIds); + + /** + * 检测sku是否符合的人员规则,返回不和规范的ID + * @param userId + * @param skuIds + * @return + */ + List checkSkuCodeByUserId(String userId,List skuIds); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSaleGroupService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSaleGroupService.java new file mode 100644 index 0000000..c3ab78c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSaleGroupService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.goods.entity.GoodsSaleGroup; + +/** + * 商品销售分组 服务接口 + * @author YenHex + * @date 2023-08-21 + */ +public interface GoodsSaleGroupService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSeriesService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSeriesService.java new file mode 100644 index 0000000..2ba8164 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSeriesService.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.goods.entity.GoodsSeries; + +/** + * 系列 服务接口 + * @author YenHex + * @date 2022-10-11 + */ +public interface GoodsSeriesService extends IService { + + GoodsSeries getByCode(String code); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSkuService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSkuService.java new file mode 100644 index 0000000..1991061 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSkuService.java @@ -0,0 +1,48 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.bo.GoodsSkuBo; +import com.qs.serve.modules.goods.entity.vo.GoodSkuVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * sku 服务接口 + * @author YenHex + * @date 2022-10-09 + */ +public interface GoodsSkuService extends IService { + + List getBelongPlace(); + + GoodsSku getByCode(String code); + + List getByCodes(List codes); + + List getBySpuId(Long spuId); + + List selectSkuVo(GoodsSku goodsSku); + + List selectSkuByCategoryIds(List categoryIds); + + /** + * 初始化客户特殊价 + * @param supplierCode + * @param skus + */ + void initSkuCusPrice(String supplierCode,List skus); + + void initSkuVoCusPrice(String supplierCode,List skus); + + void editSku(GoodsSkuBo goodSkuVo); + + /** + * 移除商城解构 + * @param goodSkuVo + */ + void editSku2(GoodsSkuBo goodSkuVo); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSkuSpecValueService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSkuSpecValueService.java new file mode 100644 index 0000000..3125ee3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSkuSpecValueService.java @@ -0,0 +1,41 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.goods.entity.GoodsSkuSpecValue; +import com.qs.serve.modules.goods.entity.vo.GoodsSkuSpecValueVo; + +import java.util.List; + +/** + * sku规格值 服务接口 + * @author YenHex + * @date 2022-10-09 + */ +public interface GoodsSkuSpecValueService extends IService { + + /** + * 查询spu的规格值 + * @param spuId + * @return + */ + List listSpecValueBySpuId(Long spuId); + + /** + * 查询sku的规格值 + * @param skuId + * @return + */ + List listSpecValueBySkuId(Long skuId); + + GoodsSkuSpecValue getByIds(Long skuId,Long specValueId); + + /** + * 初始化商品规格值绑定 + * @param spuId + * @param skuId + * @param specValueId + */ + void initSkuSpecValue(Long spuId,Long skuId,Long specValueId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSpecService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSpecService.java new file mode 100644 index 0000000..8df2a95 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSpecService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.goods.entity.GoodsSpec; + +/** + * 规格 服务接口 + * @author YenHex + * @date 2022-10-09 + */ +public interface GoodsSpecService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSpecValueService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSpecValueService.java new file mode 100644 index 0000000..1fdb530 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSpecValueService.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.goods.entity.GoodsSpecValue; + +/** + * 规格值 服务接口 + * @author YenHex + * @date 2022-10-09 + */ +public interface GoodsSpecValueService extends IService { + + GoodsSpecValue getBySpec(Long specId,String value); + GoodsSpecValue initSpecValue(Long specId,String value); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSpuService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSpuService.java new file mode 100644 index 0000000..0fb7d53 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSpuService.java @@ -0,0 +1,69 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.entity.bo.GoodsSpuBatchTasteBo; +import com.qs.serve.modules.goods.entity.bo.GoodsSpuBo; +import com.qs.serve.modules.goods.entity.bo.GoodsSpuEditBo; +import com.qs.serve.modules.goods.entity.bo.GoodsSpuTasteBo; +import com.qs.serve.modules.goods.entity.vo.GoodSkuBatchResult; +import com.qs.serve.modules.goods.entity.vo.GoodsSpuVo; +import com.qs.serve.modules.oms.entity.dto.OmsSpuToSkuKey; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * spu 服务接口 + * @author YenHex + * @date 2022-10-09 + */ +public interface GoodsSpuService extends IService { + + List selectSpuList(GoodsSpu goodsSpu); + + Long selectCountSkuJoinSpuList(GoodsSpu goodsSpu); + + List selectSkuJoinSpuList(GoodsSpu goodsSpu); + + GoodsSpuVo getVoById(Long id,String supplierCode); + + GoodsSpu getByCode(String code); + + List getByCodes(List codes); + + GoodsSpu getByName(String name); + + List saveBatchTasteSpu(GoodsSpuBatchTasteBo batchTasteBo); + + void edit(GoodsSpuEditBo spuEditBo); + + GoodsSpu editTasteSpu(GoodsSpuBo param); + + GoodSkuBatchResult editTasteBo(GoodsSpuTasteBo tasteProduct); + + List selectListBySpuCodes(List spuCodes); + + /** + * + * @param placeName + * @param spuCodes + * @return + */ + List getSpuToSkuInfo(String placeName, List spuCodes); + + /** + * 最近SKU或者SPU有更新的,更新skuNumVal字段 + */ + void updateSkuNumByLastChange(); + + /** 根据sku的状态更新spu状态 */ + void updateOnlineOfflineFlat(Long spuId); + + void initSkuNum(); + + boolean updateSkuNumString(List spuIds); + + String getSkuNumString(Long spuId); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSpuSpecService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSpuSpecService.java new file mode 100644 index 0000000..826115a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsSpuSpecService.java @@ -0,0 +1,24 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.goods.entity.GoodsSpuSpec; +import com.qs.serve.modules.goods.entity.vo.GoodsSpuSpecVo; + +import java.util.List; + +/** + * spu规格 服务接口 + * @author YenHex + * @date 2022-10-09 + */ +public interface GoodsSpuSpecService extends IService { + + /** + * 商品规格列表 + * @param spuId + * @return + */ + List listSpuSpecs(Long spuId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsUnitService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsUnitService.java new file mode 100644 index 0000000..545b64a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/GoodsUnitService.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.goods.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.goods.entity.GoodsUnit; + +/** + * 单位 服务接口 + * @author YenHex + * @date 2022-10-13 + */ +public interface GoodsUnitService extends IService { + + GoodsUnit getByName(String name); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsAccreditItemServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsAccreditItemServiceImpl.java new file mode 100644 index 0000000..123f458 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsAccreditItemServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.goods.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.entity.GoodsAccreditItem; +import com.qs.serve.modules.goods.service.GoodsAccreditItemService; +import com.qs.serve.modules.goods.mapper.GoodsAccreditItemMapper; + +/** + * 商品sku规则 服务实现类 + * @author YenHex + * @since 2024-04-01 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsAccreditItemServiceImpl extends ServiceImpl implements GoodsAccreditItemService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsAccreditServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsAccreditServiceImpl.java new file mode 100644 index 0000000..0af1a5c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsAccreditServiceImpl.java @@ -0,0 +1,981 @@ +package com.qs.serve.modules.goods.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.goods.entity.*; +import com.qs.serve.modules.goods.entity.bo.GoodsAccreditBo; +import com.qs.serve.modules.goods.entity.bo.GoodsAccreditImportBo; +import com.qs.serve.modules.goods.entity.dto.GoodsAccrIdsDto; +import com.qs.serve.modules.goods.entity.dto.GoodsAccreditExt; +import com.qs.serve.modules.goods.entity.dto.GoodsAccreditQuery; +import com.qs.serve.modules.goods.entity.vo.GoodsAccreditResult; +import com.qs.serve.modules.goods.entity.vo.GoodsAccreditVo; +import com.qs.serve.modules.goods.mapper.*; +import com.qs.serve.modules.goods.service.GoodsAccreditItemService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.entity.dto.SysUserSimpleVo; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.service.GoodsAccreditService; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 规则 服务实现类 + * @author YenHex + * @since 2024-04-01 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsAccreditServiceImpl extends ServiceImpl implements GoodsAccreditService { + + private final GoodsCategoryMapper categoryMapper; + private final GoodsSpuMapper goodsSpuMapper; + private final GoodsSkuMapper goodsSkuMapper; + + private final SysUserMapper sysUserMapper; + + private final BmsRegionMapper regionMapper; + private final BmsRegion2Mapper region2Mapper; + private final BmsSupplierMapper supplierMapper; + + private final GoodsAccreditItemService goodsAccreditItemService; + + @Override + public GoodsAccreditBo tranGoodsAccreditBo(GoodsAccreditImportBo importBo) { + importBo.setSuccessFlag(true); + GoodsAccreditBo accreditBo = CopierUtil.copy(importBo,new GoodsAccreditBo()); + //导入使用局部更新 + accreditBo.setOnlyPastUpdate(true); + List onlySaleRegionCodes = importBo.getOnlySaleRegionCodes(); + if(CollUtil.isNotEmpty(onlySaleRegionCodes)){ + List saleRegionList = regionMapper.selectList( + new LambdaQueryWrapper() + .in(BmsRegion::getCode,onlySaleRegionCodes) + ); + List errCodes = new ArrayList<>(); + for (String regionCode : onlySaleRegionCodes) { + boolean r = saleRegionList.stream().anyMatch(a->a.getCode().equals(regionCode)); + if(!r){ + errCodes.add(regionCode); + } + } + if(CollUtil.isNotEmpty(errCodes)){ + importBo.setSuccessFlag(false); + importBo.setErrOnlySaleRegionCodes(errCodes); + }else { + accreditBo.setOnlySaleRegionIds(saleRegionList.stream() + .map(BmsRegion::getId).collect(Collectors.toList())); + } + } + + List notInSaleRegionCodes = importBo.getNotInSaleRegionCodes(); + if(CollUtil.isNotEmpty(notInSaleRegionCodes)){ + List saleRegionList = regionMapper.selectList( + new LambdaQueryWrapper() + .in(BmsRegion::getCode,notInSaleRegionCodes) + ); + List errCodes = new ArrayList<>(); + for (String regionCode : notInSaleRegionCodes) { + boolean r = saleRegionList.stream().anyMatch(a->a.getCode().equals(regionCode)); + if(!r){ + errCodes.add(regionCode); + } + } + if(CollUtil.isNotEmpty(errCodes)){ + importBo.setSuccessFlag(false); + importBo.setErrNotInSaleRegionCodes(errCodes); + }else { + accreditBo.setNotInSaleRegionIds(saleRegionList.stream() + .map(BmsRegion::getId).collect(Collectors.toList())); + } + } + + List onlyBizRegionCodes = importBo.getOnlyBizRegionCodes(); + if(CollUtil.isNotEmpty(onlyBizRegionCodes)){ + List bizRegionList = region2Mapper.selectList( + new LambdaQueryWrapper() + .in(BmsRegion2::getCode,onlyBizRegionCodes) + ); + List errCodes = new ArrayList<>(); + for (String regionCode : onlyBizRegionCodes) { + boolean r = bizRegionList.stream().anyMatch(a->a.getCode().equals(regionCode)); + if(!r){ + errCodes.add(regionCode); + } + } + if(CollUtil.isNotEmpty(errCodes)){ + importBo.setSuccessFlag(false); + importBo.setErrOnlyBizRegionCodes(errCodes); + }else { + accreditBo.setOnlyBizRegionIds(bizRegionList.stream() + .map(BmsRegion2::getId).collect(Collectors.toList())); + } + } + + List notInBizRegionCodes = importBo.getNotInBizRegionCodes(); + if(CollUtil.isNotEmpty(notInBizRegionCodes)){ + List bizRegionList = region2Mapper.selectList( + new LambdaQueryWrapper() + .in(BmsRegion2::getCode,notInBizRegionCodes) + ); + List errCodes = new ArrayList<>(); + for (String regionCode : notInBizRegionCodes) { + boolean r = bizRegionList.stream().anyMatch(a->a.getCode().equals(regionCode)); + if(!r){ + errCodes.add(regionCode); + } + } + if(CollUtil.isNotEmpty(errCodes)){ + importBo.setSuccessFlag(false); + importBo.setErrNotInBizRegionCodes(errCodes); + }else { + accreditBo.setNotInBizRegionIds(bizRegionList.stream() + .map(BmsRegion2::getId).collect(Collectors.toList())); + } + } + + List notInSupplierCodes = importBo.getNotInSupplierCodes(); + if(CollUtil.isNotEmpty(notInSupplierCodes)){ + List supplierList = supplierMapper.selectList( + new LambdaQueryWrapper() + .in(BmsSupplier::getCode,notInSupplierCodes) + ); + List errCodes = new ArrayList<>(); + for (String code : notInSupplierCodes) { + boolean r = supplierList.stream().anyMatch(a->a.getCode().equals(code)); + if(!r){ + errCodes.add(code); + } + } + if(CollUtil.isNotEmpty(errCodes)){ + importBo.setSuccessFlag(false); + importBo.setErrNotInSupplierCodes(errCodes); + }else { + accreditBo.setNotInSupplierIds(supplierList.stream() + .map(BmsSupplier::getId).collect(Collectors.toList())); + } + } + + List onlySupplierCodes = importBo.getOnlySupplierCodes(); + if(CollUtil.isNotEmpty(onlySupplierCodes)){ + List supplierList = supplierMapper.selectList( + new LambdaQueryWrapper() + .in(BmsSupplier::getCode,onlySupplierCodes) + ); + List errCodes = new ArrayList<>(); + for (String code : onlySupplierCodes) { + boolean r = supplierList.stream().anyMatch(a->a.getCode().equals(code)); + if(!r){ + errCodes.add(code); + } + } + if(CollUtil.isNotEmpty(errCodes)){ + importBo.setSuccessFlag(false); + importBo.setErrOnlySupplierCodes(errCodes); + }else { + accreditBo.setOnlySupplierIds(supplierList.stream() + .map(BmsSupplier::getId).collect(Collectors.toList())); + } + } + return accreditBo; + } + + @Override + public PageVo 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->{ + // 根据unionType判断是商品授权还是客户授权 + if (ext.getUnionType().equals("accredit")){ + GoodsAccreditResult result = new GoodsAccreditResult(); + result.setId("goods"+ext.getId()); + result.setRuleType("goods"); + // 根据categoryId、spuId判断商品类型 + 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()); + // 根据accType设置授权类型 + result.setAccType(ext.getAccType().equals(0)?"in":"notIn"); + // 根据targetType设置目标类型 +// 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 if (ext.getTargetType().equals("3")){ +// result.setTargetType("user"); +// }else { +// result.setTargetType(ext.getTargetType()); +// } + 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(); + String targetName = query.getTargetName(); + if(StringUtils.hasText(productCode)||StringUtils.hasText(productName)){ + //向上维度查询 + Set codes = new HashSet<>(); + List skuList = goodsSkuMapper.selectList(new LambdaQueryWrapper() + .eq(GoodsSku::getSkuCode,productCode) + .or() + .eq(GoodsSku::getSkuName,productName)); + List spuList = goodsSpuMapper.selectList(new LambdaQueryWrapper() + .eq(GoodsSpu::getSpuCode,productCode) + .or() + .eq(GoodsSpu::getName,productName)); + if(skuList.size()>0){ + codes.add(productCode); + spuList.addAll(goodsSpuMapper.selectBatchIds(skuList.stream().map(GoodsSku::getSpuId).collect(Collectors.toSet()))); + } + if(spuList.size()>0){ + Set cateIds = new HashSet<>(); + for (GoodsSpu spu : spuList) { + //向上查询添加skuCode + codes.add(spu.getSpuCode()); + cateIds.addAll(spu.listCategoryIds()); + } + List categoryList = categoryMapper.selectBatchIds(cateIds); + for (GoodsCategory category : categoryList) { + //向上查询添加CategoryCode + codes.add(category.getCode()); + } + } + List categoryList = categoryMapper.selectList(new LambdaQueryWrapper().eq(GoodsCategory::getCode,productCode)); + for (GoodsCategory category : categoryList) { + codes.add(category.getCode()); + if(!category.getParentId().equals(0L)){ + GoodsCategory lastLevel = categoryMapper.selectById(category.getParentId()); + if(lastLevel!=null){ + codes.add(lastLevel.getCode()); + if(!lastLevel.getParentId().equals(0L)){ + GoodsCategory lastLevel2 = categoryMapper.selectById(category.getParentId()); + if(lastLevel2!=null){ + codes.add(lastLevel.getCode()); + } + } + } + } + } + query.setCodeList(codes); + } + + if(StringUtils.hasText(targetCode)||StringUtils.hasText(targetName)){ + Set targetCodes = new HashSet<>(); + + //拓展人员 + List sysUserList = sysUserMapper.selectList(new LambdaQueryWrapper() + .eq(SysUser::getCode,targetCode) + .or() + .eq(SysUser::getName,targetName)); + if(sysUserList.size()>0){ + for (SysUser user : sysUserList) { + targetCodes.add(user.getCode()); + } + } + + List supplierList = supplierMapper.selectList(new LambdaQueryWrapper() + .eq(BmsSupplier::getCode,targetCode) + .or() + .eq(BmsSupplier::getName,targetName)); + if(supplierList.size()>0){ + targetCodes.add(targetCode); + for (BmsSupplier supplier : supplierList) { + List bizIds = supplier.listBizRegionIds(); + List saleIds = supplier.listSaleRegionIds(); + List regionList = regionMapper.selectBatchIds(saleIds); + for (BmsRegion region : regionList) { + targetCodes.add(region.getCode()); + } + List region2List = region2Mapper.selectBatchIds(bizIds); + for (BmsRegion2 region2 : region2List) { + targetCodes.add(region2.getCode()); + } + } + } + + List regionList = regionMapper.selectList(new LambdaQueryWrapper() + .eq(BmsRegion::getName,targetName) + .or() + .eq(BmsRegion::getCode,targetCode)); + if (regionList.size()>0){ + Set regIds = new HashSet<>(); + for (BmsRegion region : regionList) { + String[] ids = region.getPathIds().split("_"); + regIds.addAll(Arrays.asList(ids)); + } + regionList = regionMapper.selectBatchIds(regIds); + targetCodes.addAll(regionList.stream().map(BmsRegion::getCode).collect(Collectors.toSet())); + } + + List region2List = region2Mapper.selectList(new LambdaQueryWrapper() + .eq(BmsRegion2::getName,targetName) + .or() + .eq(BmsRegion2::getCode,targetCode)); + if (region2List.size()>0){ + Set regIds = new HashSet<>(); + for (BmsRegion2 region : region2List) { + String[] ids = region.getPathIds().split("_"); + regIds.addAll(Arrays.asList(ids)); + } + region2List = region2Mapper.selectBatchIds(regIds); + targetCodes.addAll(region2List.stream().map(BmsRegion2::getCode).collect(Collectors.toSet())); + } + + query.setTargetCodeList(targetCodes); + + } + } + + @Override + public void modify(GoodsAccreditBo param) { + GoodsAccredit goodsAccredit = null; + if(param.getAccId()==null){ + goodsAccredit = this.getGoodsAccredit(param); + }else { + goodsAccredit = this.getById(param.getAccId()); + } + + if(goodsAccredit==null){ + Assert.throwEx("参数异常 500B2 "); + } + + boolean b1 = CollUtil.isNotEmpty(param.getOnlySaleRegionIds()); + boolean b2 = CollUtil.isNotEmpty(param.getNotInSaleRegionIds()); + boolean b3 = CollUtil.isNotEmpty(param.getOnlyBizRegionIds()); + boolean b4 = CollUtil.isNotEmpty(param.getNotInBizRegionIds()); + boolean b5 = CollUtil.isNotEmpty(param.getOnlySupplierIds()); + boolean b6 = CollUtil.isNotEmpty(param.getNotInSupplierIds()); + boolean b7 = CollUtil.isNotEmpty(param.getOnlyUserIds()); + boolean b8 = CollUtil.isNotEmpty(param.getNotInUserIds()); + + //清空历史 + if(!param.isOnlyPastUpdate()){ + goodsAccreditItemService.remove(new LambdaQueryWrapper() + .eq(GoodsAccreditItem::getAccId,goodsAccredit.getId())); + }else { + // in 或者 not in + int accType = (b2||b4||b6)?1:0; + String targetType; + if(b3||b4){ + targetType = "bizRegion"; + }else if (b5 || b6){ + targetType = "supplier"; + }else if (b7 || b8){ + targetType = "user"; + }else { + targetType = "saleRegion"; + } + goodsAccreditItemService.remove( + new LambdaQueryWrapper() + .eq(GoodsAccreditItem::getAccId,goodsAccredit.getId()) + .eq(GoodsAccreditItem::getAccType,accType) + .eq(GoodsAccreditItem::getTargetType,targetType) + ); + } + + // 根据参数中的条件判断是否需要更新商品授权的空标志位 + if(!b1 && !b2 && !b3 && !b4 && !b5 && !b6){ + // 如果参数中没有任何有效的ID列表,则将空标志位设置为1 + if(goodsAccredit.getId()!=null){ + goodsAccredit.setEmptyFlag(1); + this.updateById(goodsAccredit); + } + }else { + if(goodsAccredit.getId()!=null){ + goodsAccredit.setEmptyFlag(0); + this.updateById(goodsAccredit); + }else { + this.save(goodsAccredit); + param.setAccId(goodsAccredit.getId()); + } + } + Long accId = goodsAccredit.getId(); + + if(b1){ + List saleRegionList = regionMapper.selectBatchIds(param.getOnlySaleRegionIds()); + List list = saleRegionList.stream().map(a->{ + GoodsAccreditItem item = new GoodsAccreditItem(); + item.setAccId(accId); + item.setAccType(0); + item.setTargetType("saleRegion"); + item.setTargetCode(a.getCode()); + item.setTargetName(a.getName()); + item.setTargetId(a.getId()); + return item; + }).collect(Collectors.toList()); + goodsAccreditItemService.saveBatch(list); + } + + if(b2){ + List saleRegionList = regionMapper.selectBatchIds(param.getNotInSaleRegionIds()); + List list = saleRegionList.stream().map(a->{ + GoodsAccreditItem item = new GoodsAccreditItem(); + item.setAccId(accId); + item.setAccType(1); + item.setTargetType("saleRegion"); + item.setTargetCode(a.getCode()); + item.setTargetName(a.getName()); + item.setTargetId(a.getId()); + return item; + }).collect(Collectors.toList()); + goodsAccreditItemService.saveBatch(list); + } + + if(b3){ + List regionList = region2Mapper.selectBatchIds(param.getOnlyBizRegionIds()); + List list = regionList.stream().map(a->{ + GoodsAccreditItem item = new GoodsAccreditItem(); + item.setAccId(accId); + item.setAccType(0); + item.setTargetType("bizRegion"); + item.setTargetCode(a.getCode()); + item.setTargetName(a.getName()); + item.setTargetId(a.getId()); + return item; + }).collect(Collectors.toList()); + goodsAccreditItemService.saveBatch(list); + } + + if(b4){ + List regionList = region2Mapper.selectBatchIds(param.getNotInBizRegionIds()); + List list = regionList.stream().map(a->{ + GoodsAccreditItem item = new GoodsAccreditItem(); + item.setAccId(accId); + item.setAccType(1); + item.setTargetType("bizRegion"); + item.setTargetCode(a.getCode()); + item.setTargetName(a.getName()); + item.setTargetId(a.getId()); + return item; + }).collect(Collectors.toList()); + goodsAccreditItemService.saveBatch(list); + } + + if(b5){ + List supplierList = supplierMapper.selectBatchIds(param.getOnlySupplierIds()); + List list = supplierList.stream().map(a->{ + GoodsAccreditItem item = new GoodsAccreditItem(); + item.setAccId(accId); + item.setAccType(0); + item.setTargetType("supplier"); + item.setTargetCode(a.getCode()); + item.setTargetName(a.getName()); + item.setTargetId(a.getId()); + return item; + }).collect(Collectors.toList()); + goodsAccreditItemService.saveBatch(list); + } + + if(b6){ + List supplierList = supplierMapper.selectBatchIds(param.getNotInSupplierIds()); + List list = supplierList.stream().map(a->{ + GoodsAccreditItem item = new GoodsAccreditItem(); + item.setAccId(accId); + item.setAccType(1); + item.setTargetType("supplier"); + item.setTargetCode(a.getCode()); + item.setTargetName(a.getName()); + item.setTargetId(a.getId()); + return item; + }).collect(Collectors.toList()); + goodsAccreditItemService.saveBatch(list); + } + + if(b7){ + List userList = sysUserMapper.selectBatchIds(param.getNotInSupplierIds()); + List list = userList.stream().map(a->{ + GoodsAccreditItem item = new GoodsAccreditItem(); + item.setAccId(accId); + item.setAccType(0); + item.setTargetType("user"); + item.setTargetCode(a.getCode()); + item.setTargetName(a.getName()); + item.setTargetId(a.getId()); + return item; + }).collect(Collectors.toList()); + goodsAccreditItemService.saveBatch(list); + } + + if(b8){ + List userList = sysUserMapper.selectBatchIds(param.getNotInSupplierIds()); + List list = userList.stream().map(a->{ + GoodsAccreditItem item = new GoodsAccreditItem(); + item.setAccId(accId); + item.setAccType(1); + item.setTargetType("user"); + item.setTargetCode(a.getCode()); + item.setTargetName(a.getName()); + item.setTargetId(a.getId()); + return item; + }).collect(Collectors.toList()); + goodsAccreditItemService.saveBatch(list); + } + + } + + + /** + * 根据类别ID、SPU ID和SKU ID获取商品授权信息 + * @param cateId 类别ID + * @param spuId SPU ID + * @param skuId SKU ID + * @return 返回商品授权信息对象,如果没有找到则返回null + */ + @Override + public GoodsAccreditVo getById(String cateId, String spuId, String skuId) { + // 获取商品授权基本信息 + GoodsAccredit accredit = this.getGoodsAccredit(new GoodsAccreditBo(cateId,spuId,skuId)); + GoodsAccreditVo accreditVo = new GoodsAccreditVo(); + + // 如果授权信息存在且有有效的ID,则进一步处理 + if(accredit!=null&&accredit.getId()!=null){ + // 查询该授权下的所有授权项 + List accreditItemList = goodsAccreditItemService + .list(new LambdaQueryWrapper().eq(GoodsAccreditItem::getAccId,accredit.getId())); + + // 将授权项按目标类型分组 + Map> accMap = accreditItemList.stream() + .collect(Collectors.groupingBy(GoodsAccreditItem::getTargetType)); + + // 分别获取供应商、业务区,销售区域,用户,的授权项列表 + List list1 = accMap.get("supplier"); + List list2 = accMap.get("bizRegion"); + List list3 = accMap.get("saleRegion"); + List list4 = accMap.get("user"); + + // 处理供应商授权项 + if(CollUtil.isNotEmpty(list1)){ + // 将供应商授权项按授权类型分组 + Map> listMap = list1.stream() + .collect(Collectors.groupingBy(GoodsAccreditItem::getAccType)); + + // 分别处理仅限和除外的供应商授权项 + List onlyList = listMap.get(0); + List notInList = listMap.get(1); + + if(CollUtil.isNotEmpty(onlyList)){ + // 获取仅限供应商ID列表并查询供应商信息 + List ids = onlyList.stream().map(GoodsAccreditItem::getTargetId).collect(Collectors.toList()); + accreditVo.setOnlySupplierList(supplierMapper.selectBatchIds(ids)); + } + if(CollUtil.isNotEmpty(notInList)){ + // 获取除外供应商ID列表并查询供应商信息 + List ids = notInList.stream().map(GoodsAccreditItem::getTargetId).collect(Collectors.toList()); + accreditVo.setNotInSupplierList(supplierMapper.selectBatchIds(ids)); + } + } + + // 处理业务区域授权项 + if(CollUtil.isNotEmpty(list2)){ + // 将业务区域授权项按授权类型分组 + Map> listMap = list2.stream() + .collect(Collectors.groupingBy(GoodsAccreditItem::getAccType)); + + // 分别处理仅限和除外的业务区域授权项 + List onlyList = listMap.get(0); + List notInList = listMap.get(1); + + if(CollUtil.isNotEmpty(onlyList)){ + // 获取仅限业务区域ID列表并查询区域信息 + List ids = onlyList.stream().map(GoodsAccreditItem::getTargetId).collect(Collectors.toList()); + accreditVo.setOnlyBizRegionList(region2Mapper.selectBatchIds(ids)); + } + if(CollUtil.isNotEmpty(notInList)){ + // 获取除外业务区域ID列表并查询区域信息 + List ids = notInList.stream().map(GoodsAccreditItem::getTargetId).collect(Collectors.toList()); + accreditVo.setNotInBizRegionList(region2Mapper.selectBatchIds(ids)); + } + } + + // 处理销售区域授权项 + if(CollUtil.isNotEmpty(list3)){ + // 将销售区域授权项按授权类型分组 + Map> listMap = list3.stream() + .collect(Collectors.groupingBy(GoodsAccreditItem::getAccType)); + + // 分别处理仅限和除外的销售区域授权项 + List onlyList = listMap.get(0); + List notInList = listMap.get(1); + + if(CollUtil.isNotEmpty(onlyList)){ + // 获取仅限销售区域ID列表并查询区域信息 + List ids = onlyList.stream().map(GoodsAccreditItem::getTargetId).collect(Collectors.toList()); + accreditVo.setOnlySaleRegionList(regionMapper.selectBatchIds(ids)); + } + if(CollUtil.isNotEmpty(notInList)){ + // 获取除外销售区域ID列表并查询区域信息 + List ids = notInList.stream().map(GoodsAccreditItem::getTargetId).collect(Collectors.toList()); + accreditVo.setNotInSaleRegionList(regionMapper.selectBatchIds(ids)); + } + } + + // 处理用户授权项 + if(CollUtil.isNotEmpty(list4)){ + // 将销售区域授权项按授权类型分组 + Map> listMap = list4.stream() + .collect(Collectors.groupingBy(GoodsAccreditItem::getAccType)); + + // 分别处理仅限和除外的销售区域授权项 + List onlyList = listMap.get(0); + List notInList = listMap.get(1); + + if(CollUtil.isNotEmpty(onlyList)){ + // 获取仅限销售区域ID列表并查询区域信息 + List ids = onlyList.stream().map(GoodsAccreditItem::getTargetId).collect(Collectors.toList()); + List userSimpleVos = sysUserMapper.selectBatchIds(ids).stream() + .map(a->a.toSimpleVo(true)).collect(Collectors.toList()); + accreditVo.setOnlyUserList(userSimpleVos); + } + if(CollUtil.isNotEmpty(notInList)){ + // 获取除外销售区域ID列表并查询区域信息 + List ids = notInList.stream().map(GoodsAccreditItem::getTargetId).collect(Collectors.toList()); + List userSimpleVos = sysUserMapper.selectBatchIds(ids).stream() + .map(a->a.toSimpleVo(true)).collect(Collectors.toList()); + accreditVo.setNotInUserList(userSimpleVos); + } + } + // 返回构建好的商品授权信息对象 + return accreditVo; + } + + // 如果没有找到授权信息,则返回null + return null; + } + + @Override + public List listIgnoreAcc(String supplierId, List bizRegionIds, List saleRegionIds) { + //查询查询所有not in + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(GoodsAccreditItem::getId) + // 业务not in + .eq(GoodsAccreditItem::getAccType,1) + .and( + qw->{ + qw.or(a->a.eq(GoodsAccreditItem::getTargetType,"supplier").eq(GoodsAccreditItem::getTargetId,supplierId)) + .or(a->a.eq(GoodsAccreditItem::getTargetType,"saleRegion").in(GoodsAccreditItem::getTargetId,saleRegionIds)) + .or(a->a.eq(GoodsAccreditItem::getTargetType,"bizRegion").in(GoodsAccreditItem::getTargetId,bizRegionIds)); + } + ); + List notInIds = goodsAccreditItemService.list(lqw).stream().map(GoodsAccreditItem::getId).collect(Collectors.toList()); + + //查询其它维度所有 in + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(); + lqw2 + // 业务in + .eq(GoodsAccreditItem::getAccType,0) + .and( + qw->{ + qw.or(a->a.eq(GoodsAccreditItem::getTargetType,"supplier").ne(GoodsAccreditItem::getTargetId,supplierId)) + .or(a->a.eq(GoodsAccreditItem::getTargetType,"saleRegion").notIn(GoodsAccreditItem::getTargetId,saleRegionIds)) + .or(a->a.eq(GoodsAccreditItem::getTargetType,"bizRegion").notIn(GoodsAccreditItem::getTargetId,bizRegionIds)); + } + ); + List list2 = goodsAccreditItemService.list(lqw2); + + + // 排除本维度in关系 + LambdaQueryWrapper lqw3 = new LambdaQueryWrapper<>(); + lqw3 + // 业务in + .eq(GoodsAccreditItem::getAccType,0) + .and( + qw->{ + qw.or(a->a.eq(GoodsAccreditItem::getTargetType,"supplier").eq(GoodsAccreditItem::getTargetId,supplierId)) + .or(a->a.eq(GoodsAccreditItem::getTargetType,"saleRegion").in(GoodsAccreditItem::getTargetId,saleRegionIds)) + .or(a->a.eq(GoodsAccreditItem::getTargetType,"bizRegion").in(GoodsAccreditItem::getTargetId,bizRegionIds)); + } + ); + List list3 = goodsAccreditItemService.list(lqw3); + + //移除交集 list3 与 list2交集,同品类支持上下级,解决选多用户情况,实现效果区域维度为并集 + List listResult = list2; + if(CollUtil.isNotEmpty(list2)&&CollUtil.isNotEmpty(list3)){ + listResult = new ArrayList<>(); + for (GoodsAccreditItem it2 : list2) { + boolean mch = false; + for (GoodsAccreditItem it3 : list3) { + boolean b1 = it2.getAccId().equals(it3.getAccId()); + if(b1){ + mch =true; + break; + } + } + if(!mch){ + listResult.add(it2); + } + } + } + //TODO 可拓展,支持品类上下级 + + //合并不同维度in结果 + List itemIds2 = listResult.stream().map(GoodsAccreditItem::getId).collect(Collectors.toList()); + notInIds.addAll(itemIds2); + + List itemList; + if(notInIds.size()>0){ + itemList = goodsAccreditItemService.list(new LambdaQueryWrapper().in(GoodsAccreditItem::getId,notInIds)); + }else { + return new ArrayList<>(); + } + Set accIds = itemList.stream().map(GoodsAccreditItem::getAccId).collect(Collectors.toSet()); + if(CollUtil.isEmpty(accIds)){ + return new ArrayList<>(); + } + return this.listByIds(accIds); + } + + @Override + public GoodsAccrIdsDto listIgnoreAcc2(String supplierId, List bizRegionIds, List saleRegionIds) { + //当前业务id + String userId = AuthContextUtils.getSysUserId(); + //查询自身所有 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(GoodsAccreditItem::getId,GoodsAccreditItem::getAccType,GoodsAccreditItem::getAccId) + .or(a->a.eq(GoodsAccreditItem::getTargetType,"user").eq(GoodsAccreditItem::getTargetId,userId)) + .or(a->a.eq(GoodsAccreditItem::getTargetType,"supplier").eq(GoodsAccreditItem::getTargetId,supplierId)) + .or(a->a.eq(GoodsAccreditItem::getTargetType,"saleRegion").in(GoodsAccreditItem::getTargetId,saleRegionIds)) + .or(a->a.eq(GoodsAccreditItem::getTargetType,"bizRegion").in(GoodsAccreditItem::getTargetId,bizRegionIds)); + List goodsAccreditItems = goodsAccreditItemService.list(lqw); + //过滤出不包含的商品ID + List selfNotInIds = goodsAccreditItems.stream() + .filter(a->a.getAccType().equals(1)).map(GoodsAccreditItem::getAccId).collect(Collectors.toList()); + //过滤出包含的商品ID + List selfInIds = goodsAccreditItems.stream() + .filter(a->a.getAccType().equals(0)).map(GoodsAccreditItem::getAccId).collect(Collectors.toList()); + + //查询其它维度所有in + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(); + lqw2.select(GoodsAccreditItem::getAccId) + .eq(GoodsAccreditItem::getAccType,0).and( + qw->{ + qw + .or(a->a.eq(GoodsAccreditItem::getTargetType,"user").ne(GoodsAccreditItem::getTargetId,userId)) + .or(a->a.eq(GoodsAccreditItem::getTargetType,"supplier").ne(GoodsAccreditItem::getTargetId,supplierId)) + .or(a->a.eq(GoodsAccreditItem::getTargetType,"saleRegion").notIn(GoodsAccreditItem::getTargetId,saleRegionIds)) + .or(a->a.eq(GoodsAccreditItem::getTargetType,"bizRegion").notIn(GoodsAccreditItem::getTargetId,bizRegionIds)); + } + ); + //获取其他维度包含的商品ID + List otherInIds = goodsAccreditItemService.list(lqw2) + .stream().map(GoodsAccreditItem::getAccId).collect(Collectors.toList()); + selfNotInIds.addAll(otherInIds); + + List skuIds = new ArrayList<>(); + List spuIds = new ArrayList<>(); + List cateIds = new ArrayList<>(); + + List skuNotInIds = new ArrayList<>(); + List spuNotInIds = new ArrayList<>(); + List cateNotInIds = new ArrayList<>(); + + //设置默认值 防止空in + skuIds.add(-1000L); + spuIds.add(-1000L); + cateIds.add("-999"); + skuNotInIds.add(-1000L); + spuNotInIds.add(-1000L); + cateNotInIds.add("-999"); + + if(CollUtil.isNotEmpty(selfNotInIds)){ + List notInList = this.listByIds(selfNotInIds); + Set spuIds2 = notInList.stream().map(GoodsAccredit::getSpuId).filter(Objects::nonNull).collect(Collectors.toSet()); + Set skuIds2 = notInList.stream().map(GoodsAccredit::getSkuId).filter(Objects::nonNull).collect(Collectors.toSet()); + Set cateIds2 = notInList.stream().map(GoodsAccredit::getCategoryId).filter(Objects::nonNull).collect(Collectors.toSet()); + skuIds.addAll(skuIds2); + spuIds.addAll(spuIds2); + cateIds.addAll(cateIds2); + } + + if(CollUtil.isNotEmpty(selfInIds)){ + List inList = this.listByIds(selfInIds); + Set spuIds3 = inList.stream().map(GoodsAccredit::getSpuId).filter(Objects::nonNull).collect(Collectors.toSet()); + Set skuIds3 = inList.stream().map(GoodsAccredit::getSkuId).filter(Objects::nonNull).collect(Collectors.toSet()); + Set cateIds3 = inList.stream().map(GoodsAccredit::getCategoryId).filter(Objects::nonNull).collect(Collectors.toSet()); + skuNotInIds.addAll(skuIds3); + spuNotInIds.addAll(spuIds3); + cateNotInIds.addAll(cateIds3); + } + //无新值,直接返回空 + if(skuIds.size()==1 + &&spuIds.size()==1 + &&cateIds.size()==1 + &&skuNotInIds.size()==1 + &&spuNotInIds.size()==1 + &&cateNotInIds.size()==1){ + return null; + } + //返回包含商品ID、SPU ID和类别ID的DTO对象 + return new GoodsAccrIdsDto(skuIds,spuIds,cateIds,skuNotInIds,spuNotInIds,cateNotInIds); + } + + @Override + public boolean checkSkuCode(List spuIds, List accreditList, boolean throwEx) { + if(CollUtil.isEmpty(spuIds)){ + return false; + } + List spuList = goodsSpuMapper.selectBatchIds(spuIds); + for (GoodsAccredit accredit : accreditList) { + if(accredit.getSpuId()!=null){ + for (GoodsSpu spu : spuList) { + if(spu.getId().equals(accredit.getSpuId())){ + if(throwEx){ + Assert.throwEx("SKU["+spu.getSpuCode()+"]不可下单"); + } + return false; + } + } + }else if (accredit.getCategoryId()!=null){ + for (GoodsSpu spu : spuList) { + for (String categoryId : spu.listCategoryIds()) { + if(categoryId.equals(accredit.getCategoryId())){ + if(throwEx){ + Assert.throwEx("SKU["+spu.getSpuCode()+"]不可下单"); + } + return false; + } + } + } + } + } + return false; + } + + /** + * 根据商品类别ID、SPU ID或SKU ID获取商品授权信息 + * @param param 包含商品类别ID、SPU ID或SKU ID的查询参数对象 + * @return 返回商品授权信息对象,如果找不到则返回null + */ + private GoodsAccredit getGoodsAccredit(GoodsAccreditBo param){ + GoodsAccredit accredit = null; + + // 根据类别ID查询商品授权信息 + if(param.getCategoryId()!=null){ + accredit = this.getOne( new LambdaQueryWrapper() + .eq(GoodsAccredit::getCategoryId,param.getCategoryId()),false); + // 如果未找到对应的授权信息,则根据类别ID创建新的授权信息 + if(accredit==null){ + GoodsCategory category = categoryMapper.selectById(param.getCategoryId()); + accredit = new GoodsAccredit(); + accredit.setCategoryId(category.getId().toString()); + accredit.setCode(category.getCode()); + accredit.setName(category.getName()); + } + // 根据SPU ID查询商品授权信息 + }else if (param.getSpuId()!=null){ + accredit = this.getOne( new LambdaQueryWrapper() + .eq(GoodsAccredit::getSpuId,param.getSpuId()),false); + // 如果未找到对应的授权信息,则根据SPU ID创建新的授权信息 + if(accredit==null){ + GoodsSpu spu = goodsSpuMapper.selectById(param.getSpuId()); + accredit = new GoodsAccredit(); + accredit.setSpuId(spu.getId()); + accredit.setCode(spu.getSpuCode()); + accredit.setName(spu.getName()); + } + // 根据SKU ID查询商品授权信息 + }else if (param.getSkuId()!=null){ + accredit = this.getOne( new LambdaQueryWrapper() + .eq(GoodsAccredit::getSkuId,param.getSkuId()),false); + // 如果未找到对应的授权信息,则根据SKU ID创建新的授权信息 + if(accredit==null){ + GoodsSku sku = goodsSkuMapper.selectById(param.getSkuId()); + accredit = new GoodsAccredit(); + accredit.setSkuId(sku.getId()); + accredit.setCode(sku.getSkuCode()); + accredit.setName(sku.getSkuName()); + } + } + return accredit; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsBrandServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsBrandServiceImpl.java new file mode 100644 index 0000000..54f5509 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsBrandServiceImpl.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.goods.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.goods.entity.GoodsSeries; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.entity.GoodsBrand; +import com.qs.serve.modules.goods.service.GoodsBrandService; +import com.qs.serve.modules.goods.mapper.GoodsBrandMapper; + +/** + * 品牌 服务实现类 + * @author YenHex + * @since 2022-10-11 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsBrandServiceImpl extends ServiceImpl implements GoodsBrandService { + + @Override + public GoodsBrand getByCode(String code) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsBrand::getCode,code); + return getOne(lqw,false); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsCategoryRuleServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsCategoryRuleServiceImpl.java new file mode 100644 index 0000000..8569dda --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsCategoryRuleServiceImpl.java @@ -0,0 +1,88 @@ +package com.qs.serve.modules.goods.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.bo.GoodsCategoryRuleBo; +import com.qs.serve.modules.goods.mapper.GoodsCategoryMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.entity.GoodsCategoryRule; +import com.qs.serve.modules.goods.service.GoodsCategoryRuleService; +import com.qs.serve.modules.goods.mapper.GoodsCategoryRuleMapper; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 品牌规则 服务实现类 + * @author YenHex + * @since 2023-09-18 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsCategoryRuleServiceImpl extends ServiceImpl implements GoodsCategoryRuleService { + + private GoodsCategoryMapper goodsCategoryMapper; + + @Override + public void doSetDefault(String id) { + // 给指定的规则设置为默认 + this.update(new LambdaUpdateWrapper() + .eq(GoodsCategoryRule::getId,id) + .set(GoodsCategoryRule::getDefaultFlag,1)); + // 给非指定的规则设置为非默认 + this.update(new LambdaUpdateWrapper() + .ne(GoodsCategoryRule::getId,id) + .set(GoodsCategoryRule::getDefaultFlag,0)); + } + + @Override + public GoodsCategoryRule modify(GoodsCategoryRuleBo param) { + LambdaQueryWrapper brandCategory = new LambdaQueryWrapper<>(); + brandCategory.in(GoodsCategory::getId, Arrays.asList(param.getBrandIds())); + brandCategory.eq(GoodsCategory::getLevel,1); + List categoryList = goodsCategoryMapper.selectList(brandCategory); + List ids = new ArrayList<>(); + List names = new ArrayList<>(); + for (GoodsCategory category : categoryList) { + ids.add(category.getId()+""); + names.add(category.getName()); + } + GoodsCategoryRule entity = CopierUtil.copy(param,new GoodsCategoryRule()); + entity.setBrandIds(ids.toArray(new String[ids.size()])); + entity.setBrandNames(names.toArray(new String[names.size()])); + //加载忽略的类目 + if(param.getIgnoreBrandIds()!=null){ + List ids2 = new ArrayList<>(); + List names2 = new ArrayList<>(); + List igIds = Arrays.asList(param.getIgnoreBrandIds()); + if(CollUtil.isNotEmpty(igIds)){ + List ignoreCategoryList = goodsCategoryMapper.selectBatchIds(igIds); + for (GoodsCategory category : ignoreCategoryList) { + ids2.add(category.getId()+""); + names2.add(category.getName()); + } + entity.setIgnoreBrandIds(ids2.toArray(new String[ids2.size()])); + entity.setIgnoreBrandNames(names2.toArray(new String[names2.size()])); + } + } + if(param.getId()!=null){ + this.updateById(entity); + }else { + this.save(entity); + } + // 设置默认 + if(param.getDefaultFlag()!=null&¶m.getDefaultFlag().equals(1)){ + this.doSetDefault(entity.getId().toString()); + } + return entity; + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsCategoryServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsCategoryServiceImpl.java new file mode 100644 index 0000000..671aefe --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsCategoryServiceImpl.java @@ -0,0 +1,232 @@ +package com.qs.serve.modules.goods.service.impl; + +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.CollectionUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.IdUtil; +import com.qs.serve.modules.bms.entity.BmsAccount; +import com.qs.serve.modules.bms.mapper.BmsAccountMapper; +import com.qs.serve.modules.goods.common.GoodsConst; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.entity.bo.GoodsCategoryLevelBo; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.mapper.GoodsSpuMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.service.GoodsCategoryService; +import com.qs.serve.modules.goods.mapper.GoodsCategoryMapper; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 分类 服务实现类 + * @author YenHex + * @since 2022-10-09 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsCategoryServiceImpl extends ServiceImpl implements GoodsCategoryService { + + private final GoodsSkuMapper goodsSkuMapper; + private final GoodsSpuMapper goodsSpuMapper; + private final BmsAccountMapper accountMapper; + + @Override + public GoodsCategory getByCode(String code) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsCategory::getCode,code); + return this.getOne(lqw,false); + } + + @Override + public GoodsCategory getByName(String name, Integer level) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsCategory::getName,name); + lqw.eq(GoodsCategory::getLevel,level); + return this.getOne(lqw,true); + } + + @Override + public void modify(GoodsCategory category) { + BmsAccount bookAcc = accountMapper.selectOne(new LambdaQueryWrapper() + .eq(BmsAccount::getBookCode,category.getBookBelong())); + + GoodsCategory dbData = null; + if(category.getId()!=null){ + dbData = this.getById(category.getId()); + if(dbData==null){ + Assert.throwEx("类目不存在"); + } + }else { + if(bookAcc==null){ + Assert.throwEx("账套不存在"); + } + } + + GoodsCategory parent = null; + if( category.getParentId()!=null&&!category.getParentId().equals(0L)){ + parent = this.getById(category.getParentId()); + if(parent==null){ + Assert.throwEx("父级类目不存在"); + } + } + + //名称不能重复 + long count = this.count(new LambdaQueryWrapper() + .eq(GoodsCategory::getName,category.getName()) + .ne(category.getId()!=null,GoodsCategory::getId,category.getId()) + ); + if(count>0){ + Assert.throwEx("名称被占用了"); + } + + if(category.getId()==null){ + this.save(category); + } + + if(parent==null){ + category.setParentId(0L); + category.setLevel(1); + category.setLevelPath(category.getId().toString()); + category.setLevelPathNames(category.getName()); + + category.setBookBelong(bookAcc.getBookCode()); + category.setBookName(bookAcc.getBookName()); + }else { + category.setLevel(parent.getLevel()+1); + category.setLevelPathNames(parent.getLevelPathNames()+"_"+category.getName()); + category.setLevelPath(parent.getLevelPath()+"_"+category.getId()); + + category.setBookBelong(parent.getBookBelong()); + category.setBookName(parent.getBookName()); + } + if(dbData==null){ + this.saveOrUpdate(category); + }else { + //code不给修改 + category.setCode(null); + this.updateById(category); + GoodsCategory finalDbData = dbData; + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.and(v1->{ + v1.eq(GoodsCategory::getLevelPath, finalDbData.getLevelPath()) + .or().likeRight(GoodsCategory::getLevelPath, finalDbData.getLevelPath()+"_"); + }); + List childList = this.list(lqw); + int diffLevel = dbData.getLevel()-category.getLevel(); + List categoryList = childList.stream().map(obj->{ + GoodsCategory par = new GoodsCategory(); + par.setId(obj.getId()); + par.setLevel(obj.getLevel()+diffLevel); + par.setLevelPathNames(obj.getLevelPathNames().replace(finalDbData.getLevelPathNames(),category.getLevelPathNames())); + par.setLevelPath(obj.getLevelPath().replace(finalDbData.getLevelPath(),category.getLevelPath())); + par.setBookBelong(category.getBookBelong()); + par.setBookName(category.getBookName()); + return par; + }).collect(Collectors.toList()); + this.updateBatchById(categoryList); + } + //更新SKU + List cateIds = Arrays.asList(category.getId()); + goodsSkuMapper.updateBookInfo(cateIds,bookAcc.getBookCode(),bookAcc.getBookName()); + + //更新SPU + GoodsSpu spuParam = new GoodsSpu(); + spuParam.setBookBelong(bookAcc.getBookCode()); + spuParam.setBookName(bookAcc.getBookName()); + goodsSpuMapper.update(spuParam,new LambdaQueryWrapper() + .in(GoodsSpu::getCategoryFirst,cateIds) + .or() + .in(GoodsSpu::getCategorySecond,cateIds) + .or() + .in(GoodsSpu::getCategoryThird,cateIds) + ); + } + + @Override + public void modifyLevel(GoodsCategoryLevelBo categoryLevelBo) { + GoodsCategory category = CopierUtil.copy(categoryLevelBo,new GoodsCategory()); + if(category.getParentId()!=null){ + GoodsCategory dbCategory = this.getById(category.getId()); + if(!dbCategory.getParentId().equals(category.getParentId())){ + //只能同级迁移 + GoodsCategory parent = this.getById(category.getParentId()); + GoodsCategory oldParent = this.getById(dbCategory.getParentId()); + if(!parent.getLevel().equals(oldParent.getLevel())){ + Assert.throwEx("只能同级迁移"); + } + this.updateLevel(parent,category); + if(parent.getLevel()==1){ + //更新子类目 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsCategory::getParentId,category.getId()); + List childCategories = this.list(lqw); + for (GoodsCategory childCategory : childCategories) { + childCategory.setLevelPath(category.getLevelPath()+"_"+childCategory.getId()); + } + if(CollectionUtil.isNotEmpty(childCategories)){ + this.updateBatchById(childCategories); + } + } + //更新商品树 + updateSpuCategory(category,parent,oldParent); + } + } + + } + + /** + * todo 更新商品树 + * @param category + * @param parent + * @param oldParent + */ + private void updateSpuCategory(GoodsCategory category,GoodsCategory parent,GoodsCategory oldParent){ + if(parent.getLevel()==2){ + + } + } + + private void updateLevel(GoodsCategory parent,GoodsCategory category){ + if(parent.getLevel()>= GoodsConst.CATE_MAX_LEVEL){ + Assert.throwEx("最高支持3级类目"); + } + category.setLevel(parent.getLevel()+1); + this.save(category); + category.setLevelPath(parent.getLevelPath()+"_"+category.getId().toString()); + category.setLevelPathNames(parent.getLevelPathNames()+"_"+category.getName()); + this.updateById(category); + } + + @Override + public void deleteCateById(Long id) { + GoodsCategory goodsCategory = this.getById(id); + goodsCategory.setCode(goodsCategory.getCode()+"_del_"+ IdUtil.getSnowFlakeId()); + baseMapper.deleteByCate(goodsCategory); + } + + @Override + public String findMaxCodeStartingWith(String prefix){ + String maxCode = baseMapper.findMaxCodeStartingWith(prefix); + if (maxCode != null && !maxCode.isEmpty()) { + try { + int numericPart = Integer.parseInt(maxCode.substring(1)); + return prefix + (numericPart + 1); + } catch (NumberFormatException e) { + // 处理异常情况 + e.printStackTrace(); + } + } + return ""; // 如果没有找到现有的code,使用默认值 + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsCustomerPriceServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsCustomerPriceServiceImpl.java new file mode 100644 index 0000000..383f3bf --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsCustomerPriceServiceImpl.java @@ -0,0 +1,333 @@ +package com.qs.serve.modules.goods.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.JsonUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.bo.GoodsCustomerPriceBo; +import com.qs.serve.modules.goods.entity.bo.GoodsCustomerPriceSingleBo; +import com.qs.serve.modules.goods.entity.dto.InventoryCusPrice; +import com.qs.serve.modules.goods.entity.so.InventoryCusPriceQuery; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.entity.SysDictData; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysDictDataMapper; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.entity.GoodsCustomerPrice; +import com.qs.serve.modules.goods.service.GoodsCustomerPriceService; +import com.qs.serve.modules.goods.mapper.GoodsCustomerPriceMapper; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 客户价格关系表 服务实现类 + * @author YenHex + * @since 2024-01-08 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsCustomerPriceServiceImpl extends ServiceImpl implements GoodsCustomerPriceService { + + private final SysDictDataMapper sysDictDataMapper; + private final BmsSupplierMapper bmsSupplierMapper; + private final GoodsSkuMapper goodsSkuMapper; + private final SysUserMapper sysUserMapper; + private final SeeYonRequestBaseService seeYonRequestBaseService; + + @Override + public List selectGoodsCustomerPriceList(GoodsCustomerPrice query) { + return super.baseMapper.selectGoodsCustomerPriceList(query); + } + + @Override + public void saveBatch(GoodsCustomerPriceBo param) { + // 移除历史记录 + this.remove(new LambdaQueryWrapper() + .eq(GoodsCustomerPrice::getSupplierId,param.getSupplierId()) + .in(GoodsCustomerPrice::getSkuCode, + param.getSkuPriceItemList().stream().map(GoodsCustomerPriceBo.SkuPriceItem::getSkuCode).collect(Collectors.toList()) + ) + ); + + BmsSupplier supplier = bmsSupplierMapper.selectById(param.getSupplierId()); + SysUser sysUser = sysUserMapper.selectById(AuthContextUtils.getSysUserId()); + LocalDateTime nowTime = LocalDateTime.now(); + for (GoodsCustomerPriceBo.SkuPriceItem item : param.getSkuPriceItemList()) { + GoodsCustomerPrice customerPrice = this.getBySupplierIdAndCode(param.getSupplierId(),item.getSkuCode()); + GoodsSku goodsSku = goodsSkuMapper.selectBySkuCode(item.getSkuCode()); + if(goodsSku==null){ + continue; + } + customerPrice = new GoodsCustomerPrice(); + customerPrice.setSupplierId(supplier.getId()); + customerPrice.setSupplierCode(supplier.getCode()); + customerPrice.setSupplierName(supplier.getSupplierName()); + customerPrice.setSkuCode(goodsSku.getSkuCode()); + customerPrice.setSkuName(goodsSku.getSkuName()); + customerPrice.setSkuUnit(goodsSku.getUnitName()); + customerPrice.setInitPrice(goodsSku.getSalesPrice()); + customerPrice.setRealPrice(item.getPrice()); + customerPrice.setMaker(sysUser.getName()); + customerPrice.setMakerCode(sysUser.getCode()); + customerPrice.setMarkTime(nowTime); + this.save(customerPrice); + } + } + + @Override + public GoodsCustomerPrice singleModify(GoodsCustomerPriceSingleBo param) { + BmsSupplier supplier = bmsSupplierMapper.selectById(param.getSupplierId()); + SysUser sysUser = sysUserMapper.selectById(AuthContextUtils.getSysUserId()); + LocalDateTime nowTime = LocalDateTime.now(); + + GoodsCustomerPrice customerPrice = this.getBySupplierIdAndCode(param.getSupplierId(),param.getSkuCode()); + if(customerPrice==null){ + GoodsSku goodsSku = goodsSkuMapper.selectBySkuCode(param.getSkuCode()); + if(goodsSku==null){ + Assert.throwEx("存货不存在"); + } + customerPrice = new GoodsCustomerPrice(); + customerPrice.setSupplierId(supplier.getId()); + customerPrice.setSupplierCode(supplier.getCode()); + customerPrice.setSupplierName(supplier.getName()); + customerPrice.setSkuId(goodsSku.getId()+""); + customerPrice.setSkuCode(goodsSku.getSkuCode()); + customerPrice.setSkuName(goodsSku.getSkuName()); + customerPrice.setSkuUnit(goodsSku.getUnitName()); + customerPrice.setInitPrice(goodsSku.getSalesPrice()); + customerPrice.setRealPrice(param.getPrice()); + customerPrice.setMaker(sysUser.getName()); + customerPrice.setMakerCode(sysUser.getCode()); + customerPrice.setMarkTime(nowTime); + this.save(customerPrice); + }else { + customerPrice.setSupplierId(supplier.getId()); + customerPrice.setSupplierCode(supplier.getCode()); + customerPrice.setSupplierName(supplier.getName()); + customerPrice.setRealPrice(param.getPrice()); + customerPrice.setMaker(sysUser.getName()); + customerPrice.setMakerCode(sysUser.getCode()); + customerPrice.setMarkTime(nowTime); + this.updateById(customerPrice); + } + return customerPrice; + } + + @Override + public GoodsCustomerPrice getBySupplierIdAndCode(String supplierId, String skuCode) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsCustomerPrice::getSupplierId,supplierId) + .eq(GoodsCustomerPrice::getSkuCode,skuCode); + return this.getOne(lqw,false); + } + + @Override + public GoodsCustomerPrice getByCusCodeAndSkuCode(String supplierCode, String skuCode) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsCustomerPrice::getSupplierCode,supplierCode) + .eq(GoodsCustomerPrice::getSkuCode,skuCode); + return this.getOne(lqw,false); + } + + @Override + public List getBySupplierCodeAndCode(String supplierCode, List skuCodes) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsCustomerPrice::getSupplierCode,supplierCode) + .in(GoodsCustomerPrice::getSkuCode,skuCodes); + return this.list(lqw); + } + + @Override + public void syncCustomerPrice(String dictKey,String dictTitle,String url) { + final String DICT_KEY = dictKey; + SysDictData dictData = sysDictDataMapper + .selectOne(new LambdaQueryWrapper() + .eq(SysDictData::getGroupKey,DICT_KEY)); + Long maxId = 0L; + if(dictData!=null&&dictData.getKeyVal()!=null){ + maxId = Long.parseLong(dictData.getKeyVal()); + } + List allCusPriceList = new ArrayList<>(); + + R res = seeYonRequestBaseService.postBase(url+"/"+maxId,null,"查询最近更新的客户特殊价"); + if(res.getStatus().equals(200)){ + allCusPriceList = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); + } + assert allCusPriceList != null; + Map> cusPriceMap = allCusPriceList.stream().collect(Collectors.groupingBy(InventoryCusPrice::getCusCode)); + for (String cusCode : cusPriceMap.keySet()) { + List cusPriceList = cusPriceMap.get(cusCode); + List skuCodes = cusPriceList.stream().map(InventoryCusPrice::getInvCode).collect(Collectors.toList()); + List> skuCodesAsList = CollUtil.split(skuCodes,500); + for (List list : skuCodesAsList) { + try { + flushSupplierSkuPrices(cusCode, list); + } catch (Exception e) { + log.error("客户价格同步失败:{},skus:{}",cusCode,JsonUtil.objectToJson(list)); + } + } + } + + for (InventoryCusPrice cusPrice : allCusPriceList) { + if(maxId==null || cusPrice.getRowId() > maxId){ + maxId = cusPrice.getRowId(); + } + } + if(maxId!=0){ + if(dictData==null){ + dictData = new SysDictData(); + dictData.setDictId(0L); + dictData.setGroupKey(DICT_KEY); + dictData.setKeyVal(maxId+""); + dictData.setLabel(dictTitle); + dictData.setSort(0); + dictData.setRemark(dictTitle); + sysDictDataMapper.insert(dictData); + }else { + dictData.setKeyVal(maxId+""); + sysDictDataMapper.updateById(dictData); + } + } + } + + @Override + public void syncCustomerPrice() { + // 客户特殊价,新增和更新的触发器 + String dictKey = "sync-customer-price-max-id"; + String url = TbsSeeYonConst.ERP_CUS_INV_LAST_UPD; + String title = "同步客户特殊价最大值ID"; + this.syncCustomerPrice(dictKey,title,url); + // 客户特殊价,删除的触发器 + String dictKey2 = "sync-customer-price-del-max-id"; + String url2 = TbsSeeYonConst.ERP_CUS_INV_LAST_DEL; + String title2 = "同步客户特殊价最大值ID(PriceJustify_DeleteLog)"; + this.syncCustomerPrice(dictKey2,title2,url2); + } + + @Override + public void syncCustomerPrice(String cusCode) { + this.flushSupplierSkuPrices(cusCode); + } + + /** + * 局部更新 + * @param cusCode + * @param skuCodes + */ + private void flushSupplierSkuPrices(String cusCode, List skuCodes) { + List goodsSkus = goodsSkuMapper.selectList(new LambdaQueryWrapper().in(GoodsSku::getSkuCode, skuCodes)); + List goodsCustomerPriceList = new ArrayList<>(); + + InventoryCusPriceQuery query = new InventoryCusPriceQuery(); + query.setCusCode(cusCode); + query.setInvCodes(skuCodes); + R erpRs = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); + List erpCusPriceList = new ArrayList<>(); + if(erpRs.getStatus().equals(200)){ + erpCusPriceList = JsonUtil.jsonToList(erpRs.getData(), InventoryCusPrice.class); + } + + BmsSupplier supplier = bmsSupplierMapper.selectOne(new LambdaQueryWrapper() + .eq(BmsSupplier::getCode, cusCode)); + + for (InventoryCusPrice cusPrice : erpCusPriceList) { + GoodsSku goodsSku = null; + for (GoodsSku skuItem : goodsSkus) { + if(skuItem.getSkuCode().equals(cusPrice.getInvCode())){ + goodsSku = skuItem; + } + } + //跳过无效商品 + if(goodsSku==null){ + continue; + } + GoodsCustomerPrice customerPrice = new GoodsCustomerPrice(); + customerPrice.setSupplierId(supplier.getId()); + customerPrice.setSupplierCode(supplier.getCode()); + customerPrice.setSupplierName(supplier.getName()); + customerPrice.setSkuId(goodsSku.getId()+""); + customerPrice.setSkuCode(goodsSku.getSkuCode()); + customerPrice.setSkuName(goodsSku.getSkuName()); + customerPrice.setSkuUnit(goodsSku.getUnitName()); + customerPrice.setInitPrice(cusPrice.getPrice()); + customerPrice.setRealPrice(cusPrice.getPrice()); + goodsCustomerPriceList.add(customerPrice); + } + if(goodsCustomerPriceList.size()>0){ + //移除旧历史 + this.remove(new LambdaQueryWrapper() + .eq(GoodsCustomerPrice::getSupplierCode, cusCode) + .in(GoodsCustomerPrice::getSkuCode,goodsSkus) + ); + this.saveBatch(goodsCustomerPriceList); + } + } + + /** + * 全量更新 + * @param cusCode + */ + private void flushSupplierSkuPrices(String cusCode) { + BmsSupplier supplier = bmsSupplierMapper.selectOne(new LambdaQueryWrapper() + .eq(BmsSupplier::getCode, cusCode)); + R erpRs = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE_CUS+cusCode,null,"查询客户特殊价"); + List erpCusPriceList = new ArrayList<>(); + if(erpRs.getStatus().equals(200)){ + erpCusPriceList = JsonUtil.jsonToList(erpRs.getData(), InventoryCusPrice.class); + } + Set skuCodes = erpCusPriceList.stream().map(InventoryCusPrice::getInvCode).collect(Collectors.toSet()); + List goodsCustomerPriceList = new ArrayList<>(); + if(CollUtil.isNotEmpty(skuCodes)){ + List goodsSkus = goodsSkuMapper.selectList(new LambdaQueryWrapper().in(GoodsSku::getSkuCode, skuCodes)); + for (InventoryCusPrice cusPrice : erpCusPriceList) { + GoodsSku goodsSku = null; + for (GoodsSku skuItem : goodsSkus) { + if(skuItem.getSkuCode().equals(cusPrice.getInvCode())){ + goodsSku = skuItem; + } + } + //跳过无效商品 + if(goodsSku==null){ + continue; + } + GoodsCustomerPrice customerPrice = new GoodsCustomerPrice(); + customerPrice.setSupplierId(supplier.getId()); + customerPrice.setSupplierCode(supplier.getCode()); + customerPrice.setSupplierName(supplier.getName()); + customerPrice.setSkuId(goodsSku.getId()+""); + customerPrice.setSkuCode(goodsSku.getSkuCode()); + customerPrice.setSkuName(goodsSku.getSkuName()); + customerPrice.setSkuUnit(goodsSku.getUnitName()); + customerPrice.setInitPrice(cusPrice.getPrice()); + customerPrice.setRealPrice(cusPrice.getPrice()); + goodsCustomerPriceList.add(customerPrice); + } + } + //移除旧历史 + this.remove(new LambdaQueryWrapper() + .eq(GoodsCustomerPrice::getSupplierCode, cusCode) + ); + if(goodsCustomerPriceList.size()>0){ + this.saveBatch(goodsCustomerPriceList); + } + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsFeedbackServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsFeedbackServiceImpl.java new file mode 100644 index 0000000..a81177c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsFeedbackServiceImpl.java @@ -0,0 +1,101 @@ +package com.qs.serve.modules.goods.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.common.util.TreeUtil; +import com.qs.serve.modules.goods.entity.GoodsFeedbackType; +import com.qs.serve.modules.goods.entity.bo.GoodsFeedbackBo; +import com.qs.serve.modules.goods.entity.so.GoodsFeedbackQuery; +import com.qs.serve.modules.goods.entity.vo.GoodsFeedbackVo; +import com.qs.serve.modules.goods.mapper.GoodsFeedbackTypeMapper; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.mapper.GoodsSpuMapper; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.entity.GoodsFeedback; +import com.qs.serve.modules.goods.service.GoodsFeedbackService; +import com.qs.serve.modules.goods.mapper.GoodsFeedbackMapper; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 问题反馈 服务实现类 + * @author YenHex + * @since 2024-10-25 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsFeedbackServiceImpl extends ServiceImpl implements GoodsFeedbackService { + + private final GoodsSpuMapper goodsSpuMapper; + private final GoodsSkuMapper goodsSkuMapper; + private final SysUserMapper sysUserMapper; + private final GoodsFeedbackTypeMapper feedbackTypeMapper; + + @Override + public List selectListVo(GoodsFeedbackQuery query) { + if(StringUtils.hasText(query.getFeedbackTypeId())){ + List types = feedbackTypeMapper.selectList(new LambdaQueryWrapper() + .eq(GoodsFeedbackType::getPid,query.getFeedbackTypeId())); + if(CollUtil.isNotEmpty(types)){ + List ids = types.stream().map(GoodsFeedbackType::getId).collect(Collectors.toList()); + if(CollUtil.isNotEmpty(ids)){ + List types2 = feedbackTypeMapper.selectList(new LambdaQueryWrapper() + .in(GoodsFeedbackType::getPid,ids)); + List ids2 = types2.stream().map(GoodsFeedbackType::getId).collect(Collectors.toList()); + if(CollUtil.isNotEmpty(ids2)){ + ids.addAll(ids2); + } + } + ids.add(query.getFeedbackTypeId()); + // 使用typeIds条件 + query.setSelectTypesIds(ids); + query.setFeedbackTypeId(null); + } + } + + return baseMapper.selectGoodsFeedbackList(query); + } + + @Override + public void modify(GoodsFeedbackBo param) { + GoodsFeedback feedback = CopierUtil.copy(param,new GoodsFeedback()); + SysUser sysUser = sysUserMapper.selectById(AuthContextUtils.getSysUserId()); + feedback.setUserId(sysUser.getId()); + feedback.setUserCode(sysUser.getCode()); + feedback.setUserName(sysUser.getName()); + + String typeId = feedback.getFeedbackTypeId(); + List goodsFeedbackTypes = new ArrayList<>(); + while (true){ + if(typeId.equals(TreeUtil.DEFAULT_PID_STRING)){ + break; + } + GoodsFeedbackType goodsFeedbackType = feedbackTypeMapper.selectById(typeId); + if(goodsFeedbackType==null){ + break; + } + goodsFeedbackTypes.add(goodsFeedbackType); + typeId = goodsFeedbackType.getPid(); + } + if(CollUtil.isNotEmpty(goodsFeedbackTypes)){ + Collections.reverse(goodsFeedbackTypes); + List arrays = goodsFeedbackTypes.stream().map(GoodsFeedbackType::getName).collect(Collectors.toList()); + feedback.setFeedbackTypeNames(arrays.toArray(new String[arrays.size()])); + } + super.save(feedback); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsFeedbackTypeServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsFeedbackTypeServiceImpl.java new file mode 100644 index 0000000..d950fdc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsFeedbackTypeServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.goods.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.entity.GoodsFeedbackType; +import com.qs.serve.modules.goods.service.GoodsFeedbackTypeService; +import com.qs.serve.modules.goods.mapper.GoodsFeedbackTypeMapper; + +/** + * 问题反馈类型 服务实现类 + * @author YenHex + * @since 2024-11-01 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsFeedbackTypeServiceImpl extends ServiceImpl implements GoodsFeedbackTypeService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsImminentBatchServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsImminentBatchServiceImpl.java new file mode 100644 index 0000000..30332f1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsImminentBatchServiceImpl.java @@ -0,0 +1,48 @@ +package com.qs.serve.modules.goods.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.RowParam; +import com.qs.serve.modules.goods.entity.so.GoodsImminentBatchQuery; +import com.qs.serve.modules.goods.entity.vo.GoodsImminentBatchVo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.entity.GoodsImminentBatch; +import com.qs.serve.modules.goods.service.GoodsImminentBatchService; +import com.qs.serve.modules.goods.mapper.GoodsImminentBatchMapper; + +import java.util.List; + +/** + * 临期批次 服务实现类 + * @author YenHex + * @since 2024-06-11 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsImminentBatchServiceImpl extends ServiceImpl implements GoodsImminentBatchService { + + @Override + public boolean checkExist(String batchCode, String skuId,Long rowId) { + long count = this.count(new LambdaQueryWrapper() + .eq(GoodsImminentBatch::getBatchCode,batchCode) + .eq(GoodsImminentBatch::getSkuId,skuId) + .ne(GoodsImminentBatch::getId,rowId) + ); + return count>0; + } + + @Override + public long countVoList(GoodsImminentBatchQuery query) { + return baseMapper.countVoList(query); + } + + @Override + public List selectVoList(GoodsImminentBatchQuery query) { + return baseMapper.selectVoList(query,new RowParam(true)); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsRuleItemServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsRuleItemServiceImpl.java new file mode 100644 index 0000000..aee99a6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsRuleItemServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.goods.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.entity.GoodsRuleItem; +import com.qs.serve.modules.goods.service.GoodsRuleItemService; +import com.qs.serve.modules.goods.mapper.GoodsRuleItemMapper; + +/** + * 商品sku规则 服务实现类 + * @author YenHex + * @since 2024-03-22 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsRuleItemServiceImpl extends ServiceImpl implements GoodsRuleItemService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsRuleServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsRuleServiceImpl.java new file mode 100644 index 0000000..50c734d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsRuleServiceImpl.java @@ -0,0 +1,619 @@ +package com.qs.serve.modules.goods.service.impl; + +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.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.goods.entity.*; +import com.qs.serve.modules.goods.entity.bo.GoodsRuleBo; +import com.qs.serve.modules.goods.entity.bo.GoodsRuleImportBo; +import com.qs.serve.modules.goods.entity.dto.GoodsRuleBaseDTO; +import com.qs.serve.modules.goods.entity.dto.GoodsRuleItemDTO; +import com.qs.serve.modules.goods.entity.vo.GoodsRuleVo; +import com.qs.serve.modules.goods.mapper.GoodsCategoryMapper; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.mapper.GoodsSpuMapper; +import com.qs.serve.modules.goods.service.GoodsRuleItemService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.service.GoodsRuleService; +import com.qs.serve.modules.goods.mapper.GoodsRuleMapper; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 规则 服务实现类 + * @author YenHex + * @since 2024-03-22 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsRuleServiceImpl extends ServiceImpl implements GoodsRuleService { + + private SysUserMapper sysUserMapper; + private BmsSupplierMapper supplierMapper; + private BmsRegionMapper saleRegionMapper; + private BmsRegion2Mapper bizRegionMapper; + private GoodsRuleItemService goodsRuleItemService; + private GoodsCategoryMapper categoryMapper; + private GoodsSpuMapper spuMapper; + private GoodsSkuMapper skuMapper; + private GoodsCategoryMapper goodsCategoryMapper; + + @Override + public GoodsRuleBo tranGoodsRuleBo(GoodsRuleImportBo ruleImportBo) { + GoodsRuleBo goodsRuleBo = CopierUtil.copy(ruleImportBo,new GoodsRuleBo()); + boolean checkOkFlag = true; + if(CollUtil.isNotEmpty(ruleImportBo.getOnlyCategoryCodes())){ + List categoryList = categoryMapper + .selectList(new LambdaQueryWrapper() + .in(GoodsCategory::getCode,ruleImportBo.getOnlyCategoryCodes())); + List errCodes = new ArrayList<>(); + for (String code : ruleImportBo.getOnlyCategoryCodes()) { + boolean mch = categoryList.stream().anyMatch(a->a.getCode().equals(code)); + if(!mch){ + errCodes.add(code); + } + } + if(errCodes.size()>0){ + checkOkFlag = false; + ruleImportBo.setErrOnlyCategoryCodes(errCodes); + }else { + List ids = categoryList.stream().map(a->a.getId().toString()).collect(Collectors.toList()); + goodsRuleBo.setOnlyCategoryIds(ids); + //1只能选的分类 + goodsRuleBo.getSelectTargetTypes().add(1); + } + } + + if(CollUtil.isNotEmpty(ruleImportBo.getNotInCategoryCodes())){ + List categoryList = categoryMapper + .selectList(new LambdaQueryWrapper() + .in(GoodsCategory::getCode,ruleImportBo.getNotInCategoryCodes())); + List errCodes = new ArrayList<>(); + for (String code : ruleImportBo.getNotInCategoryCodes()) { + boolean mch = categoryList.stream().anyMatch(a->a.getCode().equals(code)); + if(!mch){ + errCodes.add(code); + } + } + if(errCodes.size()>0){ + checkOkFlag = false; + ruleImportBo.setErrNotInCategoryCodes(errCodes); + }else { + List ids = categoryList.stream().map(a->a.getId().toString()).collect(Collectors.toList()); + goodsRuleBo.setNotInCategoryIds(ids); + //2不能选的分类 + goodsRuleBo.getSelectTargetTypes().add(2); + } + } + + if(CollUtil.isNotEmpty(ruleImportBo.getOnlySpuCodes())){ + List spuList = spuMapper + .selectList(new LambdaQueryWrapper() + .in(GoodsSpu::getSpuCode,ruleImportBo.getOnlySpuCodes())); + List errCodes = new ArrayList<>(); + for (String code : ruleImportBo.getOnlySpuCodes()) { + boolean mch = spuList.stream().anyMatch(a->a.getSpuCode().equals(code)); + if(!mch){ + checkOkFlag = false; + errCodes.add(code); + } + } + if(errCodes.size()>0){ + ruleImportBo.setErrOnlySpuCodes(errCodes); + }else { + List ids = spuList.stream().map(a->a.getId().toString()).collect(Collectors.toList()); + goodsRuleBo.setOnlySpuIds(ids); + //3只能选的SPU + goodsRuleBo.getSelectTargetTypes().add(3); + } + } + + if(CollUtil.isNotEmpty(ruleImportBo.getNotInSpuCodes())){ + List spuList = spuMapper + .selectList(new LambdaQueryWrapper() + .in(GoodsSpu::getSpuCode,ruleImportBo.getNotInSpuCodes())); + List errCodes = new ArrayList<>(); + for (String code : ruleImportBo.getNotInSpuCodes()) { + boolean mch = spuList.stream().anyMatch(a->a.getSpuCode().equals(code)); + if(!mch){ + errCodes.add(code); + } + } + if(CollUtil.isNotEmpty(errCodes)){ + checkOkFlag = false; + ruleImportBo.setErrNotInSpuCodes(errCodes); + }else { + List ids = spuList.stream().map(a->a.getId().toString()).collect(Collectors.toList()); + goodsRuleBo.setNotInSpuIds(ids); + //4不能选的SPU + goodsRuleBo.getSelectTargetTypes().add(4); + } + } + ruleImportBo.setCheckOkFlag(checkOkFlag); + return goodsRuleBo; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void modify(GoodsRuleBo param) { + GoodsRule goodsRule = null; + if(param.getRuleId()==null){ + goodsRule = getGoodsRule(param); + }else { + goodsRule = this.getById(param.getRuleId()); + } + + if(goodsRule==null){ + Assert.throwEx("参数异常 500B1 "); + } + + boolean b1 = CollUtil.isNotEmpty(param.getOnlyCategoryIds()); + boolean b2 = CollUtil.isNotEmpty(param.getNotInCategoryIds()); + boolean b3 = CollUtil.isNotEmpty(param.getOnlySpuIds()); + boolean b4 = CollUtil.isNotEmpty(param.getNotInSpuIds()); + + //清空操作 + LambdaQueryWrapper rmItem = new LambdaQueryWrapper<>(); + rmItem.eq(GoodsRuleItem::getRuleId,goodsRule.getId()); + //用于区分导入时,excel未传入数据,导致删除 + if(CollUtil.isNotEmpty(param.getSelectTargetTypes())){ + rmItem.in(GoodsRuleItem::getTargetType,param.getSelectTargetTypes()); + } + goodsRuleItemService.remove(rmItem); + + if(!b1 && !b2 && !b3 && !b4){ + if(goodsRule.getId()!=null){ + goodsRule.setEmptyFlag(1); + this.updateById(goodsRule); + } + }else { + if(goodsRule.getId()!=null){ + goodsRule.setEmptyFlag(0); + this.updateById(goodsRule); + }else { + this.save(goodsRule); + param.setRuleId(goodsRule.getId()); + } + Long ruleId = goodsRule.getId(); + if(b1){ + List categoryList = categoryMapper.selectBatchIds(param.getOnlyCategoryIds()); + List ruleItems = categoryList.stream().map(cate->{ + GoodsRuleItem item = new GoodsRuleItem(); + item.setRuleId(ruleId); + item.setTargetType(1); + item.setTargetCode(cate.getCode()); + item.setTargetName(cate.getName()); + item.setTargetId(cate.getId()+""); + return item; + }).collect(Collectors.toList()); + goodsRuleItemService.saveBatch(ruleItems); + } + + if(b2){ + List categoryList = categoryMapper.selectBatchIds(param.getNotInCategoryIds()); + List ruleItems = categoryList.stream().map(cate->{ + GoodsRuleItem item = new GoodsRuleItem(); + item.setRuleId(ruleId); + item.setTargetType(2); + item.setTargetCode(cate.getCode()); + item.setTargetName(cate.getName()); + item.setTargetId(cate.getId()+""); + return item; + }).collect(Collectors.toList()); + goodsRuleItemService.saveBatch(ruleItems); + } + + if(b3){ + List spuList = spuMapper.selectBatchIds(param.getOnlySpuIds()); + List ruleItems = spuList.stream().map(spu->{ + GoodsRuleItem item = new GoodsRuleItem(); + item.setRuleId(ruleId); + item.setTargetType(3); + item.setTargetCode(spu.getSpuCode()); + item.setTargetName(spu.getName()); + item.setTargetId(spu.getId()+""); + return item; + }).collect(Collectors.toList()); + goodsRuleItemService.saveBatch(ruleItems); + } + + if(b4){ + List spuList = spuMapper.selectBatchIds(param.getNotInSpuIds()); + List ruleItems = spuList.stream().map(spu->{ + GoodsRuleItem item = new GoodsRuleItem(); + item.setRuleId(ruleId); + item.setTargetType(4); + item.setTargetCode(spu.getSpuCode()); + item.setTargetName(spu.getName()); + item.setTargetId(spu.getId()+""); + return item; + }).collect(Collectors.toList()); + goodsRuleItemService.saveBatch(ruleItems); + } + } + } + + @Override + public GoodsRuleVo getVoById(GoodsRuleBaseDTO baseDTO) { + GoodsRule goodsRule = this.getGoodsRule(baseDTO); + List categoryList = categoryMapper.selectList(new QueryWrapper<>()); + Map> cateListMap = categoryList.stream().collect(Collectors.groupingBy(GoodsCategory::getId)); + if(goodsRule.getId()!=null){ + LambdaQueryWrapper listByRuleLqw = new LambdaQueryWrapper<>(); + listByRuleLqw.eq(GoodsRuleItem::getRuleId,goodsRule.getId()); + List ruleItems = goodsRuleItemService.list(listByRuleLqw); + Map> ruleItemMap = ruleItems.stream() + .collect(Collectors.groupingBy(GoodsRuleItem::getTargetType)); + List list1 = ruleItemMap.get(1); + List list2 = ruleItemMap.get(2); + List list3 = ruleItemMap.get(3); + List list4 = ruleItemMap.get(4); + GoodsRuleVo ruleVo = new GoodsRuleVo(); + ruleVo.setRuleId(goodsRule.getId()); + ruleVo.setRemark(goodsRule.getRemark()); + if(CollUtil.isNotEmpty(list1)){ + List ids = list1.stream().map(GoodsRuleItem::getTargetId).collect(Collectors.toList()); + ruleVo.setOnlyCategoryList(categoryMapper.selectBatchIds(ids)); + } + if(CollUtil.isNotEmpty(list2)){ + List ids = list2.stream().map(GoodsRuleItem::getTargetId).collect(Collectors.toList()); + ruleVo.setNotInCategoryList(categoryMapper.selectBatchIds(ids)); + } + if(CollUtil.isNotEmpty(list3)){ + List ids = list3.stream().map(GoodsRuleItem::getTargetId).collect(Collectors.toList()); + List spuList = spuMapper.selectBatchIds(ids); + for (GoodsSpu spu : spuList) { + spu.setCateFirstLabel(this.getCateName(cateListMap,spu.getCategoryFirst())); + spu.setCateSecondLabel(this.getCateName(cateListMap,spu.getCategorySecond())); + spu.setCateThirdLabel(this.getCateName(cateListMap,spu.getCategoryThird())); + } + ruleVo.setOnlySpuList(spuList); + } + if(CollUtil.isNotEmpty(list4)){ + List ids = list4.stream().map(GoodsRuleItem::getTargetId).collect(Collectors.toList()); + List spuList = spuMapper.selectBatchIds(ids); + for (GoodsSpu spu : spuList) { + spu.setCateFirstLabel(this.getCateName(cateListMap,spu.getCategoryFirst())); + spu.setCateSecondLabel(this.getCateName(cateListMap,spu.getCategorySecond())); + spu.setCateThirdLabel(this.getCateName(cateListMap,spu.getCategoryThird())); + } + ruleVo.setNotInSpuList(spuList); + } + return ruleVo; + } + return null; + } + + private String getCateName(Map> cateListMap, String id) { + Long cateId = Long.parseLong(id); + List items = cateListMap.get(cateId); + if(items!=null&&items.size()>0){ + return items.get(0).getName(); + } + return null; + } + + @Override + public List listByUserId(String userId) { + List goodsRules = this.list(new LambdaQueryWrapper() + .eq(GoodsRule::getUserId,userId) + ); + List ruleIds = goodsRules.stream().map(GoodsRule::getId).collect(Collectors.toList()); + if(CollUtil.isNotEmpty(ruleIds)){ + return goodsRuleItemService.list(new LambdaQueryWrapper() + .in(GoodsRuleItem::getRuleId,ruleIds) + ); + } + return null; + } + + @Override + public List listBySupplierId(String supplierId) { + BmsSupplier supplier = supplierMapper.selectById(supplierId); + + List goodsRules = this.list(new LambdaQueryWrapper() + .eq(GoodsRule::getSupplierId,supplierId) + ); + List bizRegionIds = supplier.listBizRegionIds(); + bizRegionIds.add("#"); + List saleRegionIds = supplier.listSaleRegionIds(); + saleRegionIds.add("#"); + List bySaleRegion = this.list(new LambdaQueryWrapper() + .in(GoodsRule::getSaleRegionId,saleRegionIds) + ); + goodsRules.addAll(bySaleRegion); + List byBizRegion = this.list(new LambdaQueryWrapper() + .in(GoodsRule::getBizRegionId,bizRegionIds) + ); + goodsRules.addAll(byBizRegion); + + List ruleIds = goodsRules.stream().map(GoodsRule::getId).collect(Collectors.toList()); + + if(CollUtil.isNotEmpty(ruleIds)){ + return goodsRuleItemService.list(new LambdaQueryWrapper() + .in(GoodsRuleItem::getRuleId,ruleIds) + ); + } + return null; + } + + @Override + public GoodsRuleItemDTO buildGoodsRuleItemDTO(List ruleItems) { + if (CollUtil.isNotEmpty(ruleItems)){ + GoodsRuleItemDTO dto = new GoodsRuleItemDTO(); + Map> map = ruleItems.stream() + .collect(Collectors.groupingBy(GoodsRuleItem::getTargetType)); + dto.setOnlyCategoryIds(this.getRuleStrings(map.get(1))); + dto.setNotInCategoryIds(this.getRuleStrings(map.get(2))); + dto.setOnlySpuIds(this.getRuleStrings(map.get(3))); + dto.setNotInSpuIds(this.getRuleStrings(map.get(4))); + return dto; + } + return null; + } + + + @Override + public boolean checkSkuCode(List skuCodes, String supplierId, boolean throwEx) { + List ruleItems = this.listBySupplierId(supplierId); + return baseCheckSkuCode(skuCodes, throwEx, ruleItems); + } + + @Override + public boolean checkSkuCodeByUserId(List skuCodes, String userId, boolean throwEx) { + List ruleItems = this.listByUserId(userId); + return baseCheckSkuCode(skuCodes, throwEx, ruleItems); + } + + private boolean baseCheckSkuCode(List skuCodes, boolean throwEx, List ruleItems) { + if(CollUtil.isEmpty(skuCodes)){ + return false; + } + GoodsRuleItemDTO itemDTO = this.buildGoodsRuleItemDTO(ruleItems); + if(itemDTO==null){ + return true; + } + List goodsSkuList = skuMapper.selectList(new LambdaQueryWrapper().in(GoodsSku::getSkuCode, skuCodes)); + for (GoodsSku sku : goodsSkuList) { + boolean notExistInOnly = false; + if(itemDTO.getOnlySpuIds()!=null){ + for (String onlySpuId : itemDTO.getOnlySpuIds()) { + if(sku.getSpuId().toString().equals(onlySpuId)){ + notExistInOnly = true; + break; + } + } + } + + if(!notExistInOnly && throwEx){ + Assert.throwEx("单品["+sku.getSkuCode()+"]不符合SKU规则"); + } + + if(itemDTO.getNotInSpuIds()!=null){ + for (String notInSpuId : itemDTO.getNotInSpuIds()) { + if(sku.getSpuId().toString().equals(notInSpuId)){ + if(throwEx){ + GoodsSpu goodsSpu = spuMapper.selectById(notInSpuId); + Assert.throwEx("SKU["+goodsSpu.getSpuCode()+"/"+goodsSpu.getName()+"]不可选,单品["+sku.getSkuCode()+"]"); + }else { + return false; + } + } + } + } + if(itemDTO.getOnlyCategoryIds()==null&&itemDTO.getNotInCategoryIds()==null){ + continue; + } + GoodsSpu spu = spuMapper.selectById(sku.getSpuId()); + if(itemDTO.getOnlyCategoryIds()!=null){ + boolean anyMatch = false; + for (String categoryId : spu.listCategoryIds()) { + for (String onlyCategoryId : itemDTO.getOnlyCategoryIds()) { + boolean itemAnyMatch = onlyCategoryId.equals(categoryId); + if(itemAnyMatch){ + anyMatch = true; + break; + } + } + } + if (!anyMatch){ + if(throwEx){ + Assert.throwEx("SKU["+spu.getSpuCode()+"],类目不符合分类规则"); + }else { + return false; + } + } + + } + if(itemDTO.getNotInCategoryIds()!=null){ + for (String notInCateId : itemDTO.getNotInCategoryIds()) { + boolean b1 = notInCateId.equals(spu.getCategoryFirst()); + boolean b2 = notInCateId.equals(spu.getCategorySecond()); + boolean b3 = notInCateId.equals(spu.getCategoryThird()); + boolean anyMatch = b1||b2||b3; + if (anyMatch){ + if(throwEx){ + GoodsCategory goodsCategory = goodsCategoryMapper.selectById(notInCateId); + Assert.throwEx("类目["+goodsCategory.getCode()+"/"+goodsCategory.getName()+"]不可选,SKU["+spu.getSkuCode()+"]"); + }else { + return false; + } + } + } + } + } + return false; + } + + @Override + public List checkSkuCodeByUserId(String userId, List skuIds) { + List ruleItems = this.listByUserId(userId); + if(CollUtil.isEmpty(skuIds)){ + return new ArrayList<>(); + } + return baseCheckRuleItem(skuIds, ruleItems,true); + } + + @Override + public List checkSkuCode( String supplierId,List skuIds) { + List ruleItems = this.listBySupplierId(supplierId); + if(CollUtil.isEmpty(skuIds)){ + return new ArrayList<>(); + } + return baseCheckRuleItem(skuIds, ruleItems,false); + } + + @NotNull + private List baseCheckRuleItem(List skuIds, List ruleItems,boolean isUserRule) { + List errorSkuIds = new ArrayList<>(); + GoodsRuleItemDTO itemDTO = this.buildGoodsRuleItemDTO(ruleItems); + if(itemDTO==null){ + return errorSkuIds; + } + List goodsSkuList = skuMapper.selectBatchIds(skuIds); + for (GoodsSku sku : goodsSkuList) { + boolean notExistInOnly = false; + if(itemDTO.getOnlySpuIds()!=null){ + for (String onlySpuId : itemDTO.getOnlySpuIds()) { + if(sku.getSpuId().toString().equals(onlySpuId)){ + notExistInOnly = true; + break; + } + } + if(!notExistInOnly){ + errorSkuIds.add(new SimpleKeyValue(isUserRule?"客户人员维度(只可选未包含该产品)":"客户维度(只可选未包含该产品)",sku.getId())); + continue; + } + } + + + if(itemDTO.getNotInSpuIds()!=null){ + boolean isErr = false; + for (String notInSpuId : itemDTO.getNotInSpuIds()) { + if(sku.getSpuId().toString().equals(notInSpuId)){ + isErr = true; + errorSkuIds.add(new SimpleKeyValue(isUserRule?"客户人员维度(不可选)":"客户维度(不可选)",sku.getId())); + break; + } + } + if(isErr){ + continue; + } + } + if(itemDTO.getOnlyCategoryIds()==null&&itemDTO.getNotInCategoryIds()==null){ + continue; + } + GoodsSpu spu = spuMapper.selectById(sku.getSpuId()); + if(itemDTO.getOnlyCategoryIds()!=null){ + boolean anyMatch = false; + for (String categoryId : spu.listCategoryIds()) { + for (String onlyCategoryId : itemDTO.getOnlyCategoryIds()) { + boolean itemAnyMatch = onlyCategoryId.equals(categoryId); + if(itemAnyMatch){ + anyMatch = true; + break; + } + } + } + if (!anyMatch){ + errorSkuIds.add(new SimpleKeyValue(isUserRule?"客户人员维度(只可选未包含该产品)":"客户维度(只可选未包含该产品)",sku.getId())); + continue; + } + + } + if(itemDTO.getNotInCategoryIds()!=null){ + for (String notInCateId : itemDTO.getNotInCategoryIds()) { + boolean b1 = notInCateId.equals(spu.getCategoryFirst()); + boolean b2 = notInCateId.equals(spu.getCategorySecond()); + boolean b3 = notInCateId.equals(spu.getCategoryThird()); + boolean anyMatch = b1||b2||b3; + if (anyMatch){ + errorSkuIds.add(new SimpleKeyValue(isUserRule?"客户人员维度(不可选)":"客户维度(不可选)",sku.getId())); + } + } + } + } + return errorSkuIds; + } + + private List getRuleStrings(List list) { + if(CollUtil.isEmpty(list)){ + return null; + } + return list.stream().map(a->a.getTargetId()+"").collect(Collectors.toList()); + } + + + private GoodsRule getGoodsRule(GoodsRuleBaseDTO param) { + GoodsRule goodsRule = null; + if(param.getSupplierId()!=null){ + BmsSupplier supplier = supplierMapper.selectById(param.getSupplierId()); + if(supplier!=null){ + goodsRule = super.baseMapper.selectRuleBySupplierId(param.getSupplierId()); + if(goodsRule ==null){ + goodsRule = new GoodsRule(); + goodsRule.setSupplierId(param.getSupplierId()); + goodsRule.setCode(supplier.getCode()); + goodsRule.setName(supplier.getName()); + } + } + }else if (StringUtils.hasText(param.getBizRegionId())){ + BmsRegion2 region2 = bizRegionMapper.selectById(param.getBizRegionId()); + if(region2!=null){ + goodsRule = super.baseMapper.selectRuleByBizRegionId(param.getBizRegionId()); + if(goodsRule ==null){ + goodsRule = new GoodsRule(); + goodsRule.setBizRegionId(param.getBizRegionId()); + goodsRule.setCode(region2.getCode()); + goodsRule.setName(region2.getName()); + } + } + }else if (StringUtils.hasText(param.getSaleRegionId())){ + BmsRegion region = saleRegionMapper.selectById(param.getSaleRegionId()); + if(region!=null){ + goodsRule = super.baseMapper.selectRuleBySaleRegionId(param.getSaleRegionId()); + if(goodsRule ==null){ + goodsRule = new GoodsRule(); + goodsRule.setSaleRegionId(param.getSaleRegionId()); + goodsRule.setCode(region.getCode()); + goodsRule.setName(region.getName()); + } + } + }else if (StringUtils.hasText(param.getUserId())){ + SysUser sysUser = sysUserMapper.selectById(param.getUserId()); + if(sysUser!=null){ + goodsRule = super.baseMapper.selectRuleByUserId(param.getUserId()); + if(goodsRule ==null){ + goodsRule = new GoodsRule(); + goodsRule.setUserId(sysUser.getId()); + goodsRule.setCode(sysUser.getCode()); + goodsRule.setName(sysUser.getName()); + } + } + } + return goodsRule; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSaleGroupServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSaleGroupServiceImpl.java new file mode 100644 index 0000000..7a4ccca --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSaleGroupServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.goods.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.entity.GoodsSaleGroup; +import com.qs.serve.modules.goods.service.GoodsSaleGroupService; +import com.qs.serve.modules.goods.mapper.GoodsSaleGroupMapper; + +/** + * 商品销售分组 服务实现类 + * @author YenHex + * @since 2023-08-21 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsSaleGroupServiceImpl extends ServiceImpl implements GoodsSaleGroupService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSeriesServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSeriesServiceImpl.java new file mode 100644 index 0000000..f18a1fa --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSeriesServiceImpl.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.goods.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.entity.GoodsSeries; +import com.qs.serve.modules.goods.service.GoodsSeriesService; +import com.qs.serve.modules.goods.mapper.GoodsSeriesMapper; + +/** + * 系列 服务实现类 + * @author YenHex + * @since 2022-10-11 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsSeriesServiceImpl extends ServiceImpl implements GoodsSeriesService { + + @Override + public GoodsSeries getByCode(String code) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsSeries::getCode,code); + return getOne(lqw,false); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSkuServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSkuServiceImpl.java new file mode 100644 index 0000000..78d729b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSkuServiceImpl.java @@ -0,0 +1,345 @@ +package com.qs.serve.modules.goods.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.goods.common.GoodsConst; +import com.qs.serve.modules.goods.entity.*; +import com.qs.serve.modules.goods.entity.bo.GoodsSkuBo; +import com.qs.serve.modules.goods.entity.dto.InventoryCusPrice; +import com.qs.serve.modules.goods.entity.so.InventoryCusPriceQuery; +import com.qs.serve.modules.goods.entity.vo.GoodSkuVo; +import com.qs.serve.modules.goods.entity.vo.GoodsSkuSpecValueVo; +import com.qs.serve.modules.goods.mapper.GoodsCategoryMapper; +import com.qs.serve.modules.goods.mapper.GoodsSpuMapper; +import com.qs.serve.modules.goods.service.GoodsSkuSpecValueService; +import com.qs.serve.modules.goods.service.GoodsSpecValueService; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + + +/** + * sku 服务实现类 + * @author YenHex + * @since 2022-10-09 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsSkuServiceImpl extends ServiceImpl implements GoodsSkuService { + + private GoodsCategoryMapper goodsCategoryMapper; + private GoodsSpuMapper goodsSpuMapper; + private GoodsSkuSpecValueService goodsSkuSpecValueService; + private GoodsSpecValueService goodsSpecValueService; + private SeeYonRequestBaseService seeYonRequestBaseService; + + @Override + public List getBelongPlace() { + return baseMapper.getBelongStringList(); + } + + @Override + public GoodsSku getByCode(String code) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsSku::getSkuCode,code); + return getOne(lqw,false); + } + + @Override + public List getByCodes(List codes) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(GoodsSku::getSkuCode,codes); + return this.list(lqw); + } + + @Override + public List getBySpuId(Long spuId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsSku::getSpuId,spuId); + return list(lqw); + } + + @Override + public List selectSkuVo(GoodsSku goodsSku) { + return baseMapper.selectSkuVo(goodsSku); + } + + @Override + public List selectSkuByCategoryIds(List categoryIds) { + return baseMapper.selectByCategoryIds(categoryIds, AuthContextUtils.getTenant()); + } + + @Override + public void initSkuCusPrice(String supplierCode,List skus) { + if(CollectionUtil.isNotEmpty(skus)&& StringUtils.hasText(supplierCode)){ + List codes = skus.stream().map(GoodsSku::getSkuCode).distinct().collect(Collectors.toList()); + InventoryCusPriceQuery query = new InventoryCusPriceQuery(); + query.setCusCode(supplierCode); + query.setInvCodes(codes); + try { +// GoodsCustomerPriceService goodsCustomerPriceService = SpringUtils.getBean(GoodsCustomerPriceService.class); +// List customerPrices = goodsCustomerPriceService.getBySupplierCodeAndCode(supplierCode,codes); +// for (GoodsCustomerPrice customerPrice : customerPrices) { +// for (GoodsSku sku : skus) { +// if(sku.getSkuCode().equals(customerPrice.getSkuCode())){ +// sku.setSalesPrice(customerPrice.getRealPrice()); +// break; +// } +// } +// } + R res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); + if(res.getStatus().equals(200)){ + List inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); + assert inventoryCusPrices != null; + for (InventoryCusPrice cusPrice : inventoryCusPrices) { + for (GoodsSku sku : skus) { + if(sku.getSkuCode().equals(cusPrice.getInvCode())){ + sku.setSalesPrice(cusPrice.getPrice()); + break; + } + } + } + } + } catch (Exception e) { + log.error("客户特殊价异常:{}",e.getMessage()); + } + } + } + + @Override + public void initSkuVoCusPrice(String supplierCode, List skus) { + if(CollectionUtil.isNotEmpty(skus)&& StringUtils.hasText(supplierCode)){ + List codes = skus.stream().map(GoodsSku::getSkuCode).distinct().collect(Collectors.toList()); + InventoryCusPriceQuery query = new InventoryCusPriceQuery(); + query.setCusCode(supplierCode); + query.setInvCodes(codes); + try { + R res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); + if(res.getStatus().equals(200)){ + List inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); + assert inventoryCusPrices != null; + for (InventoryCusPrice cusPrice : inventoryCusPrices) { + for (GoodsSku sku : skus) { + if(sku.getSkuCode().equals(cusPrice.getInvCode())){ + sku.setSalesPrice(cusPrice.getPrice()); + break; + } + } + } + } + } catch (Exception e) { + log.error("客户特殊价异常:{}",e.getMessage()); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void editSku(GoodsSkuBo goodSkuVo) { + GoodsSku dbGoodSku = null; + if(goodSkuVo.getSkuId()!=null){ + dbGoodSku = this.getById(goodSkuVo.getSkuId()); + if(dbGoodSku==null){ + Assert.throwEx("数据不存在"); + } + } + GoodsSku goodsSku = CopierUtil.copy(goodSkuVo,new GoodsSku()); + if(dbGoodSku!=null){ + if(goodsSku.getSpuId()!=null&&!goodsSku.getSpuId().equals(dbGoodSku.getSpuId())){ + Assert.throwEx("规格编码已被其它商品使用"); + } + goodsSku.setId(dbGoodSku.getId()); + } + if(goodSkuVo.getSpecValueIds()!=null){ + if(goodSkuVo.getSpecValueIds().size()!= GoodsConst.SPEC_COUNT){ + Assert.throwEx("规格值数量缺失"); + } + List goodsSpecValues = goodsSpecValueService.listByIds(goodSkuVo.getSpecValueIds()); + Set specIds = goodsSpecValues.stream().map(GoodsSpecValue::getSpecId).collect(Collectors.toSet()); + if(specIds.size()!=GoodsConst.SPEC_COUNT){ + Assert.throwEx("规格数量缺失"); + } + //校验规格值 + List skuSpecValueVos = goodsSkuSpecValueService.listSpecValueBySpuId(goodSkuVo.getSpuId()); + if(CollectionUtil.isNotEmpty(skuSpecValueVos)){ + Map> skuValListMap = skuSpecValueVos.stream().collect(Collectors.groupingBy(GoodsSkuSpecValueVo::getSkuId)); + for (Long skuIdKey : skuValListMap.keySet()) { + List skuSpecValueVoList = skuValListMap.get(skuIdKey); + boolean matchAll = true; + for (GoodsSpecValue specValue : goodsSpecValues) { + boolean matchItem = false; + for (GoodsSkuSpecValueVo specValueVo : skuSpecValueVoList) { + if(specValueVo.getSpecValueId().equals(specValue.getId())){ + matchItem = true; + break; + } + } + if(!matchItem){ + matchAll = false; + } + } + if(matchAll&&!skuIdKey.equals(goodsSku.getId())){ + Assert.throwEx("规格值组合已被占用"); + } + } + } + String specInfos = ""; + for (int i = 0; i < goodsSpecValues.size(); i++) { + GoodsSpecValue specValue = goodsSpecValues.get(i); + if( i > 0 ){ + specInfos = ";"+specInfos; + } + specInfos = specValue.getName() + specInfos; + } + goodsSku.setSpecInfos(specInfos); + this.saveOrUpdate(goodsSku); + if(dbGoodSku!=null){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsSkuSpecValue::getSkuId,dbGoodSku.getId()); + goodsSkuSpecValueService.remove(lqw); + } + for (GoodsSpecValue specValue : goodsSpecValues) { + goodsSkuSpecValueService.initSkuSpecValue(goodsSku.getSpuId(),goodsSku.getId(),specValue.getId()); + } + }else { + this.updateById(goodsSku); + } + //更新特殊标识 + LambdaQueryWrapper specialSkuLqw = new LambdaQueryWrapper<>(); + specialSkuLqw.eq(GoodsSku::getSpecialFlag,1); + specialSkuLqw.eq(GoodsSku::getSpuId,goodsSku.getSpuId()); + List specialSkuList = super.list(specialSkuLqw); + if(specialSkuList.size()>0){ + GoodsSku goodsSku1 = specialSkuList.get(0); + GoodsSpuMapper spuMapper = SpringUtils.getBean(GoodsSpuMapper.class); + GoodsSpu spu = new GoodsSpu(); + spu.setId(goodsSku1.getSpuId()); + if(goodSkuVo.getSpecialFlag().equals(1)){ + spu.setSpecialSkuId(goodsSku1.getId()); + }else { + spu.setSpecialSkuId(0L); + } + spuMapper.updateById(spu); + } + + + } + + @Override + public void editSku2(GoodsSkuBo goodSkuVo) { + // 过滤产字 + if(goodSkuVo.getBelong().contains("产")){ + goodSkuVo.setBelong(goodSkuVo.getBelong().replace("产","")); + } + GoodsSku dbGoodSku = null; + if(goodSkuVo.getSkuId()!=null){ + dbGoodSku = this.getById(goodSkuVo.getSkuId()); + if(dbGoodSku==null){ + Assert.throwEx("数据不存在"); + } + }else { + //支持通过code更新 + dbGoodSku = this.getByCode(goodSkuVo.getSkuCode()); + } + if(goodSkuVo.getOrderFlag()==1){ + LambdaQueryWrapper skuCheckLqw = new LambdaQueryWrapper<>(); + if(dbGoodSku!=null){ + skuCheckLqw.ne(GoodsSku::getId,dbGoodSku.getId()); + } + skuCheckLqw.eq(GoodsSku::getSpuId,goodSkuVo.getSpuId()); + skuCheckLqw.eq(GoodsSku::getBelong,goodSkuVo.getBelong()); + skuCheckLqw.eq(GoodsSku::getSpecialFlag,0); + skuCheckLqw.eq(GoodsSku::getOrderFlag,1); + if(this.count(skuCheckLqw)>0){ + Assert.throwEx("下单的产地需唯一"); + } + } + + GoodsSku goodsSku = CopierUtil.copy(goodSkuVo,new GoodsSku()); + if(dbGoodSku!=null){ + if(goodsSku.getSpuId()!=null&&!goodsSku.getSpuId().equals(dbGoodSku.getSpuId())){ + Assert.throwEx("规格编码已被其它商品使用"); + } + 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){ + Assert.throwEx("商品SKU不存在"); + } + GoodsCategory goodsCategory = goodsCategoryMapper.selectById(goodsSpu.getCategoryFirst()); + if(goodsCategory==null){ + Assert.throwEx("商品SKU ‘"+goodsSpu.getSpuCode()+"’ 关联的分类不存在"); + } + goodsSku.setBookBelong(goodsCategory.getBookBelong()); + goodsSku.setBookName(goodsCategory.getBookName()); + + //校验规格值 + String specInfos = goodsSku.getBelong().trim()+";"+goodsSku.getTasteVal().trim()+";"+goodsSku.getWrapVal().trim(); + LambdaQueryWrapper checkSkuSpec = new LambdaQueryWrapper<>(); + checkSkuSpec.eq(GoodsSku::getSpuId,goodsSku.getId()); + //拓展支持临时的SPU + checkSkuSpec.ne(GoodsSku::getSpuId,0); + checkSkuSpec.eq(GoodsSku::getSpecInfos,specInfos); + if(goodsSku.getId()!=null){ + checkSkuSpec.ne(GoodsSku::getId,goodsSku.getId()); + } + Long checkSkuSpecCount = super.count(checkSkuSpec); + if(checkSkuSpecCount>0){ + Assert.throwEx("相同规格已存在"); + } + goodsSku.setSpecInfos(specInfos); + goodsSku.setOrderOfflineFlag(goodSkuVo.getOrderOfflineFlag()); + goodsSku.setOrderOnlineFlag(goodSkuVo.getOrderOnlineFlag()); + this.saveOrUpdate(goodsSku); + + //更新特殊标识 + if(!goodsSku.getSpuId().equals(0L)){ + LambdaQueryWrapper specialSkuLqw = new LambdaQueryWrapper<>(); + specialSkuLqw.eq(GoodsSku::getSpecialFlag,1); + specialSkuLqw.eq(GoodsSku::getSpuId,goodsSku.getSpuId()); + List specialSkuList = super.list(specialSkuLqw); + if(specialSkuList.size()>0){ + GoodsSku goodsSku1 = specialSkuList.get(0); + GoodsSpuMapper spuMapper = SpringUtils.getBean(GoodsSpuMapper.class); + GoodsSpu spu = new GoodsSpu(); + spu.setId(goodsSku1.getSpuId()); + if(goodSkuVo.getSpecialFlag().equals(1)){ + spu.setSpecialSkuId(goodsSku1.getId()); + }else { + spu.setSpecialSkuId(0L); + } + spuMapper.updateById(spu); + } + } + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSkuSpecValueServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSkuSpecValueServiceImpl.java new file mode 100644 index 0000000..4e43d4d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSkuSpecValueServiceImpl.java @@ -0,0 +1,56 @@ +package com.qs.serve.modules.goods.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.goods.entity.vo.GoodsSkuSpecValueVo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.entity.GoodsSkuSpecValue; +import com.qs.serve.modules.goods.service.GoodsSkuSpecValueService; +import com.qs.serve.modules.goods.mapper.GoodsSkuSpecValueMapper; + +import java.util.List; + +/** + * sku规格值 服务实现类 + * @author YenHex + * @since 2022-10-09 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsSkuSpecValueServiceImpl extends ServiceImpl implements GoodsSkuSpecValueService { + + @Override + public List listSpecValueBySpuId(Long spuId) { + return baseMapper.listSpecValueBySpuId(spuId); + } + + @Override + public List listSpecValueBySkuId(Long skuId) { + return baseMapper.listSpecValueBySkuId(skuId); + } + + @Override + public GoodsSkuSpecValue getByIds(Long skuId, Long specValueId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsSkuSpecValue::getSkuId,skuId); + lqw.eq(GoodsSkuSpecValue::getSpecValueId,specValueId); + return getOne(lqw,false); + } + + @Override + public void initSkuSpecValue(Long spuId, Long skuId, Long specValueId) { + GoodsSkuSpecValue skuSpecValue = this.getByIds(skuId,specValueId); + if(skuSpecValue==null){ + skuSpecValue = new GoodsSkuSpecValue(); + skuSpecValue.setSkuId(skuId); + skuSpecValue.setSpecValueId(specValueId); + skuSpecValue.setSpuId(spuId); + skuSpecValue.setSort(0); + this.save(skuSpecValue); + } + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSpecServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSpecServiceImpl.java new file mode 100644 index 0000000..84f61e4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSpecServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.goods.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.entity.GoodsSpec; +import com.qs.serve.modules.goods.service.GoodsSpecService; +import com.qs.serve.modules.goods.mapper.GoodsSpecMapper; + +/** + * 规格 服务实现类 + * @author YenHex + * @since 2022-10-09 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsSpecServiceImpl extends ServiceImpl implements GoodsSpecService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSpecValueServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSpecValueServiceImpl.java new file mode 100644 index 0000000..8e3a1a9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSpecValueServiceImpl.java @@ -0,0 +1,42 @@ +package com.qs.serve.modules.goods.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.entity.GoodsSpecValue; +import com.qs.serve.modules.goods.service.GoodsSpecValueService; +import com.qs.serve.modules.goods.mapper.GoodsSpecValueMapper; + +/** + * 规格值 服务实现类 + * @author YenHex + * @since 2022-10-09 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsSpecValueServiceImpl extends ServiceImpl implements GoodsSpecValueService { + + @Override + public GoodsSpecValue getBySpec(Long specId, String value) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsSpecValue::getSpecId,specId); + lqw.eq(GoodsSpecValue::getName,value); + return getOne(lqw,false); + } + + @Override + public GoodsSpecValue initSpecValue(Long specId, String value) { + GoodsSpecValue tasteValue = this.getBySpec(specId,value); + if(tasteValue==null){ + tasteValue = new GoodsSpecValue(); + tasteValue.setSpecId(specId); + tasteValue.setName(value); + this.save(tasteValue); + } + return tasteValue; + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSpuServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSpuServiceImpl.java new file mode 100644 index 0000000..3aa9ff4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSpuServiceImpl.java @@ -0,0 +1,487 @@ +package com.qs.serve.modules.goods.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.config.properties.ProjectApisProperties; +import com.qs.serve.common.model.dto.RowParam; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.entity.BmsFactory; +import com.qs.serve.modules.bms.service.BmsFactoryService; +import com.qs.serve.modules.goods.common.GoodsSpuColumnUtil; +import com.qs.serve.modules.goods.entity.*; +import com.qs.serve.modules.goods.entity.bo.GoodsSpuBatchTasteBo; +import com.qs.serve.modules.goods.entity.bo.GoodsSpuBo; +import com.qs.serve.modules.goods.entity.bo.GoodsSpuEditBo; +import com.qs.serve.modules.goods.entity.bo.GoodsSpuTasteBo; +import com.qs.serve.modules.goods.entity.dto.GoodSpuSkuNum; +import com.qs.serve.modules.goods.entity.vo.*; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.service.*; +import com.qs.serve.modules.oms.entity.dto.OmsSpuToSkuKey; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.mapper.GoodsSpuMapper; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * spu 服务实现类 + * @author YenHex + * @since 2022-10-09 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsSpuServiceImpl extends ServiceImpl implements GoodsSpuService { + + private GoodsUnitService goodsUnitService; + private GoodsSkuService goodsSkuService; + private GoodsSpuSpecService goodsSpuSpecService; + private GoodsSpecValueService goodsSpecValueService; + private GoodsSkuSpecValueService goodsSkuSpecValueService; + private GoodsCategoryService goodsCategoryService; + private BmsFactoryService bmsFactoryService; + private ProjectApisProperties projectApisProperties; + + + + @Override + public List selectSpuList(GoodsSpu goodsSpu) { + String orderType = PageUtil.getOrderType(); + // 标签功能查询有可能是POST请求 + if(orderType==null){ + orderType = goodsSpu.getOrderType(); + } + String orderProp = GoodsSpuColumnUtil.getSpuColumn(goodsSpu.getOrderProp()); + if(orderProp==null||orderType==null){ + goodsSpu.setOrderType(null); + goodsSpu.setOrderProp(null); + }else { + goodsSpu.setOrderType(orderType); + goodsSpu.setOrderProp(orderProp); + } + return baseMapper.selectSpuList(goodsSpu); + } + + @Override + public Long selectCountSkuJoinSpuList(GoodsSpu goodsSpu) { + return baseMapper.selectCountSkuJoinSpuList(goodsSpu); + } + + @Override + public List selectSkuJoinSpuList(GoodsSpu goodsSpu) { + return baseMapper.selectSkuJoinSpuList(goodsSpu,new RowParam(true)); + } + + @Override + public GoodsSpu getByCode(String code) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsSpu::getSpuCode,code); + return getOne(lqw,false); + } + + @Override + public List getByCodes(List codes) { + if(codes==null){ + codes = new ArrayList<>(); + } + if(CollectionUtil.isEmpty(codes)){ + codes.add("-1"); + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(GoodsSpu::getSpuCode,codes); + return list(lqw); + } + + @Override + public GoodsSpu getByName(String name) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsSpu::getName,name); + return getOne(lqw,true); + } + + @Override + public GoodsSpuVo getVoById(Long id,String supplierCode) { + GoodsSpu goodsSpu = this.getById(id); + GoodsSpuVo goodsSpuVo = CopierUtil.copy(goodsSpu,new GoodsSpuVo()); + List skuList = goodsSkuService.getBySpuId(id); + if(StringUtils.hasText(supplierCode)){ + goodsSkuService.initSkuCusPrice(supplierCode,skuList); + } + goodsSpuVo.setSkuList(skuList); + List skuSpecValueList = goodsSkuSpecValueService.listSpecValueBySpuId(id); + goodsSpuVo.setSkuSpecValueList(skuSpecValueList); + List specList = goodsSpuSpecService.listSpuSpecs(id); + //封装规格的值 + for (GoodsSpuSpecVo specVo : specList) { + for (GoodsSkuSpecValueVo skuSpecValueVo : skuSpecValueList) { + if(specVo.getSpecId().equals(skuSpecValueVo.getSpecId())){ + if(specVo.getSpecValueList()==null){ + specVo.setSpecValueList(new ArrayList<>()); + } + boolean exist = false; + for (GoodsSpecValueVo valueVo : specVo.getSpecValueList()) { + if(valueVo.getSpecValueId().equals(skuSpecValueVo.getSpecValueId())){ + exist = true; + break; + } + } + if(!exist){ + GoodsSpecValueVo valueVo = new GoodsSpecValueVo(); + valueVo.setSpecValue(skuSpecValueVo.getSpecValue()); + valueVo.setSpecValueId(skuSpecValueVo.getSpecValueId()); + specVo.getSpecValueList().add(valueVo); + } + } + } + } + goodsSpuVo.setSpecList(specList); + List categoryIds = new ArrayList<>(); + categoryIds.add(goodsSpuVo.getCategoryFirst()); + categoryIds.add(goodsSpuVo.getCategorySecond()); + categoryIds.add(goodsSpuVo.getCategoryThird()); + List categories = goodsCategoryService.listByIds(categoryIds); + for (GoodsCategory category : categories) { + if(goodsSpuVo.getCategoryFirst().equals(category.getId().toString())){ + goodsSpuVo.setCateFirstLabel(category.getName()); + continue; + } + if(goodsSpuVo.getCategorySecond().equals(category.getId().toString())){ + goodsSpuVo.setCateSecondLabel(category.getName()); + continue; + } + if(goodsSpuVo.getCategoryThird().equals(category.getId().toString())){ + goodsSpuVo.setCateThirdLabel(category.getName()); + } + } + return goodsSpuVo; + } + + @Override + public void edit(GoodsSpuEditBo spuEditBo) { + GoodsSpu spu = this.getByCode(spuEditBo.getSpuCode()); + Long spuId = spu.getId(); + spu = CopierUtil.copy(spuEditBo,new GoodsSpu()); + spu.setId(spuId); + //设置分类 + GoodsCategory category = goodsCategoryService.getById(spuEditBo.getCategoryId()); + relateCate(spu,category); + this.saveOrUpdate(spu); + if(spuId==null){ + //保存spu与规格关联 + insertSpuSpec(spu.getId()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public GoodsSpu editTasteSpu(GoodsSpuBo param) { + GoodsSpu spu = CopierUtil.copy(param,new GoodsSpu()); + 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; + } + + @Override + public List saveBatchTasteSpu(GoodsSpuBatchTasteBo batchTasteBo) { + List resultList = new ArrayList<>(); + for (GoodsSpuTasteBo tasteProduct : batchTasteBo.getTasteProducts()) { + GoodSkuBatchResult skuBatchResult = this.editTasteBo(tasteProduct); + resultList.add(skuBatchResult); + } + return resultList; + } + + /** + * 编辑美食商品 + * @param tasteProduct + * @return + */ + @Override + public GoodSkuBatchResult editTasteBo(GoodsSpuTasteBo tasteProduct){ + GoodSkuBatchResult skuBatchResult = new GoodSkuBatchResult(); + skuBatchResult.setInvCode(tasteProduct.getInvCode()); + skuBatchResult.setProductCode(tasteProduct.getProductCode()); + skuBatchResult.setName(tasteProduct.getName()); + skuBatchResult.setErrorCode(0); + skuBatchResult.setMessage("成功"); + GoodsSpu spu = this.getByCode(tasteProduct.getProductCode()); + if(spu==null){ + spu = new GoodsSpu(); + } + spu.setName(tasteProduct.getName()); + spu.setSpuCode(tasteProduct.getProductCode()); + spu.setPicUrls(tasteProduct.getPicUrls()); + //设置分类 + try { + GoodsCategory category = goodsCategoryService.getByCode(tasteProduct.getCategoryCode()); + relateCate(spu,category); + } catch (Exception e) { + skuBatchResult.setMessage("设置分类失败"); + skuBatchResult.setErrorCode(1); + return skuBatchResult; + } + spu.setTasteValue(tasteProduct.getProductTasteValue()); + if(spu.getId()==null){ + this.save(spu); + //保存spu与规格关联 + insertSpuSpec(spu.getId()); + }else { + this.updateById(spu); + } + //保存SKU + GoodsSku goodsSku = goodsSkuService.getByCode(tasteProduct.getInvCode()); + if(goodsSku==null){ + goodsSku = CopierUtil.copy(tasteProduct,new GoodsSku()); + } + if(!goodsSku.getSpuId().equals(spu.getId())){ + log.error("新增sku失败:sku编码'{}'已保存到商品编码'{}'",goodsSku.getSkuCode(),spu.getSpuCode()); + skuBatchResult.setMessage("存货编码'"+goodsSku.getSkuCode()+"'已保存到产品编码'"+spu.getSpuCode()+"'"); + skuBatchResult.setErrorCode(1); + return skuBatchResult; + } + try { + BmsFactory bmsFactory = bmsFactoryService.getByCode(tasteProduct.getFactoryCode()); + goodsSku.setSkuCode(tasteProduct.getInvCode()); + goodsSku.setSpuId(spu.getId()); + goodsSku.setPicUrl(tasteProduct.getInvPicUrl()); + goodsSku.setSpecInfos(tasteProduct.getTasteValue()+";"+tasteProduct.getPackValue()+";"+bmsFactory.getName()); + //设置sku单位 + if(StringUtils.hasText(tasteProduct.getUnit())){ + GoodsUnit goodsUnit = goodsUnitService.getByName(tasteProduct.getUnit()); + if(goodsUnit==null){ + goodsUnit = new GoodsUnit(); + goodsUnit.setName(tasteProduct.getUnit()); + goodsUnitService.save(goodsUnit); + } + goodsSku.setEnable(1); + goodsSku.setUnitId(goodsUnit.getId()); + goodsSku.setUnitName(goodsUnit.getName()); + } + if(goodsSku.getId()==null){ + goodsSkuService.save(goodsSku); + }else { + goodsSkuService.updateById(goodsSku); + } + //保存规格值 + GoodsSpecValue tasteValue = goodsSpecValueService.initSpecValue(1L,tasteProduct.getTasteValue()); + GoodsSpecValue packValue = goodsSpecValueService.initSpecValue(2L,tasteProduct.getPackValue()); + GoodsSpecValue factoryValue = goodsSpecValueService.initSpecValue(3L,bmsFactory.getName()); + //保存sku与规格值关联 + goodsSkuSpecValueService.initSkuSpecValue(spu.getId(), goodsSku.getId(),tasteValue.getId()); + goodsSkuSpecValueService.initSkuSpecValue(spu.getId(), goodsSku.getId(),packValue.getId()); + goodsSkuSpecValueService.initSkuSpecValue(spu.getId(), goodsSku.getId(),factoryValue.getId()); + } catch (Exception e) { + log.error("新增sku失败",e); + skuBatchResult.setMessage("保存失败"); + skuBatchResult.setErrorCode(1); + return skuBatchResult; + } + return skuBatchResult; + } + + + @Override + public List selectListBySpuCodes(List spuCodes) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(GoodsSpu::getSpuCode,spuCodes); + return list(lqw); + } + + + @Override + public void updateSkuNumByLastChange() { + List spuIds = baseMapper.selectLastChangeSpuId(); + this.updateSkuNumString(spuIds); + } + + @Override + public void updateOnlineOfflineFlat(Long spuId) { + if(spuId==null||spuId.equals(0L)){ + return; + } + GoodsSkuMapper skuMapper = (GoodsSkuMapper) goodsSkuService.getBaseMapper(); + GoodsSpu spu = new GoodsSpu(); + spu.setId(spuId); + spu.setOrderOnlineFlag(skuMapper.countSkuByOrderOnlineFla(spuId)>0?1:0); + spu.setOrderOfflineFlag(skuMapper.countSkuByOrderOfflineFla(spuId)>0?1:0); + this.updateById(spu); + } + + @Override + public void initSkuNum() { + AuthContextUtils.setTenant("001"); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(GoodsSpu::getId); + List goodsSpus = this.baseMapper.selectList(lqw); + List spuIds = goodsSpus.stream().map(GoodsSpu::getId).collect(Collectors.toList()); + updateSkuNumString(spuIds); + } + + @Override + public boolean updateSkuNumString(List spuIds) { + if(spuIds.size()<1){ + return false; + } + List updateList = new ArrayList<>(); + for (Long spuId : spuIds) { + String skuNum = this.getSkuNumString(spuId); + GoodsSpu spu = new GoodsSpu(); + spu.setId(spuId); + spu.setSkuNumVal(skuNum); + updateList.add(spu); + } + this.updateBatchById(updateList); + return true; + } + + @Override + public String getSkuNumString(Long spuId) { + /** + * 在SKU这里做一个统计,每个SKU显示一个字段:1/1/19 表示1个允许下单,1个特殊品,19个未启用 + */ + GoodSpuSkuNum goodSpuSkuNum = baseMapper.getSpuSkuNumInfo(spuId); + if(goodSpuSkuNum==null){ + return "0/0/0"; + } + if(goodSpuSkuNum.getCountOrder()==null){ + goodSpuSkuNum.setCountOrder(0L); + } + if(goodSpuSkuNum.getCountSpec()==null){ + goodSpuSkuNum.setCountSpec(0L); + } + if(goodSpuSkuNum.getCountSku()==null){ + goodSpuSkuNum.setCountSku(0L); + } + return goodSpuSkuNum.getCountOrder()+"/"+goodSpuSkuNum.getCountSpec()+"/"+goodSpuSkuNum.getCountSku(); + } + + /** + * 根据账套,获取spu对应的sku + * @param placeName 账套 + * @param spuCodes 嘉士利的SKU-CODE + * @return 嘉士利的invCode + */ + @Override + public List getSpuToSkuInfo(String placeName, List spuCodes){ + + //取消调用远程接口 +// Map params = new HashMap<>(); +// params.put("book",book); +// params.put("skuCode",skuCodes); +// String apiUrl = projectApisProperties.getSpuToSku(); +// String response = HttpUtil.doPost(apiUrl, JsonUtil.objectToJson(params),null); +// return JsonUtil.jsonToList(response,OmsSpuToSkuKey.class); + + if(spuCodes.size()<1){ + return new ArrayList<>(); + } + placeName = placeName.replace("产",""); + List spuList = this.selectListBySpuCodes(spuCodes); + + if(spuList==null||spuList.size()<1){ + return new ArrayList<>(); + } + + List spuIds = spuList.stream().map(GoodsSpu::getId).collect(Collectors.toList()); + + LambdaQueryWrapper skuLqw = new LambdaQueryWrapper<>(); + skuLqw.eq(GoodsSku::getBelong,placeName); + skuLqw.eq(GoodsSku::getOrderFlag,1); + skuLqw.in(GoodsSku::getSpuId,spuIds); + List goodsSkus = goodsSkuService.list(skuLqw); + + List skuKeys = new ArrayList<>(); + for (GoodsSku sku : goodsSkus) { + GoodsSpu currSpu = null; + for (GoodsSpu goodsSpu : spuList) { + if(sku.getSpuId().equals(goodsSpu.getId())){ + currSpu = goodsSpu; + break; + } + } + OmsSpuToSkuKey skuKey = new OmsSpuToSkuKey(); + skuKey.setSkuCode(currSpu.getSpuCode()); + skuKey.setInvCode(sku.getSkuCode()); + skuKey.setWeight(sku.getWeight().toString()); + skuKey.setVolume(sku.getVolume().toString()); + skuKeys.add(skuKey); + } + return skuKeys; + } + + /** + * 关联上下级 + * @param spu + * @param category + */ + private void relateCate(GoodsSpu spu,GoodsCategory category){ + spu.setCategoryLast(category.getId()+""); + if(!category.getParentId().toString().equals("0")){ + GoodsCategory categorySecond = goodsCategoryService.getById(category.getParentId()); + if(!categorySecond.getParentId().toString().equals("0")){ + spu.setCategoryFirst(categorySecond.getParentId()+""); + spu.setCategorySecond(categorySecond.getId()+""); + spu.setCategoryThird(category.getId()+""); + }else { + spu.setCategoryFirst(categorySecond.getId()+""); + spu.setCategorySecond(category.getId()+""); + } + }else { + spu.setCategoryFirst(category.getId()+""); + spu.setCategorySecond(""); + spu.setCategoryThird(""); + } + spu.setBookBelong(category.getBookBelong()); + spu.setBookName(category.getBookName()); + } + + /** + * 初始化商品规格关联 + * @param spuId + */ + private void insertSpuSpec(Long spuId){ + List spuSpecList = new ArrayList<>(); + GoodsSpuSpec spuSpec = new GoodsSpuSpec(); + spuSpec.setSpuId(spuId); + spuSpec.setSpecId(1L); + spuSpec.setSort(2); + spuSpecList.add(spuSpec); + GoodsSpuSpec spuSpec2 = new GoodsSpuSpec(); + spuSpec2.setSpuId(spuId); + spuSpec2.setSpecId(2L); + spuSpec2.setSort(1); + spuSpecList.add(spuSpec2); + GoodsSpuSpec spuSpec3 = new GoodsSpuSpec(); + spuSpec3.setSpuId(spuId); + spuSpec3.setSpecId(3L); + spuSpec3.setSort(1); + spuSpecList.add(spuSpec3); + goodsSpuSpecService.saveOrUpdateBatch(spuSpecList); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSpuSpecServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSpuSpecServiceImpl.java new file mode 100644 index 0000000..9408eba --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsSpuSpecServiceImpl.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.goods.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.goods.entity.vo.GoodsSpuSpecVo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.entity.GoodsSpuSpec; +import com.qs.serve.modules.goods.service.GoodsSpuSpecService; +import com.qs.serve.modules.goods.mapper.GoodsSpuSpecMapper; + +import java.util.List; + +/** + * spu规格 服务实现类 + * @author YenHex + * @since 2022-10-09 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsSpuSpecServiceImpl extends ServiceImpl implements GoodsSpuSpecService { + + @Override + public List listSpuSpecs(Long spuId) { + return baseMapper.listSpuSpecs(spuId); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsUnitServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsUnitServiceImpl.java new file mode 100644 index 0000000..f50d2c6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/goods/service/impl/GoodsUnitServiceImpl.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.goods.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.goods.entity.GoodsUnit; +import com.qs.serve.modules.goods.service.GoodsUnitService; +import com.qs.serve.modules.goods.mapper.GoodsUnitMapper; + +/** + * 单位 服务实现类 + * @author YenHex + * @since 2022-10-13 + */ +@Slf4j +@Service +@AllArgsConstructor +public class GoodsUnitServiceImpl extends ServiceImpl implements GoodsUnitService { + + @Override + public GoodsUnit getByName(String name) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(GoodsUnit::getName,name); + return getOne(lqw,false); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/controller/HistFixController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/controller/HistFixController.java new file mode 100644 index 0000000..c8d6309 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/controller/HistFixController.java @@ -0,0 +1,40 @@ +package com.qs.serve.modules.his.controller; + +import com.qs.serve.common.config.DevEnvironmentConfig; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.consts.RedisCacheKeys; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.his.service.HisUserChannelPointService; +import com.qs.serve.modules.his.service.HisUserSupplierService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author YenHex + * @since 2023/4/17 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("his/fix") +public class HistFixController { + + HisUserSupplierService hisUserSupplierService; + SysUserService sysUserService; + + @GetMapping("/user/{userCode}") + public R initSupplier(@PathVariable String userCode){ + SysUser sysUser = sysUserService.getByAccount(userCode); + hisUserSupplierService.initByUserId(sysUser.getId(),true,true); + return R.ok(); + } + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/entity/HisUserChannelPoint.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/entity/HisUserChannelPoint.java new file mode 100644 index 0000000..21cb877 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/entity/HisUserChannelPoint.java @@ -0,0 +1,112 @@ +package com.qs.serve.modules.his.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; +import java.util.List; +/** + * 渠道站点 实体类 + * @author YenHex + * @since 2023-04-12 + */ +@Data +@TableName("his_user_channel_point") +public class HisUserChannelPoint implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 用户id */ + @Length(max = 64,message = "用户id长度不能超过64字") + private String userId; + + /** 网点ID */ + private Long pointId; + + /** 来源类型:0->网点负责人;1->行政区域;2->销售区域;3->渠道负责人 */ + @NotNull(message = "来源类型不能为空") + private Integer sourceType; + + /** 来源id路径 */ + @Length(max = 255,message = "来源id路径长度不能超过255字") + private String sourceIds; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 可投放费用 */ + @NotNull(message = "可投放费用不能为空") + private Integer costFlag; + + @TableField(exist = false) + private List sourceIdsList; + + @TableField(exist = false) + private List userIdList; + + public static HisUserChannelPoint toNewObject(HisUserChannelPoint source){ + HisUserChannelPoint userChannelPoint = new HisUserChannelPoint(); + userChannelPoint.setId(source.getId()); + userChannelPoint.setUserId(source.getUserId()); + userChannelPoint.setPointId(source.getPointId()); + userChannelPoint.setSourceType(source.getSourceType()); + userChannelPoint.setSourceIds(source.getSourceIds()); + userChannelPoint.setRemark(source.getRemark()); + userChannelPoint.setCreateTime(source.getCreateTime()); + userChannelPoint.setUpdateTime(source.getUpdateTime()); + userChannelPoint.setTenantId(source.getTenantId()); + userChannelPoint.setDelFlag(source.getDelFlag()); + userChannelPoint.setCreateBy(source.getCreateBy()); + userChannelPoint.setUpdateBy(source.getUpdateBy()); + userChannelPoint.setCostFlag(source.getCostFlag()); + return userChannelPoint; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/entity/HisUserSupplier.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/entity/HisUserSupplier.java new file mode 100644 index 0000000..ea6020e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/entity/HisUserSupplier.java @@ -0,0 +1,190 @@ +package com.qs.serve.modules.his.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 com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.tag.entity.so.TagQuery; +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; +import java.util.List; + +/** + * 供应商负责人 实体类 + * @author YenHex + * @since 2022-11-21 + */ +@Data +@TableName("his_user_supplier") +public class HisUserSupplier implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 用户id */ + @NotBlank(message = "用户id不能为空") + @Length(max = 32,message = "用户id长度不能超过32字") + private String userId; + + /** 供应商id */ + @NotNull(message = "供应商id不能为空") + private Long supplierId; + + /** 供应商名称 */ + @Length(max = 50,message = "供应商名称长度不能超过50字") + @TableField(condition = SqlCondition.LIKE) + private String supplierName; + + /** 供应商编码 */ + @Length(max = 30,message = "供应商编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String supplierCode; + + /** 类型:0=销售区域;1=行政区域;2-供应商负责人;9-无相关数据 */ + private Integer type; + + /** 区域id */ + @Length(max = 32,message = "区域id长度不能超过32字") + private String regionId; + + /** 销售区域1 */ + @Length(max = 32,message = "销售区域1长度不能超过32字") + private String saleRegionFirst; + + /** 销售区域2 */ + @Length(max = 32,message = "销售区域2长度不能超过32字") + private String saleRegionSecond; + + /** 销售区域3 */ + @Length(max = 32,message = "销售区域3长度不能超过32字") + private String saleRegionThird; + + /** 销售区域4 */ + @Length(max = 32,message = "销售区域4长度不能超过32字") + private String saleRegionFourthly; + + /** 主要负责人 */ + @NotNull(message = "主要负责人不能为空") + private Integer masterFlag; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 行政区域1 */ + @Length(max = 32,message = "行政区域1长度不能超过32字") + private String bizRegionFirst; + + /** 行政区域2 */ + @Length(max = 32,message = "行政区域2长度不能超过32字") + private String bizRegionSecond; + + /** 行政区域3 */ + @Length(max = 32,message = "行政区域3长度不能超过32字") + private String bizRegionThird; + + /** 行政区域4 */ + @Length(max = 32,message = "行政区域4长度不能超过32字") + private String bizRegionFourthly; + + private String tenantId; + + private Integer costFlag; + + /** 是否供应商 */ + private Integer supplierFlag; + + + /** 闭户 */ + private Integer stopFlag; + + /** 闭户日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime stopFlagDate; + + /** 暂不合作 */ + private Integer cooperatePauseFlag; + + /** 暂不合作日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @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; + + @TableField(exist = false) + private String queryValue; + + @TableField(exist = false) + private List selectUserIds; + + /** + * 对应是supplierFlag + */ + @TableField(exist = false) + private List selectSupplierTypes; + + @TableField(exist = false) + private String addressId; + + @TableField(exist = false) + private String addressDetail; + + @TableField(exist = false) + Double localY; + + @TableField(exist = false) + Double localX; + + /** 标签查询 */ + @TableField(exist = false) + List tagQueryList; + + public BmsSupplier toSupplier(){ + BmsSupplier bmsSupplier = new BmsSupplier(); + bmsSupplier.setId(this.getSupplierId()+""); + bmsSupplier.setName(this.getSupplierName()); + bmsSupplier.setCode(this.getSupplierCode()); + bmsSupplier.setRegionFirst(this.getSaleRegionFirst()); + bmsSupplier.setRegionSecond(this.getSaleRegionSecond()); + bmsSupplier.setRegionThird(this.getSaleRegionThird()); + bmsSupplier.setRegionFourthly(this.getSaleRegionFourthly()); + bmsSupplier.setRegion2First(this.getBizRegionFirst()); + bmsSupplier.setRegion2Second(this.getBizRegionSecond()); + bmsSupplier.setRegion2Third(this.getBizRegionThird()); + bmsSupplier.setRegionFourthly(this.getBizRegionFourthly()); + bmsSupplier.setCostFlag(this.costFlag); + return bmsSupplier; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/entity/HisUserSupplierTemp.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/entity/HisUserSupplierTemp.java new file mode 100644 index 0000000..ed44f21 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/entity/HisUserSupplierTemp.java @@ -0,0 +1,147 @@ +package com.qs.serve.modules.his.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 2023-05-31 + */ +@Data +@TableName("his_user_supplier_temp") +public class HisUserSupplierTemp implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 用户id */ + @NotBlank(message = "用户id不能为空") + @Length(max = 32,message = "用户id长度不能超过32字") + private String userId; + + /** 供应商id */ + @NotNull(message = "供应商id不能为空") + private Long supplierId; + + /** 供应商名称 */ + @Length(max = 50,message = "供应商名称长度不能超过50字") + private String supplierName; + + /** 供应商编码 */ + @Length(max = 30,message = "供应商编码长度不能超过30字") + private String supplierCode; + + /** 类型:0=销售区域;1=行政区域;2-供应商负责人;9-无相关数据 */ + private Integer type; + + /** 区域id */ + @Length(max = 32,message = "区域id长度不能超过32字") + private String regionId; + + /** 销售区域1 */ + @Length(max = 32,message = "销售区域1长度不能超过32字") + private String saleRegionFirst; + + /** 销售区域2 */ + @Length(max = 32,message = "销售区域2长度不能超过32字") + private String saleRegionSecond; + + /** 销售区域3 */ + @Length(max = 32,message = "销售区域3长度不能超过32字") + private String saleRegionThird; + + /** 销售区域4 */ + @Length(max = 32,message = "销售区域4长度不能超过32字") + private String saleRegionFourthly; + + /** 主要负责人 */ + @NotNull(message = "主要负责人不能为空") + private Integer masterFlag; + + /** 是否供应商 */ + private Integer supplierFlag; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 行政区域1 */ + @Length(max = 32,message = "行政区域1长度不能超过32字") + private String bizRegionFirst; + + /** 行政区域2 */ + @Length(max = 32,message = "行政区域2长度不能超过32字") + private String bizRegionSecond; + + /** 行政区域3 */ + @Length(max = 32,message = "行政区域3长度不能超过32字") + private String bizRegionThird; + + /** 行政区域4 */ + @Length(max = 32,message = "行政区域4长度不能超过32字") + private String bizRegionFourthly; + + /** */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** */ + private Integer costFlag; + + /** 闭户 */ + 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") + private LocalDateTime stopFlagDate; + + /** 暂不合作 */ + private Integer cooperatePauseFlag; + + /** 暂不合作日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime cooperatePauseFlagDate; + + /** 在线下单 */ + private Integer orderOnlineFlag; + + /** 线下下单 */ + private Integer orderOfflineFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/entity/dto/HisUserSupplierAddressVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/entity/dto/HisUserSupplierAddressVo.java new file mode 100644 index 0000000..77f81c5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/entity/dto/HisUserSupplierAddressVo.java @@ -0,0 +1,32 @@ +package com.qs.serve.modules.his.entity.dto; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * @author YenHex + * @since 2023/3/29 + */ +@Data +public class HisUserSupplierAddressVo { + + + /** 供应商id */ + String supplierId; + /** 地址id*/ + String addressId; + /** 距离 */ + Double distance; + + /** 供应商编码*/ + String supplierCode; + /** 供应商*/ + String supplierName; + + /** 地址相关 */ + Object addressInfo; + + /** 访问相关 */ + Object visitInfo; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/mapper/HisUserChannelPointMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/mapper/HisUserChannelPointMapper.java new file mode 100644 index 0000000..0219e89 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/mapper/HisUserChannelPointMapper.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.his.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.his.entity.HisUserChannelPoint; +import org.apache.ibatis.annotations.Param; +import java.util.List; +/** + * 渠道站点 Mapper + * @author YenHex + * @date 2023-04-12 + */ +public interface HisUserChannelPointMapper extends BaseMapper { + + List selectHisUserChannelPointList(@Param("query")HisUserChannelPoint query); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/mapper/HisUserSupplierMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/mapper/HisUserSupplierMapper.java new file mode 100644 index 0000000..aae64a9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/mapper/HisUserSupplierMapper.java @@ -0,0 +1,24 @@ +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; +import org.apache.ibatis.annotations.Param; +import java.util.List; +/** + * 供应商负责人 Mapper + * @author YenHex + * @date 2022-11-15 + */ +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/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/mapper/HisUserSupplierTempMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/mapper/HisUserSupplierTempMapper.java new file mode 100644 index 0000000..6317ba6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/mapper/HisUserSupplierTempMapper.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.his.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.his.entity.HisUserSupplierTemp; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Select; + +/** + * 供应商负责人 Mapper + * @author YenHex + * @date 2023-05-31 + */ +public interface HisUserSupplierTempMapper extends BaseMapper { + + @InterceptorIgnore(tenantLine = "1") + @Delete("TRUNCATE table `his_user_supplier`") + int dropTable(); + + @InterceptorIgnore(tenantLine = "1") + @Insert("INSERT INTO his_user_supplier SELECT * FROM his_user_supplier_temp") + int selectIntoHis(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/service/HisUserChannelPointService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/service/HisUserChannelPointService.java new file mode 100644 index 0000000..d510c23 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/service/HisUserChannelPointService.java @@ -0,0 +1,83 @@ +package com.qs.serve.modules.his.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.his.entity.HisUserChannelPoint; +import java.util.List; + +/** + * 渠道站点 服务接口 + * @author YenHex + * @date 2023-04-12 + */ +public interface HisUserChannelPointService extends IService { + + /** + * 渠道id + * @param channelId + */ + void removeByChannelId(Long channelId); + + /** + * 渠道id + * @param channelId + */ + void flushByChannelId(Long channelId); + + /** + * 删除 + * @param pointId + */ + void removeByPointId(Long pointId); + + /** + * 初始化网点 + * @param pointId + * @param saleRegionIds + * @param bizRegionIds + */ + void flushPoint(Long pointId ,String saleRegionIds,String bizRegionIds); + + /** + * 删除用户区域 + * @param userId + * @param saleRegionIds + * @param bizRegionIds + */ + void removeUserRegion(String userId,String saleRegionIds,String bizRegionIds); + + /** + * 批量刷新 + * @param userIds + * @param pointIds + * @param sourceType + * @param regionIds + */ + void flushBatchUserRegion(List userIds,List pointIds,Integer sourceType,String regionIds); + + /** + * 删除区域相关 + * @param sourceType + * @param regionIds + */ + void removeRegion(Integer sourceType,String regionIds); + + /** + * 更新区域信息 + * @param sourceType + * @param regionIds + */ + void flushRegion(Integer sourceType,String regionIds); + + /** + * 初始化 + */ + void initSetup(); + + /** + * 初始化 + * @param pointId + */ + void initSetupByPointId(Long pointId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/service/HisUserSupplierService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/service/HisUserSupplierService.java new file mode 100644 index 0000000..5990fcb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/service/HisUserSupplierService.java @@ -0,0 +1,49 @@ +package com.qs.serve.modules.his.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.his.entity.HisUserSupplier; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; +import java.util.Set; + +/** + * 供应商负责人 服务接口 + * @author YenHex + * @date 2022-11-15 + */ +public interface HisUserSupplierService extends IService { + + List selectHisSupplier(BmsSupplier param,boolean usePage); + + List selectListSupplier(BmsSupplier param); + + PageVo selectPageSupplier(BmsSupplier param); + + + boolean initByUserId(String userId,boolean hasCheck,boolean nextChilds); + + /** + * 初始化 + * @param userId + * @return + */ + boolean initByUserId(String userId,boolean hasCheck,List existUserIds); + + boolean checkInit(String userId); + + + + /** + * 更新标识(取消删除操作) + * @return + */ + void cleanTable(); + + Set listSupplierIdByUserIds(Collection userIds); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/service/HisUserSupplierTempService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/service/HisUserSupplierTempService.java new file mode 100644 index 0000000..92a002e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/service/HisUserSupplierTempService.java @@ -0,0 +1,21 @@ +package com.qs.serve.modules.his.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.his.entity.HisUserSupplierTemp; + +/** + * 供应商负责人 服务接口 + * @author YenHex + * @date 2023-05-31 + */ +public interface HisUserSupplierTempService extends IService { + + /** + * 重新创建表数据 + */ + void reloadHis(); + + void selectInfoHis(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/service/impl/HisUserChannelPointServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/service/impl/HisUserChannelPointServiceImpl.java new file mode 100644 index 0000000..148e70b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/service/impl/HisUserChannelPointServiceImpl.java @@ -0,0 +1,334 @@ +package com.qs.serve.modules.his.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.common.MasterUserType; +import com.qs.serve.modules.bms.entity.*; +import com.qs.serve.modules.bms.mapper.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.his.entity.HisUserChannelPoint; +import com.qs.serve.modules.his.service.HisUserChannelPointService; +import com.qs.serve.modules.his.mapper.HisUserChannelPointMapper; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 渠道站点 服务实现类 + * @author YenHex + * @since 2023-04-12 + */ +@Slf4j +@Service +@AllArgsConstructor +public class HisUserChannelPointServiceImpl extends ServiceImpl implements HisUserChannelPointService { + + private final BmsRegionUserMapper regionUserMapper; + private final BmsMasterUserMapper masterUserMapper; + + private final BmsChannelPointMapper channelPointMapper; + + private final BmsRegionMapper regionMapper; + private final BmsRegion2Mapper region2Mapper; + + @Override + public void removeByChannelId(Long channelId) { + if(1==1){ + log.debug("停用的逻辑"); + return; + } + LambdaQueryWrapper lqwPoint = new LambdaQueryWrapper<>(); + lqwPoint.eq(HisUserChannelPoint::getSourceType,3); + lqwPoint.eq(HisUserChannelPoint::getSourceIds,channelId); + this.remove(lqwPoint); + } + + @Override + public void flushByChannelId(Long channelId) { + if(1==1){ + log.debug("停用的逻辑"); + return; + } + this.removeByChannelId(channelId); + LambdaQueryWrapper mgrLqw = new LambdaQueryWrapper<>(); + mgrLqw.eq(BmsMasterUser::getType, MasterUserType.Channel); + mgrLqw.eq(BmsMasterUser::getTargetId,channelId); + List masterUsers = masterUserMapper.selectList(mgrLqw); + if(masterUsers.size()>0){ + LambdaQueryWrapper pointLqw = new LambdaQueryWrapper<>(); + pointLqw.eq(BmsChannelPoint::getChannelId,channelId); + pointLqw.select(BmsChannelPoint::getId); + List channelPointList = channelPointMapper.selectList(pointLqw); + List saveList = new ArrayList<>(); + for (BmsChannelPoint channelPoint : channelPointList) { + for (BmsMasterUser masterUser : masterUsers) { + HisUserChannelPoint userChannelPoint = new HisUserChannelPoint(); + userChannelPoint.setUserId(masterUser.getUserId()); + userChannelPoint.setPointId(channelPoint.getId()); + userChannelPoint.setSourceIds(channelPoint.getId()+""); + userChannelPoint.setSourceType(3); + saveList.add(userChannelPoint); + } + } + if(CollectionUtil.isNotEmpty(saveList)){ + this.saveBatch(saveList); + } + } + } + + @Override + public void removeByPointId(Long pointId) { + if(1==1){ + log.debug("停用的逻辑"); + return; + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(HisUserChannelPoint::getPointId,pointId); + this.remove(lqw); + } + + @Override + public void flushPoint(Long pointId, String saleRegionIds, String bizRegionIds) { + if(1==1){ + log.debug("停用的逻辑"); + return; + } + this.removeByPointId(pointId); + List channelPointList = new ArrayList<>(); + if(StringUtils.hasText(saleRegionIds)){ + List userIds = this.getUserIdByRegionIds(saleRegionIds,true); + for (String userId : userIds) { + HisUserChannelPoint userChannelPoint = new HisUserChannelPoint(); + userChannelPoint.setUserId(userId); + userChannelPoint.setPointId(pointId); + userChannelPoint.setSourceType(2); + userChannelPoint.setSourceIds(saleRegionIds); + channelPointList.add(userChannelPoint); + } + } + if(StringUtils.hasText(bizRegionIds)){ + List userIds = this.getUserIdByRegionIds(bizRegionIds,false); + for (String userId : userIds) { + HisUserChannelPoint userChannelPoint = new HisUserChannelPoint(); + userChannelPoint.setUserId(userId); + userChannelPoint.setPointId(pointId); + userChannelPoint.setSourceType(1); + userChannelPoint.setSourceIds(bizRegionIds); + channelPointList.add(userChannelPoint); + } + } + LambdaQueryWrapper masterUserLqw = new LambdaQueryWrapper<>(); + masterUserLqw.eq(BmsMasterUser::getType, MasterUserType.Point); + masterUserLqw.eq(BmsMasterUser::getTargetId,pointId); + masterUserLqw.select(BmsMasterUser::getUserId); + List masterUsers = masterUserMapper.selectList(masterUserLqw); + List userIds = masterUsers.stream().map(BmsMasterUser::getUserId).distinct().collect(Collectors.toList()); + for (String userId : userIds) { + HisUserChannelPoint userChannelPoint = new HisUserChannelPoint(); + userChannelPoint.setUserId(userId); + userChannelPoint.setPointId(pointId); + userChannelPoint.setSourceType(0); + channelPointList.add(userChannelPoint); + } + if(CollectionUtil.isNotEmpty(channelPointList)){ + this.saveBatch(channelPointList); + } + + } + + @Override + public void removeUserRegion(String userId, String saleRegionIds, String bizRegionIds) { + if(1==1){ + log.debug("停用的逻辑"); + return; + } + if(StringUtils.hasText(saleRegionIds)){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(HisUserChannelPoint::getUserId,userId); + lqw.eq(HisUserChannelPoint::getSourceIds,saleRegionIds); + lqw.eq(HisUserChannelPoint::getSourceType,2); + this.remove(lqw); + } + if(StringUtils.hasText(bizRegionIds)){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(HisUserChannelPoint::getUserId,userId); + lqw.eq(HisUserChannelPoint::getSourceIds,bizRegionIds); + lqw.eq(HisUserChannelPoint::getSourceType,1); + this.remove(lqw); + } + } + + @Override + public void flushBatchUserRegion(List userIds, List pointIds, Integer sourceType, String regionIds) { + this.flushRegion(sourceType,regionIds,userIds,pointIds,true); + } + + @Override + public void removeRegion(Integer sourceType, String regionIds) { + if(1==1){ + log.debug("停用的逻辑"); + return; + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.likeRight(HisUserChannelPoint::getSourceIds,regionIds); + lqw.eq(HisUserChannelPoint::getSourceType,sourceType); + this.remove(lqw); + } + + @Override + public void flushRegion(Integer sourceType, String regionIds) { + if(1==1){ + log.debug("停用的逻辑"); + return; + } + this.removeRegion(sourceType,regionIds); + List userIds = this.getUserIdByRegionIds(regionIds,sourceType.equals(2)); + List pointIds = this.getPointIdsByRegionIds(regionIds,sourceType.equals(2)); + this.flushRegion(sourceType, regionIds, userIds, pointIds,false); + } + + @Override + public void initSetup() { + if(1==1){ + log.debug("停用的逻辑"); + return; + } + //1.先删除表数据 + //2.直属管理人 + LambdaQueryWrapper masterUserLqw = new LambdaQueryWrapper<>(); + masterUserLqw.eq(BmsMasterUser::getType, MasterUserType.Point); + List masterUsers = masterUserMapper.selectList(masterUserLqw); + List channelPointList = new ArrayList<>(); + for (BmsMasterUser masterUser : masterUsers) { + HisUserChannelPoint userChannelPoint = new HisUserChannelPoint(); + userChannelPoint.setUserId(masterUser.getUserId()); + userChannelPoint.setPointId(Long.parseLong(masterUser.getTargetId())); + userChannelPoint.setSourceType(0); + channelPointList.add(userChannelPoint); + } + this.saveBatch(channelPointList); + //3.渠道负责人 + LambdaQueryWrapper masterUserLqw2 = new LambdaQueryWrapper<>(); + masterUserLqw2.eq(BmsMasterUser::getType, MasterUserType.Channel); + List masterUsersByChannel = masterUserMapper.selectList(masterUserLqw2); + for (BmsMasterUser masterUser : masterUsersByChannel) { + this.flushByChannelId(Long.parseLong(masterUser.getTargetId())); + } + //4.区域管理人 + this.initSetupByPointId(0L); + } + + @Override + public void initSetupByPointId(Long pointId) { + if(1==1){ + log.debug("停用的逻辑"); + return; + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.isNotNull(BmsChannelPoint::getSaleRegionId).or().isNotNull(BmsChannelPoint::getBizRegionId); + lqw.ge(BmsChannelPoint::getId,pointId); + lqw.select(BmsChannelPoint::getId,BmsChannelPoint::getSaleRegionPathIds,BmsChannelPoint::getBizRegionPathIds); + List channelPoints = channelPointMapper.selectList(lqw); + for (BmsChannelPoint channelPoint : channelPoints) { + this.flushPoint(channelPoint.getId(),channelPoint.getSaleRegionPathIds(),channelPoint.getBizRegionPathIds()); + log.debug("channelPoint finished pointId:{}",channelPoint.getId()); + } + } + + /** + * 基础的更新区域 + * @param sourceType + * @param regionIds + * @param userIds + * @param pointIds + * @param delHisUserRegion + */ + private void flushRegion(Integer sourceType, String regionIds, List userIds, List pointIds,boolean delHisUserRegion) { + if(1==1){ + log.debug("停用的逻辑"); + return; + } + List hisUserChannelPointList = new ArrayList<>(); + for (String userId : userIds) { + if(sourceType.equals(2)){ + this.removeUserRegion(userId,regionIds,null); + }else { + this.removeUserRegion(userId,null,regionIds); + } + for (Long pointId : pointIds) { + HisUserChannelPoint userChannelPoint = new HisUserChannelPoint(); + userChannelPoint.setUserId(userId); + userChannelPoint.setPointId(pointId); + userChannelPoint.setSourceType(sourceType); + userChannelPoint.setSourceIds(regionIds); + hisUserChannelPointList.add(userChannelPoint); + } + } + if(CollectionUtil.isNotEmpty(hisUserChannelPointList)){ + this.saveBatch(hisUserChannelPointList); + } + } + + + /** + * 获取区域负责的用户ID(自下而上查询) + * @param regionIds + * @param isSaleRegion + * @return + */ + private List getUserIdByRegionIds(String regionIds,boolean isSaleRegion){ + if(1==1){ + log.debug("停用的逻辑"); + return null; + } + List regionArr = Arrays.asList(regionIds.split("_")); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(BmsRegionUser::getRegionId,regionArr); + lqw.eq(BmsRegionUser::getType,isSaleRegion?0:1); + lqw.select(BmsRegionUser::getUserId); + List regionUserList = regionUserMapper.selectList(lqw); + List userIds = regionUserList.stream().map(BmsRegionUser::getUserId) + .distinct().collect(Collectors.toList()); + return userIds; + } + + /** + * 获取区域有那些网点 + * @param regionIds + * @param isSaleRegion + * @return + */ + private List getPointIdsByRegionIds(String regionIds,boolean isSaleRegion){ + if(1==1){ + log.debug("停用的逻辑"); + return null; + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(BmsChannelPoint::getId); + if(isSaleRegion){ + lqw.and(a->{ + a.likeRight(BmsChannelPoint::getSaleRegionPathIds,regionIds+"_") + .or() + .eq(BmsChannelPoint::getSaleRegionPathIds,regionIds); + }); + List channelPoints = channelPointMapper.selectList(lqw); + return channelPoints.stream().map(BmsChannelPoint::getId).collect(Collectors.toList()); + }else { + lqw.and(a->{ + a.likeRight(BmsChannelPoint::getBizRegionPathIds,regionIds+"_") + .or() + .eq(BmsChannelPoint::getBizRegionPathIds,regionIds); + }); + List channelPoints = channelPointMapper.selectList(lqw); + return channelPoints.stream().map(BmsChannelPoint::getId).collect(Collectors.toList()); + } + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/service/impl/HisUserSupplierServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/service/impl/HisUserSupplierServiceImpl.java new file mode 100644 index 0000000..abc3cd0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/service/impl/HisUserSupplierServiceImpl.java @@ -0,0 +1,239 @@ +package com.qs.serve.modules.his.service.impl; + +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.extension.service.impl.ServiceImpl; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.consts.RedisCacheKeys; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.tag.util.TagFiledUtil; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsRegionUser; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.service.BmsRegionUserService; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.sys.service.SysPostUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.his.entity.HisUserSupplier; +import com.qs.serve.modules.his.service.HisUserSupplierService; +import com.qs.serve.modules.his.mapper.HisUserSupplierMapper; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 供应商负责人 服务实现类 + * @author YenHex + * @since 2022-11-15 + */ +@Slf4j +@Service +@AllArgsConstructor +public class HisUserSupplierServiceImpl extends ServiceImpl implements HisUserSupplierService { + + private BmsSupplierService bmsSupplierService; + private BmsRegionMapper saleRegionMapper; + private BmsRegion2Mapper bmsRegion2Mapper; + private BmsRegionUserService regionUserService; + private SysPostUserService sysPostUserService; + private RedisService redisService; + + @Override + public List selectHisSupplier(BmsSupplier param, boolean usePage) { + if(param==null){ + param = new BmsSupplier(); + } + List userIds = param.getSelectUserIds(); + if(param.getSelectUserIdsFlag()==null||!param.getSelectUserIdsFlag()){ + String userId = AuthContextUtils.getSysUserId(); + userIds = Arrays.asList(userId); + } + if(CollectionUtil.isEmpty(userIds)){ + return new ArrayList<>(); + } + 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); + if(usePage){ + PageUtil.startPage(); + } + TagFiledUtil.HisSupplierPage(userSupplier); + return baseMapper.selectSupplierIdByQuery(userSupplier,lqw); + //return this.list(lqw).stream().map(a->a.getSupplierId()).collect(Collectors.toList()); + } + + @Override + public List selectListSupplier(BmsSupplier param) { + 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); + return supplierList; + }else{ + return new ArrayList<>(); + } + } + + @Override + public PageVo selectPageSupplier(BmsSupplier param) { + 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(supplierIds,supplierList); + }else{ + return R.buildPageHelperList(new ArrayList<>()); + } + + } + + @Override + public boolean checkInit(String userId) { + LambdaQueryWrapper lqwExist = new LambdaQueryWrapper<>(); + lqwExist.eq(HisUserSupplier::getUserId,userId); + long count = this.count(lqwExist); + if(count>0L){ + return true; + } + return false; + } + + + @Deprecated + @Override + public boolean initByUserId(String userId,boolean hasCheck, List existUserIds) { + if(!hasCheck){ + if(existUserIds==null){ + existUserIds = new ArrayList<>(); + } + if(existUserIds.contains(userId)){ + return true; + }else { + existUserIds.add(userId); + } + boolean checkInit = this.checkInit(userId); + + if(checkInit){ + return true; + } + } + return rebuildOnlyOneUserSuppliers(userId); + } + + public boolean rebuildOnlyOneUserSuppliers(String userId) { + BmsSupplier param = new BmsSupplier(); + param.setCurrUserId(userId); + List list = bmsSupplierService.selectSupplierList(param); + List userSuppliers = new ArrayList<>(); + for (BmsSupplier supplier : list) { + HisUserSupplier userSupplier = supplier.toHisUserSupplier(userId,3); + userSuppliers.add(userSupplier); + } + LambdaQueryWrapper regionUserLqw = new LambdaQueryWrapper<>(); + regionUserLqw.eq(BmsRegionUser::getUserId, userId); + List regionUsers = regionUserService.list(regionUserLqw); + List regionSaleIds = regionUsers.stream() + .filter(a->a.getType().equals(0)) + .map(BmsRegionUser::getRegionId) + .collect(Collectors.toList()); + if(regionSaleIds.size()>0){ + List saleRegions = saleRegionMapper.selectBatchIds(regionSaleIds); + Map> saleRegionsMap = saleRegions.stream().collect(Collectors.groupingBy(BmsRegion::getLevel)); + for (Integer level : saleRegionsMap.keySet()) { + List saleRegionListByLevel = saleRegionsMap.get(level); + List regionIds = saleRegionListByLevel.stream().map(BmsRegion::getId).collect(Collectors.toList()); + toHisUserSupplier(userSuppliers,0,regionIds,level, userId); + } + } + List regionBizIds = regionUsers.stream() + .filter(a->a.getType().equals(1)) + .map(BmsRegionUser::getRegionId) + .collect(Collectors.toList()); + if(regionBizIds.size()>0){ + List bizRegions = bmsRegion2Mapper.selectBatchIds(regionBizIds); + Map> saleRegionsMap = bizRegions.stream().collect(Collectors.groupingBy(BmsRegion2::getLevel)); + for (Integer level : saleRegionsMap.keySet()) { + List region2List = saleRegionsMap.get(level); + List region2Ids = region2List.stream().map(BmsRegion2::getId).collect(Collectors.toList()); + toHisUserSupplier(userSuppliers,1,region2Ids,level, userId); + } + } + if(userSuppliers.size()>0){ + this.saveBatch(userSuppliers); + }else { + HisUserSupplier userSupplier = new HisUserSupplier(); + userSupplier.setUserId(userId); + userSupplier.setSupplierId(0L); + userSupplier.setType(9); + this.save(userSupplier); + } + return false; + } + + @Deprecated + @Override + public boolean initByUserId(String userId, boolean hasCheck, boolean nextChilds) { + List existUserIds = new ArrayList<>(); + if(nextChilds) { + List childUserList = sysPostUserService.listByChildIds(userId); + for (String childUserId : childUserList) { + this.initByUserId(childUserId, false, existUserIds); + } + } + return initByUserId(userId, hasCheck,existUserIds); + } + + + private void toHisUserSupplier(List userSuppliers,Integer type,List regionIds,Integer level,String userId){ + if(regionIds.size()>0){ + List supplierList = bmsSupplierService.listByRegionIds(regionIds,level); + for (BmsSupplier supplier : supplierList) { + HisUserSupplier userSupplier = supplier.toHisUserSupplier(userId,type); + userSuppliers.add(userSupplier); + } + } + } + + @Override + public void cleanTable() { + Integer opt = redisService.getInteger(RedisCacheKeys.HIS_UPDATE); + if(opt==null||opt.equals(0)){ + redisService.set(RedisCacheKeys.HIS_UPDATE,1); + } + } + + @Override + public Set listSupplierIdByUserIds(Collection userIds) { + if(CollUtil.isNotEmpty(userIds)){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(HisUserSupplier::getSupplierId); + lqw.in(HisUserSupplier::getUserId,userIds); + List list = this.list(lqw); + return list.stream().map(HisUserSupplier::getSupplierId).collect(Collectors.toSet()); + } + return null; + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/service/impl/HisUserSupplierTempServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/service/impl/HisUserSupplierTempServiceImpl.java new file mode 100644 index 0000000..e1459e5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/his/service/impl/HisUserSupplierTempServiceImpl.java @@ -0,0 +1,145 @@ +package com.qs.serve.modules.his.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsRegionUser; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.service.BmsRegionUserService; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.his.entity.HisUserSupplier; +import com.qs.serve.modules.his.mapper.HisUserSupplierMapper; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.sys.service.SysPostUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.his.entity.HisUserSupplierTemp; +import com.qs.serve.modules.his.service.HisUserSupplierTempService; +import com.qs.serve.modules.his.mapper.HisUserSupplierTempMapper; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 供应商负责人 服务实现类 + * @author YenHex + * @since 2023-05-31 + */ +@Slf4j +@Service +@AllArgsConstructor +public class HisUserSupplierTempServiceImpl extends ServiceImpl implements HisUserSupplierTempService { + + private final SysUserMapper sysUserMapper; + private final SysPostUserService sysPostUserService; + private final BmsSupplierService bmsSupplierService; + private BmsRegionMapper saleRegionMapper; + private BmsRegion2Mapper bmsRegion2Mapper; + private BmsRegionUserService regionUserService; + private RedisService redisService; + private HisUserSupplierMapper hisUserSupplierMapper; + + @Override + public void selectInfoHis() { + baseMapper.dropTable(); + baseMapper.selectIntoHis(); + } + + @Override + public void reloadHis() { + //移除所有历史 + this.remove(new QueryWrapper<>()); + //加载所有用户 + List sysUser = sysUserMapper.selectList(new QueryWrapper<>()); + List userIds = sysUser.stream().map(a->a.getId()).collect(Collectors.toList()); + //初始化 + for (int i = 0; i < userIds.size(); i++) { + String userId = userIds.get(i); + log.warn("正在同步客户:"+i+"/"+userIds.size()); + this.initByUserId(userId,null); + } + } + + void initByUserId(String userId,List existUserIds){ + if(existUserIds==null){ + existUserIds = new ArrayList<>(); + } + if(existUserIds.contains(userId)){ + return; + }else { + existUserIds.add(userId); + } + List childUserIds = sysPostUserService.listByChildIds(userId); + for (String childUserId : childUserIds) { + this.initByUserId(childUserId, existUserIds); + } + BmsSupplier param = new BmsSupplier(); + param.setCurrUserId(userId); + List list = bmsSupplierService.selectSupplierList(param); + List userSuppliers = new ArrayList<>(); + for (BmsSupplier supplier : list) { + HisUserSupplierTemp userSupplier = supplier.toHisUserSupplierTemp(userId,3); + userSuppliers.add(userSupplier); + } + LambdaQueryWrapper regionUserLqw = new LambdaQueryWrapper<>(); + regionUserLqw.eq(BmsRegionUser::getUserId,userId); + List regionUsers = regionUserService.list(regionUserLqw); + List regionSaleIds = regionUsers.stream() + .filter(a->a.getType().equals(0)) + .map(BmsRegionUser::getRegionId) + .collect(Collectors.toList()); + if(regionSaleIds.size()>0){ + List saleRegions = saleRegionMapper.selectBatchIds(regionSaleIds); + Map> saleRegionsMap = saleRegions.stream().collect(Collectors.groupingBy(BmsRegion::getLevel)); + for (Integer level : saleRegionsMap.keySet()) { + List saleRegionListByLevel = saleRegionsMap.get(level); + List regionIds = saleRegionListByLevel.stream().map(BmsRegion::getId).collect(Collectors.toList()); + toHisUserSupplier(userSuppliers,0,regionIds,level,userId); + } + } + List regionBizIds = regionUsers.stream() + .filter(a->a.getType().equals(1)) + .map(BmsRegionUser::getRegionId) + .collect(Collectors.toList()); + if(regionBizIds.size()>0){ + List bizRegions = bmsRegion2Mapper.selectBatchIds(regionBizIds); + Map> saleRegionsMap = bizRegions.stream().collect(Collectors.groupingBy(BmsRegion2::getLevel)); + for (Integer level : saleRegionsMap.keySet()) { + List region2List = saleRegionsMap.get(level); + List region2Ids = region2List.stream().map(BmsRegion2::getId).collect(Collectors.toList()); + toHisUserSupplier(userSuppliers,1,region2Ids,level,userId); + } + } + if(userSuppliers.size()>0){ + this.saveBatch(userSuppliers); + }else { + HisUserSupplierTemp userSupplier = new HisUserSupplierTemp(); + userSupplier.setUserId(userId); + userSupplier.setSupplierId(0L); + userSupplier.setType(9); + this.save(userSupplier); + } + } + + + private void toHisUserSupplier(List userSuppliers,Integer type,List regionIds,Integer level,String userId){ + if(regionIds.size()>0){ + List supplierList = bmsSupplierService.listByRegionIds(regionIds,level); + for (BmsSupplier supplier : supplierList) { + HisUserSupplierTemp userSupplier = supplier.toHisUserSupplierTemp(userId,type); + userSuppliers.add(userSupplier); + } + } + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/common/OmsOrderCheckState.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/common/OmsOrderCheckState.java new file mode 100644 index 0000000..dbe98d8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/common/OmsOrderCheckState.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.oms.common; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author YenHex + * @since 2022/11/24 + */ +@Getter +@AllArgsConstructor +public enum OmsOrderCheckState { + + //状态:0草稿,1=审批中;2=完成;3-中止;4-回滚;5-作废;6-关闭 + UnPublish(0), + Commiting(1), + Finished(2), + Stop(3), + Rollback(4), + Cancel(5), + Close(6); + + private Integer code; + + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/common/OmsSaleYearUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/common/OmsSaleYearUtil.java new file mode 100644 index 0000000..450c474 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/common/OmsSaleYearUtil.java @@ -0,0 +1,45 @@ +package com.qs.serve.modules.oms.common; + +import com.qs.serve.common.framework.mybatis.handler.meta.TableNameAppendHandler; +import com.qs.serve.common.util.ServletUtils; +import com.qs.serve.common.util.StringUtils; +import lombok.experimental.UtilityClass; + +import java.time.LocalDate; + +/** + * @author YenHex + * @since 2024/12/16 + */ +@UtilityClass +public class OmsSaleYearUtil { + + /** + * 通过订单id设置年份,订单id前缀是年份 + * @param id + */ + public static void initByIdString(String id){ + // 截取id前面4位数值当年份 + if(StringUtils.hasText(id) && id.length()>=4){ + setYear(id.substring(0,4)); + } + } + + /** + * 当前年份 + */ + public static void currYear(){ + setYear(LocalDate.now().getYear()+""); + } + + /** + * 设置指定年份 + * @param year + */ + public static void setYear(String year){ + if(StringUtils.hasText(year)){ + TableNameAppendHandler.setAppend(year); + } + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/OmsOrderController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/OmsOrderController.java new file mode 100644 index 0000000..edd1ff8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/OmsOrderController.java @@ -0,0 +1,274 @@ +package com.qs.serve.modules.oms.controller; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.dto.SimpleKeyValue; +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.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; +import com.qs.serve.modules.oms.common.OmsOrderCheckState; +import com.qs.serve.modules.oms.entity.OmsOrderItem; +import com.qs.serve.modules.oms.entity.bo.OmsCheckParam; +import com.qs.serve.modules.oms.entity.bo.OmsSpuAssesInfoBo; +import com.qs.serve.modules.oms.entity.bo.OmsUrgentParam; +import com.qs.serve.modules.oms.entity.bo.OrderRelateQuery; +import com.qs.serve.modules.oms.entity.vo.OmsSpuAssesInfo; +import com.qs.serve.modules.oms.mapper.OmsOrderMapper; +import com.qs.serve.modules.oms.service.OmsOrderItemService; +import com.qs.serve.modules.oms.service.OmsOrderOptionsService; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.oms.entity.OmsOrder; +import com.qs.serve.modules.oms.service.OmsOrderService; + +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import static com.qs.serve.modules.tbs.common.TbsSeeYonConst.ERP_ORDER_SOURCE; + +/** + * 订单模块 订单 + * @author YenHex + * @since 2022-10-14 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("oms/order") +public class OmsOrderController { + + private OmsOrderService omsOrderService; + private OmsOrderMapper omsOrderMapper; + private BmsSupplierAddressService bmsSupplierAddressService; + private OmsOrderOptionsService omsOrderOptionsService; + private SysUserService sysUserService; + private OmsOrderItemService omsOrderItemService; + private BmsSupplierMapper bmsSupplierMapper; + private SeeYonRequestBaseService seeYonRequestBaseService; + + + /** + * 获取ERP订单信息 + * @param query + * @return + */ + @PostMapping("/getOrderRelateInfo") + public R getErpOrder(@RequestBody OrderRelateQuery query){ + return seeYonRequestBaseService.postBase(ERP_ORDER_SOURCE,query,"获取订单关联"); + } + + /** + * ID查询 + * @param orderCode + * @return + */ + @GetMapping("/stopOrder/{orderCode}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.QUERY) + public R stopOrder(@PathVariable("orderCode") String orderCode){ + OmsOrder omsOrder = omsOrderService.getOne(new LambdaQueryWrapper() + .eq(OmsOrder::getOrderSn,orderCode),false); + if(omsOrder.getOrderType().equals(3)&&omsOrder.getOrderCheckState() + .equals(OmsOrderCheckState.Commiting.getCode())){ + omsOrderOptionsService.doRefuse(new TbsAffairCommitBo(omsOrder.getId()+"")); + return R.ok(); + } + return R.error("更新行数为0"); + } + + /** + * ID查询 + * @param orderCode + * @return + */ + @GetMapping("/checkOrder/{orderCode}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.QUERY) + public R checkOrder(@PathVariable("orderCode") String orderCode){ + OmsOrder omsOrder = omsOrderService.getOne(new LambdaQueryWrapper() + .eq(OmsOrder::getOrderSn,orderCode),false); + if(omsOrder.getOrderType().equals(3)&&omsOrder.getOrderCheckState() + .equals(OmsOrderCheckState.Commiting.getCode())){ + //omsOrderOptionsService.runCompensate(omsOrder.getId()+""); + omsOrderOptionsService.doFinished(new TbsAffairCommitBo(omsOrder.getId()+"")); + omsOrderOptionsService.syncToErp(); + return R.ok(); + } + // 测试扣率 + //omsOrderOptionsService.syncToErp11DB(Arrays.asList(omsOrder)); + return R.error("更新行数为0"); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(OmsOrder param){ + PageUtil.startPage(); + LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(param); + orderWrapper.orderByDesc(OmsOrder::getId); + if(param.getCheckStartTime()!=null){ + orderWrapper.ge(OmsOrder::getCheckTime,param.getCheckStartTime().atStartOfDay()); + } + if(param.getCheckEndTime()!=null){ + orderWrapper.le(OmsOrder::getCheckTime,param.getCheckEndTime().atTime(23,59,59)); + } + + List list = omsOrderService.list(orderWrapper); + Set addrIds = list.stream().map(OmsOrder::getSupplierAddrId).collect(Collectors.toSet()); + addrIds.add(0L); + List supplierAddressList = bmsSupplierAddressService.listByIds(addrIds); + + Set userIds = list.stream().map(OmsOrder::getCheckUserId).collect(Collectors.toSet()); + userIds.add("0"); + List userList = sysUserService.listByIds(userIds); + + Set orderIds = list.stream().map(OmsOrder::getId).collect(Collectors.toSet()); + orderIds.add(0L); + List orderItems = omsOrderItemService.list(new LambdaQueryWrapper().in(OmsOrderItem::getOrderId,orderIds)); + Map> orderItemsMap = orderItems.stream().collect(Collectors.groupingBy(OmsOrderItem::getOrderId)); + for (OmsOrder order : list) { + + // 关联折扣信息 + if(StringUtils.hasText(order.getOaRateId())){ + SimpleKeyValue obj = omsOrderMapper.getExpiredRateInfo(order.getOaRateId()); + order.setDiscountRateInfo(obj); + } + + BmsSupplierAddress supplierAddress = null; + if(order.getSupplierAddrId()!=null){ + for (BmsSupplierAddress address : supplierAddressList) { + if(order.getSupplierAddrId().equals(address.getId())){ + supplierAddress = address; + } + } + order.setAddressInfo(supplierAddress); + } + if(order.getCheckUserId()!=null){ + SysUser sysUser = null; + for (SysUser user : userList) { + if(user.getId().equals(order.getCheckUserId())){ + sysUser = user; + } + } + if(sysUser!=null){ + order.setCheckUserInfo(sysUser.toSysUserVo()); + } + } + List items = orderItemsMap.get(order.getId()); + order.setOrderItems(items); + } + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + OmsOrder omsOrder = omsOrderService.getById(id); + if(omsOrder.getOrderType().equals(3)&&omsOrder.getOrderCheckState().equals(OmsOrderCheckState.Commiting.getCode())){ + omsOrderOptionsService.runCompensate(omsOrder.getId()+""); + } + BmsSupplier supplier = bmsSupplierMapper.selectById(omsOrder.getSupplierId()); + omsOrder.setSupplierInfo(supplier); + return R.ok(omsOrder); + } + + /** + * 审核 + * @param param + * @return + */ + @PostMapping("/check") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.UPDATE) + public R check(@RequestBody @Valid OmsCheckParam param){ + OmsOrder dbOmsOrder = omsOrderService.getById(param.getOrderId()); + if(dbOmsOrder.getStatus().equals(0)){ + OmsOrder omsOrder = new OmsOrder(); + omsOrder.setId(param.getOrderId()); + omsOrder.setCheckState(param.getCheckSate().equals(1)?1:2); + omsOrder.setCheckTime(LocalDateTime.now()); + omsOrder.setCheckUserId(AuthContextUtils.getSysUserId()); + omsOrderService.updateById(omsOrder); + return R.ok(); + } + return R.error("已完成的订单无法修改"); + } + + /** + * 设置加急 + * @param param + * @return + */ + @PostMapping("/urgent") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.UPDATE) + public R urgent(@RequestBody @Valid OmsUrgentParam param){ + OmsOrder dbOmsOrder = omsOrderService.getById(param.getOrderId()); + if(dbOmsOrder.getStatus().equals(0)){ + OmsOrder omsOrder = new OmsOrder(); + omsOrder.setId(param.getOrderId()); + omsOrder.setUrgentFlag(param.getUrgentSate().equals(1)?1:0); + omsOrderService.updateById(omsOrder); + return R.ok(); + } + return R.error("已完成的订单无法修改"); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.DELETE) + public R deleteById(@PathVariable("id") Long id){ + OmsOrder dbOmsOrder = omsOrderService.getById(id); + if(dbOmsOrder.getStatus().equals(0)&&dbOmsOrder.getCheckState().equals(0)&&dbOmsOrder.getOrderCheckState().equals(0)){ + boolean result = omsOrderService.removeById(id); + return R.isTrue(result); + } + return R.error("当前状态无法删除"); + } + + /** + * 预估信息 + * @param param + * @return + */ + @PostMapping("/assess") + public R> getSpuAssess(@Valid @RequestBody OmsSpuAssesInfoBo param){ + return R.ok(omsOrderService.getSpuAssess(param)); + } + + @GetMapping("/reSync/{code}") + public R getSpuAssess(@PathVariable("code") String code){ + List omsOrders = omsOrderService.list(new LambdaQueryWrapper().eq(OmsOrder::getOrderSn,code)); + if(CollUtil.isNotEmpty(omsOrders)){ + omsOrderOptionsService.syncToErp11DB(omsOrders); + } + return R.ok(); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/OmsOrderExpiredController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/OmsOrderExpiredController.java new file mode 100644 index 0000000..848e49d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/OmsOrderExpiredController.java @@ -0,0 +1,49 @@ +package com.qs.serve.modules.oms.controller; + +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.enums.BizType; +import com.qs.serve.common.model.enums.SystemModule; +import com.qs.serve.modules.oms.entity.OmsOrder; +import com.qs.serve.modules.oms.service.OmsOrderOptionsService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + * @author YenHex + * @since 2024/8/12 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("oms/orderExpired") +public class OmsOrderExpiredController { + + OmsOrderOptionsService omsOrderOptionsService; + + /** + * 提交临期订单 + * @param id 订单ID + * @return + */ + @PostMapping("submit/{id}") + @SysLog(module = SystemModule.BIZ, title = "临期订单", biz = BizType.SUBMIT) + public R submit(@PathVariable("id") Long id){ + omsOrderOptionsService.submitExpiredOrder(id+""); + return R.ok(); + } + + @GetMapping("compensate/{id}") + public R runCompensate(@PathVariable String id){ + omsOrderOptionsService.runCompensate(id); + return R.ok(); + } + + @GetMapping("sync") + public R sync(){ + omsOrderOptionsService.syncToErp(); + return R.ok(); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/OmsOrderItemController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/OmsOrderItemController.java new file mode 100644 index 0000000..b68d223 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/OmsOrderItemController.java @@ -0,0 +1,60 @@ +package com.qs.serve.modules.oms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.oms.entity.OmsOrderItem; +import com.qs.serve.modules.oms.service.OmsOrderItemService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 订单模块 订单明细 + * @author YenHex + * @since 2022-10-14 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("oms/orderItem") +public class OmsOrderItemController { + + private OmsOrderItemService omsOrderItemService; + + /** + * 查询订单项 + * @param orderId + * @return + */ + @GetMapping("/listByOrderId/{orderId}") + public R> listByOrderId(@PathVariable("orderId")Long orderId){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(OmsOrderItem::getOrderId,orderId); + List list = omsOrderItemService.list(lqw); + return R.ok(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "订单明细", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + OmsOrderItem omsOrderItem = omsOrderItemService.getById(id); + return R.ok(omsOrderItem); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/OmsSaleOrderController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/OmsSaleOrderController.java new file mode 100644 index 0000000..2ae2a4a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/OmsSaleOrderController.java @@ -0,0 +1,321 @@ +package com.qs.serve.modules.oms.controller; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; +import com.qs.serve.modules.oms.common.OmsOrderCheckState; +import com.qs.serve.modules.oms.entity.*; +import com.qs.serve.modules.oms.entity.bo.*; +import com.qs.serve.modules.oms.entity.vo.OmsPlanResult; +import com.qs.serve.modules.oms.entity.vo.OmsSpuAssesInfo; +import com.qs.serve.modules.oms.mapper.OmsSeaTankMapper; +import com.qs.serve.modules.oms.mapper.OmsTransportMapper; +import com.qs.serve.modules.oms.service.*; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import static com.qs.serve.modules.tbs.common.TbsSeeYonConst.ERP_ORDER_SOURCE; + +/** + * 订单模块 订单 + * @author YenHex + * @since 2022-10-14 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("oms/saleOrder") +public class OmsSaleOrderController { + + private OmsSaleOrderService omsSaleOrderService; + private BmsSupplierAddressService bmsSupplierAddressService; + private OmsSaleOrderOptionsService omsSaleOrderOptionsService; + private SysUserService sysUserService; + private OmsSaleOrderItemService omsSaleOrderItemService; + private BmsSupplierMapper bmsSupplierMapper; + private SeeYonRequestBaseService seeYonRequestBaseService; + private OmsVerSaleOrderService omsVerSaleOrderService; + private OmsSeaTankMapper omsSeaTankMapper; + private OmsTransportMapper omsTransportMapper; + + @GetMapping("/getSeaTanks") + public R getSeaTanks(){ + return R.ok(omsSeaTankMapper.selectList(null)); + } + + @GetMapping("/getTransports") + public R getTransports(){ + return R.ok(omsTransportMapper.selectList(null)); + } + /** + * 查看排产预估计划 + * @param param + * @return + */ + @PostMapping("/listItemPlans") + public R listPlans(@RequestBody OmsPlanParam param){ + OmsPlanResult result = omsSaleOrderService.getPlanList(param); + return R.ok(result); + } + + /** + * 获取历史订单 + * @param code + * @return + */ + @GetMapping("/listHistoryByCode") + public R getHistoryOrder(String code){ + if(!StringUtils.hasText(code)){ + return R.ok(); + } + List saleOrders = omsSaleOrderService.listHistoryOrderByCode(code); + return R.ok(saleOrders); + } + + /** + * 获取订单变更记录 + * @param code + * @return + */ + @GetMapping("/getChangeLog") + public R getChangeLog(String code){ + return R.ok(omsSaleOrderService.getChangeLog(code)); + } + + /** + * 获取erp订单日志 + * @param code + * @return + */ + @GetMapping("getErpOrderChanges") + public R getErpOrderVersionChangeLogs(String code){ + List list = omsVerSaleOrderService.list(new LambdaQueryWrapper() + .eq(OmsVerSaleOrder::getOrderSn,code) + .orderByAsc(OmsVerSaleOrder::getId)); + return R.ok(list); + } + + /** + * 获取ERP订单信息 + * @param query + * @return + */ + @PostMapping("/getOrderRelateInfo") + public R getErpOrder(@RequestBody OrderRelateQuery query){ + return seeYonRequestBaseService.postBase(ERP_ORDER_SOURCE,query,"获取订单关联"); + } + + /** + * ID查询 + * @param orderCode + * @return + */ + @GetMapping("/stopOrder/{orderCode}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.QUERY) + public R stopOrder(@PathVariable("orderCode") String orderCode){ + OmsSaleOrder omsOrder = omsSaleOrderService.getOne(new LambdaQueryWrapper() + .eq(OmsSaleOrder::getOrderSn,orderCode),false); + if(omsOrder.getOrderType().equals(3)&&omsOrder.getOrderCheckState() + .equals(OmsOrderCheckState.Commiting.getCode())){ + omsSaleOrderOptionsService.doRefuse(new TbsAffairCommitBo(omsOrder.getId()+"")); + return R.ok(); + } + return R.error("更新行数为0"); + } + + /** + * ID查询 + * @param orderCode + * @return + */ + @GetMapping("/checkOrder/{orderCode}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.QUERY) + public R checkOrder(@PathVariable("orderCode") String orderCode){ + OmsSaleOrder omsSaleOrder = omsSaleOrderService.getOne(new LambdaQueryWrapper() + .eq(OmsSaleOrder::getOrderSn,orderCode),false); + if(omsSaleOrder.getOrderType().equals(3)&&omsSaleOrder.getOrderCheckState() + .equals(OmsOrderCheckState.Commiting.getCode())){ + //omsOrderOptionsService.runCompensate(omsOrder.getId()+""); + omsSaleOrderOptionsService.doFinished(new TbsAffairCommitBo(omsSaleOrder.getId()+"")); + omsSaleOrderOptionsService.syncToErp(); + return R.ok(); + } + // 测试扣率 + //omsOrderOptionsService.syncToErp11DB(Arrays.asList(omsOrder)); + return R.error("更新行数为0"); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(OmsSaleOrder param){ + PageUtil.startPage(); + LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(param); + orderWrapper.orderByDesc(OmsSaleOrder::getId); + + if(param.getCheckStartTime()!=null){ + orderWrapper.ge(OmsSaleOrder::getCheckTime,param.getCheckStartTime().atStartOfDay()); + } + if(param.getCheckEndTime()!=null){ + orderWrapper.le(OmsSaleOrder::getCheckTime,param.getCheckEndTime().atTime(23,59,59)); + } + + List list = omsSaleOrderService.list(orderWrapper); + Set addrIds = list.stream().map(OmsSaleOrder::getSupplierAddrId).collect(Collectors.toSet()); + addrIds.add(0L); + List supplierAddressList = bmsSupplierAddressService.listByIds(addrIds); + + Set userIds = list.stream().map(OmsSaleOrder::getCheckUserId).collect(Collectors.toSet()); + userIds.add("0"); + List userList = sysUserService.listByIds(userIds); + + Set orderIds = list.stream().map(OmsSaleOrder::getId).collect(Collectors.toSet()); + orderIds.add(0L); + List orderItems = omsSaleOrderItemService.list(new LambdaQueryWrapper().in(OmsSaleOrderItem::getOrderId,orderIds)); + Map> orderItemsMap = orderItems.stream().collect(Collectors.groupingBy(OmsSaleOrderItem::getOrderId)); + for (OmsSaleOrder order : list) { + BmsSupplierAddress supplierAddress = null; + if(order.getSupplierAddrId()!=null){ + for (BmsSupplierAddress address : supplierAddressList) { + if(order.getSupplierAddrId().equals(address.getId())){ + supplierAddress = address; + } + } + order.setAddressInfo(supplierAddress); + } + if(order.getCheckUserId()!=null){ + SysUser sysUser = null; + for (SysUser user : userList) { + if(user.getId().equals(order.getCheckUserId())){ + sysUser = user; + } + } + if(sysUser!=null){ + order.setCheckUserInfo(sysUser.toSysUserVo()); + } + } + List items = orderItemsMap.get(order.getId()); + order.setOrderItems(items); + } + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + OmsSaleOrder omsOrder = omsSaleOrderService.getById(id); + if(omsOrder.getOrderType().equals(3)&&omsOrder.getOrderCheckState().equals(OmsOrderCheckState.Commiting.getCode())){ + omsSaleOrderOptionsService.runCompensate(omsOrder.getId()+""); + } + BmsSupplier supplier = bmsSupplierMapper.selectById(omsOrder.getSupplierId()); + omsOrder.setSupplierInfo(supplier); + return R.ok(omsOrder); + } + + /** + * 审核 + * @param param + * @return + */ + @PostMapping("/check") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.UPDATE) + public R check(@RequestBody @Valid OmsCheckParam param){ + OmsSaleOrder dbOmsOrder = omsSaleOrderService.getById(param.getOrderId()); + if(dbOmsOrder.getStatus().equals(0)){ + OmsSaleOrder omsOrder = new OmsSaleOrder(); + omsOrder.setId(param.getOrderId()); + omsOrder.setCheckState(param.getCheckSate().equals(1)?1:2); + omsOrder.setCheckTime(LocalDateTime.now()); + omsOrder.setCheckUserId(AuthContextUtils.getSysUserId()); + omsSaleOrderService.updateById(omsOrder); + return R.ok(); + } + return R.error("已完成的订单无法修改"); + } + + /** + * 设置加急 + * @param param + * @return + */ + @PostMapping("/urgent") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.UPDATE) + public R urgent(@RequestBody @Valid OmsUrgentParam param){ + OmsSaleOrder dbOmsOrder = omsSaleOrderService.getById(param.getOrderId()); + if(dbOmsOrder.getStatus().equals(0)){ + OmsSaleOrder omsOrder = new OmsSaleOrder(); + omsOrder.setId(param.getOrderId()); + omsOrder.setUrgentFlag(param.getUrgentSate().equals(1)?1:0); + omsSaleOrderService.updateById(omsOrder); + return R.ok(); + } + return R.error("已完成的订单无法修改"); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.DELETE) + public R deleteById(@PathVariable("id") Long id){ + OmsSaleOrder dbOmsOrder = omsSaleOrderService.getById(id); + if(dbOmsOrder.getStatus().equals(0)&&dbOmsOrder.getCheckState().equals(0)&&dbOmsOrder.getOrderCheckState().equals(0)){ + boolean result = omsSaleOrderService.removeById(id); + return R.isTrue(result); + } + return R.error("当前状态无法删除"); + } + + /** + * 预估信息 + * @param param + * @return + */ + @PostMapping("/assess") + public R> getSpuAssess(@Valid @RequestBody OmsSpuAssesInfoBo param){ + return R.ok(omsSaleOrderService.getSpuAssess(param)); + } + + @GetMapping("/reSync/{code}") + public R getSpuAssess(@PathVariable("code") String code){ + List omsOrders = omsSaleOrderService.list(new LambdaQueryWrapper().eq(OmsSaleOrder::getOrderSn,code)); + if(CollUtil.isNotEmpty(omsOrders)){ + omsSaleOrderOptionsService.syncToErp11DB(omsOrders); + } + return R.ok(); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/OmsSaleOrderItemController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/OmsSaleOrderItemController.java new file mode 100644 index 0000000..52df870 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/OmsSaleOrderItemController.java @@ -0,0 +1,60 @@ +package com.qs.serve.modules.oms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.enums.BizType; +import com.qs.serve.common.model.enums.SystemModule; +import com.qs.serve.modules.oms.entity.OmsOrderItem; +import com.qs.serve.modules.oms.entity.OmsSaleOrderItem; +import com.qs.serve.modules.oms.service.OmsOrderItemService; +import com.qs.serve.modules.oms.service.OmsSaleOrderItemService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 订单模块 订单明细 + * @author YenHex + * @since 2022-10-14 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("oms/saleOrderItem") +public class OmsSaleOrderItemController { + + private OmsSaleOrderItemService omsSaleOrderItemService; + + /** + * 查询订单项 + * @param orderId + * @return + */ + @GetMapping("/listByOrderId/{orderId}") + public R> listByOrderId(@PathVariable("orderId")Long orderId){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(OmsSaleOrderItem::getOrderId,orderId); + List list = omsSaleOrderItemService.list(lqw); + return R.ok(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "订单明细", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + OmsSaleOrderItem omsOrderItem = omsSaleOrderItemService.getById(id); + return R.ok(omsOrderItem); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/api/OmsOrderApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/api/OmsOrderApi.java new file mode 100644 index 0000000..fff6da6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/api/OmsOrderApi.java @@ -0,0 +1,495 @@ +package com.qs.serve.modules.oms.controller.api; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.dto.SimpleKeyValue; +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.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.entity.dto.InventoryCusPrice; +import com.qs.serve.modules.goods.entity.so.InventoryCusPriceQuery; +import com.qs.serve.modules.goods.mapper.GoodsImminentBatchMapper; +import com.qs.serve.modules.goods.service.GoodsCategoryRuleService; +import com.qs.serve.modules.goods.service.GoodsCategoryService; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.oms.common.OmsOrderCheckState; +import com.qs.serve.modules.oms.entity.OmsOrder; +import com.qs.serve.modules.oms.entity.OmsOrderItem; +import com.qs.serve.modules.oms.entity.bo.*; +import com.qs.serve.modules.oms.entity.vo.OmsConfirmOrderResult; +import com.qs.serve.modules.oms.mapper.OmsOrderMapper; +import com.qs.serve.modules.oms.service.OmsOrderItemService; +import com.qs.serve.modules.oms.service.OmsOrderOptionsService; +import com.qs.serve.modules.oms.service.OmsOrderPart1Service; +import com.qs.serve.modules.oms.service.OmsOrderService; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.*; +import java.util.stream.Collectors; + +/** + * API订单模块 订单 + * @author YenHex + * @since 2022-10-14 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/api/order") +public class OmsOrderApi { + + private BmsSupplierMapper bmsSupplierMapper; + private OmsOrderService omsOrderService; + private OmsOrderMapper omsOrderMapper; + private OmsOrderItemService omsOrderItemService; + private BmsSupplierAddressService bmsSupplierAddressService; + private SysUserService sysUserService; + private GoodsCategoryRuleService goodsCategoryRuleService; + private GoodsSpuService goodsSpuService; + private GoodsSkuService goodsSkuService; + private GoodsCategoryService goodsCategoryService; + private SysPostUserService postUserService; + private SeeYonRequestBaseService seeYonRequestBaseService; + private GoodsImminentBatchMapper goodsImminentBatchMapper; + private OmsOrderPart1Service omsOrderPart1Service; + private OmsOrderOptionsService omsOrderOptionsService; + + /** + * 查询客户特殊加 + * @param query + * @return + */ + @PostMapping("queryCusPrices") + public R> queryCusPrices(@RequestBody InventoryCusPriceQuery query){ + R res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); + if(res.getStatus().equals(200)) { + List inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); + return R.ok(inventoryCusPrices); + } + return R.ok(); + } + + /** + * 传入订单ID。返回订单每一项的sku单价,在前端校验商品价格 + * @param orderId + * @return 返回错误的价格商品 + */ + @GetMapping("checkOrderPrice") + public R> checkOrderPrice(String orderId){ + List orderItemList = omsOrderItemService.list(new LambdaQueryWrapper() + .eq(OmsOrderItem::getOrderId,orderId)); + OmsOrder order = omsOrderService.getById(orderId); + String cusCode = order.getSupplierCode(); + List skuCodes = orderItemList.stream().map(OmsOrderItem::getSkuCode).collect(Collectors.toList()); + InventoryCusPriceQuery query = new InventoryCusPriceQuery(); + query.setCusCode(cusCode); + query.setInvCodes(skuCodes); + R res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); + List errList = new ArrayList<>(); + if(res.getStatus().equals(200)){ + List inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); + for (InventoryCusPrice cusPrice : inventoryCusPrices) { + for (OmsOrderItem orderItem : orderItemList) { + if(cusPrice.getCusCode().equals(orderItem.getSkuCode())&&cusPrice.getPrice().compareTo(cusPrice.getPrice())!=0){ + errList.add(cusPrice); + } + } + } + } + return R.ok(errList); + } + + /** + * 确认订单 + * @param confirmOrder + * @return + */ + @PostMapping("/generateConfirmOrder") + public R confirmOrder(@RequestBody @Valid OmsOrderBo confirmOrder){ + return R.ok(omsOrderService.confirmOrder(confirmOrder)); + } + + /** + * 创建订单(H5) + * @param omsOrderBo + * @return + */ + @PostMapping("/createOrder") + public R createOrderPC(@RequestBody @Valid OmsOrderBo omsOrderBo){ + return R.ok(omsOrderService.createOrder(omsOrderBo)); + } + + /** + * 修改草稿的订单 + * @param param + * @return + */ + @PostMapping("/modifyOrder") + public R modifyOrder(@RequestBody @Valid OmsOrderModifyParam param){ + omsOrderService.modifyOrder(param); + return R.ok(); + } + + /** + * 创建订单(PC) + * @param omsOrderBo + * @return + */ + @PostMapping("/createOrderOnPC") + public R createOrder(@RequestBody @Valid OmsOrderSkuBo omsOrderBo){ + return R.ok(omsOrderService.createOrderPc(omsOrderBo)); + } + + + /** + * 取消订单 + * @param omsOrderBo + * @return + */ + @PostMapping("/cancelOrder") + public R cancelOrder(@RequestBody @Valid OmsCancelOrder omsOrderBo){ + OmsOrder omsOrder = omsOrderService.getById(omsOrderBo.getOrderId()); + if(omsOrder.getOrderType().equals(3)){ + //临期品 + if(omsOrder.getOrderCheckState().equals(OmsOrderCheckState.Commiting.getCode())){ + //请求OA中止流程 + Assert.throwEx("审批完成后再试"); + }else if (!omsOrder.getOrderCheckState().equals(OmsOrderCheckState.Finished.getCode())){ + Assert.throwEx("审批状态不支持取消操作"); + } + } + //omsOrderService.checkMsOrderStatus(omsOrder); + if(omsOrder.getStatus().equals(0)||omsOrder.getStatus().equals(1)){ + //去执行取消 + omsOrderService.cancelOrder(omsOrder.getOrderSn()); + omsOrder.setStatus(6); + omsOrderService.updateById(omsOrder); + // 取消审批完成的临期品订单 + if (omsOrder.getOrderCheckState().equals(OmsOrderCheckState.Finished.getCode())){ + omsOrderPart1Service.releaseInventory(omsOrder.getId()); + } + return R.ok(); + } + return R.error("取消订单失败"); + } + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(OmsOrder param){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + param.setSupplierId(Long.parseLong(supplier.getId())); + + PageUtil.startPage(); + LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(param); + List list = omsOrderService.list(orderWrapper); + this.buildOrderVoInfo(list); + return R.byPageHelperList(list); + } + + /** + * 翻页查询(PC,我的业务订单) + * @param param + * @return + */ + @GetMapping("/page4pc") + public R> getPage4Pc(OmsOrder param){ + PageUtil.startPage(); + LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(param); + orderWrapper.eq(OmsOrder::getUserId,AuthContextUtils.getSysUserId()); + orderWrapper.eq(OmsOrder::getOrderType,param.getOrderType()==null?0:param.getOrderType()); + orderWrapper.orderByDesc(OmsOrder::getId); + if(param.getCheckStartTime()!=null){ + orderWrapper.ge(OmsOrder::getCheckTime,param.getCheckStartTime().atStartOfDay()); + } + if(param.getCheckEndTime()!=null){ + orderWrapper.le(OmsOrder::getCheckTime,param.getCheckEndTime().atTime(23,59,59)); + } + + List list = omsOrderService.list(orderWrapper); + this.buildOrderVoInfo(list); + return R.byPageHelperList(list); + } + + private void buildOrderVoInfo(List list) { + List userIds = list.stream().map(OmsOrder::getCheckUserId).collect(Collectors.toList()); + List sysUserList = new ArrayList<>(); + if(userIds.size()>0){ + sysUserList = sysUserService.listByIds(userIds); + } + + List addrIds = list.stream().map(OmsOrder::getSupplierAddrId).collect(Collectors.toList()); + 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); + + List> rates = omsOrderMapper.selectExpiredOrderRates(); + + Map> itemsMap = allItems.stream().collect(Collectors.groupingBy(OmsOrderItem::getOrderId)); + + for (OmsOrder order : list) { + + if(order.getOrderType().equals(3)&&StringUtils.hasText(order.getOaRateId())){ + for (SimpleKeyValue rate : rates) { + if (rate.getValue().equals(order.getOaRateId())){ + order.setDiscountRateInfo(rate); + } + } + } + + omsOrderService.checkMsOrderStatus(order); + + for (BmsSupplierAddress address : supplierAddressList) { + if(order.getSupplierAddrId().equals(address.getId())){ + order.setAddressInfo(address); + } + } + + for (SysUser user : sysUserList) { + if(user.getId().equals(order.getCheckUserId())){ + order.setCheckUserInfo(user.toSysUserVo()); + } + } + + order.setOrderItems(itemsMap.get(order.getId())); + + } + } + + /** + * 翻页查询(PC,我的业务订单) + * @param param + * @return + */ + @GetMapping("/pageUnder4pc") + public R> getPageUnder4Pc(OmsOrder param){ + String loginUserId = AuthContextUtils.getSysUserId(); + List userIds = postUserService.listByChildIds(loginUserId); + if(CollectionUtil.isEmpty(userIds)){ + return R.byEmptyList(); + } + PageUtil.startPage(); + LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(param); + orderWrapper.in(OmsOrder::getUserId,userIds); + orderWrapper.orderByDesc(OmsOrder::getId); + List list = omsOrderService.list(orderWrapper); + + Set addrIds = list.stream().map(OmsOrder::getSupplierAddrId).filter(Objects::nonNull).collect(Collectors.toSet()); + List supplierAddressList = bmsSupplierAddressService.listByIds(addrIds); + + Set checkUserIds = list.stream().map(OmsOrder::getCheckUserId).filter(Objects::nonNull).collect(Collectors.toSet()); + List sysUsers = sysUserService.listByIds(checkUserIds); + + Set orderIds = list.stream().map(OmsOrder::getId).filter(Objects::nonNull).collect(Collectors.toSet()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(OmsOrderItem::getOrderId,orderIds); + List items = omsOrderItemService.list(lqw); + Map> orderItemMap = items.stream().collect(Collectors.groupingBy(OmsOrderItem::getOrderId)); + for (OmsOrder order : list) { + // 关联折扣信息 + if(StringUtils.hasText(order.getOaRateId())){ + SimpleKeyValue obj = omsOrderMapper.getExpiredRateInfo(order.getOaRateId()); + order.setDiscountRateInfo(obj); + } + + if(order.getSupplierAddrId()!=null){ + for (BmsSupplierAddress address : supplierAddressList) { + if(order.getSupplierAddrId().equals(address.getId())){ + order.setAddressInfo(address); + } + } + } + for (SysUser sysUser : sysUsers) { + if(sysUser.getId().equals(order.getCheckUserId())){ + order.setCheckUserInfo(sysUser.toSysUserVo()); + break; + } + } + order.setOrderItems(orderItemMap.get(order.getId())); + } + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + OmsOrder omsOrder = omsOrderService.getById(id); + if(omsOrder.getOrderType().equals(3)&&omsOrder.getOrderCheckState().equals(OmsOrderCheckState.Commiting.getCode())){ + omsOrderOptionsService.runCompensate(omsOrder.getId()+""); + omsOrder = omsOrderService.getById(id); + } + // 关联折扣信息 + if(StringUtils.hasText(omsOrder.getOaRateId())){ + SimpleKeyValue obj = omsOrderMapper.getExpiredRateInfo(omsOrder.getOaRateId()); + omsOrder.setDiscountRateInfo(obj); + } + omsOrder.setBrandRuleInfo(goodsCategoryRuleService.getById(omsOrder.getBrandRuleId())); + omsOrder.setAddressInfo(bmsSupplierAddressService.getById(omsOrder.getSupplierAddrId())); + omsOrder.setSupplierInfo(bmsSupplierMapper.selectById(omsOrder.getSupplierId())); + if(omsOrder.getSupplierId().toString().equals(supplier.getId())){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(OmsOrderItem::getOrderId,id); + List list = omsOrderItemService.list(lqw); + + if(CollectionUtil.isNotEmpty(list)){ + omsOrderService.updateCusPrice(omsOrder.getSupplierCode(),list); + } + + for (OmsOrderItem orderItem : list) { + GoodsSpu goodsSpu = goodsSpuService.getById(orderItem.getSpuId()); + GoodsCategory goodsCategory = goodsCategoryService.getById(goodsSpu.getCategoryLast()); + orderItem.setCategoryInfo(goodsCategory); + orderItem.setSpuInfo(goodsSpu); + GoodsSku goodsSku = goodsSkuService.getById(orderItem.getSkuId()); + if(goodsSku!=null){ + orderItem.setSkuSpecialFlag(goodsSku.getSpecialFlag()); + orderItem.setSkuBelong(goodsSku.getBelong()); + orderItem.setSkuAddCode(goodsSku.getSkuAddCode()); + } + if(orderItem.getSkuBatchId()!=null){ + orderItem.setBatchInfo(goodsImminentBatchMapper.selectById(orderItem.getSkuBatchId())); + } + } + omsOrder.setOrderItems(list); + return R.ok(omsOrder); + } + + return R.error(); + } + + /** + * 删除订单 + * @param id + * @return + */ + //@DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.DELETE) + public R deleteById(@PathVariable("id") String id){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + OmsOrder omsOrder = omsOrderService.getById(id); + if(omsOrder.getSupplierId().toString().equals(supplier.getId())){ + boolean result = omsOrderService.removeById(id); + return R.isTrue(result); + } + return R.error(); + } + + /** + * 创建报价单 + * @param id + * @return + */ + @PostMapping("/buildPriceOrder/{id}/{amount}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.DELETE) + public R buildPriceOrder(@PathVariable("id") String id,@PathVariable("amount") String amount){ + omsOrderService.buildPriceOrder(id,amount); + return R.ok(); + } + + /** + * 删除订单 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.DELETE) + public R deleteById(@PathVariable("id") Long id){ + OmsOrder dbOmsOrder = omsOrderService.getById(id); + if(!dbOmsOrder.getOrderCheckState().equals(OmsOrderCheckState.UnPublish.getCode())){ + return R.error("审批状态不支持删除"); + } + omsOrderService.checkMsOrderStatus(dbOmsOrder); + if(dbOmsOrder.getStatus().equals(0)&&dbOmsOrder.getCheckState().equals(0)){ + boolean result = omsOrderService.removeById(id); + return R.isTrue(result); + } + return R.error("当前状态无法删除"); + } + + /** + * 创建临期品订单 + * @param omsOrderBo + * @return + */ + @PostMapping("/createImminentOrder") + public R createImminentOrder(@RequestBody @Valid OmsOrderImminentBo omsOrderBo){ + return R.ok(omsOrderService.modifyImminentOrder(omsOrderBo)); + } + + /** + * 修改临期品的订单 + * @param param + * @return + */ + @PostMapping("/modifyImminentOrder") + public R modifyImminentOrder(@RequestBody @Valid OmsOrderImminentBo param){ + omsOrderService.modifyImminentOrder(param); + return R.ok(); + } + + + /** + * 校验sku合法性 + * @param verifySkuParam + * @return + */ + @PostMapping("/verifySku") + public R verifySku(@RequestBody OmsVerifySkuParam verifySkuParam){ + return R.ok(omsOrderPart1Service.verifySku(verifySkuParam)); + } + + /** + * 复制订单 + * @param orderId + * @return + */ + @PostMapping("/copyOrder/{orderId}") + public R copyOrder(@PathVariable Long orderId){ + return R.ok(omsOrderPart1Service.copyOrder(orderId)); + } + + + /** + * 获取临期品订单折扣率 + * @return + */ + @GetMapping("/expiredOrderRates") + public R getExpiredOrderRates(){ + return R.ok(omsOrderService.selectExpiredOrderRates()); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/api/OmsSaleOrderApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/api/OmsSaleOrderApi.java new file mode 100644 index 0000000..c63652c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/api/OmsSaleOrderApi.java @@ -0,0 +1,522 @@ +package com.qs.serve.modules.oms.controller.api; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.dto.SimpleKeyValue; +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.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.entity.dto.InventoryCusPrice; +import com.qs.serve.modules.goods.entity.so.InventoryCusPriceQuery; +import com.qs.serve.modules.goods.mapper.GoodsImminentBatchMapper; +import com.qs.serve.modules.goods.service.GoodsCategoryRuleService; +import com.qs.serve.modules.goods.service.GoodsCategoryService; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.his.service.HisUserSupplierService; +import com.qs.serve.modules.oms.common.OmsOrderCheckState; +import com.qs.serve.modules.oms.entity.OmsOrder; +import com.qs.serve.modules.oms.entity.OmsSaleOrder; +import com.qs.serve.modules.oms.entity.OmsSaleOrderItem; +import com.qs.serve.modules.oms.entity.bo.*; +import com.qs.serve.modules.oms.entity.vo.OmsConfirmOrderResult; +import com.qs.serve.modules.oms.mapper.OmsSaleOrderMapper; +import com.qs.serve.modules.oms.service.*; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.*; +import java.util.stream.Collectors; + +/** + * API订单模块 订单 + * @author YenHex + * @since 2022-10-14 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/api/saleOrder") +public class OmsSaleOrderApi { + + private BmsSupplierMapper bmsSupplierMapper; + private OmsSaleOrderService omsSaleOrderService; + private OmsSaleOrderMapper omsSaleOrderMapper; + private OmsSaleOrderItemService omsSaleOrderItemService; + private BmsSupplierAddressService bmsSupplierAddressService; + private SysUserService sysUserService; + private GoodsCategoryRuleService goodsCategoryRuleService; + private GoodsSpuService goodsSpuService; + private GoodsSkuService goodsSkuService; + private GoodsCategoryService goodsCategoryService; + private SysPostUserService postUserService; + private SeeYonRequestBaseService seeYonRequestBaseService; + private GoodsImminentBatchMapper goodsImminentBatchMapper; + private OmsSaleOrderPart1Service omsSaleOrderPart1Service; + private OmsSaleOrderOptionsService omsSaleOrderOptionsService; + private HisUserSupplierService hisUserSupplierService; + + /** + * 查询客户特殊加 + * @param query + * @return + */ + @PostMapping("queryCusPrices") + public R> queryCusPrices(@RequestBody InventoryCusPriceQuery query){ + R res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); + if(res.getStatus().equals(200)) { + List inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); + return R.ok(inventoryCusPrices); + } + return R.ok(); + } + + /** + * 传入订单ID。返回订单每一项的sku单价,在前端校验商品价格 + * @param orderId + * @return 返回错误的价格商品 + */ + @GetMapping("checkOrderPrice") + public R> checkOrderPrice(String orderId){ + List orderItemList = omsSaleOrderItemService.list(new LambdaQueryWrapper() + .eq(OmsSaleOrderItem::getOrderId,orderId)); + OmsSaleOrder order = omsSaleOrderService.getById(orderId); + String cusCode = order.getSupplierCode(); + List skuCodes = orderItemList.stream().map(OmsSaleOrderItem::getSkuCode).collect(Collectors.toList()); + InventoryCusPriceQuery query = new InventoryCusPriceQuery(); + query.setCusCode(cusCode); + query.setInvCodes(skuCodes); + R res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); + List errList = new ArrayList<>(); + if(res.getStatus().equals(200)){ + List inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); + for (InventoryCusPrice cusPrice : inventoryCusPrices) { + for (OmsSaleOrderItem orderItem : orderItemList) { + if(cusPrice.getCusCode().equals(orderItem.getSkuCode())&&cusPrice.getPrice().compareTo(cusPrice.getPrice())!=0){ + errList.add(cusPrice); + } + } + } + } + return R.ok(errList); + } + + /** + * 确认订单 + * @param confirmOrder + * @return + */ + @PostMapping("/generateConfirmOrder") + public R confirmOrder(@RequestBody @Valid OmsOrderBo confirmOrder){ + return R.ok(omsSaleOrderService.confirmOrder(confirmOrder)); + } + + /** + * 创建订单(H5) + * @param omsOrderBo + * @return + */ + @PostMapping("/createOrder") + public R createOrderPC(@RequestBody @Valid OmsOrderBo omsOrderBo){ + return R.ok(omsSaleOrderService.createOrder(omsOrderBo)); + } + + /** + * 修改草稿的订单 + * @param param + * @return + */ + @PostMapping("/modifyOrder") + public R modifyOrder(@RequestBody @Valid OmsOrderModifyParam param){ + omsSaleOrderService.modifyOrder(param); + return R.ok(); + } + + /** + * 创建订单(PC) + * @param omsOrderBo + * @return + */ + @PostMapping("/createOrderOnPC") + public R createOrder(@RequestBody @Valid OmsOrderSkuBo omsOrderBo){ + return R.ok(omsSaleOrderService.createOrderPc(omsOrderBo)); + } + + + /** + * 取消订单 + * @param omsOrderBo + * @return + */ + @PostMapping("/cancelOrder") + public R cancelOrder(@RequestBody @Valid OmsCancelOrder omsOrderBo){ + OmsSaleOrder omsOrder = omsSaleOrderService.getById(omsOrderBo.getOrderId()); + if(omsOrder.getOrderType().equals(3)){ + //临期品 + if(omsOrder.getOrderCheckState().equals(OmsOrderCheckState.Commiting.getCode())){ + //请求OA中止流程 + Assert.throwEx("审批完成后再试"); + }else if (!omsOrder.getOrderCheckState().equals(OmsOrderCheckState.Finished.getCode())){ + Assert.throwEx("审批状态不支持取消操作"); + } + } + //omsOrderService.checkMsOrderStatus(omsOrder); + if(omsOrder.getStatus().equals(0)||omsOrder.getStatus().equals(1)){ + //去执行取消 + omsSaleOrderService.cancelOrder(omsOrder.getOrderSn()); + omsOrder.setStatus(6); + omsSaleOrderService.updateById(omsOrder); + // 取消审批完成的临期品订单 + if (omsOrder.getOrderCheckState().equals(OmsOrderCheckState.Finished.getCode())){ + omsSaleOrderPart1Service.releaseInventory(omsOrder.getId()); + } + return R.ok(); + } + return R.error("取消订单失败"); + } + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(OmsSaleOrder param){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + param.setSupplierId(Long.parseLong(supplier.getId())); + + PageUtil.startPage(); + LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(param); + List list = omsSaleOrderService.list(orderWrapper); + this.buildOrderVoInfo(list); + return R.byPageHelperList(list); + } + + /** + * 翻页查询(PC,我的业务订单) + * @param param + * @return + */ + @GetMapping("/page4pc") + public R> getPage4Pc(OmsSaleOrder param){ + Set supplierIds = hisUserSupplierService.listSupplierIdByUserIds(Arrays.asList(AuthContextUtils.getSysUserId())); + supplierIds.add(0L); + PageUtil.startPage(); + LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(param); + orderWrapper.in(OmsSaleOrder::getSupplierId,supplierIds); + orderWrapper.eq(OmsSaleOrder::getOrderType,param.getOrderType()==null?0:param.getOrderType()); + orderWrapper.orderByDesc(OmsSaleOrder::getId); + orderWrapper.eq(OmsSaleOrder::getCurrentFlag,1); + if(param.getCheckStartTime()!=null){ + orderWrapper.ge(OmsSaleOrder::getCheckTime,param.getCheckStartTime().atStartOfDay()); + } + if(param.getCheckEndTime()!=null){ + orderWrapper.le(OmsSaleOrder::getCheckTime,param.getCheckEndTime().atTime(23,59,59)); + } + + List list = omsSaleOrderService.list(orderWrapper); + this.buildOrderVoInfo(list); + return R.byPageHelperList(list); + } + + private void buildOrderVoInfo(List list) { + List userIds = list.stream().map(OmsSaleOrder::getCheckUserId).collect(Collectors.toList()); + List sysUserList = new ArrayList<>(); + if(userIds.size()>0){ + sysUserList = sysUserService.listByIds(userIds); + } + + List addrIds = list.stream().map(OmsSaleOrder::getSupplierAddrId).collect(Collectors.toList()); + addrIds.add(0L); + List supplierAddressList = bmsSupplierAddressService.listByIds(addrIds); + + List orderIds = list.stream().map(OmsSaleOrder::getId).collect(Collectors.toList()); + orderIds.add(0L); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(OmsSaleOrderItem::getOrderId,orderIds); + List allItems = omsSaleOrderItemService.list(lqw); + + List> rates = omsSaleOrderMapper.selectExpiredOrderRates(); + + Map> itemsMap = allItems.stream().collect(Collectors.groupingBy(OmsSaleOrderItem::getOrderId)); + + for (OmsSaleOrder order : list) { + + if(order.getOrderType().equals(3)&&StringUtils.hasText(order.getOaRateId())){ + for (SimpleKeyValue rate : rates) { + if (rate.getValue().equals(order.getOaRateId())){ + order.setDiscountRateInfo(rate); + } + } + } + + omsSaleOrderService.checkMsOrderStatus(order); + + for (BmsSupplierAddress address : supplierAddressList) { + if(order.getSupplierAddrId().equals(address.getId())){ + order.setAddressInfo(address); + } + } + + for (SysUser user : sysUserList) { + if(user.getId().equals(order.getCheckUserId())){ + order.setCheckUserInfo(user.toSysUserVo()); + } + } + + order.setOrderItems(itemsMap.get(order.getId())); + + } + } + + /** + * 翻页查询(PC,我的业务订单) + * @param param + * @return + */ + @GetMapping("/pageUnder4pc") + public R> getPageUnder4Pc(OmsSaleOrder param){ + String loginUserId = AuthContextUtils.getSysUserId(); + List userIds = postUserService.listByChildIds(loginUserId); + userIds.add(loginUserId); + Set supplierIds = hisUserSupplierService.listSupplierIdByUserIds(userIds); + supplierIds.add(0L); + PageUtil.startPage(); + LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(param); + orderWrapper.in(OmsSaleOrder::getSupplierId,supplierIds); + orderWrapper.orderByDesc(OmsSaleOrder::getId); + List list = omsSaleOrderService.list(orderWrapper); + if(CollectionUtil.isEmpty(list)){ + return R.byEmptyList(); + } + Set addrIds = list.stream().map(OmsSaleOrder::getSupplierAddrId).filter(Objects::nonNull).collect(Collectors.toSet()); + addrIds.add(0L); + List supplierAddressList = bmsSupplierAddressService.listByIds(addrIds); + + Set checkUserIds = list.stream().map(OmsSaleOrder::getCheckUserId).filter(Objects::nonNull).collect(Collectors.toSet()); + checkUserIds.add(AuthContextUtils.getSysUserId()); + List sysUsers = sysUserService.listByIds(checkUserIds); + + Set orderIds = list.stream().map(OmsSaleOrder::getId).filter(Objects::nonNull).collect(Collectors.toSet()); + if(CollUtil.isNotEmpty(orderIds)){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(OmsSaleOrderItem::getOrderId,orderIds); + List items = omsSaleOrderItemService.list(lqw); + Map> orderItemMap = items.stream().collect(Collectors.groupingBy(OmsSaleOrderItem::getOrderId)); + for (OmsSaleOrder order : list) { + if(order.getSupplierAddrId()!=null){ + for (BmsSupplierAddress address : supplierAddressList) { + if(order.getSupplierAddrId().equals(address.getId())){ + order.setAddressInfo(address); + } + } + } + for (SysUser sysUser : sysUsers) { + if(sysUser.getId().equals(order.getCheckUserId())){ + order.setCheckUserInfo(sysUser.toSysUserVo()); + break; + } + } + order.setOrderItems(orderItemMap.get(order.getId())); + } + } + return R.byPageHelperList(list); + } + + /** + * 提交到调度的订单,退回草稿 + * @param id + * @return + */ + @GetMapping("/cancelUncheckOrder") + public R cancelOrder(String id){ + omsSaleOrderService.cancelErpOrder(id); + return R.ok(); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + OmsSaleOrder omsOrder = omsSaleOrderService.getById(id); + if(omsOrder.getOrderType().equals(3)&&omsOrder.getOrderCheckState().equals(OmsOrderCheckState.Commiting.getCode())){ + try { + omsSaleOrderOptionsService.runCompensate(omsOrder.getId()+""); + } catch (Exception e) { + e.printStackTrace(); + } + omsOrder = omsSaleOrderService.getById(id); + } + // 关联折扣信息 + if(StringUtils.hasText(omsOrder.getOaRateId())){ + SimpleKeyValue obj = omsSaleOrderMapper.getExpiredRateInfo(omsOrder.getOaRateId()); + omsOrder.setDiscountRateInfo(obj); + } + omsOrder.setBrandRuleInfo(goodsCategoryRuleService.getById(omsOrder.getBrandRuleId())); + omsOrder.setAddressInfo(bmsSupplierAddressService.getById(omsOrder.getSupplierAddrId())); + omsOrder.setSupplierInfo(bmsSupplierMapper.selectById(omsOrder.getSupplierId())); + if(StringUtils.hasText(omsOrder.getCusSaleRegionAll())){ + String value = omsOrder.getCusSaleRegionAll().replace("_null",""); + omsOrder.setCusSaleRegionAll(value); + } + if(StringUtils.hasText(omsOrder.getCusBizRegionAll())){ + String value = omsOrder.getCusBizRegionAll().replace("_null",""); + omsOrder.setCusBizRegionAll(value); + } + if(omsOrder.getSupplierId().toString().equals(supplier.getId())){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(OmsSaleOrderItem::getOrderId,id); + List list = omsSaleOrderItemService.list(lqw); + + if(CollectionUtil.isNotEmpty(list)){ + omsSaleOrderService.updateCusPrice(omsOrder.getSupplierCode(),list); + } + + for (OmsSaleOrderItem orderItem : list) { + GoodsSpu goodsSpu = goodsSpuService.getById(orderItem.getSpuId()); + GoodsCategory goodsCategory = goodsCategoryService.getById(goodsSpu.getCategoryLast()); + orderItem.setCategoryInfo(goodsCategory); + orderItem.setSpuInfo(goodsSpu); + GoodsSku goodsSku = goodsSkuService.getById(orderItem.getSkuId()); + if(goodsSku!=null){ + orderItem.setSkuSpecialFlag(goodsSku.getSpecialFlag()); + orderItem.setSkuBelong(goodsSku.getBelong()); + orderItem.setSkuAddCode(goodsSku.getSkuAddCode()); + } + if(orderItem.getSkuBatchId()!=null){ + orderItem.setBatchInfo(goodsImminentBatchMapper.selectById(orderItem.getSkuBatchId())); + } + } + omsOrder.setOrderItems(list); + return R.ok(omsOrder); + } + + return R.error(); + } + + /** + * 删除订单 + * @param id + * @return + */ + //@DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.DELETE) + public R deleteById(@PathVariable("id") String id){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + OmsSaleOrder omsOrder = omsSaleOrderService.getById(id); + if(omsOrder.getSupplierId().toString().equals(supplier.getId())){ + boolean result = omsSaleOrderService.removeById(id); + return R.isTrue(result); + } + return R.error(); + } + + /** + * 创建报价单 + * @param id + * @return + */ + @PostMapping("/buildPriceOrder/{id}/{amount}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.DELETE) + public R buildPriceOrder(@PathVariable("id") String id,@PathVariable("amount") String amount){ + omsSaleOrderService.buildPriceOrder(id,amount); + return R.ok(); + } + + /** + * 删除订单 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.DELETE) + public R deleteById(@PathVariable("id") Long id){ + OmsSaleOrder dbOmsOrder = omsSaleOrderService.getById(id); + if(!dbOmsOrder.getOrderCheckState().equals(OmsOrderCheckState.UnPublish.getCode())){ + return R.error("审批状态不支持删除"); + } + omsSaleOrderService.checkMsOrderStatus(dbOmsOrder); + if(dbOmsOrder.getStatus().equals(0)&&dbOmsOrder.getCheckState().equals(0)){ + boolean result = omsSaleOrderService.removeById(id); + return R.isTrue(result); + } + return R.error("当前状态无法删除"); + } + + /** + * 创建临期品订单 + * @param omsOrderBo + * @return + */ + @PostMapping("/createImminentOrder") + public R createImminentOrder(@RequestBody @Valid OmsOrderImminentBo omsOrderBo){ + return R.ok(omsSaleOrderService.modifyImminentOrder(omsOrderBo)); + } + + /** + * 修改临期品的订单 + * @param param + * @return + */ + @PostMapping("/modifyImminentOrder") + public R modifyImminentOrder(@RequestBody @Valid OmsOrderImminentBo param){ + omsSaleOrderService.modifyImminentOrder(param); + return R.ok(); + } + + + /** + * 校验sku合法性 + * @param verifySkuParam + * @return + */ + @PostMapping("/verifySku") + public R verifySku(@RequestBody OmsVerifySkuParam verifySkuParam){ + return R.ok(omsSaleOrderPart1Service.verifySku(verifySkuParam)); + } + + /** + * 复制订单 + * @param orderId + * @return + */ + @PostMapping("/copyOrder/{orderId}") + public R copyOrder(@PathVariable Long orderId){ + return R.ok(omsSaleOrderPart1Service.copyOrder(orderId)); + } + + + /** + * 获取临期品订单折扣率 + * @return + */ + @GetMapping("/expiredOrderRates") + public R getExpiredOrderRates(){ + return R.ok(omsSaleOrderService.selectExpiredOrderRates()); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/api/OmsShoppingCartApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/api/OmsShoppingCartApi.java new file mode 100644 index 0000000..cb3f51c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/controller/api/OmsShoppingCartApi.java @@ -0,0 +1,159 @@ +package com.qs.serve.modules.oms.controller.api; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.*; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.entity.vo.GoodsSkuSpecValueVo; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.service.GoodsSkuSpecValueService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.oms.entity.OmsShoppingCart; +import com.qs.serve.modules.oms.entity.bo.OmsShoppingCartSaveBo; +import com.qs.serve.modules.oms.entity.bo.OmsShoppingCartUpdateBo; +import com.qs.serve.modules.oms.service.OmsShoppingCartService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.wx.service.WxUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * API订单模块 购物车 + * @author YenHex + * @since 2022-10-14 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("api/shoppingCart") +public class OmsShoppingCartApi { + + private OmsShoppingCartService omsShoppingCartService; + private GoodsSkuSpecValueService goodsSkuSpecValueService; + private BmsRuleMainService bmsRuleMainService; + private GoodsSpuService goodsSpuService; + private GoodsSkuService goodsSkuService; + private WxUserService wxUserService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(OmsShoppingCart param){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + String sysUserId = AuthContextUtils.getSysUserId(); + if(sysUserId==null){ + return R.byEmptyList(); + } + LambdaQueryWrapper shoppingCartWrapper = new LambdaQueryWrapper<>(param); + shoppingCartWrapper.eq(OmsShoppingCart::getUserId,sysUserId); + shoppingCartWrapper.eq(OmsShoppingCart::getSupplierId,supplier.getId()); + PageUtil.startPage(); + List shoppingCarts = omsShoppingCartService.list(shoppingCartWrapper); + omsShoppingCartService.checkShoppingCarts(supplier,shoppingCarts,false); + return R.byPageHelperList(shoppingCarts); + } + + + /** + * 修改购物车数量 + * @param param + * @return + */ + @PostMapping("/updateQuantity") + public R updateQuantity(@RequestBody @Valid OmsShoppingCartUpdateBo param){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + OmsShoppingCart shoppingCart = omsShoppingCartService.getById(param.getCartId()); + shoppingCart.setQuantity(param.getQuantity()); + shoppingCart.setSupplierId(Long.parseLong(supplier.getId())); + omsShoppingCartService.updateById(shoppingCart); + return R.ok(); + } + + /** + * 新增购物车 + * @param param + * @return + */ + @PostMapping("/save") + public R save(@RequestBody @Valid OmsShoppingCartSaveBo param){ + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + OmsShoppingCart shoppingCart = CopierUtil.copy(param,new OmsShoppingCart()); + GoodsSku goodsSku = goodsSkuService.getById(shoppingCart.getSkuId()); + //用于修改sku + OmsShoppingCart orgShopCart = omsShoppingCartService.getOne( + new LambdaQueryWrapper() + .eq(OmsShoppingCart::getSkuCode,goodsSku.getSkuCode()) + .ne(param.getCartId()!=null,OmsShoppingCart::getId,param.getCartId()) + ,false + ); + if(orgShopCart!=null){ + orgShopCart.setQuantity(orgShopCart.getQuantity()+param.getQuantity()); + omsShoppingCartService.updateById(orgShopCart); + //移除多余 + omsShoppingCartService.remove(new LambdaQueryWrapper() + .eq(OmsShoppingCart::getSkuCode,goodsSku.getSkuCode()) + .ne(OmsShoppingCart::getId,param.getCartId())); + return R.ok(); + } + shoppingCart.setUserId(AuthContextUtils.getSysUserId()); + GoodsSpu goodsSpu = goodsSpuService.getById(goodsSku.getSpuId()); + if(!goodsSku.getEnable().equals(1)){ + return R.error("商品项["+goodsSku.getSpecInfos()+"]停用中"); + } + shoppingCart.setSpuCode(goodsSpu.getSpuCode()); + shoppingCart.setSkuCode(goodsSku.getSkuCode()); + shoppingCart.setPicUrl(goodsSku.getPicUrl()); + shoppingCart.setSpuId(goodsSku.getSpuId()); + shoppingCart.setAddPrice(goodsSku.getSalesPrice()); + shoppingCart.setSupplierId(Long.parseLong(supplier.getId())); + if(!goodsSpu.getShelf().equals(1)){ + return R.error("商品已下架"); + } + shoppingCart.setSpuName(goodsSpu.getName()); + //检验拦截 + List errSkuIds = bmsRuleMainService.checkErrSkuIds(supplier,Arrays.asList(goodsSku)); + if(errSkuIds.size()>0){ + return R.error("部分产品未授权"); + } + List skuSpecValues = goodsSkuSpecValueService.listSpecValueBySkuId(goodsSku.getId()); + String specInfo = skuSpecValues.stream().map(GoodsSkuSpecValueVo::getSpecValue).collect(Collectors.joining(";")); + shoppingCart.setSpecInfo(specInfo); + if(param.getCartId()==null){ + omsShoppingCartService.save(shoppingCart); + }else { + shoppingCart.setId(param.getCartId()); + omsShoppingCartService.updateById(shoppingCart); + } + return R.ok(); + } + + /** + * 删除购物车 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(OmsShoppingCart::getId,idsLong); + lqw.eq(OmsShoppingCart::getSupplierId,AuthContextUtils.getSupplierId()); + omsShoppingCartService.removeBatchByIds(idsLong); + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/ErpSaleOrder.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/ErpSaleOrder.java new file mode 100644 index 0000000..38d8e82 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/ErpSaleOrder.java @@ -0,0 +1,186 @@ +package com.qs.serve.modules.oms.entity; + +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.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; + +/** + * 订单 实体类 + * @author YenHex + * @since 2022-10-14 + */ +@Data +@TableName("oms_sale_order") +public class ErpSaleOrder implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 订单号 */ + @NotBlank(message = "订单号不能为空") + @Length(max = 20,message = "订单号长度不能超过20字") + @TableField(condition = SqlCondition.LIKE) + private String orderSn; + + /** 订单类型:0->普通订单;1->赠品;2->试吃品;3->临期品 */ + private Integer orderType; + + private Integer erpStatus; + + private String orderSource; + + /** 供应商ID */ + @NotNull(message = "供应商ID不能为空") + private Long supplierId; + + /** 供应商编码 */ + @NotBlank(message = "供应商编码不能为空") + @Length(max = 20,message = "供应商编码长度不能超过20字") + @TableField(condition = SqlCondition.LIKE) + private String supplierCode; + + /** 供应商名称 */ + @NotBlank(message = "供应商名称不能为空") + @Length(max = 30,message = "供应商名称长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String supplierName; + + /** 供应商收货地址id */ + @NotNull(message = "供应商收货地址id不能为空") + private Long supplierAddrId; + + /** 审核人 */ + @Length(max = 32,message = "审核人长度不能超过32字") + private String checkUserId; + + /** 审核时间 */ + @Length(max = 0,message = "审核时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime checkTime; + + /** 品牌ID */ + @NotNull(message = "品牌ID不能为空") + private Long brandRuleId; + + @TableField(condition = SqlCondition.LIKE) + private String brandRuleName; + + /** 制单人id */ + @Length(max = 32,message = "制单人id长度不能超过32字") + private String userId; + + /** 制单人名称 */ + @Length(max = 20,message = "制单人名称长度不能超过20字") + @TableField(condition = SqlCondition.LIKE) + private String userName; + + /** 制单人ERP编码 */ + @Length(max = 32,message = "制单人ERP编码长度不能超过32字") + @TableField(condition = SqlCondition.LIKE) + private String userCode; + + /** 制单人手机号 */ + @Length(max = 255,message = "制单人手机号长度不能超过255字") + private String userPhone; + + /** CD单据备注 */ + private String cdOrderRemark; + + /** 临期品订单折扣率 */ + private BigDecimal discountRate; + + /** 适配的折扣率在OA的Id */ + private String oaRateId; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** + * 拓展查询条件 + */ + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegion; + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegion2; + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegion3; + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegionAll; + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegionCodes; + @TableField(condition = SqlCondition.LIKE) + private String cusBigRegion; + @TableField(condition = SqlCondition.LIKE) + private String cusProvince; + @TableField(condition = SqlCondition.LIKE) + private String cusCity; + @TableField(condition = SqlCondition.LIKE) + private String cusArea; + @TableField(condition = SqlCondition.LIKE) + private String cusBizRegionAll; + @TableField(condition = SqlCondition.LIKE) + private String cusBizRegionCodes; + @TableField(condition = SqlCondition.LIKE) + private String allBands; + + + private Date preFinishedDate; + private Date preDeliveryDate; + private String businessType; + private String saleDept; + private String saleType; + private String closerName; + private String verifierName; + private String currency; + private Integer exchangeRate; + private String version; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/ErpSaleOrderItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/ErpSaleOrderItem.java new file mode 100644 index 0000000..4c46197 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/ErpSaleOrderItem.java @@ -0,0 +1,120 @@ +package com.qs.serve.modules.oms.entity; + +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 java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 订单明细 实体类 + * @author YenHex + * @since 2022-10-14 + */ +@Data +@TableName("oms_sale_order_item") +public class ErpSaleOrderItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 订单id */ + private Long orderId; + + /** 订单sn */ + @Length(max = 32,message = "订单sn长度不能超过32字") + private String orderSn; + + /** 商品id */ + private Long spuId; + + /** 商品编码 */ + @Length(max = 20,message = "商品编码长度不能超过20字") + private String spuCode; + + /** 商品名称 */ + @Length(max = 30,message = "商品名称长度不能超过30字") + private String spuTitle; + + private String skuTitle; + + /** skuBatchId */ + private Long skuBatchId; + + /** skuBatchCode */ + private String skuBatchCode; + + private Long skuId; + + /** sku编码 */ + @Length(max = 20,message = "sku编码长度不能超过20字") + private String skuCode; + + /** sku单位 */ + @Length(max = 20,message = "sku单位长度不能超过20字") + private String skuUnit; + + /** sku图片 */ + @Length(max = 255,message = "sku图片长度不能超过255字") + private String skuImg; + + /** 规格值 */ + @Length(max = 255,message = "规格值长度不能超过255字") + private String specValues; + + /** 数量 */ + private Integer quantity; + + /** 销售价 */ + private BigDecimal salesPrice; + + /** 客户价 */ + private BigDecimal cusPrice; + + /** 市场价 */ + private BigDecimal marketPrice; + + + private BigDecimal weight; + + private BigDecimal volume; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + private String version; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsOrder.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsOrder.java new file mode 100644 index 0000000..76c3522 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsOrder.java @@ -0,0 +1,250 @@ +package com.qs.serve.modules.oms.entity; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.io.Serializable; +import java.util.List; + +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 2022-10-14 + */ +@Data +@TableName("oms_order") +public class OmsOrder implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + private String latitudeFrom; + + /** 订单号 */ + @NotBlank(message = "订单号不能为空") + @Length(max = 20,message = "订单号长度不能超过20字") + @TableField(condition = SqlCondition.LIKE) + private String orderSn; + + /** 订单类型:0->普通订单;1->赠品;2->试吃品;3->临期品 */ + private Integer orderType; + + private String orderSource; + + /** OA审批状态,订单审批状态 */ + private Integer orderCheckState; + + /** OA审批状态,订单审批状态 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime orderCheckSubmitTime; + + /** OA审批状态,订单审批状态 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime orderCheckFinishedTime; + + private String syFormId; + + /** 供应商ID */ + @NotNull(message = "供应商ID不能为空") + private Long supplierId; + + /** 供应商编码 */ + @NotBlank(message = "供应商编码不能为空") + @Length(max = 20,message = "供应商编码长度不能超过20字") + @TableField(condition = SqlCondition.LIKE) + private String supplierCode; + + /** 供应商名称 */ + @NotBlank(message = "供应商名称不能为空") + @Length(max = 30,message = "供应商名称长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String supplierName; + + /** 供应商收货地址id */ + @NotNull(message = "供应商收货地址id不能为空") + private Long supplierAddrId; + + /** 审核状态(非OA审批) */ + @NotNull(message = "审核状态不能为空") + private Integer checkState; + + /** 审核人 */ + @Length(max = 32,message = "审核人长度不能超过32字") + private String checkUserId; + + /** 审核时间 */ + @Length(max = 0,message = "审核时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime checkTime; + + /** 品牌ID */ + @NotNull(message = "品牌ID不能为空") + private Long brandRuleId; + + @TableField(condition = SqlCondition.LIKE) + private String brandRuleName; + + /** 制单人id */ + @Length(max = 32,message = "制单人id长度不能超过32字") + private String userId; + + /** 制单人名称 */ + @Length(max = 20,message = "制单人名称长度不能超过20字") + @TableField(condition = SqlCondition.LIKE) + private String userName; + + /** 制单人ERP编码 */ + @Length(max = 32,message = "制单人ERP编码长度不能超过32字") + @TableField(condition = SqlCondition.LIKE) + private String userCode; + + /** 制单人手机号 */ + @Length(max = 255,message = "制单人手机号长度不能超过255字") + private String userPhone; + + /** 发票类型:0->普通发票;1->增值税发票; */ + private Integer billType; + + /** 是否加急 */ + private Integer urgentFlag; + + /** CD单据备注 */ + private String cdOrderRemark; + + /** 临期品订单折扣率 */ + private BigDecimal discountRate; + + /** 适配的折扣率在OA的Id */ + private String oaRateId; + + /** 订单状态 + * 0->草稿; + * 1->下单(同步到调度系统); + * 2->已确认(已生成报价单); + * 6->已取消 + **/ + private Integer status; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** + * 拓展查询条件 + */ + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegion; + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegion2; + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegion3; + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegionAll; + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegionCodes; + @TableField(condition = SqlCondition.LIKE) + private String cusBigRegion; + @TableField(condition = SqlCondition.LIKE) + private String cusProvince; + @TableField(condition = SqlCondition.LIKE) + private String cusCity; + @TableField(condition = SqlCondition.LIKE) + private String cusArea; + @TableField(condition = SqlCondition.LIKE) + private String cusBizRegionAll; + @TableField(condition = SqlCondition.LIKE) + private String cusBizRegionCodes; + @TableField(condition = SqlCondition.LIKE) + private String allBands; + + + /** 订单明细项 */ + @TableField(exist = false) + private List orderItems; + + /** 订单明细项 */ + @TableField(exist = false) + private Object addressInfo; + + /** 订单明细项 */ + @TableField(exist = false) + private Object supplierInfo; + + /** 确认订单人员 */ + @TableField(exist = false) + private Object checkUserInfo; + + /** 订单明细项 */ + @TableField(exist = false) + private Object brandRuleInfo; + + /** + * 确认订单开始时间 + */ + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate checkStartTime; + + /** + * 确认订单结束时间 + */ + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate checkEndTime; + + /** + * 折扣信息 + */ + @TableField(exist = false) + private Object discountRateInfo; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsOrderItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsOrderItem.java new file mode 100644 index 0000000..d3b4249 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsOrderItem.java @@ -0,0 +1,156 @@ +package com.qs.serve.modules.oms.entity; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.io.Serializable; +import java.util.List; + +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 2022-10-14 + */ +@Data +@TableName("oms_order_item") +public class OmsOrderItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 订单id */ + private Long orderId; + + /** 订单sn */ + @Length(max = 32,message = "订单sn长度不能超过32字") + private String orderSn; + + /** 商品id */ + private Long spuId; + + /** 商品编码 */ + @Length(max = 20,message = "商品编码长度不能超过20字") + private String spuCode; + + /** 商品名称 */ + @Length(max = 30,message = "商品名称长度不能超过30字") + private String spuTitle; + + private String skuTitle; + + /** skuBatchId */ + private Long skuBatchId; + + /** skuBatchCode */ + private String skuBatchCode; + + private Long skuId; + + /** sku编码 */ + @Length(max = 20,message = "sku编码长度不能超过20字") + private String skuCode; + + /** sku单位 */ + @Length(max = 20,message = "sku单位长度不能超过20字") + private String skuUnit; + + /** sku图片 */ + @Length(max = 255,message = "sku图片长度不能超过255字") + private String skuImg; + + /** 规格值 */ + @Length(max = 255,message = "规格值长度不能超过255字") + private String specValues; + + /** 数量 */ + private Integer quantity; + + /** 销售价 */ + private BigDecimal salesPrice; + + /** 客户价 */ + private BigDecimal cusPrice; + + /** 市场价 */ + private BigDecimal marketPrice; + + + private BigDecimal weight; + + private BigDecimal volume; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 评估数量列表 */ + @TableField(exist = false) + private List assessInfoList; + + /** Spu */ + @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; + + /** 分类 */ + @TableField(exist = false) + private Object batchInfo; + + @TableField(exist = false) + private Integer skuSpecialFlag; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsSaleOrder.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsSaleOrder.java new file mode 100644 index 0000000..fdd2678 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsSaleOrder.java @@ -0,0 +1,336 @@ +package com.qs.serve.modules.oms.entity; + +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.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; + +/** + * 订单 实体类 + * @author YenHex + * @since 2022-10-14 + */ +@Data +@TableName("oms_sale_order") +public class OmsSaleOrder implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 订单在erp的id */ + private Long orderErpId; + + /** 订单号 */ + @NotBlank(message = "订单号不能为空") + @Length(max = 20,message = "订单号长度不能超过20字") + @TableField(condition = SqlCondition.LIKE) + private String orderSn; + + /** 订单类型:0->普通订单;1->赠品;2->试吃品;3->临期品 */ + private Integer orderType; + + private String orderSource; + + private Integer erpDelStatus; + + /** OA审批状态,订单审批状态 */ + private Integer orderCheckState; + + /** + * 0-未完成;1->未核对;2->已核对;3->执行中;4->有异常;5->已删除 + * 未完成,由CMS开单过来,但为同步到ERP + * 未核对,ERP的状态 + * 已核对,ERP的状态 + * 有异常,表示开单过程中队列有异常,取消该异常重新开单成功或者删除错误的队列 + * 已删除,ERP删除的订单 + */ + private Integer orderStatusCombo; + + /** OA审批状态,订单审批状态 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime orderCheckSubmitTime; + + /** OA审批状态,订单审批状态 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime orderCheckFinishedTime; + + private String syFormId; + + /** 供应商ID */ + @NotNull(message = "供应商ID不能为空") + private Long supplierId; + + /** 供应商编码 */ + @NotBlank(message = "供应商编码不能为空") + @Length(max = 20,message = "供应商编码长度不能超过20字") + @TableField(condition = SqlCondition.LIKE) + private String supplierCode; + + /** 供应商名称 */ + @NotBlank(message = "供应商名称不能为空") + @Length(max = 30,message = "供应商名称长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String supplierName; + + /** 供应商收货地址id */ + @NotNull(message = "供应商收货地址id不能为空") + private Long supplierAddrId; + + /** 审核状态(非OA审批) */ + @NotNull(message = "审核状态不能为空") + private Integer checkState; + + /** 审核人 */ + @Length(max = 32,message = "审核人长度不能超过32字") + private String checkUserId; + + /** 审核时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime checkTime; + + /** 业务提交时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime busUserCheckTime; + + /** 品牌ID */ + @NotNull(message = "品牌ID不能为空") + private Long brandRuleId; + + @TableField(condition = SqlCondition.LIKE) + private String brandRuleName; + + /** 制单人id */ + @Length(max = 32,message = "制单人id长度不能超过32字") + private String userId; + + /** 制单人名称 */ + @Length(max = 20,message = "制单人名称长度不能超过20字") + @TableField(condition = SqlCondition.LIKE) + private String userName; + + /** 制单人ERP编码 */ + @Length(max = 32,message = "制单人ERP编码长度不能超过32字") + @TableField(condition = SqlCondition.LIKE) + private String userCode; + + /** 制单人手机号 */ + @Length(max = 255,message = "制单人手机号长度不能超过255字") + private String userPhone; + + /** 发票类型:0->普通发票;1->增值税发票; */ + private Integer billType; + + /** 是否加急 */ + private Integer urgentFlag; + + /** CD单据备注 */ + private String cdOrderRemark; + + /** 临期品订单折扣率: 如2折,discountRate = 80 */ + private BigDecimal discountRate; + + /** 适配的折扣率在OA的Id */ + private String oaRateId; + + /** 订单状态 + * 0->草稿; + * 1->已确认下单 + * 2->同步到调度系统 + * 6->已取消 + **/ + private Integer status; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** 业务确认人 */ + private String confirmUserName; + + /** 业务确认人 */ + private String confirmUserCode; + + /** 货运方式id */ + private String transportId; + /** 货运方式 */ + private String transport; + /** 海柜id */ + private String tankId; + /** 海柜名称 */ + private String tankName; + + /** + * 拓展查询条件 + */ + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegion; + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegion2; + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegion3; + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegionAll; + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegionCodes; + @TableField(condition = SqlCondition.LIKE) + private String cusBigRegion; + @TableField(condition = SqlCondition.LIKE) + private String cusProvince; + @TableField(condition = SqlCondition.LIKE) + private String cusCity; + @TableField(condition = SqlCondition.LIKE) + private String cusArea; + @TableField(condition = SqlCondition.LIKE) + private String cusBizRegionAll; + @TableField(condition = SqlCondition.LIKE) + private String cusBizRegionCodes; + @TableField(condition = SqlCondition.LIKE) + private String allBands; + + /** + * 预计完成时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate preFinishedDate; + + /** + * 预计发货时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate preDeliveryDate; + + /** + * preDeliveryState=1,不自动触发更新 + */ + private Integer preDeliveryState; + + /** 生产备注 */ + private String productionRemark; + + /** + * 预计生产日期 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate preProductionDate; + + private String businessType; + private String saleDept; + private String saleType; + private String closerName; + private String verifierName; + private String currency; + private Integer exchangeRate; + private Integer currentFlag; + private String version; + + /** + * 满足款项 + */ + private Integer satisfyPayFlag; + + /** + * 费用过单状态:0-无;1-部分;2-全部(-1 代表不选) + */ + private Integer overbillStatus; + + /** + * 折扣信息 + */ + @TableField(exist = false) + private Object discountRateInfo; + + @TableField(exist = false) + private List itemList; + + + + /** 订单明细项 */ + @TableField(exist = false) + private List orderItems; + + /** 订单明细项 */ + @TableField(exist = false) + private Object addressInfo; + + /** 订单明细项 */ + @TableField(exist = false) + private Object supplierInfo; + + /** 确认订单人员 */ + @TableField(exist = false) + private Object checkUserInfo; + + /** 订单明细项 */ + @TableField(exist = false) + private Object brandRuleInfo; + + /** + * 确认订单开始时间 + */ + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate checkStartTime; + + /** + * 确认订单结束时间 + */ + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate checkEndTime; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsSaleOrderItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsSaleOrderItem.java new file mode 100644 index 0000000..2e7aeff --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsSaleOrderItem.java @@ -0,0 +1,164 @@ +package com.qs.serve.modules.oms.entity; + +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 java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; + +/** + * 订单明细 实体类 + * @author YenHex + * @since 2022-10-14 + */ +@Data +@TableName("oms_sale_order_item") +public class OmsSaleOrderItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 订单id */ + private Long orderId; + + /** 订单sn */ + @Length(max = 32,message = "订单sn长度不能超过32字") + private String orderSn; + + /** 商品id */ + private Long spuId; + + /** 商品编码 */ + @Length(max = 20,message = "商品编码长度不能超过20字") + private String spuCode; + + /** 商品名称 */ + @Length(max = 30,message = "商品名称长度不能超过30字") + private String spuTitle; + + private String skuTitle; + + /** skuBatchId */ + private Long skuBatchId; + + /** skuBatchCode */ + private String skuBatchCode; + + private Long skuId; + + /** sku编码 */ + @Length(max = 20,message = "sku编码长度不能超过20字") + private String skuCode; + + private String skuAddCode; + + /** sku单位 */ + @Length(max = 20,message = "sku单位长度不能超过20字") + private String skuUnit; + + /** sku图片 */ + @Length(max = 255,message = "sku图片长度不能超过255字") + private String skuImg; + + /** 规格值 */ + @Length(max = 255,message = "规格值长度不能超过255字") + private String specValues; + + /** 数量 */ + private Integer quantity; + + /** 销售价 */ + private BigDecimal salesPrice; + + /** 客户价 */ + private BigDecimal cusPrice; + + /** 市场价 */ + private BigDecimal marketPrice; + + + private BigDecimal weight; + + private BigDecimal volume; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 生产备注 */ + private String productionRemark; + + /** + * 预计生产日期 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate preProductionDate; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + private String version; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 评估数量列表 */ + @TableField(exist = false) + private List assessInfoList; + + /** Spu */ + @TableField(exist = false) + private Object spuInfo; + + /** skuBelong */ + private Object skuBelong; + + /** 分类 */ + @TableField(exist = false) + private Object categoryInfo; + + /** 分类 */ + @TableField(exist = false) + private Object batchInfo; + + @TableField(exist = false) + private Integer skuSpecialFlag; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsSeaTank.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsSeaTank.java new file mode 100644 index 0000000..4b45b67 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsSeaTank.java @@ -0,0 +1,60 @@ +package com.qs.serve.modules.oms.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author YenHex + * @since 2025/3/13 + */ +@Data +public class OmsSeaTank { + + @TableId + private String id; + + private String label; + + private BigDecimal minSquare; + + private BigDecimal maxSquare; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsShoppingCart.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsShoppingCart.java new file mode 100644 index 0000000..c6e5436 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsShoppingCart.java @@ -0,0 +1,145 @@ +package com.qs.serve.modules.oms.entity; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.modules.goods.entity.vo.GoodSkuVo; +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 2022-10-14 + */ +@Data +@TableName("oms_shopping_cart") +public class OmsShoppingCart implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 下单人 */ + @NotBlank(message = "下单人不能为空") + @Length(max = 32,message = "下单人长度不能超过32字") + private String userId; + + /** 商品SPU */ + @NotBlank(message = "商品SPU不能为空") + @Length(max = 32,message = "商品SPU长度不能超过32字") + private Long spuId; + + private String spuCode; + + /** 商品SKU */ + @NotBlank(message = "商品SKU不能为空") + @Length(max = 32,message = "商品SKU长度不能超过32字") + private Long skuId; + + private String skuCode; + + /** 供应商ID */ + private Long supplierId; + + /** 数量 */ + @NotNull(message = "数量不能为空") + private Integer quantity; + + /** 加入时的spu名字 */ + @Length(max = 200,message = "加入时的spu名字长度不能超过200字") + private String spuName; + + /** 加入时价格 */ + private BigDecimal addPrice; + + /** 加入时的规格信息 */ + @Length(max = 200,message = "加入时的规格信息长度不能超过200字") + private String specInfo; + + /** 图片 */ + @Length(max = 500,message = "图片长度不能超过500字") + private String picUrl; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 异常编码 + * null -> 无异常 + * 0 -> 无异常(预警库存) + * 其它 -> 异常 + **/ + @TableField(exist = false) + private Integer errCode; + + /** 异常信息 */ + @TableField(exist = false) + private String errMessage; + + /** 客户特殊价 */ + @JsonIgnore + @TableField(exist = false) + private BigDecimal supplierSalesPrice; + + /** 异常信息 */ + @JsonIgnore + @TableField(exist = false) + private BigDecimal itemSaleAmount; + + /** 异常信息 */ + @JsonIgnore + @TableField(exist = false) + private GoodSkuVo goodSkuVo; + + @TableField(exist = false) + private BigDecimal weight; + + @TableField(exist = false) + private BigDecimal volume; + + @TableField(exist = false) + private String skuBelong; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsTransport.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsTransport.java new file mode 100644 index 0000000..5209428 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsTransport.java @@ -0,0 +1,61 @@ +package com.qs.serve.modules.oms.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author YenHex + * @since 2025/3/13 + */ +@Data +public class OmsTransport { + + @TableId + private String id; + + private String label; + + /** + * 显示海柜 + */ + private Integer showTankFlag; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsVerSaleDelivery.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsVerSaleDelivery.java new file mode 100644 index 0000000..a57fad9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsVerSaleDelivery.java @@ -0,0 +1,80 @@ +package com.qs.serve.modules.oms.entity; + +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.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 订单 实体类 + * @author YenHex + * @since 2022-10-14 + */ +@Data +@TableName("oms_ver_sale_delivery") +public class OmsVerSaleDelivery implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + private String orderSn; + + private String erpId; + + private String operatorName; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime operationTime; + + private String source; + + private LocalDateTime deliveryDate; + + private String currentVersion; + private String lastVersion; + private Integer sort; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsVerSaleOrder.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsVerSaleOrder.java new file mode 100644 index 0000000..33bb6b6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsVerSaleOrder.java @@ -0,0 +1,80 @@ +package com.qs.serve.modules.oms.entity; + +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.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 订单 实体类 + * @author YenHex + * @since 2022-10-14 + */ +@Data +@TableName("oms_ver_sale_order") +public class OmsVerSaleOrder implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + private String orderSn; + + private String erpId; + + private String operatorName; + private String operationType; + private LocalDateTime operationTime; + private String operationContext; + private String currentVersion; + private String lastVersion; + private Integer sort; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsXltOrder.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsXltOrder.java new file mode 100644 index 0000000..5fdcad6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsXltOrder.java @@ -0,0 +1,198 @@ +package com.qs.serve.modules.oms.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 2023-10-09 + */ +@Data +public class OmsXltOrder implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** + * 0->普通订单;1->赠品;2->试吃品;3->临期品 + */ + @TableField("orderType") + private Integer orderType; + + /** 订单号 */ + @NotBlank(message = "订单号不能为空") + @Length(max = 100,message = "订单号长度不能超过100字") + @TableField("dingDanHao") + private String dingDanHao; + + /** 申请日期 */ + @Length(max = 0,message = "申请日期长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField("shenQingRiQi") + private LocalDateTime shenQingRiQi; + + /** 客户编号 */ + @NotBlank(message = "客户编号不能为空") + @Length(max = 100,message = "客户编号长度不能超过100字") + @TableField("keHuBianHao") + private String keHuBianHao; + + /** 收货地址 */ + @Length(max = 100,message = "收货地址长度不能超过100字") + @TableField("shouHuoDiZhi") + private String shouHuoDiZhi; + + /** 人员编号 */ + @Length(max = 100,message = "人员编号长度不能超过100字") + @TableField("renYuanBianHao") + private String renYuanBianHao; + + /** 注意事项 */ + @TableField("zhuYiShiXian") + private String zhuYiShiXian; + + /** 写入时间 */ + @NotNull(message = "写入时间不能为空") + @Length(max = 0,message = "写入时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField("xieRuShiJian") + private LocalDateTime xieRuShiJian; + + /** 处理时间 */ + @Length(max = 0,message = "处理时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField("chuLiShiJian") + private LocalDateTime chuLiShiJian; + + /** 状态 */ + @TableField("zhuangTai") + private Integer zhuangTai; + + /** 行创建日期 */ + @Length(max = 0,message = "行创建日期长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField("rowCreateDate") + private LocalDateTime rowCreateDate; + + /** 人员姓名 */ + @Length(max = 100,message = "人员姓名长度不能超过100字") + @TableField("renYuanXingMing") + private String renYuanXingMing; + + /** 人员电话 */ + @Length(max = 100,message = "人员电话长度不能超过100字") + @TableField("renYuanDianHua") + private String renYuanDianHua; + + /** 限制纬度 */ + @Length(max = 100,message = "限制纬度长度不能超过100字") + @TableField("xianZhiWeiDu") + private String xianZhiWeiDu; + + /** 限制纬度名称 */ + @Length(max = 100,message = "限制纬度名称长度不能超过100字") + @TableField("xianZhiWeiDuMingChen") + private String xianZhiWeiDuMingChen; + + /** 状态:0未使用;1报价单;2销售订单 */ + private Integer status; + + + + /** + * 人员名称 + */ + @TableField("empName") + private String empName; + + /** + * 客户编码 + */ + @TableField("cusCode") + private String cusCode; + + /** + * 客户名称 + */ + @TableField("cusName") + private String cusName; + + /** + * 城市 + */ + @TableField("dealerCity") + private String dealerCity; + + /** + * 省份 + */ + @TableField("dealerProvince") + private String dealerProvince; + + /** + * 区域 + */ + @TableField("dealerArea") + private String dealerArea; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** 物流系统的id */ + private String tmsSysId; + + /** CD单备注(单号) */ + private String cdOrderRemark; + + private BigDecimal discountRate; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsXltOrderItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsXltOrderItem.java new file mode 100644 index 0000000..6b037fc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/OmsXltOrderItem.java @@ -0,0 +1,126 @@ +package com.qs.serve.modules.oms.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 2023-10-09 + */ +@Data +@TableName("oms_xlt_order_item") +public class OmsXltOrderItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.ASSIGN_ID) + private String id; + + /** 订单id */ + @NotBlank(message = "订单id不能为空") + @Length(max = 100,message = "订单id长度不能超过100字") + @TableField("dingDanID") + private String dingDanID; + + private String spuCode; + + /** 产品编号 */ + @Length(max = 100,message = "产品编号长度不能超过100字") + @TableField("chanPinBianHao") + private String chanPinBianHao; + + /** 产品单位 */ + @Length(max = 100,message = "产品单位长度不能超过100字") + @TableField("chanPinDanWei") + private String chanPinDanWei; + + /** 订货数量 */ + @TableField("dingHuoShuLiang") + private Integer dingHuoShuLiang; + + /** 搭赠数量 */ + @TableField("daZengShuLiang") + private BigDecimal daZengShuLiang; + + /** 产品原件 */ + @TableField("chanPinYuanJia") + private BigDecimal chanPinYuanJia; + + /** 产品现价 */ + @TableField("chanPinXianJia") + private BigDecimal chanPinXianJia; + + /** 写入时间 */ + @NotNull(message = "写入时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField("xieRuShiJian") + private LocalDateTime xieRuShiJian; + + /** 处理时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField("chuLiShiJian") + private LocalDateTime chuLiShiJian; + + /** 状态 */ + @TableField("zhuangTai") + private Integer zhuangTai; + + /** 行创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField("rowCreateDate") + private LocalDateTime rowCreateDate; + + /** 备注 */ + @TableField("beiZhu") + private String beiZhu; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/CreateOrderParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/CreateOrderParam.java new file mode 100644 index 0000000..6a7da7e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/CreateOrderParam.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.oms.entity.bo; + +import lombok.Data; + +@Data +public class CreateOrderParam{ + + /** 货运方式id */ + private String transportId; + /** 海柜id */ + private String tankId; + + /** CD单据备注 */ + private String cdOrderRemark; + + /** 发票类型:0->普通发票;1->增值税发票; */ + private Integer billType; + + /** 是否加急 */ + private Integer urgentFlag; + + /** 备注 */ + private String remark; + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsCancelOrder.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsCancelOrder.java new file mode 100644 index 0000000..f1a7d45 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsCancelOrder.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.oms.entity.bo; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/8/21 + */ +@Data +public class OmsCancelOrder { + + /** + * 取消的订单Id + */ + private String orderId; + + /** + * 取消原因 + */ + private String reason; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsCheckParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsCheckParam.java new file mode 100644 index 0000000..2b47144 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsCheckParam.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.oms.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/10/27 + */ +@Data +public class OmsCheckParam { + + /** + * 订单ID + */ + @NotNull + private Long orderId; + + /** + * 审核状态:1->通过;2->拒绝 + */ + @NotNull + private Integer checkSate; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderBo.java new file mode 100644 index 0000000..21f5154 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderBo.java @@ -0,0 +1,41 @@ +package com.qs.serve.modules.oms.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; +/** + * @author YenHex + * @since 2022/10/14 + */ +@Data +public class OmsOrderBo { + + /** 订单类型:0->普通订单; */ + @NotNull + private Integer orderType; + + private String orderSource; + + /** 立即购买或非普通订单 */ + private Long skuId; + + /** 数量(立即购买或非普通订单) */ + private Integer quantity; + + /** 品牌规则ID */ + private Long brandRuleId; + + /** CD单据备注 */ + private String cdOrderRemark; + + /** 购物车ID(购物车方式下单) */ + private List shoppingCartIds; + + /** 促销活动id列表 */ + private List promotionIds; + + /** 创建订单参数(确认订单时可不传) */ + private CreateOrderParam createOrderParam; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderImminentBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderImminentBo.java new file mode 100644 index 0000000..fce29c3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderImminentBo.java @@ -0,0 +1,65 @@ +package com.qs.serve.modules.oms.entity.bo; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author YenHex + * @since 2022/10/14 + */ +@Data +public class OmsOrderImminentBo { + + /** 编辑时必填 */ + private String id; + + private String supplierId; + + private String orderSource; + + /** SKU下单列表 */ + private List itemList; + + /** 品牌规则ID */ + private Long brandRuleId; + + /** 立刻下单标识 */ + private Integer instantFlag; + + /** 临期品订单折扣率 */ + private BigDecimal discountRate; + + /** 适配的折扣率在OA的Id */ + private String oaRateId; + + /** CD单据备注 */ + private String cdOrderRemark; + + /** 收货地址 */ + private Long addressId; + + /** 发票类型:0->普通发票;1->增值税发票; */ + private Integer billType; + + /** 是否加急 */ + private Integer urgentFlag; + + /** 备注 */ + private String remark; + + @Data + public static class ItemParam{ + + private Long batchSkuId; + + /** 数量 */ + private Integer qty; + + + private String remark; + + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderModifyParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderModifyParam.java new file mode 100644 index 0000000..a998c5a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderModifyParam.java @@ -0,0 +1,97 @@ +package com.qs.serve.modules.oms.entity.bo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.qs.serve.modules.oms.entity.OmsOrderItem; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; +/** + * @author YenHex + * @since 2023/10/8 + */ +@Data +public class OmsOrderModifyParam { + + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + private String orderSource; + + /** 订单类型:0->普通订单;1->赠品;2->试吃品 */ + private Integer orderType; + + /** 供应商收货地址id */ + private Long supplierAddrId; + + /** 品牌规则ID */ + private Long brandRuleId; + + /** 制单人id */ + private String userId; + + /** 发票类型:0->普通发票;1->增值税发票; */ + private Integer billType; + + /** 是否加急 */ + private Integer urgentFlag; + + /** 备注 */ + private String remark; + + /** 立刻下单标识 */ + private Integer instantFlag; + + /** 供应商ID */ + private Long supplierId; + + /** CD单据备注 */ + private String cdOrderRemark; + + /** + * 满足款项 + */ + private Integer satisfyPayFlag; + + /** + * 费用过单状态:0-无;1-部分;2-全部 + */ + private Integer overbillStatus; + + /** 货运方式id */ + private String transportId; + /** 海柜id */ + private String tankId; + + /** + * 明细 + */ + private List orderItems; + + + @Data + public static class OmsOrderItemModifyBo{ + + /** SpuId(PC) */ + private Long spuId; + + /** SkuId(H5) */ + private Long skuId; + + /** 数量 */ + private Integer quantity; + + private BigDecimal weight; + + private BigDecimal volume; + + private String remark; + + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderSkuBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderSkuBo.java new file mode 100644 index 0000000..0f8a506 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsOrderSkuBo.java @@ -0,0 +1,74 @@ +package com.qs.serve.modules.oms.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; + +/** + * @author YenHex + * @since 2022/10/14 + */ +@Data +public class OmsOrderSkuBo { + + /** 订单类型:0->普通订单; */ + @NotNull + private Integer orderType; + + private String orderSource; + + /** SKU下单列表 */ + private List spuParamList; + + /** 促销活动id列表 */ + private List promotionIds; + + /** 品牌规则ID */ + private Long brandRuleId; + + /** 创建订单参数(确认订单时可不传) */ + private CreateOrderParam createOrderParam; + + /** 立刻下单标识 */ + private Integer instantFlag; + + /** CD单据备注 */ + private String cdOrderRemark; + + /** 收货地址 */ + private Long addressId; + + /** + * 满足款项 + */ + private Integer satisfyPayFlag; + + /** + * 费用过单状态:0-无;1-部分;2-全部 + */ + private Integer overbillStatus; + + @Data + public static class SpuParam{ + + /** skuId */ + private Long spuId; + + private Long skuId; + + private String skuCode; + + /** 数量 */ + private Integer qty; + + private BigDecimal weight; + + private BigDecimal volume; + + private String remark; + + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsPlanParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsPlanParam.java new file mode 100644 index 0000000..4069c9e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsPlanParam.java @@ -0,0 +1,34 @@ +package com.qs.serve.modules.oms.entity.bo; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2025/1/2 + */ +@Data +public class OmsPlanParam { + + /** + * 用于更新订单 + */ + private String omsOrderId; + + private List invItemList; + + @Data + public static class InvItem{ + + private String uuid; + + private String invCode; + + private Integer qty; + + private String factory; + + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsShoppingCartSaveBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsShoppingCartSaveBo.java new file mode 100644 index 0000000..f8abfe6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsShoppingCartSaveBo.java @@ -0,0 +1,34 @@ +package com.qs.serve.modules.oms.entity.bo; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2022/10/14 + */ +@Data +public class OmsShoppingCartSaveBo { + + private Long cartId; + + /** 商品SKU */ + @NotNull(message = "商品SKU不能为空") + private Long skuId; + + /** 数量 */ + @NotNull(message = "数量不能为空") + private Integer quantity; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 加入时价格 */ + private BigDecimal addPrice; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsShoppingCartUpdateBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsShoppingCartUpdateBo.java new file mode 100644 index 0000000..0c636e6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsShoppingCartUpdateBo.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.oms.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/10/14 + */ +@Data +public class OmsShoppingCartUpdateBo { + + /** + * 购物车id + */ + @NotNull + private Long cartId; + + /** + * 数量 + */ + @Min(value = 1,message = "数量不能为空") + private Integer quantity; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsSpuAssesInfoBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsSpuAssesInfoBo.java new file mode 100644 index 0000000..3921252 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsSpuAssesInfoBo.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.oms.entity.bo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; +import java.util.List; +/** + * @author YenHex + * @since 2023/9/28 + */ +@Data +public class OmsSpuAssesInfoBo { + + /** 年 */ + private Integer yearNum; + + /** 月 */ + private Integer monthNum; + + /** 供应商ID */ + private String supplierId; + + /** spuId列表 */ + private List spuIds; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsUrgentParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsUrgentParam.java new file mode 100644 index 0000000..361b723 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsUrgentParam.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.oms.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/10/27 + */ +@Data +public class OmsUrgentParam { + + /** + * 订单ID + */ + @NotNull + private Long orderId; + + /** + * 是否加急:1->是;2->否 + */ + @NotNull + private Integer urgentSate; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsVerifySkuParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsVerifySkuParam.java new file mode 100644 index 0000000..6b11af4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OmsVerifySkuParam.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.oms.entity.bo; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/6/21 + */ +@Data +public class OmsVerifySkuParam { + + /** 供应商ID */ + private Long supplierId; + + /** skuId */ + private List skuIds; + + /** 临期品列表ID */ + private List imminentItemIds; + + /** 规则ID */ + private Long ruleId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OrderRelateQuery.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OrderRelateQuery.java new file mode 100644 index 0000000..e6defb9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/OrderRelateQuery.java @@ -0,0 +1,24 @@ +package com.qs.serve.modules.oms.entity.bo; + +import lombok.Data; + +import java.util.List; + +@Data +public class OrderRelateQuery { + + /** + 订单类型 + CmsOrder + ErpOrder + ErpQuotation + ErpDispatch + */ + String orderType; + + /** + * 订单编码 + */ + List orderCodes; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/SysFlowCancelBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/SysFlowCancelBo.java new file mode 100644 index 0000000..2db6b30 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/SysFlowCancelBo.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.oms.entity.bo; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/10/27 + */ +@Data +public class SysFlowCancelBo { + + /** + * 业务数据ID列表 + */ + List targetIds; + + /** + * 业务类型: + * 1-费用及核销 + * 2-政策 + * 3-订单 + */ + Integer targetTypeNum; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/SysFlowLeaveBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/SysFlowLeaveBo.java new file mode 100644 index 0000000..614ad8d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/SysFlowLeaveBo.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.oms.entity.bo; + +import lombok.Data; +import java.util.List; + +/** + * @author YenHex + * @since 2023/10/27 + */ +@Data +public class SysFlowLeaveBo { + + /** + * 交接人ID + */ + String userId; + + /** + * 业务数据ID列表 + */ + List targetIds; + + /** + * 业务类型: + * 1-费用及核销 + * 2-政策 + * 3-订单 + */ + Integer targetTypeNum; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/SysFlowUserBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/SysFlowUserBo.java new file mode 100644 index 0000000..66a7825 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/bo/SysFlowUserBo.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.oms.entity.bo; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/10/27 + */ +@Data +public class SysFlowUserBo { + + /** + * 离职用户 + */ + String userId; + + /** + * 继承人 + */ + String extendUserId; + + /** + * 业务类型: + * 1-费用及核销 + * 2-政策 + * 3-订单 + */ + Integer targetTypeNum; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/ErpOfferOrderParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/ErpOfferOrderParam.java new file mode 100644 index 0000000..c9527ca --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/ErpOfferOrderParam.java @@ -0,0 +1,142 @@ +package com.qs.serve.modules.oms.entity.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 报价订单参数 + * @Author YenHex + * @Date 2021/6/10 + * @Version: 1.0 + **/ +@Getter +@Setter +public class ErpOfferOrderParam { + + /** + * 单据号 + */ + @NotNull(message = "单据号不能为空") + private String code; + + /** + * 销路通订单ID + */ + @NotNull(message = "销路通订单ID不能为空") + private String empOrderId; + + /** + * 日期 + */ + private Date date; + + /** + * 销售类型 + */ + @NotNull(message = "销售类型不能为空") + private String saleTypeCode; + + /** + * 客户编码 + */ + @NotNull(message = "客户编码不能为空") + private String cusCode; + + /** + * 部门编号 + */ + @NotNull(message = "部门编号不能为空") + private String depCode; + + + /** + * 税率 + */ + private BigDecimal taxRate; + + /** + * 备注 + */ + private String remark; + + /** + * 备注 + */ + private String remark2; + + /** + * 客户帐余 + */ + private BigDecimal cusPrice; + + /** + * 未完成的发货单数量 + */ + private Integer unfinishedOrderCount; + + /** + * 存货商品列表 + */ + private List inventoryItemList; + + private String cusName; + + private String makerName; + + /** + * 存货商品 + */ + @Getter + @Setter + public static class InventoryItem{ + + /** + * 销路通明细ID(不用传) + */ + private String empItemId; + + /** + * 销路通数量(不用传) + */ + private Long empQty; + + /** + * 存货编码 + */ + @JsonProperty("InvCode") + private String invCode; + + /** + * 报价 m + * + */ + private BigDecimal offerPrice; + + /** + * 数量 + */ + private Long quantity; + + /** + * 含税单价 + */ + private BigDecimal hasRatePrice; + + /** + * 价税合计 + */ + private BigDecimal hasRateSumPrice; + + /** + * 备注 + */ + private String remark; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/OmsCalcAmount.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/OmsCalcAmount.java new file mode 100644 index 0000000..9c7e6c6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/OmsCalcAmount.java @@ -0,0 +1,36 @@ +package com.qs.serve.modules.oms.entity.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.math.BigDecimal; + +/** + * 金额相关封装 + * @author YenHex + * @since 2022-10-14 + */ +@Getter +@Setter +public class OmsCalcAmount { + + public OmsCalcAmount(){ + totalAmount = new BigDecimal(0); + promotionAmount = new BigDecimal(0); + payAmount = new BigDecimal(0); + couponAmount = new BigDecimal(0); + } + + /** 订单商品总金额(未减折扣) */ + private BigDecimal totalAmount; + + /**总优惠券(指sku总优惠)*/ + private BigDecimal couponAmount; + + /** 总促销优化金额(指活动促销价、满减、阶梯价) */ + private BigDecimal promotionAmount; + + /** 应付金额 */ + private BigDecimal payAmount; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/OmsSaleOrderChange.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/OmsSaleOrderChange.java new file mode 100644 index 0000000..e0c451d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/OmsSaleOrderChange.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.oms.entity.dto; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author YenHex + * @since 2025/2/8 + */@Data +public class OmsSaleOrderChange { + + /** 值:新增,删除,修改 */ + String optionType; + + String version; + + /** 操作人 */ + String userName; + + /** 操作时间 */ + LocalDateTime time; + + /** 备注 */ + String remark; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/OmsSpuToSkuKey.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/OmsSpuToSkuKey.java new file mode 100644 index 0000000..48d3864 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/OmsSpuToSkuKey.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.oms.entity.dto; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/10/7 + */ +@Data +public class OmsSpuToSkuKey { + + private String sourceInvCode; + /** + * 实质为spuCode + */ + private String skuCode; + + /** + * 实质为skuCode + */ + private String invCode; + + private String weight; + + private String volume; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/OmsSpuToSkuKey2.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/OmsSpuToSkuKey2.java new file mode 100644 index 0000000..9ab7049 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/OmsSpuToSkuKey2.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.oms.entity.dto; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/10/7 + */ +@Data +public class OmsSpuToSkuKey2 { + + private String sourceInvCode; + + /** + * 实质为spuCode + */ + private String skuCode; + + /** + * 实质为skuCode + */ + private String invCode; + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/SeeYonOrderItemDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/SeeYonOrderItemDTO.java new file mode 100644 index 0000000..0d0448d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/SeeYonOrderItemDTO.java @@ -0,0 +1,44 @@ +package com.qs.serve.modules.oms.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2024/8/14 + */ +@Data +public class SeeYonOrderItemDTO { + + /** + * 从表相关字段 + * 产品编号 spuCode + * 产品名称 skuTitle + * 单品编码 skuAddCode + * 单品名称 skuCode + * 临期品编号 batchCode + * 产品分类 skuCategories + * 规格 specVal + * 备注 remark + * 重量 weight + * 体积 volume + * 价格 salesPrice + * 合计价格 totalPrice + */ + private String spuCode; + private String skuTitle; + private String skuAddCode; + private String skuCode; + private String skuUnit; + private String batchCode; + private String skuCategories; + private String specVal; + private String remark; + private Integer qty; + private BigDecimal weight; + private BigDecimal volume; + private BigDecimal salesPrice; + private BigDecimal totalPrice; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/ShoppingCartsCheckResult.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/ShoppingCartsCheckResult.java new file mode 100644 index 0000000..dc46a5b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/ShoppingCartsCheckResult.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.oms.entity.dto; + +import com.qs.serve.modules.goods.entity.vo.GoodSkuVo; +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2022/10/26 + */ +@Data +public class ShoppingCartsCheckResult { + + private List goodsSkus; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/XltOrderDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/XltOrderDTO.java new file mode 100644 index 0000000..4e9ad7e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/dto/XltOrderDTO.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.oms.entity.dto; + +import com.qs.serve.modules.oms.entity.OmsOrderItem; +import com.qs.serve.modules.oms.entity.OmsXltOrder; +import com.qs.serve.modules.oms.entity.OmsXltOrderItem; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/10/17 + */ +@Data +@AllArgsConstructor +public class XltOrderDTO { + + OmsXltOrder xltOrder; + + List xltOrderItemList; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/vo/OmsConfirmOrderResult.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/vo/OmsConfirmOrderResult.java new file mode 100644 index 0000000..aeee65e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/vo/OmsConfirmOrderResult.java @@ -0,0 +1,63 @@ +package com.qs.serve.modules.oms.entity.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.goods.entity.vo.GoodSkuVo; +import com.qs.serve.modules.oms.entity.OmsShoppingCart; +import com.qs.serve.modules.oms.entity.dto.OmsCalcAmount; +import com.qs.serve.modules.oms.entity.dto.ShoppingCartsCheckResult; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; + +/** + * @author YenHex + * @since 2022/10/14 + */ +@Data +public class OmsConfirmOrderResult { + + private BmsSupplier supplier; + + private Integer orderType; + + private String orderSource; + + /** 品牌规则ID */ + private Long brandRuleId; + + /** 购物车列表 */ + private List shoppingCarts; + + /** 默认地址 */ + private BmsSupplierAddress defaultAddress; + + /** 合计信息 */ + private OmsCalcAmount amountInfo; + + @JsonIgnore + private ShoppingCartsCheckResult cartsCheckResult; + + /** 维度来源 sku、spu */ + @JsonIgnore + private String latitudeFrom; + + /** + * 满足款项 + */ + private Integer satisfyPayFlag; + + /** + * 费用过单状态:0-无;1-部分;2-全部 + */ + private Integer overbillStatus; + + /** 货运方式id */ + private String transportId; + /** 海柜id */ + private String tankId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/vo/OmsPlanResult.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/vo/OmsPlanResult.java new file mode 100644 index 0000000..9888ae8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/vo/OmsPlanResult.java @@ -0,0 +1,44 @@ +package com.qs.serve.modules.oms.entity.vo; + +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * @author YenHex + * @since 2025/1/2 + */ +@Data +public class OmsPlanResult { + + /** + * 用于更新订单 + */ + private String omsOrderId; + + private String remark; + + private Date deliveryDate; + + private List items; + + @Data + public static class InvPlanItem{ + + private String uuid; + + private String invCode; + + private String qty; + + private String factory; + + private Date deliveryDate; + + private String remark; + + + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/vo/OmsSpuAssesInfo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/vo/OmsSpuAssesInfo.java new file mode 100644 index 0000000..dff240e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/entity/vo/OmsSpuAssesInfo.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.oms.entity.vo; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/9/28 + */ +@Data +public class OmsSpuAssesInfo { + + private Long spuId; + + private Integer num; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/event/OrderCreateCacheEvent.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/event/OrderCreateCacheEvent.java new file mode 100644 index 0000000..593bee5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/event/OrderCreateCacheEvent.java @@ -0,0 +1,24 @@ +package com.qs.serve.modules.oms.event; + +import org.springframework.context.ApplicationEvent; + +/** + * 监听事件 + * @author YenHex + * @since 2024/12/17 + */ +public class OrderCreateCacheEvent extends ApplicationEvent { + + private String orderId; + + public OrderCreateCacheEvent(Object source,String orderId) { + super(source); + this.orderId = orderId; + } + + + public String getOrderId(){ + return orderId; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/listener/OrderCreateCacheListener.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/listener/OrderCreateCacheListener.java new file mode 100644 index 0000000..897a05e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/listener/OrderCreateCacheListener.java @@ -0,0 +1,43 @@ +package com.qs.serve.modules.oms.listener; + +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.oms.entity.OmsSaleOrder; +import com.qs.serve.modules.oms.event.OrderCreateCacheEvent; +import com.qs.serve.modules.oms.mapper.ErpSaleOrderItemMapper; +import com.qs.serve.modules.oms.mapper.ErpSaleOrderMapper; +import com.qs.serve.modules.oms.service.OmsSaleOrderItemService; +import com.qs.serve.modules.oms.service.OmsSaleOrderService; +import lombok.AllArgsConstructor; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +/** + * @author YenHex + * @since 2024/12/17 + */ +@Component +@AllArgsConstructor +public class OrderCreateCacheListener { + + private OmsSaleOrderService omsSaleOrderService; + private OmsSaleOrderItemService omsSaleOrderItemService; + private ErpSaleOrderMapper erpSaleOrderMapper; + private ErpSaleOrderItemMapper erpSaleOrderItemMapper; + + /** + * 监听订单创建事件,将订单信息保存到ERP系统 + * @param event 订单创建事件 + */ + @Async + @EventListener + public void handle(OrderCreateCacheEvent event) { + AuthContextUtils.setTenant("001"); + // 1.查询订单信息 + OmsSaleOrder omsSaleOrder = omsSaleOrderService.getById(event.getOrderId()); + // 3.保存到ERP订单 + omsSaleOrder.setStatus(2); + } + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/ErpSaleOrderItemMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/ErpSaleOrderItemMapper.java new file mode 100644 index 0000000..53bf7ed --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/ErpSaleOrderItemMapper.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.oms.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.oms.entity.ErpSaleOrderItem; +import com.qs.serve.modules.oms.entity.OmsSaleOrderItem; + +/** + * 订单明细 Mapper + * @author YenHex + * @date 2022-10-14 + */ +@DS("qisheng") +public interface ErpSaleOrderItemMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/ErpSaleOrderMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/ErpSaleOrderMapper.java new file mode 100644 index 0000000..98fbd0d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/ErpSaleOrderMapper.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.oms.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.modules.oms.entity.ErpSaleOrder; +import com.qs.serve.modules.oms.entity.OmsSaleOrder; +import org.apache.ibatis.annotations.Select; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 订单 Mapper + * @author YenHex + * @date 2022-10-14 + */ +@DS("qisheng") +public interface ErpSaleOrderMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsOrderItemMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsOrderItemMapper.java new file mode 100644 index 0000000..97121c1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsOrderItemMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.oms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.oms.entity.OmsOrderItem; + +/** + * 订单明细 Mapper + * @author YenHex + * @date 2022-10-14 + */ +public interface OmsOrderItemMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsOrderMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsOrderMapper.java new file mode 100644 index 0000000..f166b31 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsOrderMapper.java @@ -0,0 +1,28 @@ +package com.qs.serve.modules.oms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.modules.oms.entity.OmsOrder; +import org.apache.ibatis.annotations.Select; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 订单 Mapper + * @author YenHex + * @date 2022-10-14 + */ +public interface OmsOrderMapper extends BaseMapper { + + @Select("SELECT rate FROM `ext_expire_order_rate` where oa_id = #{oaId} and del_flag = 0 ") + BigDecimal getExpiredOrderRates(String oaId); + + @Select("SELECT oa_id as `value`,`name` as label,rate as value2 FROM `ext_expire_order_rate` where del_flag = 0 order by rate") + List> selectExpiredOrderRates(); + + @Select("SELECT oa_id as `value`,`name` as label,rate as value2 FROM `ext_expire_order_rate` where del_flag = 0 and oa_id = #{oaId} ") + SimpleKeyValue getExpiredRateInfo(String oaId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsSaleOrderItemMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsSaleOrderItemMapper.java new file mode 100644 index 0000000..8e0d332 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsSaleOrderItemMapper.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.oms.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.oms.entity.OmsSaleOrderItem; +import org.apache.ibatis.annotations.Update; + +/** + * 订单明细 Mapper + * @author YenHex + * @date 2022-10-14 + */ +public interface OmsSaleOrderItemMapper extends BaseMapper { + + @Update("update oms_sale_order_item " + + "left join goods_sku " + + "on oms_sale_order_item.sku_id = goods_sku.id " + + "set oms_sale_order_item.sku_belong = goods_sku.belong " + + "where oms_sale_order_item.sku_belong is null and goods_sku.belong is not null") + int updateItemSkuBelong(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsSaleOrderMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsSaleOrderMapper.java new file mode 100644 index 0000000..7779913 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsSaleOrderMapper.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.oms.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.modules.oms.entity.OmsSaleOrder; +import org.apache.ibatis.annotations.Select; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 订单 Mapper + * @author YenHex + * @date 2022-10-14 + */ +public interface OmsSaleOrderMapper extends BaseMapper { + + @Select("SELECT rate FROM `ext_expire_order_rate` where oa_id = #{oaId} and del_flag = 0 ") + BigDecimal getExpiredOrderRates(String oaId); + + @Select("SELECT oa_id as `value`,`name` as label,rate as value2 FROM `ext_expire_order_rate` where del_flag = 0 order by rate") + List> selectExpiredOrderRates(); + + @Select("SELECT oa_id as `value`,`name` as label,rate as value2 FROM `ext_expire_order_rate` where del_flag = 0 and oa_id = #{oaId} ") + SimpleKeyValue getExpiredRateInfo(String oaId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsSeaTankMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsSeaTankMapper.java new file mode 100644 index 0000000..fd4675c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsSeaTankMapper.java @@ -0,0 +1,11 @@ +package com.qs.serve.modules.oms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.oms.entity.OmsSeaTank; + +/** + * @author YenHex + * @since 2025/3/13 + */ +public interface OmsSeaTankMapper extends BaseMapper { +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsShoppingCartMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsShoppingCartMapper.java new file mode 100644 index 0000000..efd2d6e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsShoppingCartMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.oms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.oms.entity.OmsShoppingCart; + +/** + * 购物车 Mapper + * @author YenHex + * @date 2022-10-14 + */ +public interface OmsShoppingCartMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsTransportMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsTransportMapper.java new file mode 100644 index 0000000..6300bc8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsTransportMapper.java @@ -0,0 +1,12 @@ +package com.qs.serve.modules.oms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.oms.entity.OmsSeaTank; +import com.qs.serve.modules.oms.entity.OmsTransport; + +/** + * @author YenHex + * @since 2025/3/13 + */ +public interface OmsTransportMapper extends BaseMapper { +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsVerSaleDeliveryMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsVerSaleDeliveryMapper.java new file mode 100644 index 0000000..24f96a5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsVerSaleDeliveryMapper.java @@ -0,0 +1,15 @@ +package com.qs.serve.modules.oms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.oms.entity.OmsVerSaleDelivery; +import org.apache.ibatis.annotations.Select; + +/** + * 订单 Mapper + * @author YenHex + * @date 2022-10-14 + */ +public interface OmsVerSaleDeliveryMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsVerSaleOrderMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsVerSaleOrderMapper.java new file mode 100644 index 0000000..a4d613e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/mapper/OmsVerSaleOrderMapper.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.oms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.oms.entity.OmsVerSaleOrder; +import org.apache.ibatis.annotations.Select; + +/** + * 订单 Mapper + * @author YenHex + * @date 2022-10-14 + */ +public interface OmsVerSaleOrderMapper extends BaseMapper { + + @Select("select * from oms_ver_sale_order where order_sn = #{orderSn} order by id desc limit 1") + OmsVerSaleOrder getLastVersionByOrderSn(String orderSn); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsOrderItemService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsOrderItemService.java new file mode 100644 index 0000000..13fbfda --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsOrderItemService.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.oms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.oms.entity.OmsOrderItem; + +import java.util.List; + +/** + * 订单明细 服务接口 + * @author YenHex + * @date 2022-10-14 + */ +public interface OmsOrderItemService extends IService { + + List listByOrderId(Long orderId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsOrderOptionsService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsOrderOptionsService.java new file mode 100644 index 0000000..5f95b63 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsOrderOptionsService.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.oms.service; + +import com.qs.serve.modules.oms.entity.OmsOrder; +import com.qs.serve.modules.seeyon.service.SeeYonOperationService; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/8/12 + */ +public interface OmsOrderOptionsService extends SeeYonOperationService { + + /** + * 提交临期品订单 + * @param orderId + * @return + */ + Object submitExpiredOrder(String orderId); + + /** + * 定时同步通过审核的订单到ERP + */ + void syncToErp(); + + void syncToErp11DB(List omsOrders); +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsOrderPart1Service.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsOrderPart1Service.java new file mode 100644 index 0000000..1472b13 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsOrderPart1Service.java @@ -0,0 +1,37 @@ +package com.qs.serve.modules.oms.service; + +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.modules.oms.entity.OmsOrder; +import com.qs.serve.modules.oms.entity.bo.OmsVerifySkuParam; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/6/21 + */ +public interface OmsOrderPart1Service { + + + /** + * 复制订单 + * @param orderId + * @return + */ + OmsOrder copyOrder(Long orderId); + + /** + * 释放临期品库存 + * @param orderId + * @return + */ + boolean releaseInventory(Long orderId); + + /** + * 校验sku合法性 + * @param param + * @return + */ + List verifySku(OmsVerifySkuParam param); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsOrderService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsOrderService.java new file mode 100644 index 0000000..b970c62 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsOrderService.java @@ -0,0 +1,130 @@ +package com.qs.serve.modules.oms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.goods.entity.GoodsCategoryRule; +import com.qs.serve.modules.oms.entity.OmsOrder; +import com.qs.serve.modules.oms.entity.OmsOrderItem; +import com.qs.serve.modules.oms.entity.bo.*; +import com.qs.serve.modules.oms.entity.vo.OmsConfirmOrderResult; +import com.qs.serve.modules.oms.entity.vo.OmsSpuAssesInfo; +import com.qs.serve.modules.sys.entity.SysUser; + +import java.math.BigDecimal; +import java.util.List; +/** + * 订单 服务接口 + * @author YenHex + * @date 2022-10-14 + */ +public interface OmsOrderService extends IService { + + BigDecimal getExpiredOrderRateById(String oaId); + + List> selectExpiredOrderRates(); + + /** + * 确认订单 H5 + * @param confirmOrder + * @return + */ + OmsConfirmOrderResult confirmOrder(OmsOrderBo confirmOrder); + + /** + * 确认订单 PC + * @param confirmOrder + * @return + */ + OmsConfirmOrderResult confirmOrderPc(OmsOrderSkuBo confirmOrder); + + /** + * 创建订单 H5 + * @param omsOrderBo + * @return + */ + OmsOrder createOrder(OmsOrderBo omsOrderBo); + + /** + * 修改草稿的订单 + * @param param + * @return + */ + void modifyOrder(OmsOrderModifyParam param); + + /** + * 检测订单状态 + * @param order + * @return 是否进行更新,是则说明状态1->2 + */ + boolean checkMsOrderStatus(OmsOrder order); + + boolean cancelOrder(String orderSn); + + /** + * 创建订单 PC + * @param omsOrderBo + * @return + */ + OmsOrder createOrderPc(OmsOrderSkuBo omsOrderBo); + + /** + * 获取spu预估信息 + * @param param + * @return + */ + List getSpuAssess(OmsSpuAssesInfoBo param); + + /** + * 对接调度系统,生成ERP的报价单 + * @param id + */ + void buildPriceOrder(String id,String amount); + + /** + * 临期品订单 + * @param param + * @return + */ + OmsOrder modifyImminentOrder(OmsOrderImminentBo param); + + /** + * 拦截规则 + * @param skuIds + * @param categoryRule + * @return + */ + List handleCategoryRule(List skuIds,GoodsCategoryRule categoryRule); + + + /** + * 拦截规则 + * @param categoryRule + * @param orderItems + */ + public void handleCategoryRule(GoodsCategoryRule categoryRule, List orderItems); + + /** + * 更新订单项特殊价 + * @param cusCode + * @param orderItemList + */ + public void updateCusPrice(String cusCode, List orderItemList); + + /** + * 保存到ERP + * @param omsOrder + * @param orderItemList + * @param brands + * @param supplierAddress + * @param bmsRegion + */ + public void saveToErpOrder(OmsOrder omsOrder, + List orderItemList, + String brands, + BmsSupplierAddress supplierAddress, + BmsRegion bmsRegion); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderItemService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderItemService.java new file mode 100644 index 0000000..8806e7c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderItemService.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.oms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.oms.entity.OmsSaleOrderItem; + +import java.util.List; + +/** + * 订单明细 服务接口 + * @author YenHex + * @date 2022-10-14 + */ +public interface OmsSaleOrderItemService extends IService { + + List listByOrderId(Long orderId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderOptionsService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderOptionsService.java new file mode 100644 index 0000000..87c85e0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderOptionsService.java @@ -0,0 +1,28 @@ +package com.qs.serve.modules.oms.service; + +import com.qs.serve.modules.oms.entity.OmsOrder; +import com.qs.serve.modules.oms.entity.OmsSaleOrder; +import com.qs.serve.modules.seeyon.service.SeeYonOperationService; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/8/12 + */ +public interface OmsSaleOrderOptionsService extends SeeYonOperationService { + + /** + * 提交临期品订单 + * @param orderId + * @return + */ + Object submitExpiredOrder(String orderId); + + /** + * 定时同步通过审核的订单到ERP + */ + void syncToErp(); + + void syncToErp11DB(List omsOrders); +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderPart1Service.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderPart1Service.java new file mode 100644 index 0000000..a6604a4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderPart1Service.java @@ -0,0 +1,37 @@ +package com.qs.serve.modules.oms.service; + +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.modules.oms.entity.OmsSaleOrder; +import com.qs.serve.modules.oms.entity.bo.OmsVerifySkuParam; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/6/21 + */ +public interface OmsSaleOrderPart1Service { + + + /** + * 复制订单 + * @param orderId + * @return + */ + OmsSaleOrder copyOrder(Long orderId); + + /** + * 释放临期品库存 + * @param orderId + * @return + */ + boolean releaseInventory(Long orderId); + + /** + * 校验sku合法性 + * @param param + * @return + */ + List verifySku(OmsVerifySkuParam param); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderService.java new file mode 100644 index 0000000..ee05ff5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderService.java @@ -0,0 +1,156 @@ +package com.qs.serve.modules.oms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.goods.entity.GoodsCategoryRule; +import com.qs.serve.modules.oms.entity.OmsOrder; +import com.qs.serve.modules.oms.entity.OmsOrderItem; +import com.qs.serve.modules.oms.entity.OmsSaleOrder; +import com.qs.serve.modules.oms.entity.OmsSaleOrderItem; +import com.qs.serve.modules.oms.entity.bo.*; +import com.qs.serve.modules.oms.entity.dto.OmsSaleOrderChange; +import com.qs.serve.modules.oms.entity.vo.OmsConfirmOrderResult; +import com.qs.serve.modules.oms.entity.vo.OmsPlanResult; +import com.qs.serve.modules.oms.entity.vo.OmsSpuAssesInfo; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 订单 服务接口 + * @author YenHex + * @date 2022-10-14 + */ +public interface OmsSaleOrderService extends IService { + + /** + * 调用嘉士利提供的接口获取计划列表 + * @param param + * @return + */ + OmsPlanResult getPlanList(OmsPlanParam param); + + void flushPreDelivery(String orderId); + + BigDecimal getExpiredOrderRateById(String oaId); + + List> selectExpiredOrderRates(); + + /** + * 确认订单 H5 + * @param confirmOrder + * @return + */ + OmsConfirmOrderResult confirmOrder(OmsOrderBo confirmOrder); + + /** + * 确认订单 PC + * @param confirmOrder + * @return + */ + OmsConfirmOrderResult confirmOrderPc(OmsOrderSkuBo confirmOrder); + + /** + * 创建订单 H5 + * @param omsOrderBo + * @return + */ + OmsSaleOrder createOrder(OmsOrderBo omsOrderBo); + + /** + * 修改草稿的订单 + * @param param + * @return + */ + void modifyOrder(OmsOrderModifyParam param); + + /** + * 检测订单状态 + * @param order + * @return 是否进行更新,是则说明状态1->2 + */ + boolean checkMsOrderStatus(OmsSaleOrder order); + + boolean cancelOrder(String orderSn); + + /** + * 创建订单 PC + * @param omsOrderBo + * @return + */ + OmsSaleOrder createOrderPc(OmsOrderSkuBo omsOrderBo); + + /** + * 获取spu预估信息 + * @param param + * @return + */ + List getSpuAssess(OmsSpuAssesInfoBo param); + + /** + * 对接调度系统,生成ERP的报价单 + * @param id + */ + void buildPriceOrder(String id,String amount); + + /** + * 临期品订单 + * @param param + * @return + */ + OmsSaleOrder modifyImminentOrder(OmsOrderImminentBo param); + + /** + * 根据code查询订单 + * @param code + * @return + */ + List listHistoryOrderByCode(String code); + + + List getChangeLog(String orderCode); + + /** + * 拦截规则 + * @param skuIds + * @param categoryRule + * @return + */ + List handleCategoryRule(List skuIds,GoodsCategoryRule categoryRule); + + + /** + * 拦截规则 + * @param categoryRule + * @param orderItems + */ + public void handleCategoryRule(GoodsCategoryRule categoryRule, List orderItems); + + /** + * 更新订单项特殊价 + * @param cusCode + * @param orderItemList + */ + public void updateCusPrice(String cusCode, List orderItemList); + + /** + * 保存到ERP + * @param omsOrder + * @param orderItemList + * @param brands + * @param supplierAddress + * @param bmsRegion + */ + public void saveToErpOrder(OmsSaleOrder omsOrder, + List orderItemList, + String brands, + BmsSupplierAddress supplierAddress, + BmsRegion bmsRegion); + + + public void cancelErpOrder(String orderId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsShoppingCartService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsShoppingCartService.java new file mode 100644 index 0000000..1d2ff10 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsShoppingCartService.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.oms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.oms.entity.OmsShoppingCart; +import com.qs.serve.modules.oms.entity.dto.ShoppingCartsCheckResult; + +import java.util.List; + +/** + * 购物车 服务接口 + * @author YenHex + * @date 2022-10-14 + */ +public interface OmsShoppingCartService extends IService { + + List listByIds(List ids,String supplierId); + + + /** + * 检测购物车,并绑定sku到购物车 + * @param supplier + * @param shoppingCarts + * @param throwEx 购物车不抛异常 + * @return + */ + ShoppingCartsCheckResult checkShoppingCarts(BmsSupplier supplier, List shoppingCarts, boolean throwEx); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsVerSaleOrderService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsVerSaleOrderService.java new file mode 100644 index 0000000..e369bc0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/OmsVerSaleOrderService.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.oms.service; + +import com.baomidou.mybatisplus.extension.service.IService; + +import com.qs.serve.modules.oms.entity.OmsVerSaleOrder; + + +/** + * 订单 服务接口 + * @author YenHex + * @date 2022-10-14 + */ +public interface OmsVerSaleOrderService extends IService { + + OmsVerSaleOrder getLastVersionByOrderSn(String orderSn); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderItemServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderItemServiceImpl.java new file mode 100644 index 0000000..65424c1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderItemServiceImpl.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.oms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.oms.entity.OmsOrderItem; +import com.qs.serve.modules.oms.service.OmsOrderItemService; +import com.qs.serve.modules.oms.mapper.OmsOrderItemMapper; + +import java.util.List; + +/** + * 订单明细 服务实现类 + * @author YenHex + * @since 2022-10-14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class OmsOrderItemServiceImpl extends ServiceImpl implements OmsOrderItemService { + + @Override + public List listByOrderId(Long orderId) { + return this.list(new LambdaQueryWrapper().eq(OmsOrderItem::getOrderId,orderId)); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderOptionsServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderOptionsServiceImpl.java new file mode 100644 index 0000000..0dcec12 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderOptionsServiceImpl.java @@ -0,0 +1,469 @@ +package com.qs.serve.modules.oms.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.oa.OaFormMainProcess; +import com.qs.serve.common.util.*; +import com.qs.serve.common.util.model.DateFormatString; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; +import com.qs.serve.modules.goods.entity.*; +import com.qs.serve.modules.goods.mapper.GoodsCategoryMapper; +import com.qs.serve.modules.goods.mapper.GoodsCategoryRuleMapper; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.mapper.GoodsSpuMapper; +import com.qs.serve.modules.goods.service.GoodsImminentBatchService; +import com.qs.serve.modules.oms.common.OmsOrderCheckState; +import com.qs.serve.modules.oms.entity.OmsOrder; +import com.qs.serve.modules.oms.entity.OmsOrderItem; +import com.qs.serve.modules.oms.entity.dto.SeeYonOrderItemDTO; +import com.qs.serve.modules.oms.mapper.OmsOrderMapper; +import com.qs.serve.modules.oms.service.OmsOrderItemService; +import com.qs.serve.modules.oms.service.OmsOrderOptionsService; +import com.qs.serve.modules.oms.service.OmsOrderPart1Service; +import com.qs.serve.modules.oms.service.OmsOrderService; +import com.qs.serve.modules.oms.utils.OmsOrderUtil; +import com.qs.serve.modules.seeyon.entity.BaseCreateCallbackBo; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tag.mapper.TagInfoMapper; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 订单审批操作类 + * @author YenHex + * @since 2024/8/12 + */ +@Slf4j +@Service +@AllArgsConstructor +public class OmsOrderOptionsServiceImpl implements OmsOrderOptionsService { + + private final GoodsImminentBatchService goodsImminentBatchService; + private final OmsOrderService omsOrderService; + private final OmsOrderPart1Service omsOrderPart1Service; + private final OmsOrderItemService omsOrderItemService; + private final SysUserService sysUserService; + private final BmsRegionMapper regionMapper; + private final BmsRegion2Mapper region2Mapper; + + private final GoodsCategoryRuleMapper goodsCategoryRuleMapper; + private final BmsSupplierAddressService bmsSupplierAddressService; + + private final BmsSupplierMapper bmsSupplierMapper; + private final BmsRegionMapper bmsRegionMapper; + private final TagInfoMapper tagInfoMapper; + private final GoodsSkuMapper goodsSkuMapper; + private final GoodsSpuMapper goodsSpuMapper; + private final OmsOrderMapper omsOrderMapper; + private final GoodsCategoryMapper goodsCategoryMapper; + private final SeeYonRequestService seeYonService; + private final SeeYonRequestBaseService seeYonRequestBaseService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Object submitExpiredOrder(String orderId) { + OmsOrder omsOrder = omsOrderService.getById(orderId); + String userId = AuthContextUtils.getSysUserId(); + SysUser sysUser = sysUserService.getById(userId); + if (omsOrder == null) { + Assert.throwEx("订单不存在或被移除"); + } + if(!userId.equals(omsOrder.getCreateBy())){ + Assert.throwEx("越权访问被拦截了"); + } + if (!omsOrder.getUserId().equals(userId)) { + Assert.throwEx("非制单人无法下单"); + } + // 非临期品不走当前流程 + if(!omsOrder.getOrderType().equals(3)){ + Assert.throwEx("该功能只针对临期品订单"); + } + omsOrderService.checkMsOrderStatus(omsOrder); + if (!omsOrder.getOrderCheckState().equals(OmsOrderCheckState.UnPublish.getCode()) + && !omsOrder.getOrderCheckState().equals(OmsOrderCheckState.Rollback.getCode())) { + Assert.throwEx("订单状态不支持下单"); + } + List orderItemList = omsOrderItemService.listByOrderId(Long.parseLong(orderId)); + + // 加成订单项合法性 + OmsOrderUtil.checkOrderItemValues(orderItemList); + + //下单前规则拦截 + //GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(omsOrder.getBrandRuleId()); + //omsOrderService.handleCategoryRule(categoryRule, orderItemList); + + List imminentBatches = new ArrayList<>(); + if (omsOrder.getOrderType().equals(3)) { + //临期品相关拦截 + for (OmsOrderItem orderItem : orderItemList) { + if (orderItem.getSkuBatchId() == null) { + Assert.throwEx(orderItem.getSkuCode() + " 单品无效或过期"); + } + GoodsImminentBatch imminentBatch = goodsImminentBatchService.getById(orderItem.getSkuBatchId()); + if (imminentBatch == null) { + Assert.throwEx(orderItem.getSkuCode() + " 单品无效或过期"); + } + int spur = imminentBatch.getQuantity() - imminentBatch.getOrderQuantity(); + if (orderItem.getQuantity() > spur) { + Assert.throwEx(orderItem.getSkuCode() + " 单品库存不足"); + } + // 扣减库存 + imminentBatch.setOrderQuantity(imminentBatch.getOrderQuantity() + orderItem.getQuantity()); + imminentBatches.add(imminentBatch); + } + } + //客户校验 + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(omsOrder.getSupplierAddrId()); + if(supplierAddress==null){ + Assert.throwEx("客户地址为空"); + } + BmsSupplier supplier = bmsSupplierMapper.selectById(omsOrder.getSupplierId()); + if (supplier.getCdOrderFlag().equals(1) && !StringUtils.hasText(omsOrder.getCdOrderRemark())) { + Assert.throwEx("请补充CD单号"); + } + + //补充:调度系统写报价单给ERP时,要把地址ID写过去 + if (supplierAddress.getTmsSysId() == null) { + Assert.throwEx("地址缺失TmsSysId关联"); + } + + String lastRegionId = supplier.getRegionLast(); + BmsRegion bmsRegion = bmsRegionMapper.selectById(lastRegionId); + if (bmsRegion == null) { + Assert.throwEx("客户档案[" + supplier.getCode() + "]缺失销售区域数据,请联系管理员"); + } + + //更新最新的用户特殊价格 + omsOrderService.updateCusPrice(omsOrder.getSupplierCode(), orderItemList); + + BigDecimal totalOrderAmt = orderItemList.stream().map(a->a.getSalesPrice().multiply(new BigDecimal(a.getQuantity()))) + .reduce(BigDecimal.ZERO,BigDecimal::add); + + if (imminentBatches.size() > 0) { + goodsImminentBatchService.updateBatchById(imminentBatches); + } + + String templateCode = this.getTemplateCode(); + + //加载大区信息 + String saleRegionId = supplier.handleSaleRegionId(); + BmsRegion saleRegion = regionMapper.selectById(saleRegionId); + String saleBizNames = saleRegion!=null?saleRegion.getPathNames():"null_申请时未录入"; + String bizRegionId = supplier.handleBizRegionId(); + BmsRegion2 bizRegion = region2Mapper.selectById(bizRegionId); + String bizBizNames = bizRegion!=null?bizRegion.getPathNames():"null_申请时未录入"; + + Map newWayData = new HashMap<>(); + + // 构建DATA + Map mainTableData = this.buildSeeyonData(omsOrder, sysUser, supplierAddress, supplier, + totalOrderAmt, templateCode, saleBizNames, bizBizNames); + newWayData.put("formmain_2206",mainTableData); + + // 构建子表data + List itemDTOList = getSeeYonOrderItemDTOS(orderItemList); + newWayData.put("formson_2210",itemDTOList); + + OaFormMainProcess mainProcess = new OaFormMainProcess(); + mainProcess.setTargetId(orderId); + mainProcess.setUploadFiles(new ArrayList<>()); + mainProcess.setTableName("formmain_2206"); + mainProcess.setData(newWayData); + mainProcess.setTemplateCode(templateCode); + mainProcess.setUserId(sysUser.getId()); + mainProcess.setSenderLoginName(sysUser.getAccount()); + R flowIdResult = seeYonService.newCreateProcess(mainProcess); + + if(flowIdResult==null||flowIdResult.getStatus()!=200){ + assert flowIdResult != null; + Assert.throwEx("远程服务调用失败:"+flowIdResult.getMsg()); + } + if(flowIdResult.getMsg()!=null && flowIdResult.getMsg().length()>45){ + log.error(flowIdResult.getMsg()); + JSONObject object = JSON.parseObject(flowIdResult.getMsg()); + if(!object.get("code").toString().equals("0")){ + Assert.throwEx("流程发起被拦截了"); + } + } + String formId = null; + R formIdResult = seeYonService.getFormId(templateCode,omsOrder.getId()); + if(formIdResult.getStatus()==200){ + formId = formIdResult.getData(); + } + omsOrder.setSyFormId(formId); + omsOrder.setOrderCheckState(OmsOrderCheckState.Commiting.getCode()); + omsOrder.setOrderCheckSubmitTime(LocalDateTime.now()); + omsOrderService.updateById(omsOrder); + + BaseCreateCallbackBo callbackBo = new BaseCreateCallbackBo(templateCode,orderId); + seeYonService.createCallbackStatus(callbackBo); + return R.ok(); + } + + private List getSeeYonOrderItemDTOS(List orderItemList) { + List itemDTOList = orderItemList.stream().map(item->{ + SeeYonOrderItemDTO dto = new SeeYonOrderItemDTO(); + dto.setSpuCode(item.getSpuCode()); + dto.setSkuTitle(item.getSkuTitle()); + GoodsSpu goodsSpu = goodsSpuMapper.selectById(item.getSpuId()); + GoodsSku goodsSku = goodsSkuMapper.selectById(item.getSkuId()); + GoodsCategory goodsCategory = goodsCategoryMapper.selectById(goodsSpu.getCategoryLast()); + dto.setSkuAddCode(goodsSku.getSkuAddCode()); + dto.setSkuCode(item.getSkuCode()); + dto.setBatchCode(item.getSkuBatchCode()); + dto.setSkuCategories(goodsCategory.getLevelPathNames()); + dto.setSpecVal(item.getSpecValues()); + dto.setRemark(item.getRemark()); + dto.setWeight(item.getWeight()); + dto.setVolume(item.getVolume()); + dto.setQty(item.getQuantity()); + dto.setSalesPrice(item.getSalesPrice()); + dto.setTotalPrice(item.getSalesPrice().multiply(new BigDecimal(item.getQuantity()))); + return dto; + }).collect(Collectors.toList()); + return itemDTOList; + } + + @Override + public void syncToErp() { + AuthContextUtils.setTenant("001"); + List omsOrders = omsOrderService.list(new LambdaQueryWrapper() + //临期品 + .eq(OmsOrder::getOrderType,3) + //未下单 + .in(OmsOrder::getStatus,0) + //审批完成 + .eq(OmsOrder::getOrderCheckState,OmsOrderCheckState.Finished.getCode()) + ); + log.warn("临期品同步到ERP,数量:{}",omsOrders.size()); + syncToErp11DB(omsOrders); + } + + @Override + public void syncToErp11DB(List omsOrders) { + for (OmsOrder omsOrder : omsOrders) { + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(omsOrder.getSupplierAddrId()); + List orderItemList = omsOrderItemService.listByOrderId(omsOrder.getId()); + BmsSupplier supplier = bmsSupplierMapper.selectById(omsOrder.getSupplierId()); + String lastRegionId = supplier.getRegionLast(); + BmsRegion bmsRegion = bmsRegionMapper.selectById(lastRegionId); + List spuIds = orderItemList.stream().map(OmsOrderItem::getSpuId).collect(Collectors.toList()); + List goodsSpuList = goodsSpuMapper.selectBatchIds(spuIds); + List cateIds = goodsSpuList.stream().map(GoodsSpu::getCategoryLast).collect(Collectors.toList()); + List categoryList = goodsCategoryMapper.selectBatchIds(cateIds); + String bs = categoryList.stream().map(GoodsCategory::getName).collect(Collectors.joining(",")); + // 读取OA最新订单折扣 + if(omsOrder.getOrderType().equals(3)){ + R codeRs = seeYonRequestBaseService.getBase( + TbsSeeYonConst.OA_DATA_EXPIRE_ORDER_DR + omsOrder.getOrderSn() + ,"获取条款申请流水号"); + BigDecimal dr = null; + if(codeRs.getStatus()==200 && codeRs.getMsg()!=null){ + try { + String oaRateId = codeRs.getMsg().toString(); + if(oaRateId.equals(TbsSeeYonConst.OTHER_RATE_ID)){ + R codeRs2 = seeYonRequestBaseService.getBase( + TbsSeeYonConst.OA_DATA_EXPIRE_ORDER_DR2 + omsOrder.getOrderSn() + ,"获取条款申请流水号"); + if(codeRs2.getStatus()==200 && codeRs2.getMsg()!=null){ + dr = new BigDecimal(codeRs2.getData()+""); + } + }else { + dr = omsOrderMapper.getExpiredOrderRates(oaRateId); + } + omsOrder.setDiscountRate(dr); + omsOrder.setOaRateId(oaRateId); + } catch (Exception e) { + e.printStackTrace(); + } + } + if(dr==null){ + log.error("临期品订单,获取最新的折扣率失败,单号:{}",omsOrder.getOrderSn()); + continue; + } + } + // 写入到ERP中间表 + omsOrderService.saveToErpOrder(omsOrder,orderItemList,bs,supplierAddress,bmsRegion); + } + } + + /** + * 构建DATA + * @param omsOrder + * @param sysUser + * @param supplierAddress + * @param supplier + * @param totalOrderAmt + * @param templateCode + * @param saleBizNames + * @param bizBizNames + * @return + */ + private Map buildSeeyonData(OmsOrder omsOrder, SysUser sysUser, BmsSupplierAddress supplierAddress, BmsSupplier supplier, BigDecimal totalOrderAmt, String templateCode, String saleBizNames, String bizBizNames) { + Map data = new HashMap<>(); + data.put("orgId", omsOrder.getId()); + data.put("targetId", omsOrder.getId()); + data.put("targetCode", omsOrder.getOrderSn()); + data.put("applyUserCode", sysUser.getCode()); + data.put("applyUserName", sysUser.getName()); + data.put("supplierName", supplier.getName()); + data.put("supplierCode", supplier.getCode()); + data.put("exsp1", templateCode); + data.put("exsp2", bizBizNames); + data.put("exsp3", saleBizNames); + // title + data.put("exsp4", "临期订单-"+omsOrder.getOrderSn()); + //添加跳转地址业务 + String baseJumpUrl = "https://shop.gdjsl.com/pcOrder/#/"; + data.put("cmsLink",baseJumpUrl); + data.put("rowDate", DateUtils.format(LocalDateTime.now(), DateFormatString.DATE_TIME)); + data.put("rowState","00"); + //data.put("templateId", ""); + //data.put("templateName", ""); + //添加客户标签 + List tags = tagInfoMapper.lisTagsBySupplierCode(supplier.getCode()); + data.put("tags",tags); + + data.put("totalOrderAmt", totalOrderAmt); + // 解决特殊bug,整数传“.0” oa会报错 + if(totalOrderAmt.compareTo(new BigDecimal(totalOrderAmt.intValue()))==0){ + data.put("totalOrderAmt", totalOrderAmt.intValue()); + } + + data.put("cusAddr", supplierAddress.getDetail()); + data.put("cdNumber", omsOrder.getCdOrderRemark()); + data.put("remark", omsOrder.getRemark()); + data.put("mainRemark", omsOrder.getRemark()); + // 折扣率(审批时修改) + data.put("ext1", omsOrder.getOaRateId()); + if(omsOrder.getOrderType().equals(3)&&omsOrder.getDiscountRate()==null){ + Assert.throwEx("临期品订单,请确保折扣率被设置"); + } + // 申请时的总金额(审批时该金额不更新,非最终的合计金额) + data.put("ext2", + totalOrderAmt.multiply(omsOrder.getDiscountRate()) + .divide(new BigDecimal("100"),2, RoundingMode.DOWN) + ); + // 申请时的折扣率(跟ext1一样传oaid) + data.put("ext3",omsOrder.getOaRateId()); + // 新增折扣率 + data.put("ext4",omsOrder.getDiscountRate()); + // 新增折扣率 + data.put("ext6",omsOrder.getDiscountRate()); + return data; + } + + @Override + public String getSyFormIdByTargetInfo(TbsAffairCommitBo affairCommit) { + OmsOrder omsOrder = omsOrderService.getOne(new LambdaQueryWrapper() + .select(OmsOrder::getSyFormId) + .eq(OmsOrder::getId,affairCommit.getTargetId())); + return omsOrder!=null?omsOrder.getSyFormId():null; + } + + @Override + public Object doBacked(TbsAffairCommitBo param) { + OmsOrder omsOrder = omsOrderService.getById(param.getTargetId()); + omsOrder.setOrderCheckState(OmsOrderCheckState.Rollback.getCode()); + omsOrderService.updateById(omsOrder); + omsOrderPart1Service.releaseInventory(omsOrder.getId()); + return null; + } + + @Override + public Object doFinished(TbsAffairCommitBo param) { + OmsOrder omsOrder = omsOrderService.getById(param.getTargetId()); + omsOrder.setOrderCheckState(OmsOrderCheckState.Finished.getCode()); + omsOrder.setOrderCheckFinishedTime(LocalDateTime.now()); + omsOrderService.updateById(omsOrder); + return null; + } + + @Override + public Object doRefuse(TbsAffairCommitBo param) { + OmsOrder omsOrder = omsOrderService.getById(param.getTargetId()); + omsOrder.setOrderCheckState(OmsOrderCheckState.Stop.getCode()); + omsOrderService.updateById(omsOrder); + omsOrderPart1Service.releaseInventory(omsOrder.getId()); + return null; + } + + @Override + public boolean checkSyFormIdIsNotNull(String targetId) { + OmsOrder omsOrder = omsOrderService.getOne(new LambdaQueryWrapper() + .select(OmsOrder::getSyFormId) + .eq(OmsOrder::getId,targetId)); + return omsOrder!=null&&omsOrder.getSyFormId()!=null; + } + + @Override + public void doCommitBacked(String targetId) { + + } + + @Override + public Object doNext(TbsAffairCommitBo param) { + OmsOrder omsOrder = omsOrderService.getById(param.getTargetId()); + R codeRs = seeYonRequestBaseService.getBase( + TbsSeeYonConst.OA_DATA_EXPIRE_ORDER_DR + omsOrder.getOrderSn() + ,"获取条款申请流水号"); + BigDecimal dr = null; + if(codeRs.getStatus()==200 && codeRs.getMsg()!=null){ + try { + String oaRateId = codeRs.getMsg().toString(); + if(oaRateId.equals(TbsSeeYonConst.OTHER_RATE_ID)){ + R codeRs2 = seeYonRequestBaseService.getBase( + TbsSeeYonConst.OA_DATA_EXPIRE_ORDER_DR2 + omsOrder.getOrderSn() + ,"获取条款申请流水号"); + if(codeRs2.getStatus()==200 && codeRs2.getMsg()!=null){ + dr = new BigDecimal(codeRs2.getData()+""); + } + }else { + dr = omsOrderMapper.getExpiredOrderRates(oaRateId); + } + omsOrder.setDiscountRate(dr); + omsOrder.setOaRateId(oaRateId); + omsOrderMapper.updateById(omsOrder); + } catch (Exception e) { + e.printStackTrace(); + } + } + if(dr==null){ + log.error("临期品订单,获取最新的折扣率失败,单号:{}",omsOrder.getOrderSn()); + return null; + } + return null; + } + + @Override + public String getTemplateCode() { + return TbsSeeYonConst.ExpiredOrderConf.Code(); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderPart1ServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderPart1ServiceImpl.java new file mode 100644 index 0000000..41bd9df --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderPart1ServiceImpl.java @@ -0,0 +1,225 @@ +package com.qs.serve.modules.oms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.CodeGenUtil; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; +import com.qs.serve.modules.goods.entity.GoodsCategoryRule; +import com.qs.serve.modules.goods.entity.GoodsImminentBatch; +import com.qs.serve.modules.goods.entity.dto.GoodsAccrIdsDto; +import com.qs.serve.modules.goods.mapper.GoodsCategoryRuleMapper; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.service.*; +import com.qs.serve.modules.oms.common.OmsOrderCheckState; +import com.qs.serve.modules.oms.entity.OmsOrder; +import com.qs.serve.modules.oms.entity.OmsOrderItem; +import com.qs.serve.modules.oms.entity.bo.OmsVerifySkuParam; +import com.qs.serve.modules.oms.service.OmsOrderItemService; +import com.qs.serve.modules.oms.service.OmsOrderPart1Service; +import com.qs.serve.modules.oms.service.OmsOrderService; +import com.qs.serve.modules.sale.mapper.SalePlanGoodsMapper; +import com.qs.serve.modules.sale.mapper.SalePlanMapper; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysDeptService; +import com.qs.serve.modules.sys.service.SysUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2024/6/21 + */ +@Slf4j +@Service +@AllArgsConstructor +public class OmsOrderPart1ServiceImpl implements OmsOrderPart1Service { + + private SysUserService sysUserService; + private SysDeptService sysDeptService; + private SalePlanMapper salePlanMapper; + private SalePlanGoodsMapper salePlanGoodsMapper; + + private OmsOrderService omsOrderService; + private OmsOrderItemService omsOrderItemService; + + private GoodsRuleService goodsRuleService; + private GoodsAccreditService goodsAccreditService; + private GoodsImminentBatchService goodsImminentBatchService; + private GoodsSkuMapper goodsSkuMapper; + private GoodsSkuService goodsSkuService; + private GoodsSpuService goodsSpuService; + private GoodsCategoryRuleMapper goodsCategoryRuleMapper; + private GoodsCustomerPriceService goodsCustomerPriceService; + + private BmsSupplierMapper bmsSupplierMapper; + private BmsRegionMapper bmsRegionMapper; + private BmsSupplierAddressService bmsSupplierAddressService; + + private SeeYonRequestBaseService seeYonRequestBaseService; + private RedisService redisService; + + @Override + public OmsOrder copyOrder(Long orderId) { + OmsOrder orgOrder = omsOrderService.getById(orderId); + List orderItems = omsOrderItemService.list(new LambdaQueryWrapper() + .eq(OmsOrderItem::getOrderId, orderId)); + OmsOrder order = new OmsOrder(); + order.setId(null); + order.setOrderType(orgOrder.getOrderType()); + String orderPrefix = null; + if (order.getOrderType().equals(0)) { + orderPrefix = "SN"; + } else if (order.getOrderType().equals(1)) { + orderPrefix = "ZP"; + } else if (order.getOrderType().equals(2)) { + orderPrefix = "SC"; + } else if (order.getOrderType().equals(3)) { + orderPrefix = "SP"; + } else { + Assert.throwEx("订单类型错误"); + } + order.setOrderSn(orderPrefix + CodeGenUtil.generate(CodeGenUtil.SourceKey.OmsOrder)); + SysUser user = sysUserService.getById(AuthContextUtils.getSysUserId()); + order.setUserId(user.getId()); + order.setUserCode(user.getCode()); + order.setUserName(user.getName()); + order.setUserPhone(user.getMobile()); + order.setCheckState(0); + order.setStatus(0); + order.setOrderCheckState(OmsOrderCheckState.UnPublish.getCode()); + order.setLatitudeFrom(orgOrder.getLatitudeFrom()); + order.setOrderSource(orgOrder.getOrderSource()); + order.setSupplierId(orgOrder.getSupplierId()); + order.setSupplierCode(orgOrder.getSupplierCode()); + order.setSupplierName(orgOrder.getSupplierName()); + order.setSupplierAddrId(orgOrder.getSupplierAddrId()); + order.setBrandRuleId(orgOrder.getBrandRuleId()); + order.setBrandRuleName(orgOrder.getBrandRuleName()); + + order.setBillType(orgOrder.getBillType()); + order.setCdOrderRemark(orgOrder.getCdOrderRemark()); + order.setRemark(orgOrder.getRemark()); + + + omsOrderService.save(order); + for (OmsOrderItem item : orderItems) { + item.setId(null); + item.setOrderId(order.getId()); + } + omsOrderItemService.saveBatch(orderItems); + return order; + } + + @Override + public boolean releaseInventory(Long orderId) { + // 释放库存 + OmsOrder omsOrder = omsOrderService.getById(orderId); + // 目前只有临期品需要释放库存 + if (omsOrder.getOrderType().equals(3)) { + List imminentBatches = new ArrayList<>(); + List orderItemList = omsOrderItemService.listByOrderId(orderId); + for (OmsOrderItem orderItem : orderItemList) { + GoodsImminentBatch imminentBatch = goodsImminentBatchService.getById(orderItem.getSkuBatchId()); + imminentBatch.setOrderQuantity(imminentBatch.getOrderQuantity() - orderItem.getQuantity()); + imminentBatches.add(imminentBatch); + } + if (imminentBatches.size() > 0) { + goodsImminentBatchService.updateBatchById(imminentBatches); + } + } + return true; + } + + @Override + public List verifySku(OmsVerifySkuParam param) { + + List errorImminentIds = new ArrayList<>(); + + LocalDate nowDate = LocalDate.now(); + boolean isImminentCheck = CollectionUtil.isNotEmpty(param.getImminentItemIds()); + List goodsImminentBatches = null; + if(isImminentCheck){ + if(CollectionUtil.isEmpty(param.getImminentItemIds())){ + return new ArrayList<>(); + } + goodsImminentBatches = goodsImminentBatchService.listByIds(param.getImminentItemIds()); + for (GoodsImminentBatch batch : goodsImminentBatches) { + if(batch.getEndDate().isBefore(nowDate)){ + errorImminentIds.add(new SimpleKeyValue("临期品已过期",batch.getId())); + } + if(batch.getQuantity()-batch.getOrderQuantity()<=0){ + errorImminentIds.add(new SimpleKeyValue("临期品库存不足",batch.getId())); + } + } + } + + List skuIds = param.getSkuIds(); + if(isImminentCheck){ + skuIds = goodsImminentBatches.stream().map(a->Long.parseLong(a.getSkuId())).collect(Collectors.toList()); + } + + GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(param.getRuleId()); + BmsSupplier supplier = bmsSupplierMapper.selectById(param.getSupplierId()); + + + List errorSkuIds = new ArrayList<>(); + //拦截商品授权维度规则 + GoodsAccrIdsDto accrIdsDto = goodsAccreditService.listIgnoreAcc2(supplier.getId(), supplier.listBizRegionIds(), supplier.listSaleRegionIds()); + if (accrIdsDto != null) { + List selectSkuIds = goodsSkuMapper.listByOtherIds( + accrIdsDto.getCateIds(), + accrIdsDto.getSpuIds(), + accrIdsDto.getSkuIds(), + accrIdsDto.getNotInCateIds(), + accrIdsDto.getNotInSpuIds(), + accrIdsDto.getNotInSkuIds() + ); + for (Long paramSkuId : skuIds) { + for (Long skuId : selectSkuIds) { + if (paramSkuId.equals(skuId)) { + errorSkuIds.add(new SimpleKeyValue("商品未授权",skuId)); + break; + } + } + } + } + + //拦截客户维度规则 + errorSkuIds.addAll(goodsRuleService.checkSkuCode( supplier.getId(),skuIds)); + //拦截客户维度的用户规则 + errorSkuIds.addAll(goodsRuleService.checkSkuCodeByUserId( AuthContextUtils.getSysUserId(),skuIds)); + + //拦截品类下单规则 + errorSkuIds.addAll(omsOrderService.handleCategoryRule(skuIds,categoryRule)); + + if(isImminentCheck){ + if(CollectionUtil.isEmpty(errorSkuIds)){ + for (SimpleKeyValue errorSkuId : errorSkuIds) { + for (GoodsImminentBatch batch : goodsImminentBatches) { + if(batch.getSkuId().equals(errorSkuId.getValue())){ + errorImminentIds.add(new SimpleKeyValue(errorSkuId.getLabel(),batch.getId())); + } + } + } + } + return errorImminentIds; + } + + return errorSkuIds; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderServiceImpl.java new file mode 100644 index 0000000..aaeb876 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderServiceImpl.java @@ -0,0 +1,1289 @@ +package com.qs.serve.modules.oms.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.bms.entity.vo.BmsSupplierExtRegionVo; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; +import com.qs.serve.modules.goods.entity.*; +import com.qs.serve.modules.goods.entity.dto.GoodsAccrIdsDto; +import com.qs.serve.modules.goods.entity.dto.InventoryCusPrice; +import com.qs.serve.modules.goods.entity.so.InventoryCusPriceQuery; +import com.qs.serve.modules.goods.entity.vo.GoodSkuVo; +import com.qs.serve.modules.goods.mapper.GoodsCategoryMapper; +import com.qs.serve.modules.goods.mapper.GoodsCategoryRuleMapper; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.service.*; +import com.qs.serve.modules.oms.common.OmsOrderCheckState; +import com.qs.serve.modules.oms.entity.*; +import com.qs.serve.modules.oms.entity.bo.*; +import com.qs.serve.modules.oms.entity.dto.OmsCalcAmount; +import com.qs.serve.modules.oms.entity.dto.ShoppingCartsCheckResult; +import com.qs.serve.modules.oms.entity.dto.XltOrderDTO; +import com.qs.serve.modules.oms.entity.vo.OmsConfirmOrderResult; +import com.qs.serve.modules.oms.entity.vo.OmsSpuAssesInfo; +import com.qs.serve.modules.oms.mapper.OmsOrderMapper; +import com.qs.serve.modules.oms.service.OmsOrderItemService; +import com.qs.serve.modules.oms.service.OmsOrderOptionsService; +import com.qs.serve.modules.oms.service.OmsOrderService; +import com.qs.serve.modules.oms.service.OmsShoppingCartService; +import com.qs.serve.modules.oms.utils.OmsOrderUtil; +import com.qs.serve.modules.sale.entity.SalePlan; +import com.qs.serve.modules.sale.entity.SalePlanGoods; +import com.qs.serve.modules.sale.mapper.SalePlanGoodsMapper; +import com.qs.serve.modules.sale.mapper.SalePlanMapper; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysDeptService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +import static com.qs.serve.modules.tbs.common.TbsSeeYonConst.*; + +/** + * 订单 服务实现类 + * + * @author YenHex + * @since 2022-10-14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class OmsOrderServiceImpl extends ServiceImpl implements OmsOrderService { + + private GoodsSkuMapper goodsSkuMapper; + private GoodsSkuService goodsSkuService; + private GoodsSpuService goodsSpuService; + private GoodsCategoryMapper goodsCategoryMapper; + private GoodsCategoryRuleMapper goodsCategoryRuleMapper; + private GoodsCustomerPriceService goodsCustomerPriceService; + + private BmsSupplierMapper bmsSupplierMapper; + private BmsRegionMapper bmsRegionMapper; + private BmsSupplierAddressService bmsSupplierAddressService; + + private SysUserService sysUserService; + private SysDeptService sysDeptService; + private SalePlanMapper salePlanMapper; + private SalePlanGoodsMapper salePlanGoodsMapper; + + private OmsOrderItemService omsOrderItemService; + private OmsShoppingCartService omsShoppingCartService; + private SeeYonRequestBaseService seeYonRequestBaseService; + private GoodsRuleService goodsRuleService; + private GoodsAccreditService goodsAccreditService; + private GoodsImminentBatchService goodsImminentBatchService; + private RedisService redisService; + + @Override + public BigDecimal getExpiredOrderRateById(String oaId) { + return baseMapper.getExpiredOrderRates(oaId); + } + + @Override + public List> selectExpiredOrderRates() { + return baseMapper.selectExpiredOrderRates(); + } + + @Override + public OmsConfirmOrderResult confirmOrder(OmsOrderBo confirmOrder) { + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + //购物车 + List shoppingCarts; + if (CollectionUtil.isNotEmpty(confirmOrder.getShoppingCartIds())) { + shoppingCarts = omsShoppingCartService.listByIds(confirmOrder.getShoppingCartIds(), supplier.getId()); + } else { + //立即购买,生成临时购物车 + GoodsSku goodsSku = goodsSkuService.getById(confirmOrder.getSkuId()); + GoodsSpu goodsSpu = goodsSpuService.getById(goodsSku.getSpuId()); + OmsShoppingCart shoppingCart = new OmsShoppingCart(); + shoppingCart.setId(0L); + shoppingCart.setSpuId(goodsSku.getSpuId()); + shoppingCart.setSkuId(confirmOrder.getSkuId()); + shoppingCart.setSpuCode(goodsSpu.getSpuCode()); + shoppingCart.setSpuName(goodsSpu.getName()); + shoppingCart.setSkuCode(goodsSku.getSkuCode()); + shoppingCart.setQuantity(confirmOrder.getQuantity()); + shoppingCart.setSpecInfo(goodsSku.getSpecInfos()); + shoppingCart.setPicUrl(goodsSku.getPicUrl()); + shoppingCarts = Arrays.asList(shoppingCart); + } + ShoppingCartsCheckResult cartsCheckResult = omsShoppingCartService.checkShoppingCarts(supplier, shoppingCarts, true); + OmsCalcAmount calcAmount = new OmsCalcAmount(); + BigDecimal totalAmount = BigDecimal.ZERO; + for (OmsShoppingCart shoppingCart : shoppingCarts) { + GoodSkuVo goodSkuVo = shoppingCart.getGoodSkuVo(); + //客户特殊价 + BigDecimal salePrice = goodSkuVo.getSalesPrice(); + shoppingCart.setSupplierSalesPrice(salePrice); + + BigDecimal itemPrice = new BigDecimal(shoppingCart.getQuantity()).multiply(salePrice); + shoppingCart.setItemSaleAmount(itemPrice); + totalAmount.add(itemPrice); + } + calcAmount.setTotalAmount(totalAmount); + // 计算供应商折扣 + // 计算是否有活动优惠 + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getDefault(Long.parseLong(supplier.getId())); + OmsConfirmOrderResult confirmOrderResult = new OmsConfirmOrderResult(); + confirmOrderResult.setSupplier(supplier); + confirmOrderResult.setOrderType(confirmOrder.getOrderType()); + confirmOrderResult.setOrderSource(confirmOrder.getOrderSource()); + confirmOrderResult.setShoppingCarts(shoppingCarts); + confirmOrderResult.setDefaultAddress(supplierAddress); + confirmOrderResult.setAmountInfo(calcAmount); + confirmOrderResult.setCartsCheckResult(cartsCheckResult); + return confirmOrderResult; + } + + @Override + public OmsConfirmOrderResult confirmOrderPc(OmsOrderSkuBo confirmOrder) { + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + //构建Sku + List spuIds = confirmOrder.getSpuParamList().stream() + .map(OmsOrderSkuBo.SpuParam::getSpuId).collect(Collectors.toList()); + //构建Sku + List skuIds = confirmOrder.getSpuParamList().stream() + .map(OmsOrderSkuBo.SpuParam::getSkuId).collect(Collectors.toList()); + //防止空指针 + spuIds.add(0L); + skuIds.add(0L); + List spuList = goodsSpuService.listByIds(spuIds); + List skuList = goodsSkuService.listByIds(skuIds); + + //通过当前函数获取当前账套对于的skuID,默认全部转化为开平(001)的sku +// Map goodsSpuMap = new HashMap<>(spuList.size()); +// for (GoodsSpu goodsSpu : spuList) { +// goodsSpuMap.put(goodsSpu.getId(),goodsSpu); +// } +// List spuCodeList = spuList.stream().map(GoodsSpu::getSpuCode).collect(Collectors.toList()); +// List spuToSkuKeys = goodsSpuService.getSpuToSkuInfo(GoodsConst.DEFAULT_PlaCE,spuCodeList); +// Map spuGetSkuMap = new HashMap<>(spuToSkuKeys.size()); +// for (OmsSpuToSkuKey toSkuKey : spuToSkuKeys) { +// spuGetSkuMap.put(toSkuKey.getSkuCode(),toSkuKey.getInvCode()); +// } + + //构建临时购物车列表 + List shoppingCartList = new ArrayList<>(); + + for (GoodsSku goodsSku : skuList) { + GoodsSpu goodsSpu = null; + for (GoodsSpu spu : spuList) { + if (goodsSku.getSpuId().equals(spu.getId())) { + goodsSpu = spu; + } + } + if (goodsSku == null) { + Assert.throwEx("商品档案有更新,请刷新页面再试"); + } + OmsShoppingCart shoppingCart = new OmsShoppingCart(); + shoppingCart.setSpuId(goodsSpu.getId()); + shoppingCart.setSpuCode(goodsSpu.getSpuCode()); + int qty = 1; + for (OmsOrderSkuBo.SpuParam spuParam : confirmOrder.getSpuParamList()) { + if (spuParam.getSkuId() != null && goodsSku.getId().equals(spuParam.getSkuId())) { + if (spuParam.getQty() != null) { + qty = spuParam.getQty(); + } + shoppingCart.setVolume(spuParam.getVolume()); + shoppingCart.setWeight(spuParam.getWeight()); + shoppingCart.setRemark(spuParam.getRemark()); + break; + } + } + shoppingCart.setQuantity(qty); + shoppingCart.setSkuId(goodsSku.getId()); + shoppingCart.setSkuCode(goodsSku.getSkuCode()); + shoppingCart.setSpecInfo(goodsSku.getSpecInfos()); + shoppingCart.setAddPrice(goodsSku.getSalesPrice()); + shoppingCartList.add(shoppingCart); + } + + //计算合计 + OmsCalcAmount calcAmount = new OmsCalcAmount(); + calcAmount.setTotalAmount(BigDecimal.ZERO); + + // 计算供应商折扣 + // 计算是否有活动优惠 + //收货地址 + BmsSupplierAddress supplierAddress = null; + if (confirmOrder.getAddressId() == null) { + //supplierAddress = bmsSupplierAddressService.getDefault(Long.parseLong(supplier.getId())); + } else if (confirmOrder.getAddressId().equals(0L)) { + supplierAddress = new BmsSupplierAddress(); + supplierAddress.setId(0L); + } else { + supplierAddress = bmsSupplierAddressService.getById(confirmOrder.getAddressId()); + } + OmsConfirmOrderResult confirmOrderResult = new OmsConfirmOrderResult(); + confirmOrderResult.setSupplier(supplier); + confirmOrderResult.setDefaultAddress(supplierAddress); + confirmOrderResult.setAmountInfo(calcAmount); + confirmOrderResult.setShoppingCarts(shoppingCartList); + confirmOrderResult.setOrderType(confirmOrder.getOrderType()); + confirmOrderResult.setBrandRuleId(confirmOrder.getBrandRuleId()); + return confirmOrderResult; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void modifyOrder(OmsOrderModifyParam param) { + OmsOrder order = super.getById(param.getId()); + if (!order.getStatus().equals(0)) { + Assert.throwEx("非草稿状态无法修改"); + } + if (order.getOrderType().equals(3)) { + Assert.throwEx("临期品订单不支持该接口修改"); + } + order.setId(param.getId()); + order.setOrderType(param.getOrderType()); + order.setOrderSource(param.getOrderSource()); + order.setSupplierAddrId(param.getSupplierAddrId()); + GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(param.getBrandRuleId()); + order.setBrandRuleId(param.getBrandRuleId()); + if (categoryRule != null) { + order.setBrandRuleName(categoryRule.getLabel()); + } + BmsSupplier supplier = null; + if (param.getSupplierId() != null) { + supplier = bmsSupplierMapper.selectById(param.getSupplierId()); + order.setSupplierId(param.getSupplierId()); + order.setSupplierName(supplier.getSupplierName()); + order.setSupplierCode(supplier.getSupplierCode()); + this.appendCusRegion(supplier, order); + } + order.setCdOrderRemark(param.getCdOrderRemark()); + //if(StringUtils.hasText(param.getUserId())){ +// SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); +// order.setUserId(param.getUserId()); +// order.setUserPhone(sysUser.getMobile()); +// order.setUserCode(sysUser.getCode()); + //} + order.setBillType(param.getBillType()); + order.setUrgentFlag(param.getUrgentFlag()); + order.setRemark(param.getRemark()); + + //通过当前函数获取当前账套对于的skuID,默认全部转化为开平(001)的sku + List spuIds = param.getOrderItems().stream().map(OmsOrderModifyParam.OmsOrderItemModifyBo::getSpuId).collect(Collectors.toList()); + spuIds.add(0L);//兼容空订单,防止空指针 + this.appendBrandCategory(order, spuIds); + List spuList = goodsSpuService.listByIds(spuIds); + Map goodsSpuMap = new HashMap<>(spuList.size()); + for (GoodsSpu goodsSpu : spuList) { + goodsSpuMap.put(goodsSpu.getId(), goodsSpu); + } + List spuCodeList = spuList.stream().map(GoodsSpu::getSpuCode).collect(Collectors.toList()); + /*List spuToSkuKeys = goodsSpuService.getSpuToSkuInfo(GoodsConst.DEFAULT_PlaCE,spuCodeList); + Map spuGetSkuMap = new HashMap<>(spuToSkuKeys.size()); + for (OmsSpuToSkuKey toSkuKey : spuToSkuKeys) { + spuGetSkuMap.put(toSkuKey.getSkuCode(),toSkuKey.getInvCode()); + }*/ + + //构建新的item + List newOrderItemList = new ArrayList<>(); + List orderModifyItems = param.getOrderItems(); + for (OmsOrderModifyParam.OmsOrderItemModifyBo modifyItem : orderModifyItems) { + GoodsSku goodsSku = null; + GoodsSpu goodsSpu = null; + if (order.getLatitudeFrom().equals("sku")) { + //H5下单 + goodsSku = goodsSkuService.getById(modifyItem.getSkuId()); + goodsSpu = goodsSpuService.getById(goodsSku.getSpuId()); + } else { + //PC下单 + goodsSpu = goodsSpuMap.get(modifyItem.getSpuId()); + //防止切换ID + if (modifyItem.getSkuId() != null) { + goodsSku = goodsSkuService.getById(modifyItem.getSkuId()); + } else { +// String skuCode = spuGetSkuMap.get(goodsSpu.getSpuCode()); +// goodsSku = goodsSkuService.getByCode(skuCode); + Assert.throwEx("订单无货或下架了"); + } + } + OmsOrderItem orderItem = new OmsOrderItem(); + orderItem.setOrderId(order.getId()); + orderItem.setOrderSn(order.getOrderSn()); + orderItem.setSpuId(goodsSpu.getId()); + orderItem.setSpuCode(goodsSpu.getSpuCode()); + orderItem.setSpuTitle(goodsSpu.getName()); + orderItem.setWeight(modifyItem.getWeight()); + orderItem.setVolume(modifyItem.getVolume()); + orderItem.setRemark(modifyItem.getRemark()); + if (goodsSku != null) { + orderItem.setSkuId(goodsSku.getId()); + orderItem.setSkuTitle(goodsSku.getSkuName()); + orderItem.setSkuCode(goodsSku.getSkuCode()); + orderItem.setSpecValues(goodsSku.getSpecInfos()); + orderItem.setSkuUnit(goodsSku.getUnitName()); + orderItem.setSkuImg(goodsSku.getPicUrl()); + orderItem.setSalesPrice(goodsSku.getSalesPrice()); + orderItem.setCusPrice(goodsSku.getSalesPrice()); + orderItem.setMarketPrice(goodsSku.getMarketPrice()); + } else { + orderItem.setSkuId(0L); + orderItem.setSkuCode(""); + orderItem.setSkuUnit(""); + orderItem.setSkuImg(null); + orderItem.setSpecValues(goodsSpu.getName()); + orderItem.setSalesPrice(BigDecimal.ZERO); + orderItem.setCusPrice(BigDecimal.ZERO); + orderItem.setMarketPrice(BigDecimal.ZERO); + } + orderItem.setQuantity(modifyItem.getQuantity()); + newOrderItemList.add(orderItem); + } + + List skuCodes = newOrderItemList.stream().map(OmsOrderItem::getSkuCode).collect(Collectors.toList()); + + //防止空指针 + skuCodes.add("NULL"); + + //商品特殊价 + this.buildSkuSpecPrice(supplier, newOrderItemList, skuCodes); + + //拦截商品授权维度规则 + this.checkGoodsRule(supplier, newOrderItemList); + + //拦截客户维度规则 + goodsRuleService.checkSkuCode(skuCodes, supplier.getId(), true); + + //用户维度拦截 + goodsRuleService.checkSkuCodeByUserId(skuCodes,AuthContextUtils.getSysUserId(),true); + + //拦截品类下单规则 + this.handleCategoryRule(categoryRule, newOrderItemList); + + this.updateById(order); + //移除已有的ITEM + LambdaQueryWrapper rmItemLqw = new LambdaQueryWrapper<>(); + rmItemLqw.eq(OmsOrderItem::getOrderId, param.getId()); + omsOrderItemService.remove(rmItemLqw); + //重新保存item + omsOrderItemService.saveBatch(newOrderItemList); + //立即下单 + if (param.getInstantFlag() != null && param.getInstantFlag().equals(1)) { + this.buildPriceOrder(order.getId() + "", null); + } + } + + private void checkGoodsRule(BmsSupplier supplier, List newOrderItemList) { + GoodsAccrIdsDto accrIdsDto = goodsAccreditService.listIgnoreAcc2(supplier.getId(), supplier.listBizRegionIds(), supplier.listSaleRegionIds()); + if (accrIdsDto != null) { + List skuIds = goodsSkuMapper.listByOtherIds( + accrIdsDto.getCateIds(), + accrIdsDto.getSpuIds(), + accrIdsDto.getSkuIds(), + accrIdsDto.getNotInCateIds(), + accrIdsDto.getNotInSpuIds(), + accrIdsDto.getNotInSkuIds() + ); + for (OmsOrderItem orderItem : newOrderItemList) { + for (Long skuId : skuIds) { + if (orderItem.getSkuId().equals(skuId)) { + Assert.throwEx("商品未授权:" + orderItem.getSkuCode()); + } + } + } + } + } + + /** + * 拦截规则 + * + * @param categoryRule + * @param orderItems + */ + @Override + public void handleCategoryRule(GoodsCategoryRule categoryRule, List orderItems) { + if (categoryRule != null && orderItems.size() > 0) { + List cids = Arrays.asList(categoryRule.getBrandIds()); + List igcids = null; + if (categoryRule.getIgnoreBrandIds() != null) { + igcids = Arrays.asList(categoryRule.getIgnoreBrandIds()); + } + Set spuIds = orderItems.stream().map(OmsOrderItem::getSpuId).collect(Collectors.toSet()); + List skuIds = orderItems.stream().map(OmsOrderItem::getSkuId).collect(Collectors.toList()); + List skuList = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(skuIds)) { + skuList = goodsSkuService.listByIds(skuIds); + for (GoodsSku sku : skuList) { + if (!sku.getOrderFlag().equals(1) && sku.getSpecialFlag().equals(0)) { + Assert.throwEx("单品[" + sku.getSkuCode() + "]不予下单且非特殊品"); + } + } + skuIds.addAll(skuList.stream().map(GoodsSku::getSpuId).collect(Collectors.toList())); + } + + List spuList = goodsSpuService.listByIds(spuIds); + for (GoodsSpu goodsSpu : spuList) { + if (!goodsSpu.getShelf().equals(1)) { + Assert.throwEx("SKU已下架[" + goodsSpu.getSpuCode() + "]不予下单"); + } + if (!goodsSpu.getOrderFlag().equals(1)) { + boolean msp = skuList.stream().anyMatch(m -> m.getSpuId().equals(goodsSpu.getId()) && m.getSpecialFlag().equals(1)); + if (!msp) { + Assert.throwEx("SKU[" + goodsSpu.getSpuCode() + "]不予下单"); + } + } + matchIgnoreCate(igcids, goodsSpu.getCategoryFirst(), goodsSpu); + matchIgnoreCate(igcids, goodsSpu.getCategorySecond(), goodsSpu); + matchIgnoreCate(igcids, goodsSpu.getCategoryThird(), goodsSpu); + matchRuleCate(cids, goodsSpu); + } + } + } + + private void matchRuleCate(List cids, GoodsSpu goodsSpu) { + boolean isOk = false; + for (String cid : cids) { + if(cid.equals(goodsSpu.getCategoryFirst())|| + cid.equals(goodsSpu.getCategorySecond())|| + cid.equals(goodsSpu.getCategoryThird())){ + isOk = true; + break; + } + } + if(!isOk){ + Assert.throwEx("不符合下单规则:"+ goodsSpu.getSpuCode()); + } + } + + + @Override + public List handleCategoryRule(List skuIds,GoodsCategoryRule categoryRule) { + List errSkuIds = new ArrayList<>(); + if (categoryRule != null && skuIds.size() > 0) { + List cids = Arrays.asList(categoryRule.getBrandIds()); + List igcids = null; + if (categoryRule.getIgnoreBrandIds() != null) { + igcids = Arrays.asList(categoryRule.getIgnoreBrandIds()); + } + List skuList = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(skuIds)) { + skuList = goodsSkuService.listByIds(skuIds); + for (GoodsSku sku : skuList) { + if (!sku.getOrderFlag().equals(1) && sku.getSpecialFlag().equals(0)) { + errSkuIds.add(new SimpleKeyValue("单品不予下单且非特殊品",sku.getId())); + break; + } + } + skuIds.addAll(skuList.stream().map(GoodsSku::getSpuId).collect(Collectors.toList())); + } + + Set spuIds = skuList.stream().map(GoodsSku::getSpuId).collect(Collectors.toSet()); + List spuList = goodsSpuService.listByIds(spuIds); + for (GoodsSpu goodsSpu : spuList) { + if (!goodsSpu.getShelf().equals(1)) { + Long errSkuId = null; + for (GoodsSku sku : skuList) { + if(sku.getSpuId().equals(goodsSpu.getId())){ + errSkuId = sku.getId(); + } + } + errSkuIds.add(new SimpleKeyValue("SKU不予下单且非特殊品",errSkuId)); + } + if (!goodsSpu.getOrderFlag().equals(1)) { + boolean msp = skuList.stream().anyMatch(m -> m.getSpuId().equals(goodsSpu.getId()) && m.getSpecialFlag().equals(1)); + if (!msp) { + Long errSkuId = null; + for (GoodsSku sku : skuList) { + if(sku.getSpuId().equals(goodsSpu.getId())){ + errSkuId = sku.getId(); + } + } + errSkuIds.add(new SimpleKeyValue("SKU不予下单",errSkuId)); + } + } + matchIgnoreCate(igcids, goodsSpu.getCategoryFirst(), goodsSpu); + matchIgnoreCate(igcids, goodsSpu.getCategorySecond(), goodsSpu); + matchIgnoreCate(igcids, goodsSpu.getCategoryThird(), goodsSpu); + matchRuleCate(cids, goodsSpu); + + } + } + return errSkuIds; + } + + /** + * 拦截忽略的品牌 + * + * @param igcids + * @param spuCateId + * @param goodsSpu + */ + private void matchIgnoreCate(List igcids, String spuCateId, GoodsSpu goodsSpu) { + if (igcids == null || spuCateId == null || spuCateId.equals("") || spuCateId.equals("0")) { + return; + } + for (String igcid : igcids) { + if (spuCateId.equals(igcid)) { + Assert.throwEx("[" + goodsSpu.getSkuCode() + "]" + goodsSpu.getName() + ",不符合订单规则"); + } + } + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public OmsOrder createOrder(OmsOrderBo omsOrderBo) { + OmsConfirmOrderResult confirmOrder = this.confirmOrder(omsOrderBo); + confirmOrder.setLatitudeFrom("SKU"); + CreateOrderParam createOrderParam = omsOrderBo.getCreateOrderParam(); + return this.buildOmsOrder(confirmOrder, createOrderParam); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public OmsOrder createOrderPc(OmsOrderSkuBo omsOrderBo) { + OmsConfirmOrderResult confirmOrder = this.confirmOrderPc(omsOrderBo); + 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); + } + return order; + } + + @NotNull + private OmsOrder buildOmsOrder(OmsConfirmOrderResult confirmOrder, CreateOrderParam createOrderParam) { + SysUser user = sysUserService.getById(AuthContextUtils.getSysUserId()); + BmsSupplier supplier = confirmOrder.getSupplier(); + BmsSupplierAddress address = confirmOrder.getDefaultAddress(); +// if(address==null){ +// Assert.throwEx("请补充收货地址"); +// } + List shoppingCarts = confirmOrder.getShoppingCarts(); + OmsOrder order = new OmsOrder(); + order.setLatitudeFrom(confirmOrder.getLatitudeFrom().toLowerCase(Locale.ROOT)); + String orderPrefix = null; + if (order.getOrderType() == null || order.getOrderType().equals(0)) { + orderPrefix = "SN"; + } else if (order.getOrderType().equals(1)) { + orderPrefix = "ZP"; + } else if (order.getOrderType().equals(2)) { + orderPrefix = "SC"; + } + order.setOrderSn(orderPrefix + CodeGenUtil.generate(CodeGenUtil.SourceKey.OmsOrder)); + + GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(confirmOrder.getBrandRuleId()); + if (categoryRule != null) { + order.setBrandRuleName(categoryRule.getLabel()); + } + + order.setOrderSource(confirmOrder.getOrderSource()); + order.setCdOrderRemark(createOrderParam.getCdOrderRemark()); + order.setOrderType(confirmOrder.getOrderType()); + order.setSupplierId(Long.parseLong(supplier.getId())); + order.setSupplierCode(supplier.getCode()); + order.setSupplierName(supplier.getName()); + order.setSupplierAddrId(address != null ? address.getId() : 0); + order.setBrandRuleId(confirmOrder.getBrandRuleId()); + order.setUserId(user.getId()); + order.setUserName(user.getName()); + order.setUserCode(user.getCode()); + order.setUserPhone(user.getMobile()); + + this.appendCusRegion(supplier, order); + + if (createOrderParam != null) { + order.setBillType(createOrderParam.getBillType()); + order.setUrgentFlag(createOrderParam.getUrgentFlag()); + order.setRemark(createOrderParam.getRemark()); + } + this.save(order); + + //兼容转换 +// List spuToSkuKeys = null; +// if(confirmOrder.getLatitudeFrom()!=null&&confirmOrder.getLatitudeFrom().equals("SPU")){ +// List spuCodes = shoppingCarts.stream().map(OmsShoppingCart::getSpuCode).collect(Collectors.toList()); +// spuToSkuKeys = goodsSpuService.getSpuToSkuInfo(GoodsConst.DEFAULT_PlaCE,spuCodes); +// for (OmsSpuToSkuKey skuKey : spuToSkuKeys) { +// for (OmsShoppingCart cart : shoppingCarts) { +// if(skuKey.getSkuCode().equals(cart.getSpuCode())){ +// cart.setSkuCode(skuKey.getInvCode()); +// } +// } +// } +// } + + + List orderItems = new ArrayList<>(); + for (OmsShoppingCart shoppingCart : shoppingCarts) { + OmsOrderItem orderItem = new OmsOrderItem(); + orderItem.setOrderId(order.getId()); + orderItem.setOrderSn(order.getOrderSn()); + orderItem.setWeight(shoppingCart.getWeight()); + orderItem.setVolume(shoppingCart.getVolume()); + orderItem.setRemark(shoppingCart.getRemark()); + if (confirmOrder.getLatitudeFrom() != null && confirmOrder.getLatitudeFrom().equals("SPU")) { + // spu维度 + GoodsSku goodsSku = goodsSkuService.getById(shoppingCart.getSkuId()); + orderItem.setSpuId(shoppingCart.getSpuId()); + orderItem.setSpuTitle(shoppingCart.getSpuName()); + orderItem.setSkuId(shoppingCart.getSkuId()); + orderItem.setSkuCode(shoppingCart.getSkuCode()); + orderItem.setSkuUnit(null); + orderItem.setSkuImg(shoppingCart.getPicUrl()); + orderItem.setSpecValues(shoppingCart.getSpecInfo()); + orderItem.setSpuCode(shoppingCart.getSpuCode()); + if (goodsSku != null) { + GoodsSpu goodsSpu = goodsSpuService.getById(goodsSku.getSpuId()); + orderItem.setSpuTitle(goodsSpu.getName()); + orderItem.setSkuTitle(goodsSpu.getSkuName()); + + log.warn("shoppingCart json =>" + JsonUtil.objectToJson(shoppingCart)); + orderItem.setSkuTitle(goodsSku.getSkuName()); + orderItem.setMarketPrice(goodsSku.getMarketPrice()); + orderItem.setSalesPrice(goodsSku.getSalesPrice()); + orderItem.setCusPrice(goodsSku.getSalesPrice()); + } + } else { + // 默认sku + GoodSkuVo goodSkuVo = shoppingCart.getGoodSkuVo(); + GoodsSpu goodsSpu = goodsSpuService.getByCode(goodSkuVo.getSpuCode()); + orderItem.setSpuId(goodSkuVo.getSpuId()); + orderItem.setSpuCode(goodSkuVo.getSpuCode()); + orderItem.setSpuTitle(goodsSpu.getName()); + orderItem.setSkuTitle(goodsSpu.getSkuName()); + orderItem.setSkuId(goodSkuVo.getId()); + orderItem.setSkuCode(goodSkuVo.getSkuCode()); + orderItem.setSkuUnit(goodSkuVo.getUnitName()); + orderItem.setSkuImg(goodSkuVo.getPicUrl()); + orderItem.setSpecValues(goodSkuVo.getSpecInfos()); + orderItem.setMarketPrice(goodSkuVo.getMarketPrice()); + orderItem.setSalesPrice(goodSkuVo.getSalesPrice()); + } + orderItem.setQuantity(shoppingCart.getQuantity()); + orderItem.setCusPrice(shoppingCart.getSupplierSalesPrice()); + orderItems.add(orderItem); + } + + //兼容客户特殊价 + List inventoryCusPrices = null; + try { + String supplierCode = supplier.getCode(); + List skuCodes = orderItems.stream().map(OmsOrderItem::getSkuCode).collect(Collectors.toList()); + if (skuCodes.size() > 0) { +// List customerPrices = goodsCustomerPriceService.getBySupplierCodeAndCode(supplierCode, skuCodes); +// inventoryCusPrices = customerPrices.stream().map(obj -> { +// InventoryCusPrice cusPrice = new InventoryCusPrice(); +// cusPrice.setCusCode(supplierCode); +// cusPrice.setInvCode(obj.getSkuCode()); +// cusPrice.setPrice(obj.getRealPrice()); +// return cusPrice; +// }).collect(Collectors.toList()); + InventoryCusPriceQuery query = new InventoryCusPriceQuery(); + query.setCusCode(supplierCode); + query.setInvCodes(skuCodes); + R res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); + if(res.getStatus().equals(200)){ + inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); + } + } + } catch (Exception e) { + log.error("客户特殊价异常:{}", e.getMessage()); + } + if (inventoryCusPrices != null) { + for (OmsOrderItem orderItem : orderItems) { + for (InventoryCusPrice cusPrice : inventoryCusPrices) { + if (orderItem.getSkuCode().equals(cusPrice.getInvCode())) { + orderItem.setMarketPrice(cusPrice.getPrice()); + orderItem.setCusPrice(cusPrice.getPrice()); + orderItem.setSalesPrice(cusPrice.getPrice()); + } + } + } + } + + this.handleCategoryRule(categoryRule, orderItems); + + // 更新品牌相关参数 + List spuIds = orderItems.stream().map(OmsOrderItem::getSpuId).collect(Collectors.toList()); + this.appendBrandCategory(order, spuIds); + this.updateById(order); + // 保存明细 + omsOrderItemService.saveBatch(orderItems); + + + //清空勾选的购物车 + List cartIds = confirmOrder.getShoppingCarts().stream() + .filter(a -> a.getId() != null) + .map(OmsShoppingCart::getId).collect(Collectors.toList()); + if (CollectionUtil.isNotEmpty(cartIds)) { + omsShoppingCartService.removeBatchByIds(cartIds); + } + return order; + } + + /** + * 根据商品SPU ID列表补充订单的品牌类别信息 + * 此方法旨在通过SPU ID获取对应的顶级分类ID,并进一步获取分类名称,最终将这些信息汇总到订单对象中 + * @param order 订单对象,用于存储品牌类别信息 + * @param spuIds 商品SPU ID列表,用于查询商品的顶级分类 + */ + private void appendBrandCategory(OmsOrder order, List spuIds) { + if(CollUtil.isNotEmpty(spuIds)){ + List cateIds = goodsSpuService.list(new LambdaQueryWrapper() + .in(GoodsSpu::getId, spuIds) + .select(GoodsSpu::getCategoryFirst)) + .stream() + .map(GoodsSpu::getCategoryFirst) + .collect(Collectors.toList()); + if(CollUtil.isNotEmpty(cateIds)){ + String cateNames = goodsCategoryMapper.selectBatchIds(cateIds) + .stream().map(GoodsCategory::getName).collect(Collectors.joining(",")); + order.setAllBands(cateNames); + } + } + } + + /** + * 将供应商的自定义区域信息附加到订单中 + * 此方法用于从供应商信息中提取客户相关的区域数据,并将其填充到订单对象中 + * 这有助于在订单处理过程中考虑供应商的特定区域需求或特性 + * @param supplier 供应商对象,包含供应商的详细信息 + * @param order 订单对象,将要附加区域信息的目标 + */ + private void appendCusRegion(BmsSupplier supplier, OmsOrder order) { + + try { + // 获取供应商的扩展区域信息 + BmsSupplierExtRegionVo regionVo = bmsSupplierMapper.getBmsSupplierExtRegionVo(supplier.getId()); + + if (regionVo == null) { + log.warn("Supplier ID {} does not have any extended region information", supplier.getId()); + return; + } + + // 设置销售区域信息 + order.setCusSaleRegion(regionVo.getSalRegionName()); + order.setCusSaleRegion2(regionVo.getSalRegionName2()); + order.setCusSaleRegion3(regionVo.getSalRegionName3()); + order.setCusSaleRegionAll(appendRegions(regionVo.getSalRegionName(), regionVo.getSalRegionName2(), regionVo.getSalRegionName3())); + order.setCusSaleRegionCodes(appendCodes(regionVo.getSalRegionCode(), regionVo.getSalRegionCode2(), regionVo.getSalRegionCode3())); + + // 设置业务区域信息 + order.setCusBigRegion(regionVo.getBigRegion()); + order.setCusProvince(regionVo.getBizRegionName()); + order.setCusCity(regionVo.getBizRegionName2()); + order.setCusArea(regionVo.getBizRegionName3()); + order.setCusBizRegionAll(appendRegions(regionVo.getBizRegionName(), regionVo.getBizRegionName2(), regionVo.getBizRegionName3())); + order.setCusBizRegionCodes(appendCodes(regionVo.getBizRegionCode(), regionVo.getBizRegionCode2(), regionVo.getBizRegionCode3())); + + } catch (Exception e) { + log.error("Error appending customer region information for supplier ID {}: {}", supplier.getId(), e.getMessage(), e); + } + } + + /** + * 辅助方法:拼接三个区域名称 + * @param region1 第一个区域名称 + * @param region2 第二个区域名称 + * @param region3 第三个区域名称 + * @return 拼接后的区域名称字符串 + */ + private String appendRegions(String region1, String region2, String region3) { + StringBuilder sb = new StringBuilder(); + if (region1 != null) sb.append(region1); + if (region2 != null) sb.append(",").append(region2); + if (region3 != null) sb.append(",").append(region3); + return sb.toString(); + } + + /** + * 辅助方法:拼接三个区域代码 + * @param code1 第一个区域代码 + * @param code2 第二个区域代码 + * @param code3 第三个区域代码 + * @return 拼接后的区域代码字符串 + */ + private String appendCodes(String code1, String code2, String code3) { + StringBuilder sb = new StringBuilder(); + if (code1 != null) sb.append(code1); + if (code2 != null) sb.append(",").append(code2); + if (code3 != null) sb.append(",").append(code3); + return sb.toString(); + } + + + @Override + public List getSpuAssess(OmsSpuAssesInfoBo param) { + List spuIds = param.getSpuIds(); + Integer year = param.getYearNum(); + Integer month = param.getMonthNum(); + String supplierId = param.getSupplierId(); + LambdaQueryWrapper spLqw = new LambdaQueryWrapper<>(); + spLqw.eq(SalePlan::getYearNum, year); + spLqw.eq(SalePlan::getMonthNum, month); + spLqw.eq(SalePlan::getSupplierId, supplierId); + //spLqw.eq(SalePlan::getPlanState,1); + List salePlanList = salePlanMapper.selectList(spLqw); + Map spuIdAndSum = new HashMap<>(); + if (salePlanList.size() > 0) { + List spIds = salePlanList.stream().map(SalePlan::getId).collect(Collectors.toList()); + LambdaQueryWrapper spgLqw = new LambdaQueryWrapper<>(); + spgLqw.in(SalePlanGoods::getPlanId, spIds); + spgLqw.in(SalePlanGoods::getTargetId, spuIds); + List salePlanGoodsList = salePlanGoodsMapper.selectList(spgLqw); + for (SalePlanGoods planGoods : salePlanGoodsList) { + spuIdAndSum.merge(planGoods.getTargetId(), planGoods.getQty(), Integer::sum); + } + } + List spuAssesInfoList = new ArrayList<>(); + for (Long spuId : spuIds) { + OmsSpuAssesInfo assesInfo = new OmsSpuAssesInfo(); + assesInfo.setSpuId(spuId); + Integer sum = spuIdAndSum.get(spuId); + assesInfo.setNum(sum == null ? 0 : sum); + spuAssesInfoList.add(assesInfo); + } + return spuAssesInfoList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public OmsOrder modifyImminentOrder(OmsOrderImminentBo param) { + + SysUser user = sysUserService.getById(AuthContextUtils.getSysUserId()); + GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(param.getBrandRuleId()); + BmsSupplier supplier = bmsSupplierMapper.selectById(param.getSupplierId()); + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(param.getAddressId()); + + OmsOrder order; + if (param.getId() != null) { + order = this.getById(param.getId()); + if (!order.getOrderType().equals(3)) { + Assert.throwEx("订单类型不支持混用"); + } + if(!order.getOrderCheckState().equals(OmsOrderCheckState.UnPublish.getCode()) + &&!order.getOrderCheckState().equals(OmsOrderCheckState.Rollback.getCode())){ + Assert.throwEx("OA审批状态拦截"); + } + } else { + order = new OmsOrder(); + order.setOrderSn("SP" + CodeGenUtil.generate(CodeGenUtil.SourceKey.OmsOrder)); + } + order.setLatitudeFrom("sp"); + order.setCdOrderRemark(param.getCdOrderRemark()); + order.setOaRateId(param.getOaRateId()); + if(!order.getOaRateId().equals(OTHER_RATE_ID)){ + BigDecimal discountRate = baseMapper.getExpiredOrderRates(param.getOaRateId()); + order.setDiscountRate(discountRate); + }else { + order.setDiscountRate(param.getDiscountRate()); + } + order.setOrderType(3); + order.setSupplierId(Long.parseLong(supplier.getId())); + order.setSupplierCode(supplier.getCode()); + order.setSupplierName(supplier.getName()); + order.setSupplierAddrId(supplierAddress != null ? supplierAddress.getId() : 0); + order.setBrandRuleId(param.getBrandRuleId()); + order.setUserId(user.getId()); + order.setUserName(user.getName()); + order.setUserCode(user.getCode()); + order.setUserPhone(user.getMobile()); + order.setBillType(param.getBillType()); + order.setUrgentFlag(param.getUrgentFlag()); + order.setRemark(param.getRemark()); + this.saveOrUpdate(order); + + List orderItems = new ArrayList<>(); + + if (CollectionUtil.isNotEmpty(param.getItemList())) { + Set batchSkuIds = param.getItemList().stream().map(OmsOrderImminentBo.ItemParam::getBatchSkuId) + .collect(Collectors.toSet()); + if (order.getStatus() != null && !order.getStatus().equals(0) && CollectionUtil.isEmpty(param.getItemList())) { + Assert.throwEx("请选择商品"); + } + List imminentBatches = goodsImminentBatchService + .list( + new LambdaQueryWrapper() + .in(GoodsImminentBatch::getId, batchSkuIds) + .ge(GoodsImminentBatch::getEndDate, LocalDate.now()) + ); + if (CollectionUtil.isEmpty(imminentBatches)) { + Assert.throwEx("参数过期或无效,请重新选择商品"); + } + + Set skuIds = imminentBatches.stream() + .map(GoodsImminentBatch::getSkuId).collect(Collectors.toSet()); + if (skuIds.size() != imminentBatches.size()) { + Assert.throwEx("不同批次相同产品,请分开下单"); + } + + List goodsSkuList = goodsSkuService.listByIds(skuIds); + + List spuIds = goodsSkuList.stream().map(GoodsSku::getSpuId).collect(Collectors.toList()); + spuIds.add(0L); + List spuList = goodsSpuService.listByIds(spuIds); + + for (OmsOrderImminentBo.ItemParam item : param.getItemList()) { + for (GoodsImminentBatch batch : imminentBatches) { + if (item.getBatchSkuId().equals(batch.getId())) { + for (GoodsSku sku : goodsSkuList) { + if (sku.getId().toString().equals(batch.getSkuId())) { + //创建OrderItem + OmsOrderItem orderItem = createImminentOrderItem(order, spuList, item, batch, sku); + orderItems.add(orderItem); + } + } + } + } + } + + List skuCodes = orderItems.stream() + .map(OmsOrderItem::getSkuCode).collect(Collectors.toList()); + + //商品特殊价 + buildSkuSpecPrice(supplier, orderItems, skuCodes); + + //拦截商品授权维度规则 + //this.checkGoodsRule(supplier, orderItems); + + //拦截客户维度规则 + //goodsRuleService.checkSkuCode(skuCodes, order.getSupplierId().toString(), true); + + //拦截品类下单规则 + //this.handleCategoryRule(categoryRule, orderItems); + + } + + this.updateById(order); + //移除已有的ITEM + LambdaQueryWrapper rmItemLqw = new LambdaQueryWrapper<>(); + rmItemLqw.eq(OmsOrderItem::getOrderId, param.getId()); + omsOrderItemService.remove(rmItemLqw); + //重新保存item + if (orderItems.size() > 0) { + omsOrderItemService.saveBatch(orderItems); + } + //立即下单 + if (param.getInstantFlag() != null && param.getInstantFlag().equals(1)) { + if (supplier.getCdOrderFlag().equals(1) && !StringUtils.hasText(param.getCdOrderRemark())) { + Assert.throwEx("请补充CD单号"); + } + OmsOrderOptionsService optionsService = SpringUtils.getBean(OmsOrderOptionsService.class); + optionsService.submitExpiredOrder(order.getId()+""); + } + return order; + } + + + @NotNull + private OmsOrderItem createImminentOrderItem(OmsOrder order, List spuList, OmsOrderImminentBo.ItemParam item, GoodsImminentBatch batch, GoodsSku sku) { + OmsOrderItem orderItem = new OmsOrderItem(); + orderItem.setRemark(item.getRemark()); + orderItem.setQuantity(item.getQty()); + orderItem.setOrderId(order.getId()); + orderItem.setOrderSn(order.getOrderSn()); + orderItem.setSpuId(sku.getSpuId()); + for (GoodsSpu spu : spuList) { + if (sku.getSpuId().equals(spu.getId())) { + orderItem.setSpuCode(spu.getSpuCode()); + orderItem.setSpuTitle(spu.getName()); + break; + } + } + orderItem.setWeight(sku.getWeight()); + orderItem.setVolume(sku.getVolume()); + orderItem.setSkuBatchId(batch.getId()); + orderItem.setSkuBatchCode(batch.getBatchCode()); + orderItem.setSkuId(sku.getId()); + orderItem.setSkuTitle(sku.getSkuName()); + orderItem.setSkuCode(sku.getSkuCode()); + orderItem.setSpecValues(sku.getSpecInfos()); + orderItem.setSkuUnit(sku.getUnitName()); + orderItem.setSkuImg(sku.getPicUrl()); + orderItem.setSalesPrice(sku.getSalesPrice()); + orderItem.setCusPrice(sku.getSalesPrice()); + orderItem.setMarketPrice(sku.getMarketPrice()); + return orderItem; + } + + private void buildSkuSpecPrice(BmsSupplier supplier, List orderItems, List skuCodes) { +// List customerPrices = goodsCustomerPriceService.getBySupplierCodeAndCode(supplier.getCode(), skuCodes); +// for (OmsOrderItem orderItem : orderItems) { +// for (GoodsCustomerPrice customerPrice : customerPrices) { +// if (orderItem.getSkuCode().equals(customerPrice.getSkuCode())) { +// orderItem.setSalesPrice(customerPrice.getRealPrice()); +// break; +// } +// } +// } + InventoryCusPriceQuery query = new InventoryCusPriceQuery(); + query.setCusCode(supplier.getCode()); + query.setInvCodes(skuCodes); + try { + R res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); + if(res.getStatus().equals(200)){ + List inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); + for (InventoryCusPrice cusPrice : inventoryCusPrices) { + for (OmsOrderItem orderItem : orderItems) { + if(cusPrice.getCusCode().equals(orderItem.getSkuCode())&&cusPrice.getPrice().compareTo(cusPrice.getPrice())!=0){ + orderItem.setSalesPrice(cusPrice.getPrice()); + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void buildPriceOrder(String id, String amount) { + redisService.throwResLock(OmsOrder.class.getSimpleName(), id); + OmsOrder omsOrder = super.getById(id); + String userId = AuthContextUtils.getSysUserId(); + SysUser sysUser = sysUserService.getById(userId); + if (omsOrder == null) { + Assert.throwEx("订单不存在或被移除"); + } + if (!omsOrder.getUserId().equals(userId)) { + Assert.throwEx("非制单人无法下单"); + } + // 非临期品不走当前流程 +// if(omsOrder.getOrderType().equals(3)){ +// Assert.throwEx("临期品需要审批方式下单"); +// } + this.checkMsOrderStatus(omsOrder); + if (!omsOrder.getStatus().equals(0) && !omsOrder.getStatus().equals(6)) { + Assert.throwEx("订单状态不支持下单"); + } + LambdaQueryWrapper iteLqw = new LambdaQueryWrapper<>(); + iteLqw.eq(OmsOrderItem::getOrderId, id); + List orderItemList = omsOrderItemService.list(iteLqw); + + // 加成订单项合法性 + OmsOrderUtil.checkOrderItemValues(orderItemList); + + //下单前规则拦截 + GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(omsOrder.getBrandRuleId()); + this.handleCategoryRule(categoryRule, orderItemList); + String brands = Arrays.stream(categoryRule.getBrandNames()).collect(Collectors.joining(",")); + + //客户校验 + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(omsOrder.getSupplierAddrId()); + BmsSupplier supplier = bmsSupplierMapper.selectById(omsOrder.getSupplierId()); + if (supplier.getCdOrderFlag().equals(1) && !StringUtils.hasText(omsOrder.getCdOrderRemark())) { + Assert.throwEx("请补充CD单号"); + } + String lastRegionId = supplier.getRegionLast(); + BmsRegion bmsRegion = bmsRegionMapper.selectById(lastRegionId); + if (bmsRegion == null) { + Assert.throwEx("客户档案[" + supplier.getCode() + "]缺失销售区域数据,请联系管理员"); + } + //更新最新的用户特殊价格 + this.updateCusPrice(omsOrder.getSupplierCode(), orderItemList); + + //补充:调度系统写报价单给ERP时,要把地址ID写过去 + if (supplierAddress.getTmsSysId() == null) { + Assert.throwEx("地址缺失TmsSysId关联"); + } + + //保存到ERP中间表 + this.saveToErpOrder(omsOrder, orderItemList, brands, supplierAddress, bmsRegion); + + } + + @Override + public void saveToErpOrder(OmsOrder omsOrder, + List orderItemList, + String brands, + BmsSupplierAddress supplierAddress, + BmsRegion bmsRegion) { + SysUser sysUser = sysUserService.getById(omsOrder.getCreateBy()); + //保存到临时表-主表 + LocalDateTime nowTime = LocalDateTime.now(); + OmsXltOrder xltOrder = new OmsXltOrder(); + xltOrder.setId(IdUtil.getSnowFlakeId() + ""); + xltOrder.setOrderType(omsOrder.getOrderType()); + xltOrder.setDingDanHao(omsOrder.getOrderSn()); + xltOrder.setShenQingRiQi(nowTime); + xltOrder.setKeHuBianHao(omsOrder.getSupplierCode()); + xltOrder.setShouHuoDiZhi(supplierAddress.getDetail()); + xltOrder.setRenYuanBianHao(omsOrder.getUserCode()); + xltOrder.setCdOrderRemark(omsOrder.getCdOrderRemark()); + xltOrder.setDiscountRate(omsOrder.getDiscountRate()); + String remark = sysUser.getName() + "(" + sysUser.getMobile() + ")" + omsOrder.getRemark() + supplierAddress.getDetail(); + if (remark.length() > 120) { + remark = remark.substring(0, 120); + } + xltOrder.setZhuYiShiXian(remark); + xltOrder.setXieRuShiJian(nowTime); + xltOrder.setChuLiShiJian(null); + xltOrder.setRowCreateDate(nowTime); + xltOrder.setRenYuanXingMing(omsOrder.getUserName()); + xltOrder.setRenYuanDianHua(omsOrder.getUserPhone()); + xltOrder.setXianZhiWeiDu("品牌"); + xltOrder.setXianZhiWeiDuMingChen(brands); + xltOrder.setZhuangTai(0); + //状态:0未使用;1报价单;2销售订单 + xltOrder.setStatus(0); + + xltOrder.setTmsSysId(supplierAddress.getId() + ""); + xltOrder.setEmpName(omsOrder.getUserName()); + xltOrder.setCusCode(omsOrder.getSupplierCode()); + xltOrder.setCusName(omsOrder.getSupplierName()); + + try { + String[] regions = bmsRegion.getPathNames().split("_"); + if (regions.length > 1) { + xltOrder.setDealerProvince(regions[1]); + } + if (regions.length > 0) { + xltOrder.setDealerCity(regions[0]); + } + } catch (Exception e) { + log.warn("区域档案异常:{}",bmsRegion.getName()); + } + xltOrder.setDealerArea(bmsRegion.getPathNames()); + + //保存到临时表-明细表 + List xltOrderItemList = new ArrayList<>(); + for (int i = 0; i < orderItemList.size(); i++) { + OmsOrderItem orderItem = orderItemList.get(i); + OmsXltOrderItem xltOrderItem = new OmsXltOrderItem(); + xltOrderItem.setId(xltOrder.getId() + "_" + (i + 1)); + xltOrderItem.setDingDanID(xltOrder.getId()); + xltOrderItem.setSpuCode(orderItem.getSpuCode()); + boolean eq = orderItem.getSkuCode().equals(orderItem.getSpuCode()); + if (!StringUtils.hasText(orderItem.getSkuCode()) || eq) { + GoodsSku sku = goodsSkuService.getById(orderItem.getSkuId()); + GoodsSpu spu = goodsSpuService.getById(orderItem.getSpuId()); + if (!sku.getSkuCode().equals(spu.getSpuCode())) { + Assert.throwEx("SKU【" + orderItem.getSpuCode() + "】存货缺失,请联系档案负责人"); + } + } + xltOrderItem.setChanPinBianHao(orderItem.getSkuCode()); + xltOrderItem.setChanPinDanWei(orderItem.getSkuUnit()); + xltOrderItem.setDingHuoShuLiang(orderItem.getQuantity()); + xltOrderItem.setDaZengShuLiang(BigDecimal.ZERO); + xltOrderItem.setChanPinYuanJia(orderItem.getMarketPrice()); + xltOrderItem.setChanPinXianJia(orderItem.getSalesPrice()); + xltOrderItem.setXieRuShiJian(nowTime); + xltOrderItem.setChuLiShiJian(null); + xltOrderItem.setRowCreateDate(nowTime); + if (omsOrder.getOrderType().equals(3)) { + String itemRm = orderItem.getRemark() == null ? "" : orderItem.getRemark(); + xltOrderItem.setBeiZhu("批号[" + orderItem.getSkuBatchCode() + "]" + itemRm); + } else { + xltOrderItem.setBeiZhu(orderItem.getRemark()); + } + xltOrderItem.setZhuangTai(0); + xltOrderItemList.add(xltOrderItem); + } + XltOrderDTO xltOrderDTO = new XltOrderDTO(xltOrder, xltOrderItemList); + //请求到中间服务保存 + seeYonRequestBaseService.postBase(ERP_ORDER_CREATE, xltOrderDTO, "创建订单:" + xltOrder.getDingDanHao()); + //更新订单 + omsOrder.setStatus(1); + omsOrder.setCheckTime(LocalDateTime.now()); + omsOrder.setCheckUserId(omsOrder.getCreateBy()); + if(!omsOrder.getOrderType().equals(3)){ + omsOrder.setCheckUserId(AuthContextUtils.getSysUserId()); + } + this.updateById(omsOrder); + } + + @Override + public void updateCusPrice(String cusCode, List orderItemList) { + List codes = orderItemList.stream().map(OmsOrderItem::getSkuCode).distinct().collect(Collectors.toList()); + InventoryCusPriceQuery query = new InventoryCusPriceQuery(); + query.setCusCode(cusCode); + query.setInvCodes(codes); + R res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); + if(res.getStatus().equals(200)) { + List inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); + if(CollectionUtil.isNotEmpty(inventoryCusPrices)){ + assert inventoryCusPrices != null; + for (InventoryCusPrice cusPrice : inventoryCusPrices) { + for (OmsOrderItem orderItem : orderItemList) { + if(orderItem.getSkuCode().equals(cusPrice.getInvCode())){ + orderItem.setCusPrice(cusPrice.getPrice()); + orderItem.setSalesPrice(cusPrice.getPrice()); + omsOrderItemService.updateById(orderItem); + } + } + } + } + } + } + + @Override + public boolean checkMsOrderStatus(OmsOrder omsOrder) { + if (omsOrder.getStatus().equals(1)) { + //检索是否能取消 + String status = seeYonRequestBaseService.postBase(ERP_ORDER_STATUS + "/" + omsOrder.getOrderSn() + , null + , "获取订单状态" + ).getData(); + if (!status.equals("0")) { + omsOrder.setStatus(2); + super.updateById(omsOrder); + return true; + } + } + return false; + } + + @Override + public boolean cancelOrder(String orderSn) { + OmsOrder order = this.getOne(new LambdaQueryWrapper().eq(OmsOrder::getOrderSn, orderSn)); + if (order == null) { + Assert.throwEx("订单编码异常"); + } + + List updItemBatch = new ArrayList<>(); + if (order.getOrderType().equals(3)) { + List itemList = omsOrderItemService.list(new LambdaQueryWrapper() + .eq(OmsOrderItem::getOrderId, order.getId())); + for (OmsOrderItem orderItem : itemList) { + GoodsImminentBatch batch = goodsImminentBatchService.getById(orderItem.getSkuBatchId()); + GoodsImminentBatch newBatch = new GoodsImminentBatch(); + newBatch.setId(batch.getId()); + newBatch.setOrderQuantity(batch.getOrderQuantity() - orderItem.getQuantity()); + updItemBatch.add(newBatch); + } + } + + R r = seeYonRequestBaseService.postBase(ERP_ORDER_CANCEL + "/" + orderSn + , null + , "取消订单状态" + ); + if (r.getStatus() == 200) { + if (CollectionUtil.isNotEmpty(updItemBatch)) { + goodsImminentBatchService.updateBatchById(updItemBatch); + } + } + return r.getStatus() == 200; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderItemServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderItemServiceImpl.java new file mode 100644 index 0000000..8191bea --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderItemServiceImpl.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.oms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.oms.entity.OmsSaleOrderItem; +import com.qs.serve.modules.oms.mapper.OmsSaleOrderItemMapper; +import com.qs.serve.modules.oms.service.OmsOrderItemService; +import com.qs.serve.modules.oms.service.OmsSaleOrderItemService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 订单明细 服务实现类 + * @author YenHex + * @since 2022-10-14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class OmsSaleOrderItemServiceImpl extends ServiceImpl implements OmsSaleOrderItemService { + + @Override + public List listByOrderId(Long orderId) { + return this.list(new LambdaQueryWrapper().eq(OmsSaleOrderItem::getOrderId,orderId)); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderOptionsServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderOptionsServiceImpl.java new file mode 100644 index 0000000..3fe1e0f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderOptionsServiceImpl.java @@ -0,0 +1,473 @@ +package com.qs.serve.modules.oms.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.oa.OaFormMainProcess; +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.DateUtils; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.common.util.model.DateFormatString; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; +import com.qs.serve.modules.goods.entity.*; +import com.qs.serve.modules.goods.mapper.GoodsCategoryMapper; +import com.qs.serve.modules.goods.mapper.GoodsCategoryRuleMapper; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.mapper.GoodsSpuMapper; +import com.qs.serve.modules.goods.service.GoodsImminentBatchService; +import com.qs.serve.modules.oms.common.OmsOrderCheckState; +import com.qs.serve.modules.oms.entity.OmsSaleOrder; +import com.qs.serve.modules.oms.entity.OmsSaleOrderItem; +import com.qs.serve.modules.oms.entity.dto.SeeYonOrderItemDTO; +import com.qs.serve.modules.oms.mapper.OmsSaleOrderMapper; +import com.qs.serve.modules.oms.service.*; +import com.qs.serve.modules.oms.utils.OmsOrderUtil; +import com.qs.serve.modules.seeyon.entity.BaseCreateCallbackBo; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tag.mapper.TagInfoMapper; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 订单审批操作类 + * @author YenHex + * @since 2024/8/12 + */ +@Slf4j +@Service +@AllArgsConstructor +public class OmsSaleOrderOptionsServiceImpl implements OmsSaleOrderOptionsService { + + private final GoodsImminentBatchService goodsImminentBatchService; + private final OmsSaleOrderService omsSaleOrderService; + private final OmsOrderPart1Service omsOrderPart1Service; + private final OmsSaleOrderItemService omsSaleOrderItemService; + private final SysUserService sysUserService; + private final BmsRegionMapper regionMapper; + private final BmsRegion2Mapper region2Mapper; + + private final GoodsCategoryRuleMapper goodsCategoryRuleMapper; + private final BmsSupplierAddressService bmsSupplierAddressService; + + private final BmsSupplierMapper bmsSupplierMapper; + private final BmsRegionMapper bmsRegionMapper; + private final TagInfoMapper tagInfoMapper; + private final GoodsSkuMapper goodsSkuMapper; + private final GoodsSpuMapper goodsSpuMapper; + private final OmsSaleOrderMapper omsSaleOrderMapper; + private final GoodsCategoryMapper goodsCategoryMapper; + private final SeeYonRequestService seeYonService; + private final SeeYonRequestBaseService seeYonRequestBaseService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Object submitExpiredOrder(String orderId) { + OmsSaleOrder omsOrder = omsSaleOrderService.getById(orderId); + String userId = AuthContextUtils.getSysUserId(); + SysUser sysUser = sysUserService.getById(userId); + if (omsOrder == null) { + Assert.throwEx("订单不存在或被移除"); + } + if(!userId.equals(omsOrder.getCreateBy())){ + Assert.throwEx("越权访问被拦截了"); + } + if (!omsOrder.getUserId().equals(userId)) { + Assert.throwEx("非制单人无法下单"); + } + // 非临期品不走当前流程 + if(!omsOrder.getOrderType().equals(3)){ + Assert.throwEx("该功能只针对临期品订单"); + } + omsSaleOrderService.checkMsOrderStatus(omsOrder); + if (!omsOrder.getOrderCheckState().equals(OmsOrderCheckState.UnPublish.getCode()) + && !omsOrder.getOrderCheckState().equals(OmsOrderCheckState.Rollback.getCode())) { + Assert.throwEx("订单状态不支持下单"); + } + List orderItemList = omsSaleOrderItemService.listByOrderId(Long.parseLong(orderId)); + + // 加成订单项合法性 + OmsOrderUtil.checkSaleOrderItemValues(orderItemList); + + //下单前规则拦截 + GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(omsOrder.getBrandRuleId()); + omsSaleOrderService.handleCategoryRule(categoryRule, orderItemList); + + List imminentBatches = new ArrayList<>(); + if (omsOrder.getOrderType().equals(3)) { + //临期品相关拦截 + for (OmsSaleOrderItem orderItem : orderItemList) { + if (orderItem.getSkuBatchId() == null) { + Assert.throwEx(orderItem.getSkuCode() + " 单品无效或过期"); + } + GoodsImminentBatch imminentBatch = goodsImminentBatchService.getById(orderItem.getSkuBatchId()); + if (imminentBatch == null) { + Assert.throwEx(orderItem.getSkuCode() + " 单品无效或过期"); + } + int spur = imminentBatch.getQuantity() - imminentBatch.getOrderQuantity(); + if (orderItem.getQuantity() > spur) { + Assert.throwEx(orderItem.getSkuCode() + " 单品库存不足"); + } + // 扣减库存 + imminentBatch.setOrderQuantity(imminentBatch.getOrderQuantity() + orderItem.getQuantity()); + imminentBatches.add(imminentBatch); + } + } + //客户校验 + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(omsOrder.getSupplierAddrId()); + if(supplierAddress==null){ + Assert.throwEx("客户地址为空"); + } + BmsSupplier supplier = bmsSupplierMapper.selectById(omsOrder.getSupplierId()); + if (supplier.getCdOrderFlag().equals(1) && !StringUtils.hasText(omsOrder.getCdOrderRemark())) { + Assert.throwEx("请补充CD单号"); + } + + //补充:调度系统写报价单给ERP时,要把地址ID写过去 + if (supplierAddress.getTmsSysId() == null) { + Assert.throwEx("地址缺失TmsSysId关联"); + } + + String lastRegionId = supplier.getRegionLast(); + BmsRegion bmsRegion = bmsRegionMapper.selectById(lastRegionId); + if (bmsRegion == null) { + Assert.throwEx("客户档案[" + supplier.getCode() + "]缺失销售区域数据,请联系管理员"); + } + + //更新最新的用户特殊价格 + omsSaleOrderService.updateCusPrice(omsOrder.getSupplierCode(), orderItemList); + + BigDecimal totalOrderAmt = orderItemList.stream().map(a->a.getSalesPrice().multiply(new BigDecimal(a.getQuantity()))) + .reduce(BigDecimal.ZERO,BigDecimal::add); + + if (imminentBatches.size() > 0) { + goodsImminentBatchService.updateBatchById(imminentBatches); + } + + String templateCode = this.getTemplateCode(); + + //加载大区信息 + String saleRegionId = supplier.handleSaleRegionId(); + BmsRegion saleRegion = regionMapper.selectById(saleRegionId); + String saleBizNames = saleRegion!=null?saleRegion.getPathNames():"null_申请时未录入"; + String bizRegionId = supplier.handleBizRegionId(); + BmsRegion2 bizRegion = region2Mapper.selectById(bizRegionId); + String bizBizNames = bizRegion!=null?bizRegion.getPathNames():"null_申请时未录入"; + + Map newWayData = new HashMap<>(); + + // 构建DATA + Map mainTableData = this.buildSeeyonData(omsOrder, sysUser, supplierAddress, supplier, + totalOrderAmt, templateCode, saleBizNames, bizBizNames); + newWayData.put("formmain_2206",mainTableData); + + // 构建子表data + List itemDTOList = getSeeYonOrderItemDTOS(orderItemList); + newWayData.put("formson_2210",itemDTOList); + + OaFormMainProcess mainProcess = new OaFormMainProcess(); + mainProcess.setTargetId(orderId); + mainProcess.setUploadFiles(new ArrayList<>()); + mainProcess.setTableName("formmain_2206"); + mainProcess.setData(newWayData); + mainProcess.setTemplateCode(templateCode); + mainProcess.setUserId(sysUser.getId()); + mainProcess.setSenderLoginName(sysUser.getAccount()); + R flowIdResult = seeYonService.newCreateProcess(mainProcess); + + if(flowIdResult==null||flowIdResult.getStatus()!=200){ + assert flowIdResult != null; + Assert.throwEx("远程服务调用失败:"+flowIdResult.getMsg()); + } + if(flowIdResult.getMsg()!=null && flowIdResult.getMsg().length()>45){ + log.error(flowIdResult.getMsg()); + JSONObject object = JSON.parseObject(flowIdResult.getMsg()); + if(!object.get("code").toString().equals("0")){ + Assert.throwEx("流程发起被拦截了"); + } + } + String formId = null; + R formIdResult = seeYonService.getFormId(templateCode,omsOrder.getId()); + if(formIdResult.getStatus()==200){ + formId = formIdResult.getData(); + } + omsOrder.setSyFormId(formId); + omsOrder.setOrderCheckState(OmsOrderCheckState.Commiting.getCode()); + omsOrder.setOrderCheckSubmitTime(LocalDateTime.now()); + omsSaleOrderService.updateById(omsOrder); + + BaseCreateCallbackBo callbackBo = new BaseCreateCallbackBo(templateCode,orderId); + seeYonService.createCallbackStatus(callbackBo); + return R.ok(); + } + + private List getSeeYonOrderItemDTOS(List orderItemList) { + List itemDTOList = orderItemList.stream().map(item->{ + SeeYonOrderItemDTO dto = new SeeYonOrderItemDTO(); + dto.setSpuCode(item.getSpuCode()); + dto.setSkuTitle(item.getSkuTitle()); + GoodsSpu goodsSpu = goodsSpuMapper.selectById(item.getSpuId()); + GoodsSku goodsSku = goodsSkuMapper.selectById(item.getSkuId()); + GoodsCategory goodsCategory = goodsCategoryMapper.selectById(goodsSpu.getCategoryLast()); + dto.setSkuAddCode(goodsSku.getSkuAddCode()); + dto.setSkuCode(item.getSkuCode()); + dto.setBatchCode(item.getSkuBatchCode()); + dto.setSkuCategories(goodsCategory.getLevelPathNames()); + dto.setSpecVal(item.getSpecValues()); + dto.setRemark(item.getRemark()); + dto.setWeight(item.getWeight()); + dto.setVolume(item.getVolume()); + dto.setSkuUnit(goodsSku.getUnitName()); + dto.setQty(item.getQuantity()); + dto.setSalesPrice(item.getSalesPrice()); + dto.setTotalPrice(item.getSalesPrice().multiply(new BigDecimal(item.getQuantity()))); + return dto; + }).collect(Collectors.toList()); + return itemDTOList; + } + + @Override + public void syncToErp() { + AuthContextUtils.setTenant("001"); + List omsOrders = omsSaleOrderService.list(new LambdaQueryWrapper() + //临期品 + .eq(OmsSaleOrder::getOrderType,3) + //未下单 + .in(OmsSaleOrder::getStatus,0) + //审批完成 + .eq(OmsSaleOrder::getOrderCheckState,OmsOrderCheckState.Finished.getCode()) + ); + log.warn("临期品同步到ERP,数量:{}",omsOrders.size()); + syncToErp11DB(omsOrders); + } + + @Override + public void syncToErp11DB(List omsOrders) { + for (OmsSaleOrder omsOrder : omsOrders) { + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(omsOrder.getSupplierAddrId()); + List orderItemList = omsSaleOrderItemService.listByOrderId(omsOrder.getId()); + BmsSupplier supplier = bmsSupplierMapper.selectById(omsOrder.getSupplierId()); + String lastRegionId = supplier.getRegionLast(); + BmsRegion bmsRegion = bmsRegionMapper.selectById(lastRegionId); + List spuIds = orderItemList.stream().map(OmsSaleOrderItem::getSpuId).collect(Collectors.toList()); + List goodsSpuList = goodsSpuMapper.selectBatchIds(spuIds); + List cateIds = goodsSpuList.stream().map(GoodsSpu::getCategoryLast).collect(Collectors.toList()); + List categoryList = goodsCategoryMapper.selectBatchIds(cateIds); + String bs = categoryList.stream().map(GoodsCategory::getName).collect(Collectors.joining(",")); + // 读取OA最新订单折扣 + if(omsOrder.getOrderType().equals(3)){ + R codeRs = seeYonRequestBaseService.getBase( + TbsSeeYonConst.OA_DATA_EXPIRE_ORDER_DR + omsOrder.getOrderSn() + ,"获取条款申请流水号"); + BigDecimal dr = null; + if(codeRs.getStatus()==200 && codeRs.getMsg()!=null){ + try { + String oaRateId = codeRs.getMsg().toString(); + if(oaRateId.equals(TbsSeeYonConst.OTHER_RATE_ID)){ + R codeRs2 = seeYonRequestBaseService.getBase( + TbsSeeYonConst.OA_DATA_EXPIRE_ORDER_DR2 + omsOrder.getOrderSn() + ,"获取条款申请流水号"); + if(codeRs2.getStatus()==200 && codeRs2.getMsg()!=null){ + dr = new BigDecimal(codeRs2.getData()+""); + } + }else { + dr = omsSaleOrderMapper.getExpiredOrderRates(oaRateId); + } + omsOrder.setDiscountRate(dr); + omsOrder.setOaRateId(oaRateId); + } catch (Exception e) { + e.printStackTrace(); + } + } + if(dr==null){ + log.error("临期品订单,获取最新的折扣率失败,单号:{}",omsOrder.getOrderSn()); + continue; + } + } + // 写入到ERP中间表 + omsSaleOrderService.saveToErpOrder(omsOrder,orderItemList,bs,supplierAddress,bmsRegion); + } + } + + /** + * 构建DATA + * @param omsOrder + * @param sysUser + * @param supplierAddress + * @param supplier + * @param totalOrderAmt + * @param templateCode + * @param saleBizNames + * @param bizBizNames + * @return + */ + private Map buildSeeyonData(OmsSaleOrder omsOrder, SysUser sysUser, BmsSupplierAddress supplierAddress, BmsSupplier supplier, BigDecimal totalOrderAmt, String templateCode, String saleBizNames, String bizBizNames) { + Map data = new HashMap<>(); + data.put("orgId", omsOrder.getId()); + data.put("targetId", omsOrder.getId()); + data.put("targetCode", omsOrder.getOrderSn()); + data.put("applyUserCode", sysUser.getCode()); + data.put("applyUserName", sysUser.getName()); + data.put("supplierName", supplier.getName()); + data.put("supplierCode", supplier.getCode()); + data.put("exsp1", templateCode); + data.put("exsp2", bizBizNames); + data.put("exsp3", saleBizNames); + // title + data.put("exsp4", "临期订单-"+omsOrder.getOrderSn()); + //添加跳转地址业务 + String baseJumpUrl = "https://shop.gdjsl.com/pcOrder/#/"; + data.put("cmsLink",baseJumpUrl); + data.put("rowDate", DateUtils.format(LocalDateTime.now(), DateFormatString.DATE_TIME)); + data.put("rowState","00"); + //data.put("templateId", ""); + //data.put("templateName", ""); + //添加客户标签 + List tags = tagInfoMapper.lisTagsBySupplierCode(supplier.getCode()); + data.put("tags",tags); + + data.put("totalOrderAmt", totalOrderAmt); + // 解决特殊bug,整数传“.0” oa会报错 + if(totalOrderAmt.compareTo(new BigDecimal(totalOrderAmt.intValue()))==0){ + data.put("totalOrderAmt", totalOrderAmt.intValue()); + } + + data.put("cusAddr", supplierAddress.getDetail()); + data.put("cdNumber", omsOrder.getCdOrderRemark()); + data.put("remark", omsOrder.getRemark()); + data.put("mainRemark", omsOrder.getRemark()); + // 折扣率(审批时修改) + data.put("ext1", omsOrder.getOaRateId()); + if(omsOrder.getOrderType().equals(3)&&omsOrder.getDiscountRate()==null){ + Assert.throwEx("临期品订单,请确保折扣率被设置"); + } + // 申请时的总金额(审批时该金额不更新,非最终的合计金额) + data.put("ext2", + totalOrderAmt.multiply(omsOrder.getDiscountRate()) + .divide(new BigDecimal("100"),2, RoundingMode.DOWN) + ); + // 申请时的折扣率(跟ext1一样传oaid) + data.put("ext3",omsOrder.getOaRateId()); + // 初始值 + data.put("ext4",omsOrder.getDiscountRate()); + // 最终结果值(完成后回调更新) + data.put("ext6",omsOrder.getDiscountRate()); + // 类似 8.2折 + BigDecimal rateNum = new BigDecimal("100").subtract(omsOrder.getDiscountRate()) + .divide(new BigDecimal("100"),2, RoundingMode.DOWN); + data.put("ext5",rateNum + "折"); + return data; + } + + @Override + public String getSyFormIdByTargetInfo(TbsAffairCommitBo affairCommit) { + OmsSaleOrder omsOrder = omsSaleOrderService.getOne(new LambdaQueryWrapper() + .select(OmsSaleOrder::getSyFormId) + .eq(OmsSaleOrder::getId,affairCommit.getTargetId())); + return omsOrder!=null?omsOrder.getSyFormId():null; + } + + @Override + public Object doBacked(TbsAffairCommitBo param) { + OmsSaleOrder omsOrder = omsSaleOrderService.getById(param.getTargetId()); + omsOrder.setOrderCheckState(OmsOrderCheckState.Rollback.getCode()); + omsSaleOrderService.updateById(omsOrder); + omsOrderPart1Service.releaseInventory(omsOrder.getId()); + return null; + } + + @Override + public Object doFinished(TbsAffairCommitBo param) { + OmsSaleOrder omsOrder = omsSaleOrderService.getById(param.getTargetId()); + omsOrder.setOrderCheckState(OmsOrderCheckState.Finished.getCode()); + omsOrder.setOrderCheckFinishedTime(LocalDateTime.now()); + omsSaleOrderService.updateById(omsOrder); + return null; + } + + @Override + public Object doRefuse(TbsAffairCommitBo param) { + OmsSaleOrder omsOrder = omsSaleOrderService.getById(param.getTargetId()); + omsOrder.setOrderCheckState(OmsOrderCheckState.Stop.getCode()); + omsSaleOrderService.updateById(omsOrder); + omsOrderPart1Service.releaseInventory(omsOrder.getId()); + return null; + } + + @Override + public boolean checkSyFormIdIsNotNull(String targetId) { + OmsSaleOrder omsOrder = omsSaleOrderService.getOne(new LambdaQueryWrapper() + .select(OmsSaleOrder::getSyFormId) + .eq(OmsSaleOrder::getId,targetId)); + return omsOrder!=null&&omsOrder.getSyFormId()!=null; + } + + @Override + public void doCommitBacked(String targetId) { + + } + + @Override + public Object doNext(TbsAffairCommitBo param) { + OmsSaleOrder omsOrder = omsSaleOrderService.getById(param.getTargetId()); + R codeRs = seeYonRequestBaseService.getBase( + TbsSeeYonConst.OA_DATA_EXPIRE_ORDER_DR + omsOrder.getOrderSn() + ,"获取条款申请流水号"); + BigDecimal dr = null; + if(codeRs.getStatus()==200 && codeRs.getMsg()!=null){ + try { + String oaRateId = codeRs.getMsg().toString(); + if(oaRateId.equals(TbsSeeYonConst.OTHER_RATE_ID)){ + R codeRs2 = seeYonRequestBaseService.getBase( + TbsSeeYonConst.OA_DATA_EXPIRE_ORDER_DR2 + omsOrder.getOrderSn() + ,"获取条款申请流水号"); + if(codeRs2.getStatus()==200 && codeRs2.getMsg()!=null){ + dr = new BigDecimal(codeRs2.getData()+""); + } + }else { + dr = omsSaleOrderMapper.getExpiredOrderRates(oaRateId); + } + omsOrder.setOaRateId(oaRateId); + omsOrder.setDiscountRate(dr); + omsSaleOrderMapper.updateById(omsOrder); + } catch (Exception e) { + e.printStackTrace(); + } + } + if(dr==null){ + log.error("临期品订单,获取最新的折扣率失败,单号:{}",omsOrder.getOrderSn()); + return null; + } + return null; + } + + @Override + public String getTemplateCode() { + return TbsSeeYonConst.ExpiredOrderConf.Code(); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderPart1ServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderPart1ServiceImpl.java new file mode 100644 index 0000000..923a22c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderPart1ServiceImpl.java @@ -0,0 +1,224 @@ +package com.qs.serve.modules.oms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.CodeGenUtil; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; +import com.qs.serve.modules.goods.entity.GoodsCategoryRule; +import com.qs.serve.modules.goods.entity.GoodsImminentBatch; +import com.qs.serve.modules.goods.entity.dto.GoodsAccrIdsDto; +import com.qs.serve.modules.goods.mapper.GoodsCategoryRuleMapper; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.service.*; +import com.qs.serve.modules.oms.common.OmsOrderCheckState; +import com.qs.serve.modules.oms.entity.OmsSaleOrder; +import com.qs.serve.modules.oms.entity.OmsSaleOrderItem; +import com.qs.serve.modules.oms.entity.bo.OmsVerifySkuParam; +import com.qs.serve.modules.oms.service.*; +import com.qs.serve.modules.sale.mapper.SalePlanGoodsMapper; +import com.qs.serve.modules.sale.mapper.SalePlanMapper; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysDeptService; +import com.qs.serve.modules.sys.service.SysUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2024/6/21 + */ +@Slf4j +@Service +@AllArgsConstructor +public class OmsSaleOrderPart1ServiceImpl implements OmsSaleOrderPart1Service { + + private SysUserService sysUserService; + private SysDeptService sysDeptService; + private SalePlanMapper salePlanMapper; + private SalePlanGoodsMapper salePlanGoodsMapper; + + private OmsSaleOrderService omsSaleOrderService; + private OmsSaleOrderItemService omsSaleOrderItemService; + + private GoodsRuleService goodsRuleService; + private GoodsAccreditService goodsAccreditService; + private GoodsImminentBatchService goodsImminentBatchService; + private GoodsSkuMapper goodsSkuMapper; + private GoodsSkuService goodsSkuService; + private GoodsSpuService goodsSpuService; + private GoodsCategoryRuleMapper goodsCategoryRuleMapper; + private GoodsCustomerPriceService goodsCustomerPriceService; + + private BmsSupplierMapper bmsSupplierMapper; + private BmsRegionMapper bmsRegionMapper; + private BmsSupplierAddressService bmsSupplierAddressService; + + private SeeYonRequestBaseService seeYonRequestBaseService; + private RedisService redisService; + + @Override + public OmsSaleOrder copyOrder(Long orderId) { + OmsSaleOrder order = omsSaleOrderService.getById(orderId); + List orderItems = omsSaleOrderItemService.list(new LambdaQueryWrapper() + .eq(OmsSaleOrderItem::getOrderId, orderId)); + order.setId(null); + String orderPrefix = null; + if (order.getOrderType().equals(0)) { + orderPrefix = ""; + } else if (order.getOrderType().equals(1)) { + orderPrefix = "ZP"; + } else if (order.getOrderType().equals(2)) { + orderPrefix = "SC"; + } else if (order.getOrderType().equals(3)) { + orderPrefix = "SP"; + } else { + Assert.throwEx("订单类型错误"); + } + order.setOrderSn(orderPrefix + CodeGenUtil.generate(CodeGenUtil.SourceKey.OmsOrder)); + SysUser user = sysUserService.getById(AuthContextUtils.getSysUserId()); + order.setOrderSource("CMS"); + order.setCurrency("人民币"); + order.setExchangeRate(1); + order.setVersion("cms"); + order.setUserId(user.getId()); + order.setUserCode(user.getCode()); + order.setUserName(user.getName()); + order.setUserPhone(user.getMobile()); + order.setCheckState(0); + order.setStatus(0); + order.setOrderStatusCombo(0); + order.setPreDeliveryDate(null); + order.setPreDeliveryState(0); + order.setPreProductionDate(null); + order.setOrderCheckState(OmsOrderCheckState.UnPublish.getCode()); + order.setConfirmUserCode(null); + order.setConfirmUserName(null); + order.setCreateBy(null); + order.setCreateTime(LocalDateTime.now()); + omsSaleOrderService.save(order); + for (OmsSaleOrderItem item : orderItems) { + item.setId(null); + item.setVersion("cms"); + item.setOrderId(order.getId()); + item.setOrderSn(order.getOrderSn()); + item.setProductionRemark(null); + item.setPreProductionDate(null); + } + omsSaleOrderItemService.saveBatch(orderItems); + return order; + } + + @Override + public boolean releaseInventory(Long orderId) { + // 释放库存 + OmsSaleOrder omsOrder = omsSaleOrderService.getById(orderId); + // 目前只有临期品需要释放库存 + if (omsOrder.getOrderType().equals(3)) { + List imminentBatches = new ArrayList<>(); + List orderItemList = omsSaleOrderItemService.listByOrderId(orderId); + for (OmsSaleOrderItem orderItem : orderItemList) { + GoodsImminentBatch imminentBatch = goodsImminentBatchService.getById(orderItem.getSkuBatchId()); + imminentBatch.setOrderQuantity(imminentBatch.getOrderQuantity() - orderItem.getQuantity()); + imminentBatches.add(imminentBatch); + } + if (imminentBatches.size() > 0) { + goodsImminentBatchService.updateBatchById(imminentBatches); + } + } + return true; + } + + @Override + public List verifySku(OmsVerifySkuParam param) { + + List errorImminentIds = new ArrayList<>(); + + LocalDate nowDate = LocalDate.now(); + boolean isImminentCheck = CollectionUtil.isNotEmpty(param.getImminentItemIds()); + List goodsImminentBatches = null; + if(isImminentCheck){ + if(CollectionUtil.isEmpty(param.getImminentItemIds())){ + return new ArrayList<>(); + } + goodsImminentBatches = goodsImminentBatchService.listByIds(param.getImminentItemIds()); + for (GoodsImminentBatch batch : goodsImminentBatches) { + if(batch.getEndDate().isBefore(nowDate)){ + errorImminentIds.add(new SimpleKeyValue("临期品已过期",batch.getId())); + } + if(batch.getQuantity()-batch.getOrderQuantity()<=0){ + errorImminentIds.add(new SimpleKeyValue("临期品库存不足",batch.getId())); + } + } + } + + List skuIds = param.getSkuIds(); + if(isImminentCheck){ + skuIds = goodsImminentBatches.stream().map(a->Long.parseLong(a.getSkuId())).collect(Collectors.toList()); + } + + GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(param.getRuleId()); + BmsSupplier supplier = bmsSupplierMapper.selectById(param.getSupplierId()); + + + List errorSkuIds = new ArrayList<>(); + //拦截商品授权维度规则 + GoodsAccrIdsDto accrIdsDto = goodsAccreditService.listIgnoreAcc2(supplier.getId(), supplier.listBizRegionIds(), supplier.listSaleRegionIds()); + if (accrIdsDto != null) { + List selectSkuIds = goodsSkuMapper.listByOtherIds( + accrIdsDto.getCateIds(), + accrIdsDto.getSpuIds(), + accrIdsDto.getSkuIds(), + accrIdsDto.getNotInCateIds(), + accrIdsDto.getNotInSpuIds(), + accrIdsDto.getNotInSkuIds() + ); + for (Long paramSkuId : skuIds) { + for (Long skuId : selectSkuIds) { + if (paramSkuId.equals(skuId)) { + errorSkuIds.add(new SimpleKeyValue("商品未授权",skuId)); + break; + } + } + } + } + + //拦截客户维度规则 + errorSkuIds.addAll(goodsRuleService.checkSkuCode( supplier.getId(),skuIds)); + //拦截客户维度的用户规则 + errorSkuIds.addAll(goodsRuleService.checkSkuCodeByUserId( AuthContextUtils.getSysUserId(),skuIds)); + + //拦截品类下单规则 + errorSkuIds.addAll(omsSaleOrderService.handleCategoryRule(skuIds,categoryRule)); + + if(isImminentCheck){ + if(CollectionUtil.isEmpty(errorSkuIds)){ + for (SimpleKeyValue errorSkuId : errorSkuIds) { + for (GoodsImminentBatch batch : goodsImminentBatches) { + if(batch.getSkuId().equals(errorSkuId.getValue())){ + errorImminentIds.add(new SimpleKeyValue(errorSkuId.getLabel(),batch.getId())); + } + } + } + } + return errorImminentIds; + } + + return errorSkuIds; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderServiceImpl.java new file mode 100644 index 0000000..02ddefd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderServiceImpl.java @@ -0,0 +1,1600 @@ +package com.qs.serve.modules.oms.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.util.StringUtil; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.bms.entity.vo.BmsSupplierExtRegionVo; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; +import com.qs.serve.modules.goods.entity.*; +import com.qs.serve.modules.goods.entity.dto.GoodsAccrIdsDto; +import com.qs.serve.modules.goods.entity.dto.InventoryCusPrice; +import com.qs.serve.modules.goods.entity.so.InventoryCusPriceQuery; +import com.qs.serve.modules.goods.entity.vo.GoodSkuVo; +import com.qs.serve.modules.goods.mapper.GoodsCategoryMapper; +import com.qs.serve.modules.goods.mapper.GoodsCategoryRuleMapper; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.service.*; +import com.qs.serve.modules.oms.common.OmsOrderCheckState; +import com.qs.serve.modules.oms.entity.*; +import com.qs.serve.modules.oms.entity.bo.*; +import com.qs.serve.modules.oms.entity.dto.OmsCalcAmount; +import com.qs.serve.modules.oms.entity.dto.OmsSaleOrderChange; +import com.qs.serve.modules.oms.entity.dto.ShoppingCartsCheckResult; +import com.qs.serve.modules.oms.entity.vo.OmsConfirmOrderResult; +import com.qs.serve.modules.oms.entity.vo.OmsPlanResult; +import com.qs.serve.modules.oms.entity.vo.OmsSpuAssesInfo; +import com.qs.serve.modules.oms.mapper.OmsSaleOrderMapper; +import com.qs.serve.modules.oms.mapper.OmsSeaTankMapper; +import com.qs.serve.modules.oms.mapper.OmsTransportMapper; +import com.qs.serve.modules.oms.mapper.OmsVerSaleOrderMapper; +import com.qs.serve.modules.oms.service.*; +import com.qs.serve.modules.oms.utils.OmsOrderUtil; +import com.qs.serve.modules.sale.entity.SalePlan; +import com.qs.serve.modules.sale.entity.SalePlanGoods; +import com.qs.serve.modules.sale.mapper.SalePlanGoodsMapper; +import com.qs.serve.modules.sale.mapper.SalePlanMapper; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysDeptService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +import static com.qs.serve.modules.tbs.common.TbsSeeYonConst.*; + +/** + * 订单 服务实现类 + * + * @author YenHex + * @since 2022-10-14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class OmsSaleOrderServiceImpl extends ServiceImpl implements OmsSaleOrderService { + + private GoodsSkuMapper goodsSkuMapper; + private GoodsSkuService goodsSkuService; + private GoodsSpuService goodsSpuService; + private GoodsCategoryMapper goodsCategoryMapper; + private GoodsCategoryRuleMapper goodsCategoryRuleMapper; + private GoodsCustomerPriceService goodsCustomerPriceService; + + private BmsSupplierMapper bmsSupplierMapper; + private BmsRegionMapper bmsRegionMapper; + private BmsSupplierAddressService bmsSupplierAddressService; + + private SysUserService sysUserService; + private SysDeptService sysDeptService; + private SalePlanMapper salePlanMapper; + private SalePlanGoodsMapper salePlanGoodsMapper; + + private OmsSaleOrderItemService omsSaleOrderItemService; + private OmsShoppingCartService omsShoppingCartService; + private SeeYonRequestBaseService seeYonRequestBaseService; + private GoodsRuleService goodsRuleService; + private GoodsAccreditService goodsAccreditService; + private GoodsImminentBatchService goodsImminentBatchService; + private RedisService redisService; + private ApplicationEventPublisher applicationEventPublisher; + private OmsVerSaleOrderMapper omsVerSaleOrderMapper; + private OmsSeaTankMapper omsSeaTankMapper; + private OmsTransportMapper omsTransportMapper; + + @Override + public OmsPlanResult getPlanList(OmsPlanParam param) { + String url = "http://59.37.164.96:2505"+"/api/calculate/orders"; + List invItemList = param.getInvItemList(); + List invCodes = invItemList.stream().map(OmsPlanParam.InvItem::getInvCode).collect(Collectors.toList()); + if(invCodes.size()>0){ + List skuList = goodsSkuMapper.selectList(new LambdaQueryWrapper().in(GoodsSku::getSkuCode,invCodes)); + for (OmsPlanParam.InvItem item : invItemList) { + for (GoodsSku sku : skuList) { + if(sku.getSkuCode().equals(item.getInvCode())){ + item.setFactory(sku.getBelong()); + } + } + } + } + String result = HttpUtil.doPost(url, JsonUtil.objectToJson(invItemList),null); + JSONObject root = JSONObject.parseObject(result); + if(root.getInteger("status")==200){ + JSONObject data = root.getJSONObject("data"); + JSONArray itemListJson = data.getJSONArray("sub"); + List itemList = new ArrayList<>(); + for (int i = 0; i < itemListJson.size(); i++) { + try { + Object obj = itemListJson.get(i); + OmsPlanResult.InvPlanItem item = JsonUtil.jsonToPojo(obj.toString(), OmsPlanResult.InvPlanItem.class); + itemList.add(item); + } catch (Exception e) { + e.printStackTrace(); + } + } + String remark = data.getString("remark"); + Date deliveryDate = data.getDate("deliveryDate"); + //封装返回结果 + OmsPlanResult planResult = new OmsPlanResult(); + planResult.setOmsOrderId(param.getOmsOrderId()); + planResult.setDeliveryDate(deliveryDate); + planResult.setRemark(remark); + planResult.setItems(itemList); + + if(StringUtil.isNotEmpty(param.getOmsOrderId())){ + OmsSaleOrder order = this.getById(param.getOmsOrderId()); + if(order.getPreDeliveryState()==null||order.getPreDeliveryState().equals(0)){ + OmsSaleOrder updSaleOrder = new OmsSaleOrder(); + updSaleOrder.setId(order.getId()); + updSaleOrder.setPreDeliveryDate(DateUtils.toLocalDate(deliveryDate)); + updSaleOrder.setPreProductionDate(DateUtils.toLocalDate(deliveryDate)); + updSaleOrder.setProductionRemark(remark); + this.updateById(updSaleOrder); + List omsSaleOrderItems = omsSaleOrderItemService.listByOrderId(Long.parseLong(param.getOmsOrderId())); + for (OmsSaleOrderItem orderItem : omsSaleOrderItems) { + for (OmsPlanResult.InvPlanItem planItem : itemList) { + if(orderItem.getSkuCode().equals(planItem.getInvCode())){ + orderItem.setPreProductionDate(DateUtils.toLocalDate(planItem.getDeliveryDate())); + orderItem.setProductionRemark(planItem.getRemark()); + omsSaleOrderItemService.updateById(orderItem); + } + } + } + } + } + return planResult; + } + return null; + } + + @Override + public void flushPreDelivery(String orderId) { + OmsSaleOrder order = this.getById(orderId); + if(order.getPreDeliveryState()==null||order.getPreDeliveryState().equals(0)){ + List omsSaleOrderItems = omsSaleOrderItemService.listByOrderId(Long.parseLong(orderId)); + OmsPlanParam omsPlanParam = new OmsPlanParam(); + omsPlanParam.setOmsOrderId(orderId); + List invItemList = new ArrayList<>(); + for (OmsSaleOrderItem orderItem : omsSaleOrderItems) { + OmsPlanParam.InvItem invItem = new OmsPlanParam.InvItem(); + invItem.setInvCode(orderItem.getSkuCode()); + invItem.setQty(orderItem.getQuantity()); + invItemList.add(invItem); + } + omsPlanParam.setInvItemList(invItemList); + OmsPlanResult planResult = this.getPlanList(omsPlanParam); + LocalDate date = DateUtils.toLocalDate(planResult.getDeliveryDate()); + order.setPreProductionDate(date); + order.setPreProductionDate(date); + order.setProductionRemark(planResult.getRemark()); + this.updateById(order); + } + + } + + @Override + public BigDecimal getExpiredOrderRateById(String oaId) { + return baseMapper.getExpiredOrderRates(oaId); + } + + @Override + public List> selectExpiredOrderRates() { + return baseMapper.selectExpiredOrderRates(); + } + + @Override + public OmsConfirmOrderResult confirmOrder(OmsOrderBo confirmOrder) { + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + //购物车 + List shoppingCarts; + if (CollectionUtil.isNotEmpty(confirmOrder.getShoppingCartIds())) { + shoppingCarts = omsShoppingCartService.listByIds(confirmOrder.getShoppingCartIds(), supplier.getId()); + } else { + //立即购买,生成临时购物车 + GoodsSku goodsSku = goodsSkuService.getById(confirmOrder.getSkuId()); + GoodsSpu goodsSpu = goodsSpuService.getById(goodsSku.getSpuId()); + OmsShoppingCart shoppingCart = new OmsShoppingCart(); + shoppingCart.setId(0L); + shoppingCart.setSpuId(goodsSku.getSpuId()); + shoppingCart.setSkuId(confirmOrder.getSkuId()); + shoppingCart.setSpuCode(goodsSpu.getSpuCode()); + shoppingCart.setSpuName(goodsSpu.getName()); + shoppingCart.setSkuCode(goodsSku.getSkuCode()); + shoppingCart.setQuantity(confirmOrder.getQuantity()); + shoppingCart.setSpecInfo(goodsSku.getSpecInfos()); + shoppingCart.setPicUrl(goodsSku.getPicUrl()); + shoppingCarts = Arrays.asList(shoppingCart); + } + ShoppingCartsCheckResult cartsCheckResult = omsShoppingCartService.checkShoppingCarts(supplier, shoppingCarts, true); + OmsCalcAmount calcAmount = new OmsCalcAmount(); + BigDecimal totalAmount = BigDecimal.ZERO; + for (OmsShoppingCart shoppingCart : shoppingCarts) { + GoodSkuVo goodSkuVo = shoppingCart.getGoodSkuVo(); + //客户特殊价 + BigDecimal salePrice = goodSkuVo.getSalesPrice(); + shoppingCart.setSupplierSalesPrice(salePrice); + + BigDecimal itemPrice = new BigDecimal(shoppingCart.getQuantity()).multiply(salePrice); + shoppingCart.setItemSaleAmount(itemPrice); + totalAmount.add(itemPrice); + } + calcAmount.setTotalAmount(totalAmount); + // 计算供应商折扣 + // 计算是否有活动优惠 + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getDefault(Long.parseLong(supplier.getId())); + OmsConfirmOrderResult confirmOrderResult = new OmsConfirmOrderResult(); + confirmOrderResult.setSupplier(supplier); + confirmOrderResult.setOrderType(confirmOrder.getOrderType()); + confirmOrderResult.setOrderSource(confirmOrder.getOrderSource()); + confirmOrderResult.setShoppingCarts(shoppingCarts); + confirmOrderResult.setDefaultAddress(supplierAddress); + confirmOrderResult.setAmountInfo(calcAmount); + confirmOrderResult.setCartsCheckResult(cartsCheckResult); + + return confirmOrderResult; + } + + @Override + public OmsConfirmOrderResult confirmOrderPc(OmsOrderSkuBo confirmOrder) { + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + //构建Sku + List spuIds = confirmOrder.getSpuParamList().stream() + .map(OmsOrderSkuBo.SpuParam::getSpuId).collect(Collectors.toList()); + //构建Sku + List skuIds = confirmOrder.getSpuParamList().stream() + .map(OmsOrderSkuBo.SpuParam::getSkuId).collect(Collectors.toList()); + //防止空指针 + spuIds.add(0L); + skuIds.add(0L); + List spuList = goodsSpuService.listByIds(spuIds); + List skuList = goodsSkuService.listByIds(skuIds); + + //通过当前函数获取当前账套对于的skuID,默认全部转化为开平(001)的sku +// Map goodsSpuMap = new HashMap<>(spuList.size()); +// for (GoodsSpu goodsSpu : spuList) { +// goodsSpuMap.put(goodsSpu.getId(),goodsSpu); +// } +// List spuCodeList = spuList.stream().map(GoodsSpu::getSpuCode).collect(Collectors.toList()); +// List spuToSkuKeys = goodsSpuService.getSpuToSkuInfo(GoodsConst.DEFAULT_PlaCE,spuCodeList); +// Map spuGetSkuMap = new HashMap<>(spuToSkuKeys.size()); +// for (OmsSpuToSkuKey toSkuKey : spuToSkuKeys) { +// spuGetSkuMap.put(toSkuKey.getSkuCode(),toSkuKey.getInvCode()); +// } + + //构建临时购物车列表 + List shoppingCartList = new ArrayList<>(); + + for (GoodsSku goodsSku : skuList) { + GoodsSpu goodsSpu = null; + for (GoodsSpu spu : spuList) { + if (goodsSku.getSpuId().equals(spu.getId())) { + goodsSpu = spu; + } + } + if (goodsSku == null) { + Assert.throwEx("商品档案有更新,请刷新页面再试"); + } + OmsShoppingCart shoppingCart = new OmsShoppingCart(); + shoppingCart.setSpuId(goodsSpu.getId()); + shoppingCart.setSpuCode(goodsSpu.getSpuCode()); + int qty = 1; + for (OmsOrderSkuBo.SpuParam spuParam : confirmOrder.getSpuParamList()) { + if (spuParam.getSkuId() != null && goodsSku.getId().equals(spuParam.getSkuId())) { + if (spuParam.getQty() != null) { + qty = spuParam.getQty(); + } + shoppingCart.setVolume(spuParam.getVolume()); + shoppingCart.setWeight(spuParam.getWeight()); + shoppingCart.setRemark(spuParam.getRemark()); + break; + } + } + shoppingCart.setQuantity(qty); + shoppingCart.setSkuId(goodsSku.getId()); + shoppingCart.setSkuCode(goodsSku.getSkuCode()); + shoppingCart.setSpecInfo(goodsSku.getSpecInfos()); + shoppingCart.setAddPrice(goodsSku.getSalesPrice()); + shoppingCartList.add(shoppingCart); + } + + //计算合计 + OmsCalcAmount calcAmount = new OmsCalcAmount(); + calcAmount.setTotalAmount(BigDecimal.ZERO); + + // 计算供应商折扣 + // 计算是否有活动优惠 + //收货地址 + BmsSupplierAddress supplierAddress = null; + if (confirmOrder.getAddressId() == null) { + //supplierAddress = bmsSupplierAddressService.getDefault(Long.parseLong(supplier.getId())); + } else if (confirmOrder.getAddressId().equals(0L)) { + supplierAddress = new BmsSupplierAddress(); + supplierAddress.setId(0L); + } else { + supplierAddress = bmsSupplierAddressService.getById(confirmOrder.getAddressId()); + } + OmsConfirmOrderResult confirmOrderResult = new OmsConfirmOrderResult(); + confirmOrderResult.setSupplier(supplier); + confirmOrderResult.setDefaultAddress(supplierAddress); + confirmOrderResult.setAmountInfo(calcAmount); + confirmOrderResult.setShoppingCarts(shoppingCartList); + confirmOrderResult.setOrderType(confirmOrder.getOrderType()); + confirmOrderResult.setBrandRuleId(confirmOrder.getBrandRuleId()); + confirmOrderResult.setSatisfyPayFlag(confirmOrder.getSatisfyPayFlag()); + confirmOrderResult.setOverbillStatus(confirmOrder.getOverbillStatus()); + return confirmOrderResult; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void modifyOrder(OmsOrderModifyParam param) { + OmsSaleOrder order = super.getById(param.getId()); + if (!order.getStatus().equals(0)) { + Assert.throwEx("非草稿状态无法修改"); + } + if (order.getOrderType().equals(3)) { + Assert.throwEx("临期品订单不支持该接口修改"); + } + order.setId(param.getId()); + order.setOrderType(param.getOrderType()); + order.setOrderSource(param.getOrderSource()); + order.setSupplierAddrId(param.getSupplierAddrId()); + GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(param.getBrandRuleId()); + order.setBrandRuleId(param.getBrandRuleId()); + if (categoryRule != null) { + order.setBrandRuleName(categoryRule.getLabel()); + } + BmsSupplier supplier = null; + if (param.getSupplierId() != null) { + supplier = bmsSupplierMapper.selectById(param.getSupplierId()); + order.setSupplierId(param.getSupplierId()); + order.setSupplierName(supplier.getSupplierName()); + order.setSupplierCode(supplier.getSupplierCode()); + this.appendCusRegion(supplier, order); + } + order.setCdOrderRemark(param.getCdOrderRemark()); + //if(StringUtils.hasText(param.getUserId())){ +// SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); +// order.setUserId(param.getUserId()); +// order.setUserPhone(sysUser.getMobile()); +// order.setUserCode(sysUser.getCode()); + //} + order.setBillType(param.getBillType()); + order.setUrgentFlag(param.getUrgentFlag()); + order.setRemark(param.getRemark()); + order.setSatisfyPayFlag(param.getSatisfyPayFlag()); + order.setOverbillStatus(param.getOverbillStatus()); + + String transportId = param.getTransportId(); + String tankId = param.getTankId(); + this.assignTransportInfo(order, transportId, tankId); + + //通过当前函数获取当前账套对于的skuID,默认全部转化为开平(001)的sku + List spuIds = param.getOrderItems().stream().map(OmsOrderModifyParam.OmsOrderItemModifyBo::getSpuId).collect(Collectors.toList()); + spuIds.add(0L);//兼容空订单,防止空指针 + this.appendBrandCategory(order, spuIds); + List spuList = goodsSpuService.listByIds(spuIds); + Map goodsSpuMap = new HashMap<>(spuList.size()); + for (GoodsSpu goodsSpu : spuList) { + goodsSpuMap.put(goodsSpu.getId(), goodsSpu); + } + List spuCodeList = spuList.stream().map(GoodsSpu::getSpuCode).collect(Collectors.toList()); + /*List spuToSkuKeys = goodsSpuService.getSpuToSkuInfo(GoodsConst.DEFAULT_PlaCE,spuCodeList); + Map spuGetSkuMap = new HashMap<>(spuToSkuKeys.size()); + for (OmsSpuToSkuKey toSkuKey : spuToSkuKeys) { + spuGetSkuMap.put(toSkuKey.getSkuCode(),toSkuKey.getInvCode()); + }*/ + + //构建新的item + List newOrderItemList = new ArrayList<>(); + List orderModifyItems = param.getOrderItems(); + for (OmsOrderModifyParam.OmsOrderItemModifyBo modifyItem : orderModifyItems) { + GoodsSku goodsSku = goodsSkuService.getById(modifyItem.getSkuId()); + GoodsSpu goodsSpu = goodsSpuMap.get(modifyItem.getSpuId()); + OmsSaleOrderItem orderItem = new OmsSaleOrderItem(); + orderItem.setOrderId(order.getId()); + orderItem.setOrderSn(order.getOrderSn()); + orderItem.setSpuId(goodsSpu.getId()); + orderItem.setSpuCode(goodsSpu.getSpuCode()); + orderItem.setSpuTitle(goodsSpu.getName()); + orderItem.setWeight(modifyItem.getWeight()); + orderItem.setVolume(modifyItem.getVolume()); + orderItem.setRemark(modifyItem.getRemark()); + orderItem.setVersion("cms"); + if (goodsSku != null) { + orderItem.setSkuId(goodsSku.getId()); + orderItem.setSkuTitle(goodsSku.getSkuName()); + orderItem.setSkuCode(goodsSku.getSkuCode()); + orderItem.setSpecValues(goodsSku.getSpecInfos()); + orderItem.setSkuBelong(goodsSku.getBelong()); + orderItem.setSkuUnit(goodsSku.getUnitName()); + orderItem.setSkuAddCode(goodsSku.getSkuAddCode()); + orderItem.setSkuImg(goodsSku.getPicUrl()); + orderItem.setSalesPrice(goodsSku.getSalesPrice()); + orderItem.setCusPrice(goodsSku.getSalesPrice()); + orderItem.setMarketPrice(goodsSku.getMarketPrice()); + } else { + orderItem.setSkuId(0L); + orderItem.setSkuCode(""); + orderItem.setSkuUnit(""); + orderItem.setSkuImg(null); + orderItem.setSpecValues(goodsSpu.getName()); + orderItem.setSalesPrice(BigDecimal.ZERO); + orderItem.setCusPrice(BigDecimal.ZERO); + orderItem.setMarketPrice(BigDecimal.ZERO); + } + orderItem.setQuantity(modifyItem.getQuantity()); + newOrderItemList.add(orderItem); + } + + List skuCodes = newOrderItemList.stream().map(OmsSaleOrderItem::getSkuCode).collect(Collectors.toList()); + + //防止空指针 + skuCodes.add("NULL"); + + //商品特殊价 + this.buildSkuSpecPrice(supplier, newOrderItemList, skuCodes); + + //拦截商品授权维度规则 + this.checkGoodsRule(supplier, newOrderItemList); + + //拦截客户维度规则 + goodsRuleService.checkSkuCode(skuCodes, supplier.getId(), true); + + //用户维度拦截 + goodsRuleService.checkSkuCodeByUserId(skuCodes,AuthContextUtils.getSysUserId(),true); + + //拦截品类下单规则 + this.handleCategoryRule(categoryRule, newOrderItemList); + + this.updateById(order); + //移除已有的ITEM + LambdaQueryWrapper rmItemLqw = new LambdaQueryWrapper<>(); + rmItemLqw.eq(OmsSaleOrderItem::getOrderId, param.getId()); + omsSaleOrderItemService.remove(rmItemLqw); + //重新保存item + omsSaleOrderItemService.saveBatch(newOrderItemList); + + //刷新订单发货时间 + this.flushPreDelivery(order.getId() + ""); + + //立即下单 + if (param.getInstantFlag() != null && param.getInstantFlag().equals(1)) { + this.buildPriceOrder(order.getId() + "", null); + } + } + + private void checkGoodsRule(BmsSupplier supplier, List newOrderItemList) { + GoodsAccrIdsDto accrIdsDto = goodsAccreditService.listIgnoreAcc2(supplier.getId(), supplier.listBizRegionIds(), supplier.listSaleRegionIds()); + if (accrIdsDto != null) { + List skuIds = goodsSkuMapper.listByOtherIds( + accrIdsDto.getCateIds(), + accrIdsDto.getSpuIds(), + accrIdsDto.getSkuIds(), + accrIdsDto.getNotInCateIds(), + accrIdsDto.getNotInSpuIds(), + accrIdsDto.getNotInSkuIds() + ); + for (OmsSaleOrderItem orderItem : newOrderItemList) { + for (Long skuId : skuIds) { + if (orderItem.getSkuId().equals(skuId)) { + Assert.throwEx("商品未授权:" + orderItem.getSkuCode()); + } + } + } + } + } + + /** + * 拦截规则 + * + * @param categoryRule + * @param orderItems + */ + @Override + public void handleCategoryRule(GoodsCategoryRule categoryRule, List orderItems) { + if (categoryRule != null && orderItems.size() > 0) { + List cids = Arrays.asList(categoryRule.getBrandIds()); + List igcids = null; + if (categoryRule.getIgnoreBrandIds() != null) { + igcids = Arrays.asList(categoryRule.getIgnoreBrandIds()); + } + Set spuIds = orderItems.stream().map(OmsSaleOrderItem::getSpuId).collect(Collectors.toSet()); + List skuIds = orderItems.stream().map(OmsSaleOrderItem::getSkuId).collect(Collectors.toList()); + List skuList = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(skuIds)) { + skuList = goodsSkuService.listByIds(skuIds); + for (GoodsSku sku : skuList) { + if (!sku.getOrderFlag().equals(1) && sku.getSpecialFlag().equals(0)) { + Assert.throwEx("单品[" + sku.getSkuCode() + "]不予下单且非特殊品"); + } + } + skuIds.addAll(skuList.stream().map(GoodsSku::getSpuId).collect(Collectors.toList())); + } + + List spuList = goodsSpuService.listByIds(spuIds); + for (GoodsSpu goodsSpu : spuList) { + if (!goodsSpu.getShelf().equals(1)) { + Assert.throwEx("SKU已下架[" + goodsSpu.getSpuCode() + "]不予下单"); + } + if (!goodsSpu.getOrderFlag().equals(1)) { + boolean msp = skuList.stream().anyMatch(m -> m.getSpuId().equals(goodsSpu.getId()) && m.getSpecialFlag().equals(1)); + if (!msp) { + Assert.throwEx("SKU[" + goodsSpu.getSpuCode() + "]不予下单"); + } + } + matchIgnoreCate(igcids, goodsSpu.getCategoryFirst(), goodsSpu); + matchIgnoreCate(igcids, goodsSpu.getCategorySecond(), goodsSpu); + matchIgnoreCate(igcids, goodsSpu.getCategoryThird(), goodsSpu); + matchRuleCate(cids, goodsSpu); + } + } + } + + private void matchRuleCate(List cids, GoodsSpu goodsSpu) { + boolean isOk = false; + for (String cid : cids) { + if(cid.equals(goodsSpu.getCategoryFirst())|| + cid.equals(goodsSpu.getCategorySecond())|| + cid.equals(goodsSpu.getCategoryThird())){ + isOk = true; + break; + } + } + if(!isOk){ + Assert.throwEx("不符合下单规则:"+ goodsSpu.getSpuCode()); + } + } + + + @Override + public List handleCategoryRule(List skuIds,GoodsCategoryRule categoryRule) { + List errSkuIds = new ArrayList<>(); + if (categoryRule != null && skuIds.size() > 0) { + List cids = Arrays.asList(categoryRule.getBrandIds()); + List igcids = null; + if (categoryRule.getIgnoreBrandIds() != null) { + igcids = Arrays.asList(categoryRule.getIgnoreBrandIds()); + } + List skuList = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(skuIds)) { + skuList = goodsSkuService.listByIds(skuIds); + for (GoodsSku sku : skuList) { + if (!sku.getOrderFlag().equals(1) && sku.getSpecialFlag().equals(0)) { + errSkuIds.add(new SimpleKeyValue("单品不予下单且非特殊品",sku.getId())); + break; + } + } + skuIds.addAll(skuList.stream().map(GoodsSku::getSpuId).collect(Collectors.toList())); + } + + Set spuIds = skuList.stream().map(GoodsSku::getSpuId).collect(Collectors.toSet()); + List spuList = goodsSpuService.listByIds(spuIds); + for (GoodsSpu goodsSpu : spuList) { + if (!goodsSpu.getShelf().equals(1)) { + Long errSkuId = null; + for (GoodsSku sku : skuList) { + if(sku.getSpuId().equals(goodsSpu.getId())){ + errSkuId = sku.getId(); + } + } + errSkuIds.add(new SimpleKeyValue("SKU不予下单且非特殊品",errSkuId)); + } + if (!goodsSpu.getOrderFlag().equals(1)) { + boolean msp = skuList.stream().anyMatch(m -> m.getSpuId().equals(goodsSpu.getId()) && m.getSpecialFlag().equals(1)); + if (!msp) { + Long errSkuId = null; + for (GoodsSku sku : skuList) { + if(sku.getSpuId().equals(goodsSpu.getId())){ + errSkuId = sku.getId(); + } + } + errSkuIds.add(new SimpleKeyValue("SKU不予下单",errSkuId)); + } + } + matchIgnoreCate(igcids, goodsSpu.getCategoryFirst(), goodsSpu); + matchIgnoreCate(igcids, goodsSpu.getCategorySecond(), goodsSpu); + matchIgnoreCate(igcids, goodsSpu.getCategoryThird(), goodsSpu); + matchRuleCate(cids, goodsSpu); + + } + } + return errSkuIds; + } + + /** + * 拦截忽略的品牌 + * + * @param igcids + * @param spuCateId + * @param goodsSpu + */ + private void matchIgnoreCate(List igcids, String spuCateId, GoodsSpu goodsSpu) { + if (igcids == null || spuCateId == null || spuCateId.equals("") || spuCateId.equals("0")) { + return; + } + for (String igcid : igcids) { + if (spuCateId.equals(igcid)) { + Assert.throwEx("[" + goodsSpu.getSkuCode() + "]" + goodsSpu.getName() + ",不符合订单规则"); + } + } + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public OmsSaleOrder createOrder(OmsOrderBo omsOrderBo) { + OmsConfirmOrderResult confirmOrder = this.confirmOrder(omsOrderBo); + confirmOrder.setLatitudeFrom("SKU"); + CreateOrderParam createOrderParam = omsOrderBo.getCreateOrderParam(); + return this.buildOmsOrder(confirmOrder, createOrderParam); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public OmsSaleOrder createOrderPc(OmsOrderSkuBo omsOrderBo) { + OmsConfirmOrderResult confirmOrder = this.confirmOrderPc(omsOrderBo); + confirmOrder.setLatitudeFrom("SPU"); + confirmOrder.setOrderSource(omsOrderBo.getOrderSource()); + CreateOrderParam createOrderParam = omsOrderBo.getCreateOrderParam(); + createOrderParam.setCdOrderRemark(omsOrderBo.getCdOrderRemark()); + OmsSaleOrder order = this.buildOmsOrder(confirmOrder, createOrderParam); + if (omsOrderBo.getInstantFlag() != null && omsOrderBo.getInstantFlag().equals(1)) { + this.buildPriceOrder(order.getId() + "", null); + } + return order; + } + + @NotNull + private OmsSaleOrder buildOmsOrder(OmsConfirmOrderResult confirmOrder, CreateOrderParam createOrderParam) { + SysUser user = sysUserService.getById(AuthContextUtils.getSysUserId()); + BmsSupplier supplier = confirmOrder.getSupplier(); + BmsSupplierAddress address = confirmOrder.getDefaultAddress(); +// if(address==null){ +// Assert.throwEx("请补充收货地址"); +// } + List shoppingCarts = confirmOrder.getShoppingCarts(); + OmsSaleOrder order = new OmsSaleOrder(); + String orderPrefix = null; + if (order.getOrderType() == null || order.getOrderType().equals(0)) { + orderPrefix = ""; + } else if (order.getOrderType().equals(1)) { + orderPrefix = "ZP"; + } else if (order.getOrderType().equals(2)) { + orderPrefix = "SC"; + } + order.setOrderSn(orderPrefix + CodeGenUtil.generate(CodeGenUtil.SourceKey.OmsOrder)); + + GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(confirmOrder.getBrandRuleId()); + if (categoryRule != null) { + order.setBrandRuleName(categoryRule.getLabel()); + } + order.setSatisfyPayFlag(confirmOrder.getSatisfyPayFlag()); + order.setOverbillStatus(confirmOrder.getOverbillStatus()); + order.setOrderSource(confirmOrder.getOrderSource()); + order.setCdOrderRemark(createOrderParam.getCdOrderRemark()); + order.setOrderType(confirmOrder.getOrderType()); + order.setSupplierId(Long.parseLong(supplier.getId())); + order.setSupplierCode(supplier.getCode()); + order.setSupplierName(supplier.getName()); + order.setSupplierAddrId(address != null ? address.getId() : 0); + order.setBrandRuleId(confirmOrder.getBrandRuleId()); + order.setUserId(user.getId()); + order.setUserName(user.getName()); + order.setUserCode(user.getCode()); + order.setUserPhone(user.getMobile()); + order.setVersion("cms"); + + String transportId = confirmOrder.getTransportId(); + String tankId = confirmOrder.getTankId(); + this.assignTransportInfo(order, transportId, tankId); + + this.appendCusRegion(supplier, order); + + order.setBillType(createOrderParam.getBillType()); + order.setUrgentFlag(createOrderParam.getUrgentFlag()); + order.setRemark(createOrderParam.getRemark()); + this.save(order); + + //兼容转换 +// List spuToSkuKeys = null; +// if(confirmOrder.getLatitudeFrom()!=null&&confirmOrder.getLatitudeFrom().equals("SPU")){ +// List spuCodes = shoppingCarts.stream().map(OmsShoppingCart::getSpuCode).collect(Collectors.toList()); +// spuToSkuKeys = goodsSpuService.getSpuToSkuInfo(GoodsConst.DEFAULT_PlaCE,spuCodes); +// for (OmsSpuToSkuKey skuKey : spuToSkuKeys) { +// for (OmsShoppingCart cart : shoppingCarts) { +// if(skuKey.getSkuCode().equals(cart.getSpuCode())){ +// cart.setSkuCode(skuKey.getInvCode()); +// } +// } +// } +// } + + + List orderItems = new ArrayList<>(); + for (OmsShoppingCart shoppingCart : shoppingCarts) { + OmsSaleOrderItem orderItem = new OmsSaleOrderItem(); + orderItem.setOrderId(order.getId()); + orderItem.setOrderSn(order.getOrderSn()); + orderItem.setWeight(shoppingCart.getWeight()); + orderItem.setVolume(shoppingCart.getVolume()); + orderItem.setRemark(shoppingCart.getRemark()); + orderItem.setSkuBelong(shoppingCart.getSkuBelong()); + if (confirmOrder.getLatitudeFrom() != null && confirmOrder.getLatitudeFrom().equals("SPU")) { + // spu维度 + GoodsSku goodsSku = goodsSkuService.getById(shoppingCart.getSkuId()); + orderItem.setSpuId(shoppingCart.getSpuId()); + orderItem.setSpuTitle(shoppingCart.getSpuName()); + orderItem.setSkuId(shoppingCart.getSkuId()); + orderItem.setSkuCode(shoppingCart.getSkuCode()); + orderItem.setSkuUnit(null); + orderItem.setSkuImg(shoppingCart.getPicUrl()); + orderItem.setSpecValues(shoppingCart.getSpecInfo()); + orderItem.setSpuCode(shoppingCart.getSpuCode()); + if (goodsSku != null) { + GoodsSpu goodsSpu = goodsSpuService.getById(goodsSku.getSpuId()); + orderItem.setSpuTitle(goodsSpu.getName()); + orderItem.setSkuTitle(goodsSpu.getSkuName()); + + log.warn("shoppingCart json =>" + JsonUtil.objectToJson(shoppingCart)); + orderItem.setSkuTitle(goodsSku.getSkuName()); + orderItem.setMarketPrice(goodsSku.getMarketPrice()); + orderItem.setSalesPrice(goodsSku.getSalesPrice()); + orderItem.setCusPrice(goodsSku.getSalesPrice()); + } + } else { + // 默认sku + GoodSkuVo goodSkuVo = shoppingCart.getGoodSkuVo(); + GoodsSpu goodsSpu = goodsSpuService.getByCode(goodSkuVo.getSpuCode()); + orderItem.setSpuId(goodSkuVo.getSpuId()); + orderItem.setSpuCode(goodSkuVo.getSpuCode()); + orderItem.setSpuTitle(goodsSpu.getName()); + orderItem.setSkuTitle(goodsSpu.getSkuName()); + orderItem.setSkuId(goodSkuVo.getId()); + orderItem.setSkuCode(goodSkuVo.getSkuCode()); + orderItem.setSkuAddCode(goodSkuVo.getSkuAddCode()); + orderItem.setSkuUnit(goodSkuVo.getUnitName()); + orderItem.setSkuImg(goodSkuVo.getPicUrl()); + orderItem.setSpecValues(goodSkuVo.getSpecInfos()); + orderItem.setMarketPrice(goodSkuVo.getMarketPrice()); + orderItem.setSalesPrice(goodSkuVo.getSalesPrice()); + } + orderItem.setQuantity(shoppingCart.getQuantity()); + orderItem.setCusPrice(shoppingCart.getSupplierSalesPrice()); + orderItems.add(orderItem); + } + + //兼容客户特殊价 + List inventoryCusPrices = null; + try { + String supplierCode = supplier.getCode(); + List skuCodes = orderItems.stream().map(OmsSaleOrderItem::getSkuCode).collect(Collectors.toList()); + if (skuCodes.size() > 0) { +// List customerPrices = goodsCustomerPriceService.getBySupplierCodeAndCode(supplierCode, skuCodes); +// inventoryCusPrices = customerPrices.stream().map(obj -> { +// InventoryCusPrice cusPrice = new InventoryCusPrice(); +// cusPrice.setCusCode(supplierCode); +// cusPrice.setInvCode(obj.getSkuCode()); +// cusPrice.setPrice(obj.getRealPrice()); +// return cusPrice; +// }).collect(Collectors.toList()); + InventoryCusPriceQuery query = new InventoryCusPriceQuery(); + query.setCusCode(supplierCode); + query.setInvCodes(skuCodes); + R res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); + if(res.getStatus().equals(200)){ + inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); + } + } + } catch (Exception e) { + log.error("客户特殊价异常:{}", e.getMessage()); + } + if (inventoryCusPrices != null) { + for (OmsSaleOrderItem orderItem : orderItems) { + for (InventoryCusPrice cusPrice : inventoryCusPrices) { + if (orderItem.getSkuCode().equals(cusPrice.getInvCode())) { + orderItem.setMarketPrice(cusPrice.getPrice()); + orderItem.setCusPrice(cusPrice.getPrice()); + orderItem.setSalesPrice(cusPrice.getPrice()); + } + } + } + } + + this.handleCategoryRule(categoryRule, orderItems); + + // 更新品牌相关参数 + List spuIds = orderItems.stream().map(OmsSaleOrderItem::getSpuId).collect(Collectors.toList()); + this.appendBrandCategory(order, spuIds); + this.updateById(order); + // 保存明细 + omsSaleOrderItemService.saveBatch(orderItems); + + + //清空勾选的购物车 + List cartIds = confirmOrder.getShoppingCarts().stream() + .filter(a -> a.getId() != null) + .map(OmsShoppingCart::getId).collect(Collectors.toList()); + if (CollectionUtil.isNotEmpty(cartIds)) { + omsShoppingCartService.removeBatchByIds(cartIds); + } + return order; + } + + private void assignTransportInfo(OmsSaleOrder order, String transportId, String tankId) { + if(StringUtil.isNotEmpty(transportId)){ + OmsTransport transport = omsTransportMapper.selectById(transportId); + if(transport!=null){ + order.setTransportId(transport.getId()); + order.setTransport(transport.getLabel()); + if(transport.getShowTankFlag().equals(1)){ + if(StringUtil.isNotEmpty(tankId)){ + OmsSeaTank seaTank = omsSeaTankMapper.selectById(tankId); + if(seaTank!=null){ + order.setTankId(seaTank.getId()); + order.setTankName(seaTank.getLabel()); + } + } + }else { + order.setTankId("0"); + order.setTankName(""); + } + } + }else { + order.setTransportId("0"); + order.setTransport(""); + order.setTankId("0"); + order.setTankName(""); + } + } + + /** + * 根据商品SPU ID列表补充订单的品牌类别信息 + * 此方法旨在通过SPU ID获取对应的顶级分类ID,并进一步获取分类名称,最终将这些信息汇总到订单对象中 + * @param order 订单对象,用于存储品牌类别信息 + * @param spuIds 商品SPU ID列表,用于查询商品的顶级分类 + */ + private void appendBrandCategory(OmsSaleOrder order, List spuIds) { + if(CollUtil.isNotEmpty(spuIds)){ + List cateIds = goodsSpuService.list(new LambdaQueryWrapper() + .in(GoodsSpu::getId, spuIds) + .select(GoodsSpu::getCategoryFirst)) + .stream() + .map(GoodsSpu::getCategoryFirst) + .collect(Collectors.toList()); + if(CollUtil.isNotEmpty(cateIds)){ + String cateNames = goodsCategoryMapper.selectBatchIds(cateIds) + .stream().map(GoodsCategory::getName).collect(Collectors.joining(",")); + order.setAllBands(cateNames); + } + } + } + + /** + * 将供应商的自定义区域信息附加到订单中 + * 此方法用于从供应商信息中提取客户相关的区域数据,并将其填充到订单对象中 + * 这有助于在订单处理过程中考虑供应商的特定区域需求或特性 + * @param supplier 供应商对象,包含供应商的详细信息 + * @param order 订单对象,将要附加区域信息的目标 + */ + private void appendCusRegion(BmsSupplier supplier, OmsSaleOrder order) { + + try { + // 获取供应商的扩展区域信息 + BmsSupplierExtRegionVo regionVo = bmsSupplierMapper.getBmsSupplierExtRegionVo(supplier.getId()); + + if (regionVo == null) { + log.warn("Supplier ID {} does not have any extended region information", supplier.getId()); + return; + } + + // 设置销售区域信息 + order.setCusSaleRegion(regionVo.getSalRegionName()); + order.setCusSaleRegion2(regionVo.getSalRegionName2()); + order.setCusSaleRegion3(regionVo.getSalRegionName3()); + order.setCusSaleRegionAll(appendRegions(regionVo.getSalRegionName(), regionVo.getSalRegionName2(), regionVo.getSalRegionName3())); + order.setCusSaleRegionAll(order.getCusSaleRegionAll().replaceAll("_null","")); + order.setCusSaleRegionCodes(appendCodes(regionVo.getSalRegionCode(), regionVo.getSalRegionCode2(), regionVo.getSalRegionCode3())); + + // 设置业务区域信息 + order.setCusBigRegion(regionVo.getBigRegion()); + order.setCusProvince(regionVo.getBizRegionName()); + order.setCusCity(regionVo.getBizRegionName2()); + order.setCusArea(regionVo.getBizRegionName3()); + order.setCusBizRegionAll(appendRegions(regionVo.getBizRegionName(), regionVo.getBizRegionName2(), regionVo.getBizRegionName3())); + order.setCusBizRegionAll(order.getCusBizRegionAll().replaceAll("_null","")); + order.setCusBizRegionCodes(appendCodes(regionVo.getBizRegionCode(), regionVo.getBizRegionCode2(), regionVo.getBizRegionCode3())); + + } catch (Exception e) { + log.error("Error appending customer region information for supplier ID {}: {}", supplier.getId(), e.getMessage(), e); + } + } + + /** + * 辅助方法:拼接三个区域名称 + * @param region1 第一个区域名称 + * @param region2 第二个区域名称 + * @param region3 第三个区域名称 + * @return 拼接后的区域名称字符串 + */ + private String appendRegions(String region1, String region2, String region3) { + StringBuilder sb = new StringBuilder(); + if (region1 != null) sb.append(region1); + if (region2 != null) sb.append(",").append(region2); + if (region3 != null) sb.append(",").append(region3); + return sb.toString(); + } + + /** + * 辅助方法:拼接三个区域代码 + * @param code1 第一个区域代码 + * @param code2 第二个区域代码 + * @param code3 第三个区域代码 + * @return 拼接后的区域代码字符串 + */ + private String appendCodes(String code1, String code2, String code3) { + StringBuilder sb = new StringBuilder(); + if (code1 != null) sb.append(code1); + if (code2 != null) sb.append(",").append(code2); + if (code3 != null) sb.append(",").append(code3); + return sb.toString(); + } + + + @Override + public List getSpuAssess(OmsSpuAssesInfoBo param) { + List spuIds = param.getSpuIds(); + Integer year = param.getYearNum(); + Integer month = param.getMonthNum(); + String supplierId = param.getSupplierId(); + LambdaQueryWrapper spLqw = new LambdaQueryWrapper<>(); + spLqw.eq(SalePlan::getYearNum, year); + spLqw.eq(SalePlan::getMonthNum, month); + spLqw.eq(SalePlan::getSupplierId, supplierId); + //spLqw.eq(SalePlan::getPlanState,1); + List salePlanList = salePlanMapper.selectList(spLqw); + Map spuIdAndSum = new HashMap<>(); + if (salePlanList.size() > 0) { + List spIds = salePlanList.stream().map(SalePlan::getId).collect(Collectors.toList()); + LambdaQueryWrapper spgLqw = new LambdaQueryWrapper<>(); + spgLqw.in(SalePlanGoods::getPlanId, spIds); + spgLqw.in(SalePlanGoods::getTargetId, spuIds); + List salePlanGoodsList = salePlanGoodsMapper.selectList(spgLqw); + for (SalePlanGoods planGoods : salePlanGoodsList) { + spuIdAndSum.merge(planGoods.getTargetId(), planGoods.getQty(), Integer::sum); + } + } + List spuAssesInfoList = new ArrayList<>(); + for (Long spuId : spuIds) { + OmsSpuAssesInfo assesInfo = new OmsSpuAssesInfo(); + assesInfo.setSpuId(spuId); + Integer sum = spuIdAndSum.get(spuId); + assesInfo.setNum(sum == null ? 0 : sum); + spuAssesInfoList.add(assesInfo); + } + return spuAssesInfoList; + } + + @Override + public List getChangeLog(String orderCode) { + // 获取订单历史版本列表并按创建时间正序排序 + List orderList = this.listHistoryOrderByCode(orderCode); + if(CollUtil.isEmpty(orderList)) { + return new ArrayList<>(); + } + + // 按创建时间正序排序 + orderList = orderList.stream() + .sorted(Comparator.comparing(OmsSaleOrder::getCreateTime)) + .collect(Collectors.toList()); + + Map versionChanges = new HashMap<>(); + + // 第一个订单作为基准参照物 + OmsSaleOrder baseOrder = orderList.get(0); + List baseItems = baseOrder.getItemList(); + + try { + OmsSaleOrderChange change = new OmsSaleOrderChange(); + if(baseOrder.getOrderStatusCombo().equals(0)){ + change.setUserName(baseOrder.getUserName()); + }else { + change.setUserName(baseOrder.getConfirmUserName()); + } + change.setOptionType("新增"); + change.setVersion(baseOrder.getVersion()); + change.setTime(baseOrder.getUpdateTime()); + StringBuilder sb = new StringBuilder(); + if(CollUtil.isNotEmpty(baseItems)){ + for (OmsSaleOrderItem baseItem : baseItems) { + sb.append(String.format("商品[%s] 数量:%d,价格:%.2f\n", + baseItem.getSkuCode(), + baseItem.getQuantity(), + baseItem.getSalesPrice())); + } + change.setRemark(sb.toString()); + } + versionChanges.put(baseOrder.getVersion(), change); + } catch (Exception e) { + e.printStackTrace(); + } + + // 从第二个订单开始比较变化 + for(int i = 1; i < orderList.size(); i++) { + OmsSaleOrder currentOrder = orderList.get(i); + List currentItems = currentOrder.getItemList(); + String currentVersion = currentOrder.getVersion(); + + // 获取或创建当前版本的变更记录 + OmsSaleOrderChange versionChange = versionChanges.computeIfAbsent(currentVersion, k -> { + OmsSaleOrderChange change = new OmsSaleOrderChange(); + change.setVersion(currentVersion); + change.setUserName(currentOrder.getConfirmUserName()); + change.setTime(currentOrder.getUpdateTime()); + return change; + }); + + List remarks = new ArrayList<>(); + boolean hasAdd = false; + boolean hasModify = false; + boolean hasDelete = false; + + // 比较商品变化 + if(CollUtil.isNotEmpty(baseItems) && CollUtil.isNotEmpty(currentItems)) { + Set matchedSkus = new HashSet<>(); + + // 检查新增和修改的商品 + for(OmsSaleOrderItem currentItem : currentItems) { + boolean found = false; + for(OmsSaleOrderItem baseItem : baseItems) { + if(currentItem.getSkuCode().equals(baseItem.getSkuCode())) { + found = true; + matchedSkus.add(currentItem.getSkuCode()); + + // 检查数量变化 + if(!currentItem.getQuantity().equals(baseItem.getQuantity())) { + hasModify = true; + remarks.add(String.format("[改数量] 商品[%s]数量从%d变更为%d", + currentItem.getSkuCode(), + baseItem.getQuantity(), + currentItem.getQuantity())); + } + + // 检查销售价变化 + if(currentItem.getSalesPrice() != null && baseItem.getSalesPrice() != null + && currentItem.getSalesPrice().compareTo(baseItem.getSalesPrice()) != 0) { + hasModify = true; + remarks.add(String.format("[改价格] 商品[%s]销售价从%.2f变更为%.2f", + currentItem.getSkuCode(), + baseItem.getSalesPrice(), + currentItem.getSalesPrice())); + } + break; + } + } + + // 新增的商品 + if(!found) { + hasAdd = true; + remarks.add(String.format("[新增] 商品[%s]数量%d", + currentItem.getSkuCode(), + currentItem.getQuantity())); + } + } + + // 检查删除的商品 + for(OmsSaleOrderItem baseItem : baseItems) { + if(!matchedSkus.contains(baseItem.getSkuCode())) { + hasDelete = true; + remarks.add(String.format("[删除] 商品[%s]", baseItem.getSkuCode())); + } + } + } + + // 设置操作类型 + if(hasDelete && !hasAdd && !hasModify) { + versionChange.setOptionType("删除"); + } else if(hasAdd || hasModify) { + versionChange.setOptionType("修改"); + }else { + versionChange.setOptionType("无变动"); + } + + // 合并备注信息 + if(!remarks.isEmpty()) { + String existingRemark = versionChange.getRemark(); + String newRemarks = String.join("\n", remarks); + versionChange.setRemark(existingRemark == null ? newRemarks : + existingRemark + "\n" + newRemarks); + } + + // 更新基准订单为当前订单,用于下一轮比较 + baseOrder = currentOrder; + baseItems = currentItems; + } + + // 将Map的values转为List并按time排序 + return versionChanges.values().stream() + .sorted(Comparator.comparing(OmsSaleOrderChange::getTime)) + .collect(Collectors.toList()); + } + + @Override + public List listHistoryOrderByCode(String code) { + List omsSaleOrderList = this.list(new LambdaQueryWrapper() + .eq(OmsSaleOrder::getOrderSn, code)); + if(CollUtil.isNotEmpty(omsSaleOrderList)){ + // 排序版本号 + omsSaleOrderList = omsSaleOrderList.stream() + .sorted(Comparator.comparing(OmsSaleOrder::getVersion)) + .collect(Collectors.toList()); + + List erpOrderIds = omsSaleOrderList.stream().map(OmsSaleOrder::getId).collect(Collectors.toList()); + List itemList = omsSaleOrderItemService.list(new LambdaQueryWrapper() + .eq(OmsSaleOrderItem::getOrderSn, code) + .eq(OmsSaleOrderItem::getDelFlag,0) + .in(OmsSaleOrderItem::getOrderId,erpOrderIds) + ); + if(CollUtil.isNotEmpty(itemList)){ + Map> verAndItemList = itemList.stream() + .collect(Collectors.groupingBy(OmsSaleOrderItem::getVersion)); + for (OmsSaleOrder omsSaleOrder : omsSaleOrderList) { + List orderItems = verAndItemList.get(omsSaleOrder.getVersion()); + omsSaleOrder.setItemList(orderItems); + } + } + } + return omsSaleOrderList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public OmsSaleOrder modifyImminentOrder(OmsOrderImminentBo param) { + + SysUser user = sysUserService.getById(AuthContextUtils.getSysUserId()); + GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(param.getBrandRuleId()); + BmsSupplier supplier = bmsSupplierMapper.selectById(param.getSupplierId()); + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(param.getAddressId()); + + OmsSaleOrder order; + if (param.getId() != null) { + order = this.getById(param.getId()); + if (!order.getOrderType().equals(3)) { + Assert.throwEx("订单类型不支持混用"); + } + if(!order.getOrderCheckState().equals(OmsOrderCheckState.UnPublish.getCode()) + &&!order.getOrderCheckState().equals(OmsOrderCheckState.Rollback.getCode())){ + Assert.throwEx("OA审批状态拦截"); + } + } else { + order = new OmsSaleOrder(); + order.setOrderSn("SP" + CodeGenUtil.generate(CodeGenUtil.SourceKey.OmsOrder)); + } + order.setCdOrderRemark(param.getCdOrderRemark()); + order.setOaRateId(param.getOaRateId()); + if(order.getOaRateId().equals(OTHER_RATE_ID)){ + BigDecimal discountRate = baseMapper.getExpiredOrderRates(param.getOaRateId()); + order.setDiscountRate(discountRate); + }else { + order.setDiscountRate(param.getDiscountRate()); + } + order.setOrderType(3); + order.setSupplierId(Long.parseLong(supplier.getId())); + order.setSupplierCode(supplier.getCode()); + order.setSupplierName(supplier.getName()); + order.setSupplierAddrId(supplierAddress != null ? supplierAddress.getId() : 0); + order.setBrandRuleId(param.getBrandRuleId()); + order.setUserId(user.getId()); + order.setUserName(user.getName()); + order.setUserCode(user.getCode()); + order.setUserPhone(user.getMobile()); + order.setBillType(param.getBillType()); + order.setUrgentFlag(param.getUrgentFlag()); + order.setRemark(param.getRemark()); + this.saveOrUpdate(order); + + List orderItems = new ArrayList<>(); + + if (CollectionUtil.isNotEmpty(param.getItemList())) { + Set batchSkuIds = param.getItemList().stream().map(OmsOrderImminentBo.ItemParam::getBatchSkuId) + .collect(Collectors.toSet()); + if (order.getStatus() != null && !order.getStatus().equals(0) && CollectionUtil.isEmpty(param.getItemList())) { + Assert.throwEx("请选择商品"); + } + List imminentBatches = goodsImminentBatchService + .list( + new LambdaQueryWrapper() + .in(GoodsImminentBatch::getId, batchSkuIds) + .ge(GoodsImminentBatch::getEndDate, LocalDate.now()) + ); + if (CollectionUtil.isEmpty(imminentBatches)) { + Assert.throwEx("参数过期或无效,请重新选择商品"); + } + + Set skuIds = imminentBatches.stream() + .map(GoodsImminentBatch::getSkuId).collect(Collectors.toSet()); + if (skuIds.size() != imminentBatches.size()) { + Assert.throwEx("不同批次相同产品,请分开下单"); + } + + List goodsSkuList = goodsSkuService.listByIds(skuIds); + + List spuIds = goodsSkuList.stream().map(GoodsSku::getSpuId).collect(Collectors.toList()); + spuIds.add(0L); + List spuList = goodsSpuService.listByIds(spuIds); + + for (OmsOrderImminentBo.ItemParam item : param.getItemList()) { + for (GoodsImminentBatch batch : imminentBatches) { + if (item.getBatchSkuId().equals(batch.getId())) { + for (GoodsSku sku : goodsSkuList) { + if (sku.getId().toString().equals(batch.getSkuId())) { + //创建OrderItem + OmsSaleOrderItem orderItem = createImminentOrderItem(order, spuList, item, batch, sku); + orderItems.add(orderItem); + } + } + } + } + } + + List skuCodes = orderItems.stream() + .map(OmsSaleOrderItem::getSkuCode).collect(Collectors.toList()); + + //商品特殊价 + buildSkuSpecPrice(supplier, orderItems, skuCodes); + + //拦截商品授权维度规则 + this.checkGoodsRule(supplier, orderItems); + + //拦截客户维度规则 + goodsRuleService.checkSkuCode(skuCodes, order.getSupplierId().toString(), true); + + //拦截品类下单规则 + this.handleCategoryRule(categoryRule, orderItems); + + } + + this.updateById(order); + //移除已有的ITEM + LambdaQueryWrapper rmItemLqw = new LambdaQueryWrapper<>(); + rmItemLqw.eq(OmsSaleOrderItem::getOrderId, param.getId()); + omsSaleOrderItemService.remove(rmItemLqw); + //重新保存item + if (orderItems.size() > 0) { + omsSaleOrderItemService.saveBatch(orderItems); + } + //立即下单 + if (param.getInstantFlag() != null && param.getInstantFlag().equals(1)) { + if (supplier.getCdOrderFlag().equals(1) && !StringUtils.hasText(param.getCdOrderRemark())) { + Assert.throwEx("请补充CD单号"); + } + OmsOrderOptionsService optionsService = SpringUtils.getBean(OmsOrderOptionsService.class); + optionsService.submitExpiredOrder(order.getId()+""); + } + return order; + } + + + @NotNull + private OmsSaleOrderItem createImminentOrderItem(OmsSaleOrder order, List spuList, OmsOrderImminentBo.ItemParam item, GoodsImminentBatch batch, GoodsSku sku) { + OmsSaleOrderItem orderItem = new OmsSaleOrderItem(); + orderItem.setRemark(item.getRemark()); + orderItem.setQuantity(item.getQty()); + orderItem.setOrderId(order.getId()); + orderItem.setOrderSn(order.getOrderSn()); + orderItem.setSpuId(sku.getSpuId()); + for (GoodsSpu spu : spuList) { + if (sku.getSpuId().equals(spu.getId())) { + orderItem.setSpuCode(spu.getSpuCode()); + orderItem.setSpuTitle(spu.getName()); + break; + } + } + orderItem.setSkuBelong(sku.getBelong()); + orderItem.setWeight(sku.getWeight()); + orderItem.setVolume(sku.getVolume()); + orderItem.setSkuBatchId(batch.getId()); + orderItem.setSkuBatchCode(batch.getBatchCode()); + orderItem.setSkuId(sku.getId()); + orderItem.setSkuTitle(sku.getSkuName()); + orderItem.setSkuCode(sku.getSkuCode()); + orderItem.setSpecValues(sku.getSpecInfos()); + orderItem.setSkuAddCode(sku.getSkuAddCode()); + orderItem.setSkuUnit(sku.getUnitName()); + orderItem.setSkuImg(sku.getPicUrl()); + orderItem.setSalesPrice(sku.getSalesPrice()); + orderItem.setCusPrice(sku.getSalesPrice()); + orderItem.setMarketPrice(sku.getMarketPrice()); + return orderItem; + } + + private void buildSkuSpecPrice(BmsSupplier supplier, List orderItems, List skuCodes) { +// List customerPrices = goodsCustomerPriceService.getBySupplierCodeAndCode(supplier.getCode(), skuCodes); +// for (OmsSaleOrderItem orderItem : orderItems) { +// for (GoodsCustomerPrice customerPrice : customerPrices) { +// if (orderItem.getSkuCode().equals(customerPrice.getSkuCode())) { +// orderItem.setSalesPrice(customerPrice.getRealPrice()); +// break; +// } +// } +// } + InventoryCusPriceQuery query = new InventoryCusPriceQuery(); + query.setCusCode(supplier.getCode()); + query.setInvCodes(skuCodes); + try { + R res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); + if(res.getStatus().equals(200)){ + List inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); + for (InventoryCusPrice cusPrice : inventoryCusPrices) { + for (OmsSaleOrderItem orderItem : orderItems) { + if(cusPrice.getCusCode().equals(orderItem.getSkuCode())&&cusPrice.getPrice().compareTo(cusPrice.getPrice())!=0){ + orderItem.setSalesPrice(cusPrice.getPrice()); + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void buildPriceOrder(String id, String amount) { + redisService.throwResLock(OmsOrder.class.getSimpleName(), id); + OmsSaleOrder omsOrder = super.getById(id); + String userId = AuthContextUtils.getSysUserId(); + SysUser sysUser = sysUserService.getById(userId); + if (omsOrder == null) { + Assert.throwEx("订单不存在或被移除"); + } + if (!omsOrder.getUserId().equals(userId)) { + Assert.throwEx("非制单人无法下单"); + } + // 非临期品不走当前流程 + if(omsOrder.getOrderType().equals(3)){ + Assert.throwEx("临期品需要审批方式下单"); + } + this.checkMsOrderStatus(omsOrder); + if (!omsOrder.getStatus().equals(0) && !omsOrder.getStatus().equals(6)) { + Assert.throwEx("订单状态不支持下单"); + } + LambdaQueryWrapper iteLqw = new LambdaQueryWrapper<>(); + iteLqw.eq(OmsSaleOrderItem::getOrderId, id); + List orderItemList = omsSaleOrderItemService.list(iteLqw); + + // 加成订单项合法性 + OmsOrderUtil.checkSaleOrderItemValues(orderItemList); + + //下单前规则拦截 + GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(omsOrder.getBrandRuleId()); + if (categoryRule == null) { + Assert.throwEx("品牌规则不存在或被删除"); + } + this.handleCategoryRule(categoryRule, orderItemList); + String brands = Arrays.stream(categoryRule.getBrandNames()).collect(Collectors.joining(",")); + + //客户校验 + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(omsOrder.getSupplierAddrId()); + BmsSupplier supplier = bmsSupplierMapper.selectById(omsOrder.getSupplierId()); + if (supplier.getCdOrderFlag().equals(1) && !StringUtils.hasText(omsOrder.getCdOrderRemark())) { + Assert.throwEx("请补充CD单号"); + } + String lastRegionId = supplier.getRegionLast(); + BmsRegion bmsRegion = bmsRegionMapper.selectById(lastRegionId); + if (bmsRegion == null) { + Assert.throwEx("客户档案[" + supplier.getCode() + "]缺失销售区域数据,请联系管理员"); + } + //更新最新的用户特殊价格 + this.updateCusPrice(omsOrder.getSupplierCode(), orderItemList); + + //DEV补充:调度系统写报价单给ERP时,要把地址ID写过去 +// if (supplierAddress.getTmsSysId() == null) { +// Assert.throwEx("地址缺失TmsSysId关联"); +// } + + //保存到ERP中间表 + this.saveToErpOrder(omsOrder, orderItemList, brands, supplierAddress, bmsRegion); + + } + + @Override + public void cancelErpOrder(String orderId) { + OmsSaleOrder saleOrder = this.getById(orderId); + if(saleOrder.getOrderErpId()!=null){ + Assert.throwEx("订单已存在ERP"); + } + if(saleOrder.getStatus().equals(2)&&saleOrder.getOrderStatusCombo().equals(0)){ + OmsSaleOrder upd = new OmsSaleOrder(); + upd.setId(saleOrder.getId()); + upd.setStatus(0); + this.updateById(upd); + }else { + Assert.throwEx("当前状态不支持退回"); + } + } + + @Override + public void saveToErpOrder(OmsSaleOrder omsOrder, + List orderItemList, + String brands, + BmsSupplierAddress supplierAddress, + BmsRegion bmsRegion) { + omsOrder.setStatus(2); + omsOrder.setCheckTime(LocalDateTime.now()); + omsOrder.setBusUserCheckTime(LocalDateTime.now()); + omsOrder.setCheckUserId(omsOrder.getCreateBy()); + + omsOrder.setBusinessType("普通销售"); + omsOrder.setSaleDept("客户服务部"); + omsOrder.setSaleType("常规销售"); + if(!omsOrder.getOrderType().equals(3)){ + omsOrder.setCheckUserId(AuthContextUtils.getSysUserId()); + } + //将员工信息前置 + if(omsOrder.getUserPhone()==null){ + omsOrder.setUserPhone("-"); + } + String remark = omsOrder.getRemark()==null?"":omsOrder.getRemark(); + String userAndPhone = omsOrder.getUserName()+"("+omsOrder.getUserPhone()+")"; + String remarkNew = remark.replace(userAndPhone,"") + .replace(supplierAddress.getDetail()+";","") + .replace(";;",";"); + omsOrder.setRemark(userAndPhone +supplierAddress.getDetail() +";" + remarkNew ); + this.updateById(omsOrder); + + this.flushPreDelivery(omsOrder.getId()+""); + + // 统计产品数量、总金额、总体积和总重量 + int totalQuantity = 0; + BigDecimal totalAmount = BigDecimal.ZERO; + double totalVolume = 0.0; + double totalWeight = 0.0; + + for (OmsSaleOrderItem baseItem : orderItemList) { + totalQuantity += baseItem.getQuantity(); + totalAmount = totalAmount.add(baseItem.getSalesPrice().multiply(new BigDecimal(baseItem.getQuantity()))); + if(baseItem.getVolume()!=null){ + totalVolume += baseItem.getVolume().doubleValue() * baseItem.getQuantity(); + } + if(baseItem.getWeight()!=null){ + totalWeight += baseItem.getWeight().doubleValue() * baseItem.getQuantity(); + } + } + + //保存版本变更 + OmsVerSaleOrder verSaleOrder = new OmsVerSaleOrder(); + verSaleOrder.setOrderSn(omsOrder.getOrderSn()); + verSaleOrder.setErpId("0"); + verSaleOrder.setOperatorName(omsOrder.getUserName()); + verSaleOrder.setOperationTime(LocalDateTime.now()); + verSaleOrder.setCurrentVersion(omsOrder.getVersion()); + StringBuilder sb = new StringBuilder(); + for (OmsSaleOrderItem baseItem : orderItemList) { + sb.append(String.format("商品[%s %s] 数量:%d,价格:%.2f,体积:%.2f,重量:%.2f\n", + baseItem.getSkuCode(), + baseItem.getSkuTitle(), + baseItem.getQuantity(), + baseItem.getSalesPrice(), + baseItem.getVolume(), + baseItem.getWeight() + )); + } + sb.append(String.format("产品数量:%d,总金额:%.2f,总体积:%.2f,总重量:%.2f", + totalQuantity, + totalAmount, + totalVolume, + totalWeight)); + verSaleOrder.setOperationContext(sb.toString()); + OmsVerSaleOrder version = omsVerSaleOrderMapper.getLastVersionByOrderSn(omsOrder.getOrderSn()); + if(omsOrder.getVersion().equals("cms")||version==null){ + verSaleOrder.setOperationType("提交"); + verSaleOrder.setLastVersion(omsOrder.getVersion()); + verSaleOrder.setSort(0); + }else { + verSaleOrder.setOperationType("重新提交"); + verSaleOrder.setLastVersion(version.getCurrentVersion()); + verSaleOrder.setSort(version.getSort()+1); + } + omsVerSaleOrderMapper.insert(verSaleOrder); + + } + + @Override + public void updateCusPrice(String cusCode, List orderItemList) { + List codes = orderItemList.stream().map(OmsSaleOrderItem::getSkuCode).distinct().collect(Collectors.toList()); + InventoryCusPriceQuery query = new InventoryCusPriceQuery(); + query.setCusCode(cusCode); + query.setInvCodes(codes); + R res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); + if(res.getStatus().equals(200)) { + List inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); + if(CollectionUtil.isNotEmpty(inventoryCusPrices)){ + assert inventoryCusPrices != null; + for (InventoryCusPrice cusPrice : inventoryCusPrices) { + for (OmsSaleOrderItem orderItem : orderItemList) { + if(orderItem.getSkuCode().equals(cusPrice.getInvCode())){ + orderItem.setCusPrice(cusPrice.getPrice()); + orderItem.setSalesPrice(cusPrice.getPrice()); + omsSaleOrderItemService.updateById(orderItem); + } + } + } + } + } + } + + @Override + public boolean checkMsOrderStatus(OmsSaleOrder omsOrder) { + if (omsOrder.getStatus().equals(1)) { + //检索是否能取消 + String status = seeYonRequestBaseService.postBase(ERP_ORDER_STATUS + "/" + omsOrder.getOrderSn() + , null + , "获取订单状态" + ).getData(); + if (!status.equals("0")) { + omsOrder.setStatus(2); + super.updateById(omsOrder); + return true; + } + } + return false; + } + + @Override + public boolean cancelOrder(String orderSn) { + OmsSaleOrder order = this.getOne(new LambdaQueryWrapper().eq(OmsSaleOrder::getOrderSn, orderSn)); + if (order == null) { + Assert.throwEx("订单编码异常"); + } + + List updItemBatch = new ArrayList<>(); + if (order.getOrderType().equals(3)) { + List itemList = omsSaleOrderItemService.list(new LambdaQueryWrapper() + .eq(OmsSaleOrderItem::getOrderId, order.getId())); + for (OmsSaleOrderItem orderItem : itemList) { + GoodsImminentBatch batch = goodsImminentBatchService.getById(orderItem.getSkuBatchId()); + GoodsImminentBatch newBatch = new GoodsImminentBatch(); + newBatch.setId(batch.getId()); + newBatch.setOrderQuantity(batch.getOrderQuantity() - orderItem.getQuantity()); + updItemBatch.add(newBatch); + } + } + + R r = seeYonRequestBaseService.postBase(ERP_ORDER_CANCEL + "/" + orderSn + , null + , "取消订单状态" + ); + if (r.getStatus() == 200) { + if (CollectionUtil.isNotEmpty(updItemBatch)) { + goodsImminentBatchService.updateBatchById(updItemBatch); + } + } + return r.getStatus() == 200; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsShoppingCartServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsShoppingCartServiceImpl.java new file mode 100644 index 0000000..c4b417c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsShoppingCartServiceImpl.java @@ -0,0 +1,105 @@ +package com.qs.serve.modules.oms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsRuleMainService; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.vo.GoodSkuVo; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.oms.entity.dto.ShoppingCartsCheckResult; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.oms.entity.OmsShoppingCart; +import com.qs.serve.modules.oms.service.OmsShoppingCartService; +import com.qs.serve.modules.oms.mapper.OmsShoppingCartMapper; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 购物车 服务实现类 + * @author YenHex + * @since 2022-10-14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class OmsShoppingCartServiceImpl extends ServiceImpl implements OmsShoppingCartService { + + private GoodsSpuService goodsSpuService; + private GoodsSkuService goodsSkuService; + private BmsRuleMainService bmsRuleMainService; + + @Override + public List listByIds(List ids, String supplierId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(OmsShoppingCart::getId,ids); + lqw.eq(OmsShoppingCart::getSupplierId,supplierId); + return this.list(lqw); + } + + @Override + public ShoppingCartsCheckResult checkShoppingCarts(BmsSupplier supplier, List shoppingCarts, boolean throwEx){ + //校验 + List skuIds = shoppingCarts.stream().map(OmsShoppingCart::getSkuId).collect(Collectors.toList()); + GoodsSku goodsSku = new GoodsSku(); + goodsSku.setSelectSkuIds(skuIds); + goodsSku.setEnable(1); + goodsSku.setQuerySpuShelf(1); + List goodsSkus = goodsSkuService.selectSkuVo(goodsSku); + for (OmsShoppingCart shoppingCart : shoppingCarts) { + boolean isOk = goodsSkus.stream().anyMatch(vo -> { + if(vo.getShelf().equals(0)||vo.getEnable().equals(0)){ + return false; + } + return shoppingCart.getSkuId().equals(vo.getId()); + }); + if(!isOk){ + if(throwEx){ + Assert.throwEx("部分商已下架"); + } + shoppingCart.setErrCode(1); + shoppingCart.setErrMessage("已下架"); + } + //绑定sku到购物车 + for (GoodSkuVo goodSkuVo : goodsSkus) { + if(shoppingCart.getSkuId().equals(goodSkuVo.getId())){ + shoppingCart.setGoodSkuVo(goodSkuVo); + break; + } + } + } + goodsSkus = goodsSkus.stream().filter(vo->vo.getShelf().equals(1)&&vo.getEnable().equals(1)).collect(Collectors.toList()); + //设置客户特殊价 + goodsSkuService.initSkuVoCusPrice(supplier.getSupplierCode(),goodsSkus); + //检验规格拦截 + List goodsSkuEntities = goodsSkus.stream().map(vo-> CopierUtil.copy(vo,new GoodsSku())).collect(Collectors.toList()); + List invalidSkuIds = bmsRuleMainService.checkErrSkuIds(supplier,goodsSkuEntities); + if(CollectionUtil.isNotEmpty(invalidSkuIds)){ + for (Long invalidSkuId : invalidSkuIds) { + for (OmsShoppingCart shoppingCart : shoppingCarts) { + if(shoppingCart.getSkuId().equals(invalidSkuId)){ + if(throwEx){ + Assert.throwEx("客户不符合部分商品规则"); + } + shoppingCart.setErrCode(1); + shoppingCart.setErrMessage("已不符合商品规则"); + break; + } + } + } + } + + ShoppingCartsCheckResult cartsCheckResult = new ShoppingCartsCheckResult(); + cartsCheckResult.setGoodsSkus(goodsSkus); + return cartsCheckResult; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsVerSaleOrderServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsVerSaleOrderServiceImpl.java new file mode 100644 index 0000000..ba4a6e0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/service/impl/OmsVerSaleOrderServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.oms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.oms.entity.OmsVerSaleOrder; +import com.qs.serve.modules.oms.mapper.OmsVerSaleOrderMapper; +import com.qs.serve.modules.oms.service.OmsVerSaleOrderService; +import org.springframework.stereotype.Service; + +/** + * @author YenHex + * @since 2025/2/18 + */ +@Service +public class OmsVerSaleOrderServiceImpl extends ServiceImpl implements OmsVerSaleOrderService { + + @Override + public OmsVerSaleOrder getLastVersionByOrderSn(String orderSn) { + OmsVerSaleOrder omsVerSaleOrder = baseMapper.getLastVersionByOrderSn(orderSn); + return omsVerSaleOrder; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/utils/OmsOrderUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/utils/OmsOrderUtil.java new file mode 100644 index 0000000..84c97e3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oms/utils/OmsOrderUtil.java @@ -0,0 +1,61 @@ +package com.qs.serve.modules.oms.utils; + +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.oms.entity.OmsOrderItem; +import com.qs.serve.modules.oms.entity.OmsSaleOrderItem; +import lombok.experimental.UtilityClass; + +import java.util.List; + +/** + * 封装常用的订单工具类 + * @author YenHex + * @since 2024/8/12 + */ +@UtilityClass +public class OmsOrderUtil { + + public static void checkOrderItemValues(List orderItemList) { + if (orderItemList.size() < 1) { + Assert.throwEx("空项目不支持下单"); + } + boolean existSkuIdNull = orderItemList.stream() + .anyMatch(item -> item.getSkuId()== null || item.getSkuId().equals(0L)); + if(existSkuIdNull){ + Assert.throwEx("有错误明细,请清空列表再提交"); + } + //拦截相同的skuItem + long countDistinct = orderItemList.stream().map(OmsOrderItem::getSkuId).distinct().count(); + if (orderItemList.size() != countDistinct) { + Assert.throwEx("有重复存货,请检查订单项"); + } + for (OmsOrderItem orderItem : orderItemList) { + if (orderItem.getQuantity() == null || orderItem.getQuantity() < 1) { + Assert.throwEx("确认订单商品项数量不能为零"); + } + } + } + + + public static void checkSaleOrderItemValues(List orderItemList) { + if (orderItemList.size() < 1) { + Assert.throwEx("空项目不支持下单"); + } + boolean existSkuIdNull = orderItemList.stream() + .anyMatch(item -> item.getSkuId()== null || item.getSkuId().equals(0L)); + if(existSkuIdNull){ + Assert.throwEx("有错误明细,请清空列表再提交"); + } + //拦截相同的skuItem + long countDistinct = orderItemList.stream().map(OmsSaleOrderItem::getSkuId).distinct().count(); + if (orderItemList.size() != countDistinct) { + Assert.throwEx("有重复存货,请检查订单项"); + } + for (OmsSaleOrderItem orderItem : orderItemList) { + if (orderItem.getQuantity() == null || orderItem.getQuantity() < 1) { + Assert.throwEx("确认订单商品项数量不能为零"); + } + } + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oss/entity/OssPolicySignVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oss/entity/OssPolicySignVo.java new file mode 100644 index 0000000..bb7dc03 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oss/entity/OssPolicySignVo.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.oss.entity; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/3/23 + */ +@Data +public class OssPolicySignVo { + + private String accessId; + private String policy; + private String signature; + private String host; + private Long expire; + private String dir; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oss/service/OssService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oss/service/OssService.java new file mode 100644 index 0000000..34c0b5f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oss/service/OssService.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.oss.service; + +import com.aliyun.oss.OSS; +import com.qs.serve.modules.oss.entity.OssPolicySignVo; + +/** + * @author YenHex + * @since 2023/3/23 + */ +public interface OssService { + + /** + * 获取文件签名 + * @return + */ + OssPolicySignVo getPolicySign(); + + OSS getOSSClient(); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oss/service/impl/OssServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oss/service/impl/OssServiceImpl.java new file mode 100644 index 0000000..87f32ce --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/oss/service/impl/OssServiceImpl.java @@ -0,0 +1,84 @@ +package com.qs.serve.modules.oss.service.impl; + +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.common.utils.BinaryUtil; +import com.aliyun.oss.model.MatchMode; +import com.aliyun.oss.model.PolicyConditions; +import com.qs.serve.common.config.properties.AliYunOssProperties; +import com.qs.serve.modules.oss.entity.OssPolicySignVo; +import com.qs.serve.modules.oss.service.OssService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +import java.io.UnsupportedEncodingException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @author YenHex + * @since 2023/3/23 + */ +@Service +@AllArgsConstructor +public class OssServiceImpl implements OssService { + + AliYunOssProperties aliYunOSSProperties; + + @Override + public OSS getOSSClient() { + // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。 + String endpoint = aliYunOSSProperties.getEndpoint(); + // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。 + String accessKeyId = aliYunOSSProperties.getAccessKeyId(); + String accessKeySecret = aliYunOSSProperties.getAccessKeySecret(); + // 填写Bucket名称,例如examplebucket。 + String bucketName = aliYunOSSProperties.getBucket(); + // 创建OSSClient实例。 + return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); + } + + @Override + public OssPolicySignVo getPolicySign() { + // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。 + String endpoint = aliYunOSSProperties.getEndpoint(); + // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。 + String accessKeyId = aliYunOSSProperties.getAccessKeyId(); + String accessKeySecret = aliYunOSSProperties.getAccessKeySecret(); + // 填写Bucket名称,例如examplebucket。 + String bucketName = aliYunOSSProperties.getBucket(); + // 创建OSSClient实例。 + String accessUrl = "https://"+bucketName+"."+endpoint; + OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM/dd"); + String prefix = aliYunOSSProperties.getPrefix(); + String dir = prefix + "/" + sdf.format(new Date())+"/"; + + + long expireTime = 300; + long expireEndTime = System.currentTimeMillis() + expireTime * 1000; + Date expiration = new Date(expireEndTime); + PolicyConditions policyConds = new PolicyConditions(); + policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000); + policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir); + + String postPolicy = ossClient.generatePostPolicy(expiration, policyConds); + byte[] binaryData = new byte[0]; + try { + binaryData = postPolicy.getBytes("utf-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + String encodedPolicy = BinaryUtil.toBase64String(binaryData); + String postSignature = ossClient.calculatePostSignature(postPolicy); + OssPolicySignVo policySignVo = new OssPolicySignVo(); + policySignVo.setAccessId(accessKeyId); + policySignVo.setPolicy(encodedPolicy); + policySignVo.setSignature(postSignature); + policySignVo.setHost(accessUrl); + policySignVo.setExpire(expireEndTime / 1000); + policySignVo.setDir(dir); + return policySignVo; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/controller/ZbiReportController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/controller/ZbiReportController.java new file mode 100644 index 0000000..6e2f9e6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/controller/ZbiReportController.java @@ -0,0 +1,49 @@ +package com.qs.serve.modules.other.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.other.mapper.ZbiUserReportMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.other.entity.ZbiReport; +import com.qs.serve.modules.other.service.ZbiReportService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 报表 + * @author YenHex + * @since 2025-03-20 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("zbi/report") +public class ZbiReportController { + + private ZbiUserReportMapper zbiUserReportMapper; + + /** + * 列表 + * @param userCode + * @return + */ + @GetMapping("/listByUserCode/{userCode}") + public R> getList(@PathVariable("userCode") String userCode){ + List reportList = zbiUserReportMapper.getReportList(userCode); + return R.ok(reportList); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/entity/ZbiReport.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/entity/ZbiReport.java new file mode 100644 index 0000000..6a26aa2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/entity/ZbiReport.java @@ -0,0 +1,98 @@ +package com.qs.serve.modules.other.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 2025-03-20 + */ +@Data +@TableName("zbi_report") +public class ZbiReport implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 报表值 */ + @Length(max = 255,message = "报表值长度不能超过255字") + private String reportValue; + + /** 停用:0-正常;1-停用 */ + private Integer stopFlag; + + /** 显示状态:0-用户关联;1-共有的 */ + private Integer showState; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + private String filterType; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + + public static ZbiReport toNewObject(ZbiReport source){ + ZbiReport report = new ZbiReport(); + report.setId(source.getId()); + report.setReportValue(source.getReportValue()); + report.setStopFlag(source.getStopFlag()); + report.setShowState(source.getShowState()); + report.setRemark(source.getRemark()); + report.setCreateTime(source.getCreateTime()); + report.setCreateBy(source.getCreateBy()); + report.setUpdateTime(source.getUpdateTime()); + report.setUpdateBy(source.getUpdateBy()); + report.setTenantId(source.getTenantId()); + report.setDelFlag(source.getDelFlag()); + return report; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/entity/ZbiUserReport.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/entity/ZbiUserReport.java new file mode 100644 index 0000000..05b3fcb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/entity/ZbiUserReport.java @@ -0,0 +1,92 @@ +package com.qs.serve.modules.other.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 2025-03-20 + */ +@Data +@TableName("zbi_user_report") +public class ZbiUserReport implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 员工号 */ + @Length(max = 64,message = "员工号长度不能超过64字") + private String userCode; + + /** 报表id */ + private Long reportId; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + + public static ZbiUserReport toNewObject(ZbiUserReport source){ + ZbiUserReport userReport = new ZbiUserReport(); + userReport.setId(source.getId()); + userReport.setUserCode(source.getUserCode()); + userReport.setReportId(source.getReportId()); + userReport.setRemark(source.getRemark()); + userReport.setCreateTime(source.getCreateTime()); + userReport.setCreateBy(source.getCreateBy()); + userReport.setUpdateTime(source.getUpdateTime()); + userReport.setUpdateBy(source.getUpdateBy()); + userReport.setTenantId(source.getTenantId()); + userReport.setDelFlag(source.getDelFlag()); + return userReport; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/mapper/ZbiReportMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/mapper/ZbiReportMapper.java new file mode 100644 index 0000000..306a9e7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/mapper/ZbiReportMapper.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.other.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.other.entity.ZbiReport; + +/** + * Mapper + * @author YenHex + * @date 2025-03-20 + */ +public interface ZbiReportMapper extends BaseMapper { + + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/mapper/ZbiUserReportMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/mapper/ZbiUserReportMapper.java new file mode 100644 index 0000000..49f70f2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/mapper/ZbiUserReportMapper.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.other.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.other.entity.ZbiReport; +import com.qs.serve.modules.other.entity.ZbiUserReport; + +import java.util.List; + +/** + * Mapper + * @author YenHex + * @date 2025-03-20 + */ +public interface ZbiUserReportMapper extends BaseMapper { + + List getReportList(String userCode); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/service/ZbiReportService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/service/ZbiReportService.java new file mode 100644 index 0000000..5eeb3b9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/service/ZbiReportService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.other.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.other.entity.ZbiReport; + +/** + * 服务接口 + * @author YenHex + * @date 2025-03-20 + */ +public interface ZbiReportService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/service/ZbiUserReportService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/service/ZbiUserReportService.java new file mode 100644 index 0000000..47555d2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/service/ZbiUserReportService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.other.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.other.entity.ZbiUserReport; + +/** + * 服务接口 + * @author YenHex + * @date 2025-03-20 + */ +public interface ZbiUserReportService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/service/impl/ZbiReportServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/service/impl/ZbiReportServiceImpl.java new file mode 100644 index 0000000..7179256 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/service/impl/ZbiReportServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.other.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.other.entity.ZbiReport; +import com.qs.serve.modules.other.service.ZbiReportService; +import com.qs.serve.modules.other.mapper.ZbiReportMapper; + +/** + * 服务实现类 + * @author YenHex + * @since 2025-03-20 + */ +@Slf4j +@Service +@AllArgsConstructor +public class ZbiReportServiceImpl extends ServiceImpl implements ZbiReportService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/service/impl/ZbiUserReportServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/service/impl/ZbiUserReportServiceImpl.java new file mode 100644 index 0000000..b0183bd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/other/service/impl/ZbiUserReportServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.other.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.other.entity.ZbiUserReport; +import com.qs.serve.modules.other.service.ZbiUserReportService; +import com.qs.serve.modules.other.mapper.ZbiUserReportMapper; + +/** + * 服务实现类 + * @author YenHex + * @since 2025-03-20 + */ +@Slf4j +@Service +@AllArgsConstructor +public class ZbiUserReportServiceImpl extends ServiceImpl implements ZbiUserReportService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/common/PaymentType.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/common/PaymentType.java new file mode 100644 index 0000000..b2b4927 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/common/PaymentType.java @@ -0,0 +1,12 @@ +package com.qs.serve.modules.pay.common; + +/** + * @author YenHex + * @since 2022/12/16 + */ +public interface PaymentType { + + String PAYMENT = "pay"; + String UN_PAYMENT = "unPay"; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/controller/PayPaymentController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/controller/PayPaymentController.java new file mode 100644 index 0000000..d830346 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/controller/PayPaymentController.java @@ -0,0 +1,349 @@ +package com.qs.serve.modules.pay.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.github.pagehelper.PageHelper; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.consts.SysConfigKey; +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.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.so.BmsSupplierSo; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.excel.common.DataSupplierSo; +import com.qs.serve.modules.excel.entity.DataCheckApplyMainInfo; +import com.qs.serve.modules.excel.service.DateCheckApplyService; +import com.qs.serve.modules.his.service.HisUserSupplierService; +import com.qs.serve.modules.pay.common.PaymentType; +import com.qs.serve.modules.pay.entity.PayPaymentItem; +import com.qs.serve.modules.pay.entity.bo.PayUnPaymentBo; +import com.qs.serve.modules.pay.entity.dto.PayPaymentAmountDto; +import com.qs.serve.modules.pay.entity.dto.PaySupplierAmountDto; +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; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.pay.entity.so.PayPaymentSo; +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; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 支付 支付记录 + * @author YenHex + * @since 2022-12-15 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("pay/payment") +public class PayPaymentController { + + private PayPaymentService payPaymentService; + private PayPaymentItemService paymentItemService; + private BmsSupplierService bmsSupplierService; + private PaySupplierMapper paySupplierMapper; + private DateCheckApplyService dateCheckApplyService; + private SysConfigService configService; + private SysSyncLogService sysSyncLogService; + + /** + * 客户费用列表 + * @return + */ + @GetMapping("supplierPage") + public R> getSupplierPage(BmsSupplierSo paramSo){ + BmsSupplier param = CopierUtil.copy(paramSo,new BmsSupplier()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = bmsSupplierService.list(lqw); + if(CollectionUtil.isNotEmpty(list)){ + List supplierVoList = getPaySupplierVos(paramSo, list,true); + return R.byPageHelperList(list,supplierVoList); + } + return R.byEmptyList(); + } + + @NotNull + public List getPaySupplierVos(BmsSupplierSo paramSo, List list, Boolean isAll) { + List supplierVoList = new ArrayList<>(); + DataSupplierSo so = new DataSupplierSo(); + if(!isAll){ + SysConfig config = configService.getByKey(SysConfigKey.DateCheckApplyExcelYear); + if(config==null){ + Assert.throwEx("没有设置全局变量【导出明细时间段】"); + } + String year = config.getConfigValue(); + Integer yearNum = Integer.parseInt(year)-1; + + LocalDate startDate = LocalDate.of(LocalDate.now().getYear()-yearNum,1,1); + if(paramSo.getQueryStartTime()==null || startDate.isAfter(paramSo.getQueryStartTime().toLocalDate())){ + so.setStartDate(startDate); + }else{ + so.setStartDate(paramSo.getQueryStartTime().toLocalDate()); + } + }else { + so.setStartDate(paramSo.getQueryStartTime()==null?null:paramSo.getQueryStartTime().toLocalDate()); + } + so.setEndDate(paramSo.getQueryEndTime()==null?LocalDate.now():paramSo.getQueryEndTime().toLocalDate()); + list.forEach(supplier->{ + so.setSupplierId(supplier.getId()); + DataCheckApplyMainInfo mainInfo = dateCheckApplyService.getDataCheckApplyMainInfo(so); + PaySupplierVo supplierVo = new PaySupplierVo(); + supplierVo.setSupplierId(Long.parseLong(supplier.getId())); + supplierVo.setSupplierCode(supplier.getCode()); + supplierVo.setSupplierName(supplier.getName()); + supplierVo.setSumAmountOfPay(mainInfo.getPayAmt()); + supplierVo.setSumAmountOfCost(mainInfo.getCostApplyAmt()); + supplierVo.setSumAmountOfCheck(mainInfo.getCheckedAmt()); + supplierVo.setSumAmountOfUnPay(mainInfo.getNotPayAmt()); + supplierVoList.add(supplierVo); + }); +// List supplierIds = list.stream().map(BmsSupplier::getId).collect(Collectors.toList()); +// List costAmountList = paySupplierMapper.sumCostAmount(supplierIds, paramSo.getQueryStartTime(), paramSo.getQueryEndTime()); +// List payAmountList = paySupplierMapper.sumPayAmount(supplierIds, paramSo.getQueryStartTime(), paramSo.getQueryEndTime()); +// List unPayAmountList = paySupplierMapper.sumUnPayAmount(supplierIds, paramSo.getQueryStartTime(), paramSo.getQueryEndTime()); +// List checkAmountList = paySupplierMapper.sumCheckAmount(supplierIds, paramSo.getQueryStartTime(), paramSo.getQueryEndTime()); +// List supplierVoList = list.stream().map(supplier -> { +// Long supplierId = Long.parseLong(supplier.getId()); +// PaySupplierVo supplierVo = new PaySupplierVo(); +// supplierVo.setSupplierId(supplierId); +// supplierVo.setSupplierCode(supplier.getCode()); +// supplierVo.setSupplierName(supplier.getName()); +// supplierVo.setSumAmountOfPay(BigDecimal.ZERO); +// supplierVo.setSumAmountOfCost(BigDecimal.ZERO); +// supplierVo.setSumAmountOfCheck(BigDecimal.ZERO); +// supplierVo.setSumAmountOfUnPay(BigDecimal.ZERO); +// for (PaySupplierAmountDto amountDto : costAmountList) { +// if(amountDto.getSupplierId().equals(supplierId)){ +// supplierVo.setSumAmountOfCost(amountDto.getSumAmount()); +// break; +// } +// } +// for (PaySupplierAmountDto amountDto : checkAmountList) { +// if(amountDto.getSupplierId().equals(supplierId)){ +// supplierVo.setSumAmountOfCheck(amountDto.getSumAmount()); +// break; +// } +// } +// for (PaySupplierAmountDto amountDto : payAmountList) { +// if(amountDto.getSupplierId().equals(supplierId)){ +// supplierVo.setSumAmountOfPay(amountDto.getSumAmount()); +// break; +// } +// } +// for (PaySupplierAmountDto amountDto : unPayAmountList) { +// if(amountDto.getSupplierId().equals(supplierId)){ +// supplierVo.setSumAmountOfUnPay(amountDto.getSumAmount()); +// break; +// } +// } +// return supplierVo; +// }).collect(Collectors.toList()); + return supplierVoList; + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('pay:payment:query')") + public R> getPage(PayPaymentSo param){ + PayPayment entity = CopierUtil.copy(param,new PayPayment()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + if(param.getQueryStartTime()!=null){ + lqw.ge(PayPayment::getPayTime,param.getQueryStartTime()); + } + if(param.getQueryEndTime()!=null){ + lqw.le(PayPayment::getPayTime,param.getQueryEndTime()); + } + lqw.orderByDesc(PayPayment::getId); + PageUtil.startPage(); + List list = payPaymentService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * 详情列表 + * @param id + * @return + */ + @GetMapping("/listDetails/{id}") + @PreAuthorize("hasRole('pay:payment:query')") + public R> listDetails(@PathVariable("id") Long id){ + List list= paymentItemService.listByPaymentId(id); + return R.ok(list); + } + + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Payment, title = "支付", biz = BizType.QUERY) + @PreAuthorize("hasRole('pay:payment:query')") + public R getById(@PathVariable("id") String id){ + PayPayment payPayment = payPaymentService.getById(id); + return R.ok(payPayment); + } + + /** + * 获取客户支付金额 + * @param supplierId + * @return + */ + @GetMapping("/amount/{supplierId}") + @PreAuthorize("hasRole('pay:payment:query')") + public R getSupplierAmount(@PathVariable("supplierId") Long supplierId){ + PayPaymentAmountDto amountDto = payPaymentService.getSupplierBalance(supplierId); + return R.ok(amountDto); + } + + /** + * 新增不再支付 + * @param param + * @return + */ + @PostMapping("/unPayment") + @SysLog(module = SystemModule.Payment, title = "支付", biz = BizType.INSERT) + @PreAuthorize("hasRole('pay:payment:pay')") + 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("新增不再支付异常"); + + } + + + /** + * 取消不再支付 + * @param verificationCode 核销编码 + * @return + */ + @PostMapping("/cancelUnPayment") + @SysLog(module = SystemModule.Payment, title = "支付", biz = BizType.INSERT) + @PreAuthorize("hasRole('pay:payment:pay')") + 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("取消不再支付异常"); + } + + /** + * 新增支付 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.Payment, title = "支付", biz = BizType.INSERT) + @PreAuthorize("hasRole('pay:payment:pay')") + 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("新增支付异常"); + } + + /** + * 取消支付 + * @param erpId + * @return + */ + @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, 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/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/controller/PayWayController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/controller/PayWayController.java new file mode 100644 index 0000000..bb458ba --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/controller/PayWayController.java @@ -0,0 +1,112 @@ +package com.qs.serve.modules.pay.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.pay.entity.PayWay; +import com.qs.serve.modules.pay.service.PayWayService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 支付 付款方式 + * @author YenHex + * @since 2023-05-23 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("pay/way") +public class PayWayController { + + private PayWayService payWayService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(PayWay param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = payWayService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(PayWay param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = payWayService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Payment, title = "付款方式", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + PayWay payWay = payWayService.getById(id); + return R.ok(payWay); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.Payment, title = "付款方式", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid PayWay param){ + boolean result = payWayService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.Payment, title = "付款方式", biz = BizType.INSERT) + public R save(@RequestBody @Valid PayWay param){ + boolean result = payWayService.save(param); + return R.ok(param); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.Payment, title = "付款方式", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = payWayService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/controller/my/PayPaymentMyController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/controller/my/PayPaymentMyController.java new file mode 100644 index 0000000..321575b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/controller/my/PayPaymentMyController.java @@ -0,0 +1,95 @@ +package com.qs.serve.modules.pay.controller.my; + +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.so.BmsSupplierSo; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.his.service.HisUserSupplierService; +import com.qs.serve.modules.pay.controller.PayPaymentController; +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.pay.service.PayPaymentService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.service.SysPostUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 支付 支付记录(我的) + * @author YenHex + * @since 2022-12-15 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("my/payment") +public class PayPaymentMyController { + + private PayPaymentController payPaymentController; + private PayPaymentService payPaymentService; + private PayPaymentItemService paymentItemService; + private BmsSupplierService bmsSupplierService; + private PaySupplierMapper paySupplierMapper; + private HisUserSupplierService hisUserSupplierService; + private SysPostUserService postUserService; + + /** + * 客户费用列表 + * @return + */ + @GetMapping("supplierPage") + public R> getSupplierPage(BmsSupplierSo paramSo){ + BmsSupplier param = CopierUtil.copy(paramSo,new BmsSupplier()); + PageVo pageVo = hisUserSupplierService.selectPageSupplier(param); + if(CollectionUtil.isNotEmpty(pageVo.getList())){ + List supplierVoList = payPaymentController.getPaySupplierVos(paramSo, pageVo.getList(),false); + return R.ok(PageVo.initNewList(pageVo,supplierVoList)); + } + return R.byEmptyList(); + } + + /** + * 下属客户费用列表 + * @return + */ + @GetMapping("underlingSupplierPage") + public R> getUnderlingSupplierPage(BmsSupplierSo paramSo){ + BmsSupplier param = CopierUtil.copy(paramSo,new BmsSupplier()); + List childIds = postUserService.listByChildIds(AuthContextUtils.getSysUserId()); + param.setSelectUserIds(childIds); + param.setSelectUserIdsFlag(true); + PageVo pageVo = hisUserSupplierService.selectPageSupplier(param); + if(CollectionUtil.isNotEmpty(pageVo.getList())){ + List supplierVoList = payPaymentController.getPaySupplierVos(paramSo, pageVo.getList(),false); + return R.ok(PageVo.initNewList(pageVo,supplierVoList)); + } + return R.byEmptyList(); + } + + /** + * 我的和下属的客户费用列表 + * @return + */ + @GetMapping("underlingAndMineSupplierPage") + public R> underlingAndMineSupplierPage(BmsSupplierSo paramSo){ + BmsSupplier param = CopierUtil.copy(paramSo,new BmsSupplier()); + List childIds = postUserService.listByChildIds(AuthContextUtils.getSysUserId()); + childIds.add(AuthContextUtils.getSysUserId()); + param.setSelectUserIds(childIds); + param.setSelectUserIdsFlag(true); + PageVo pageVo = hisUserSupplierService.selectPageSupplier(param); + if(CollectionUtil.isNotEmpty(pageVo.getList())){ + List supplierVoList = payPaymentController.getPaySupplierVos(paramSo, pageVo.getList(),false); + return R.ok(PageVo.initNewList(pageVo,supplierVoList)); + } + return R.byEmptyList(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/PayHistoryItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/PayHistoryItem.java new file mode 100644 index 0000000..f0c1fcb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/PayHistoryItem.java @@ -0,0 +1,86 @@ +package com.qs.serve.modules.pay.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 2022-12-27 + */ +@Data +@TableName("pay_history_item") +public class PayHistoryItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 支付类型 */ + @NotBlank(message = "支付类型不能为空") + @Length(max = 7,message = "支付类型长度不能超过7字") + private String payType; + + /** 支付id */ + @NotNull(message = "支付id不能为空") + private Long paymentId; + + /** 供应商id */ + @NotNull(message = "供应商id不能为空") + private Long supplierId; + + /** 支付金额 */ + @NotNull(message = "支付金额不能为空") + private BigDecimal itemPayAmount; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/PayPayment.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/PayPayment.java new file mode 100644 index 0000000..ab22c33 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/PayPayment.java @@ -0,0 +1,161 @@ +package com.qs.serve.modules.pay.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 2022-12-15 + */ +@Data +@TableName("pay_payment") +public class PayPayment implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 支付类型 + * pay - 支付 + * unPay - 不再支付 + **/ + private String payType; + + /** + * 支付编码 + **/ + @TableField(condition = SqlCondition.LIKE) + private String payCode; + + /** 供应商id */ + @NotNull(message = "供应商id不能为空") + private Long supplierId; + + /** 供应商编码 */ + @NotBlank(message = "供应商编码不能为空") + @Length(max = 30,message = "供应商编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String supplierCode; + + /** 供应商 */ + @NotBlank(message = "供应商不能为空") + @Length(max = 30,message = "供应商长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String supplierName; + + /** 支付金额 */ + @NotNull(message = "支付金额不能为空") + private BigDecimal payAmount; + + /** 发货单号 */ + @TableField(condition = SqlCondition.LIKE) + private String erpCode; + + /** 发票编号 */ + @TableField(condition = SqlCondition.LIKE) + private String billNumber; + + /** 支付人id */ + @NotBlank(message = "支付人id不能为空") + @Length(max = 32,message = "支付人id长度不能超过32字") + private String userId; + + /** 支付人编码 */ + @NotBlank(message = "支付人编码不能为空") + @Length(max = 32,message = "支付人编码长度不能超过32字") + private String userCode; + + /** 支付人 */ + @NotBlank(message = "支付人不能为空") + @Length(max = 255,message = "支付人长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String userName; + + /** 支付时间 */ + @NotNull(message = "支付时间不能为空") + @Length(max = 0,message = "支付时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime payTime; + + + @NotNull(message = "支付时间不能为空") + @Length(max = 0,message = "支付时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime payDate; + /** + * 取消标识 + * 不再支付列表:0-冻结;1-解冻 + * 支付列表:0-正常;1-取消 + **/ + private Integer cancelFlag; + + /** 取消时间 */ + @Length(max = 0,message = "支付时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime cancelTime; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + private Long costApplyId; + + @TableField(condition = SqlCondition.LIKE) + @NotNull(message = "ErpId不能为空") + private String erpId; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 同步标识 */ + private Integer syncCostState; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/PayPaymentItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/PayPaymentItem.java new file mode 100644 index 0000000..a66b0c4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/PayPaymentItem.java @@ -0,0 +1,166 @@ +package com.qs.serve.modules.pay.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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 2022-12-15 + */ +@Data +@TableName("pay_payment_item") +public class PayPaymentItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 支付类型 + * pay - 支付 + * unPay - 不再支付 + **/ + private String payType; + + /** 支付id */ + @NotNull(message = "支付id不能为空") + private Long paymentId; + + /** 供应商id */ + @NotNull(message = "供应商id不能为空") + private Long supplierId; + + /** 支付金额 */ + @NotNull(message = "支付金额不能为空") + private BigDecimal itemPayAmount; + + /** 核销id */ + @NotNull(message = "核销id不能为空") + private Long verificationId; + + private String verificationMainCode; + + private String verificationCode; + + /** 核销科目项id */ + @NotNull(message = "核销科目项id不能为空") + private Long verificationSubjectId; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 活动编码 */ + @NotBlank(message = "活动编码不能为空") + @Length(max = 30,message = "活动编码长度不能超过30字") + private String activityCode; + + /** 政策项id */ + private Long policyItemId; + + /** 政策项编码 */ + private String policyItemCode; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + @TableField(condition = SqlCondition.LIKE) + private String erpId; + + @TableField(condition = SqlCondition.LIKE) + private String billNumber; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 支付时间 */ + @NotNull(message = "支付时间不能为空") + @Length(max = 0,message = "支付时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime payTime; + + /** 支付时间 */ + @NotNull(message = "支付日期不能为空") + @Length(max = 0,message = "支付时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime payDate; + + + /** + * 后端参数,请忽略 + * 支付主表的取消标识 + * 不再支付列表:0-冻结;1-解冻 + * 支付列表:0-正常;1-取消 + **/ + @TableField(exist = false) + private Integer cancelFlag; + + @TableField(exist = false) + private List costApplyIds; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/PayWay.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/PayWay.java new file mode 100644 index 0000000..a355421 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/PayWay.java @@ -0,0 +1,94 @@ +package com.qs.serve.modules.pay.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 2023-05-23 + */ +@Data +@TableName("pay_way") +public class PayWay implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 支付方式 */ + @NotBlank(message = "支付方式不能为空") + @Length(max = 250,message = "支付方式长度不能超过250字") + @TableField(condition = SqlCondition.LIKE) + private String title; + + /** 停用:0->启用;1->停用 */ + private Integer stopState; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + public static PayWay toNewObject(PayWay source){ + PayWay way = new PayWay(); + way.setId(source.getId()); + way.setTitle(source.getTitle()); + way.setStopState(source.getStopState()); + way.setRemark(source.getRemark()); + way.setCreateTime(source.getCreateTime()); + way.setUpdateTime(source.getUpdateTime()); + way.setTenantId(source.getTenantId()); + way.setCreateBy(source.getCreateBy()); + way.setUpdateBy(source.getUpdateBy()); + way.setDelFlag(source.getDelFlag()); + return way; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/bo/PayPaymentBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/bo/PayPaymentBo.java new file mode 100644 index 0000000..4161808 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/bo/PayPaymentBo.java @@ -0,0 +1,73 @@ +package com.qs.serve.modules.pay.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +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.DecimalMin; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; + +/** + * 支付 Bo + * @author YenHex + * @since 2022-12-15 + */ +@Data +public class PayPaymentBo implements Serializable { + + /** 核销编码 */ + @NotNull(message = "核销编码不能为空") + private String verificationSubCode; + + /** 支付金额 */ + private BigDecimal payAmount; + + /** ERP编码 */ + private String erpId; + + /** 发票编号 */ + @NotNull(message = "发票编号不能为空") + private String billNumber; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 支付时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime payTime; + + /** 支付日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime payDate; + + /** 人员工号 */ + @NotNull(message = "人员工号不能为空") + private String userCode; + + /** + * 支付类型 + * pay - 支付 + * unPay - 不再支付 + **/ + @NotNull(message = "支付类型不能为空") + private String payType; + + + private Integer release; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/bo/PayUnPaymentBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/bo/PayUnPaymentBo.java new file mode 100644 index 0000000..43afd3d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/bo/PayUnPaymentBo.java @@ -0,0 +1,33 @@ +package com.qs.serve.modules.pay.entity.bo; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 支付 Bo + * @author YenHex + * @since 2022-12-15 + */ +@Data +public class PayUnPaymentBo implements Serializable { + + /** 供应商id */ + @NotNull(message = "供应商id不能为空") + private Long supplierId; + + /** 支付金额 */ + @DecimalMin(value = "0.01",message = "支付金额必须大于0元") + @NotNull(message = "支付金额不能为空") + private BigDecimal payAmount; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/dto/PayPaymentAmountDto.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/dto/PayPaymentAmountDto.java new file mode 100644 index 0000000..f39f5f5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/dto/PayPaymentAmountDto.java @@ -0,0 +1,38 @@ +package com.qs.serve.modules.pay.entity.dto; + +import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author YenHex + * @since 2022/12/15 + */ +@Data +@AllArgsConstructor +public class PayPaymentAmountDto { + + /** + * 统计支付金额 + */ + private BigDecimal totalAmount; + + /** + * 已支付金额 + */ + private BigDecimal hasPayment; + + /** + * 不再支付 + */ + private BigDecimal notPayment; + + /** + * 可支付核销明细 + */ + private List verificationSubjectList; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/dto/PaySupplierAmountDto.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/dto/PaySupplierAmountDto.java new file mode 100644 index 0000000..26a03f3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/dto/PaySupplierAmountDto.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.pay.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/1/13 + */ +@Data +public class PaySupplierAmountDto { + + private Long supplierId; + private BigDecimal sumAmount; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/so/PayPaymentSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/so/PayPaymentSo.java new file mode 100644 index 0000000..5478b49 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/so/PayPaymentSo.java @@ -0,0 +1,60 @@ +package com.qs.serve.modules.pay.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.SqlCondition; +import com.baomidou.mybatisplus.annotation.TableField; +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 2022-12-15 + */ +@Data +public class PayPaymentSo implements Serializable { + + private static final long serialVersionUID = 1L; + + private String payType; + /** + * 支付编码 + **/ + private String payCode; + + /** 供应商 */ + private String supplierName; + + private String erpCode; + + /** 支付人 */ + private String userName; + + /** 开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime queryStartTime; + + /** 结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime queryEndTime; + + /** 取消标识 */ + private Integer cancelFlag; + + + /** 发票编号 */ + private String billNumber; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/vo/PaySupplierVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/vo/PaySupplierVo.java new file mode 100644 index 0000000..66bafab --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/entity/vo/PaySupplierVo.java @@ -0,0 +1,35 @@ +package com.qs.serve.modules.pay.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/1/13 + */ +@Data +public class PaySupplierVo { + + /** 客户id */ + private Long supplierId; + + /** 客户编号 */ + private String supplierCode; + + /** 客户 */ + private String supplierName; + + /** 已申请费用金额(通过审批) */ + private BigDecimal sumAmountOfCost; + + /** 已核销金额(通过审批)*/ + private BigDecimal sumAmountOfCheck; + + /** 已支付金额 */ + private BigDecimal sumAmountOfPay; + + /** 不再支付金额 */ + private BigDecimal sumAmountOfUnPay; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/mapper/PayHistoryItemMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/mapper/PayHistoryItemMapper.java new file mode 100644 index 0000000..7937bb7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/mapper/PayHistoryItemMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.pay.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.pay.entity.PayHistoryItem; + +/** + * 支付历史明细项 Mapper + * @author YenHex + * @date 2022-12-27 + */ +public interface PayHistoryItemMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/mapper/PayPaymentItemMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/mapper/PayPaymentItemMapper.java new file mode 100644 index 0000000..85fc6ee --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/mapper/PayPaymentItemMapper.java @@ -0,0 +1,40 @@ +package com.qs.serve.modules.pay.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.common.model.AmountDTO; +import com.qs.serve.modules.pay.entity.PayPaymentItem; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +/** + * 支付明细项 Mapper + * @author YenHex + * @date 2022-12-15 + */ +public interface PayPaymentItemMapper extends BaseMapper { + + List selectPayPaymentItemList(@Param("query") PayPaymentItem payment); + + /** + * 查找新增未同步的activityId(一次最多5000条活动) + * @return + */ + @Select("SELECT activity_id FROM `pay_payment_item` where sync_act_flag=0 and del_flag = 0 and activity_id is not null GROUP BY activity_id limit 5000") + List selectNoSyncActivityIds(); + + List selectActivityTotal(@Param("activityIds") List activityIds); + + /** + * 更新同步标记 + * @param activityIds + * @return + */ + int updateSyncFlag(@Param("activityIds") List activityIds); + + List selectCostTotal(@Param("costIds") List costIds); + + int updateSyncCostState(@Param("costIds") List costIds); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/mapper/PayPaymentMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/mapper/PayPaymentMapper.java new file mode 100644 index 0000000..d07d86a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/mapper/PayPaymentMapper.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.pay.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.pay.entity.PayPayment; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import java.util.List; +/** + * 支付 Mapper + * @author YenHex + * @date 2022-12-15 + */ +public interface PayPaymentMapper extends BaseMapper { + + @InterceptorIgnore(tenantLine = "1") + @Select("select * from pay_payment where erp_id = #{erpId} and del_flag = 0") + PayPayment getByErpId(@Param("erpId")String erpId); + + @InterceptorIgnore(tenantLine = "1") + @Select("select cost_apply_id from pay_payment " + + " left join tbs_cost_apply on pay_payment.cost_apply_id = tbs_cost_apply.id " + + " where " + + " sync_cost_state = 0 " + + " and sy_form_id is not null " + + " GROUP BY cost_apply_id limit 1000 ") + List selectCostApplyIds4State(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/mapper/PaySupplierMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/mapper/PaySupplierMapper.java new file mode 100644 index 0000000..94fd0ea --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/mapper/PaySupplierMapper.java @@ -0,0 +1,58 @@ +package com.qs.serve.modules.pay.mapper; + +import com.qs.serve.modules.pay.entity.dto.PaySupplierAmountDto; +import org.apache.ibatis.annotations.Param; + +import java.time.LocalDateTime; +import java.util.List; +/** + * @author YenHex + * @since 2023/1/13 + */ +public interface PaySupplierMapper { + + /** + * 统计费用明细 + * @param supplierIds + * @param startTime + * @param endTime + * @return + */ + List sumCostAmount(@Param("queryList") List supplierIds, + @Param("startTime") LocalDateTime startTime, + @Param("endTime") LocalDateTime endTime); + + /** + * 统计核销金额 + * @param supplierIds + * @param startTime + * @param endTime + * @return + */ + List sumCheckAmount(@Param("queryList") List supplierIds, + @Param("startTime") LocalDateTime startTime, + @Param("endTime") LocalDateTime endTime); + + /** + * 统计支付金额 + * @param supplierIds + * @param startTime + * @param endTime + * @return + */ + List sumPayAmount(@Param("queryList") List supplierIds, + @Param("startTime") LocalDateTime startTime, + @Param("endTime") LocalDateTime endTime); + + /** + * 统计未支付金额 + * @param supplierIds + * @param startTime + * @param endTime + * @return + */ + List sumUnPayAmount(@Param("queryList") List supplierIds, + @Param("startTime") LocalDateTime startTime, + @Param("endTime") LocalDateTime endTime); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/mapper/PayWayMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/mapper/PayWayMapper.java new file mode 100644 index 0000000..e52e4ab --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/mapper/PayWayMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.pay.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.pay.entity.PayWay; + +/** + * 付款方式 Mapper + * @author YenHex + * @date 2023-05-23 + */ +public interface PayWayMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/PayHistoryItemService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/PayHistoryItemService.java new file mode 100644 index 0000000..5fe7533 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/PayHistoryItemService.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.pay.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.pay.entity.PayHistoryItem; +import java.util.List; +/** + * 支付历史明细项 服务接口 + * @author YenHex + * @date 2022-12-27 + */ +public interface PayHistoryItemService extends IService { + + List listByPaymentId(Long id); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/PayPaymentItemService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/PayPaymentItemService.java new file mode 100644 index 0000000..cfc219a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/PayPaymentItemService.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.pay.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.pay.entity.PayPaymentItem; + +import java.util.List; + +/** + * 支付明细项 服务接口 + * @author YenHex + * @date 2022-12-15 + */ +public interface PayPaymentItemService extends IService { + + List listByVerSubjectId(Long versubId); + + + List listByPaymentId(Long paymentId); + + void removeByPaymentId(Long payId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/PayPaymentService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/PayPaymentService.java new file mode 100644 index 0000000..2a3e68d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/PayPaymentService.java @@ -0,0 +1,44 @@ +package com.qs.serve.modules.pay.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.pay.entity.PayPayment; +import com.qs.serve.modules.pay.entity.bo.PayPaymentBo; +import com.qs.serve.modules.pay.entity.dto.PayPaymentAmountDto; + +/** + * 支付 服务接口 + * @author YenHex + * @date 2022-12-15 + */ +public interface PayPaymentService extends IService { + + /** + * 支付 + * @param paymentBo + * @return + */ + PayPayment payment(PayPaymentBo paymentBo); + + PayPayment unpayment(PayPaymentBo paymentBo); + + /** + * 取消不在支付 + * @param vtbCheckCode + */ + void cancelUnPayment(String vtbCheckCode); + + /** + * 取消支付 + * @param id + */ + void cancel(String erpId); + + /** + * 获取供应商需支付明细 + * @param supplierId + * @return + */ + PayPaymentAmountDto getSupplierBalance(Long supplierId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/PayWayService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/PayWayService.java new file mode 100644 index 0000000..9415bbb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/PayWayService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.pay.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.pay.entity.PayWay; + +/** + * 付款方式 服务接口 + * @author YenHex + * @date 2023-05-23 + */ +public interface PayWayService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/impl/PayApplicationService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/impl/PayApplicationService.java new file mode 100644 index 0000000..72db31a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/impl/PayApplicationService.java @@ -0,0 +1,104 @@ +package com.qs.serve.modules.pay.service.impl; + +import com.qs.serve.common.model.AmountDTO; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.pay.mapper.PayPaymentItemMapper; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsActivityCenter; +import com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods; +import com.qs.serve.modules.tbs.service.TbsActivityCenterGoodsService; +import com.qs.serve.modules.tbs.service.TbsActivityCenterService; +import com.qs.serve.modules.tbs.service.TbsActivityService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/11/2 + */ +@Slf4j +@Service +@AllArgsConstructor +public class PayApplicationService { + + private final PayPaymentItemMapper payPaymentItemMapper; + private final TbsActivityService tbsActivityService; + private final TbsActivityCenterService tbsActivityCenterService; + private final TbsActivityCenterGoodsService tbsActivityCenterGoodsService; + + /** + * 先把统计金额更新到活动字段 + */ + public void syncTotalPayToActivity(){ + AuthContextUtils.setTenant("001"); + final BigDecimal N100 = new BigDecimal("100"); + final BigDecimal N10000 = new BigDecimal("10000"); + //查找新增未同步的activityId + List activityStringIds = payPaymentItemMapper.selectNoSyncActivityIds(); + if(CollectionUtil.isEmpty(activityStringIds)){ + log.warn("syncTotalPayToActivity() --- activityIds长度为0 "); + return; + } + List activityIds = activityStringIds.stream().map(Long::parseLong).collect(Collectors.toList()); + //获取activity统计支付金额 + List amountDTOList = payPaymentItemMapper.selectActivityTotal(activityStringIds); + //更新到activity + List activityList = amountDTOList.stream().map(a->{ + TbsActivity activity = new TbsActivity(); + activity.setId(Long.parseLong(a.getId())); + activity.setPayAmount(a.getAmount()); + return activity; + }).collect(Collectors.toList()); + tbsActivityService.updateBatchById(activityList); + + Map> activityCenterMap = tbsActivityCenterService.listByActivityMap(activityIds); + + //更新到tbs_activity_subject + //Map> activitySubjectMap = tbsActivitySubjectService.listByActivityMap(activityIds); + + Map> activityCenterGoodsMap = tbsActivityCenterGoodsService.listByActivityMap(activityIds); + + for (AmountDTO amountDTO : amountDTOList) { + Long activityId = Long.parseLong(amountDTO.getId()); + BigDecimal totalAmount = amountDTO.getAmount(); + + //更新到tbs_activity_center + List activityCenterList = activityCenterMap.get(activityId); + List activityCenterUpdateList = activityCenterList.stream().map(param->{ + BigDecimal payAmount = param.getCenterRate().multiply(totalAmount).divide(N100, RoundingMode.DOWN); + TbsActivityCenter obj = new TbsActivityCenter(); + obj.setId(param.getId()); + obj.setPayAmount(payAmount); + return obj; + }).collect(Collectors.toList()); + tbsActivityCenterService.updateBatchById(activityCenterUpdateList); + + //更新到tbs_activity_center_goods + List activityCenterGoodsList = activityCenterGoodsMap.get(activityId); + List activityCenterGoodsUpdateList = activityCenterGoodsList.stream().map(param->{ + BigDecimal payAmount = param.getCenterRate() + .multiply(param.getCenterGoodsRate()) + .multiply(totalAmount) + .divide(N10000, RoundingMode.DOWN); + TbsActivityCenterGoods obj = new TbsActivityCenterGoods(); + obj.setId(param.getId()); + obj.setPayAmount(payAmount); + return obj; + }).collect(Collectors.toList()); + tbsActivityCenterGoodsService.updateBatchById(activityCenterGoodsUpdateList); + + } + + payPaymentItemMapper.updateSyncFlag(activityStringIds); + + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/impl/PayHistoryItemServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/impl/PayHistoryItemServiceImpl.java new file mode 100644 index 0000000..890233b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/impl/PayHistoryItemServiceImpl.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.pay.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.pay.entity.PayHistoryItem; +import com.qs.serve.modules.pay.service.PayHistoryItemService; +import com.qs.serve.modules.pay.mapper.PayHistoryItemMapper; + +import java.util.List; + +/** + * 支付历史明细项 服务实现类 + * @author YenHex + * @since 2022-12-27 + */ +@Slf4j +@Service +@AllArgsConstructor +public class PayHistoryItemServiceImpl extends ServiceImpl implements PayHistoryItemService { + + @Override + public List listByPaymentId(Long id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(PayHistoryItem::getPaymentId,id); + return this.list(lqw); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/impl/PayPaymentItemServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/impl/PayPaymentItemServiceImpl.java new file mode 100644 index 0000000..27d79a1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/impl/PayPaymentItemServiceImpl.java @@ -0,0 +1,45 @@ +package com.qs.serve.modules.pay.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.pay.entity.PayPaymentItem; +import com.qs.serve.modules.pay.service.PayPaymentItemService; +import com.qs.serve.modules.pay.mapper.PayPaymentItemMapper; + +import java.util.List; + +/** + * 支付明细项 服务实现类 + * @author YenHex + * @since 2022-12-15 + */ +@Slf4j +@Service +@AllArgsConstructor +public class PayPaymentItemServiceImpl extends ServiceImpl implements PayPaymentItemService { + + @Override + public List listByVerSubjectId(Long versubId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(PayPaymentItem::getVerificationSubjectId,versubId); + return this.list(lqw); + } + + @Override + public List listByPaymentId(Long paymentId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(PayPaymentItem::getPaymentId,paymentId); + return this.list(lqw); + } + + @Override + public void removeByPaymentId(Long payId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(PayPaymentItem::getPaymentId,payId); + this.remove(lqw); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/impl/PayPaymentServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/impl/PayPaymentServiceImpl.java new file mode 100644 index 0000000..344f10c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/impl/PayPaymentServiceImpl.java @@ -0,0 +1,401 @@ +package com.qs.serve.modules.pay.service.impl; + +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.CopierUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.pay.common.PaymentType; +import com.qs.serve.modules.pay.entity.PayHistoryItem; +import com.qs.serve.modules.pay.entity.PayPaymentItem; +import com.qs.serve.modules.pay.entity.bo.PayPaymentBo; +import com.qs.serve.modules.pay.entity.dto.PayPaymentAmountDto; +import com.qs.serve.modules.pay.service.PayHistoryItemService; +import com.qs.serve.modules.pay.service.PayPaymentItemService; +import com.qs.serve.modules.seeyon.service.XiaoLuTonService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.service.TbsActivityService; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import com.qs.serve.modules.vtb.service.VtbVerificationSubjectService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.pay.entity.PayPayment; +import com.qs.serve.modules.pay.service.PayPaymentService; +import com.qs.serve.modules.pay.mapper.PayPaymentMapper; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 支付 服务实现类 + * @author YenHex + * @since 2022-12-15 + */ +@Slf4j +@Service +@AllArgsConstructor +public class PayPaymentServiceImpl extends ServiceImpl implements PayPaymentService { + + private SysUserService sysUserService; + private BmsSupplierService supplierService; + private PayPaymentItemService paymentItemService; + private VtbVerificationSubjectService verificationSubjectService; + private VtbVerificationService verificationService; + private TbsActivityService activityService; + private PayHistoryItemService payHistoryItemService; + private XiaoLuTonService xiaoLuTonService; + + @Override + @Transactional(rollbackFor = Exception.class) + public PayPayment payment(PayPaymentBo paymentBo) { + String payType = paymentBo.getPayType(); + if(!payType.equals(PaymentType.PAYMENT)){ + Assert.throwEx("支付类型异常"); + } + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(PayPayment::getErpId,paymentBo.getErpId()); + if(this.count(lqw)>0){ + Assert.throwEx("已存在ERPID"); + } + + SysUser sysUser = sysUserService.getByAccount(paymentBo.getUserCode()); + if(sysUser==null){ + Assert.throwEx("人员工号异常"); + } + + LambdaQueryWrapper vtbLqw = new LambdaQueryWrapper<>(); + vtbLqw.eq(VtbVerification::getVerificationCode,paymentBo.getVerificationSubCode()); + List verificationList = verificationService.list(vtbLqw); + + if(verificationList.size()==0){ + String verificationCode = paymentBo.getVerificationSubCode(); + + String verificationMainCode = verificationCode; + if(verificationCode.contains("_")) { + verificationMainCode = verificationCode.substring(0, verificationCode.indexOf("_")); + } + LambdaQueryWrapper vtbMainLqw = new LambdaQueryWrapper<>(); + vtbMainLqw.eq(VtbVerification::getVerificationMainCode,verificationMainCode); + verificationList = verificationService.list(vtbMainLqw); + if(verificationList.size()==0){ + Assert.throwEx("没有找到核销:"+ paymentBo.getVerificationSubCode()); + } + } + + BigDecimal payAmount = paymentBo.getPayAmount(); + if(paymentBo.getPayAmount()==null){ + Assert.throwEx("支付金额不能为空!"); + } + if(payAmount.compareTo(BigDecimal.ZERO)<=0){ + Assert.throwEx("支付金额小于或等于0:"+paymentBo.getErpId()); + } + + PayPayment payPayment = new PayPayment(); + payPayment.setPayType(PaymentType.PAYMENT); + payPayment.setPayCode(paymentBo.getErpId()); + payPayment.setPayAmount(paymentBo.getPayAmount()); + payPayment.setUserId(sysUser.getId()); + payPayment.setUserCode(sysUser.getCode()); + payPayment.setUserName(sysUser.getName()); + payPayment.setPayTime(paymentBo.getPayTime()); + payPayment.setPayDate(paymentBo.getPayDate()); + payPayment.setBillNumber(paymentBo.getBillNumber()); + payPayment.setRemark(paymentBo.getRemark()); + payPayment.setTenantId("001"); + payPayment.setErpId(paymentBo.getErpId()); + + VtbVerification vtbMain = verificationList.get(0); + payPayment.setSupplierId(vtbMain.getSupplierId()); + payPayment.setSupplierCode(vtbMain.getSupplierCode()); + payPayment.setSupplierName(vtbMain.getSupplierName()); + + List newPayList = new ArrayList<>(); + + for(VtbVerification vtb:verificationList){ + if(payAmount.compareTo(BigDecimal.ZERO)<=0){ + continue; + } + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(PayPaymentItem::getVerificationId,vtb.getId()); + List payPaymentItemList = paymentItemService.list(lambdaQueryWrapper); + BigDecimal usedAmount = payPaymentItemList.stream().map(PayPaymentItem::getItemPayAmount).reduce(BigDecimal.ZERO,BigDecimal::add); + if(usedAmount==null){ + usedAmount = BigDecimal.ZERO; + } + if(vtb.getAmount().compareTo(usedAmount)>0) { + PayPaymentItem payPaymentItem = new PayPaymentItem(); + payPaymentItem = CopierUtil.copy(payPayment,payPaymentItem); + payPaymentItem.setRemark(payPayment.getRemark()); + payPaymentItem.setCostApplyId(vtb.getCostApplyId()); + payPaymentItem.setSupplierId(vtb.getSupplierId()); + payPaymentItem.setVerificationId(vtb.getId()); + payPaymentItem.setVerificationSubjectId(null); + payPaymentItem.setVerificationCode(vtb.getVerificationCode()); + + BigDecimal vtbAmountUnused = vtb.getAmount().subtract(usedAmount); + if(payAmount.compareTo(vtbAmountUnused)>0){ + payPaymentItem.setItemPayAmount(vtbAmountUnused); + }else{ + payPaymentItem.setItemPayAmount(payAmount); + } + payAmount = payAmount.subtract(payPaymentItem.getItemPayAmount()); + newPayList.add(payPaymentItem); + + } + } + + if(payAmount.compareTo(BigDecimal.ZERO)>0){ + Assert.throwEx("支付金额超出核销可支付金额!"); + } + + this.save(payPayment); + + newPayList = newPayList.stream().map(a->{ + a.setPaymentId(payPayment.getId()); + return a; + }).collect(Collectors.toList()); + + paymentItemService.saveBatch(newPayList); + + return payPayment; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public PayPayment unpayment(PayPaymentBo paymentBo) { + String payType = paymentBo.getPayType(); + if(!payType.equals(PaymentType.UN_PAYMENT)){ + Assert.throwEx("支付类型异常"); + } + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(PayPayment::getErpId,paymentBo.getErpId()+PaymentType.UN_PAYMENT); + if(this.count(lqw)>0){ + Assert.throwEx("已存在ERPID"); + } + + SysUser sysUser = sysUserService.getByAccount(paymentBo.getUserCode()); + if(sysUser==null){ + Assert.throwEx("人员工号异常"); + } + + LambdaQueryWrapper vtbLqw = new LambdaQueryWrapper<>(); + vtbLqw.eq(VtbVerification::getVerificationCode,paymentBo.getVerificationSubCode()); + List verificationList = verificationService.list(vtbLqw); + + if(verificationList.size()==0){ + String verificationCode = paymentBo.getVerificationSubCode(); + + String verificationMainCode = verificationCode; + if(verificationCode.contains("_")) { + verificationMainCode = verificationCode.substring(0, verificationCode.indexOf("_")); + } + LambdaQueryWrapper vtbMainLqw = new LambdaQueryWrapper<>(); + vtbMainLqw.eq(VtbVerification::getVerificationMainCode,verificationMainCode); + verificationList = verificationService.list(vtbMainLqw); + if(verificationList.size()==0){ + Assert.throwEx("没有找到核销:"+ paymentBo.getVerificationSubCode()); + } + } + + BigDecimal payAmount = BigDecimal.ZERO; + + PayPayment payPayment = new PayPayment(); + payPayment.setPayType(PaymentType.UN_PAYMENT); + payPayment.setPayCode(paymentBo.getErpId()); + payPayment.setUserId(sysUser.getId()); + payPayment.setUserCode(sysUser.getCode()); + payPayment.setUserName(sysUser.getName()); + payPayment.setPayTime(paymentBo.getPayTime()); + payPayment.setPayDate(paymentBo.getPayDate()); + payPayment.setBillNumber(paymentBo.getBillNumber()); + payPayment.setRemark(paymentBo.getRemark()); + payPayment.setTenantId("001"); + payPayment.setErpId(paymentBo.getErpId()+PaymentType.UN_PAYMENT); + + VtbVerification vtbMain = verificationList.get(0); + payPayment.setSupplierId(vtbMain.getSupplierId()); + payPayment.setSupplierCode(vtbMain.getSupplierCode()); + payPayment.setSupplierName(vtbMain.getSupplierName()); + + List newPayList = new ArrayList<>(); + + for(VtbVerification vtb:verificationList){ + + LambdaQueryWrapper 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); + if(usedAmount==null){ + usedAmount = BigDecimal.ZERO; + } + if(vtb.getAmount().compareTo(usedAmount)>0) { + PayPaymentItem payPaymentItem = new PayPaymentItem(); + payPaymentItem = CopierUtil.copy(payPayment,payPaymentItem); + payPaymentItem.setRemark(payPayment.getRemark()); + payPaymentItem.setCostApplyId(vtb.getCostApplyId()); + payPaymentItem.setSupplierId(vtb.getSupplierId()); + payPaymentItem.setVerificationId(vtb.getId()); + payPaymentItem.setVerificationSubjectId(null); + payPaymentItem.setVerificationCode(vtb.getVerificationCode()); + + BigDecimal vtbAmountUnused = vtb.getAmount().subtract(usedAmount); + if(vtbAmountUnused.compareTo(BigDecimal.ZERO)>0){ + payPaymentItem.setItemPayAmount(vtbAmountUnused); + } + payAmount = payAmount.add(payPaymentItem.getItemPayAmount()); + newPayList.add(payPaymentItem); + + } + } + + if(payAmount.compareTo(BigDecimal.ZERO)==0){ + Assert.throwEx("核销已完全支付!没有不再支付金额"); + } + + payPayment.setPayAmount(payAmount); + + + this.save(payPayment); + + newPayList = newPayList.stream().map(a->{ + a.setPaymentId(payPayment.getId()); + return a; + }).collect(Collectors.toList()); + + paymentItemService.saveBatch(newPayList); + + return payPayment; + } + + @Override + public void cancelUnPayment(String verificationCode) { + + } + + // /** +// * 构建支付明细 +// * @param paymentBo +// * @param currentBalance +// * @param paymentItemList +// * @param verificationSubjectUpdateList +// * @param verificationSubject +// * @return currentBalance 本次支付余额 +// */ +// @NotNull +// private BigDecimal buildPaymentItems(PayPaymentBo paymentBo, BigDecimal currentBalance, List paymentItemList, List verificationSubjectUpdateList, VtbVerificationSubject verificationSubject) { +// //统计历史支付金额 +// BigDecimal hisPayAmount = BigDecimal.ZERO; +// List payPaymentItems = paymentItemService.listByvtbMainId(verificationSubject.getId()); +// for (PayPaymentItem paymentItem : payPaymentItems) { +// hisPayAmount = hisPayAmount.add(paymentItem.getItemPayAmount()); +// } +// //当前项未支付 +// BigDecimal shouldPay = verificationSubject.getUsedAmount().subtract(hisPayAmount); +// //当前项支付金额 +// BigDecimal currentItemPay; +// if(currentBalance.compareTo(shouldPay)>0){ +// currentItemPay = shouldPay; +// currentBalance = currentBalance.subtract(shouldPay); +// }else { +// currentItemPay = currentBalance; +// currentBalance = BigDecimal.ZERO; +// } +// PayPaymentItem paymentItem = new PayPaymentItem(); +// paymentItem.setPayType(paymentBo.getPayType()); +// paymentItem.setSupplierId(paymentBo.getSupplierId()); +// paymentItem.setItemPayAmount(currentItemPay); +// paymentItem.setVerificationId(verificationSubject.getVerificationId()); +// paymentItem.setVerificationSubjectId(verificationSubject.getId()); +// paymentItem.setCostApplyId(verificationSubject.getCostApplyId()); +// paymentItem.setActivityId(verificationSubject.getActivityId()); +// paymentItem.setSubjectId(verificationSubject.getSubjectId()); +// paymentItem.setSubjectCode(verificationSubject.getSubjectCode()); +// paymentItem.setSubjectName(verificationSubject.getSubjectName()); +// paymentItemList.add(paymentItem); +// //更新核销科目余额 +// BigDecimal payAmountOfVer = verificationSubject.getPayAmount().add(currentItemPay); +// VtbVerificationSubject subjectParam = new VtbVerificationSubject(); +// subjectParam.setId(verificationSubject.getId()); +// subjectParam.setPayAmount(payAmountOfVer); +// if(verificationSubject.getUsedAmount().compareTo(payAmountOfVer)==0){ +// subjectParam.setPayFinishedFlag(1); +// } +// verificationSubjectUpdateList.add(subjectParam); +// return currentBalance; +// } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancel(String erpId) { + + PayPayment dbPay = this.baseMapper.getByErpId(erpId); + if(dbPay==null){ + Assert.throwEx("没有该支付数据!"); + } + + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(PayPayment::getErpId,erpId); + this.remove(lambdaQueryWrapper); + + LambdaQueryWrapper paymentItemLambdaQueryWrapper = new LambdaQueryWrapper<>(); + paymentItemLambdaQueryWrapper.eq(PayPaymentItem::getErpId,erpId); + paymentItemService.remove(paymentItemLambdaQueryWrapper); + + LambdaQueryWrapper lambdaQueryWrapper2 = new LambdaQueryWrapper<>(); + lambdaQueryWrapper2.eq(PayPayment::getErpId,erpId+PaymentType.UN_PAYMENT); + this.remove(lambdaQueryWrapper2); + + LambdaQueryWrapper paymentItemLambdaQueryWrapper2 = new LambdaQueryWrapper<>(); + paymentItemLambdaQueryWrapper2.eq(PayPaymentItem::getErpId,erpId+PaymentType.UN_PAYMENT); + paymentItemService.remove(paymentItemLambdaQueryWrapper2); + + } + + @Override + public PayPaymentAmountDto getSupplierBalance(Long supplierId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(VtbVerificationSubject::getSupplierId,supplierId); + lqw.eq(VtbVerificationSubject::getPayFinishedFlag,0); + lqw.eq(VtbVerificationSubject::getEffectiveFlag,1); + List vtbVerificationSubjectList = verificationSubjectService.list(lqw); + BmsSupplier supplier = supplierService.getById(supplierId); + BigDecimal hasAmount = BigDecimal.ZERO; + //添加历史金额支持 + BigDecimal totalAmount = supplier.getInitCurAmount(); + if(totalAmount.compareTo(BigDecimal.ZERO)>0){ + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(); + lqw2.eq(PayHistoryItem::getSupplierId,supplierId); + List historyItems = payHistoryItemService.list(lqw2); + for (PayHistoryItem historyItem : historyItems) { + hasAmount = hasAmount.add(historyItem.getItemPayAmount()); + } + } + for (VtbVerificationSubject verificationSubject : vtbVerificationSubjectList) { + totalAmount = totalAmount.add(verificationSubject.getUsedAmount()); + hasAmount = hasAmount.add(verificationSubject.getPayAmount()); + } + //统计不再支付 + List unPayList = this.list( + new LambdaQueryWrapper() + .eq(PayPayment::getPayType,PaymentType.UN_PAYMENT) + .eq(PayPayment::getSupplierId,supplierId) + ); + BigDecimal totalUnPay = BigDecimal.ZERO; + for (PayPayment payment : unPayList) { + totalUnPay = totalUnPay.add(payment.getPayAmount()); + } + return new PayPaymentAmountDto(totalAmount,hasAmount,totalUnPay,vtbVerificationSubjectList); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/impl/PayWayServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/impl/PayWayServiceImpl.java new file mode 100644 index 0000000..65474bc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/pay/service/impl/PayWayServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.pay.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.pay.entity.PayWay; +import com.qs.serve.modules.pay.service.PayWayService; +import com.qs.serve.modules.pay.mapper.PayWayMapper; + +/** + * 付款方式 服务实现类 + * @author YenHex + * @since 2023-05-23 + */ +@Slf4j +@Service +@AllArgsConstructor +public class PayWayServiceImpl extends ServiceImpl implements PayWayService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/QmsCategoryController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/QmsCategoryController.java new file mode 100644 index 0000000..fe12163 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/QmsCategoryController.java @@ -0,0 +1,117 @@ +package com.qs.serve.modules.qms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.qms.entity.QmsCategory; +import com.qs.serve.modules.qms.service.QmsCategoryService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 问卷分类 + * @module 问卷 + * @author YenHex + * @since 2022-09-13 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("qms/category") +public class QmsCategoryController { + + private QmsCategoryService qmsCategoryService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('qms:category:query')") + public R> getPage(QmsCategory param){ + PageUtil.startPage(); + LambdaQueryWrapper categoryWrapper = new LambdaQueryWrapper<>(param); + List list = qmsCategoryService.list(categoryWrapper); + return R.byPageHelperList(list); + } + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(QmsCategory param){ + LambdaQueryWrapper categoryWrapper = new LambdaQueryWrapper<>(param); + List list = qmsCategoryService.list(categoryWrapper); + return R.ok(list); + } + + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.QUESTION, title = "问卷分类", biz = BizType.QUERY) + @PreAuthorize("hasRole('qms:category:query')") + public R getById(@PathVariable("id") String id){ + QmsCategory qmsCategory = qmsCategoryService.getById(id); + return R.ok(qmsCategory); + } + + + + /** + * 根据ID更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.QUESTION, title = "问卷分类", biz = BizType.UPDATE) + @PreAuthorize("hasRole('qms:category:update')") + public R updateById(@RequestBody @Valid QmsCategory param){ + boolean result = qmsCategoryService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增问卷分类 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.QUESTION, title = "问卷分类", biz = BizType.INSERT) + @PreAuthorize("hasRole('qms:category:insert')") + public R save(@RequestBody @Valid QmsCategory param){ + boolean result = qmsCategoryService.save(param); + return R.isTrue(result); + } + + /** + * 删除问卷分类 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.QUESTION, title = "问卷分类", biz = BizType.DELETE) + @PreAuthorize("hasRole('qms:category:delete')") + public R deleteById(@PathVariable("id") Long id){ + boolean result = qmsCategoryService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/QmsFormController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/QmsFormController.java new file mode 100644 index 0000000..d1336df --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/QmsFormController.java @@ -0,0 +1,120 @@ +package com.qs.serve.modules.qms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.CopierUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.qms.entity.QmsFormSubmit; +import com.qs.serve.modules.qms.entity.bo.QmsFormBo; +import com.qs.serve.modules.qms.service.QmsFormSubmitService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.qms.entity.QmsForm; +import com.qs.serve.modules.qms.service.QmsFormService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 问卷表单 + * @author YenHex + * @since 2022-09-13 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("qms/form") +public class QmsFormController { + + private QmsFormService qmsFormService; + private QmsFormSubmitService formSubmitService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('qms:form:query')") + public R> getPage(QmsForm param){ + PageUtil.startPage(); + LambdaQueryWrapper formWrapper = new LambdaQueryWrapper<>(param); + formWrapper.orderByDesc(QmsForm::getCreateTime); + List list = qmsFormService.list(formWrapper); + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.QUESTION, title = "问卷表单", biz = BizType.QUERY) + @PreAuthorize("hasRole('qms:form:query')") + public R getById(@PathVariable("id") String id){ + QmsForm qmsForm = qmsFormService.getById(id); + return R.ok(qmsForm); + } + + + /** + * 根据ID更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.QUESTION, title = "问卷表单", biz = BizType.UPDATE) + @PreAuthorize("hasRole('qms:form:update')") + public R updateById(@RequestBody @Valid QmsFormBo param){ + QmsForm qmsForm = CopierUtil.copy(param,new QmsForm()); + QmsForm dbForm = qmsFormService.getById(qmsForm.getId()); + if(!qmsForm.getFormContext().equals(dbForm.getFormContext())){ + qmsForm.setVersion(dbForm.getVersion()+1); + } + boolean result = qmsFormService.updateById(qmsForm); + return R.isTrue(result); + } + + /** + * 新增问卷表单 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.QUESTION, title = "问卷表单", biz = BizType.INSERT) + @PreAuthorize("hasRole('qms:form:insert')") + public R save(@RequestBody @Valid QmsFormBo param){ + QmsForm qmsForm = CopierUtil.copy(param,new QmsForm()); + qmsForm.setVersion(1); + qmsFormService.save(qmsForm); + return R.ok(qmsForm); + } + + /** + * 删除问卷表单 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.QUESTION, title = "问卷表单", biz = BizType.DELETE) + @PreAuthorize("hasRole('qms:form:delete')") + public R deleteById(@PathVariable("id") Long id){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(QmsFormSubmit::getFromId,id); + if(formSubmitService.count(lqw)>0){ + return R.error("问卷表单已被使用无法删除"); + } + boolean result = qmsFormService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/QmsFormSubmitController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/QmsFormSubmitController.java new file mode 100644 index 0000000..bae6042 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/QmsFormSubmitController.java @@ -0,0 +1,120 @@ +package com.qs.serve.modules.qms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.modules.qms.entity.QmsDraft; +import com.qs.serve.modules.qms.service.QmsGroupService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.qms.entity.QmsFormSubmit; +import com.qs.serve.modules.qms.service.QmsFormSubmitService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 问卷提交记录 + * @author YenHex + * @since 2022-09-13 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("qms/formSubmit") +public class QmsFormSubmitController { + + private QmsFormSubmitService qmsFormSubmitService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('qms:formSubmit:query')") + public R> getPage(QmsFormSubmit param){ + PageUtil.startPage(); + LambdaQueryWrapper formSubmitWrapper = new LambdaQueryWrapper<>(param); + List list = qmsFormSubmitService.list(formSubmitWrapper); + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.QUESTION, title = "问卷提交记录", biz = BizType.QUERY) + @PreAuthorize("hasRole('qms:formSubmit:query')") + public R getById(@PathVariable("id") String id){ + QmsFormSubmit qmsFormSubmit = qmsFormSubmitService.getById(id); + return R.ok(qmsFormSubmit); + } + + /** + * 获取用户提交记录 + * @param userId + * @param groupId + * @return + */ + @GetMapping("/getOne") + @SysLog(module = SystemModule.QUESTION, title = "问卷提交记录", biz = BizType.QUERY) + public R getById(String userId,String groupId){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(QmsFormSubmit::getGroupId,groupId); + lqw.eq(QmsFormSubmit::getUserId,userId); + QmsFormSubmit qmsFormSubmit = qmsFormSubmitService.getOne(lqw,false); + return R.ok(qmsFormSubmit); + } + + + /** + * 根据ID更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.QUESTION, title = "问卷提交记录", biz = BizType.UPDATE) + @PreAuthorize("hasRole('qms:formSubmit:update')") + public R updateById(@RequestBody @Valid QmsFormSubmit param){ + boolean result = qmsFormSubmitService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增问卷提交记录 + * @param param + * @return + */ + //@PostMapping("/save") + @SysLog(module = SystemModule.QUESTION, title = "问卷提交记录", biz = BizType.INSERT) + @PreAuthorize("hasRole('qms:formSubmit:insert')") + public R save(@RequestBody @Valid QmsFormSubmit param){ + boolean result = qmsFormSubmitService.save(param); + return R.isTrue(result); + } + + /** + * 删除问卷提交记录 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.QUESTION, title = "问卷提交记录", biz = BizType.DELETE) + @PreAuthorize("hasRole('qms:formSubmit:delete')") + public R deleteById(@PathVariable("id") String id){ + boolean result = qmsFormSubmitService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/QmsGroupController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/QmsGroupController.java new file mode 100644 index 0000000..a97b500 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/QmsGroupController.java @@ -0,0 +1,275 @@ +package com.qs.serve.modules.qms.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.annotation.LimitSubmit; +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.dto.SimpleKeyValue; +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.qms.entity.QmsForm; +import com.qs.serve.modules.qms.entity.QmsGroupScope; +import com.qs.serve.modules.qms.entity.bo.QmsGroupBo; +import com.qs.serve.modules.qms.entity.bo.QmsHastenBo; +import com.qs.serve.modules.qms.mapper.QmsGroupMapper; +import com.qs.serve.modules.qms.service.QmsFormService; +import com.qs.serve.modules.qms.service.QmsGroupScopeService; +import com.qs.serve.modules.sys.entity.SysDept; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.entity.dto.SysUserSimpleVo; +import com.qs.serve.modules.sys.service.SysDeptService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.wx.entity.WxUser; +import com.qs.serve.modules.wx.entity.dto.sms.WxSmsNewForm; +import com.qs.serve.modules.wx.service.WxPushService; +import com.qs.serve.modules.wx.service.WxUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.qms.entity.QmsGroup; +import com.qs.serve.modules.qms.service.QmsGroupService; + +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 问卷 发布组 后台接口 + * @author YenHex + * @since 2022-09-16 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("qms/group") +public class QmsGroupController { + + private QmsGroupMapper qmsGroupMapper; + private QmsGroupService qmsGroupService; + private QmsFormService qmsFormService; + private QmsGroupScopeService qmsGroupScopeService; + private SysUserService sysUserService; + private SysDeptService sysDeptService; + private WxUserService wxUserService; + private WxPushService wxPushService; + + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('qms:group:query')") + public R> getPage(QmsGroup param){ + if(!StringUtils.hasText(param.getName())){ + param.setName(param.getTitle()); + } + PageUtil.startPage(); + LambdaQueryWrapper groupWrapper = new LambdaQueryWrapper<>(param); + groupWrapper.orderByDesc(QmsGroup::getCreateTime); + List list = qmsGroupService.list(groupWrapper); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.QUESTION, title = "发布组", biz = BizType.QUERY) + @PreAuthorize("hasRole('qms:group:query')") + public R getById(@PathVariable("id") String id){ + QmsGroup qmsGroup = qmsGroupService.getById(id); + qmsGroup.setFormInfo(qmsFormService.getById(qmsGroup.getFormId())); + List list = qmsGroupScopeService.listByGroupId(qmsGroup.getId()); + Map> scopeValuesMap = list.stream().collect(Collectors.groupingBy(QmsGroupScope::getScopeType)); + for (Integer scopeType : scopeValuesMap.keySet()) { + List scopeValues = scopeValuesMap.get(scopeType); + List ids = scopeValues.stream().map(QmsGroupScope::getScopeValue).distinct().collect(Collectors.toList()); + if(scopeType.equals(0)||scopeType.equals(1)||scopeType.equals(2)){ + qmsGroup.setScopeType(scopeType); + } + if(scopeType.equals(1)||scopeType.equals(3)||scopeType.equals(4)){ + List userList = sysUserService.listByIds(ids); + List userSimpleVos = userList.stream().map(a->a.toSimpleVo(true)).collect(Collectors.toList()); + qmsGroup.setUserList(userSimpleVos); + }else if(scopeType.equals(2)){ + List deptList = sysDeptService.listByIds(ids); + qmsGroup.setDeptList(deptList); + } + } + return R.ok(qmsGroup); + } + + /** + * 更新 + * @param param + * @return + */ + @LimitSubmit + @PostMapping("/updateById") + @SysLog(module = SystemModule.QUESTION, title = "发布组", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid QmsGroupBo param){ + QmsGroup qmsGroup = qmsGroupService.getById(param.getId()); + if(qmsGroup.getPublishState().equals(1)){ + return R.error("已发布不可以修改"); + } + CopierUtil.copy(param,qmsGroup); + QmsForm qmsForm = qmsFormService.getById(qmsGroup.getFormId()); + qmsGroup.setFormContext(qmsForm.getFormContext()); + qmsGroup.setVersion(qmsForm.getVersion()); + qmsGroup.setPreNotifyStatus(param.getPreNotifyTime()==null?0:1); + qmsGroupService.updateById(qmsGroup); + if(param.getPreNotifyTime()==null){ + qmsGroupMapper.updateSetNotifyTimeNull(param.getId()+""); + } + qmsGroupScopeService.removeByGroupId(qmsGroup.getId()); + qmsGroupScopeService.saveByBo(qmsGroup.getId(),param); + return R.ok(); + } + + + /** + * 发布 + * @param groupId + * @return + */ + @LimitSubmit + @GetMapping("/publish/{groupId}") + @SysLog(module = SystemModule.QUESTION, title = "发布组", biz = BizType.UPDATE) + public R publish(@PathVariable("groupId")String groupId){ + QmsGroup qmsGroup = qmsGroupService.getById(groupId); + if(qmsGroup.getPublishState().equals(1)){ + return R.error("请勿重新发布"); + } + qmsGroup.setPublishState(1); + qmsGroup.setPublishTime(LocalDateTime.now()); + qmsGroupService.updateById(qmsGroup); + this.qmsGroupScopeService.publish(groupId); + return R.ok(); + } + + /** + * 催办 + * @param hastenBo + * @return + */ + @LimitSubmit + @PostMapping("/hasten") + @SysLog(module = SystemModule.QUESTION, title = "发布组", biz = BizType.UPDATE) + public R hasten(@RequestBody @Valid QmsHastenBo hastenBo){ + QmsGroup qmsGroup = qmsGroupService.getById(hastenBo.getGroupId()); + if(qmsGroup.getPublishState().equals(0)){ + return R.error("未发布不可以催办"); + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(QmsGroupScope::getGroupId,hastenBo.getGroupId()); + lqw.eq(QmsGroupScope::getFinished,0); + lqw.ne(QmsGroupScope::getScopeType,0); + lqw.ne(QmsGroupScope::getScopeType,2); + if(hastenBo.getUserIds()!=null && hastenBo.getUserIds().length>0){ + lqw.in(QmsGroupScope::getScopeValue, Arrays.asList(hastenBo.getUserIds())); + } + List groupScopes = qmsGroupScopeService.list(lqw); + List userIds = groupScopes.stream() + .map(QmsGroupScope::getScopeValue) + .distinct().collect(Collectors.toList()); + if(CollectionUtil.isEmpty(userIds)){return R.ok();} + List wxUserList = wxUserService.getBySysUserIds(userIds); + //发送推送 + for (WxUser wxUser : wxUserList) { + WxSmsNewForm wxSmsNewForm = new WxSmsNewForm(); + wxSmsNewForm.setTitle(qmsGroup.getName()); + wxSmsNewForm.setUserName(wxUser.getEmpName()); + wxSmsNewForm.setBizType("催办通知"); + wxSmsNewForm.setBitTime(qmsGroup.getPublishTime().toString()); + wxSmsNewForm.setRemark(qmsGroup.getRemark()); + wxPushService.sendWxMsg(wxUser,"填写问卷通知",wxSmsNewForm,true,hastenBo.getGroupId()+""); + } + return R.ok(); + } + + + /** + * 催办列表 + * @param finished + * @param groupId + * @return + */ + @LimitSubmit + @GetMapping("/unfinishedList") + public R unfinishedList(String finished,String groupId,String code,String name){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + if(StringUtils.hasText(finished)){ + lqw.eq(QmsGroupScope::getFinished,finished); + }else { + lqw.ne(QmsGroupScope::getFinished,-1); + } + if(StringUtils.hasText(code)){ + lqw.like(QmsGroupScope::getUserCode,code); + } + if(StringUtils.hasText(name)){ + lqw.like(QmsGroupScope::getUserName,name); + } + if(StringUtils.hasText(groupId)){ + lqw.eq(QmsGroupScope::getGroupId,groupId); + } + lqw.ne(QmsGroupScope::getScopeType,0); + lqw.ne(QmsGroupScope::getScopeType,2); + PageUtil.startPage(); + List groupScopes = qmsGroupScopeService.list(lqw); + List list = new ArrayList<>(); + for (QmsGroupScope groupScope : groupScopes) { + SysUser sysUser = sysUserService.getById(groupScope.getScopeValue()); + SysUserSimpleVo simpleVo = sysUser.toSimpleVo(true); + simpleVo.setFinished(groupScope.getFinished()); + list.add(simpleVo); + } + return R.byPageHelperList(groupScopes,list); + } + + /** + * 新增 + * @param param + * @return + */ + @LimitSubmit + @PostMapping("/save") + @SysLog(module = SystemModule.QUESTION, title = "发布组", biz = BizType.INSERT) + @PreAuthorize("hasRole('qms:group:insert')") + public R save(@RequestBody @Valid QmsGroupBo param){ + QmsGroup qmsGroup = CopierUtil.copy(param,new QmsGroup()); + QmsForm qmsForm = qmsFormService.getById(qmsGroup.getFormId()); + //qmsGroup.setId(IdUtil.getSnowFlakeId()+""); + qmsGroup.setFormContext(qmsForm.getFormContext()); + qmsGroup.setVersion(qmsForm.getVersion()); + qmsGroup.setPublishState(0); + qmsGroup.setPreNotifyStatus(param.getPreNotifyTime()==null?0:1); + qmsGroupService.save(qmsGroup); + qmsGroupScopeService.saveByBo(qmsGroup.getId(),param); + return R.ok(); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.QUESTION, title = "发布组", biz = BizType.DELETE) + @PreAuthorize("hasRole('qms:group:delete')") + public R deleteById(@PathVariable("id") String id){ + qmsGroupService.removeById(id); + qmsGroupScopeService.removeByGroupId(id); + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/api/QmsDraftApiController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/api/QmsDraftApiController.java new file mode 100644 index 0000000..c460f54 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/api/QmsDraftApiController.java @@ -0,0 +1,68 @@ +package com.qs.serve.modules.qms.controller.api; + +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.modules.qms.entity.bo.QmsDraftBo; +import com.qs.serve.modules.qms.entity.vo.QmsDraftVo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.qms.entity.QmsDraft; +import com.qs.serve.modules.qms.service.QmsDraftService; + +import javax.validation.Valid; + +/** + * API问卷草稿 + * @author YenHex + * @since 2022-09-13 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/api/draft") +public class QmsDraftApiController { + + private QmsDraftService qmsDraftService; + + /** + * 获取表单草稿 + * @param formId + * @return + */ + @GetMapping("/{groupId}") + public R getDraft(@PathVariable("groupId") Long formId){ + QmsDraft qmsDraft = qmsDraftService.getUserFormDraft(formId); + if(qmsDraft==null){ + return R.ok(); + } + return R.ok(CopierUtil.copy(qmsDraft,new QmsDraftVo())); + } + + /** + * 保存草稿 + * @param param + * @return + */ + @PostMapping("/save") + public R saveDraft(@Valid @RequestBody QmsDraftBo param) { + QmsDraft qmsDraft = qmsDraftService.getUserFormDraft(param.getGroupId()); + if(qmsDraft==null){ + qmsDraft = new QmsDraft(); + qmsDraft.setGroupId(param.getGroupId()); + qmsDraft.setContext(param.getContext()); + qmsDraft.setUserId(AuthContextUtils.getSysUserId()); + qmsDraft.setPubFlag("0"); + qmsDraftService.save(qmsDraft); + }else { + qmsDraft.setContext(param.getContext()); + qmsDraftService.updateById(qmsDraft); + } + return R.ok(); + } + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/api/QmsSubmitApiController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/api/QmsSubmitApiController.java new file mode 100644 index 0000000..e66183b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/api/QmsSubmitApiController.java @@ -0,0 +1,169 @@ +package com.qs.serve.modules.qms.controller.api; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.InterType; +import com.qs.serve.common.model.enums.SystemModule; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.qms.entity.QmsFormSubmit; +import com.qs.serve.modules.qms.entity.QmsGroup; +import com.qs.serve.modules.qms.entity.QmsGroupScope; +import com.qs.serve.modules.qms.entity.bo.QmsSubmitBo; +import com.qs.serve.modules.qms.entity.so.QmsGroupSo; +import com.qs.serve.modules.qms.mapper.QmsGroupScopeMapper; +import com.qs.serve.modules.qms.service.QmsFormSubmitService; +import com.qs.serve.modules.qms.service.QmsGroupScopeService; +import com.qs.serve.modules.qms.service.QmsGroupService; +import com.qs.serve.modules.wx.entity.WxUser; +import com.qs.serve.modules.wx.service.WxUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; + +/** + * API 问卷提交记录 + * @author YenHex + * @since 2022-09-13 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/api/submit") +public class QmsSubmitApiController { + + private QmsFormSubmitService qmsFormSubmitService; + private QmsGroupScopeService qmsGroupScopeService; + private QmsGroupScopeMapper qmsGroupScopeMapper; + private QmsGroupService qmsGroupService; + private WxUserService wxUserService; + + /** + * 我的代办、已办列表 + * @param param + * @return + */ + @GetMapping("/myGroupList") + public R todoPage(QmsGroupSo param){ + Integer finished = param.getFinished(); + WxUser wxUser = wxUserService.getCurrentWxUser(); + if(wxUser.getSysUserId()==null||wxUser.getSysUserId().equals("0")){ + return R.byEmptyList(); + } + String userId = wxUser.getSysUserId(); +// LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); +// lqw.in(QmsGroupScope::getScopeType,1,3,4); +// lqw.eq(QmsGroupScope::getScopeValue,userId); +// lqw.orderByDesc(QmsGroupScope::getCreateTime); +// if(StringUtils.hasText(finished)){ +// //查询是否已完成 +// lqw.eq(QmsGroupScope::getFinished,finished); +// }else { +// //查询所有 +// lqw.ne(QmsGroupScope::getFinished,-1); +// } +// PageUtil.startPage(); +// List groupScopes = qmsGroupScopeService.list(lqw); + PageUtil.startPage(); + List groupScopes = qmsGroupScopeMapper.listScope(param,userId); + List result = new ArrayList<>(); + for (QmsGroupScope groupScope : groupScopes) { + QmsGroup qmsGroup = qmsGroupService.getById(groupScope.getGroupId()); + if(qmsGroup==null){ + continue; + } + //当 finished==0 and groupFinished ==1 表示人数达标,已过期 + qmsGroup.setFinished(groupScope.getFinished()); + result.add(qmsGroup); + } + return R.byPageHelperList(groupScopes,result); + } + + /** + * 已提交列表 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(QmsFormSubmit param){ + LambdaQueryWrapper formSubmitWrapper = new LambdaQueryWrapper<>(param); + formSubmitWrapper.orderByDesc(QmsFormSubmit::getCreateTime); + formSubmitWrapper.eq(QmsFormSubmit::getUserId,wxUserService.getCurrentWxUser().getSysUserId()); + PageUtil.startPage(); + List list = qmsFormSubmitService.list(formSubmitWrapper); + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.QUESTION, title = "问卷提交记录", biz = BizType.QUERY, inter = InterType.API) + public R getById(@PathVariable("id") String id){ + QmsFormSubmit qmsFormSubmit = qmsFormSubmitService.getById(id); + if(!qmsFormSubmit.getUserId().equals(wxUserService.getCurrentWxUser().getSysUserId())){ + return R.ok(); + } + return R.ok(qmsFormSubmit); + } + + /** + * 根据发布组ID查询 + * @param groupId + * @return + */ + @GetMapping("/getByFormId/{groupId}") + @SysLog(module = SystemModule.QUESTION, title = "问卷提交记录", biz = BizType.QUERY, inter = InterType.API) + public R getByFormId(@PathVariable("groupId") String groupId){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + String userId = wxUserService.getCurrentWxUser().getSysUserId(); + lqw.eq(QmsFormSubmit::getGroupId,groupId); + lqw.eq(QmsFormSubmit::getUserId,userId); + QmsGroup qmsGroup = qmsGroupService.getById(groupId); + QmsFormSubmit formSubmit = qmsFormSubmitService.getOne(lqw,false); + QmsGroupScope groupScope = qmsGroupScopeService.getByGroupAndUid(groupId,userId); + if(formSubmit==null){ + formSubmit = CopierUtil.copy(qmsGroup,new QmsFormSubmit()); + formSubmit.setTitle(qmsGroup.getName()); + } + formSubmit.setGroupFinished(qmsGroup.getGroupFinished()); + formSubmit.setFinished(groupScope.getFinished()); + return R.ok(formSubmit); + } + + + /** + * 提交问卷 + * @param param + * @return + */ + @PostMapping("/submit") + @SysLog(module = SystemModule.QUESTION, title = "问卷提交记录", biz = BizType.UPDATE, inter = InterType.API) + public R updateById(@RequestBody @Valid QmsSubmitBo param){ + qmsFormSubmitService.submit(param); + return R.ok(); + } + + /** + * 删除问卷提交记录 + * @param id + * @return + */ + //@DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.QUESTION, title = "问卷提交记录", biz = BizType.DELETE, inter = InterType.API) + public R deleteById(@PathVariable("id") String id){ + boolean result = qmsFormSubmitService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/my/QmsDraftMyController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/my/QmsDraftMyController.java new file mode 100644 index 0000000..0f3689d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/my/QmsDraftMyController.java @@ -0,0 +1,67 @@ +package com.qs.serve.modules.qms.controller.my; + +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.modules.qms.entity.QmsDraft; +import com.qs.serve.modules.qms.entity.bo.QmsDraftBo; +import com.qs.serve.modules.qms.entity.vo.QmsDraftVo; +import com.qs.serve.modules.qms.service.QmsDraftService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +/** + * 问卷 问卷草稿(我的) + * @author YenHex + * @since 2022-09-13 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/my/qms/draft") +public class QmsDraftMyController { + + private QmsDraftService qmsDraftService; + + /** + * 获取表单草稿 + * @param formId + * @return + */ + @GetMapping("/{groupId}") + public R getDraft(@PathVariable("groupId") Long formId){ + QmsDraft qmsDraft = qmsDraftService.getUserFormDraft(formId); + if(qmsDraft==null){ + return R.ok(); + } + return R.ok(CopierUtil.copy(qmsDraft,new QmsDraftVo())); + } + + /** + * 保存草稿 + * @param param + * @return + */ + @PostMapping("/save") + public R saveDraft(@Valid @RequestBody QmsDraftBo param) { + QmsDraft qmsDraft = qmsDraftService.getUserFormDraft(param.getGroupId()); + if(qmsDraft==null){ + qmsDraft = new QmsDraft(); + qmsDraft.setGroupId(param.getGroupId()); + qmsDraft.setContext(param.getContext()); + qmsDraft.setUserId(AuthContextUtils.getSysUserId()); + qmsDraft.setPubFlag("0"); + qmsDraftService.save(qmsDraft); + }else { + qmsDraft.setContext(param.getContext()); + qmsDraftService.updateById(qmsDraft); + } + return R.ok(); + } + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/my/QmsSubmitMyController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/my/QmsSubmitMyController.java new file mode 100644 index 0000000..20e6508 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/controller/my/QmsSubmitMyController.java @@ -0,0 +1,164 @@ +package com.qs.serve.modules.qms.controller.my; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.InterType; +import com.qs.serve.common.model.enums.SystemModule; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.qms.entity.QmsFormSubmit; +import com.qs.serve.modules.qms.entity.QmsGroup; +import com.qs.serve.modules.qms.entity.QmsGroupScope; +import com.qs.serve.modules.qms.entity.bo.QmsSubmitBo; +import com.qs.serve.modules.qms.entity.so.QmsGroupSo; +import com.qs.serve.modules.qms.mapper.QmsGroupScopeMapper; +import com.qs.serve.modules.qms.service.QmsFormSubmitService; +import com.qs.serve.modules.qms.service.QmsGroupScopeService; +import com.qs.serve.modules.qms.service.QmsGroupService; +import com.qs.serve.modules.wx.service.WxUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; + +/** + * 问卷 问卷提交记录(我的) + * @author YenHex + * @since 2022-09-13 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/my/qms/submit") +public class QmsSubmitMyController { + + private QmsFormSubmitService qmsFormSubmitService; + private QmsGroupScopeService qmsGroupScopeService; + private QmsGroupScopeMapper qmsGroupScopeMapper; + private QmsGroupService qmsGroupService; + private WxUserService wxUserService; + + /** + * 我的代办、已办列表 + * @param param + * @return + */ + @GetMapping("/myGroupList") + public R todoPage(QmsGroupSo param){ + String userId = AuthContextUtils.getSysUserId(); +// LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); +// lqw.in(QmsGroupScope::getScopeType,1,3,4); +// lqw.eq(QmsGroupScope::getScopeValue,userId); +// lqw.orderByDesc(QmsGroupScope::getCreateTime); +// if(StringUtils.hasText(finished)){ +// //查询是否已完成 +// lqw.eq(QmsGroupScope::getFinished,finished); +// }else { +// //查询所有 +// lqw.ne(QmsGroupScope::getFinished,-1); +// } +// PageUtil.startPage(); +// List groupScopes = qmsGroupScopeService.list(lqw); + PageUtil.startPage(); + List groupScopes = qmsGroupScopeMapper.listScope(param,userId); + List result = new ArrayList<>(); + for (QmsGroupScope groupScope : groupScopes) { + QmsGroup qmsGroup = qmsGroupService.getById(groupScope.getGroupId()); + if(qmsGroup==null){ + continue; + } + //当 finished==0 and groupFinished ==1 表示人数达标,已过期 + qmsGroup.setFinished(groupScope.getFinished()); + result.add(qmsGroup); + } + return R.byPageHelperList(groupScopes,result); + } + + /** + * 已提交列表 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(QmsFormSubmit param){ + LambdaQueryWrapper formSubmitWrapper = new LambdaQueryWrapper<>(param); + formSubmitWrapper.orderByDesc(QmsFormSubmit::getCreateTime); + formSubmitWrapper.eq(QmsFormSubmit::getUserId,AuthContextUtils.getSysUserId()); + PageUtil.startPage(); + List list = qmsFormSubmitService.list(formSubmitWrapper); + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.QUESTION, title = "问卷提交记录", biz = BizType.QUERY, inter = InterType.API) + public R getById(@PathVariable("id") String id){ + QmsFormSubmit qmsFormSubmit = qmsFormSubmitService.getById(id); + if(!qmsFormSubmit.getUserId().equals(AuthContextUtils.getSysUserId())){ + return R.ok(); + } + return R.ok(qmsFormSubmit); + } + + /** + * 根据发布组ID查询 + * @param groupId + * @return + */ + @GetMapping("/getByFormId/{groupId}") + @SysLog(module = SystemModule.QUESTION, title = "问卷提交记录", biz = BizType.QUERY, inter = InterType.API) + public R getByFormId(@PathVariable("groupId") String groupId){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + String userId = AuthContextUtils.getSysUserId(); + lqw.eq(QmsFormSubmit::getGroupId,groupId); + lqw.eq(QmsFormSubmit::getUserId,userId); + QmsGroup qmsGroup = qmsGroupService.getById(groupId); + QmsFormSubmit formSubmit = qmsFormSubmitService.getOne(lqw,false); + QmsGroupScope groupScope = qmsGroupScopeService.getByGroupAndUid(groupId,userId); + if(formSubmit==null){ + formSubmit = CopierUtil.copy(qmsGroup,new QmsFormSubmit()); + formSubmit.setTitle(qmsGroup.getName()); + } + formSubmit.setGroupFinished(qmsGroup.getGroupFinished()); + formSubmit.setFinished(groupScope.getFinished()); + return R.ok(formSubmit); + } + + + /** + * 提交问卷 + * @param param + * @return + */ + @PostMapping("/submit") + @SysLog(module = SystemModule.QUESTION, title = "问卷提交记录", biz = BizType.UPDATE, inter = InterType.API) + public R updateById(@RequestBody @Valid QmsSubmitBo param){ + qmsFormSubmitService.submit(param); + return R.ok(); + } + + /** + * 删除问卷提交记录 + * @param id + * @return + */ + //@DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.QUESTION, title = "问卷提交记录", biz = BizType.DELETE, inter = InterType.API) + public R deleteById(@PathVariable("id") String id){ + boolean result = qmsFormSubmitService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/QmsCategory.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/QmsCategory.java new file mode 100644 index 0000000..d907512 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/QmsCategory.java @@ -0,0 +1,69 @@ +package com.qs.serve.modules.qms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-09-13 + */ +@Data +@TableName("qms_category") +public class QmsCategory implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 分类名称 */ + @NotBlank(message = "分类名称不能为空") + @Length(max = 30,message = "分类名称长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String name; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/QmsDraft.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/QmsDraft.java new file mode 100644 index 0000000..d8c8988 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/QmsDraft.java @@ -0,0 +1,81 @@ +package com.qs.serve.modules.qms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-09-13 + */ +@Data +@TableName("qms_draft") +public class QmsDraft implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 用户id */ + @Length(max = 32,message = "用户id长度不能超过32字") + private String userId; + + /** 发布内容id */ + private Long submitId; + + /** 发布标识 */ + private String pubFlag; + + /** 表单id */ + private Long groupId; + + private Integer version; + + /** 草稿内容 */ + private String context; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/QmsForm.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/QmsForm.java new file mode 100644 index 0000000..7c52e51 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/QmsForm.java @@ -0,0 +1,86 @@ +package com.qs.serve.modules.qms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-09-13 + */ +@Data +@TableName("qms_form") +public class QmsForm implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 标题 */ + @NotBlank(message = "标题不能为空") + @Length(max = 40,message = "标题长度不能超过40字") + @TableField(condition = SqlCondition.LIKE) + private String title; + + /** 子标题 */ + @Length(max = 255,message = "子标题长度不能超过255字") + private String subtitle; + + /** 分类id */ + private Long categoryId; + + /** 描述 */ + private String descr; + + /** 表单json */ + @NotBlank(message = "表单json不能为空") + private String formContext; + + /** 表单版本 */ + private Integer version; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/QmsFormSubmit.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/QmsFormSubmit.java new file mode 100644 index 0000000..e0499c5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/QmsFormSubmit.java @@ -0,0 +1,111 @@ +package com.qs.serve.modules.qms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-09-13 + */ +@Data +@TableName("qms_form_submit") +public class QmsFormSubmit implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 标题 */ + @NotBlank(message = "标题不能为空") + @Length(max = 40,message = "标题长度不能超过40字") + private String title; + + /** 子标题 */ + @Length(max = 255,message = "子标题长度不能超过255字") + private String subtitle; + + private String formTitle; + + /** 分类id */ + private Long categoryId; + + /** 表单id */ + private String groupId; + + private Long fromId; + + /** 用户id */ + @NotBlank(message = "用户id不能为空") + @Length(max = 32,message = "用户id长度不能超过32字") + private String userId; + + /** 用户名 */ + @Length(max = 20,message = "用户名长度不能超过20字") + private String userName; + + /** 表单json */ + @NotBlank(message = "表单json不能为空") + private String formContext; + + /** 表单版本 */ + private Integer version; + + /** 表单提交json */ + private String formSubmitContext; + + /** 表单提交时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime submitTime; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + @TableField(exist = false) + private Integer groupFinished; + + @TableField(exist = false) + private Integer finished; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/QmsGroup.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/QmsGroup.java new file mode 100644 index 0000000..fb8a5c0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/QmsGroup.java @@ -0,0 +1,148 @@ +package com.qs.serve.modules.qms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.modules.sys.entity.SysDept; +import com.qs.serve.modules.sys.entity.dto.SysUserSimpleVo; +import lombok.Data; +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; +import java.util.List; +/** + * 实体类 + * @author YenHex + * @since 2022-09-16 + */ +@Data +@TableName(value = "qms_group",autoResultMap = true) +public class QmsGroup implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private String id; + + /** 标题 */ + @NotBlank(message = "标题不能为空") + @Length(max = 20,message = "标题长度不能超过20字") + @TableField(condition = SqlCondition.LIKE) + private String name; + + /** 描述 */ + @Length(max = 50,message = "描述长度不能超过50字") + private String descr; + + /** 表单id */ + @NotNull(message = "表单id不能为空") + private Long formId; + + /** 表单json */ + @NotBlank(message = "表单json不能为空") + private String formContext; + + /** 发布状态 */ + @NotNull(message = "发布状态不能为空") + private Integer publishState; + + /** 发布时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime publishTime; + + /** + * (最少提交人数)标识是否完成 + */ + private Integer groupFinished; + + /** + * 最少提交人数 + */ + private Integer limitSubmit; + + /** 表单版本 */ + private Integer version; + + + /** 预通知标识:0->无通知;1->未通知;2->已通知 */ + private Integer preNotifyStatus; + + /** 预通知时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime preNotifyTime; + + /** 使用范围值 */ + //@TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + //private String[] scopeValue; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** 适用范围 0-所有人可见;1-人员可见;2-部门可见 */ + @TableField(exist = false) + private Integer scopeType; + + @TableField(exist = false) + private List userList; + + + @TableField(exist = false) + private List deptList; + + @TableField(exist = false) + private QmsForm formInfo; + + @TableField(exist = false) + private Integer finished; + + /** 纠正 管理页面查询参数 */ + @TableField(exist = false) + private String title; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/QmsGroupScope.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/QmsGroupScope.java new file mode 100644 index 0000000..b289a30 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/QmsGroupScope.java @@ -0,0 +1,72 @@ +package com.qs.serve.modules.qms.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-09-19 + */ +@Data +@TableName("qms_group_scope") +public class QmsGroupScope implements Serializable { + + private static final long serialVersionUID = 1L; + + /** */ + @TableId(type = IdType.AUTO) + private Long id; + + /** */ + private String groupId; + + /** 适用范围 0-所有人可见;1-人员可见;2-部门可见;3-部门的人员ID;4-所有的人员ID */ + private Integer scopeType; + + private Integer finished; + + /** 使用范围值 */ + @Length(max = 32,message = "使用范围值长度不能超过32字") + private String scopeValue; + private String userCode; + private String userName; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/bo/QmsDraftBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/bo/QmsDraftBo.java new file mode 100644 index 0000000..4441c3d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/bo/QmsDraftBo.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.qms.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/9/13 + */ +@Data +public class QmsDraftBo { + + /** 表单id */ + @NotNull + private Long groupId; + + /** 草稿内容 */ + @NotNull + private String context; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/bo/QmsFormBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/bo/QmsFormBo.java new file mode 100644 index 0000000..3e8ec0a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/bo/QmsFormBo.java @@ -0,0 +1,40 @@ +package com.qs.serve.modules.qms.entity.bo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; + +/** + * @author YenHex + * @since 2022/9/14 + */ +@Data +public class QmsFormBo { + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 标题 */ + @NotBlank(message = "标题不能为空") + @Length(max = 40,message = "标题长度不能超过40字") + private String title; + + /** 子标题 */ + @Length(max = 255,message = "子标题长度不能超过255字") + private String subtitle; + + /** 描述 */ + private String descr; + + /** 分类id */ + private Long categoryId; + + /** 表单json */ + @NotBlank(message = "表单json不能为空") + private String formContext; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/bo/QmsGroupBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/bo/QmsGroupBo.java new file mode 100644 index 0000000..3e59452 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/bo/QmsGroupBo.java @@ -0,0 +1,51 @@ +package com.qs.serve.modules.qms.entity.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * @author YenHex + * @since 2022/9/16 + */ +@Data +public class QmsGroupBo { + + private Long id; + + /** 标题 */ + @Length(max = 20,message = "标题长度不能超过20字") + private String name; + + @Length(max = 50,message = "描述长度不能超过50字") + private String descr; + + /** 表单id */ + @NotNull(message = "表单id不能为空") + private Long formId; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 适用范围 0-所有人可见;1-人员可见;2-部门可见 */ + private Integer scopeType; + + /** 使用范围值 */ + private String[] scopeValue; + + /** + * 最少提交人数,0表示不限制 + */ + private Integer limitSubmit; + + /** 预通知时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime preNotifyTime; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/bo/QmsHastenBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/bo/QmsHastenBo.java new file mode 100644 index 0000000..abd68e3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/bo/QmsHastenBo.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.qms.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/9/20 + */ +@Data +public class QmsHastenBo { + + /** + * 发送组id + */ + @NotNull + private Long groupId; + + /** + * 为空则发送给所用人 + */ + private String[] userIds; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/bo/QmsSubmitBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/bo/QmsSubmitBo.java new file mode 100644 index 0000000..e36fca9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/bo/QmsSubmitBo.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.qms.entity.bo; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +/** + * @author YenHex + * @since 2022/9/13 + */ +@Data +public class QmsSubmitBo { + + private Long id; + + /** 表单id */ + private String groupId; + + /** 表单版本 */ + private Integer version; + + /** 表单提交json */ + private String submitContext; + + /** 适用范围 0-所有人可见;1-人员可见;2-部门可见 */ + //private String scope; + + /** 适用范围目标ID数组 */ + //private String[] scopeTargetIds; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/so/QmsGroupSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/so/QmsGroupSo.java new file mode 100644 index 0000000..5c8ca3a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/so/QmsGroupSo.java @@ -0,0 +1,28 @@ +package com.qs.serve.modules.qms.entity.so; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; + +/** + * @author YenHex + * @since 2023/4/14 + */ +@Data +public class QmsGroupSo { + + private String title; + + Integer finished; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate queryStartDate; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate queryEndDate; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/vo/QmsDraftVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/vo/QmsDraftVo.java new file mode 100644 index 0000000..3b23806 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/entity/vo/QmsDraftVo.java @@ -0,0 +1,41 @@ +package com.qs.serve.modules.qms.entity.vo; + +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 java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 问卷草稿 实体类 + * @author YenHex + * @since 2022-09-13 + */ +@Data +@TableName("qms_draft") +public class QmsDraftVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 表单id */ + private Long formId; + + /** 草稿内容 */ + private String context; + + /** 版本 */ + private Integer version; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/mapper/QmsCategoryMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/mapper/QmsCategoryMapper.java new file mode 100644 index 0000000..55016c8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/mapper/QmsCategoryMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.qms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.qms.entity.QmsCategory; + +/** + * 问卷分类 Mapper + * @author YenHex + * @date 2022-09-13 + */ +public interface QmsCategoryMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/mapper/QmsDraftMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/mapper/QmsDraftMapper.java new file mode 100644 index 0000000..5acd78e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/mapper/QmsDraftMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.qms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.qms.entity.QmsDraft; + +/** + * 问卷草稿 Mapper + * @author YenHex + * @date 2022-09-13 + */ +public interface QmsDraftMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/mapper/QmsFormMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/mapper/QmsFormMapper.java new file mode 100644 index 0000000..b5fef49 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/mapper/QmsFormMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.qms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.qms.entity.QmsForm; + +/** + * 问卷表单 Mapper + * @author YenHex + * @date 2022-09-13 + */ +public interface QmsFormMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/mapper/QmsFormSubmitMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/mapper/QmsFormSubmitMapper.java new file mode 100644 index 0000000..c3f5e8e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/mapper/QmsFormSubmitMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.qms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.qms.entity.QmsFormSubmit; + +/** + * 问卷提交记录 Mapper + * @author YenHex + * @date 2022-09-13 + */ +public interface QmsFormSubmitMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/mapper/QmsGroupMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/mapper/QmsGroupMapper.java new file mode 100644 index 0000000..29b852d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/mapper/QmsGroupMapper.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.qms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.qms.entity.QmsGroup; +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 + * @date 2022-09-16 + */ +public interface QmsGroupMapper extends BaseMapper { + + /** + * 加载用户的 + * @param userId + * @param deptId + * @return + */ + List listByUserIdOrDeptId(@Param("userId")String userId,@Param("deptId")String deptId); + + @Update("update `qms_group` set pre_notify_time = null where id = #{id}") + void updateSetNotifyTimeNull(@Param("id")String id); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/mapper/QmsGroupScopeMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/mapper/QmsGroupScopeMapper.java new file mode 100644 index 0000000..9624544 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/mapper/QmsGroupScopeMapper.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.qms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.qms.entity.QmsGroupScope; +import com.qs.serve.modules.qms.entity.so.QmsGroupSo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Mapper + * @author YenHex + * @date 2022-09-19 + */ +public interface QmsGroupScopeMapper extends BaseMapper { + + /** + * 代办、已办列表 + * @param finished + * @param userId + * @return + */ + List listScope(@Param("query") QmsGroupSo finished, @Param("userId") String userId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/QmsCategoryService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/QmsCategoryService.java new file mode 100644 index 0000000..2f6b17f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/QmsCategoryService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.qms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.qms.entity.QmsCategory; + +/** + * 问卷分类 服务接口 + * @author YenHex + * @date 2022-09-13 + */ +public interface QmsCategoryService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/QmsDraftService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/QmsDraftService.java new file mode 100644 index 0000000..3cdce3f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/QmsDraftService.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.qms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.qms.entity.QmsDraft; + +/** + * 问卷草稿 服务接口 + * @author YenHex + * @date 2022-09-13 + */ +public interface QmsDraftService extends IService { + + QmsDraft getUserFormDraft(Long groupId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/QmsFormService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/QmsFormService.java new file mode 100644 index 0000000..ece4663 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/QmsFormService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.qms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.qms.entity.QmsForm; + +/** + * 问卷表单 服务接口 + * @author YenHex + * @date 2022-09-13 + */ +public interface QmsFormService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/QmsFormSubmitService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/QmsFormSubmitService.java new file mode 100644 index 0000000..09ce5e0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/QmsFormSubmitService.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.qms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.qms.entity.QmsFormSubmit; +import com.qs.serve.modules.qms.entity.bo.QmsSubmitBo; + +/** + * 问卷提交记录 服务接口 + * @author YenHex + * @date 2022-09-13 + */ +public interface QmsFormSubmitService extends IService { + + /** + * 提交表单 + * @param param + */ + void submit(QmsSubmitBo param); + + + + /** + * 统计完成的数量 + * @param groupId + * @return + */ + long countGroupFinished(String groupId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/QmsGroupScopeService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/QmsGroupScopeService.java new file mode 100644 index 0000000..cce63ea --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/QmsGroupScopeService.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.qms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.qms.entity.QmsGroupScope; +import com.qs.serve.modules.qms.entity.bo.QmsGroupBo; + +import java.util.List; + +/** + * 服务接口 + * @author YenHex + * @date 2022-09-19 + */ +public interface QmsGroupScopeService extends IService { + + + List listByGroupId(String groupId); + QmsGroupScope getByGroupAndUid(String groupId,String userId); + void removeByGroupId(String groupId); + void saveByBo(String groupId,QmsGroupBo groupBo); + + /** + * 发布 + * @param groupId + */ + void publish(String groupId); + + boolean isFinished(String groupId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/QmsGroupService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/QmsGroupService.java new file mode 100644 index 0000000..1975ea8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/QmsGroupService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.qms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.qms.entity.QmsGroup; + +/** + * 服务接口 + * @author YenHex + * @date 2022-09-16 + */ +public interface QmsGroupService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/impl/QmsCategoryServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/impl/QmsCategoryServiceImpl.java new file mode 100644 index 0000000..2250825 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/impl/QmsCategoryServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.qms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.qms.entity.QmsCategory; +import com.qs.serve.modules.qms.service.QmsCategoryService; +import com.qs.serve.modules.qms.mapper.QmsCategoryMapper; + +/** + * 问卷分类 服务实现类 + * @author YenHex + * @since 2022-09-13 + */ +@Slf4j +@Service +@AllArgsConstructor +public class QmsCategoryServiceImpl extends ServiceImpl implements QmsCategoryService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/impl/QmsDraftServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/impl/QmsDraftServiceImpl.java new file mode 100644 index 0000000..501b8e5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/impl/QmsDraftServiceImpl.java @@ -0,0 +1,32 @@ +package com.qs.serve.modules.qms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.qms.entity.QmsDraft; +import com.qs.serve.modules.qms.mapper.QmsDraftMapper; +import com.qs.serve.modules.qms.service.QmsDraftService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 问卷草稿 服务实现类 + * @author YenHex + * @since 2022-09-13 + */ +@Slf4j +@Service +@AllArgsConstructor +public class QmsDraftServiceImpl extends ServiceImpl implements QmsDraftService { + + @Override + public QmsDraft getUserFormDraft(Long groupId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(QmsDraft::getCreateBy, AuthContextUtils.getSysUserId()); + lqw.eq(QmsDraft::getGroupId,groupId); + lqw.eq(QmsDraft::getPubFlag,0); + return this.getOne(lqw,false); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/impl/QmsFormServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/impl/QmsFormServiceImpl.java new file mode 100644 index 0000000..80fef26 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/impl/QmsFormServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.qms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.qms.entity.QmsForm; +import com.qs.serve.modules.qms.service.QmsFormService; +import com.qs.serve.modules.qms.mapper.QmsFormMapper; + +/** + * 问卷表单 服务实现类 + * @author YenHex + * @since 2022-09-13 + */ +@Slf4j +@Service +@AllArgsConstructor +public class QmsFormServiceImpl extends ServiceImpl implements QmsFormService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/impl/QmsFormSubmitServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/impl/QmsFormSubmitServiceImpl.java new file mode 100644 index 0000000..14f4e07 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/impl/QmsFormSubmitServiceImpl.java @@ -0,0 +1,109 @@ +package com.qs.serve.modules.qms.service.impl; + +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.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.qms.entity.QmsForm; +import com.qs.serve.modules.qms.entity.QmsGroup; +import com.qs.serve.modules.qms.entity.QmsGroupScope; +import com.qs.serve.modules.qms.entity.bo.QmsSubmitBo; +import com.qs.serve.modules.qms.service.QmsFormService; +import com.qs.serve.modules.qms.service.QmsGroupScopeService; +import com.qs.serve.modules.qms.service.QmsGroupService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.wx.service.WxUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.qms.entity.QmsFormSubmit; +import com.qs.serve.modules.qms.service.QmsFormSubmitService; +import com.qs.serve.modules.qms.mapper.QmsFormSubmitMapper; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; + +/** + * 问卷提交记录 服务实现类 + * @author YenHex + * @since 2022-09-13 + */ +@Slf4j +@Service +@AllArgsConstructor +public class QmsFormSubmitServiceImpl extends ServiceImpl implements QmsFormSubmitService { + + private final QmsFormService qmsFormService; + private final QmsGroupService qmsGroupService; + private final QmsGroupScopeService qmsGroupScopeService; + private final WxUserService wxUserService; + private final SysUserMapper sysUserMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public void submit(QmsSubmitBo param) { + //WxUser wxUser = wxUserService.getCurrentWxUser(); + String userId = AuthContextUtils.getSysUserId(); + SysUser sysUser = sysUserMapper.selectById(userId); + QmsGroup qmsGroup = qmsGroupService.getById(param.getGroupId()); + if(qmsGroup.getPublishState().equals(0)){ + Assert.throwEx("问卷未发布,无法提交"); + } + if(qmsGroup.getGroupFinished().equals(1)){ + Assert.throwEx("问卷已结束"); + } + QmsForm form = qmsFormService.getById(qmsGroup.getFormId()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(QmsFormSubmit::getGroupId,param.getGroupId()); + lqw.eq(QmsFormSubmit::getUserId,userId); + //lqw.eq(QmsFormSubmit::getVersion,param.getVersion()); + QmsFormSubmit formSubmit = this.getOne(lqw,false); + if(formSubmit==null){ + formSubmit = new QmsFormSubmit(); + } + //表单关联 + formSubmit.setGroupId(param.getGroupId()); + formSubmit.setFromId(form.getId()); + formSubmit.setTitle(qmsGroup.getName()); + formSubmit.setFormTitle(form.getTitle()); + formSubmit.setSubtitle(form.getSubtitle()); + formSubmit.setCategoryId(form.getCategoryId()); + formSubmit.setFormContext(form.getFormContext()); + formSubmit.setVersion(form.getVersion()); + //参数关联 + formSubmit.setFormSubmitContext(param.getSubmitContext()); + //关联用户 + formSubmit.setUserId(userId); + formSubmit.setUserName(sysUser.getName()); + //时间 + formSubmit.setSubmitTime(LocalDateTime.now()); + if(formSubmit.getId()==null){ + this.save(formSubmit); + }else { + this.updateById(formSubmit); + } + //修改完成进度 + QmsGroupScope qmsGroupScope = qmsGroupScopeService.getByGroupAndUid(param.getGroupId(),userId); + qmsGroupScope.setFinished(1); + qmsGroupScopeService.updateById(qmsGroupScope); + long count = this.countGroupFinished(qmsGroup.getId()); + //判断是否人数限制 + boolean isFinished1 = qmsGroup.getLimitSubmit()>0 && qmsGroup.getLimitSubmit() <= count; + boolean isFinished2 = qmsGroupScopeService.isFinished(qmsGroup.getId()); + if(isFinished1||isFinished2){ + QmsGroup qgParam = new QmsGroup(); + qgParam.setId(qmsGroup.getId()); + qgParam.setGroupFinished(1); + qmsGroupService.updateById(qgParam); + } + } + + @Override + public long countGroupFinished(String groupId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(QmsFormSubmit::getGroupId,groupId); + return this.count(lqw); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/impl/QmsGroupScopeServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/impl/QmsGroupScopeServiceImpl.java new file mode 100644 index 0000000..94a99f7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/impl/QmsGroupScopeServiceImpl.java @@ -0,0 +1,166 @@ +package com.qs.serve.modules.qms.service.impl; + +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.CollectionUtil; +import com.qs.serve.common.util.IdUtil; +import com.qs.serve.modules.qms.entity.QmsGroup; +import com.qs.serve.modules.qms.entity.bo.QmsGroupBo; +import com.qs.serve.modules.qms.service.QmsGroupService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.wx.entity.WxUser; +import com.qs.serve.modules.wx.entity.dto.sms.WxSmsNewForm; +import com.qs.serve.modules.wx.service.WxPushService; +import com.qs.serve.modules.wx.service.WxUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.qms.entity.QmsGroupScope; +import com.qs.serve.modules.qms.service.QmsGroupScopeService; +import com.qs.serve.modules.qms.mapper.QmsGroupScopeMapper; + +import java.util.ArrayList; + +import java.util.List; + +/** + * 服务实现类 + * @author YenHex + * @since 2022-09-19 + */ +@Slf4j +@Service +@AllArgsConstructor +public class QmsGroupScopeServiceImpl extends ServiceImpl implements QmsGroupScopeService { + + SysUserMapper sysUserMapper; + QmsGroupService qmsGroupService; + WxUserService wxUserService; + WxPushService wxPushService; + + @Override + public List listByGroupId(String groupId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(QmsGroupScope::getGroupId,groupId); + return this.list(lqw); + } + + @Override + public QmsGroupScope getByGroupAndUid(String groupId, String userId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(QmsGroupScope::getGroupId,groupId); + lqw.eq(QmsGroupScope::getScopeValue,userId); + lqw.ne(QmsGroupScope::getScopeType,0); + lqw.ne(QmsGroupScope::getScopeType,2); + return this.getOne(lqw); + } + + @Override + public void removeByGroupId(String groupId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(QmsGroupScope::getGroupId,groupId); + this.remove(lqw); + } + + @Override + public void saveByBo(String groupId,QmsGroupBo groupBo) { + if((groupBo.getScopeType()==null||groupId==null)&& CollectionUtil.isNotEmpty(groupBo.getScopeValue())){ + Assert.throwEx("参数异常"); + } + List list = new ArrayList<>(); + if(groupBo.getScopeType().equals(0)){ + QmsGroupScope groupScope = new QmsGroupScope(); + groupScope.setGroupId(groupId); + groupScope.setScopeType(groupBo.getScopeType()); + groupScope.setFinished(0); + groupScope.setScopeValue("0"); + list.add(groupScope); + }else { + for (String scopeValue : groupBo.getScopeValue()) { + boolean isPersonType = groupBo.getScopeType().equals(1); + QmsGroupScope groupScope = new QmsGroupScope(); + groupScope.setGroupId(groupId); + groupScope.setScopeType(groupBo.getScopeType()); + //人员类型,临时修改为-1 表示未发布 + groupScope.setFinished(isPersonType?-1:0); + groupScope.setScopeValue(scopeValue); + list.add(groupScope); + } + } + this.saveBatch(list); + } + + @Override + public void publish(String groupId) { + QmsGroup qmsGroup = qmsGroupService.getById(groupId); + List qmsGroupScopeList = this.listByGroupId(groupId); + List list = new ArrayList<>(); + for (QmsGroupScope groupScope : qmsGroupScopeList) { + boolean isDeptType = groupScope.getScopeType().equals(2); + boolean isPersonType = groupScope.getScopeType().equals(1); + boolean isAllType = groupScope.getScopeType().equals(0); + if(isDeptType || isAllType){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + if(isDeptType){ + lqw.eq(SysUser::getDeptId,groupScope.getScopeValue()); + } + lqw.isNotNull(SysUser::getMobile); + lqw.select(SysUser::getId); + List sysUsers = sysUserMapper.selectList(lqw); + for (SysUser sysUser : sysUsers) { + QmsGroupScope groupScope2 = new QmsGroupScope(); + groupScope2.setGroupId(groupId); + groupScope2.setScopeType(isDeptType?3:4); + groupScope2.setFinished(0); + groupScope2.setScopeValue(sysUser.getId()); + groupScope2.setUserCode(sysUser.getCode()); + groupScope2.setUserName(sysUser.getName()); + list.add(groupScope2); + //查询用的的微信用户 + List wxUserList = wxUserService.getBySysUserId(sysUser.getId()); + //发送推送 + for (WxUser wxUser : wxUserList) { + WxSmsNewForm wxSmsNewForm = new WxSmsNewForm(); + wxSmsNewForm.setTitle(qmsGroup.getName()); + wxSmsNewForm.setUserName(wxUser.getEmpName()); + wxSmsNewForm.setBitTime(qmsGroup.getPublishTime().toString()); + wxSmsNewForm.setBizType("填写问卷通知"); + wxSmsNewForm.setRemark(qmsGroup.getRemark()); + wxPushService.sendWxMsg(wxUser,"填写问卷通知",wxSmsNewForm,true,groupId+""); + } + } + }else if (isPersonType){ + //修改状态 + groupScope.setFinished(0); + SysUser sysUser = sysUserMapper.selectById(groupScope.getScopeValue()); + groupScope.setUserName(sysUser.getName()); + groupScope.setUserCode(sysUser.getCode()); + this.updateById(groupScope); + List wxUserList = wxUserService.getBySysUserId(groupScope.getScopeValue()); + //发送推送 + for (WxUser wxUser : wxUserList) { + WxSmsNewForm wxSmsNewForm = new WxSmsNewForm(); + wxSmsNewForm.setTitle(qmsGroup.getName()); + wxSmsNewForm.setUserName(wxUser.getEmpName()); + wxSmsNewForm.setBitTime(qmsGroup.getPublishTime().toString()); + wxSmsNewForm.setBizType("填写问卷通知"); + wxSmsNewForm.setRemark(qmsGroup.getRemark()); + wxPushService.sendWxMsg(wxUser,"填写问卷通知",wxSmsNewForm,true,groupId+""); + } + } + } + this.saveBatch(list); + } + + @Override + public boolean isFinished(String groupId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(QmsGroupScope::getScopeType,1,3,4); + lqw.eq(QmsGroupScope::getGroupId,groupId); + lqw.eq(QmsGroupScope::getFinished,0); + return this.count(lqw)<1L; + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/impl/QmsGroupServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/impl/QmsGroupServiceImpl.java new file mode 100644 index 0000000..6e0c76d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/qms/service/impl/QmsGroupServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.qms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.qms.entity.QmsGroup; +import com.qs.serve.modules.qms.service.QmsGroupService; +import com.qs.serve.modules.qms.mapper.QmsGroupMapper; + +/** + * 服务实现类 + * @author YenHex + * @since 2022-09-16 + */ +@Slf4j +@Service +@AllArgsConstructor +public class QmsGroupServiceImpl extends ServiceImpl implements QmsGroupService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/controller/SalePlanController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/controller/SalePlanController.java new file mode 100644 index 0000000..361c4a4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/controller/SalePlanController.java @@ -0,0 +1,140 @@ +package com.qs.serve.modules.sale.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.sale.entity.SalePlanGoods; +import com.qs.serve.modules.sale.entity.bo.SalePlanBo; +import com.qs.serve.modules.sale.service.SalePlanGoodsService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.sale.entity.SalePlan; +import com.qs.serve.modules.sale.service.SalePlanService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 销售 销售计划 + * @author YenHex + * @since 2023-09-20 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sale/plan") +public class SalePlanController { + + private final SalePlanService salePlanService; + private final SalePlanGoodsService salePlanGoodsService; + + /** + * 列表 + * @param param + * @return + */ + //@GetMapping("/list") + public R> getList(SalePlan param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = salePlanService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(SalePlan param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + lqw.orderByDesc(SalePlan::getId); + List list = salePlanService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.SALE, title = "销售计划", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + SalePlan salePlan = salePlanService.getById(id); + List planGoodsList = salePlanGoodsService.listByPlanId(salePlan.getId()); + salePlan.setPlanGoodsList(planGoodsList); + return R.ok(salePlan); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.SALE, title = "销售计划", biz = BizType.UPDATE) + public R updateById(@RequestBody SalePlanBo param){ + if(param.getId()==null){ + return R.error(); + } + SalePlan salePlan = salePlanService.modify(param); + return R.ok(salePlan); + } + + /** + * 启用 + * @param id + * @return + */ + @PostMapping("/start/{id}") + @SysLog(module = SystemModule.SALE, title = "销售计划", biz = BizType.UPDATE) + public R start(@PathVariable Long id){ + SalePlan salePlan = new SalePlan(); + salePlan.setId(id); + salePlan.setPlanState(1); + salePlanService.updateById(salePlan); + return R.ok(salePlan); + } + + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.SALE, title = "销售计划", biz = BizType.INSERT) + public R save(@RequestBody @Valid SalePlanBo param){ + param.setId(null); + SalePlan salePlan = salePlanService.modify(param); + return R.ok(salePlan); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.SALE, title = "销售计划", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = salePlanService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/controller/my/SalePlanMyController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/controller/my/SalePlanMyController.java new file mode 100644 index 0000000..a145b7b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/controller/my/SalePlanMyController.java @@ -0,0 +1,47 @@ +package com.qs.serve.modules.sale.controller.my; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.sale.entity.SalePlan; +import com.qs.serve.modules.sale.service.SalePlanGoodsService; +import com.qs.serve.modules.sale.service.SalePlanService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 销售 销售计划 + * @author YenHex + * @since 2023-09-20 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("my/sale/plan") +public class SalePlanMyController { + + private final SalePlanService salePlanService; + private final SalePlanGoodsService salePlanGoodsService; + + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(SalePlan param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + lqw.eq(SalePlan::getUserId, AuthContextUtils.getSysUserId()); + PageUtil.startPage(); + List list = salePlanService.list(lqw); + return R.byPageHelperList(list); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/entity/SalePlan.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/entity/SalePlan.java new file mode 100644 index 0000000..0b3e3d7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/entity/SalePlan.java @@ -0,0 +1,141 @@ +package com.qs.serve.modules.sale.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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 2023-09-20 + */ +@Data +@TableName("sale_plan") +public class SalePlan implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 年 */ + @NotNull(message = "年份不能为空") + private Integer yearNum; + + /** 月 */ + @NotNull(message = "月份不能为空") + private Integer monthNum; + + /** 编码 */ + @NotBlank(message = "编码不能为空") + @Length(max = 50,message = "编码长度不能超过50字") + @TableField(condition = SqlCondition.LIKE) + private String planCode; + + /** 标题 */ + @NotBlank(message = "标题不能为空") + @Length(max = 255,message = "标题长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String planTitle; + + /** 状态 */ + @NotNull(message = "状态不能为空") + private Integer planState; + + /** 发布人id */ + @Length(max = 255,message = "发布人id长度不能超过255字") + private String userId; + + /** 发布人编码 */ + @Length(max = 255,message = "发布人编码长度不能超过255字") + private String userCode; + + /** 发布人 */ + @Length(max = 255,message = "发布人长度不能超过255字") + private String userName; + + /** 客户id */ + @Length(max = 255,message = "客户id长度不能超过255字") + private String supplierId; + + /** 客户编码 */ + @Length(max = 255,message = "客户编码长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String supplierCode; + + /** 客户名称 */ + @Length(max = 255,message = "客户名称长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String supplierName; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 销售计划商品list */ + @TableField(exist = false) + private List planGoodsList; + + public static SalePlan toNewObject(SalePlan source){ + SalePlan plan = new SalePlan(); + plan.setId(source.getId()); + plan.setPlanCode(source.getPlanCode()); + plan.setPlanTitle(source.getPlanTitle()); + plan.setPlanState(source.getPlanState()); + plan.setUserId(source.getUserId()); + plan.setUserCode(source.getUserCode()); + plan.setUserName(source.getUserName()); + plan.setSupplierId(source.getSupplierId()); + plan.setSupplierCode(source.getSupplierCode()); + plan.setSupplierName(source.getSupplierName()); + plan.setCreateTime(source.getCreateTime()); + plan.setUpdateTime(source.getUpdateTime()); + plan.setTenantId(source.getTenantId()); + plan.setDelFlag(source.getDelFlag()); + plan.setCreateBy(source.getCreateBy()); + plan.setUpdateBy(source.getUpdateBy()); + return plan; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/entity/SalePlanGoods.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/entity/SalePlanGoods.java new file mode 100644 index 0000000..1b27732 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/entity/SalePlanGoods.java @@ -0,0 +1,126 @@ +package com.qs.serve.modules.sale.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 2023-09-20 + */ +@Data +@TableName("sale_plan_goods") +public class SalePlanGoods implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 标题 */ + @NotNull(message = "标题不能为空") + private Long planId; + + /** 状态 */ + @NotNull(message = "状态不能为空") + private Integer planState; + + /** 目标类型(brand、category、series、spu、sku) */ + @NotBlank(message = "目标类型(brand、category、series、spu、sku)不能为空") + @Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字") + private String targetType; + + /** 目标id */ + @NotNull(message = "目标id不能为空") + private Long targetId; + + /** 目标编码 */ + @NotBlank(message = "目标编码不能为空") + @Length(max = 30,message = "目标编码长度不能超过30字") + private String targetCode; + + /** 目标名称 */ + @NotBlank(message = "目标名称不能为空") + @Length(max = 200,message = "目标名称长度不能超过200字") + private String targetName; + + /** 目标等级路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathIds; + + /** 目标等级路径 */ + @Length(max = 800,message = "目标等级路径长度不能超过800字") + private String targetLevelPathNames; + + /** 计划数量 */ + @NotNull(message = "计划数量不能为空") + private Integer qty; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + + public static SalePlanGoods toNewObject(SalePlanGoods source){ + SalePlanGoods planGoods = new SalePlanGoods(); + planGoods.setId(source.getId()); + planGoods.setPlanId(source.getPlanId()); + planGoods.setPlanState(source.getPlanState()); + planGoods.setTargetType(source.getTargetType()); + planGoods.setTargetId(source.getTargetId()); + planGoods.setTargetCode(source.getTargetCode()); + planGoods.setTargetName(source.getTargetName()); + planGoods.setTargetLevelPathIds(source.getTargetLevelPathIds()); + planGoods.setTargetLevelPathNames(source.getTargetLevelPathNames()); + planGoods.setQty(source.getQty()); + planGoods.setCreateTime(source.getCreateTime()); + planGoods.setCreateBy(source.getCreateBy()); + planGoods.setUpdateTime(source.getUpdateTime()); + planGoods.setUpdateBy(source.getUpdateBy()); + planGoods.setDelFlag(source.getDelFlag()); + planGoods.setTenantId(source.getTenantId()); + return planGoods; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/entity/bo/SalePlanBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/entity/bo/SalePlanBo.java new file mode 100644 index 0000000..024fb1c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/entity/bo/SalePlanBo.java @@ -0,0 +1,46 @@ +package com.qs.serve.modules.sale.entity.bo; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author YenHex + * @since 2023/9/20 + */ +@Data +public class SalePlanBo { + + /** id */ + private Long id; + + /** 年 */ + @NotNull(message = "年份不能为空") + private Integer yearNum; + + /** 月 */ + @NotNull(message = "月份不能为空") + private Integer monthNum; + + /** 标题 */ + @NotBlank(message = "标题不能为空") + private String planTitle; + + /** 客户id */ + private String supplierId; + + /** 目标类型(brand、category、series、spu、sku) */ + private String targetType; + + private List goodsItems; + + @Data + public static class SalePlanGoodsItem{ + private Long targetId; + private Integer qty; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/mapper/SalePlanGoodsMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/mapper/SalePlanGoodsMapper.java new file mode 100644 index 0000000..bdce9a7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/mapper/SalePlanGoodsMapper.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.sale.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sale.entity.SalePlanGoods; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; +import org.springframework.web.bind.annotation.DeleteMapping; + +/** + * 销售计划商品 Mapper + * @author YenHex + * @date 2023-09-20 + */ +public interface SalePlanGoodsMapper extends BaseMapper { + + @Update("update sale_plan_goods set del_flag = 1 where plan_id = #{planId}") + int deleteByPlanId(@Param("planId") Long planId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/mapper/SalePlanMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/mapper/SalePlanMapper.java new file mode 100644 index 0000000..784df9c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/mapper/SalePlanMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sale.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sale.entity.SalePlan; + +/** + * 销售计划 Mapper + * @author YenHex + * @date 2023-09-20 + */ +public interface SalePlanMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/service/SalePlanGoodsService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/service/SalePlanGoodsService.java new file mode 100644 index 0000000..8a5a001 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/service/SalePlanGoodsService.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.sale.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sale.entity.SalePlanGoods; + +import java.util.List; + +/** + * 销售计划商品 服务接口 + * @author YenHex + * @date 2023-09-20 + */ +public interface SalePlanGoodsService extends IService { + + List listByPlanId(Long painId); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/service/SalePlanService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/service/SalePlanService.java new file mode 100644 index 0000000..61a1f66 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/service/SalePlanService.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.sale.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sale.entity.SalePlan; +import com.qs.serve.modules.sale.entity.bo.SalePlanBo; + +/** + * 销售计划 服务接口 + * @author YenHex + * @date 2023-09-20 + */ +public interface SalePlanService extends IService { + + SalePlan modify(SalePlanBo param); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/service/impl/SalePlanGoodsServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/service/impl/SalePlanGoodsServiceImpl.java new file mode 100644 index 0000000..a55c02e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/service/impl/SalePlanGoodsServiceImpl.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.sale.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.sale.entity.SalePlanGoods; +import com.qs.serve.modules.sale.service.SalePlanGoodsService; +import com.qs.serve.modules.sale.mapper.SalePlanGoodsMapper; +import java.util.List; +/** + * 销售计划商品 服务实现类 + * @author YenHex + * @since 2023-09-20 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SalePlanGoodsServiceImpl extends ServiceImpl implements SalePlanGoodsService { + + @Override + public List listByPlanId(Long painId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SalePlanGoods::getPlanId,painId); + return super.list(lqw); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/service/impl/SalePlanServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/service/impl/SalePlanServiceImpl.java new file mode 100644 index 0000000..ab64e39 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sale/service/impl/SalePlanServiceImpl.java @@ -0,0 +1,136 @@ +package com.qs.serve.modules.sale.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.CodeGenUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.mapper.GoodsCategoryMapper; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.mapper.GoodsSpuMapper; +import com.qs.serve.modules.sale.entity.SalePlanGoods; +import com.qs.serve.modules.sale.entity.bo.SalePlanBo; +import com.qs.serve.modules.sale.mapper.SalePlanGoodsMapper; +import com.qs.serve.modules.sale.service.SalePlanGoodsService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.sale.entity.SalePlan; +import com.qs.serve.modules.sale.service.SalePlanService; +import com.qs.serve.modules.sale.mapper.SalePlanMapper; + +import java.util.ArrayList; +import java.util.List; + +/** + * 销售计划 服务实现类 + * @author YenHex + * @since 2023-09-20 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SalePlanServiceImpl extends ServiceImpl implements SalePlanService { + + private final SysUserMapper sysUserMapper; + private final BmsSupplierMapper supplierMapper; + private final SalePlanGoodsMapper salePlanGoodsMapper; + private final SalePlanGoodsService salePlanGoodsService; + + private final GoodsCategoryMapper goodsCategoryMapper; + private final GoodsSpuMapper goodsSpuMapper; + private final GoodsSkuMapper goodsSkuMapper; + + @Override + public SalePlan modify(SalePlanBo param) { + String userId = AuthContextUtils.getSysUserId(); + SysUser sysUser = sysUserMapper.selectById(userId); + BmsSupplier supplier = supplierMapper.selectById(param.getSupplierId()); + SalePlan salePlan = new SalePlan(); + salePlan.setYearNum(param.getYearNum()); + salePlan.setMonthNum(param.getMonthNum()); + salePlan.setPlanTitle(param.getPlanTitle()); + salePlan.setUserId(sysUser.getId()); + salePlan.setUserCode(sysUser.getCode()); + salePlan.setUserName(sysUser.getName()); + salePlan.setSupplierId(supplier.getId()); + salePlan.setSupplierCode(supplier.getCode()); + salePlan.setSupplierName(supplier.getName()); + if(param.getId()==null){ + salePlan.setPlanCode(CodeGenUtil.generate(CodeGenUtil.SourceKey.SalePlan)); + super.save(salePlan); + }else { + salePlan.setId(param.getId()); + super.updateById(salePlan); + //删除品类 + salePlanGoodsMapper.deleteByPlanId(salePlan.getId()); + } + List planGoodsList = this.buildPlanGoods(param.getGoodsItems(),param.getTargetType()); + for (SalePlanGoods planGoods : planGoodsList) { + planGoods.setPlanId(salePlan.getId()); + } + salePlanGoodsService.saveBatch(planGoodsList); + return salePlan; + } + + private List buildPlanGoods(List goodsItems,String goodsType){ + List salePlanGoods = new ArrayList<>(); + if(goodsType.equals(TbsGoodsType.spu.name())){ + for (SalePlanBo.SalePlanGoodsItem goodsBo : goodsItems) { + GoodsSpu goodsSpu = goodsSpuMapper.selectById(goodsBo.getTargetId()); + GoodsCategory category1 = goodsCategoryMapper.selectById(goodsSpu.getCategoryFirst()); + GoodsCategory category2 = goodsCategoryMapper.selectById(goodsSpu.getCategorySecond()); + GoodsCategory category3 = goodsCategoryMapper.selectById(goodsSpu.getCategoryThird()); + SalePlanGoods planGoods = new SalePlanGoods(); + planGoods.setTargetType(goodsType); + planGoods.setTargetId(goodsSpu.getId()); + planGoods.setTargetCode(goodsSpu.getSpuCode()); + planGoods.setTargetName(goodsSpu.getName()); + planGoods.setTargetLevelPathIds(category1.getId()+"_"+category2.getId()+"_"+category3.getId()+"_"+goodsSpu.getId()); + planGoods.setTargetLevelPathNames(category1.getName()+"_"+category2.getName()+"_"+category3.getName()+"_"+goodsSpu.getName()); + planGoods.setQty(goodsBo.getQty()); + salePlanGoods.add(planGoods); + } + }else if (goodsType.equals(TbsGoodsType.sku.name())){ + for (SalePlanBo.SalePlanGoodsItem goodsBo : goodsItems) { + GoodsSku sku = goodsSkuMapper.selectById(goodsBo.getTargetId()); + GoodsSpu goodsSpu = goodsSpuMapper.selectById(sku.getSpuId()); + GoodsCategory category1 = goodsCategoryMapper.selectById(goodsSpu.getCategoryFirst()); + GoodsCategory category2 = goodsCategoryMapper.selectById(goodsSpu.getCategorySecond()); + GoodsCategory category3 = goodsCategoryMapper.selectById(goodsSpu.getCategoryThird()); + SalePlanGoods planGoods = new SalePlanGoods(); + planGoods.setTargetType(goodsType); + planGoods.setTargetId(sku.getId()); + planGoods.setTargetCode(sku.getSkuCode()); + planGoods.setTargetName(sku.getSpecInfos()); + planGoods.setTargetLevelPathIds(category1.getId()+"_"+category2.getId()+"_"+category3.getId()+"_"+goodsSpu.getId()+"_"+sku.getId()); + planGoods.setTargetLevelPathNames(category1.getName()+"_"+category2.getName()+"_"+category3.getName()+"_"+goodsSpu.getName()+"_"+sku.getSpecInfos()); + planGoods.setQty(goodsBo.getQty()); + salePlanGoods.add(planGoods); + } + }else { + //品牌、品类、系列 + for (SalePlanBo.SalePlanGoodsItem goodsBo : goodsItems) { + GoodsCategory category = goodsCategoryMapper.selectById(goodsBo.getTargetId()); + SalePlanGoods planGoods = new SalePlanGoods(); + planGoods.setTargetType(goodsType); + planGoods.setTargetId(category.getId()); + planGoods.setTargetCode(category.getCode()); + planGoods.setTargetName(category.getName()); + planGoods.setTargetLevelPathIds(category.getLevelPath()); + planGoods.setTargetLevelPathNames(category.getLevelPathNames()); + planGoods.setQty(goodsBo.getQty()); + salePlanGoods.add(planGoods); + } + } + return salePlanGoods; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/SeeYonController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/SeeYonController.java new file mode 100644 index 0000000..32d95d0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/SeeYonController.java @@ -0,0 +1,235 @@ +package com.qs.serve.modules.seeyon; + +import com.qs.serve.common.config.properties.ProjectProperties; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.seeyon.entity.CtpAffair; +import com.qs.serve.modules.seeyon.entity.bo.CheckTargetDTO; +import com.qs.serve.modules.seeyon.entity.bo.SeeYonApproveQuery; +import com.qs.serve.modules.seeyon.entity.dto.TodoVoQuery; +import com.qs.serve.modules.seeyon.entity.vo.SeeYonApproveDataVo; +import com.qs.serve.modules.seeyon.entity.vo.TodoVO; +import com.qs.serve.modules.seeyon.service.CommonCheckService; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.service.TbsActivityService; +import com.qs.serve.modules.tbs.service.TbsCostApplyService; +import com.qs.serve.modules.tbs.service.TbsCostTodoService; +import com.qs.serve.modules.tzc.service.TzcPolicyService; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.service.VtbVerificationBatchService; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; +/** + * 致远通用服务 + * @author YenHex + * @since 2023/7/24 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("seeyon") +public class SeeYonController { + + private SeeYonRequestBaseService seeYonRequestBaseService; + private SeeYonRequestService seeYonRequestService; + private SysUserService sysUserService; + private TbsCostApplyService costApplyService; + private VtbVerificationService verificationService; + private TzcPolicyService policyService; + private ProjectProperties projectProperties; + private TbsActivityService activityService; + private CommonCheckService commonCheckService; + private TbsCostTodoService tbsCostTodoService; + private VtbVerificationBatchService vtbVerificationBatchService; + + /** + * 我的审批列表 + * @param query + * @return + */ + @GetMapping("listMyCheck") + public R> listMyCheck(SeeYonApproveQuery query){ + String userId = AuthContextUtils.getSysUserId(); + SysUser sysUser = sysUserService.getById(userId); + sysUser.checkSyAccount(); + query.setMemberId(sysUser.getSyUserId()); + return listAllCha(query); + } + + /** + * 我的审批退回列表page + * @return + */ + @GetMapping("pageMyCallback") + public R> pageCallbackList(TodoVoQuery todoVoQuery){ + return R.ok(commonCheckService.pageCallback(todoVoQuery)); + } + + /** + * 我的审批退回统计count + * @return + */ + @GetMapping("countMyCallback") + public R countCallback(){ + return R.ok(commonCheckService.countCallback(new TodoVoQuery())); + } + + /** + * 重定向到审批页面 + * @param targetDTO + * @param response + * @return + */ + @PostMapping("/redirectToCheckPage") + public R redirectToCheckPage(@RequestBody CheckTargetDTO targetDTO, HttpServletResponse response){ + String targetCode = targetDTO.getTargetCode(); + String targetId = targetDTO.getTargetId(); + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + sysUser.checkSyAccount(); + R> result = seeYonRequestService.commonListAffairs(targetId,null,targetCode); + String jumpUrl = "404"; + for (CtpAffair affair : result.getData()) { + //判断是否当前用户 + if(!affair.getMemberId().equals(sysUser.getSyUserId())){ + continue; + } + //流程未完成 + if(affair.getFinishedflag().equals(0)){ + if(affair.getState().equals(3)){ + //待审 + if(targetCode.equals(TbsSeeYonConst.CostCheckConf.Code())){ + VtbVerification object = verificationService.getById(targetId); + log.debug("核销待审 {}",object.getCostApplyId()); + jumpUrl = SyKeyLoginUtil.getPreCheckUrl4Verification(object.getCostApplyId(),object.getActivityId(),object.getId(),affair.getAffairId()); + }else { + jumpUrl = SyKeyLoginUtil.getPreCheckUrl(targetCode,targetId,affair.getAffairId()); + } + }else if (affair.getState().equals(4)){ + //已阅或已提交 + if(targetCode.equals(TbsSeeYonConst.CostCheckConf.Code())){ + VtbVerification object = verificationService.getById(targetId); + log.debug("核销已阅或已提交 {}",object.getCostApplyId()); + jumpUrl = SyKeyLoginUtil.getCheckedDetailUrl4Verification(object.getCostApplyId(),object.getActivityId(),object.getId()); + }else { + jumpUrl = SyKeyLoginUtil.getCheckedDetailUrl(targetCode,targetId); + } + }else if (affair.getState().equals(2)){ + //发起 + if(targetCode.equals(TbsSeeYonConst.CostCheckConf.Code())){ + VtbVerification object = verificationService.getById(targetId); + log.debug("核销发起 {}",object.getCostApplyId()); + jumpUrl = SyKeyLoginUtil.getMyDetailUrl(TbsSeeYonConst.CostApplyConf.Code(),object.getCostApplyId()+""); + }else { + jumpUrl = SyKeyLoginUtil.getMyDetailUrl(targetCode,targetId); + } + } + }else { + if (affair.getState().equals(2)){ + //发起 + if(targetCode.equals(TbsSeeYonConst.CostCheckConf.Code())){ + VtbVerification object = verificationService.getById(targetId); + log.debug("核销发起 {}",object.getCostApplyId()); + jumpUrl = SyKeyLoginUtil.getMyDetailUrl(TbsSeeYonConst.CostApplyConf.Code(),object.getCostApplyId()+""); + }else { + jumpUrl = SyKeyLoginUtil.getMyDetailUrl(targetCode,targetId); + } + }else { + //已阅或已提交 + if(targetCode.equals(TbsSeeYonConst.CostCheckConf.Code())){ + VtbVerification object = verificationService.getById(targetId); + log.debug("核销已阅或已提交 {}",object.getCostApplyId()); + jumpUrl = SyKeyLoginUtil.getCheckedDetailUrl4Verification(object.getCostApplyId(),object.getActivityId(),object.getId()); + }else { + jumpUrl = SyKeyLoginUtil.getCheckedDetailUrl(targetCode,targetId); + } + } + } + break; + } + String token = ServletUtils.getAuthToken(); + String fontUrl = "/#/jump?code=001&token="+token+"&jumpTo="+jumpUrl; + //String fontUrl = projectProperties.getWebUrl() + "/#/jump?code=001&token="+token+"&jumpTo="+jumpUrl; + log.warn("fontUrl:{}",fontUrl); + return R.ok(fontUrl,"ok"); + } + + /** + * 统计未完成 + * @param query + * @return + */ + @GetMapping("count") + public R getCount(SeeYonApproveQuery query){ + String userId = AuthContextUtils.getSysUserId(); + SysUser sysUser = sysUserService.getById(userId); + sysUser.checkSyAccount(); + query.setMemberId(sysUser.getSyUserId()); + query.setPageNum(1); + query.setPageSize(1); + long count = listAllCha(query).getData().getTotal(); + return R.ok(count); + } + + /** + * 所有审批 + * @param query + * @return + */ + @GetMapping("listCheckList") + public R> listAllCha(SeeYonApproveQuery query){ + String orderType = PageUtil.getOrderType(); + String orderProp = PageUtil.getOrderProp(); + if(orderProp==null||orderType==null){ + query.setOrderType(null); + query.setOrderProp(null); + } + R result = seeYonRequestBaseService.postBase(TbsSeeYonConst.API_LIST_CHECK,query,""); + if(result.getStatus()==200){ + PageVo pageVo = JsonUtil.jsonToPojo(result.getData(),PageVo.class); + List affairList = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(pageVo.getList())){ + for (Object o : pageVo.getList()) { + String json = JsonUtil.objectToJson(o); + SeeYonApproveDataVo obj = JsonUtil.jsonToPojo(json,SeeYonApproveDataVo.class); + if(obj!=null&&obj.getTemplateCode()!=null){ + //tempCode不参与业务。统一类型重新赋值,方便前端跳转 + String tempCode = obj.getTemplateCode().replace("_Test",""); + tempCode = tempCode.replace("contractApply","CostBill"); + obj.setTemplateCode(tempCode); + //设置实体类 + Object info = null; + if (tempCode.equals("CheckCost")) { + info = verificationService.getById(obj.getTargetId()); + }else if (tempCode.equals("CostBill")){ + info = costApplyService.getById(obj.getTargetId()); + }else if (tempCode.equals("ReleasePolicy")){ + info = policyService.getById(obj.getTargetId()); + }else if (tempCode.equals("CheckCostAgree")){ + info = tbsCostTodoService.getById(obj.getTargetId()); + }else if (tempCode.equals("BatchCheckCost")){ + info = vtbVerificationBatchService.getById(obj.getTargetId()); + } + obj.setValueInfo(info); + affairList.add(obj); + } + } + } + PageVo resultVo = PageVo.initNewList(pageVo,affairList); + return R.ok(resultVo); + } + return null; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/SyKeyLoginUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/SyKeyLoginUtil.java new file mode 100644 index 0000000..9469d4e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/SyKeyLoginUtil.java @@ -0,0 +1,146 @@ +package com.qs.serve.modules.seeyon; + +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import lombok.experimental.UtilityClass; + +/** + * @author YenHex + * @since 2023/6/12 + */ +@UtilityClass +public class SyKeyLoginUtil { + + /** + * 获取待审批详情 + * @param templateCode + * @param targetId + * @param affairId + * @return + */ + public static String getPreCheckUrl(String templateCode,String targetId,String affairId){ + if(templateCode.equals(TbsSeeYonConst.CostApplyConf.Code()) + ||templateCode.equals(TbsSeeYonConst.CostApplyContractConf.Code())){ + return "my-expense-application-approval-pending-detail?expenseApplicationId="+targetId+"&approvalId="+affairId; + } + + if(templateCode.equals(TbsSeeYonConst.CheckCostAgreeConf.Code())){ + return "my-expense-application-agreement-terms-approval-pending-detail?agreementTermsId="+targetId+"&approvalId="+affairId; + } + +// if(templateCode.equals(TbsSeeYonConst.CostCheckConf.Code())){ +// return "my-expense-application-activity-write-off-approval-pending-detail?" + +// "expenseApplicationId=382658" + //费用id +// "&writeOffId=1936474" + //核销id +// "&activityId=2277848" + //活动id +// "&approvalId="+affairId; +// } + if(templateCode.equals(TbsSeeYonConst.PolicyConf.Code())){ + return "my-policy-application-approval-pending-detail?policyApplicationId=" + targetId + + "&approvalId="+affairId; + } + return "404"; + } + + /** + * 获取核销待审批详情 + * @param costApplyId + * @param activityId + * @param verificationId + * @param affairId + * @return + */ + public static String getPreCheckUrl4Verification(Long costApplyId, + Long activityId, + Long verificationId, + String affairId){ + return "my-expense-application-activity-write-off-approval-pending-detail?" + + "expenseApplicationId=" + costApplyId+ //费用id + "&writeOffId=" + verificationId +//核销id + "&activityId=" + activityId +//活动id + "&approvalId="+affairId; + } + + + /** + * 获取已审批详情 + * @param templateCode + * @param targetId + * @return + */ + public static String getCheckedDetailUrl(String templateCode,String targetId){ + if(templateCode.equals(TbsSeeYonConst.CostApplyConf.Code())){ + return "my-expense-application-approval-approved-detail?expenseApplicationId="+targetId + +"&approvalId=0"; + } + if(templateCode.equals(TbsSeeYonConst.PolicyConf.Code())){ + return "my-channel-discount-policy-application-approval-pending-detail?channelDiscountPolicyApplicationId="+targetId+"&approvalId=0"; + } + return "404"; + } + + /** + * 获取核销待审批详情 + * @param costApplyId + * @param activityId + * @param verificationId + * @return + */ + public static String getCheckedDetailUrl4Verification(Long costApplyId, + Long activityId, + Long verificationId){ + return "my-expense-application-activity-write-off-approval-approved-detail?" + + "expenseApplicationId=" + costApplyId+ //费用id + "&writeOffId=" + verificationId +//核销id + "&activityId=" + activityId +//活动id + "&approvalId=0"; + } + + /** + * 获取个人申请详情 + * @param templateCode + * @param targetId + * @return + */ + public static String getMyDetailUrl(String templateCode,String targetId){ + if(templateCode.equals(TbsSeeYonConst.CostApplyConf.Code()) + || templateCode.equals(TbsSeeYonConst.BatchCostCheckConf.Code()) + ){ + return "my-expense-application-detail?id="+targetId; + } + if(templateCode.equals(TbsSeeYonConst.PolicyConf.Code())){ + return "my-policy-application-detail?id="+targetId; + } + return "404"; + } + + + /** + * 获取批量核销已审批详情 + * @param costApplyId + * @param batchId + * @param affairId + * @return + */ + public static String getCheckedUrl4BatchVerification(Long costApplyId, String affairId,Long batchId){ + return "my-expense-application-activity-batch-write-off-approval-approved-detail?" + + "expenseApplicationId=" + costApplyId + + "&approvalId=" + affairId + + "&batchWriteOffId=" + batchId; + + } + + /** + * 获取批量核销已审批详情 + * @param costApplyId + * @param batchId + * @param affairId + * @return + */ + public static String getUnCheckedUrl4BatchVerification(Long costApplyId, String affairId,Long batchId){ + return "my-expense-application-activity-batch-write-off-approval-pending-detail?" + + "expenseApplicationId=" + costApplyId + + "&approvalId=" + affairId + + "&batchWriteOffId=" + batchId; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/BaseCreateCallbackBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/BaseCreateCallbackBo.java new file mode 100644 index 0000000..eaf32ad --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/BaseCreateCallbackBo.java @@ -0,0 +1,15 @@ +package com.qs.serve.modules.seeyon.entity; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * @author YenHex + * @since 2023/1/28 + */ +@Data +@AllArgsConstructor +public class BaseCreateCallbackBo { + String formType; + String formId; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/BaseCreateProcessBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/BaseCreateProcessBo.java new file mode 100644 index 0000000..ed18141 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/BaseCreateProcessBo.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.seeyon.entity; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2022/11/22 + */ +@Data +public class BaseCreateProcessBo { + + private String templateCode; + + /** 致远登录名 */ + private String memberLoginName; + + /** 标题 */ + private String subjectTitle; + + /** 用于排除重复提交 */ + private String targetId; + + private String dataJson; + + /** 致远附件id列表 */ + private List attachments; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/CtpAffair.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/CtpAffair.java new file mode 100644 index 0000000..8028267 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/CtpAffair.java @@ -0,0 +1,54 @@ +package com.qs.serve.modules.seeyon.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * @author YenHex + * @since 2022/11/22 + */ +@Data +public class CtpAffair { + + private Integer finishedflag; + + /** 审批节点id */ + private String affairId; + + private String memberId; + + /** 1.代发;2已发(前端:发起);3待办(前端:待办);4已办(前端:同意);5取消;6回退;7取回;8竞争执行;15中止(前端:拒绝) */ + private Integer state; + + private String templateId; + + private String formRecordId; + + /** 费用申请id、核销id */ + private String costApplyId; + + /** 评论内容 */ + private String comment; + + /** 评论时间 */ + private Date commentTime; + + private String targetId; + + @TableField(exist = false) + private String param0; + @TableField(exist = false) + private String param1; + @TableField(exist = false) + private String param2; + @TableField(exist = false) + private String param3; + @TableField(exist = false) + private String param4; + @TableField(exist = false) + private String param5; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/CtpAffairCancel.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/CtpAffairCancel.java new file mode 100644 index 0000000..792b791 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/CtpAffairCancel.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.seeyon.entity; + +import lombok.Data; + +/** + * @author YenHex + * @since 2022/11/23 + */ +@Data +public class CtpAffairCancel { + + private String affairId; + + private String memberAccount; + + private String summaryId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/CtpAffairCommit.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/CtpAffairCommit.java new file mode 100644 index 0000000..a84fb1b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/CtpAffairCommit.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.seeyon.entity; + +import lombok.Data; + +/** + * @author YenHex + * @since 2022/11/23 + */ +@Data +public class CtpAffairCommit { + + /** 状态:0-否定,1-同意 */ + private Integer state; + + private String affairId; + private String fromRecordId; + + /** + * 如果是state=1 同意,传入member的登录账号 + */ + private String memberId; + + private String member; + + private String comment; + + private String formCode; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/CtpAffairQo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/CtpAffairQo.java new file mode 100644 index 0000000..819b769 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/CtpAffairQo.java @@ -0,0 +1,73 @@ +package com.qs.serve.modules.seeyon.entity; + +import lombok.Data; +import lombok.Setter; + +import java.util.List; + +/** + * @author YenHex + * @since 2022/11/22 + */ +@Data +public class CtpAffairQo { + + String memberId; + String formMainId; + + /** + * 状态:0-未完成与已完成(默认);1-未完成;2已完成;3-我发起的;其它-被拦截 + */ + Integer state; + + Integer pageNum; + Integer pageSize; + + String templateCode; + String templateId; + + + String applyUserCode; + String applyUserName; + String supplierName; + String supplierCode; + String title; + String rowState; + + String targetId; + /** + * v2 版本接口添加 + */ + String targetCode; + + String startTime; + String endTime; + + /** + * 标题 + */ + String chargeTheme; + + /** + * 记录编码 + */ + String recordCode; + + + /** + * 申请人名称 + */ + String userName; + + String dataKey; + + String queryBizRegion; + String querySaleRegion; + + /** + * 接口版本 + * v1.原始接口 + * v2.添加评论拼接 + */ + String ver; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/SyAffairStateResult.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/SyAffairStateResult.java new file mode 100644 index 0000000..c49428f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/SyAffairStateResult.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.seeyon.entity; + +import com.qs.serve.modules.seeyon.enums.SyAffairState; +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * @author YenHex + * @since 2023/6/12 + */ +@Data +@AllArgsConstructor +public class SyAffairStateResult { + + String affairId; + + String memberId; + + String targetId; + + SyAffairState state; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/XltApticlaim.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/XltApticlaim.java new file mode 100644 index 0000000..f9e0b8e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/XltApticlaim.java @@ -0,0 +1,93 @@ +package com.qs.serve.modules.seeyon.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Date; + +/** + * 核销 + * @author YenHex + * @since 2023/1/3 + */ +@Data +public class XltApticlaim implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 核销编号 */ + private String verificationCode; + + /** 费用编号(后缀表示详情子项) */ + @NotBlank(message = "费用编号(后缀表示详情子项)不能为空") + private String costCode; + + /** 费用编号 */ + @NotBlank(message = "费用编号不能为空") + private String costCode2; + + /** 客户编号 */ + @NotBlank(message = "客户编号不能为空") + private String cusCode; + + /** 金额 */ + private BigDecimal amount; + + /** 科目 */ + private String subjectCode; + + /** 费用科目描述 */ + private String subjectName; + + /** 申请类型 */ + private String expType; + + /** 单据类型 */ + private String applyType; + + /** 生效日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date effDate; + + /** 有无发票(0:没有 1:有) */ + private String invoiced; + + /** 新增时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; + + /** 处理状态(00:写入时初始状态 10: 处理成功 20: 处理失败) */ + private String status; + + /** 处理时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date dealTime; + + /** 主题 */ + private String topic; + + /** 税额 */ + @TableField(value = "apticlaim_amt_tax") + private BigDecimal apticlaimAmtTax; + + /** 是否增票 */ + @TableField(value = "apticlaim_vat") + private String apticlaimVat; + + /** 发票号 */ + @TableField(value = "apticlaim_invoice") + private String apticlaimInvoice; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/XltPaymentRecord.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/XltPaymentRecord.java new file mode 100644 index 0000000..db8f8a2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/XltPaymentRecord.java @@ -0,0 +1,99 @@ +package com.qs.serve.modules.seeyon.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author YenHex + * @since 2023/1/4 + */ +@Data +public class XltPaymentRecord implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 账套号 */ + @Length(max = 50,message = "账套号长度不能超过50字") + private String cAcc; + + /** 单据编号 */ + @Length(max = 50,message = "单据编号长度不能超过50字") + private String cFyCode; + + /** 单据名称 */ + @Length(max = 500,message = "单据名称长度不能超过500字") + private String cFyName; + + /** 制单日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime dDate; + + /** 开始日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime dFyDate1; + + /** 截止日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime dFyDate2; + + /** 费用编号 */ + @Length(max = 50,message = "费用编号长度不能超过50字") + private String cExpCode; + + /** 费用金额 */ + private Long nFyJe; + + /** 单据备注 */ + @Length(max = 500,message = "单据备注长度不能超过500字") + private String cFyMemo; + + /** 销路通录入人 */ + @Length(max = 50,message = "销路通录入人长度不能超过50字") + private String cXltUser; + + /** 销路通录入时间 */ + @Length(max = 50,message = "销路通录入时间长度不能超过50字") + private String dXltTime; + + /** BI同步执行人 */ + @Length(max = 50,message = "BI同步执行人长度不能超过50字") + private String cBIUser; + + /** BI同步执行时间 */ + @Length(max = 50,message = "BI同步执行时间长度不能超过50字") + private String dBITime; + + /** 客户编号 */ + @Length(max = 50,message = "客户编号长度不能超过50字") + private String cCusCode; + + /** 客户名称 */ + @Length(max = 200,message = "客户名称长度不能超过200字") + private String cCusName; + + /** 发票编号 */ + @Length(max = 50,message = "发票编号长度不能超过50字") + private String cSBVCode; + + /** */ + @Length(max = 1000,message = "发货单长度不能超过1000字") + private String cDLCode; + + /** 发票核销日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime dHxDate; + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/bo/CheckTargetDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/bo/CheckTargetDTO.java new file mode 100644 index 0000000..e1ad6d0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/bo/CheckTargetDTO.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.seeyon.entity.bo; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/8/7 + */ +@Data +public class CheckTargetDTO { + + private String targetId; + + private String targetCode; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/bo/CtpAddNodeDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/bo/CtpAddNodeDTO.java new file mode 100644 index 0000000..577b741 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/bo/CtpAddNodeDTO.java @@ -0,0 +1,49 @@ +package com.qs.serve.modules.seeyon.entity.bo; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/5/24 + */ +@Data +public class CtpAddNodeDTO { + + /** + * 添加审批节点的用户ID + */ + List userIds; + + /** + * 是否回退到我 + */ + Integer backToMe; + + /** + * 用户登陆账号 + */ + String userCode; + + /** + * 用户致远登陆账号 + */ + String userSyId; + + /** + * 模板编码 + */ + String templateCode; + + /** + * 目标id + */ + String targetId; + + /** + * 评论(2023年8月30日添加) + */ + String comment; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/bo/CtpAddNodeParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/bo/CtpAddNodeParam.java new file mode 100644 index 0000000..9923fdf --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/bo/CtpAddNodeParam.java @@ -0,0 +1,37 @@ +package com.qs.serve.modules.seeyon.entity.bo; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/5/24 + */ +@Data +public class CtpAddNodeParam { + + /** + * 添加审批节点的用户ID + */ + List userIds; + + /** + * 是否回退到我 + */ + Integer backToMe; + + /** + * 目标id + */ + String targetId; + + /** + * 评论(2023年8月30日添加) + */ + String comment; + + /** 附件id */ + private String[] attachIds; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/bo/SeeYonApproveQuery.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/bo/SeeYonApproveQuery.java new file mode 100644 index 0000000..1af4e70 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/bo/SeeYonApproveQuery.java @@ -0,0 +1,88 @@ +package com.qs.serve.modules.seeyon.entity.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.qs.serve.common.util.model.QsJsonLocalDateTimeDeserializer; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; + +/** + * @author YenHex + * @since 2023/7/24 + */ +@Data +public class SeeYonApproveQuery { + + /** + * OA的员工iD + */ + private String memberId; + + /** + * 模板编码 + */ + private String templateCode; + + + private String targetId; + + /** + * 标题 + */ + private String targetTitle; + + /** + * 编码 + */ + private String targetCode; + + /** + * 申请人信息 + */ + private String applyUserCode; + private String applyUserName; + + /** + * 客户 + */ + private String supplierCode; + private String supplierName; + + /** + * 区域 + */ + private String bizRegion; + private String saleRegion; + + /** + * 状态:3-待审批;4->已审 + */ + private Integer affairState; + + /** + * 申请开始时间 + */ + private String applyStartDate; + + private String applyEndDate; + + /** + * 评论结束时间 + */ + private String commitEndDate; + + private String commitStartDate; + + private Integer pageNum; + + private Integer pageSize; + + /** 排序字段(该接口,只支持 applyTime、commitTime) */ + private String orderProp; + + /** 排序类型:asc,desc */ + private String orderType; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/dto/CtpAffairPageSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/dto/CtpAffairPageSo.java new file mode 100644 index 0000000..b0a408e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/dto/CtpAffairPageSo.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.seeyon.entity.dto; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/4/4 + */ +@Data +public class CtpAffairPageSo { + /** + * 状态:0-未完成与已完成(默认);1-未完成;2已完成;3-我发起的;其它-被拦截 + */ + Integer state; + Integer pageNum; + Integer pageSize; + String queryBizRegion; + String querySaleRegion; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/dto/TodoVoQuery.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/dto/TodoVoQuery.java new file mode 100644 index 0000000..6a449a8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/dto/TodoVoQuery.java @@ -0,0 +1,33 @@ +package com.qs.serve.modules.seeyon.entity.dto; + +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; + +/** + * @author YenHex + * @since 2023/8/10 + */ +@Data +public class TodoVoQuery { + + private String title; + + private String targetType; + + private String targetCode; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate startDate; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate endDate; + + private String userId; + + private Integer startRow; + + private Integer pageSize; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/vo/SeeYonApproveDataVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/vo/SeeYonApproveDataVo.java new file mode 100644 index 0000000..7e5407b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/vo/SeeYonApproveDataVo.java @@ -0,0 +1,78 @@ +package com.qs.serve.modules.seeyon.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.qs.serve.common.util.model.QsJsonLocalDateTimeDeserializer; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author YenHex + * @since 2023/7/24 + */ +@Data +public class SeeYonApproveDataVo { + + private String templateCode; + + /** + * 标题 + */ + private String targetTitle; + + /** + * 编码 + */ + private String targetCode; + + private String targetId; + + /** + * 申请人信息 + */ + private String applyUserCode; + private String applyUserName; + + /** + * 客户 + */ + private String supplierCode; + private String supplierName; + + /** + * 区域 + */ + private String bizRegion; + private String saleRegion; + + /** + * 状态:0-待审批;1->已审 + */ + private String affairState; + private String affairId; + + private String memberId; + + /** + * 申请时间 + */ + @JsonDeserialize(using = QsJsonLocalDateTimeDeserializer.class) + private LocalDateTime applyTime; + + /** + * 评论时间 + */ + @JsonDeserialize(using = QsJsonLocalDateTimeDeserializer.class) + private LocalDateTime commitTime; + + /** + * 更新时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime updateTime; + + private Object valueInfo; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/vo/TodoVO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/vo/TodoVO.java new file mode 100644 index 0000000..88ccde4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/entity/vo/TodoVO.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.seeyon.entity.vo; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author YenHex + * @since 2023/8/8 + */ +@Data +public class TodoVO { + + /** 类型 */ + private String targetType; + + private String targetCode; + + private String targetId; + + /** 标题 */ + private String title; + + /** 时间 */ + private LocalDateTime time; + + /** 信息 */ + private Object targetInfo; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/enums/CheckTypeEnum.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/enums/CheckTypeEnum.java new file mode 100644 index 0000000..011f236 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/enums/CheckTypeEnum.java @@ -0,0 +1,24 @@ +package com.qs.serve.modules.seeyon.enums; + +/** + * @author YenHex + * @since 2023/8/10 + */ +public enum CheckTypeEnum { + + /** 费用申请 */ + CostBill, + + /** 政策 */ + ReleasePolicy, + + /** 核销 */ + CheckCost, + + /** 预算申请 */ + budgetAdjust, + + /** 预算修改 */ + budgetAdjust2 + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/enums/SyAffairState.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/enums/SyAffairState.java new file mode 100644 index 0000000..6815940 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/enums/SyAffairState.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.seeyon.enums; + +/** + * @author YenHex + * @since 2023/5/23 + */ +public enum SyAffairState { + + //next(审批中)、backed(回退)、finished(完成)、refuse(拒绝)、error(错误)、none(不存在数据) + next, + backed, + finished, + refuse, + error, + none; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/mapper/CommonCheckMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/mapper/CommonCheckMapper.java new file mode 100644 index 0000000..8ac073b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/mapper/CommonCheckMapper.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.seeyon.mapper; + +import com.qs.serve.modules.seeyon.entity.dto.TodoVoQuery; +import com.qs.serve.modules.seeyon.entity.vo.TodoVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/8/10 + */ +public interface CommonCheckMapper { + + /** + * 查询回退的审批列表 + * @param query + * @return + */ + List pageCallbackList(@Param("query") TodoVoQuery query); + + /** + * 合计回退的审批列表 + * @param query + * @return + */ + Long countCallback(@Param("query") TodoVoQuery query); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/CommonCheckService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/CommonCheckService.java new file mode 100644 index 0000000..e94c9a0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/CommonCheckService.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.seeyon.service; + +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.modules.seeyon.entity.dto.TodoVoQuery; +import com.qs.serve.modules.seeyon.entity.vo.TodoVO; +import java.util.List; + +/** + * 通用的审批服务 + * @author YenHex + * @since 2023/8/8 + */ +public interface CommonCheckService { + + PageVo pageCallback(TodoVoQuery query); + + Long countCallback(TodoVoQuery query); + + /** + * 退回列表 + * @return + */ + List listCallbackList(); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/SeeYonBaseService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/SeeYonBaseService.java new file mode 100644 index 0000000..084772b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/SeeYonBaseService.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.seeyon.service; + +import com.qs.serve.common.util.SpringUtils; +import com.qs.serve.modules.sys.mapper.SysUserMapper; + +/** + * @author YenHex + * @since 2023/5/23 + */ +public interface SeeYonBaseService { + + String getTemplateCode(); + + default SeeYonRequestService getRequestService(){ + return SpringUtils.getBean(SeeYonRequestService.class); + } + + default SysUserMapper getUserMapper(){ + return SpringUtils.getBean(SysUserMapper.class); + } + + default boolean testConnection(){ + return getRequestService().testConnection(); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/SeeYonOperationService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/SeeYonOperationService.java new file mode 100644 index 0000000..157a7b5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/SeeYonOperationService.java @@ -0,0 +1,499 @@ +package com.qs.serve.modules.seeyon.service; + +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.data.entity.DataAffairCommit; +import com.qs.serve.modules.data.mapper.DataAffairCommitMapper; +import com.qs.serve.modules.seeyon.entity.CtpAffair; +import com.qs.serve.modules.seeyon.entity.CtpAffairQo; +import com.qs.serve.modules.seeyon.entity.SyAffairStateResult; +import com.qs.serve.modules.seeyon.entity.bo.CtpAddNodeDTO; +import com.qs.serve.modules.seeyon.entity.bo.CtpAddNodeParam; +import com.qs.serve.modules.seeyon.enums.SyAffairState; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysPostUser; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysAttachMapper; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.entity.vo.CtpAffairVo; +import org.jetbrains.annotations.NotNull; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/5/23 + */ +public interface SeeYonOperationService extends SeeYonBaseService{ + + /** + * 流程完成 + */ + String SummeryState_Success = "finished"; + + /** + * 获取提交的目标ID(因前期未规范id,需要实现该接口进行补偿) + * @param affairCommit + * @return + */ + default String getTargetId(TbsAffairCommitBo affairCommit){ + return affairCommit.getTargetId(); + } + + /** + * 检查提交审批是否允许,并返回syFormId + * @param affairCommit + * @return + */ + String getSyFormIdByTargetInfo(TbsAffairCommitBo affairCommit); + + /** + * 审批退回 + * @param param + * @return + */ + Object doBacked(TbsAffairCommitBo param); + + /** + * 审批完成 + * @param param + * @return + */ + Object doFinished(TbsAffairCommitBo param); + + /** + * 审批拒绝 + * @param param + * @return + */ + Object doRefuse(TbsAffairCommitBo param); + + /** + * 审批中 + * @param param + * @return + */ + default Object doNext(TbsAffairCommitBo param){ + return null; + } + + default SysUserService getSysUserService(){ + return SpringUtils.getBean(SysUserService.class); + } + + /** + * 加签 + * @param param + * @return + */ + default R addNode(CtpAddNodeParam param){ + getRequestService().testConnection(); + //获取当前最新的affairId + List rList = this.pageAffair(param.getTargetId()).getData(); + String affairId = null; + if(rList.size()>0){ + CtpAffair affair = rList.get(0).getAffairInfo(); + if(affair!=null){ + affairId = affair.getAffairId(); + } + } + if(affairId==null&¶m.getAttachIds()!=null&¶m.getAttachIds().length>0){ + return R.error("附件上传失败(如果急需提交请移除附件)"); + } + + CtpAddNodeDTO addNodeDTO = new CtpAddNodeDTO(); + addNodeDTO.setBackToMe(param.getBackToMe()); + addNodeDTO.setTargetId(param.getTargetId()); + List selectUserIds = new ArrayList<>(); + SysUser loginUser = getUserMapper().selectById(AuthContextUtils.getSysUserId()); + for (String userId : param.getUserIds()) { + SysUser user = getUserMapper().selectById(userId); + if(loginUser.getSyUserId().equals(user.getSyUserId())){ + return R.error("不能选择相同的OA账号的员工"); + } + if(StringUtils.hasText(user.getSyUserId())&&!user.getSyUserId().equals("0")){ + selectUserIds.add(user.getSyUserId()); + } + } + if(selectUserIds.size()==0){ + Assert.throwEx("选中的用户未绑定OA凭证"); + } + addNodeDTO.setUserIds(selectUserIds); + SysUser sysUser = getUserMapper().selectById(AuthContextUtils.getSysUserId()); + addNodeDTO.setUserCode(sysUser.getAccount()); + addNodeDTO.setUserSyId(sysUser.getSyUserId()); + addNodeDTO.setTemplateCode(getTemplateCode()); + addNodeDTO.setComment(param.getComment()); + R result = getRequestService().addNode(addNodeDTO); + if(result.getData()!=null&&result.getData().toLowerCase(Locale.ROOT).contains("ok")){ + this.insertAddNodeLog(param, affairId, sysUser); + return R.ok(); + } + return R.error(result.getMsg()); + } + + /** + * 给加签添加审批日志 + * @param param + * @param affairId + * @param sysUser + */ + default void insertAddNodeLog(CtpAddNodeParam param, String affairId, SysUser sysUser) { + DataAffairCommitMapper dataAffairCommitMapper = SpringUtils.getBean(DataAffairCommitMapper.class); + DataAffairCommit dataAffairCommit = new DataAffairCommit(); + dataAffairCommit.setTargetCode(getTemplateCode()); + dataAffairCommit.setTargetId(param.getTargetId()); + + dataAffairCommit.setId(affairId); + dataAffairCommit.setCommentVal("加签:"+ param.getComment()); + dataAffairCommit.setReleaseFlag(0); + dataAffairCommit.setState(3); + dataAffairCommit.setUserId(sysUser.getId()); + dataAffairCommit.setUserCode(sysUser.getCode()); + dataAffairCommit.setUserName(sysUser.getName()); + dataAffairCommit.setResultData("addNode"); + dataAffairCommit.setAttachIds(param.getAttachIds()); + dataAffairCommitMapper.insert(dataAffairCommit); + } + + /** + * 查看详情也审批前置校验 + * 检查formId是否存在 + * @param targetId + * @return + */ + boolean checkSyFormIdIsNotNull(String targetId); + + + + default R> pageAffairV2(String targetId,String targetCode){ + boolean existFormId = checkSyFormIdIsNotNull(targetId); + if (!existFormId){ + return R.ok(new ArrayList<>()); + } + String templateCode = getTemplateCode(); + R> syResult = getRequestService().commonListAffairsV2(targetId,targetCode,null,templateCode); + List ctpAffairs = syResult.getData(); + if(ctpAffairs.size()>0){ + List result = getCtpAffairVos(ctpAffairs); + return R.ok(result); + } + return R.ok(new ArrayList<>()); + } + + + + /** + * 审批列表(用于详情页) + * @param targetId + * @return + */ + default R> pageAffair(String targetId){ + boolean existFormId = checkSyFormIdIsNotNull(targetId); + if (!existFormId){ + return R.ok(new ArrayList<>()); + } + String templateCode = getTemplateCode(); + R> syResult = getRequestService().commonListAffairs(targetId,null,templateCode); + List ctpAffairs = syResult.getData(); + if(ctpAffairs!=null&&ctpAffairs.size()>0){ + List result = getCtpAffairVos(ctpAffairs); + return R.ok(result); + } + return R.ok(new ArrayList<>()); + } + + /** + * 通用的审批列表封装 + * @param ctpAffairs + * @return + */ + @NotNull + default List getCtpAffairVos(List ctpAffairs) { + DataAffairCommitMapper dataAffairCommitMapper = SpringUtils.getBean(DataAffairCommitMapper.class); + SysAttachMapper sysAttachMapper = SpringUtils.getBean(SysAttachMapper.class); + List affairCommits = dataAffairCommitMapper.selectBatchIds(ctpAffairs.stream() + .map(CtpAffair::getAffairId).collect(Collectors.toList())); + List oaUserIds = ctpAffairs.stream().map(CtpAffair::getMemberId).collect(Collectors.toList()); + List userList = getSysUserService().listByOaMemberIds(oaUserIds); + SysPostUserService postUserService = SpringUtils.getBean(SysPostUserService.class); + List userIds = userList.stream().map(SysUser::getId).collect(Collectors.toList()); + List postUserList = postUserService.listByUserIds(userIds); + Map> postMap = postUserList.stream().collect(Collectors.groupingBy(SysPostUser::getUserId)); + List result = new ArrayList<>(); + for (CtpAffair ctpAffair : ctpAffairs) { + CtpAffairVo ctpAffairVo = new CtpAffairVo(); + ctpAffairVo.setAffairInfo(ctpAffair); + for (SysUser user : userList) { + if(ctpAffair.getMemberId().equals(user.getSyUserId())){ + ctpAffairVo.setUserInfo(user.toSysUserVo()); + List postUsers = postMap.get(user.getId()); + ctpAffairVo.setUserPostList(postUsers); + } + } + for (DataAffairCommit affairCommit : affairCommits) { + if(affairCommit.getId().equals(ctpAffair.getAffairId())){ + ctpAffairVo.setCommitInfo(affairCommit); + if(affairCommit.getAttachIds()!=null&&affairCommit.getAttachIds().length>0){ + ctpAffairVo.setAttachments( + sysAttachMapper.selectBatchIds( + Arrays.asList(affairCommit.getAttachIds()))); + } + } + } + result.add(ctpAffairVo); + } + return result; + } + + /** + * 个人审批列表(翻页) + * @param param + * @return + */ + default R> pageMemberAffair(CtpAffairQo param){ + if(param.getChargeTheme()!=null){ + param.setTitle(param.getChargeTheme()); + } + if(param.getUserName()!=null){ + param.setApplyUserName(param.getUserName()); + } + SysUser sysUser = getUserMapper().selectById(AuthContextUtils.getSysUserId()); + if(!StringUtils.hasText(sysUser.getSyUserId())||!StringUtils.hasText(sysUser.getSyAccount())){ + Assert.throwEx("当前账号未绑定致远用户信息"); + } + param.setQueryBizRegion(param.getQueryBizRegion()); + param.setQuerySaleRegion(param.getQuerySaleRegion()); + param.setMemberId(sysUser.getSyUserId()); + param.setTemplateCode(getTemplateCode()); + R> syResult = getRequestService().pageMemberAffair(param); + PageVo pageVo = syResult.getData(); + List ctpAffairs = pageVo.getList(); + if(ctpAffairs.size()>0){ + List oaUserIds = ctpAffairs.stream().map(CtpAffair::getMemberId).collect(Collectors.toList()); + List userList = getSysUserService().listByOaMemberIds(oaUserIds); + List result = new ArrayList<>(); + for (CtpAffair ctpAffair : ctpAffairs) { + CtpAffairVo ctpAffairVo = new CtpAffairVo(); + for (SysUser user : userList) { + if(ctpAffair.getMemberId().equals(user.getSyUserId())){ + ctpAffairVo.setUserInfo(user.toSysUserVo()); + } + } + ctpAffairVo.setAffairInfo(ctpAffair); + result.add(ctpAffairVo); + } + //二次封装vo,可重写 + this.pageMemberAffair4packageVo(result); + PageVo costApplyPageVo = PageVo.initNewList(pageVo,result); + return R.ok(costApplyPageVo); + } + return R.byEmptyList(); + } + + /** + * 个人结果二次封装VO + * @param result + */ + default void pageMemberAffair4packageVo(List result){} + + /** + * 获取审批中的统计 + * @return + */ + default R getUnfinished(){ + SysUser sysUser = getUserMapper().selectById(AuthContextUtils.getSysUserId()); + if(StringUtils.hasText(sysUser.getSyUserId())&&StringUtils.hasText(sysUser.getSyAccount())){ + return getRequestService().getUnfinishedAffair(getTemplateCode(), sysUser.getSyUserId()); + } + return R.ok(0L); + } + + + /** + * 获取流程状态,该方法尽量捕获异常,防止回调 + * @param targetId + * @return + */ + default String checkAffairSummery(String targetId){ + testConnection(); + R result = getRequestService().checkAffairSummery(getTemplateCode(),targetId); + if(result.getData()==null||result.getData().equals("next")){ + String templateCode = getTemplateCode(); + SyAffairStateResult stateResult =checkAffairState(targetId,templateCode); + return stateResult.getState().name(); + } + return result.getData(); + } + + /** + * 用于前置校验审批参数 + * @param affairCommit + * @return + */ + default boolean preCheckCommitAffair(TbsAffairCommitBo affairCommit){ + return true; + } + + /** + * 审批提交 + * @param affairCommit + * @return + */ + default R commitAffair(TbsAffairCommitBo affairCommit){ + getRequestService().testConnection(); + String syFormId = this.getSyFormIdByTargetInfo(affairCommit); + if(syFormId==null){ + Assert.throwEx("["+affairCommit.getTargetId()+"]__syFormId is null"); + } + boolean preCheckResult = this.preCheckCommitAffair(affairCommit); + if(!preCheckResult){ + return R.error("提交失败,参数异常"); + } + R result = getRequestService().commonCommit(affairCommit, getTemplateCode(),syFormId); + boolean isBackCommit = affairCommit.getState()==2; + if(result.getStatus()==200){ + // 判断是否含有下个节点 + //String flag = result.getData(); + //取消异步防止导致各种异常 + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + String flag = checkAffairSummery(affairCommit.getTargetId()); + //封装提交审批的记录 + this.buildAffairCommitData(affairCommit, flag); + + if(flag!=null && isBackCommit){ + this.doBacked(affairCommit); + return R.ok(); + } + + //审批中(next)、完成(finish)、拒绝(refused) + if("finished".equals(flag)){ + this.doFinished(affairCommit); + return R.ok(); + }else if ("refuse".equals(flag)||"backed".equals(flag)){ + this.doRefuse(affairCommit); + return R.ok(); + }else if ("next".equals(flag)){ + this.doNext(affairCommit); + doCommitBacked(getTargetId(affairCommit)); + return R.ok(); + } + }else if (result.getStatus()==500){ + return result; + } + return R.error("远程调用失败"); + } + + default void buildAffairCommitData(TbsAffairCommitBo affairCommit, String flag) { + //保存记录 + try { + // 判断是否含有下个节点 + DataAffairCommitMapper dataAffairCommitMapper = SpringUtils.getBean(DataAffairCommitMapper.class); + String userId = AuthContextUtils.getSysUserId(); + SysUser sysUser = getUserMapper().selectById(userId); + DataAffairCommit dataAffairCommit = new DataAffairCommit(); + dataAffairCommit.setTargetCode(getTemplateCode()); + dataAffairCommit.setTargetId(getTargetId(affairCommit)); + dataAffairCommit.setId(affairCommit.getAffairId()); + dataAffairCommit.setCommentVal(affairCommit.getComment()); + dataAffairCommit.setReleaseFlag(affairCommit.getReleaseFlag()); + dataAffairCommit.setState(affairCommit.getState()); + dataAffairCommit.setUserId(sysUser.getId()); + dataAffairCommit.setUserCode(sysUser.getCode()); + dataAffairCommit.setUserName(sysUser.getName()); + dataAffairCommit.setResultData(flag); + dataAffairCommit.setAttachIds(affairCommit.getAttachIds()); + dataAffairCommitMapper.insert(dataAffairCommit); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 用于回调OA的状态 + * @param targetId + */ + void doCommitBacked(String targetId); + + + + /** + * 补偿:审批中 + * @param targetId + * @return + */ + default Object compensateNext(String targetId){ + return null; + } + + /** + * 补偿:审批退回 + * @param targetId + * @return + */ + default Object compensateBacked(String targetId){ + return this.doBacked(new TbsAffairCommitBo(targetId)); + } + + /** + * 补偿:审批完成 + * @param targetId + * @return + */ + default Object compensateFinished(String targetId){ + return this.doFinished(new TbsAffairCommitBo(targetId)); + } + + /** + * 补偿:审批拒绝 + * @param targetId + * @return + */ + default Object compensateRefuse(String targetId){ + return this.doRefuse(new TbsAffairCommitBo(targetId)); + } + + /** + * 执行的主要方法 + * @param targetId + * @return + */ + default R runCompensate(String targetId){ + testConnection(); + String templateCode = getTemplateCode(); + SyAffairStateResult stateResult =checkAffairState(targetId,templateCode); + SyAffairState affairState = stateResult.getState(); + if(affairState.equals(SyAffairState.next)){ + return R.ok(compensateNext(targetId)); + }else if(affairState.equals(SyAffairState.backed)){ + return R.ok(compensateBacked(targetId)); + }else if(affairState.equals(SyAffairState.finished)){ + return R.ok(compensateFinished(targetId)); + }else if(affairState.equals(SyAffairState.refuse)){ + return R.ok(compensateRefuse(targetId)); + }else if(affairState.equals(SyAffairState.error)){ + return R.error("数据异常请联系管理员"); + }else{ + return R.error("OA无相关审批数据"); + } + } + + /** + * 发送请求获取状态 + * @param targetId + * @param templateCode + * @return + */ + default SyAffairStateResult checkAffairState(String targetId, String templateCode){ + return getRequestService().checkAffairState(targetId,templateCode); + }; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/SeeYonRequestService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/SeeYonRequestService.java new file mode 100644 index 0000000..c22b87a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/SeeYonRequestService.java @@ -0,0 +1,134 @@ +package com.qs.serve.modules.seeyon.service; + +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.oa.OaFormMainProcess; +import com.qs.serve.modules.seeyon.entity.*; +import com.qs.serve.modules.seeyon.entity.bo.CtpAddNodeDTO; +import com.qs.serve.modules.seeyon.enums.SyAffairState; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.entity.vo.CtpAffairVo; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +/** + * @author YenHex + * @since 2022/11/30 + */ +public interface SeeYonRequestService { + + R> commonListAffairs(String targetId,String syFormId,String templateCode); + + R> commonListAffairsV2(String targetId,String targetCode,String syFormId,String templateCode); + + R> commonListAffairsV3(String targetId,String targetCode,String syFormId,String templateCode); + + R commonCommit(TbsAffairCommitBo affairCommit,String formCode,String formRecordId); + + boolean testConnection(); + + /** + * 通用的创建流程接口 + * @param createProcessBo + * @return + */ + R baseCreateProcess(BaseCreateProcessBo createProcessBo); + + R newCreateProcess(OaFormMainProcess createProcessBo); + + /** + * 创建流程后回调,更新记录状态 + * @param createCallbackBo + * @return + */ + R createCallbackStatus(BaseCreateCallbackBo createCallbackBo); + + /** + * 获取表单id + * @param templateCode + * @param targetId + * @return + */ + R getFormId(String templateCode,Long targetId); + + + /** + * 提交 + * @param affairCommit + * @return + */ + R affairCommit(CtpAffairCommit affairCommit); + + + /** + * 取消流程 + * @param affairCancel + * @return + */ + R affairCancel(CtpAffairCancel affairCancel); + + + /** + * 获取用户表单 + * @param ctpAffairQo + * @return + */ + R> pageMemberAffair(CtpAffairQo ctpAffairQo); + + /** + * 校验OA节点状态 + * @param targetId + * @param templateCode + * @return + */ + SyAffairStateResult checkAffairState(String targetId,String templateCode); + + /** + * 检验协议类编码是否存在 + * @param templateCode + * @return + */ + Boolean checkConstCodeExist(String templateCode); + + + /** + * 校验OA节点状态(用于调整校验) + * @param key + * @param memberId + * @param templateCode + * @return + */ + SyAffairStateResult checkAffairState(String key,String memberId,String templateCode); + + /** + * 列表表单审批节点 + * @param ctpAffairQo + * @return + */ + R> listFormAffair(CtpAffairQo ctpAffairQo); + + R addNode(CtpAddNodeDTO addNodeDTO); + + /** + * 未完成审批统计 + * @param templateCode + * @param memberId + * @return + */ + R getUnfinishedAffair(String templateCode,String memberId); + + /** + * + * @param templateCode + * @param targetId + * @return + */ + R checkAffairSummery(String templateCode,String targetId); + + + R getTargetIdByFormId(String code,String formId); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/XiaoLuTonService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/XiaoLuTonService.java new file mode 100644 index 0000000..40c1d4c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/XiaoLuTonService.java @@ -0,0 +1,41 @@ +package com.qs.serve.modules.seeyon.service; + +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.seeyon.entity.XltApticlaim; +import com.qs.serve.modules.seeyon.entity.XltPaymentRecord; +import com.qs.serve.modules.tzc.entity.dto.PolicyItemDto; +import org.springframework.web.bind.annotation.RequestBody; + +/** + * @author YenHex + * @since 2023/1/3 + */ +public interface XiaoLuTonService { + + /** + * 保存核销记录 + * @param apticlaim + * @return + */ + R saveApticlaim(XltApticlaim apticlaim); + + + /** + * 保存支付记录 + * @param paymentRecord + * @return + */ + R savePaymentRecord(XltPaymentRecord paymentRecord); + + + /** + * 保存政策项 + * @param policyItemDto + * @return + */ + R savePolicyItem(PolicyItemDto policyItemDto); + + + R listPolicyPayments(); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/impl/CommonCheckServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/impl/CommonCheckServiceImpl.java new file mode 100644 index 0000000..be5d7ca --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/impl/CommonCheckServiceImpl.java @@ -0,0 +1,217 @@ +package com.qs.serve.modules.seeyon.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.seeyon.entity.dto.TodoVoQuery; +import com.qs.serve.modules.seeyon.entity.vo.TodoVO; +import com.qs.serve.modules.seeyon.enums.CheckTypeEnum; +import com.qs.serve.modules.seeyon.mapper.CommonCheckMapper; +import com.qs.serve.modules.seeyon.service.CommonCheckService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.entity.TbsBudgetChange; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.mapper.TbsBudgetChangeMapper; +import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper; +import com.qs.serve.modules.tzc.common.TzcPolicyStatus; +import com.qs.serve.modules.tzc.entity.TzcPolicy; +import com.qs.serve.modules.tzc.mapper.TzcPolicyMapper; +import com.qs.serve.modules.tzc.service.TzcPolicyService; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/8/8 + */ +@Slf4j +@Service +@AllArgsConstructor +public class CommonCheckServiceImpl implements CommonCheckService { + + private final SysUserService sysUserService; + private final TbsCostApplyMapper costApplyMapper; + private final TzcPolicyService tzcPolicyService; + private final TzcPolicyMapper tzcPolicyMapper; + private final VtbVerificationMapper verificationMapper; + private final TbsBudgetMapper tbsBudgetMapper; + private final TbsBudgetChangeMapper tbsBudgetChangeMapper; + private final CommonCheckMapper commonCheckMapper; + + @Override + public PageVo pageCallback(TodoVoQuery query) { + int pageSize = PageUtil.getPageSize(); + int startRow = PageUtil.getStartRow(); + query.setUserId(AuthContextUtils.getSysUserId()); + query.setPageSize(pageSize); + query.setStartRow(startRow); + PageVo pageVo = new PageVo<>(); + Long count = commonCheckMapper.countCallback(query); + List todoVOList; + if(count>0){ + todoVOList = commonCheckMapper.pageCallbackList(query); + this.initTodoTargetInfo(todoVOList); + }else { + todoVOList = new ArrayList<>(); + } + + pageVo.initPageByTotal(count); + pageVo.setList(todoVOList); + return pageVo; + } + + @Override + public Long countCallback(TodoVoQuery query) { +// int pageSize = PageUtil.getPageSize(); +// int startRow = PageUtil.getStartRow(); + query.setUserId(AuthContextUtils.getSysUserId()); +// query.setPageSize(pageSize); +// query.setStartRow(startRow); + return commonCheckMapper.countCallback(query); + } + + /** + * 初始化TargetInfo + * @param todoVOList + */ + private void initTodoTargetInfo(List todoVOList) { + Map> todoMap = todoVOList.stream().collect(Collectors.groupingBy(TodoVO::getTargetType)); + + List costToDo = todoMap.get(CheckTypeEnum.CostBill.name()); + List policyToDo = todoMap.get(CheckTypeEnum.ReleasePolicy.name()); + List verificationToDo = todoMap.get(CheckTypeEnum.CheckCost.name()); + List budgetToDo = todoMap.get(CheckTypeEnum.budgetAdjust.name()); + List budgetChangeToDo = todoMap.get(CheckTypeEnum.budgetAdjust2.name()); + + if(CollUtil.isNotEmpty(costToDo)){ + List ids = getTodoIds(costToDo); + List dataList = costApplyMapper.selectBatchIds(ids); + for (TodoVO todoVO : costToDo) { + for (TbsCostApply item : dataList) { + if(item.getId().toString().equals(todoVO.getTargetId())){ + todoVO.setTargetInfo(item); + break; + } + } + } + } + + if(CollUtil.isNotEmpty(policyToDo)){ + List ids = getTodoIds(policyToDo); + List dataList = tzcPolicyMapper.selectBatchIds(ids); + for (TodoVO todoVO : policyToDo) { + for (TzcPolicy item : dataList) { + if(item.getId().toString().equals(todoVO.getTargetId())){ + todoVO.setTargetInfo(item); + break; + } + } + } + } + + if(CollUtil.isNotEmpty(verificationToDo)){ + List ids = getTodoIds(verificationToDo); + List dataList = verificationMapper.selectBatchIds(ids); + for (TodoVO todoVO : verificationToDo) { + for (VtbVerification item : dataList) { + if(item.getId().toString().equals(todoVO.getTargetId())){ + todoVO.setTargetInfo(item); + break; + } + } + } + } + + if(CollUtil.isNotEmpty(budgetToDo)){ + List ids = getTodoIds(budgetToDo); + List dataList = tbsBudgetMapper.selectBatchIds(ids); + for (TodoVO todoVO : budgetToDo) { + for (TbsBudget item : dataList) { + if(item.getId().toString().equals(todoVO.getTargetId())){ + todoVO.setTargetInfo(item); + break; + } + } + } + } + + if(CollUtil.isNotEmpty(budgetChangeToDo)){ + List ids = getTodoIds(budgetChangeToDo); + List dataList = tbsBudgetChangeMapper.selectBatchIds(ids); + for (TodoVO todoVO : budgetChangeToDo) { + for (TbsBudgetChange item : dataList) { + if(item.getId().toString().equals(todoVO.getTargetId())){ + todoVO.setTargetInfo(item); + break; + } + } + } + } + } + + @Override + public List listCallbackList() { + String userId = AuthContextUtils.getSysUserId(); + //费用 + LambdaQueryWrapper costLqw = new LambdaQueryWrapper<>(); + costLqw.eq(TbsCostApply::getUserId,userId); + costLqw.eq(TbsCostApply::getChargeState, TbsCostApplyState.State_4_refused.getCode()); + List costApplyList = costApplyMapper.selectList(costLqw); + List todoCostList = costApplyList.stream().map(obj -> { + TodoVO todo = new TodoVO(); + todo.setTargetType("CostBill"); + todo.setTargetId(obj.getId()+""); + todo.setTargetCode(obj.getCode()); + todo.setTitle(obj.getChargeTheme()); + todo.setTime(obj.getSubmitTime()); + todo.setTargetInfo(obj); + return todo; + }).collect(Collectors.toList()); + //政策 + LambdaQueryWrapper policyLqw = new LambdaQueryWrapper<>(); + policyLqw.eq(TzcPolicy::getUserId, userId); + policyLqw.eq(TzcPolicy::getPolicyStatus, TzcPolicyStatus.Status_4_RollBack); + List policyList = tzcPolicyService.list(policyLqw); + List todoPolicyList = policyList.stream().map(obj -> { + TodoVO todo = new TodoVO(); + todo.setTargetType("ReleasePolicy"); + todo.setTargetId(obj.getId()+""); + todo.setTargetCode(obj.getPolicyCode()); + todo.setTitle(obj.getTitle()); + todo.setTime(obj.getSubmitTime()); + todo.setTargetInfo(obj); + return todo; + }).collect(Collectors.toList()); + + List result = new ArrayList<>(); + result.addAll(todoCostList); + result.addAll(todoPolicyList); + return result; + } + + /** + * 提取todo列表的targetId + * @param todoList + * @return + */ + private List getTodoIds(List todoList){ + if(todoList!=null&&todoList.size()>0){ + return todoList.stream().map(TodoVO::getTargetId).collect(Collectors.toList()); + } + return null; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/impl/SeeYonRequestBaseService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/impl/SeeYonRequestBaseService.java new file mode 100644 index 0000000..64fde84 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/impl/SeeYonRequestBaseService.java @@ -0,0 +1,62 @@ +package com.qs.serve.modules.seeyon.service.impl; + +import cn.hutool.crypto.SecureUtil; +import com.qs.serve.common.config.properties.SeeYonProperties; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.HttpUtil; +import com.qs.serve.common.util.JsonUtil; +import com.qs.serve.modules.sys.service.SysUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.HashMap; + +/** + * @author YenHex + * @since 2023/1/4 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SeeYonRequestBaseService { + + + private SeeYonProperties seeYonProperties; + private SysUserService sysUserService; + + public R getBase(String url2, String title){ + String token = SecureUtil.md5(LocalDate.now().getDayOfYear()+"000"+LocalDate.now().getYear()); + HashMap headers = new HashMap<>(); + headers.put("token",token); + String url = getBaseUrl(); + R result = HttpUtil.doGetResult(url+url2,headers); + if(result.getStatus()!=200){ + log.error("致远服务失败[{},{}] url2:{}",title,result.getMsg(),url2); + } + return result; + } + + public R postBase(String url2,Object param,String title){ + String token = SecureUtil.md5(LocalDate.now().getDayOfYear()+"000"+LocalDate.now().getYear()); + HashMap headers = new HashMap<>(); + headers.put("token",token); + String url = getBaseUrl(); + R result = HttpUtil.doPostResult(url + url2, JsonUtil.objectToJson(param),headers); + if(result.getStatus()!=200){ + log.error("致远服务失败[{},{}]\nParam:{}",title,result.getMsg(),JsonUtil.objectToJson(param)); + } + log.info("致远服务返回R:{}",JsonUtil.objectToJson(result)); + return result; + } + + public String getBaseUrl(){ + if(!seeYonProperties.getEnable()){ + Assert.throwEx("远程服务未开启"); + } + return seeYonProperties.getUrl(); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/impl/SeeYonRequestServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/impl/SeeYonRequestServiceImpl.java new file mode 100644 index 0000000..f35be08 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/impl/SeeYonRequestServiceImpl.java @@ -0,0 +1,302 @@ +package com.qs.serve.modules.seeyon.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.oa.OaFormMainProcess; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.seeyon.entity.*; +import com.qs.serve.modules.seeyon.entity.bo.CtpAddNodeDTO; +import com.qs.serve.modules.seeyon.enums.SyAffairState; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +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 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SeeYonRequestServiceImpl implements SeeYonRequestService { + + private SeeYonRequestBaseService seeYonRequestBaseService; + private SysUserService sysUserService; + + @Nullable + @Override + public R> commonListAffairs(String targetId,String syFormId, String templateCode) { + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + if(!StringUtils.hasText(sysUser.getSyUserId())||!StringUtils.hasText(sysUser.getSyAccount())){ + return R.error("当前账号未绑定致远用户信息"); + } + CtpAffairQo param = new CtpAffairQo(); + param.setTargetId(targetId); + param.setFormMainId(syFormId); + param.setTemplateCode(templateCode); + return this.listFormAffair(param); + } + + @Override + public R> commonListAffairsV2(String targetId,String targetCode, String syFormId, String templateCode) { + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + if(!StringUtils.hasText(sysUser.getSyUserId())||!StringUtils.hasText(sysUser.getSyAccount())){ + return R.error("当前账号未绑定致远用户信息"); + } + CtpAffairQo param = new CtpAffairQo(); + param.setTargetId(targetId); + param.setFormMainId(syFormId); + param.setTargetCode(targetCode); + param.setVer("v2"); + param.setTemplateCode(templateCode); + return this.listFormAffair(param); + } + + @Override + public R> commonListAffairsV3(String targetId, String targetCode, String syFormId, String templateCode) { + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + if(!StringUtils.hasText(sysUser.getSyUserId())||!StringUtils.hasText(sysUser.getSyAccount())){ + return R.error("当前账号未绑定致远用户信息"); + } + CtpAffairQo param = new CtpAffairQo(); + param.setTargetId(targetId); + param.setFormMainId(syFormId); + param.setTargetCode(targetCode); + param.setVer("v3"); + param.setTemplateCode(templateCode); + return this.listFormAffair(param); + } + + @Override + public R commonCommit(TbsAffairCommitBo affairCommit,String formCode,String formRecordId) { + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + sysUser.checkSyAccount(); + CtpAffairCommit param = new CtpAffairCommit(); + if(formCode==null){ + Assert.throwEx("系统异常,请联系管理员"); + } + param.setFormCode(formCode); + param.setFromRecordId(formRecordId); + param.setState(affairCommit.getState()); + param.setAffairId(affairCommit.getAffairId()); + param.setComment(affairCommit.getComment()); + param.setMemberId(sysUser.getSyUserId()); + param.setMember(sysUser.getSyAccount()); + R result = this.affairCommit(param); + return result; + } + + @Override + public boolean testConnection() { + R result = seeYonRequestBaseService.getBase(TbsSeeYonConst.API_TEST,"测试连接"); + if(result!=null&&result.getStatus().equals(200)){ + return true; + }else { + return false; + } + } + + @Override + public R baseCreateProcess(BaseCreateProcessBo createProcessBo) { + String title = "【创建流程】"; + log.warn("创建审批{}流程{}",createProcessBo.getTemplateCode(),JsonUtil.objectToJson(createProcessBo)); + R result = seeYonRequestBaseService.postBase(TbsSeeYonConst.API_PROCESS_CREATE,createProcessBo,title); + return result; + } + + @Override + public R newCreateProcess(OaFormMainProcess createProcessBo) { + String title = "【创建流程2】"; + return seeYonRequestBaseService.postBase(TbsSeeYonConst.API_PROCESS_CREATE_NEW,createProcessBo,title); + } + + @Override + public R createCallbackStatus(BaseCreateCallbackBo createCallbackBo) { + String title = "【创建流程后回调】"; + return seeYonRequestBaseService.postBase(TbsSeeYonConst.API_PROCESS_CREATE_CALLBACK,createCallbackBo,title); + } + + @Override + public R getFormId(String templateCode, Long targetId) { + String title = "【获取表单ID】"; + String url2 = TbsSeeYonConst.API_GET_FORM_ID+"?templateCode="+templateCode+"&targetId="+targetId; + return seeYonRequestBaseService.getBase(url2,title); + } + + + @Override + public R affairCommit(CtpAffairCommit affairCommit) { + String title = "【审批流程】"; + return seeYonRequestBaseService.postBase(TbsSeeYonConst.API_PROCESS_COMMIT,affairCommit,title); + } + + @Override + public R affairCancel(CtpAffairCancel affairCancel) { + String title = "【取消流程】"; + return seeYonRequestBaseService.postBase(TbsSeeYonConst.API_PROCESS_CANCEL,affairCancel,title); + } + + @Override + public R> pageMemberAffair(CtpAffairQo ctpAffairQo) { + String title = "【用户审批流程】"; + R result = seeYonRequestBaseService.postBase(TbsSeeYonConst.API_PAGE_AFFAIR,ctpAffairQo,title); + if(result.getStatus()==200){ + PageVo pageVo = JsonUtil.jsonToPojo(result.getData(),PageVo.class); + List affairList = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(pageVo.getList())){ + for (Object o : pageVo.getList()) { + String json = JsonUtil.objectToJson(o); + CtpAffair obj = JsonUtil.jsonToPojo(json,CtpAffair.class); + affairList.add(obj); + } + } + PageVo resultVo = PageVo.initNewList(pageVo,affairList); + return R.ok(resultVo); + } + return null; + } + + @Override + public SyAffairStateResult checkAffairState(String targetId,String templateCode) { + String title = "【校验OA节点状态】"; + CtpAffairQo param = new CtpAffairQo(); + param.setTargetId(targetId); + param.setTemplateCode(templateCode); + 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节点状态】"; + CtpAffairQo param = new CtpAffairQo(); + param.setTemplateCode(templateCode); + param.setMemberId(memberId); + param.setDataKey(key); + return getSyAffairStateResult(title, param); + } + + @NotNull + private SyAffairStateResult getSyAffairStateResult(String title, CtpAffairQo param) { + R result = seeYonRequestBaseService.postBase(TbsSeeYonConst.API_CHECK_AFFAIR,param,title); + if(result.getStatus()==200){ + String resultString = result.getData(); + JSONObject jsonObject = JSONObject.parseObject(resultString); + String resultName = jsonObject.getString("result"); + String resultMemberId = jsonObject.getString("memberId"); + String resultTargetId = jsonObject.getString("targetId"); + String resultAffairId = jsonObject.getString("affairId"); + for (SyAffairState value : SyAffairState.values()) { + if (value.name().equals(resultName)){ + return new SyAffairStateResult(resultAffairId,resultMemberId,resultTargetId,value); + } + } + } + log.error(title+" param==>{} \n ==> {}", JsonUtil.objectToJson(param),JsonUtil.objectToJson(result)); + return new SyAffairStateResult(null,null,null,SyAffairState.error); + } + + @Override + public R> listFormAffair(CtpAffairQo ctpAffairQo) { + String title = "【表单审批节点】"; + R result = seeYonRequestBaseService.postBase(TbsSeeYonConst.API_LIST_AFFAIR,ctpAffairQo,title); + if(result.getStatus()==200){ + List list = JsonUtil.jsonToPojo(result.getData(),List.class); + List affairList = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(list)){ + for (Object o : list) { + String json = JsonUtil.objectToJson(o); + CtpAffair obj = JsonUtil.jsonToPojo(json,CtpAffair.class); + affairList.add(obj); + } + } + return R.ok(affairList); + } + return null; + } + + + @Override + public R addNode(CtpAddNodeDTO addNodeDTO) { + String title = "【校验OA节点状态】"; + R result = seeYonRequestBaseService.postBase(TbsSeeYonConst.API_ADD_NODE,addNodeDTO,title); + log.warn("{}{}",title,JsonUtil.objectToJson(result)); + return result; + } + + @Override + public R getUnfinishedAffair(String templateCode, String memberId) { + String title = "【获取未审统计】"; + Map param = new HashMap<>(); + param.put("templateCode",templateCode); + param.put("memberId",memberId); + R result = seeYonRequestBaseService.postBase(TbsSeeYonConst.API_COUNT_NOT_OK,param,title); + if(result.getStatus()==200){ + try { + return R.ok(Long.parseLong(result.getData())); + } catch (NumberFormatException e) { + log.error(title+" param==>{} \n ==> {}",JsonUtil.objectToJson(param),JsonUtil.objectToJson(result)); + } + } + return R.ok(0L); + } + + @Override + public R checkAffairSummery(String templateCode, String targetId) { + String title = "【流程状态检验】"; + Map param = new HashMap<>(); + param.put("templateCode",templateCode); + param.put("targetId",targetId); + R result = seeYonRequestBaseService.postBase(TbsSeeYonConst.API_CHECK_SUMMERY,param,title); + if(result.getStatus()==200){ + try { + return R.ok(result.getData(),""); + } catch (NumberFormatException e) { + log.error(title+" param==>{} \n ==> {}",JsonUtil.objectToJson(param),JsonUtil.objectToJson(result)); + } + } + return R.ok("next",""); + } + + @Override + public R getTargetIdByFormId(String code, String formId) { + String title = "【获取targetID】"; + String url = TbsSeeYonConst.API_GET_TARGET_ID+"?templateCode="+code +"&formid="+formId; + R result = seeYonRequestBaseService.getBase(url,title); + if(result.getStatus()==200){ + try { + return R.ok(result.getData(),""); + } catch (NumberFormatException e) { + log.error(title+" url==>{} \n ==> {}",url,JsonUtil.objectToJson(result)); + } + } + return R.ok(); + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/impl/XiaoLuTonServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/impl/XiaoLuTonServiceImpl.java new file mode 100644 index 0000000..3cd1a56 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/seeyon/service/impl/XiaoLuTonServiceImpl.java @@ -0,0 +1,47 @@ +package com.qs.serve.modules.seeyon.service.impl; + +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.seeyon.entity.XltApticlaim; +import com.qs.serve.modules.seeyon.entity.XltPaymentRecord; +import com.qs.serve.modules.seeyon.service.XiaoLuTonService; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tzc.entity.dto.PolicyItemDto; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @author YenHex + * @since 2023/1/3 + */ +@Slf4j +@Service +@AllArgsConstructor +public class XiaoLuTonServiceImpl implements XiaoLuTonService { + + private SeeYonRequestBaseService seeYonRequestBaseService; + + @Override + public R saveApticlaim(XltApticlaim apticlaim) { + String title = "保存核销记录"; + return seeYonRequestBaseService.postBase(TbsSeeYonConst.XLT_SAVE_CHECK,apticlaim,title); + } + + @Override + public R savePaymentRecord(XltPaymentRecord paymentRecord) { + String title = "保存支付记录"; + return seeYonRequestBaseService.postBase(TbsSeeYonConst.XLT_SAVE_PAYMENT,paymentRecord,title); + } + + @Override + public R savePolicyItem(PolicyItemDto policyItemDto) { + String title = "保存政策记录"; + return seeYonRequestBaseService.postBase(TbsSeeYonConst.XLT_SAVE_POLICY,policyItemDto,title); + } + + @Override + public R listPolicyPayments() { + String title = "获取最近政策记录"; + return seeYonRequestBaseService.postBase(TbsSeeYonConst.XLT_LIST_POLICY,null,title); + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sync/AsyncFactory.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sync/AsyncFactory.java new file mode 100644 index 0000000..c030f59 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sync/AsyncFactory.java @@ -0,0 +1,289 @@ +package com.qs.serve.modules.sync; + + +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.SpringUtils; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.entity.SysOperationLog; +import com.qs.serve.modules.sys.mapper.SysOperationLogMapper; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.service.impl.TbsBudgetApplyOperationServiceImpl; +import com.qs.serve.modules.tbs.service.impl.TbsBudgetBatchOperationServiceImpl; +import com.qs.serve.modules.tbs.service.impl.TbsBudgetChangeOperationServiceImpl; +import com.qs.serve.modules.tbs.service.impl.TbsCostApplyOperationServiceImpl; +import com.qs.serve.modules.tzc.service.impl.TzcPolicyOperationServiceImpl; +import com.qs.serve.modules.vtb.common.VtbVerificationState; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import com.qs.serve.modules.vtb.service.impl.VtbVerificationOperationServiceImpl; +import lombok.extern.slf4j.Slf4j; + +import java.math.BigDecimal; +import java.util.TimerTask; +import java.util.concurrent.TimeUnit; + +import static com.qs.serve.modules.tbs.common.TbsSeeYonConst.ERP_CUS_AMOUNT; + +/** + * 异步工厂 + * @author YenHex + * @since 2022/2/24 + */ +@Slf4j +public class AsyncFactory { + + /** + * 操作日志记录 + * @param operationLog + * @return + */ + public static TimerTask saveOperationLog(final SysOperationLog operationLog) { + return new TimerTask() { + @Override + public void run() { + SpringUtils.getBean(SysOperationLogMapper.class).saveLog(operationLog); + } + }; + } + + /** + * 异步保存政策状态 + * @param userId + * @param supplierCode + * @return + */ + public static TimerTask initCustomerPrice(String userId,String supplierCode) { + return new TimerTask() { + @Override + public void run() { + getCumSurplusPrice(userId, supplierCode); + } + + }; + } + + /** + * 获取客户帐余 + * @param userId + * @param supplierCode + * @return + */ + public static String getCumSurplusPrice(String userId, String supplierCode) { + String lockKey = "customer_price_lock:"+userId+":"+supplierCode; + String priceDataKey = "customer_price_data:"+userId; + RedisService redisService = SpringUtils.getBean(RedisService.class); + redisService.set(lockKey,1,30,TimeUnit.SECONDS); + log.debug("获取客户金额,cusCode:{}",supplierCode); + //请求获取金额 + SeeYonRequestBaseService seeYonRequestService = SpringUtils.getBean(SeeYonRequestBaseService.class); + R reqResult = seeYonRequestService.getBase(ERP_CUS_AMOUNT+"?supplierCode="+supplierCode,"获取客户["+supplierCode+"]金额"); + if(reqResult==null || !reqResult.getStatus().equals(200)){ + //有错误退出 + log.warn("获取客户金额失败,cusCode:{}",supplierCode); + redisService.set(lockKey,0); + return "-1"; + } + String amount = reqResult.getData()==null?"0":reqResult.getData(); + //数据格式:supplierCode_&_amount 如 A235654_&_612.00 + String value = supplierCode+"_&_"+amount; + //缓存15分钟 + log.debug("获取客户金额成功,cusCode:{},缓存15分钟",supplierCode); + redisService.set(priceDataKey,value,15, TimeUnit.MINUTES); + redisService.set(lockKey,0); + + // + return amount; + } + + /** + * 异步保存政策状态 + * @param policyId + * @return + */ + public static TimerTask submitPolicy(Long policyId) { + return new TimerTask() { + @Override + public void run() { + TzcPolicyOperationServiceImpl operationService = SpringUtils.getBean(TzcPolicyOperationServiceImpl.class); + RedisService redisService = SpringUtils.getBean(RedisService.class); + boolean createLock = redisService.tryToLock(operationService.getTemplateCode(),policyId+""); + if(createLock){ + try { + log.debug("--------------------------SubmitPolicy CallbackTimer Sleep Start------------------------------"); + AuthContextUtils.setTenant("001"); + Thread.sleep(3*1000); + String summeryResult = operationService.checkAffairSummery(policyId.toString()); + if(summeryResult.equals(TzcPolicyOperationServiceImpl.SummeryState_Success)){ + //调用成功回调方法 + TbsAffairCommitBo finishedParam = new TbsAffairCommitBo(); + finishedParam.setPolicyId(policyId); + operationService.doFinished(finishedParam); + } + log.debug("--------------------------SubmitPolicy CallbackTimer summeryResult:{}------------------------------",summeryResult); + } catch (Exception e) { + e.printStackTrace(); + }finally { + redisService.removeLock(operationService.getTemplateCode(),policyId+""); + } + } + + } + }; + } + + /** + * 异步保存费用申请状态 + * @param budgetId + * @return + */ + public static TimerTask submitBudgetChange(String budgetId) { + return new TimerTask() { + @Override + public void run() { + try { + AuthContextUtils.setTenant("001"); + log.debug("--------------------------SubmitBudgetApply CallbackTimer Sleep Start :{}------------------------------",budgetId); + Thread.sleep(3*1000); + + TbsBudgetChangeOperationServiceImpl applyOperationService = SpringUtils.getBean(TbsBudgetChangeOperationServiceImpl.class); + + String summeryResult = applyOperationService.checkAffairSummery(budgetId); + if(summeryResult.equals(TzcPolicyOperationServiceImpl.SummeryState_Success)){ + TbsAffairCommitBo doParam = new TbsAffairCommitBo(); + doParam.setTargetId(budgetId); + applyOperationService.doFinished(doParam); + } + log.debug("--------------------------SubmitBudgetApply CallbackTimer summeryResult:{} ------------------------------",summeryResult); + } catch (Exception e) { + e.printStackTrace(); + } + } + }; + } + + /** + * 异步保存费用申请状态 + * @param batchId + * @return + */ + public static TimerTask submitBudgetBatch(String batchId) { + return new TimerTask() { + @Override + public void run() { + try { + AuthContextUtils.setTenant("001"); + log.debug("--------------------------SubmitBudgetApply CallbackTimer Sleep Start------------------------------"); + Thread.sleep(7*1000); + TbsBudgetBatchOperationServiceImpl operationService = SpringUtils.getBean(TbsBudgetBatchOperationServiceImpl.class); + + String summeryResult = operationService.checkAffairSummery(batchId); + if(summeryResult.equals(TzcPolicyOperationServiceImpl.SummeryState_Success)){ + TbsAffairCommitBo doParam = new TbsAffairCommitBo(); + doParam.setTargetId(batchId); + operationService.doFinished(doParam); + } + log.debug("--------------------------SubmitBudgetApply CallbackTimer summeryResult:{} ------------------------------",summeryResult); + + } catch (Exception e) { + e.printStackTrace(); + } + } + }; + } + + /** + * 异步保存费用申请状态 + * @param budgetId + * @return + */ + public static TimerTask submitBudgetApply(String budgetId) { + return new TimerTask() { + @Override + public void run() { + try { + AuthContextUtils.setTenant("001"); + log.debug("--------------------------submitBudgetApply CallbackTimer Sleep Start :{}------------------------------",budgetId); + Thread.sleep(3*1000); + TbsBudgetApplyOperationServiceImpl applyOperationService = SpringUtils.getBean(TbsBudgetApplyOperationServiceImpl.class); + String summeryResult = applyOperationService.checkAffairSummery(budgetId); + if(summeryResult.equals(TzcPolicyOperationServiceImpl.SummeryState_Success)){ + TbsAffairCommitBo doParam = new TbsAffairCommitBo(); + doParam.setTargetId(budgetId); + applyOperationService.doFinished(doParam); + } + log.debug("--------------------------SubmitBudgetApply CallbackTimer summeryResult:{} ------------------------------",summeryResult); + } catch (Exception e) { + e.printStackTrace(); + } + } + }; + } + + /** + * 异步保存费用申请状态 + * @param costApply + * @return + */ + public static TimerTask submitCostApply(TbsCostApply costApply) { + return new TimerTask() { + @Override + public void run() { + try { + AuthContextUtils.setTenant("001"); + log.debug("--------------------------SubmitCostApply CallbackTimer Sleep Start------------------------------"); + Thread.sleep(7*1000); + TbsCostApplyOperationServiceImpl applyOperationService = SpringUtils.getBean(TbsCostApplyOperationServiceImpl.class); + String summeryResult = applyOperationService.checkAffairSummery(costApply.getId().toString()); + if(summeryResult.equals(TbsCostApplyOperationServiceImpl.SummeryState_Success)){ + //调用成功回调方法 + TbsAffairCommitBo finishedParam = new TbsAffairCommitBo(); + finishedParam.setCostApplyId(costApply.getId()); + applyOperationService.doFinished(finishedParam); + } + log.debug("--------------------------SubmitCostApply CallbackTimer summeryResult:{} ------------------------------",summeryResult); + } catch (Exception e) { + e.printStackTrace(); + } + } + }; + } + + + /** + * 异步保存核销状态 + * @param verificationId + * @param totalAmount + * @return + */ + public static TimerTask saveVtbSubmit(String userCode,Long verificationId, BigDecimal totalAmount,boolean realaseFlag) { + log.warn("费用释放---verificationId:{} totalAmount:{} realaseFlag:{}",verificationId,totalAmount,realaseFlag); + return new TimerTask() { + @Override + public void run() { + try { + AuthContextUtils.setTenant("001"); + Thread.sleep(3*1000); + VtbVerificationService vtbVerificationService = SpringUtils.getBean(VtbVerificationService.class); + VtbVerification verification = vtbVerificationService.getById(verificationId); + if(!verification.getVerificationState().equals(VtbVerificationState.Commiting.getCode())){ + return; + } + VtbVerificationOperationServiceImpl verificationOperationService = SpringUtils.getBean(VtbVerificationOperationServiceImpl.class); + String summeryResult = verificationOperationService.checkAffairSummery(verification.getId().toString()); + + if(summeryResult.equals(TbsCostApplyOperationServiceImpl.SummeryState_Success)){ + verificationOperationService.runCompensate(verificationId+""); + } + + + } catch (Exception e) { + e.printStackTrace(); + } + } + }; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/common/AuthContextUtils.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/common/AuthContextUtils.java new file mode 100644 index 0000000..c3faf26 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/common/AuthContextUtils.java @@ -0,0 +1,168 @@ +package com.qs.serve.modules.sys.common; + +import com.qs.serve.common.framework.security.model.LoginUser; +import com.qs.serve.common.framework.security.model.LoginUserType; +import com.qs.serve.common.model.consts.GySysConst; +import com.qs.serve.common.model.enums.HttpCode; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.ServletUtils; +import com.qs.serve.common.util.SpringUtils; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import lombok.experimental.UtilityClass; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +import java.util.Objects; + +/** + * @author YenHex + * @since 2022/3/1 + */ +@UtilityClass +public class AuthContextUtils { + + private final static ThreadLocal THREAD_TENANT = new ThreadLocal<>(); + private final static ThreadLocal THREAD_SUPPLIER = new ThreadLocal<>(); + + public static void removeThreadLocal(){ + THREAD_TENANT.remove(); + THREAD_SUPPLIER.remove(); + } + + /** + * 标注开发时使用 + */ + public static boolean DEV_INDEX = true; + + public static String getAppId(){ + return getAppId(true); + } + + public static String getAppId(boolean throwEx){ + String appId = ServletUtils.getHeader(GySysConst.APP_ID_PROP); + if(throwEx&& StringUtils.isEmpty(appId)){ + Assert.throwEx(HttpCode.LOGIN_ERR_4002); + } + return appId; + } + + /** + * 获取用户登录信息 + * @return + */ + public static LoginUser getLoginUser(){ + return getLoginUser(true); + } + + /** + * 系统用户ID + * @return + */ + public static String getSysUserId(){ + LoginUser loginUser = getLoginUser(); + return loginUser.getUserId(); + } + + /** + * 系统用户ID + * @return + */ + public static String getSysUserId(Boolean throwEx){ + if(throwEx){ + return getSysUserId(); + }else { + LoginUser loginUser = getLoginUser(false); + if(loginUser==null){ + return null; + }else { + return loginUser.getUserId(); + } + } + } + + /** + * 判断是否超级管理员 + * @return + */ + public static boolean isSupAdmin(){ + return Objects.requireNonNull(getLoginUser(false)) + .getTypeFlag().equals(LoginUserType.SYS_SUP_USER); + } + + public static void setTenant(String value){THREAD_TENANT.set(value);} + + public static String getTenant(){return THREAD_TENANT.get();} + + + + public static void setSupplierId(String value){ + if(StringUtils.hasText(value)){ + try { + THREAD_SUPPLIER.set(Long.parseLong(value)); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + } + + public static BmsSupplier getCurrentSupplier(){ + String userId = AuthContextUtils.getSysUserId(); + Long supplierId = AuthContextUtils.getSupplierId(); + BmsSupplierService supplierService = SpringUtils.getBean(BmsSupplierService.class); + BmsSupplier supplier = supplierService.getById(supplierId); +// if(supplier==null){ +// Assert.throwEx(4106,"供应商无效或未授权"); +// } +// boolean isOther = false; +// +// if(CollectionUtil.isNotEmpty(supplier.getOtherUserIds())){ +// for (String otherUserId : supplier.getOtherUserIds()) { +// if(userId.equals(otherUserId)){ +// isOther = true; +// break; +// } +// } +// } +// if(isOther && !supplier.getUserId().equals(userId)){ +// Assert.throwEx(4106,"供应商无效或未授权"); +// } +// if(supplier.getStopFlag().equals(1)){ +// Assert.throwEx(4106,"供应商已停用"); +// } + return supplier; + } + + public static Long getSupplierId(){return THREAD_SUPPLIER.get();} + + public static void removeTenant(){THREAD_TENANT.remove();} + + public static LoginUser getLoginUser(boolean throwEx){ + UserDetails details = getUserDetail(throwEx); + if(details instanceof LoginUser){ + return (LoginUser) details; + } + return null; + } + + private static UserDetails getUserDetail(boolean throwEx){ + SecurityContext ctx = SecurityContextHolder.getContext(); + Authentication auth = ctx.getAuthentication(); + if (auth != null) { + Object authPri = auth.getPrincipal(); + if (authPri instanceof UserDetails) { + UserDetails details = (UserDetails) authPri; + return details; + } + } + if(throwEx){ + throw new UsernameNotFoundException("未登录或被登出"); + } + return null; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/common/consts/SysStatusConst.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/common/consts/SysStatusConst.java new file mode 100644 index 0000000..2ee7c7e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/common/consts/SysStatusConst.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.sys.common.consts; + +/** + * @author YenHex + * @since 2022/3/1 + */ +public class SysStatusConst { + + /** 类型【0->菜单;1->按钮】 */ + public static final int SysPermission_Type_0 = 0; + public static final int SysPermission_Type_1 = 1; + + /** 超级管理标识【0->普通管理员;1->超级管理员】 */ + public static final int SysUser_SuperFlag_0 = 0; + public static final int SysUser_SuperFlag_1 = 1; + + + /** 可见类型【0->所有人可见;1->部分人员可见;2->部门可见】 */ + public static final int SysNotice_VisibleType_0 = 0; + public static final int SysNotice_VisibleType_1 = 1; + public static final int SysNotice_VisibleType_2 = 2; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/common/enums/BusinessLogOption.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/common/enums/BusinessLogOption.java new file mode 100644 index 0000000..d355235 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/common/enums/BusinessLogOption.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.sys.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author YenHex + * @since 2023/4/25 + */ +@Getter +@AllArgsConstructor +public enum BusinessLogOption { + + SAVE("新增"), + UPDATE("修改"), + DELETE("删除"); + String label; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/common/enums/BusinessLogType.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/common/enums/BusinessLogType.java new file mode 100644 index 0000000..75d7a1c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/common/enums/BusinessLogType.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.sys.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author YenHex + * @since 2023/4/25 + */ +@Getter +@AllArgsConstructor +public enum BusinessLogType { + + SupplierContacts("客户联系人"), + SupplierAddress("客户地址"), + Point("网点信息"); + + String label; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysAttachController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysAttachController.java new file mode 100644 index 0000000..261c4cf --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysAttachController.java @@ -0,0 +1,143 @@ +package com.qs.serve.modules.sys.controller; + +import cn.hutool.core.io.FileUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qs.serve.common.config.properties.UploadProperties; +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.util.Assert; +import com.qs.serve.common.util.IdUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.sys.entity.SysAttach; +import com.qs.serve.modules.sys.service.SysAttachService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.util.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.io.File; +import java.io.IOException; +import java.time.LocalDate; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; + +/** + * 系统:系统附件 + * @author YenHex + * @since 2022-03-24 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sys/attach") +public class SysAttachController { + + private SysAttachService sysAttachService; + + private UploadProperties uploadProperties; + + /** + * 附件上传 + * @param request + * @return + */ + @SysLog(title = "附件",biz = BizType.UPLOAD) + @PostMapping("/upload") + public R upload(HttpServletRequest request) { + String uploadPath = uploadProperties.getLogicalPath(); + String contentType = request.getContentType(); + MultipartFile file = null; + if (contentType != null && contentType.toLowerCase().startsWith("multipart")) { + MultipartHttpServletRequest multipartHttpServletRequest = WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class); + file = multipartHttpServletRequest.getFile("file"); + } + if (file==null||file.isEmpty()) { + Assert.throwEx("请选择文件"); + } + String fileOrgName = file.getOriginalFilename(); + String mimeType = fileOrgName.substring(fileOrgName.lastIndexOf(".")); + String prefix = LocalDate.now().toString().replace("-","")+"/"; + try { + FileUtil.createTempFile(new File(uploadPath+prefix)); + String newName = IdUtil.timeStampId(); + String fileType = mimeType.toLowerCase(Locale.ROOT); + String relativeName = prefix + newName + fileType; + File dest = new File(uploadPath + relativeName); + Long size = file.getSize(); + file.transferTo(dest); + String path = uploadProperties.getProxyUrl() + relativeName; + SysAttach attach = new SysAttach(); + attach.setName(fileOrgName); + attach.setPath(path); + attach.setSize(size); + attach.setFileType(fileType); + attach.setRelativePath(relativeName); + sysAttachService.save(attach); + return R.ok(attach); + } catch (IOException e) { + log.error(e.toString(), e); + } + return R.error("上传失败"); + } + + /** + * 保存 + * @param attach + * @return + */ + @PostMapping("/save") + public R upload(@RequestBody SysAttach attach){ + attach.setId(null); + sysAttachService.save(attach); + return R.ok(attach); + } + + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(title = "附件",biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + SysAttach sysattach = sysAttachService.getById(id); + return R.ok(sysattach); + } + + /** + * 根据ID查询 + * @param ids + * @return + */ + @GetMapping("/listByIds/{ids}") + @SysLog(title = "附件",biz = BizType.QUERY) + public R> listByIds(@PathVariable("ids") String ids){ + String[] idStrs = ids.split(","); + List sysattach = sysAttachService.listByIds(Arrays.asList(idStrs)); + return R.ok(sysattach); + } + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('sys:attach:query')") + public R> getPage(SysAttach param){ + PageUtil.startPage(); + List list = sysAttachService.list(new QueryWrapper<>(param)); + return R.byPageHelperList(list); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysBusinessLogController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysBusinessLogController.java new file mode 100644 index 0000000..f2b6c9a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysBusinessLogController.java @@ -0,0 +1,73 @@ +package com.qs.serve.modules.sys.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.sys.entity.SysBusinessLog; +import com.qs.serve.modules.sys.service.SysBusinessLogService; + +import java.util.List; + +/** + * 系统 系统业务日志 + * @author YenHex + * @since 2023-04-25 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sys/businessLog") +public class SysBusinessLogController { + + private SysBusinessLogService sysBusinessLogService; + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(SysBusinessLog param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = sysBusinessLogService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + SysBusinessLog sysBusinessLog = sysBusinessLogService.getById(id); + return R.ok(sysBusinessLog); + } + + + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = sysBusinessLogService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysConfigController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysConfigController.java new file mode 100644 index 0000000..66955d4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysConfigController.java @@ -0,0 +1,68 @@ +package com.qs.serve.modules.sys.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.sys.entity.bo.SysConfigBo; +import com.qs.serve.modules.sys.entity.SysConfig; +import com.qs.serve.modules.sys.service.SysConfigService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 系统 系统配置 + * @author YenHex + * @since 2022-11-12 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sys/config") +public class SysConfigController { + + private SysConfigService sysConfigService; + + + /** + * ID查询 + * @param key + * @return + */ + @GetMapping("/getByKey/{key}") + public R getById(@PathVariable("key") String key){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SysConfig::getConfigKey,key); + SysConfig sysConfig = sysConfigService.getOne(lqw); + return R.ok(sysConfig); + } + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.SYSTEM, title = "系统配置", biz = BizType.UPDATE) + @PreAuthorize("hasRole('sys:config:update')") + public R updateById(@RequestBody @Valid SysConfigBo param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SysConfig::getConfigKey,param.getConfigKey()); + SysConfig sysConfig = sysConfigService.getOne(lqw); + sysConfig.setConfigValue(param.getConfigValue()); + sysConfigService.updateById(sysConfig); + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysDeptController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysDeptController.java new file mode 100644 index 0000000..7cf4b8c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysDeptController.java @@ -0,0 +1,217 @@ +package com.qs.serve.modules.sys.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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.util.CopierUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.TreeUtil; +import com.qs.serve.modules.sys.entity.SysDept; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.entity.bo.SysDeptBatchBo; +import com.qs.serve.modules.sys.entity.dto.SysDeptTranParam; +import com.qs.serve.modules.sys.entity.dto.SysDeptTreeNode; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.sys.service.SysDeptService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 系统:部门 + * @author YenHex + * @since 2022-03-01 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sys/dept") +public class SysDeptController { + + private SysDeptService sysDeptService; + private SysUserMapper sysUserMapper; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('sys:dept:query')") + public R> getList(SysDept param){ + PageUtil.startPage(); + param.setStopFlag(0); + List list = sysDeptService.list(new QueryWrapper<>(param)); + return R.byPageHelperList(list); + } + + /** + * 查询所有部门 + * @param param + * @return + */ + @GetMapping("/list") + @PreAuthorize("hasRole('sys:dept:query')") + public R> getListAll(SysDept param){ + param.setStopFlag(0); + List list = sysDeptService.list(new QueryWrapper<>(param)); + return R.ok(list); + } + + + /** + * 查询列表树 + * @param param + * @return + */ + @GetMapping("/tree") + @PreAuthorize("hasRole('sys:dept:query')") + public R getTreeList(SysDept param){ + param.setStopFlag(0); + List list = sysDeptService.listDept(param); + List treeNodes = list.stream().map(dept->{ + SysDeptTreeNode treeNode = CopierUtil.copy(dept,new SysDeptTreeNode()); + treeNode.setId(dept.getId()); + treeNode.setParentId(dept.getParentId()); + treeNode.setMgrUserName(dept.getMgrUserName()); + treeNode.setSort(0); + return treeNode; + }).collect(Collectors.toList()); + treeNodes = TreeUtil.buildByRecursive(treeNodes,TreeUtil.DEFAULT_PID_STRING); + return R.ok(treeNodes); + } + + + /** + * 根据ID查询 + * @param id + * @return + */ + @SysLog(title = "部门",biz = BizType.QUERY) + @GetMapping("/getById/{id}") + @PreAuthorize("hasRole('sys:dept:query')") + public R getById(@PathVariable("id") String id){ + SysDept sysDept = sysDeptService.getById(id); + if(sysDept.getMgrUserId()!=null){ + SysUser sysUser = sysUserMapper.selectById(sysDept.getMgrUserId()); + if(sysUser!=null){ + sysDept.setMgrUserName(sysUser.getName()); + } + } + return R.ok(sysDept); + } + + /** + * 保存 + * @param param + * @return + */ + @SysLog(title = "部门",biz = BizType.INSERT) + @PostMapping("/save") + @PreAuthorize("hasRole('sys:dept:insert')") + public R save(@RequestBody @Valid SysDept param){ + boolean result = sysDeptService.save2(param); + return R.isTrue(result); + } + + /** + * (批量)保存,建议每次小于800条 + * @param param + * @return + */ + @SysLog(title = "部门",biz = BizType.INSERT) + @PostMapping("/saveBatch") + @PreAuthorize("hasRole('sys:dept:insert')") + public R saveBatch(@RequestBody @Valid SysDeptBatchBo param){ + List deptList = param.getDeptList(); + List ids = deptList.stream().map(d->d.getId()).collect(Collectors.toList()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(SysDept::getId,ids); + lqw.select(SysDept::getId); + List sysDeptIdObjs = sysDeptService.list(lqw); + List existIds = sysDeptIdObjs.stream().map(SysDept::getId).collect(Collectors.toList()); + List deptList4Upd = deptList.stream().filter(dep->existIds.contains(dep.getId())).collect(Collectors.toList()); + List deptList4save = deptList.stream().filter(dep->!existIds.contains(dep.getId())).collect(Collectors.toList()); + sysDeptService.saveBatch(deptList4save); + sysDeptService.updateBatchById(deptList4Upd); + return R.ok(); + } + + /** + * 根据ID更新 + * @param param + * @return + */ + @SysLog(title = "部门",biz = BizType.UPDATE) + @PostMapping("/updateById") + @PreAuthorize("hasRole('sys:dept:update')") + public R updateById(@RequestBody @Valid SysDept param){ + sysDeptService.updateById(param); + return R.ok(); + } + + /** + * 部门迁移 + * @param param + * @return + */ + @SysLog(title = "部门",desc = "部门迁移",biz = BizType.UPDATE) + @PostMapping("/updateLevel") + @PreAuthorize("hasRole('sys:post:update')") + @Transactional(rollbackFor = Exception.class) + public R updateLevel(@RequestBody @Valid SysDeptTranParam param){ + SysDept dept = sysDeptService.getById(param.getSelectId()); + if(dept.getParentId().equals(param.getParentId())){ + return R.ok(); + } + String subLevelPath = ""; + if(!dept.getParentId().equals(TreeUtil.DEFAULT_PID_STRING)){ + SysDept orgParent = sysDeptService.getById(dept.getParentId()); + subLevelPath = orgParent.getLevelPath()+"_"; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.select(SysDept::getId,SysDept::getParentId,SysDept::getLevelPath); + wrapper.likeRight(SysDept::getLevelPath,dept.getLevelPath()); + List deptList = sysDeptService.list(wrapper); + SysDept parent = null; + if(param.getParentId().equals(TreeUtil.DEFAULT_PID_STRING)){ + parent = sysDeptService.getById(param.getParentId()); + } + for (SysDept sysDept : deptList) { + if(sysDept.getId().equals(param.getSelectId())){ + sysDept.setParentId(param.getParentId()); + } + String levelPath = sysDept.getLevelPath().replace(subLevelPath,""); + if(parent==null){ + sysDept.setLevelPath(levelPath); + }else { + sysDept.setLevelPath(parent.getLevelPath()+"_"+levelPath); + } + } + sysDeptService.updateBatchById(deptList); + return R.ok(); + } + /** + * 删除 + * @param id + * @return + */ + @SysLog(title = "部门",biz = BizType.DELETE) + @DeleteMapping("/deleteById/{id}") + @PreAuthorize("hasRole('sys:dept:delete')") + public R deleteById(@PathVariable("id") String id){ + boolean result = sysDeptService.removeById(id); + return R.ok(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysDictController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysDictController.java new file mode 100644 index 0000000..2ec559b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysDictController.java @@ -0,0 +1,103 @@ +package com.qs.serve.modules.sys.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.sys.entity.SysDict; +import com.qs.serve.modules.sys.service.SysDictService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 系统 字典 + * @author YenHex + * @since 2022-11-04 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sys/dict") +public class SysDictController { + + private SysDictService sysDictService; + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('sys:dict:query')") + public R> getPage(SysDict param){ + PageUtil.startPage(); + LambdaQueryWrapper dictWrapper = new LambdaQueryWrapper<>(param); + List list = sysDictService.list(dictWrapper); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.SYSTEM, title = "字典", biz = BizType.QUERY) + @PreAuthorize("hasRole('sys:dict:query')") + public R getById(@PathVariable("id") String id){ + SysDict sysDict = sysDictService.getById(id); + return R.ok(sysDict); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.SYSTEM, title = "字典", biz = BizType.UPDATE) + @PreAuthorize("hasRole('sys:dict:update')") + public R updateById(@RequestBody @Valid SysDict param){ + boolean result = sysDictService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.SYSTEM, title = "字典", biz = BizType.INSERT) + @PreAuthorize("hasRole('sys:dict:insert')") + public R save(@RequestBody @Valid SysDict param){ + boolean result = sysDictService.save(param); + return R.isTrue(result); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.SYSTEM, title = "字典", biz = BizType.DELETE) + @PreAuthorize("hasRole('sys:dict:delete')") + public R deleteById(@PathVariable("id") Long id){ + boolean result = sysDictService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysDictDataController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysDictDataController.java new file mode 100644 index 0000000..b4846ed --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysDictDataController.java @@ -0,0 +1,124 @@ +package com.qs.serve.modules.sys.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.StringUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.sys.entity.SysDictData; +import com.qs.serve.modules.sys.service.SysDictDataService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 系统 字典数据 + * @author YenHex + * @since 2022-11-04 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sys/dictData") +public class SysDictDataController { + + private SysDictDataService sysDictDataService; + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/list") + @PreAuthorize("hasRole('sys:dictData:query')") + public R> getList(SysDictData param){ + if(!StringUtils.hasText(param.getGroupKey())){ + return R.ok(); + } + LambdaQueryWrapper dictDataWrapper = new LambdaQueryWrapper<>(param); + List list = sysDictDataService.list(dictDataWrapper); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('sys:dictData:query')") + public R> getPage(SysDictData param){ + if(!StringUtils.hasText(param.getGroupKey())){ + return R.byEmptyList(); + } + PageUtil.startPage(); + LambdaQueryWrapper dictDataWrapper = new LambdaQueryWrapper<>(param); + List list = sysDictDataService.list(dictDataWrapper); + return R.byPageHelperList(list); + } + + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.SYSTEM, title = "字典数据", biz = BizType.QUERY) + @PreAuthorize("hasRole('sys:dictData:query')") + public R getById(@PathVariable("id") String id){ + SysDictData sysDictData = sysDictDataService.getById(id); + return R.ok(sysDictData); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.SYSTEM, title = "字典数据", biz = BizType.UPDATE) + @PreAuthorize("hasRole('sys:dictData:update')") + public R updateById(@RequestBody @Valid SysDictData param){ + boolean result = sysDictDataService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.SYSTEM, title = "字典数据", biz = BizType.INSERT) + @PreAuthorize("hasRole('sys:dictData:insert')") + public R save(@RequestBody @Valid SysDictData param){ + boolean result = sysDictDataService.save(param); + return R.isTrue(result); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.SYSTEM, title = "字典数据", biz = BizType.DELETE) + @PreAuthorize("hasRole('sys:dictData:delete')") + public R deleteById(@PathVariable("id") Long id){ + boolean result = sysDictDataService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysMenuController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysMenuController.java new file mode 100644 index 0000000..7c77052 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysMenuController.java @@ -0,0 +1,189 @@ +package com.qs.serve.modules.sys.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qs.serve.common.framework.security.model.LoginUser; +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.util.*; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysMenu; +import com.qs.serve.modules.sys.entity.SysMenuPermit; +import com.qs.serve.modules.sys.entity.dto.SysMenuPermitParam; +import com.qs.serve.modules.sys.entity.dto.SysMenuTreeNode; +import com.qs.serve.modules.sys.service.SysMenuPermitService; +import com.qs.serve.modules.sys.service.SysMenuService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 系统:系统菜单 + * @author YenHex + * @since 2022-03-15 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sys/menu") +public class SysMenuController { + + private SysMenuService sysMenuService; + private SysMenuPermitService sysMenuPermitService; + + + /** + * 获取人员权限菜单 + * @return + */ + @PostMapping("/userMenus") + public R> userMenus(Integer clientType){ + LoginUser loginUser = AuthContextUtils.getLoginUser(); + List menuIds = loginUser.getAuthorIds(); + if(CollectionUtil.isNotEmpty(menuIds)){ + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysMenu::getId,menuIds); + wrapper.eq(SysMenu::getClientType,clientType==null?1:clientType); + return R.ok(sysMenuService.list(wrapper)); + } + return R.ok(); + } + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('sys:menu:query')") + public R> getPage(SysMenu param){ + PageUtil.startPage(); + List list = sysMenuService.list(new QueryWrapper<>(param)); + return R.byPageHelperList(list); + } + + /** + * 列表查询 + * @param param + * @return + */ + @GetMapping("/list") + @PreAuthorize("hasRole('sys:menu:query')") + public R> getList(SysMenu param){ + List list = sysMenuService.list(new QueryWrapper<>(param)); + return R.ok(list); + } + + /** + * 树形列表 + * @return + */ + @GetMapping("/tree") + @PreAuthorize("hasRole('sys:permit:query')") + public R> getTree(Integer clientType){ + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if(clientType==null){ + wrapper.eq(SysMenu::getClientType,0); + }else { + wrapper.eq(SysMenu::getClientType,clientType); + } + wrapper.eq(SysMenu::getHideFlag,0); + wrapper.orderByAsc(SysMenu::getSort,SysMenu::getId); + List list = sysMenuService.list(wrapper); + List treeNodes = list.stream().map(permit->{ + SysMenuTreeNode treeNode = CopierUtil.copy(permit,new SysMenuTreeNode()); + treeNode.setId(permit.getId()+""); + treeNode.setParentId(permit.getPid()); + treeNode.setSort(permit.getSort()); + return treeNode; + }).collect(Collectors.toList()); + treeNodes = TreeUtil.buildByRecursive(treeNodes,TreeUtil.DEFAULT_PID_STRING); + return R.ok(treeNodes); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @PreAuthorize("hasRole('sys:menu:query')") + public R getById(@PathVariable("id") String id){ + SysMenu sysMenu = sysMenuService.getById(id); + List menuPermitList = sysMenuPermitService.listByMenuId(id); + sysMenu.setPermitIds(menuPermitList.stream().map(SysMenuPermit::getPermitId).distinct().collect(Collectors.toList())); + return R.ok(sysMenu); + } + + + + /** + * 根据ID更新 + * @param param + * @return + */ + @SysLog(title = "菜单",biz = BizType.UPDATE) + @PostMapping("/updateById") + @PreAuthorize("hasRole('sys:menu:update')") + public R updateById(@RequestBody @Valid SysMenu param){ + boolean result = sysMenuService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增系统菜单 + * @param param + * @return + */ + @SysLog(title = "菜单",biz = BizType.INSERT) + @PostMapping("/save") + @PreAuthorize("hasRole('sys:menu:insert')") + public R save(@RequestBody @Valid SysMenu param){ + boolean result = sysMenuService.save(param); + return R.isTrue(result); + } + + /** + * 授权系统菜单 + * @param param + * @return + */ + @SysLog(title = "菜单",biz = BizType.GRANT) + @PostMapping("/grantMenu") + @PreAuthorize("hasRole('sys:menu:insert')") + public R save2(@RequestBody @Valid SysMenuPermitParam param){ + sysMenuPermitService.removeByMenuId(param.getMenuId()); + List menuPermitList = new ArrayList<>(); + for (String permitId : param.getPermitIds()) { + SysMenuPermit menuPermit = new SysMenuPermit(); + menuPermit.setMenuId(param.getMenuId()); + menuPermit.setPermitId(permitId); + menuPermitList.add(menuPermit); + } + sysMenuPermitService.saveBatch(menuPermitList); + return R.ok(); + } + + /** + * 删除系统菜单 + * @param id + * @return + */ + @SysLog(title = "菜单",biz = BizType.DELETE) + @DeleteMapping("/deleteById/{id}") + @PreAuthorize("hasRole('sys:menu:delete')") + public R deleteById(@PathVariable("id") String id){ + boolean result = sysMenuService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysNoticeController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysNoticeController.java new file mode 100644 index 0000000..bc17a28 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysNoticeController.java @@ -0,0 +1,220 @@ +package com.qs.serve.modules.sys.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.sys.entity.*; +import com.qs.serve.modules.sys.entity.dto.SysUserVo; +import com.qs.serve.modules.sys.service.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 系统:公示(管理员) + * @author YenHex + * @since 2022-03-01 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sys/notice") +public class SysNoticeController { + + private SysNoticeService sysNoticeService; + private SysDeptService sysDeptService; + private SysUserService sysUserService; + private SysAttachService sysAttachService; + private SysNoticeUserService sysNoticeUserService; + + /** + * 查询个人列表 + * @param param + * @return + */ + @GetMapping("/pageSelf") + public R> getPageSelf(SysNotice param){ + PageUtil.startPage(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(param); + if(param.getQueryStartTime()!=null){ + wrapper.ge(SysNotice::getLastPublishTime,param.getQueryStartTime()); + } + if(param.getQueryEndTime()!=null){ + wrapper.le(SysNotice::getLastPublishTime,param.getQueryEndTime()); + } + wrapper.eq(SysNotice::getCreateBy, AuthContextUtils.getSysUserId()); + List list = sysNoticeService.list(wrapper); + return R.byPageHelperList(list); + } + + /** + * 查询列表 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('sys:notice:query')") + public R> getPage(SysNotice param){ + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(param); + if(param.getQueryStartTime()!=null){ + wrapper.ge(SysNotice::getLastPublishTime,param.getQueryStartTime()); + } + if(param.getQueryEndTime()!=null){ + wrapper.le(SysNotice::getLastPublishTime,param.getQueryEndTime()); + } + PageUtil.startPage(); + List list = sysNoticeService.list(wrapper); + for (SysNotice notice : list) { + SysUser sysUser = sysUserService.getById(notice.getCreateBy()); + if(sysUser!=null){ + notice.setCreatorName(sysUser.getName()); + } + } + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @SysLog(title = "公告",biz = BizType.QUERY) + @GetMapping("/getById/{id}") + @PreAuthorize("hasRole('sys:notice:query')") + public R getById(@PathVariable("id") String id){ + SysNotice sysNotice = sysNoticeService.getById(id); + if(sysNotice==null){ + return R.error("资源不存在或被移除"); + } + String[] arr = sysNotice.getVisibleIds(); + if(CollectionUtil.isNotEmpty(arr)){ + if(sysNotice.getVisibleType().equals(1)){ + List sysUsers = sysUserService.listByIds(Arrays.asList(arr)); + List sysUserVoLIst = sysUsers.stream().map(SysUser::toSysUserVo).collect(Collectors.toList()); + sysNotice.setUserInfos(sysUserVoLIst); + }else if(sysNotice.getVisibleType().equals(2)){ + List deptList = sysDeptService.listByIds(Arrays.asList(arr)); + sysNotice.setDeps(deptList); + } + } + if(CollectionUtil.isNotEmpty(sysNotice.getDocIds())){ + List documents = sysAttachService.listByIds(Arrays.asList(sysNotice.getDocIds())); + sysNotice.setDocuments(documents); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysNoticeUser::getNoticeId,id); + wrapper.eq(SysNoticeUser::getUserId,AuthContextUtils.getSysUserId()); + SysNoticeUser sysNoticeUser = sysNoticeUserService.getOne(wrapper,false); + if(sysNoticeUser!=null){ + sysNoticeUser.setReadFlag(true); + sysNoticeUser.setReadCount(sysNoticeUser.getReadCount()==null?1:sysNoticeUser.getReadCount()+1); + sysNoticeUser.setReadTime(LocalDateTime.now()); + sysNoticeUserService.updateById(sysNoticeUser); + } + return R.ok(sysNotice); + } + + /** + * 保存 + * @param param + * @return + */ + @SysLog(title = "公告",biz = BizType.INSERT) + @PostMapping("/save") + @PreAuthorize("hasRole('sys:notice:insert')") + public R save(@RequestBody @Valid SysNotice param){ + boolean result = sysNoticeService.save(param); + return R.isTrue(result); + } + + /** + * 发布 + * @param id + * @return + */ + @SysLog(title = "公告",desc = "发布公告",biz = BizType.OTHER) + @PostMapping("/publish/{id}") + @PreAuthorize("hasRole('sys:notice:publish')") + public R publish(@PathVariable("id") String id){ + sysNoticeService.publish(id); + return R.ok(); + } + + /** + * 撤销、下架 + * @param id + * @return + */ + @SysLog(title = "公告",desc = "撤销公告",biz = BizType.OTHER) + @PostMapping("/repeal/{id}") + @PreAuthorize("hasRole('sys:notice:repeal')") + @Transactional(rollbackFor = Exception.class) + public R repeal(@PathVariable("id") String id){ + sysNoticeService.removeUserRelate(id); + SysNotice notice = sysNoticeService.getById(id); + notice.setEnable(0); + updateById(notice); + return R.ok(); + } + + /** + * 保存并发布 + * @param param + * @return + */ + @SysLog(title = "公告",desc = "保存并发布",biz = BizType.INSERT) + @PostMapping("/saveAndPublish") + @PreAuthorize("hasRole('sys:notice:publish') and hasRole('sys:notice:insert')") + @Transactional(rollbackFor = Exception.class) + public R publish(@RequestBody @Valid SysNotice param){ + param.setEnable(1); + if(param.getId()!=null){ + sysNoticeService.updateById(param); + }else { + sysNoticeService.save(param); + } + sysNoticeService.publish(param.getId()); + return R.ok(); + } + + /** + * 根据ID更新 + * @param param + * @return + */ + @SysLog(title = "公告",biz = BizType.UPDATE) + @PostMapping("/updateById") + @PreAuthorize("hasRole('sys:notice:update')") + public R updateById(@RequestBody @Valid SysNotice param){ + boolean result = sysNoticeService.updateById(param); + return R.isTrue(result); + } + + /** + * 删除 + * @param id + * @return + */ + @SysLog(title = "公告",biz = BizType.DELETE) + @PostMapping("/deleteById/{id}") + @PreAuthorize("hasRole('sys:notice:delete')") + public R deleteById(@PathVariable("id") String id){ + boolean result = sysNoticeService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysNoticeTypeController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysNoticeTypeController.java new file mode 100644 index 0000000..eaf9c77 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysNoticeTypeController.java @@ -0,0 +1,109 @@ +package com.qs.serve.modules.sys.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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.util.PageUtil; +import com.qs.serve.modules.sys.entity.SysNoticeType; +import com.qs.serve.modules.sys.service.SysNoticeTypeService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * 系统:公示分类 + * @author YenHex + * @since 2022-03-01 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sys/noticeType") +public class SysNoticeTypeController { + + private SysNoticeTypeService sysNoticeTypeService; + + /** + * 查询列表 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('sys:noticeType:query')") + public R> getPage(SysNoticeType param){ + PageUtil.startPage(); + List list = sysNoticeTypeService.list(new QueryWrapper<>(param)); + return R.byPageHelperList(list); + } + + /** + * 查询列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(SysNoticeType param){ + List list = sysNoticeTypeService.list(new QueryWrapper<>(param)); + return R.ok(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @SysLog(title = "公告类型",biz = BizType.QUERY) + @GetMapping("/getById/{id}") + @PreAuthorize("hasRole('sys:noticeType:query')") + public R getById(@PathVariable("id") String id){ + SysNoticeType sysNoticeType = sysNoticeTypeService.getById(id); + return R.ok(sysNoticeType); + } + + /** + * 保存 + * @param param + * @return + */ + @SysLog(title = "公告类型",biz = BizType.INSERT) + @PostMapping("/save") + @PreAuthorize("hasRole('sys:noticeType:insert')") + public R save(@RequestBody @Valid SysNoticeType param){ + boolean result = sysNoticeTypeService.save(param); + return R.isTrue(result); + } + + /** + * 根据ID更新 + * @param param + * @return + */ + @SysLog(title = "公告类型",biz = BizType.UPDATE) + @PostMapping("/updateById") + @PreAuthorize("hasRole('sys:noticeType:update')") + public R updateById(@RequestBody @Valid SysNoticeType param){ + boolean result = sysNoticeTypeService.updateById(param); + return R.isTrue(result); + } + + /** + * 删除 + * @param id + * @return + */ + @SysLog(title = "公告类型",biz = BizType.DELETE) + @PostMapping("/deleteById/{id}") + @PreAuthorize("hasRole('sys:noticeType:delete')") + public R deleteById(@PathVariable("id") String id){ + boolean result = sysNoticeTypeService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysNoticeUserController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysNoticeUserController.java new file mode 100644 index 0000000..574ffef --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysNoticeUserController.java @@ -0,0 +1,75 @@ +package com.qs.serve.modules.sys.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.sys.entity.SysAttach; +import com.qs.serve.modules.sys.entity.SysNotice; +import com.qs.serve.modules.sys.entity.SysNoticeUser; +import com.qs.serve.modules.sys.service.SysAttachService; +import com.qs.serve.modules.sys.service.SysNoticeService; +import com.qs.serve.modules.sys.service.SysNoticeUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.List; + +/** + * 系统:公示(用户) + * @author YenHex + * @since 2022-03-01 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sys/noticeUser") +public class SysNoticeUserController { + + private SysNoticeUserService sysNoticeUserService; + + private SysNoticeService sysNoticeService; + + private SysAttachService sysAttachService; + + /** + * 查询列表 + * @param param + * @return + */ + @GetMapping("/page") + public R> getList(SysNoticeUser param){ + param.setUserId(AuthContextUtils.getSysUserId()); + Page page = PageUtil.getMbpPage(); + IPage list = sysNoticeUserService.list2(page,param); + return R.byMbpList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + SysNoticeUser sysNoticeUser = sysNoticeUserService.getById(id); + sysNoticeUser.setReadFlag(true); + sysNoticeUser.setReadCount(sysNoticeUser.getReadCount()==null?1:sysNoticeUser.getReadCount()+1); + sysNoticeUser.setReadTime(LocalDateTime.now()); + sysNoticeUserService.updateById(sysNoticeUser); + SysNotice notice = sysNoticeService.getById(sysNoticeUser.getNoticeId()); + if(CollectionUtil.isNotEmpty(notice.getDocIds())){ + List documents = sysAttachService.listByIds(Arrays.asList(notice.getDocIds())); + notice.setDocuments(documents); + } + return R.ok(notice); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysOperationLogController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysOperationLogController.java new file mode 100644 index 0000000..c83223d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysOperationLogController.java @@ -0,0 +1,80 @@ +package com.qs.serve.modules.sys.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qs.serve.common.framework.security.model.LoginUser; +import com.qs.serve.common.model.consts.GySysConst; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.sys.entity.SysOperationLog; +import com.qs.serve.modules.sys.service.SysOperationLogService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 系统:操作日志 + * @author YenHex + * @since 2022-03-08 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sys/operationLog") +public class SysOperationLogController { + + private SysOperationLogService sysOperationLogService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('sys:operationLog:query')") + public R> getList(SysOperationLog param){ + //操作日志详情,当前账号只能查当前帐号日志,超管账号可查询全部 + LoginUser loginUser = AuthContextUtils.getLoginUser(); + if(!loginUser.verifyRole(GySysConst.ROLE_ADMIN_OPT_LOG)){ + param.setUserId(loginUser.getUserId()); + } + PageUtil.startPage(); + QueryWrapper wrapper = new QueryWrapper<>(param); + if(PageUtil.getOrderProp()==null){ + wrapper.orderByDesc("create_time"); + } + List list = sysOperationLogService.list(wrapper); + return R.byPageHelperList(list); + } + + /** + * 翻页查询(个人) + * @param param + * @return + */ + @GetMapping("/pageSelf") + public R> pageSelf(SysOperationLog param){ + LoginUser loginUser = AuthContextUtils.getLoginUser(); + param.setUserId(loginUser.getUserId()); + return this.getList(param); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @PreAuthorize("hasRole('sys:operationLog:query')") + public R getById(@PathVariable("id") String id){ + SysOperationLog sysOperationLog = sysOperationLogService.getById(id); + return R.ok(sysOperationLog); + } + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysOperationManualController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysOperationManualController.java new file mode 100644 index 0000000..d139628 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysOperationManualController.java @@ -0,0 +1,147 @@ +package com.qs.serve.modules.sys.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.CollectionUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.sys.entity.SysAttach; +import com.qs.serve.modules.sys.service.SysAttachService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.sys.entity.SysOperationManual; +import com.qs.serve.modules.sys.service.SysOperationManualService; + +import javax.validation.Valid; +import java.util.Arrays; +import java.util.List; + +/** + * 系统 + * @author YenHex + * @since 2023-08-11 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sys/operationManual") +public class SysOperationManualController { + + private SysOperationManualService sysOperationManualService; + private SysAttachService attachService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + //@PreAuthorize("hasRole('sys:operationManual:query')") + public R> getList(SysOperationManual param){ + SysOperationManual entity = CopierUtil.copy(param,new SysOperationManual()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + List list = sysOperationManualService.list(lqw); + list.forEach(sysOperationManual->{ + if(CollectionUtil.isNotEmpty(sysOperationManual.getAttachIds())){ + List attachIds = Arrays.asList(sysOperationManual.getAttachIds()); + List attachList = attachService.listByIds(attachIds); + sysOperationManual.setAttachList(attachList); + } + }); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + //@PreAuthorize("hasRole('sys:operationManual:query')") + public R> getPage(SysOperationManual param){ + SysOperationManual entity = CopierUtil.copy(param,new SysOperationManual()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + PageUtil.startPage(); + List list = sysOperationManualService.list(lqw); + list.forEach(sysOperationManual->{ + if(CollectionUtil.isNotEmpty(sysOperationManual.getAttachIds())){ + List attachIds = Arrays.asList(sysOperationManual.getAttachIds()); + List attachList = attachService.listByIds(attachIds); + sysOperationManual.setAttachList(attachList); + } + }); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") +// @SysLog(module = SystemModule.${extend.moduleLog}, title = "", biz = BizType.QUERY) + //@PreAuthorize("hasRole('sys:operationManual:query')") + public R getById(@PathVariable("id") String id){ + SysOperationManual sysOperationManual = sysOperationManualService.getById(id); + if(CollectionUtil.isNotEmpty(sysOperationManual.getAttachIds())){ + List attachIds = Arrays.asList(sysOperationManual.getAttachIds()); + List attachList = attachService.listByIds(attachIds); + sysOperationManual.setAttachList(attachList); + } + return R.ok(sysOperationManual); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") +// @SysLog(module = SystemModule.${extend.moduleLog}, title = "", biz = BizType.UPDATE) + //@PreAuthorize("hasRole('sys:operationManual:update')") + public R updateById(@RequestBody @Valid SysOperationManual param){ + SysOperationManual entity = CopierUtil.copy(param,new SysOperationManual()); + boolean result = sysOperationManualService.updateById(entity); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") +// @SysLog(module = SystemModule.${extend.moduleLog}, title = "", biz = BizType.INSERT) + //@PreAuthorize("hasRole('sys:operationManual:insert')") + public R save(@RequestBody @Valid SysOperationManual param){ + SysOperationManual entity = CopierUtil.copy(param,new SysOperationManual()); + boolean result = sysOperationManualService.save(entity); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") +// @SysLog(module = SystemModule.${extend.moduleLog}, title = "", biz = BizType.DELETE) + //@PreAuthorize("hasRole('sys:operationManual:delete')") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = sysOperationManualService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysPermitController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysPermitController.java new file mode 100644 index 0000000..793c18b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysPermitController.java @@ -0,0 +1,86 @@ +package com.qs.serve.modules.sys.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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.util.CopierUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.TreeUtil; +import com.qs.serve.modules.sys.entity.SysPermit; +import com.qs.serve.modules.sys.entity.dto.SysPermitTreeNode; +import com.qs.serve.modules.sys.service.SysPermitService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 系统:权限 + * @author YenHex + * @since 2022-03-01 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sys/permit") +public class SysPermitController { + + private SysPermitService sysPermitService; + + /** + * 查询列表 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('sys:permit:query')") + public R> getList(SysPermit param){ + PageUtil.startPage(); + param.setHideFlag(0); + List list = sysPermitService.list(new QueryWrapper<>(param)); + return R.byPageHelperList(list); + } + + /** + * 树形列表 + * @return + */ + @GetMapping("/tree") + @PreAuthorize("hasRole('sys:permit:query')") + public R> getTree(){ + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysPermit::getHideFlag,0); + List list = sysPermitService.list(wrapper); + List treeNodes = list.stream().map(permit->{ + SysPermitTreeNode treeNode = CopierUtil.copy(permit,new SysPermitTreeNode()); + treeNode.setId(permit.getId()+""); + treeNode.setParentId(permit.getPid()); + treeNode.setSort(0); + return treeNode; + }).collect(Collectors.toList()); + treeNodes = TreeUtil.buildByRecursive(treeNodes,TreeUtil.DEFAULT_PID_STRING); + return R.ok(treeNodes); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @PreAuthorize("hasRole('sys:permit:query')") + public R getById(@PathVariable("id") String id){ + SysPermit sysPermit = sysPermitService.getById(id); + return R.ok(sysPermit); + } + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysPostController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysPostController.java new file mode 100644 index 0000000..a35f238 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysPostController.java @@ -0,0 +1,161 @@ +package com.qs.serve.modules.sys.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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.util.PageUtil; +import com.qs.serve.common.util.TreeUtil; +import com.qs.serve.modules.sys.entity.SysPost; +import com.qs.serve.modules.sys.entity.SysPostUser; +import com.qs.serve.modules.sys.entity.vo.SysPostTreeVo; +import com.qs.serve.modules.sys.service.SysDeptService; +import com.qs.serve.modules.sys.service.SysPostService; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.tag.entity.vo.TagCategoryTreeVo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 系统:职务 + * @author YenHex + * @since 2022-04-01 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sys/post") +public class SysPostController { + + private SysPostService sysPostService; + private SysPostUserService sysPostUserService; + + /** + * 列表查询 + * @param param + * @return + */ + @GetMapping("/tree") + public R> getList(SysPost param){ + List list = sysPostService.list(new QueryWrapper<>(param)); + List postUsers = sysPostUserService.list(); + + for (SysPost post : list) { + List puList = postUsers.stream().filter(a->a.getPostId().equals(post.getId())).collect(Collectors.toList()); + post.setPostUserList(puList); + } + + List treeVoList = list.stream().map(source->{ + SysPostTreeVo treeVo = new SysPostTreeVo(); + treeVo.setId(source.getId()); + treeVo.setPostName(source.getPostName()); + treeVo.setPostCode(source.getPostCode()); + treeVo.setPathIds(source.getPathIds()); + treeVo.setPathNames(source.getPathNames()); + treeVo.setRemark(source.getRemark()); + treeVo.setId(source.getId()); + treeVo.setParentId(source.getPid()); + treeVo.setPostUserList(source.getPostUserList()); + treeVo.setSort(0); + return treeVo; + }).collect(Collectors.toList()); + treeVoList = TreeUtil.buildByRecursive(treeVoList,TreeUtil.DEFAULT_PID_STRING); + return R.ok(treeVoList); + } + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('sys:post:query')") + public R> getPage(SysPost param){ + PageUtil.startPage(); + List list = sysPostService.list(new QueryWrapper<>(param)); + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(title = "职务",biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + SysPost sysPost = sysPostService.getById(id); + if(!sysPost.getPid().equals("0")){ + sysPost.setParentInfo(sysPostService.getById(id)); + } + return R.ok(sysPost); + } + + + /** + * 根据ID更新 + * @param param + * @return + */ + @SysLog(title = "职务",biz = BizType.UPDATE) + @PostMapping("/updateById") + public R updateById(@RequestBody @Valid SysPost param){ + if(param.getId()==null){ + return R.error2(); + } + sysPostService.modify(param); + sysPostService.flushPathIds(); + return R.ok(); + } + + /** + * 刷新岗位ID路径 + * @return + */ + @GetMapping("/flushPathIds") + public R flushPathIds(){ + sysPostService.flushPathIds(); + return R.ok(); + } + + /** + * 新增系统职务 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(title = "职务",biz = BizType.INSERT) + public R save(@RequestBody @Valid SysPost param){ + param.setId(null); + sysPostService.modify(param); + sysPostService.flushPathIds(); + return R.ok(param); + } + + /** + * 删除系统职务 + * @param id + * @return + */ + @SysLog(title = "职务",biz = BizType.DELETE) + @DeleteMapping("/deleteById/{id}") + public R deleteById(@PathVariable("id") String id){ + LambdaQueryWrapper postLqw = new LambdaQueryWrapper<>(); + postLqw.eq(SysPost::getPid,id); + if(sysPostService.count(postLqw)>0){ + return R.error("含有子节点,无法删除"); + } + boolean result = sysPostService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysPostUserController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysPostUserController.java new file mode 100644 index 0000000..4247e13 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysPostUserController.java @@ -0,0 +1,107 @@ +package com.qs.serve.modules.sys.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.sys.entity.so.SysPostUserSo; +import com.qs.serve.modules.sys.entity.bo.SysPostUserBo; +import com.qs.serve.modules.sys.entity.SysPostUser; +import com.qs.serve.modules.sys.service.SysPostUserService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 系统 系统职务 + * @author YenHex + * @since 2023-04-27 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sys/postUser") +public class SysPostUserController { + + private SysPostUserService sysPostUserService; + + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(SysPostUserSo param){ + SysPostUser entity = CopierUtil.copy(param,new SysPostUser()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + PageUtil.startPage(); + List list = sysPostUserService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(SysPostUserSo param){ + SysPostUser entity = CopierUtil.copy(param,new SysPostUser()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); +// PageUtil.startPage(); + List list = sysPostUserService.list(lqw); + return R.ok(list); + } + + /** + * ID查询 + * @param id + * @return + */ + //@GetMapping("/getById/{id}") + @SysLog(module = SystemModule.SYSTEM, title = "系统职务", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + SysPostUser sysPostUser = sysPostUserService.getById(id); + return R.ok(sysPostUser); + } + + + /** + * 绑定用户与职务 + * @param param + * @return + */ + @PostMapping("/bind") + @SysLog(module = SystemModule.SYSTEM, title = "系统职务", biz = BizType.INSERT) + public R save(@RequestBody @Valid SysPostUserBo param){ + sysPostUserService.bind(param); + return R.ok(); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.SYSTEM, title = "系统职务", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = sysPostUserService.removeByIds(idsLong); + return R.isTrue(result); + } + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysRoleController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysRoleController.java new file mode 100644 index 0000000..3e55ed5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysRoleController.java @@ -0,0 +1,224 @@ +package com.qs.serve.modules.sys.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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.util.PageUtil; +import com.qs.serve.modules.sys.entity.SysRole; +import com.qs.serve.modules.sys.entity.SysRoleMenu; +import com.qs.serve.modules.sys.entity.SysUserRole; +import com.qs.serve.modules.sys.entity.dto.SysRoleMenuParam; +import com.qs.serve.modules.sys.entity.dto.SysRoleUserParam; +import com.qs.serve.modules.sys.entity.dto.UserRole4EditParam; +import com.qs.serve.modules.sys.service.SysRoleMenuService; +import com.qs.serve.modules.sys.service.SysRoleService; +import com.qs.serve.modules.sys.service.SysUserRoleService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; + +/** + * 系统:角色 + * @author YenHex + * @since 2022-03-01 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sys/role") +public class SysRoleController { + + private SysRoleService sysRoleService; + private SysRoleMenuService sysRoleMenuService; + private SysUserRoleService sysUserRoleService; + + /** + * 查询列表(用于人员编辑) + * @return + */ + @GetMapping("/list4UserEdit") + public R> getList(){ + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysRole::getUserVisible,1); + wrapper.eq(SysRole::getEnable,1); + List list = sysRoleService.list(wrapper); + return R.ok(list); + } + + /** + * 查询列表 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('sys:role:query')") + public R> getPage(SysRole param){ + PageUtil.startPage(); + List list = sysRoleService.list(new QueryWrapper<>(param)); + return R.byPageHelperList(list); + } + + /** + * 查询列表 + * @param param + * @return + */ + @GetMapping("/list") + @PreAuthorize("hasRole('sys:role:query')") + public R> getList(SysRole param){ + List list = sysRoleService.list(new QueryWrapper<>(param)); + return R.ok(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @PreAuthorize("hasRole('sys:role:query')") + public R getById(@PathVariable("id") String id){ + SysRole sysRole = sysRoleService.getById(id); + sysRole.setMenuList(sysRoleMenuService.listByRoleId(id)); + return R.ok(sysRole); + } + + /** + * 保存角色 + * @param param + * @return + */ + @SysLog(title = "角色",biz = BizType.INSERT) + @PostMapping("/save") + @PreAuthorize("hasRole('sys:role:insert')") + public R save(@RequestBody @Valid SysRole param){ + param.setIsDefault(null); + boolean result = sysRoleService.save(param); + return R.isTrue(result); + } + + /** + * 根据ID更新角色 + * @param param + * @return + */ + @SysLog(title = "角色",biz = BizType.UPDATE) + @PostMapping("/updateById") + @PreAuthorize("hasRole('sys:role:update')") + public R updateById(@RequestBody @Valid SysRole param){ + SysRole sysRole = sysRoleService.getById(param.getId()); + if(sysRole.getIsDefault().equals(1)){ + return R.error("系统默认角色不可修改"); + } + param.setIsDefault(null); + boolean result = sysRoleService.updateById(param); + return R.isTrue(result); + } + + /** + * 删除角色 + * @param id + * @return + */ + @SysLog(title = "角色",biz = BizType.DELETE) + @PostMapping("/deleteById/{id}") + @PreAuthorize("hasRole('sys:role:delete')") + public R deleteById(@PathVariable("id") String id){ + SysRole sysRole = sysRoleService.getById(id); + if(sysRole.getIsDefault().equals(1)){ + return R.error("系统默认角色不可删除"); + } + boolean result = sysRoleService.removeById(id); + sysRoleMenuService.removeByRoleId(id,null); + return R.isTrue(result); + } + + + /** + * 角色菜单授权 + * @param param + * @return + */ + @SysLog(title = "角色",desc ="菜单授权",biz = BizType.GRANT) + @PostMapping("/saveRoleMenu") + @PreAuthorize("hasRole('sys:permit:grant')") + @Transactional(rollbackFor = Exception.class) + public R grantRoleMenu(@RequestBody @Valid SysRoleMenuParam param){ + sysRoleMenuService.removeByRoleId(param.getRoleId(),param.getClientType()); + List roleMenus = new ArrayList<>(); + for (String menuId : param.getMenuIds()) { + SysRoleMenu sysRoleMenu = new SysRoleMenu(); + sysRoleMenu.setRoleId(param.getRoleId()); + sysRoleMenu.setMenuId(menuId); + roleMenus.add(sysRoleMenu); + } + sysRoleMenuService.saveBatch(roleMenus); + return R.isTrue(true); + } + + /** + * 添加用户授权 + * @param param + * @return + */ + @SysLog(title = "角色",desc ="保存用户授权",biz = BizType.GRANT) + @PostMapping("/saveUserRole") + @PreAuthorize("hasRole('sys:userRole:grant')") + @Transactional(rollbackFor = Exception.class) + public R grantUser(@RequestBody @Valid SysRoleUserParam param){ + SysRole sysRole = sysRoleService.getById(param.getRoleId()); + if(sysRole.getIsDefault().equals(1)){ + return R.error("应用所有用户的系统默认角色,无需授权"); + } + List sysUserRoles = new ArrayList<>(); + List uids = sysUserRoleService.notDataUserIds(param.getRoleId(),param.getUserIds()); + for (String userId : uids) { + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(userId); + userRole.setRoleId(param.getRoleId()); + sysUserRoles.add(userRole); + } + sysUserRoleService.saveBatch(sysUserRoles); + return R.isTrue(true); + } + + /** + * 编辑页面关联用户角色 + * @param param + * @return + */ + @SysLog(title = "角色",desc ="编辑用户授权",biz = BizType.GRANT) + @PostMapping("/saveUserRole4Edit") + @PreAuthorize("hasRole('sys:userRole:editGrant')") + @Transactional(rollbackFor = Exception.class) + public R saveUserRole4Edit(@RequestBody @Valid UserRole4EditParam param){ + List roleIds = param.getRoleIds(); + String userId = param.getUserId(); + sysRoleService.saveUserRole4Edit(roleIds,userId); + return R.isTrue(true); + } + + /** + * 删除用户授权 + * @param sysRoleUserParam + * @return + */ + @SysLog(title = "角色",desc ="移除用户授权",biz = BizType.GRANT) + @PostMapping("/removeUserRole") + @PreAuthorize("hasRole('sys:userRole:delete')") + public R deleteById(@RequestBody @Valid SysRoleUserParam sysRoleUserParam){ + sysUserRoleService.remove(sysRoleUserParam.getRoleId(),sysRoleUserParam.getUserIds()); + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysTenantController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysTenantController.java new file mode 100644 index 0000000..2218438 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysTenantController.java @@ -0,0 +1,98 @@ +package com.qs.serve.modules.sys.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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.util.PageUtil; +import com.qs.serve.modules.sys.entity.SysTenant; +import com.qs.serve.modules.sys.service.SysTenantService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * 系统:租户 + * @author YenHex + * @since 2022-03-01 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sys/tenant") +public class SysTenantController { + + private SysTenantService sysTenantService; + + /** + * 查询列表 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('sys:tenant:query')") + public R> getList(SysTenant param){ + PageUtil.startPage(); + List list = sysTenantService.list(new QueryWrapper<>(param)); + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @SysLog(title = "租户",biz = BizType.QUERY) + @GetMapping("/getById/{id}") + @PreAuthorize("hasRole('sys:tenant:query')") + public R getById(@PathVariable("id") String id){ + SysTenant sysTenant = sysTenantService.getById(id); + return R.ok(sysTenant); + } + + /** + * 保存 + * @param param + * @return + */ + @SysLog(title = "租户",biz = BizType.INSERT) + @PostMapping("/save") + @PreAuthorize("hasRole('sys:tenant:insert')") + public R save(@RequestBody @Valid SysTenant param){ + boolean result = sysTenantService.save(param); + return R.isTrue(result); + } + + /** + * 根据ID更新 + * @param param + * @return + */ + @SysLog(title = "租户",biz = BizType.UPDATE) + @PostMapping("/updateById") + @PreAuthorize("hasRole('sys:tenant:update')") + public R updateById(@RequestBody @Valid SysTenant param){ + boolean result = sysTenantService.updateById(param); + return R.isTrue(result); + } + + /** + * 删除 + * @param id + * @return + */ + @SysLog(title = "租户",biz = BizType.DELETE) + @PostMapping("/deleteById/{id}") + @PreAuthorize("hasRole('sys:tenant:delete')") + public R deleteById(@PathVariable("id") String id){ + boolean result = sysTenantService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysUserController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysUserController.java new file mode 100644 index 0000000..0bf2f74 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/SysUserController.java @@ -0,0 +1,679 @@ +package com.qs.serve.modules.sys.controller; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.github.pagehelper.PageHelper; +import com.qs.serve.common.framework.security.model.LoginUser; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.consts.GySysConst; +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.util.*; +import com.qs.serve.modules.oms.entity.bo.SysFlowCancelBo; +import com.qs.serve.modules.oms.entity.bo.SysFlowLeaveBo; +import com.qs.serve.modules.oms.entity.bo.SysFlowUserBo; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.*; +import com.qs.serve.modules.sys.entity.bo.*; +import com.qs.serve.modules.sys.entity.dto.*; +import com.qs.serve.modules.sys.mapper.SysMenuMapper; +import com.qs.serve.modules.sys.service.*; +import com.qs.serve.modules.sys.service.impl.SysUserFlowApplication; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.wx.entity.WxUser; +import com.qs.serve.modules.wx.service.WxUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 系统:用户 + * @author YenHex + * @since 2022-03-01 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("sys/user") +public class SysUserController { + + private SysUserService sysUserService; + private SysDeptService sysDeptService; + private SysPostService sysPostService; + private SysRoleService sysRoleService; + private WxUserService wxUserService; + private SysUserSalesService sysUserSalesService; + private final SysMenuMapper sysMenuMapper; + private final SysUserFlowApplication sysUserFlowApplication; + + /** + * 检查是否默认密码 + * @return true;false字符串 + */ + @GetMapping("/checkDefaultPassword") + public R checkDefaultPassword(){ + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + if(sysUser.getPassword().equals("25d55ad283aa400af464c76d713c07ad")){ + return R.ok("true","ok"); + } + return R.ok("false","ok"); + } + + /** + * 获取致远用户 + * @param code + * @return + */ + @GetMapping("/getSyUser") + public R getSyUser(String code){ + SeeYonRequestBaseService service = SpringUtils.getBean(SeeYonRequestBaseService.class); + if(!StringUtils.hasText(code)){ + return R.ok(); + } + R rs = service.getBase(TbsSeeYonConst.OA_USER_INFO+"?code="+code,null); + String listJson = rs.getMsg(); + if(listJson.equals("null")){ + return R.error("无相关工号的员工信息:"+code); + } + return R.ok(JSONUtil.parse(listJson)); + } + + /** + * 获取致远用户列表 + * @param code + * @return + */ + @GetMapping("/getSyUserList") + public R getSyUserList(String code){ + SeeYonRequestBaseService service = SpringUtils.getBean(SeeYonRequestBaseService.class); + if(!StringUtils.hasText(code)){ + return R.ok(); + } + R rs = service.getBase(TbsSeeYonConst.OA_USER_LIST+"?code="+code,null); + String listJson = rs.getMsg(); + return R.ok(JSONUtil.parseArray(listJson)); + } + + + @GetMapping("/getChildList") + public R> getChildList(){ + List postUsers = sysUserService.listByChildIds(AuthContextUtils.getSysUserId()); + return R.ok(postUsers); + } + + /** + * 树查询 + * @return + */ + @GetMapping("/tree") + @PreAuthorize("hasRole('sys:user:query')") + public R> getTree(){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SysUser::getSalesFlag,1); + List sysUsers = sysUserService.list(lqw); + List userSales = sysUserSalesService.list(); + for (SysUser sysUser : sysUsers) { + sysUser.setParentId("0"); + for (SysUserSales userSale : userSales) { + if(sysUser.getId().equals(userSale.getUserId())){ + sysUser.setParentId(userSale.getPid()); + break; + } + } + } + List treeVoList = sysUsers.stream().map(sysUser->{ +// SysDept sysDept = sysDeptService.getById(sysUser.getDeptId()); + SysUserSalesTreeVo treeNode = CopierUtil.copy(sysUser,new SysUserSalesTreeVo()); + treeNode.setId(sysUser.getId()); + treeNode.setParentId(sysUser.getParentId()); + treeNode.setSort(0); +// if(sysDept!=null){ +// treeNode.setDeptName(sysDept.getName()); +// } + return treeNode; + }).collect(Collectors.toList()); + treeVoList = TreeUtil.buildByRecursive(treeVoList,TreeUtil.DEFAULT_PID_STRING); + return R.ok(treeVoList); + } + + + /** + * (个人)登录信息 + * @return + */ + @PostMapping("/info") + public R info(){ + LoginUser loginUser = AuthContextUtils.getLoginUser(); + SysUser sysUser = sysUserService.getById(loginUser.getUserId()); + sysUser.setAuthorList(loginUser.getAuthorList()); + //解决H5页面权限不刷新 + List defaultRole = sysRoleService.getDefaultRole(); + List defaultRoleIds = defaultRole.stream().map(SysRole::getId).collect(Collectors.toList()); + List menuIds = sysMenuMapper.searchUserMenuIds(sysUser.getId()); + List defaultRoleMenuIds = sysMenuMapper.searchDefaultMenuIds(defaultRoleIds); + menuIds.addAll(defaultRoleMenuIds); + //sysUser.setAuthorIds(loginUser.getAuthorIds()); + sysUser.setAuthorIds(menuIds); + SysUserVo sysUserVo = sysUser.toSysUserVo(false); + SysDept dept = sysDeptService.getById(sysUser.getDeptId()); + sysUserVo.setDeptInfo(dept); + + //SysPost sysPost = sysPostService.getById(sysUser.getPositionId()); + //sysUserVo.setPostInfo(sysPost); + return R.ok(sysUserVo); + } + + + /** + * (个人)更新OA密码 + * @param param + * @return + */ + @SysLog(title = "人员",desc = "个人密码更新",biz = BizType.UPDATE) + @PostMapping("/updateOAPwd") + public R updateOAPwd(@RequestBody SysUserPwdParam param){ + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + sysUserService.updateSeeYonPassword(sysUser.getSyUserId(),param.getNewPassword()); + return R.ok(); + } + + /** + * (个人)密码更新H5 + * @param param + * @return + */ + @SysLog(title = "人员",desc = "个人密码更新",biz = BizType.UPDATE) + @PostMapping("/updatePwdH5") + public R updatePwdH5(@RequestBody SysUserPwdParam param){ + LoginUser loginUser = AuthContextUtils.getLoginUser(); + SysUser sysUser = new SysUser(); + sysUser.setId(loginUser.getUserId()); + sysUser.setPassword(SecureUtil.md5(param.getNewPassword())); + sysUser.setUpdateTime(LocalDateTime.now()); + sysUserService.updateById(sysUser); + //sysUserService.updateSeeYonPassword(sysUser.getSyUserId(),param.getNewPassword()); + return R.ok(); + } + + /** + * (个人)密码更新 + * @param param + * @return + */ + @SysLog(title = "人员",desc = "个人密码更新",biz = BizType.UPDATE) + @PostMapping("/updatePwd") + public R updatePwd(@RequestBody @Valid SysUserPwdParam param){ + LoginUser loginUser = AuthContextUtils.getLoginUser(); + SysUser dbUser = sysUserService.getById(loginUser.getUserId()); + if(dbUser.getPassword().equalsIgnoreCase(SecureUtil.md5(param.getOldPassword()))){ + SysUser sysUser = new SysUser(); + sysUser.setId(loginUser.getUserId()); + sysUser.setPassword(SecureUtil.md5(param.getNewPassword())); + sysUser.setUpdateTime(LocalDateTime.now()); + sysUserService.updateById(sysUser); + return R.ok(); + } + return R.error(); + } + + /** + * 信息详细 + * @return + */ + @GetMapping("/detail") + public R detail(){ + LoginUser loginUser = AuthContextUtils.getLoginUser(); + SysUser sysUser = sysUserService.getById(loginUser.getUserId()); + sysUser.setAuthorIds(loginUser.getAuthorIds()); + sysUser.setAuthorList(loginUser.getAuthorList()); + sysUserService.relateInfo(sysUser,true); + sysUser.setPassword(null); + return R.ok(sysUser); + } + + + + /** + * 翻页查询 + * @param param + * @return + */ + @PostMapping("/page") + @PreAuthorize("hasRole('sys:user:query')") + public R> getPage(@RequestBody SysUser param){ + param.setTenantId(AuthContextUtils.getTenant()); + if(CollectionUtil.isNotEmpty(param.getMultiDeptIds()) && param.getLoadChildDept()!=null && param.getLoadChildDept().equals(GySysConst.STATUS_YES_1)){ + List deptList = sysDeptService.listDeptByIds(param.getMultiDeptIds(),param.getLoadChildDept().equals(GySysConst.STATUS_YES_1)); + List deptIds = deptList.stream().map(SysDept::getId).distinct().collect(Collectors.toList()); + param.setMultiDeptIds(deptIds); + } + //PageUtil.startPage(); + PageHelper.startPage(param.getPageNum(),param.getPageSize()); + List list = sysUserService.listUser(param); + //前端页面展示参数 + list.forEach(a->sysUserService.relateInfo(a,false)); + return R.byPageHelperList(list); + } + + + /** + * 列表查询 + * @param param + * @return + */ + @GetMapping("/list") + @PreAuthorize("hasRole('sys:user:query')") + public R> getList(SysUser param){ + param.setTenantId(AuthContextUtils.getTenant()); + if(CollectionUtil.isNotEmpty(param.getMultiDeptIds()) && param.getLoadChildDept()!=null && param.getLoadChildDept().equals(GySysConst.STATUS_YES_1)){ + List deptList = sysDeptService.listDeptByIds(param.getMultiDeptIds(),param.getLoadChildDept().equals(GySysConst.STATUS_YES_1)); + List deptIds = deptList.stream().map(SysDept::getId).distinct().collect(Collectors.toList()); + param.setMultiDeptIds(deptIds); + } + List list = sysUserService.listUser(param); + for (SysUser sysUser : list) { + sysUser.setPassword(null); + List wxUserList = wxUserService.getBySysUserId(sysUser.getId()); + sysUser.setWxUserInfoList(wxUserList); + } + return R.ok(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @SysLog(title = "人员",desc = "用户查询",biz = BizType.QUERY) + @GetMapping("/getById/{id}") + @PreAuthorize("hasRole('sys:user:query')") + public R getById(@PathVariable("id") String id){ + SysUser sysUser = sysUserService.getById(id); + if(sysUser==null){ + return R.ok(); + } + sysUser.setPassword(null); + sysUserService.relateInfo(sysUser,true); + List wxUserList = wxUserService.getBySysUserId(sysUser.getId()); + sysUser.setWxUserInfoList(wxUserList); + return R.ok(sysUser); + } + + /** + * 保存 + * @param userBo + * @return + */ + @SysLog(title = "人员",desc = "用户新增",biz = BizType.INSERT) + @PostMapping("/save") + @PreAuthorize("hasRole('sys:user:insert')") + @Transactional(rollbackFor = Exception.class) + public R save(@RequestBody @Valid SysUserBo userBo){ + SysUser param = CopierUtil.copy(userBo,new SysUser()); + param.setAccount(userBo.getCode()); + param.setSyAccount(userBo.getCode()); + //设置普通管理员 + param.setSuperFlag(0); + param.setTenantId(AuthContextUtils.getTenant()); + //检查手机号是否已用 + LambdaQueryWrapper wrapperCode = new LambdaQueryWrapper<>(); + wrapperCode.eq(SysUser::getCode,param.getCode()); + Long countCode = sysUserService.count(wrapperCode); + if(countCode>0L){ + return R.error("工号已被注册"); + } + //检查手机号是否已用 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysUser::getMobile,param.getMobile()); + wrapper.ne(SysUser::getServingState,0); + Long count = sysUserService.count(wrapper); + if(count>0L){ + return R.error("手机号已被注册"); + } + param.setPassword(SecureUtil.md5(GySysConst.DEFAULT_PASSWORD)); + if(param.getSyUserId()==null){ + param.setSyUserId(""); + } + if(param.getSyAccount()==null){ + param.setSyAccount(userBo.getCode()); + } + if(!StringUtils.hasText(param.getId())) { + param.setId("SU" + IdUtil.getSnowFlakeId()); + } + param.setServingState(0); + param.setId("SU"+IdUtil.getSnowFlakeId()); + param.setServingState(1); + boolean result = sysUserService.save(param); +// if(param.getId()!=null&& com.qs.serve.common.util.CollectionUtil.isNotEmpty(userBo.getRoleIds())){ +// sysRoleService.saveUserRole4Edit(userBo.getRoleIds(),param.getId()); +// } + return R.isTrue(result); + } + + /** + * 更新 + * @param userBo + * @return + */ + @SysLog(title = "人员",desc = "用户更新",biz = BizType.UPDATE) + @PostMapping("/updateById") + @PreAuthorize("hasRole('sys:user:update')") + @Transactional(rollbackFor = Exception.class) + public R updateById(@RequestBody SysUserBo userBo){ + SysUser param = CopierUtil.copy(userBo,new SysUser()); + param.setCode(null); +// if(param.getLoginEnable()!=null){ +// param.setServingState(param.getLoginEnable()==1?1:0); +// } +// if(param.getSyUserId()==null){ +// param.setSyUserId(""); +// } +// if(param.getSyAccount()==null){ +// param.setSyAccount(""); +// } + param.setSuperFlag(null); + param.setPassword(null); + param.setUpdateTime(LocalDateTime.now()); + boolean result = sysUserService.updateById(param); + return R.isTrue(result); + } + + /** + * 修改销售人员状态 + * @param userBo + * @return + */ + @SysLog(title = "人员",desc = "用户更新",biz = BizType.UPDATE) + @PostMapping("/updateSalesFlag") + @PreAuthorize("hasRole('sys:user:update')") + @Transactional(rollbackFor = Exception.class) + public R updateSalesFlag(@RequestBody @Valid SysUserSalesParam userBo){ + LambdaQueryWrapper lqwSale = new LambdaQueryWrapper<>(); + lqwSale.in(SysUserSales::getPid,userBo.getUserIds()); + if(sysUserSalesService.count(lqwSale)>0){ + return R.error("含有下级销售人员,操作失败"); + } + SysUser param = new SysUser(); + param.setSalesFlag(userBo.getSalesFlag().equals(0)?0:1); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(SysUser::getId,userBo.getUserIds()); + sysUserService.update(param,lqw); + if(param.getSalesFlag().equals(0)){ + sysUserSalesService.removeBatchByIds(userBo.getUserIds()); + }else { + List existList = sysUserSalesService.listByIds(userBo.getUserIds()); + List insertList = new ArrayList<>(); + for (String userId : userBo.getUserIds()) { + boolean exist = false; + for (SysUserSales userSales : existList) { + if(userId.equals(userSales.getUserId())){ + exist = true; + break; + } + } + if(!exist){ + SysUserSales userSale = new SysUserSales(); + userSale.setUserId(userId); + userSale.setPid("0"); + userSale.setPathIds("0_"+userId); + insertList.add(userSale); + } + } + sysUserSalesService.saveBatch(insertList); + } + return R.ok(); + } + + /** + * 用户path_ids初始化 + * @return + */ + @SysLog(title = "人员",desc = "用户path_ids初始化",biz = BizType.UPDATE) + @PostMapping("/initSalesParentPathIds") + @PreAuthorize("hasRole('sys:user:update')") + @Transactional(rollbackFor = Exception.class) + public R updateSalesParent(){ + LambdaQueryWrapper lqwSale = new LambdaQueryWrapper<>(); + lqwSale.eq(SysUserSales::getPid,"0"); + List userSales = sysUserSalesService.list(lqwSale); + userSales.forEach(a->{ + a.setPathIds("0_"+a.getUserId()); + }); + sysUserSalesService.updateBatchById(userSales); + initPath(userSales); + return R.ok(); + } + + + private void initPath(List pSales){ + pSales.forEach(p->{ + LambdaQueryWrapper lqwSale = new LambdaQueryWrapper<>(); + lqwSale.eq(SysUserSales::getPid,p.getUserId()); + List userSales = sysUserSalesService.list(lqwSale); + userSales.forEach(a->{ + a.setPathIds(p.getPathIds()+"_"+a.getUserId()); + }); + sysUserSalesService.updateBatchById(userSales); + + initPath(userSales); + }); + } + + /** + * 修改销售人员上下级 + * @param userBo + * @return + */ + @SysLog(title = "人员",desc = "用户更新",biz = BizType.UPDATE) + @PostMapping("/updateSalesParent") + @PreAuthorize("hasRole('sys:user:update')") + @Transactional(rollbackFor = Exception.class) + public R updateSalesParent(@RequestBody @Valid SysUserParentParam userBo){ + final String pid = userBo.getParentId(); + final List userIds = new ArrayList<>(); + userIds.addAll(userBo.getUserIds()); + if(!pid.equals("0")){ + userIds.add(pid); + } + List sysUserList = sysUserService.listByIds(userIds); + for (SysUser sysUser : sysUserList) { + if(sysUser.getSalesFlag().equals(0)){ + return R.error("["+sysUser.getName()+"]未设置销售属性"); + } + } + List updateAllList = new ArrayList<>(); + if(pid.equals("0")){ + //清除父级,还原回一级 + List sysUserSales = sysUserSalesService.listByIds(userBo.getUserIds()); + List updateList = this.updateSalesLevel(pid, "0", sysUserSales); + updateAllList.addAll(updateList); + }else { + SysUserSales parent = sysUserSalesService.getById(pid); + List sysUserSales = sysUserSalesService.listByIds(userBo.getUserIds()); + List updateList = this.updateSalesLevel(pid, parent.getPathIds(), sysUserSales); + updateAllList.addAll(updateList); + } + sysUserSalesService.updateBatchById(updateAllList); + return R.ok(); + } + + /** + * 更新id路径 + * @param pid + * @param newPrefixPath + * @param sysUserSales + * @return + */ + private List updateSalesLevel(String pid,String newPrefixPath,List sysUserSales) { + + List updateList = new ArrayList<>(); + for (SysUserSales userSale : sysUserSales) { + if(newPrefixPath.contains("_"+userSale.getUserId())){ + Assert.throwEx("不能选择该人员,上下级死循环"); + } + String pathIds = userSale.getPathIds(); + userSale.setPathIds(newPrefixPath+"_"+userSale.getUserId()); + userSale.setPid(pid); + updateList.add(userSale); + + //更新子节点 + if(pathIds.lastIndexOf(userSale.getUserId())<0){ + return updateList; + } + String oldPrefixPath = pathIds.substring(0,pathIds.lastIndexOf("_"+userSale.getUserId())-1); + log.info(oldPrefixPath); + List childList = sysUserSalesService.listByPathId(pathIds); + for (SysUserSales childNode : childList) { + String childPathIds = newPrefixPath + childNode.getPathIds().replace(oldPrefixPath, ""); + childNode.setPathIds(childPathIds); + updateList.add(childNode); + } + + } + return updateList; + } + + /** + * 删除 + * @param id + * @return + */ + @SysLog(title = "人员",desc = "用户删除",biz = BizType.DELETE) + @PostMapping("/deleteById/{id}") + @PreAuthorize("hasRole('sys:user:delete')") + public R deleteById(@PathVariable("id") String id){ + boolean result = sysUserService.removeById(id); + return R.isTrue(result); + } + + /** + * 重置密码 + * @param uid + * @return + */ + @SysLog(title = "人员",desc = "重置密码",biz = BizType.RESET) + @PostMapping("/resetPwd/{uid}") + @PreAuthorize("hasRole('sys:user:reset')") + public R resetPwd(@PathVariable("uid") String uid){ + SysUser sysUser = sysUserService.getById(uid); +// if(sysUser.getSuperFlag().equals(1)){ +// Assert.throwEx("最高级管理员不可重置密码"); +// } + SysUser sysUser1 = new SysUser(); + sysUser1.setId(uid); + sysUser1.setPassword(SecureUtil.md5(GySysConst.DEFAULT_PASSWORD)); + sysUserService.updateById(sysUser1); + return R.ok(); + } + + /** + * 人员离职(更新即将离职信息) + * @param userLeaveParam + * @return + */ + @SysLog(title = "人员",desc = "离职调整",biz = BizType.LEAVE) + @PostMapping("/leave") + //@PreAuthorize("hasRole('sys:user:leave')") + public R leave(@RequestBody @Valid SysUserLeaveBo userLeaveParam){ + sysUserService.leave(userLeaveParam); + return R.ok(); + } + + + /** + * 取消离职 + * @param uid + * @return + */ + @SysLog(title = "人员",desc = "取消离职",biz = BizType.RESET) + @PostMapping("/cancelLeave/{uid}") + //@PreAuthorize("hasRole('sys:user:leave')") + public R cancelLeave(@PathVariable("uid") String uid){ + sysUserService.cancelLeave(uid); + return R.ok(); + } + + /** + * 重新入职 + * @param uid + * @return + */ + @SysLog(title = "人员",desc = "重新入职",biz = BizType.RESET) + @PostMapping("/reEntry/{uid}") + //@PreAuthorize("hasRole('sys:user:leave')") + public R reEntry(@PathVariable("uid") String uid){ + sysUserService.reEntry(uid); + return R.ok(); + } + + /** + * 人员立刻离职 + * @param userId + * @return + */ + @SysLog(title = "人员",desc = "离职调整",biz = BizType.LEAVE) + @PostMapping("/leaveNow") + public R leaveNow(String userId){ + sysUserService.leaveNow(Arrays.asList(userId),true); + return R.ok(); + } + + /** + * 设置数据的继承人 + * @param param + */ + @PostMapping("/extendTranData") + @Transactional(rollbackFor = Exception.class) + public R updateCostExtUserByCostIds(@RequestBody SysFlowLeaveBo param){ + if(param.getTargetTypeNum().equals(1)){ + sysUserFlowApplication.updateCostExtUserByCostIds(param.getTargetIds(),param.getUserId()); + }else if (param.getTargetTypeNum().equals(2)){ + sysUserFlowApplication.updateCostExtUserByPolicyIds(param.getTargetIds(),param.getUserId()); + } + return R.ok(); + } + + /** + * 取消继承人 + * @param param + */ + @PostMapping("/cancelTranData") + @Transactional(rollbackFor = Exception.class) + public R cancelCostExtUserByCostId(SysFlowCancelBo param){ + if(param.getTargetTypeNum().equals(1)){ + sysUserFlowApplication.cancelCostExtUserByCostIds(param.getTargetIds()); + }else if (param.getTargetTypeNum().equals(2)){ + sysUserFlowApplication.cancelCostExtUserByPolicyIds(param.getTargetIds()); + } + return R.ok(); + } + + + /** + * 人员业务交接 + * @param param + */ + @PostMapping("/extendTranUser") + @Transactional(rollbackFor = Exception.class) + public R extendTranData(SysFlowUserBo param){ + if(param.getTargetTypeNum().equals(1)){ + sysUserFlowApplication.tranCostApplyAndVerification(param.getUserId(),param.getExtendUserId()); + }else if (param.getTargetTypeNum().equals(2)){ + sysUserFlowApplication.tranPolicy(param.getUserId(), param.getExtendUserId()); + } + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/api/SysDictApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/api/SysDictApi.java new file mode 100644 index 0000000..9ca6d8f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/controller/api/SysDictApi.java @@ -0,0 +1,69 @@ +package com.qs.serve.modules.sys.controller.api; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.enums.BizType; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.sys.controller.SysAttachController; +import com.qs.serve.modules.sys.entity.SysDict; +import com.qs.serve.modules.sys.entity.SysDictData; +import com.qs.serve.modules.sys.service.SysDictDataService; +import com.qs.serve.modules.sys.service.SysDictService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * API系统 字典 + * @author YenHex + * @since 2022-05-20 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("api/dict") +public class SysDictApi { + + private SysDictDataService sysDictDataService; + + private SysAttachController attachController; + + /** + * 列表查询 + * @param group 分组key + * @return + */ + @GetMapping("/list") + public R getList(String group){ + if(StringUtils.hasEmpty(group)){ + return R.error("查询参数为空"); + } + LambdaQueryWrapper dictWrapper = new LambdaQueryWrapper<>(); + dictWrapper.eq(SysDictData::getGroupKey,group); + dictWrapper.orderByDesc(SysDictData::getSort); + List list = sysDictDataService.list(dictWrapper); + return R.ok(list); + } + + /** + * 附件上传 + * @param request + * @return + */ + @PostMapping("/upload") + public R upload(HttpServletRequest request){ + return attachController.upload(request); + } + + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysAttach.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysAttach.java new file mode 100644 index 0000000..dce3569 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysAttach.java @@ -0,0 +1,70 @@ +package com.qs.serve.modules.sys.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; + +/** + * 系统附件 实体类 + * @author YenHex + * @since 2022-03-24 + */ +@Data +@TableName("sys_attach") +public class SysAttach implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 文件名称 */ + private String name; + + /** 保存路径 */ + private String path; + + /** 大小 */ + private Long size; + + /** 文件类型 */ + private String fileType; + + private String relativePath; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + private String tenantId; + + /** 删除标识 */ + @NotNull(message = "删除标识不能为空") + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysBusinessLog.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysBusinessLog.java new file mode 100644 index 0000000..fa3eac2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysBusinessLog.java @@ -0,0 +1,147 @@ +package com.qs.serve.modules.sys.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 2023-04-25 + */ +@Data +@TableName("sys_business_log") +public class SysBusinessLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 用户id */ + @Length(max = 255,message = "用户id长度不能超过255字") + private String userId; + + /** 用户编码 */ + @Length(max = 255,message = "用户编码长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String userCode; + + /** 用户 */ + @Length(max = 255,message = "用户长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String userName; + + /** 目标类型 */ + @Length(max = 255,message = "目标类型长度不能超过255字") + private String targetType; + + /** 目标id */ + @Length(max = 255,message = "目标id长度不能超过255字") + private String targetId; + + /** 目标 */ + @Length(max = 255,message = "目标长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String targetCode; + + /** 目标 */ + @Length(max = 255,message = "目标长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String targetName; + + /** 目标关联id */ + @Length(max = 255,message = "目标关联id长度不能超过255字") + private String targetRelateId; + + /** 操作类型 */ + @Length(max = 255,message = "操作类型长度不能超过255字") + private String optType; + + /** 原来值 */ + @Length(max = 255,message = "原来值长度不能超过255字") + private String orgJson; + + /** 新值 */ + @Length(max = 255,message = "新值长度不能超过255字") + private String newJson; + + /** 差异值 */ + @Length(max = 255,message = "差异值长度不能超过255字") + private String diffJson; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + + public static SysBusinessLog toNewObject(SysBusinessLog source){ + SysBusinessLog businessLog = new SysBusinessLog(); + businessLog.setId(source.getId()); + businessLog.setUserId(source.getUserId()); + businessLog.setUserCode(source.getUserCode()); + businessLog.setUserName(source.getUserName()); + businessLog.setTargetType(source.getTargetType()); + businessLog.setTargetId(source.getTargetId()); + businessLog.setTargetCode(source.getTargetCode()); + businessLog.setTargetName(source.getTargetName()); + businessLog.setTargetRelateId(source.getTargetRelateId()); + businessLog.setOptType(source.getOptType()); + businessLog.setOrgJson(source.getOrgJson()); + businessLog.setNewJson(source.getNewJson()); + businessLog.setDiffJson(source.getDiffJson()); + businessLog.setRemark(source.getRemark()); + businessLog.setCreateTime(source.getCreateTime()); + businessLog.setUpdateTime(source.getUpdateTime()); + businessLog.setTenantId(source.getTenantId()); + businessLog.setDelFlag(source.getDelFlag()); + businessLog.setCreateBy(source.getCreateBy()); + businessLog.setUpdateBy(source.getUpdateBy()); + return businessLog; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysConfig.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysConfig.java new file mode 100644 index 0000000..776ca03 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysConfig.java @@ -0,0 +1,81 @@ +package com.qs.serve.modules.sys.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 2022-11-12 + */ +@Data +@TableName("sys_config") +public class SysConfig implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 参数名称 */ + @Length(max = 100,message = "参数名称长度不能超过100字") + private String configName; + + /** 参数键名 */ + @Length(max = 100,message = "参数键名长度不能超过100字") + private String configKey; + + /** 参数键值 */ + @Length(max = 500,message = "参数键值长度不能超过500字") + private String configValue; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysDeleteLog.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysDeleteLog.java new file mode 100644 index 0000000..3526391 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysDeleteLog.java @@ -0,0 +1,86 @@ +package com.qs.serve.modules.sys.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 2023-12-08 + */ +@Data +@TableName("sys_delete_log") +public class SysDeleteLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 删除批次 */ + private String batchCode; + + /** 选项类型 */ + @Length(max = 50,message = "选项类型长度不能超过50字") + private String targetTable; + + /** 目标id */ + @Length(max = 100,message = "目标id长度不能超过100字") + private String targetId; + + /** 目标编码 */ + @Length(max = 100,message = "目标编码长度不能超过100字") + private String targetCode; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysDept.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysDept.java new file mode 100644 index 0000000..c7ba2a2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysDept.java @@ -0,0 +1,79 @@ +package com.qs.serve.modules.sys.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; + +/** + * 部门信息 实体类 + * @author YenHex + * @since 2022-02-28 + */ +@Data +@TableName("sys_dept") +public class SysDept implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.INPUT) + private String id; + + /** 名称 */ + @NotNull(message = "名称不能为空") + private String name; + + /** 部门编号 */ + @NotNull(message = "部门编号不能为空") + private String code; + + /** 父级ID */ + @NotNull(message = "父级ID不能为空") + private String parentId; + + /** 负责人 */ + private String mgrUserId; + + /** 级别路径 */ + private String levelPath; + + /** 停用状态 */ + private Integer stopFlag; + + /** 创建时间 */ + @TableField(fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @TableField(fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 删除标识 */ + @JsonIgnore + private Boolean delFlag; + + /** 负责人信息 */ + @TableField(exist = false) + private String mgrUserName; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysDict.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysDict.java new file mode 100644 index 0000000..4780f12 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysDict.java @@ -0,0 +1,77 @@ +package com.qs.serve.modules.sys.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-11-04 + */ +@Data +@TableName("sys_dict") +public class SysDict implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 字典key */ + @NotBlank(message = "字典key不能为空") + @Length(max = 50,message = "字典key长度不能超过50字") + private String dictKey; + + /** 字典组名 */ + @NotBlank(message = "字典组名不能为空") + @Length(max = 50,message = "字典组名长度不能超过50字") + private String dictName; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysDictData.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysDictData.java new file mode 100644 index 0000000..2e11a84 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysDictData.java @@ -0,0 +1,85 @@ +package com.qs.serve.modules.sys.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-11-04 + */ +@Data +@TableName("sys_dict_data") +public class SysDictData implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 字典id */ + private Long dictId; + + /** 字典key */ + @Length(max = 50,message = "字典key长度不能超过50字") + private String groupKey; + + /** 数据值 */ + @Length(max = 50,message = "数据值长度不能超过50字") + private String keyVal; + + /** 数据标题 */ + @Length(max = 50,message = "数据标题长度不能超过50字") + private String label; + + /** 排序 */ + private Integer sort; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysMenu.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysMenu.java new file mode 100644 index 0000000..92c5c4d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysMenu.java @@ -0,0 +1,58 @@ +package com.qs.serve.modules.sys.entity; + +import java.io.Serializable; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * 系统菜单 实体类 + * @author YenHex + * @since 2022-03-15 + */ +@Data +@TableName("sys_menu") +public class SysMenu implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.INPUT) + private String id; + + /** 名称 */ + @NotNull(message = "名称不能为空") + private String name; + + /** 排序 */ + private Integer sort; + + /** 父级ID */ + @NotNull(message = "父级ID不能为空") + private String pid; + + /** 类型【0->菜单;1->按钮】 */ + @NotNull(message = "类型不能为空") + private Integer type; + + /** 是否隐藏 */ + @NotNull(message = "是否隐藏不能为空") + private Integer hideFlag; + + /** 客户端类型 */ + @NotNull(message = "客户端类型不能为空") + private Integer clientType; + + /** 删除标识 */ + @JsonIgnore + private Boolean delFlag; + + @TableField(exist = false) + private List permitIds; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysMenuPermit.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysMenuPermit.java new file mode 100644 index 0000000..7451e62 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysMenuPermit.java @@ -0,0 +1,62 @@ +package com.qs.serve.modules.sys.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; + +/** + * 菜单权限 实体类 + * @author YenHex + * @since 2022-03-15 + */ +@Data +@TableName("sys_menu_permit") +public class SysMenuPermit implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 菜单ID */ + private String menuId; + + /** 权限ID */ + private String permitId; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + private String tenantId; + + /** 删除标识 */ + @NotNull(message = "删除标识不能为空") + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysNotice.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysNotice.java new file mode 100644 index 0000000..4c7c51c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysNotice.java @@ -0,0 +1,140 @@ +package com.qs.serve.modules.sys.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.qs.serve.common.framework.mybatis.handler.meta.JsonStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; + +/** + * 注意信息 实体类 + * @author YenHex + * @since 2022-02-28 + */ +@Data +@TableName(value = "sys_notice",autoResultMap = true) +public class SysNotice implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 标题 */ + @NotNull + @TableField(condition = SqlCondition.LIKE) + @Length(max = 255,message = "输入内容不能超过50字") + private String title; + + /** 类型ID */ + private String typeId; + + /** 内容 */ + @NotNull + private String content; + + /** + * 是否启用 + */ + private Integer enable; + + /** + * 可见类型【0->所有人可见;1->部分人员可见;2->部门可见】 + */ + @NotNull + private Integer visibleType; + + /** + * 最新的发布时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime lastPublishTime; + + /** + * 可见目标id集合 + */ + @TableField(typeHandler = JsonStringTypeHandler.class,jdbcType = JdbcType.VARCHAR) + private String[] visibleIds; + + /** + * 附件id集合 + */ + @TableField(typeHandler = JsonStringTypeHandler.class,jdbcType = JdbcType.VARCHAR) + private String[] docIds; + + /** 创建时间 */ + @TableField(fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @TableField(fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 删除标识 */ + @JsonIgnore + private Boolean delFlag; + + /** + * 附件列表 + */ + @TableField(exist = false) + private Object documents; + + /** + * 可见部门 + */ + @TableField(exist = false) + private Object deps; + + /** + * 可见人 + */ + @TableField(exist = false) + private Object userInfos; + + /** + * 开始时间 + */ + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryStartTime; + + /** + * 结束时间 + */ + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryEndTime; + + /** + * 创建人名称 + */ + @TableField(exist = false) + private String creatorName; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysNoticeType.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysNoticeType.java new file mode 100644 index 0000000..8b34676 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysNoticeType.java @@ -0,0 +1,55 @@ +package com.qs.serve.modules.sys.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 注意信息分类 实体类 + * @author YenHex + * @since 2022-03-01 + */ +@Data +@TableName("sys_notice_type") +public class SysNoticeType implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** name */ + @TableField(condition = SqlCondition.LIKE) + private String name; + + /** 创建时间 */ + @TableField(fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @TableField(fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 删除标识 */ + @JsonIgnore + private Boolean delFlag; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysNoticeUser.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysNoticeUser.java new file mode 100644 index 0000000..58d0e94 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysNoticeUser.java @@ -0,0 +1,94 @@ +package com.qs.serve.modules.sys.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 注意信息&用户关系 实体类 + * @author YenHex + * @since 2022-03-01 + */ +@Data +@TableName("sys_notice_user") +public class SysNoticeUser implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 标题 */ + private String noticeId; + + /** 用户ID */ + private String userId; + + /** 阅读标识【0->未读;1->已读】 */ + private Boolean readFlag; + + /** 阅读时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime readTime; + + /** + * 阅读统计 + */ + private Integer readCount; + + /** 创建时间 */ + @TableField(fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @TableField(fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 删除标识 */ + @JsonIgnore + private Boolean delFlag; + + @JsonIgnore + private String tenantId; + + /** 标题 */ + @TableField(exist = false) + private String title; + + /** + * 开始时间 + */ + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryStartTime; + + /** + * 结束时间 + */ + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryEndTime; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysOperationLog.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysOperationLog.java new file mode 100644 index 0000000..1585b3d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysOperationLog.java @@ -0,0 +1,116 @@ +package com.qs.serve.modules.sys.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 操作日志 实体类 + * @author YenHex + * @since 2022-03-08 + */ +@Data +@TableName("sys_operation_log") +public class SysOperationLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 模块 */ + private String module; + + /** 模块标题 */ + @TableField(condition = SqlCondition.LIKE) + private String title; + + /** 业务类型 */ + private String bizType; + + private String optDesc; + + /** 接口类型 */ + private String interType; + + /** 代码方法 */ + private String codeMethod; + + /** 请求方式 */ + private String reqMethod; + + /** 请求地址 */ + private String reqUrl; + + /** 请求参数 */ + private String reqParam; + + /** 访问IP */ + private String reqIp; + + /** 用户类型 */ + private String userType; + + /** 用户ID */ + private String userId; + + /** 错误信息 */ + private String errMsg; + + /** 返回参数 */ + private String jsonResult; + + /** 耗时(单位毫秒) */ + private Long elapsedTime; + + /** 用户代理 */ + private String userAgent; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + private Boolean delFlag; + + /** 创建人名称 */ + @TableField(condition = SqlCondition.LIKE) + private String creatorName; + + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryStartTime; + + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryEndTime; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysOperationManual.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysOperationManual.java new file mode 100644 index 0000000..0eeef46 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysOperationManual.java @@ -0,0 +1,55 @@ +package com.qs.serve.modules.sys.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +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 2023-08-11 + */ +@Data +@TableName(value = "sys_operation_manual", autoResultMap = true) +public class SysOperationManual implements Serializable { + + private static final long serialVersionUID = 1L; + + /** */ + @TableId(type = IdType.AUTO) + private Long id; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String name; + + /** 附件id */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] attachIds; + + @TableField(exist = false) + private List attachList; + + /** */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysPermit.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysPermit.java new file mode 100644 index 0000000..0e6d6a9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysPermit.java @@ -0,0 +1,55 @@ +package com.qs.serve.modules.sys.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 系统权限 实体类 + * @author YenHex + * @since 2022-03-01 + */ +@Data +@TableName("sys_permit") +public class SysPermit implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 名称 */ + @NotNull(message = "名称不能为空") + private String name; + + /** 编码 */ + @NotBlank(message = "编码不能为空") + private String code; + + /** 父级ID */ + @NotNull(message = "父级ID不能为空") + private String pid; + + /** 类型【0->菜单;1->按钮】 */ + @NotNull(message = "类型【0->菜单;1->按钮】不能为空") + private Integer type; + + private String url; + + /** 删除标识 */ + @JsonIgnore + private Boolean delFlag; + + @JsonIgnore + private Integer hideFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysPost.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysPost.java new file mode 100644 index 0000000..350ebe7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysPost.java @@ -0,0 +1,98 @@ +package com.qs.serve.modules.sys.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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 2023-04-27 + */ +@Data +@TableName("sys_post") +public class SysPost implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 名称 */ + @NotNull + @Length(max = 20,message = "名称长度不能超过20字") + @TableField(condition = SqlCondition.LIKE) + private String postName; + + /** 编码 */ + @Length(max = 30,message = "编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String postCode; + + private String pid; + + /** id路径 */ + @Length(max = 4255,message = "id路径长度不能超过4255字") + private String pathIds; + + /** 名称路径 */ + @Length(max = 4255,message = "名称路径长度不能超过4255字") + @TableField(condition = SqlCondition.LIKE) + private String pathNames; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + @TableField(exist = false) + private Object parentInfo; + + @TableField(exist = false) + private List postUserList; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysPostUser.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysPostUser.java new file mode 100644 index 0000000..96e314a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysPostUser.java @@ -0,0 +1,132 @@ +package com.qs.serve.modules.sys.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 2023-04-27 + */ +@Data +@TableName("sys_post_user") +public class SysPostUser implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 用户id */ + @Length(max = 255,message = "用户id长度不能超过255字") + private String userId; + + /** 用户编码 */ + @Length(max = 255,message = "用户编码长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String userCode; + + /** 用户名称 */ + @Length(max = 255,message = "用户名称长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String userName; + + /** 岗位id */ + @Length(max = 64,message = "岗位id长度不能超过64字") + private String postId; + + /** 岗位名称 */ + @Length(max = 20,message = "岗位名称长度不能超过20字") + @TableField(condition = SqlCondition.LIKE) + private String postName; + + /** 岗位编码 */ + @Length(max = 30,message = "岗位编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String postCode; + + /** 岗位pid */ + @Length(max = 64,message = "岗位pid长度不能超过64字") + private String pid; + + /** id路径 */ + @Length(max = 4255,message = "id路径长度不能超过4255字") + private String pathIds; + + /** 名称路径 */ + @Length(max = 4255,message = "名称路径长度不能超过4255字") + private String pathNames; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + + public static SysPostUser toNewObject(SysPostUser source){ + SysPostUser postUser = new SysPostUser(); + postUser.setId(source.getId()); + postUser.setUserId(source.getUserId()); + postUser.setUserCode(source.getUserCode()); + postUser.setUserName(source.getUserName()); + postUser.setPostId(source.getPostId()); + postUser.setPostName(source.getPostName()); + postUser.setPostCode(source.getPostCode()); + postUser.setPid(source.getPid()); + postUser.setPathIds(source.getPathIds()); + postUser.setPathNames(source.getPathNames()); + postUser.setRemark(source.getRemark()); + postUser.setCreateTime(source.getCreateTime()); + postUser.setCreateBy(source.getCreateBy()); + postUser.setUpdateTime(source.getUpdateTime()); + postUser.setUpdateBy(source.getUpdateBy()); + postUser.setTenantId(source.getTenantId()); + postUser.setDelFlag(source.getDelFlag()); + return postUser; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysRole.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysRole.java new file mode 100644 index 0000000..973c494 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysRole.java @@ -0,0 +1,75 @@ +package com.qs.serve.modules.sys.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; + +/** + * 系统角色 实体类 + * @author YenHex + * @since 2022-03-01 + */ +@Data +@TableName("sys_role") +public class SysRole implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 角色名称 */ + @NotNull(message = "角色名称不能为空") + private String name; + + /** 是否可用 */ + private Integer enable; + + /** 是否默认 */ + private Integer isDefault; + + /** 是否默认 */ + private Integer userVisible; + + /** 显示人员模板中 */ + @TableField(fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime createTime; + + /** 更新时间 */ + @TableField(fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime updateTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + @JsonIgnore + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + private Boolean delFlag; + + @TableField(exist = false) + private List menuList; + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysRoleMenu.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysRoleMenu.java new file mode 100644 index 0000000..bbea731 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysRoleMenu.java @@ -0,0 +1,62 @@ +package com.qs.serve.modules.sys.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; + +/** + * 菜单用户 实体类 + * @author YenHex + * @since 2022-03-16 + */ +@Data +@TableName("sys_role_menu") +public class SysRoleMenu implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 角色ID */ + private String menuId; + + /** 角色ID */ + private String roleId; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + private String tenantId; + + /** 删除标识 */ + @NotNull(message = "删除标识不能为空") + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysSyncLog.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysSyncLog.java new file mode 100644 index 0000000..b235443 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysSyncLog.java @@ -0,0 +1,98 @@ +package com.qs.serve.modules.sys.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 2023-03-15 + */ +@Data +@TableName("sys_sync_log") +public class SysSyncLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 来自系统 */ + @Length(max = 255,message = "来自系统长度不能超过255字") + @TableField(value = "form_plat") + private String fromPlat; + + /** 请求地址 */ + @Length(max = 255,message = "请求地址长度不能超过255字") + private String url; + + /** 请求类 */ + @Length(max = 255,message = "请求类长度不能超过255字") + private String entityClass; + + /** 请求json */ + @Length(max = 255,message = "请求json长度不能超过255字") + private String requestJson; + + /** 失败原因 */ + @Length(max = 255,message = "失败原因长度不能超过255字") + private String failReason; + + /** 成功标识 */ + private Integer successStatus; + + /** 是否需要处理 */ + private Integer todoState; + + private Integer tryTimes; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysTableTemp.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysTableTemp.java new file mode 100644 index 0000000..1441d9e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysTableTemp.java @@ -0,0 +1,102 @@ +package com.qs.serve.modules.sys.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-01-15 + */ +@Data +@TableName("sys_table_temp") +public class SysTableTemp implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 表 */ + @Length(max = 255,message = "表长度不能超过255字") + private String tableName; + + /** 数据id */ + @Length(max = 255,message = "数据id长度不能超过255字") + private String tableId; + + /** 业务名称 */ + @Length(max = 255,message = "业务名称长度不能超过255字") + private String optionTitle; + + /** 结果 */ + @Length(max = 255,message = "结果长度不能超过255字") + private String resultMsg; + + private Integer dealState; + + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + + public static SysTableTemp toNewObject(SysTableTemp source){ + SysTableTemp tableTemp = new SysTableTemp(); + tableTemp.setId(source.getId()); + tableTemp.setTableName(source.getTableName()); + tableTemp.setTableId(source.getTableId()); + tableTemp.setOptionTitle(source.getOptionTitle()); + tableTemp.setResultMsg(source.getResultMsg()); + tableTemp.setCreateTime(source.getCreateTime()); + tableTemp.setCreateBy(source.getCreateBy()); + tableTemp.setUpdateTime(source.getUpdateTime()); + tableTemp.setUpdateBy(source.getUpdateBy()); + tableTemp.setTenantId(source.getTenantId()); + tableTemp.setDelFlag(source.getDelFlag()); + return tableTemp; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysTenant.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysTenant.java new file mode 100644 index 0000000..e3554ea --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysTenant.java @@ -0,0 +1,59 @@ +package com.qs.serve.modules.sys.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * 系统租户 实体类 + * @author YenHex + * @since 2022-03-01 + */ +@Data +@TableName("sys_tenant") +public class SysTenant implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 租户id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 租户名称 */ + @TableField(condition = SqlCondition.LIKE) + private String name; + + /** 校区电话 */ + private String callNum; + + /** 校区地址 */ + private String address; + + /** 创建时间 */ + @JsonIgnore + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @JsonIgnore + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @JsonIgnore + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @JsonIgnore + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 删除标识 */ + @JsonIgnore + private Boolean delFlag; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysUser.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysUser.java new file mode 100644 index 0000000..73b9e45 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysUser.java @@ -0,0 +1,256 @@ +package com.qs.serve.modules.sys.entity; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.io.Serializable; +import java.util.List; + +import cn.hutool.core.util.DesensitizedUtil; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.sys.entity.dto.SysUserSimpleVo; +import com.qs.serve.modules.sys.entity.dto.SysUserVo; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; + +/** + * 系统用户 实体类 + * @author YenHex + * @since 2022-03-01 + */ +@Data +@TableName("sys_user") +public class SysUser implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.INPUT) + private String id; + + /** 手机号 */ + @NotBlank(message = "手机号不能为空") + @Length(max = 64,message = "手机号长度不能超过64字") + private String mobile; + + /** 账号 */ + @Length(max = 64,message = "账号长度不能超过64字") + private String account; + + /** 昵称 */ + @Length(max = 64,message = "昵称长度不能超过64字") + private String name; + + /** 编号/工号 */ + @Length(max = 64,message = "编号/工号长度不能超过64字") + private String code; + + /** 密码 */ + @Length(max = 64,message = "密码长度不能超过64字") + private String password; + + /** 头像 */ + @Length(max = 255,message = "头像长度不能超过255字") + private String icon; + + /** 部门ID */ + @Length(max = 64,message = "部门ID长度不能超过64字") + private String deptId; + + /** 超级管理标识【0->普通管理员;1->超级管理员】 */ + private Integer superFlag; + + /** 系统登录权限【0->停用;1->启用】 */ + private Integer loginEnable; + + /** 在职状态【0->离职;1->在职;2->准备离职】 */ + private Integer servingState; + + /** 入职/复职日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate servingDate; + + /** 离职或上一次离职的日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate servingLeaveDate; + + /** 是否销售人员 */ + private Integer salesFlag; + + /** 身份证号码 */ + @Length(max = 45,message = "身份证号码长度不能超过45字") + private String identityNo; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + + /** 登陆客户端标识:android,ios */ + private String appClient; + + /** app推送token */ + private String appToken; + + /** 致远登陆账户 */ + private String syAccount; + + /** 致远用户id */ + private String syUserId; + + private String hrSystemInfo; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + + + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 删除标识 */ + @JsonIgnore + private Boolean delFlag; + + /** 校区id */ + @JsonIgnore + private String tenantId; + + /** 在职状态【0->离职;1->在职;】 */ + @TableField(exist = false) + private String servingQueryState; + + /** 查询参数:部门ID多选 */ + @TableField(exist = false) + private List multiDeptIds; + + /** 查询参数:角色ID多选,新增用户时用 */ + @TableField(exist = false) + private List roleIds; + + /** 查询参数:是否加载部门子项参数 */ + @TableField(exist = false) + private Integer loadChildDept; + + /** 部门信息 */ + @TableField(exist = false) + private SysDept deptInfo; + + /** 角色信息 */ + @TableField(exist = false) + private List roleList; + + /** 权限编码 */ + @TableField(exist = false) + private List authorList; + + /** 权限ID */ + @TableField(exist = false) + private List authorIds; + + /** 选中ID */ + @TableField(exist = false) + private List selectIds; + + /** 选中岗位ID */ + @TableField(exist = false) + private List selectPostIds; + + @TableField(exist = false) + private List tenantInfo; + + @TableField(exist = false) + private List wxUserInfoList; + + @TableField(exist = false) + private String parentId; + + /** + * 离职信息 + */ + @TableField(exist = false) + private Object leaveInfo; + + + @TableField(exist = false) + private Integer pageNum; + + @TableField(exist = false) + private Integer pageSize; + + @TableField(exist = false) + private List positionList; + + /** + * 返回前端,过滤敏感信息 + * @return + */ + public SysUserVo toSysUserVo() { + return toSysUserVo(true); + } + + /** + * 返回前端,过滤敏感信息 + * @return + */ + public SysUserVo toSysUserVo(boolean desensitize) { + SysUserVo sysUserVo = CopierUtil.copy(this,new SysUserVo()); + if(desensitize){ + sysUserVo.setMobile(DesensitizedUtil.mobilePhone(sysUserVo.getMobile())); + sysUserVo.setAccount(DesensitizedUtil.mobilePhone(sysUserVo.getMobile())); + } + return sysUserVo; + } + + public boolean checkSyAccount(){ + return checkSyAccount(true); + } + + public boolean checkSyAccount(boolean throwEx){ + if(StringUtils.hasText(this.getSyUserId())){ + return true; + } + if(throwEx){ + Assert.throwEx("当前账号未设置致远信息"); + } + return false; + } + + /** + * 返回前端,过滤敏感信息 + * @return + */ + public SysUserSimpleVo toSimpleVo(boolean desensitize) { + SysUserSimpleVo sysUserVo = CopierUtil.copy(this,new SysUserSimpleVo()); + if(desensitize){ + sysUserVo.setMobile(DesensitizedUtil.mobilePhone(sysUserVo.getMobile())); + } + return sysUserVo; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysUserCodeMath.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysUserCodeMath.java new file mode 100644 index 0000000..eb2543a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysUserCodeMath.java @@ -0,0 +1,89 @@ +package com.qs.serve.modules.sys.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 2023-09-08 + */ +@Data +@TableName("sys_user_code_math") +public class SysUserCodeMath implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 旧编码 */ + @Length(max = 255,message = "旧编码长度不能超过255字") + @TableId(type = IdType.ASSIGN_UUID) + private String sourCode; + + /** 当前编码 */ + @Length(max = 255,message = "当前编码长度不能超过255字") + private String currCode; + + /** 用户名称 */ + @Length(max = 255,message = "用户名称长度不能超过255字") + private String userName; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + public static SysUserCodeMath toNewObject(SysUserCodeMath source){ + SysUserCodeMath userCodeMath = new SysUserCodeMath(); + userCodeMath.setSourCode(source.getSourCode()); + userCodeMath.setCurrCode(source.getCurrCode()); + userCodeMath.setUserName(source.getUserName()); + userCodeMath.setCreateTime(source.getCreateTime()); + userCodeMath.setUpdateTime(source.getUpdateTime()); + userCodeMath.setTenantId(source.getTenantId()); + userCodeMath.setCreateBy(source.getCreateBy()); + userCodeMath.setUpdateBy(source.getUpdateBy()); + userCodeMath.setDelFlag(source.getDelFlag()); + return userCodeMath; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysUserLeave.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysUserLeave.java new file mode 100644 index 0000000..03d030d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysUserLeave.java @@ -0,0 +1,132 @@ +package com.qs.serve.modules.sys.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 2023-02-13 + */ +@Data +@TableName("sys_user_leave") +public class SysUserLeave implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 离职员工id */ + @NotBlank(message = "离职员工id不能为空") + @Length(max = 32,message = "离职员工id长度不能超过32字") + private String userId; + + /** 离职员工 */ + @Length(max = 32,message = "离职员工长度不能超过32字") + private String userName; + + /** 离职员工工号 */ + @Length(max = 32,message = "离职员工工号长度不能超过32字") + private String userCode; + + /** 状态:0-待处理;1-已处理;2-取消离职 */ + @NotNull(message = "状态:0-待处理;1-已处理;2-取消离职不能为空") + private Integer leaveStatus; + + /** 离职原因 */ + @Length(max = 255,message = "离职原因长度不能超过255字") + private String leaveReason; + + /** 离职取消日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime leaveCancelDate; + + /** 离职生效日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate leaveEffectDate; + + /** 工作交接人id */ + @Length(max = 32,message = "工作交接人id长度不能超过32字") + private String flowUserId; + + /** 工作交接人 */ + @Length(max = 32,message = "工作交接人长度不能超过32字") + private String flowUserName; + + /** 工作交接人工号 */ + @Length(max = 32,message = "工作交接人工号长度不能超过32字") + private String flowUserCode; + + /** 客户交接人id */ + @Length(max = 32,message = "客户交接人id长度不能超过32字") + private String cusUserId; + + /** 客户交接人 */ + @Length(max = 32,message = "客户交接人长度不能超过32字") + private String cusUserName; + + /** 客户交接人工号 */ + @Length(max = 32,message = "客户交接人工号长度不能超过32字") + private String cusUserCode; + + /** 角色交接人id */ + @Length(max = 32,message = "角色交接人id长度不能超过32字") + private String roleUserId; + + /** 角色交接人 */ + @Length(max = 32,message = "角色交接人长度不能超过32字") + private String roleUserName; + + /** 角色交接人工号 */ + @Length(max = 32,message = "角色交接人工号长度不能超过32字") + private String roleUserCode; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** 系统id */ + @JsonIgnore + @JsonProperty + private String tenantId; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysUserRole.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysUserRole.java new file mode 100644 index 0000000..bf78e73 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysUserRole.java @@ -0,0 +1,57 @@ +package com.qs.serve.modules.sys.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 用户角色 实体类 + * @author YenHex + * @since 2022-03-01 + */ +@Data +@TableName("sys_user_role") +public class SysUserRole implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 用户ID */ + private String userId; + + /** 角色ID */ + private String roleId; + + /** 创建时间 */ + @TableField(fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime createTime; + + /** 更新时间 */ + @TableField(fill = FieldFill.UPDATE) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime updateTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 删除标识 */ + @JsonIgnore + private Boolean delFlag; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysUserSales.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysUserSales.java new file mode 100644 index 0000000..2bf9397 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/SysUserSales.java @@ -0,0 +1,65 @@ +package com.qs.serve.modules.sys.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +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 2022-10-12 + */ +@Data +@TableName("sys_user_sales") +public class SysUserSales implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 用户id */ + @Length(max = 32,message = "用户id长度不能超过32字") + @TableId(type = IdType.INPUT) + private String userId; + + /** 父级id */ + @Length(max = 32,message = "父级id长度不能超过32字") + private String pid; + + private String pathIds; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysConfigBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysConfigBo.java new file mode 100644 index 0000000..a5c7754 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysConfigBo.java @@ -0,0 +1,37 @@ +package com.qs.serve.modules.sys.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * Bo + * @author YenHex + * @since 2022-11-12 + */ +@Data +public class SysConfigBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 参数键名 */ + @Length(max = 100,message = "参数键名长度不能超过100字") + private String configKey; + + /** 参数键值 */ + @Length(max = 500,message = "参数键值长度不能超过500字") + private String configValue; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysDeptBatchBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysDeptBatchBo.java new file mode 100644 index 0000000..40e1bfa --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysDeptBatchBo.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.sys.entity.bo; + +import com.qs.serve.modules.sys.entity.SysDept; +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2022/10/8 + */ +@Data +public class SysDeptBatchBo { + + List deptList; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysPostUserBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysPostUserBo.java new file mode 100644 index 0000000..7cdb9f6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysPostUserBo.java @@ -0,0 +1,43 @@ +package com.qs.serve.modules.sys.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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; + +/** + * 系统职务 Bo + * @author YenHex + * @since 2023-04-27 + */ +@Data +public class SysPostUserBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 用户id */ + private List userIds; + + /** 岗位id */ + private List postIds; + + /** + * 0:添加不进行删除 + * 1:以`用户id`为参照物,删除历史`岗位id`,并重新添加新的`岗位id` + * 2:以`岗位id`为参照物,删除历史`用户id`,并重新添加新的`用户id` + */ + private Integer saveType; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysRelateSuppliersParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysRelateSuppliersParam.java new file mode 100644 index 0000000..5e24077 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysRelateSuppliersParam.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.sys.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author YenHex + * @since 2022/10/25 + */ +@Data +public class SysRelateSuppliersParam { + + /** + * 用户ID。当user==null,为清楚客户绑定 + */ + String userId; + + /** + * 供应商id列表 + */ + @NotNull + List supplierIds; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysRelateSuppliersParam2.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysRelateSuppliersParam2.java new file mode 100644 index 0000000..4656b18 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysRelateSuppliersParam2.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.sys.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author YenHex + * @since 2022/10/25 + */ +@Data +public class SysRelateSuppliersParam2 { + + /** + * 用户ID。当userIds==null,为清除绑定 + */ + List userIds; + + /** + * 供应商id列表 + */ + @NotNull + Long supplierId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysUserBatchBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysUserBatchBo.java new file mode 100644 index 0000000..1974eda --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysUserBatchBo.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.sys.entity.bo; + +import lombok.Data; + +import java.util.List; + + +/** + * @author YenHex + * @since 2022/10/8 + */ +@Data +public class SysUserBatchBo { + + List userList; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysUserBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysUserBo.java new file mode 100644 index 0000000..eb87122 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysUserBo.java @@ -0,0 +1,77 @@ +package com.qs.serve.modules.sys.entity.bo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author YenHex + * @since 2022/10/8 + */ +@Data +public class SysUserBo { + + /** id */ + private String id; + + /** 手机号 */ + @Length(max = 64,message = "手机号长度不能超过20字") + private String mobile; + + /** 账号 */ + //@Length(max = 64,message = "账号长度不能超过20字") + //private String account; + + /** 昵称 */ + @Length(max = 64,message = "昵称长度不能超过20字") + private String name; + + /** 编号/工号 */ + @NotNull + @Length(max = 64,message = "编号/工号长度") + private String code; + + /** 头像 */ + //@Length(max = 255,message = "头像长度不能超过255字") + //private String icon; + + /** 部门ID */ + @Length(max = 64,message = "部门ID长度不能超过64字") + private String deptId; + + /** 职位ID */ + //@Length(max = 64,message = "部门ID长度不能超过64字") + //private String positionId; + + /** 身份证号码 */ + @Length(max = 45,message = "身份证号码长度不能超过45字") + private String identityNo; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 角色ID列表 */ + //@TableField(exist = false) + //private List roleIds; + + /** 致远登陆账户 */ + private String syAccount; + + /** 致远用户id */ + private String syUserId; + + /** 登陆客户端标识:android,ios */ + //private String appClient; + + /** app推送token */ + //private String appToken; + + private String hrSystemInfo; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysUserLeaveBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysUserLeaveBo.java new file mode 100644 index 0000000..1aec384 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysUserLeaveBo.java @@ -0,0 +1,51 @@ +package com.qs.serve.modules.sys.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 用户离职 Bo + * @author YenHex + * @since 2023-02-13 + */ +@Data +public class SysUserLeaveBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 离职员工id */ + private String userId; + + /** 离职原因 */ + private String leaveReason; + + /** 离职生效日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate leaveEffectDate; + + /** 工作交接人id */ + private String flowUserId; + + /** 客户交接人id */ + private String cusUserId; + + /** 角色交接人id */ + private String roleUserId; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysUserParentParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysUserParentParam.java new file mode 100644 index 0000000..930e957 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysUserParentParam.java @@ -0,0 +1,28 @@ +package com.qs.serve.modules.sys.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author YenHex + * @since 2022/10/26 + */ +@Data +public class SysUserParentParam { + + /** + * 用户id列表 + */ + @NotNull + private List userIds; + + /** + * 父级id + */ + @NotBlank + private String parentId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysUserSalesParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysUserSalesParam.java new file mode 100644 index 0000000..789288e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/bo/SysUserSalesParam.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.sys.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author YenHex + * @since 2022/10/26 + */ +@Data +public class SysUserSalesParam { + + /** + * 用户id列表 + */ + @NotNull + List userIds; + + /** + * 是否销售人员 1是 0否 + */ + @NotNull + private Integer salesFlag; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/CostDeletion.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/CostDeletion.java new file mode 100644 index 0000000..a2ff13c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/CostDeletion.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.sys.entity.dto; + +import lombok.Data; + +@Data +public class CostDeletion { + + /** + * 员工号 + */ + private String empNo; + + private String cacc; + + /** + * 操作时间 + */ + private String requestDeleteTime; + + /** + * 核销案号 + */ + private String verificationCode; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SyUser.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SyUser.java new file mode 100644 index 0000000..ea99af7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SyUser.java @@ -0,0 +1,15 @@ +package com.qs.serve.modules.sys.entity.dto; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/6/20 + */ +@Data +public class SyUser { + String id; + String name; + String code; + String mobile; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysDeptTranParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysDeptTranParam.java new file mode 100644 index 0000000..1f2ebb2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysDeptTranParam.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.sys.entity.dto; + +import lombok.Data; + +/** + * @author YenHex + * @since 2022/4/14 + */ +@Data +public class SysDeptTranParam { + + /** + * 迁移的父级ID,根节点传0 + */ + private String parentId; + + /** + * 选中的部门ID + */ + private String selectId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysDeptTreeNode.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysDeptTreeNode.java new file mode 100644 index 0000000..e523795 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysDeptTreeNode.java @@ -0,0 +1,64 @@ +package com.qs.serve.modules.sys.entity.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.qs.serve.common.model.dto.TreeNode; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * @author YenHex + * @since 2022/3/3 + */ +@Data +public class SysDeptTreeNode extends TreeNode { + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 名称 */ + @NotNull(message = "名称不能为空") + private String name; + + /** 部门编号 */ + @NotNull(message = "部门编号不能为空") + private String code; + + /** 父级ID */ + @NotNull(message = "父级ID不能为空") + private String parentId; + + /** 负责人id */ + private String mgrUserId; + + private Integer isRepair; + + /** 类型【0集团部门 01校区部门 】 */ + @NotNull(message = "类型不能为空") + private Integer type; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime createTime; + + /** 创建人 */ + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime updateTime; + + /** 更新人 */ + private String updateBy; + + /** 负责人 */ + private String mgrUserName; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysLoginByPhoneParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysLoginByPhoneParam.java new file mode 100644 index 0000000..74cfe0b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysLoginByPhoneParam.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.sys.entity.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/3/1 + */ +@Data +public class SysLoginByPhoneParam { + + @NotNull + private String phone; + + @NotNull + private String code; + + /** + * 友盟token + */ + private String ymToken; + + /** + * 登陆类型:ios、pc、android + */ + @NotNull + private String loginType; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysLoginParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysLoginParam.java new file mode 100644 index 0000000..07ec0a8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysLoginParam.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.sys.entity.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/3/1 + */ +@Data +public class SysLoginParam { + + @NotNull + private String account; + + @NotNull + private String password; + + /** + * 友盟token + */ + private String ymToken; + + /** + * 登陆类型:ios、pc、android + */ + @NotNull + private String loginType; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysMenuPermitParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysMenuPermitParam.java new file mode 100644 index 0000000..3c84fd6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysMenuPermitParam.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.sys.entity.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author JcYen + * @date 2022/3/12 + */ +@Data +public class SysMenuPermitParam { + + String menuId; + + List permitIds; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysMenuTreeNode.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysMenuTreeNode.java new file mode 100644 index 0000000..dab3c6e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysMenuTreeNode.java @@ -0,0 +1,36 @@ +package com.qs.serve.modules.sys.entity.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.qs.serve.common.model.dto.TreeNode; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/3/16 + */ +@Data +public class SysMenuTreeNode extends TreeNode { + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 名称 */ + @NotNull(message = "名称不能为空") + private String name; + + /** 排序 */ + private Integer sort; + + /** 父级ID */ + @NotNull(message = "父级ID不能为空") + private String pid; + + /** 类型【0->菜单;1->按钮】 */ + @NotNull(message = "类型【0->菜单;1->按钮】不能为空") + private Integer type; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysPermitTreeNode.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysPermitTreeNode.java new file mode 100644 index 0000000..ec68bfc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysPermitTreeNode.java @@ -0,0 +1,39 @@ +package com.qs.serve.modules.sys.entity.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.qs.serve.common.model.dto.TreeNode; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/3/11 + */ +@Data +public class SysPermitTreeNode extends TreeNode { + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 名称 */ + @NotNull(message = "名称不能为空") + private String name; + + /** 编码 */ + @NotNull(message = "编码不能为空") + private String code; + + /** 父级ID */ + @NotNull(message = "父级ID不能为空") + private String pid; + + /** 类型【0->菜单;1->按钮】 */ + @NotNull(message = "类型【0->菜单;1->按钮】不能为空") + private Integer type; + + private String url; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysResetPwdByPhoneParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysResetPwdByPhoneParam.java new file mode 100644 index 0000000..847d8bb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysResetPwdByPhoneParam.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.sys.entity.dto; + +import lombok.Data; + +/** + * @author YenHex + * @since 2022/4/7 + */ +@Data +public class SysResetPwdByPhoneParam { + + private String phone; + + private String code; + + private String newPwd; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysRoleMenuParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysRoleMenuParam.java new file mode 100644 index 0000000..c1681d0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysRoleMenuParam.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.sys.entity.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author JcYen + * @date 2022/3/12 + */ +@Data +public class SysRoleMenuParam { + + @NotNull + String roleId; + + List menuIds; + + /** + * 客户端类型 0-PC 1-APP + */ + @NotNull + Integer clientType; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysRoleUserParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysRoleUserParam.java new file mode 100644 index 0000000..fb17480 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysRoleUserParam.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.sys.entity.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author JcYen + * @date 2022/3/12 + */ +@Data +public class SysRoleUserParam { + + String roleId; + + List userIds; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUpdateSeeYonPassword.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUpdateSeeYonPassword.java new file mode 100644 index 0000000..b8856c7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUpdateSeeYonPassword.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.sys.entity.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * @author YenHex + * @since 2023/8/31 + */ +@Data +@AllArgsConstructor +public class SysUpdateSeeYonPassword { + + String memberId; + + String password; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserLeaveParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserLeaveParam.java new file mode 100644 index 0000000..9c5628d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserLeaveParam.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.sys.entity.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/4/1 + */ +@Data +public class SysUserLeaveParam { + + @NotNull + private String userId; + + /** + * 是否离职 + */ + @NotNull + private Integer leaveState; + + //@NotNull + private String apprId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserPwdParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserPwdParam.java new file mode 100644 index 0000000..d852956 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserPwdParam.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.sys.entity.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/3/17 + */ +@Data +public class SysUserPwdParam { + + @NotNull + private String oldPassword; + + @NotNull + private String newPassword; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserRewardPunishParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserRewardPunishParam.java new file mode 100644 index 0000000..af54975 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserRewardPunishParam.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.sys.entity.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/4/1 + */ +@Data +public class SysUserRewardPunishParam { + + @NotNull + private String userId; + + @NotNull + private String apprId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserSalesTreeVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserSalesTreeVo.java new file mode 100644 index 0000000..94dca4a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserSalesTreeVo.java @@ -0,0 +1,86 @@ +package com.qs.serve.modules.sys.entity.dto; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.model.dto.TreeNode; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * @author YenHex + * @since 2022/10/12 + */ +@Data +public class SysUserSalesTreeVo extends TreeNode { + + @TableField(exist = false) + private String id; + + /** 手机号 */ + @TableField(exist = false) + private String mobile; + + /** 账号 */ + @TableField(exist = false) + private String account; + + /** 昵称 */ + @TableField(exist = false) + private String name; + + /** 编号/工号 */ + @TableField(exist = false) + private String code; + + /** 头像 */ + @TableField(exist = false) + private String icon; + + /** 部门ID */ + @TableField(exist = false) + private String deptId; + + /** 职位ID */ + @TableField(exist = false) + private String positionId; + + /** 系统登录权限【0->停用;1->启用】 */ + @TableField(exist = false) + private Integer loginEnable; + + /** 在职状态【0->离职;1->在职;2->准备离职】 */ + @TableField(exist = false) + private Integer servingState; + + /** 入职/复职日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate servingDate; + + /** 离职或上一次离职的日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate servingLeaveDate; + + /** 是否销售人员 */ + @TableField(exist = false) + private Integer salesFlag; + + /** 身份证号码 */ + @TableField(exist = false) + private String identityNo; + + /** 备注 */ + @TableField(exist = false) + private String remark; + + @TableField(exist = false) + private String deptName; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserSimpleVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserSimpleVo.java new file mode 100644 index 0000000..e225910 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserSimpleVo.java @@ -0,0 +1,40 @@ +package com.qs.serve.modules.sys.entity.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2022/3/1 + */ +@Data +public class SysUserSimpleVo { + + /** id */ + private String id; + + /** 手机号 */ + private String mobile; + + /** 编号 */ + private String code; + + private String deptId; + + /** 昵称 */ + private String name; + + /** 头像 */ + private String icon; + + /** 性别【0->女;1->男】 */ + private Integer gender; + + /** 完成状态 */ + private Integer finished; + + /** 客户主要负责人标识 */ + private Integer supplierMainFlag; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserTenantEditParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserTenantEditParam.java new file mode 100644 index 0000000..f9ee9de --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserTenantEditParam.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.sys.entity.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/5/31 + */ +@Data +public class SysUserTenantEditParam { + + @NotNull + private String userId; + + @NotNull + private String[] tenantIds; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserTranPostParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserTranPostParam.java new file mode 100644 index 0000000..e31f54d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserTranPostParam.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.sys.entity.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/4/1 + */ +@Data +public class SysUserTranPostParam { + + @NotNull + private String userId; + + @NotNull + private String postId; + + //@NotNull + private String apprId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserVo.java new file mode 100644 index 0000000..c6b1e72 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/SysUserVo.java @@ -0,0 +1,53 @@ +package com.qs.serve.modules.sys.entity.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2022/3/1 + */ +@Data +public class SysUserVo { + + /** id */ + private String id; + + /** 手机号 */ + private String mobile; + + /** 账号 */ + private String account; + + /** 编号 */ + private String code; + + /** 昵称 */ + private String name; + + /** 头像 */ + private String icon; + + /** 性别【0->女;1->男】 */ + private Integer gender; + + /** 在职状态【0->离职;1->在职 ;2->将离职】 */ + private Integer servingState; + + /** 权限编码 */ + private List authorList; + + /** 权限ID */ + private List authorIds; + + private Object deptInfo; + + private Object postInfo; + + private String hrSystemInfo; + + /** 客户主要负责人标识 */ + private Integer supplierMainFlag; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/UserRole4EditParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/UserRole4EditParam.java new file mode 100644 index 0000000..2926a0f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/dto/UserRole4EditParam.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.sys.entity.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author YenHex + * @since 2022/4/12 + */ +@Data +public class UserRole4EditParam { + + private List roleIds; + + @NotNull + private String userId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/so/SysPostUserSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/so/SysPostUserSo.java new file mode 100644 index 0000000..9ddac6e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/so/SysPostUserSo.java @@ -0,0 +1,86 @@ +package com.qs.serve.modules.sys.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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 2023-04-27 + */ +@Data +public class SysPostUserSo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 用户id */ + private String userId; + + /** 用户编码 */ + private String userCode; + + /** 用户名称 */ + private String userName; + + /** 岗位id */ + private String postId; + + /** 岗位名称 */ + private String postName; + + /** 岗位编码 */ + private String postCode; + + /** 岗位pid */ + private String pid; + + /** id路径 */ + private String pathIds; + + /** 名称路径 */ + private String pathNames; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 创建人 */ + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 更新人 */ + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/vo/SysPostTreeVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/vo/SysPostTreeVo.java new file mode 100644 index 0000000..9712ff9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/entity/vo/SysPostTreeVo.java @@ -0,0 +1,51 @@ +package com.qs.serve.modules.sys.entity.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.SqlCondition; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.qs.serve.common.model.dto.TreeNode; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/4/27 + */ +@Data +public class SysPostTreeVo extends TreeNode { + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 名称 */ + @Length(max = 20,message = "名称长度不能超过20字") + @TableField(condition = SqlCondition.LIKE) + private String postName; + + /** 编码 */ + @Length(max = 30,message = "编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String postCode; + + private String pid; + + /** id路径 */ + @Length(max = 4255,message = "id路径长度不能超过4255字") + private String pathIds; + + /** 名称路径 */ + @Length(max = 4255,message = "名称路径长度不能超过4255字") + @TableField(condition = SqlCondition.LIKE) + private String pathNames; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + + private List postUserList; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysAttachMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysAttachMapper.java new file mode 100644 index 0000000..02346e4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysAttachMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysAttach; + +/** + * 系统附件 Mapper + * @author YenHex + * @date 2022-03-24 + */ +public interface SysAttachMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysBusinessLogMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysBusinessLogMapper.java new file mode 100644 index 0000000..993cf6b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysBusinessLogMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysBusinessLog; + +/** + * Mapper + * @author YenHex + * @date 2023-04-25 + */ +public interface SysBusinessLogMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysConfigMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysConfigMapper.java new file mode 100644 index 0000000..4023303 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysConfigMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysConfig; + +/** + * Mapper + * @author YenHex + * @date 2022-11-12 + */ +public interface SysConfigMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysDeleteLogMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysDeleteLogMapper.java new file mode 100644 index 0000000..92f26e8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysDeleteLogMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysDeleteLog; + +/** + * 删除日志 Mapper + * @author YenHex + * @date 2023-12-08 + */ +public interface SysDeleteLogMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysDeptMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysDeptMapper.java new file mode 100644 index 0000000..5c00a27 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysDeptMapper.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.sys.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysDept; + +import java.util.List; + +/** + * 部门信息 Mapper + * @author YenHex + * @date 2022-02-28 + */ +public interface SysDeptMapper extends BaseMapper { + + /** + * 查询列表 + * @param sysDept + * @return + */ + List listDept(SysDept sysDept); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysDictDataMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysDictDataMapper.java new file mode 100644 index 0000000..8abaa8c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysDictDataMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysDictData; + +/** + * 字典数据 Mapper + * @author YenHex + * @date 2022-11-04 + */ +public interface SysDictDataMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysDictMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysDictMapper.java new file mode 100644 index 0000000..29c0c9f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysDictMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysDict; + +/** + * 字典 Mapper + * @author YenHex + * @date 2022-05-20 + */ +public interface SysDictMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysMenuMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysMenuMapper.java new file mode 100644 index 0000000..6e32c8d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysMenuMapper.java @@ -0,0 +1,42 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysMenu; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 系统菜单 Mapper + * @author YenHex + * @date 2022-03-15 + */ +public interface SysMenuMapper extends BaseMapper { + + /** + * 查询用户所有菜单ID + * @param userId + * @return + */ + @Select("select distinct srm.menu_id from sys_user_role sur " + + " LEFT JOIN sys_role_menu srm ON sur.role_id = srm.role_id WHERE sur.user_id = #{userId}" + + " and srm.menu_id is not null and sur.del_flag = b'0' and srm.del_flag = '0'") + List searchUserMenuIds(@Param("userId") String userId); + + /** + * 加载角色菜单id + * @param roleIds + * @return + */ + List searchDefaultMenuIds(@Param("roleIds") List roleIds); + + /** + * 查询所有菜单ID + * @return + */ + @Select("select id from sys_menu where del_flag = '0'") + List searchMenuIds(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysMenuPermitMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysMenuPermitMapper.java new file mode 100644 index 0000000..0ba0353 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysMenuPermitMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysMenuPermit; + +/** + * 菜单权限 Mapper + * @author YenHex + * @date 2022-03-15 + */ +public interface SysMenuPermitMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysNoticeMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysNoticeMapper.java new file mode 100644 index 0000000..0c88201 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysNoticeMapper.java @@ -0,0 +1,13 @@ +package com.qs.serve.modules.sys.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysNotice; + +/** + * 注意信息 Mapper + * @author YenHex + * @date 2022-03-01 + */ +public interface SysNoticeMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysNoticeTypeMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysNoticeTypeMapper.java new file mode 100644 index 0000000..4358758 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysNoticeTypeMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysNoticeType; + +/** + * 注意信息分类 Mapper + * @author YenHex + * @date 2022-03-01 + */ +public interface SysNoticeTypeMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysNoticeUserMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysNoticeUserMapper.java new file mode 100644 index 0000000..80111eb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysNoticeUserMapper.java @@ -0,0 +1,42 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.qs.serve.modules.sys.entity.SysNoticeUser; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 注意信息&用户关系 Mapper + * @author YenHex + * @date 2022-03-01 + */ +public interface SysNoticeUserMapper extends BaseMapper { + + IPage list2(Page page, @Param("query") SysNoticeUser grouponUser); + + /** + * 统计未读公告 + * @param userId + * @param tenant + * @return + */ + @Select("SELECT " + + " notice.id " + + "FROM " + + " sys_notice_user notice_user " + + " LEFT JOIN sys_notice notice ON notice_user.notice_id = notice.id " + + "WHERE " + + " notice.del_flag = b'0' " + + " AND notice.tenant_id = #{tenant} " + + " AND notice_user.read_flag = '0' " + + " AND notice_user.user_id = #{userId} GROUP BY notice.id ") + @InterceptorIgnore(tenantLine = "1") + List countMyRead(@Param("userId") String userId, @Param("tenant") String tenant); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysOperationLogMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysOperationLogMapper.java new file mode 100644 index 0000000..586e136 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysOperationLogMapper.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysOperationLog; + +/** + * 操作日志 Mapper + * @author YenHex + * @date 2022-03-08 + */ +public interface SysOperationLogMapper extends BaseMapper { + + /** + * 保存日志 + * @param log + * @return + */ + @InterceptorIgnore(tenantLine = "true") + boolean saveLog(SysOperationLog log); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysOperationManualMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysOperationManualMapper.java new file mode 100644 index 0000000..b1968d4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysOperationManualMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysOperationManual; + +/** + * Mapper + * @author YenHex + * @date 2023-08-11 + */ +public interface SysOperationManualMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysPermitMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysPermitMapper.java new file mode 100644 index 0000000..d813a8d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysPermitMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysPermit; + +/** + * 系统权限 Mapper + * @author YenHex + * @date 2022-03-01 + */ +public interface SysPermitMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysPostMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysPostMapper.java new file mode 100644 index 0000000..a927f1f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysPostMapper.java @@ -0,0 +1,38 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysPost; +import org.apache.ibatis.annotations.Update; + +/** + * 系统职务 Mapper + * @author YenHex + * @date 2022-04-01 + */ +public interface SysPostMapper extends BaseMapper { + + /** + * 修改post表 更关联表post_user + * @return + */ + @Update("update sys_post_user " + + " left join sys_post " + + " on sys_post_user.post_id = sys_post.id" + + " set " + + " sys_post_user.post_code = sys_post.post_code, " + + " sys_post_user.post_name = sys_post.post_name " + + " where sys_post_user.del_flag = 0 and sys_post.del_flag = 0 ") + int updatePostUserInfo(); + + /** + * 根据岗位更新员工的路径绑定ID + * @return + */ + @Update("update sys_post_user " + + "left join sys_post on sys_post_user.post_id = sys_post.id " + + "set sys_post_user.path_ids = sys_post.path_ids, " + + "sys_post_user.path_names = sys_post.path_names ") + int updatePostUserIdPaths(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysPostUserMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysPostUserMapper.java new file mode 100644 index 0000000..6b4536f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysPostUserMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysPostUser; + +/** + * 系统职务 Mapper + * @author YenHex + * @date 2023-04-27 + */ +public interface SysPostUserMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysRoleMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysRoleMapper.java new file mode 100644 index 0000000..b65a9be --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysRoleMapper.java @@ -0,0 +1,13 @@ +package com.qs.serve.modules.sys.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysRole; + +/** + * 系统角色 Mapper + * @author YenHex + * @date 2022-03-01 + */ +public interface SysRoleMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysRoleMenuMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysRoleMenuMapper.java new file mode 100644 index 0000000..dbbb50d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysRoleMenuMapper.java @@ -0,0 +1,42 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysPermit; +import com.qs.serve.modules.sys.entity.SysRoleMenu; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 菜单用户 Mapper + * @author YenHex + * @date 2022-03-16 + */ +public interface SysRoleMenuMapper extends BaseMapper { + + /** + * 查询权限编码 + * @param roleIds + * @return + */ + @Select("") + @InterceptorIgnore(tenantLine = "1") + List listPermitCode(List roleIds); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysSyncLogMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysSyncLogMapper.java new file mode 100644 index 0000000..cb44249 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysSyncLogMapper.java @@ -0,0 +1,21 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysSyncLog; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 同步日志 Mapper + * @author YenHex + * @date 2023-03-15 + */ +public interface SysSyncLogMapper extends BaseMapper { + + @Select("SELECT * FROM `jsl_cost_base`.`sys_sync_log` WHERE `form_plat` = '一站式费用' and request_json ->> '$.costCode' = #{costCode} limit 1 ") + SysSyncLog selectThirtyLogByCostCode(@Param("costCode") String costCode); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysTableTempMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysTableTempMapper.java new file mode 100644 index 0000000..8be8902 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysTableTempMapper.java @@ -0,0 +1,50 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysTableTemp; +import com.qs.serve.modules.tbs.entity.TbsBudgetCostItem; +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 + * @date 2024-01-15 + */ +public interface SysTableTempMapper extends BaseMapper { + + @InterceptorIgnore(tenantLine = "1") + @Select("select t1.* from tbs_budget_cost_item t1 " + + " left join tbs_activity t2 on t1.activity_id = t2.id " + + " left join tbs_cost_apply t3 on t1.cost_apply_id = t3.id " + + " where 1=1 " + + " and t1.del_flag = 0 " + + " and t2.del_flag = 0 " + + " and t3.del_flag = 0 " + + " and t2.cancel_flag = 0 " + + " and t3.cancel_flag = 0 " + + " and t3.charge_state in (1,2,3) " + + //" and t1.id = 2009163" ) + " and (t1.check_state is null or t1.check_state = 0)" + + " and t3.code like '24%' limit 1000 ") + List getListByCostId(); + + @InterceptorIgnore(tenantLine = "1") + @Update("") + int updateBudgetCoistItemState(@Param("itemIds") List itemId,@Param("state") Integer state); + + @InterceptorIgnore(tenantLine = "1") + @Select("select cost_apply_id from `tbs_budget_cost_item` where check_state = 2 group by cost_apply_id ") + List getGoodsUnMatchCostIds(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysTenantMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysTenantMapper.java new file mode 100644 index 0000000..3a55a39 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysTenantMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysTenant; + +/** + * 系统租户 Mapper + * @author YenHex + * @date 2022-03-01 + */ +public interface SysTenantMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysUserCodeMathMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysUserCodeMathMapper.java new file mode 100644 index 0000000..8600d88 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysUserCodeMathMapper.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysUserCodeMath; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * 用户编码对照表 Mapper + * @author YenHex + * @date 2023-09-08 + */ +public interface SysUserCodeMathMapper extends BaseMapper { + + + @InterceptorIgnore(tenantLine = "true") + @Select("select `curr_code` from sys_user_code_math where sour_code = #{oldCode} limit 1 ") + String getNewCode(@Param("oldCode") String oldCode); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysUserLeaveMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysUserLeaveMapper.java new file mode 100644 index 0000000..1ee83da --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysUserLeaveMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysUserLeave; + +/** + * 用户离职 Mapper + * @author YenHex + * @date 2023-02-13 + */ +public interface SysUserLeaveMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysUserMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysUserMapper.java new file mode 100644 index 0000000..d90405c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysUserMapper.java @@ -0,0 +1,55 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysUser; +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 + * @date 2022-03-01 + */ +public interface SysUserMapper extends BaseMapper { + + /** + * 检测是否有编号 + * @param code + * @return + */ + @InterceptorIgnore(tenantLine = "1") + @Select("SELECT count(1) FROM `sys_user` sys_user where sys_user.code = #{code}") + long checkCode(@Param("code") String code); + + /** + * 更新友盟token + * @param uid + * @param token + * @param appClient + */ + @InterceptorIgnore(tenantLine = "1") + @Update("update `sys_user` sys_user set app_token = #{token}, app_client=#{appClient} where id = #{uid}") + void updateYmTokenInt(@Param("uid")String uid,@Param("token")String token,@Param("appClient")String appClient); + + /** + * 移除友盟遗留的token,登录时调用 + * @param token + */ + @InterceptorIgnore(tenantLine = "1") + @Update("update `sys_user` sys_user set sys_user.app_token = '#' where sys_user.app_token = #{token}") + void clearYmToken(@Param("token")String token); + + /** + * 查询用户 + * @param sysUser + * @return + */ + @InterceptorIgnore(tenantLine = "1") + List listUser(@Param("query") SysUser sysUser); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysUserRoleMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysUserRoleMapper.java new file mode 100644 index 0000000..076e8ba --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysUserRoleMapper.java @@ -0,0 +1,15 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysUserRole; + + +/** + * 用户角色 Mapper + * @author YenHex + * @date 2022-03-01 + */ +public interface SysUserRoleMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysUserSalesMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysUserSalesMapper.java new file mode 100644 index 0000000..17f0e57 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/mapper/SysUserSalesMapper.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.sys.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysUserSales; +import org.apache.ibatis.annotations.Param; +import java.util.List; + +/** + * Mapper + * @author YenHex + * @date 2022-10-12 + */ +public interface SysUserSalesMapper extends BaseMapper { + + @InterceptorIgnore(tenantLine = "1") + List selectSysUserSalesList(@Param("query") SysUserSales userSales); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysAttachService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysAttachService.java new file mode 100644 index 0000000..f3db1c1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysAttachService.java @@ -0,0 +1,33 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysAttach; + +import java.io.Serializable; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +/** + * 系统附件 服务接口 + * @author YenHex + * @date 2022-03-24 + */ +public interface SysAttachService extends IService { + + @Override + default List listByIds(Collection idList) { + List attaches = IService.super.listByIds(idList); + return attaches; + } + + default List listByIdArrs(String[] ids) { + if(ids==null||ids.length==0){ + return null; + } + List attaches = IService.super.listByIds(Arrays.asList(ids)); + return attaches; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysBusinessLogService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysBusinessLogService.java new file mode 100644 index 0000000..61866ce --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysBusinessLogService.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.common.enums.BusinessLogOption; +import com.qs.serve.modules.sys.common.enums.BusinessLogType; +import com.qs.serve.modules.sys.entity.SysBusinessLog; + +/** + * 服务接口 + * @author YenHex + * @date 2023-04-25 + */ +public interface SysBusinessLogService extends IService { + + + void buildLog4Save(BusinessLogType logType, String targetId,String targetCode,String targetName, String targetRelateId,Object newVal); + + void buildLog4Delete(BusinessLogType logType, String targetId,String targetCode,String targetName,String targetRelateId); + + void buildLog4Change(BusinessLogType logType, String targetId,String targetCode,String targetName,String targetRelateId, Object orgVal, Object newVal); + + void baseBuildLog(BusinessLogType logType, String targetId,String targetCode,String targetName,String targetRelateId, Object orgVal, Object newVal,BusinessLogOption option); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysConfigService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysConfigService.java new file mode 100644 index 0000000..1fa4a77 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysConfigService.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysConfig; + +/** + * 服务接口 + * @author YenHex + * @date 2022-11-12 + */ +public interface SysConfigService extends IService { + + SysConfig getByKey(String key); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysDeleteLogService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysDeleteLogService.java new file mode 100644 index 0000000..14ba894 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysDeleteLogService.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysDeleteLog; + +/** + * 删除日志 服务接口 + * @author YenHex + * @date 2023-12-08 + */ +public interface SysDeleteLogService extends IService { + + /** + * 删除费用申请相关所有数据 + * @param costApplyId + * @param remark + * @param skipPayFlag 跳过审批 + */ + void deleteCostApply(Long costApplyId,String remark); + void deleteCostApply(Long costApplyId,String remark,boolean skipPayFlag,String userCode); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysDeptService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysDeptService.java new file mode 100644 index 0000000..cf59c86 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysDeptService.java @@ -0,0 +1,38 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysDept; + +import java.util.List; + +/** + * 部门信息 服务接口 + * @author YenHex + * @date 2022-02-28 + */ +public interface SysDeptService extends IService { + + /** + * 保存 + * @param dept + * @return + */ + boolean save2(SysDept dept); + + /** + * 列表查询 + * @param sysDept + * @return + */ + List listDept(SysDept sysDept); + + /** + * id查询部门 + * @param ids + * @param loadChild + * @return + */ + List listDeptByIds(List ids,boolean loadChild); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysDictDataService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysDictDataService.java new file mode 100644 index 0000000..68f11cc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysDictDataService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysDictData; + +/** + * 字典数据 服务接口 + * @author YenHex + * @date 2022-11-04 + */ +public interface SysDictDataService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysDictService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysDictService.java new file mode 100644 index 0000000..3763f1d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysDictService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysDict; + +/** + * 字典 服务接口 + * @author YenHex + * @date 2022-05-20 + */ +public interface SysDictService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysMenuPermitService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysMenuPermitService.java new file mode 100644 index 0000000..344cde3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysMenuPermitService.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysMenuPermit; + +import java.util.List; + +/** + * 菜单权限 服务接口 + * @author YenHex + * @date 2022-03-15 + */ +public interface SysMenuPermitService extends IService { + + void removeByMenuId(String menuId); + + List listByMenuId(String menuId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysMenuService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysMenuService.java new file mode 100644 index 0000000..0af8250 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysMenuService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysMenu; + +/** + * 系统菜单 服务接口 + * @author YenHex + * @date 2022-03-15 + */ +public interface SysMenuService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysNoticeService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysNoticeService.java new file mode 100644 index 0000000..2d58fae --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysNoticeService.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysNotice; + +/** + * 注意信息 服务接口 + * @author YenHex + * @date 2022-03-01 + */ +public interface SysNoticeService extends IService { + + /** + * 发布 + * @param id + */ + void publish(String id); + + /** + * 删除用户关联 + * @param id + */ + void removeUserRelate(String id); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysNoticeTypeService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysNoticeTypeService.java new file mode 100644 index 0000000..3c5acaf --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysNoticeTypeService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysNoticeType; + +/** + * 注意信息分类 服务接口 + * @author YenHex + * @date 2022-03-01 + */ +public interface SysNoticeTypeService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysNoticeUserService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysNoticeUserService.java new file mode 100644 index 0000000..283baef --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysNoticeUserService.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysNoticeUser; + +/** + * 注意信息&用户关系 服务接口 + * @author YenHex + * @date 2022-03-01 + */ +public interface SysNoticeUserService extends IService { + + IPage list2(Page page,SysNoticeUser grouponUser); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysOperationLogService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysOperationLogService.java new file mode 100644 index 0000000..9eb7023 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysOperationLogService.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysOperationLog; + +/** + * 操作日志 服务接口 + * @author YenHex + * @date 2022-03-08 + */ +public interface SysOperationLogService extends IService { + + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysOperationManualService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysOperationManualService.java new file mode 100644 index 0000000..af8d2b0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysOperationManualService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysOperationManual; + +/** + * 服务接口 + * @author YenHex + * @date 2023-08-11 + */ +public interface SysOperationManualService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysPermitService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysPermitService.java new file mode 100644 index 0000000..772c4a0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysPermitService.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysPermit; + +import java.util.List; + +/** + * 系统权限 服务接口 + * @author YenHex + * @date 2022-03-01 + */ +public interface SysPermitService extends IService { + + /** + * 权限列表 + * @return + */ + List listByCache(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysPostService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysPostService.java new file mode 100644 index 0000000..0e373f7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysPostService.java @@ -0,0 +1,21 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysPost; + +/** + * 系统职务 服务接口 + * @author YenHex + * @date 2022-04-01 + */ +public interface SysPostService extends IService { + + void modify(SysPost param); + + /** + * 刷新路径IDs + */ + void flushPathIds(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysPostUserService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysPostUserService.java new file mode 100644 index 0000000..3bd0b00 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysPostUserService.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysPostUser; +import com.qs.serve.modules.sys.entity.bo.SysPostUserBo; +import java.util.List; +/** + * 系统职务 服务接口 + * @author YenHex + * @date 2023-04-27 + */ +public interface SysPostUserService extends IService { + + List listByChildIds(String userId); + + List listByUserId(String userId); + + List listByUserIds(List userIds); + + void updatePathIds(String orgPathIds,String newPathIds,String orgPathNames,String newPathNames); + + void bind(SysPostUserBo param); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysRoleMenuService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysRoleMenuService.java new file mode 100644 index 0000000..aeb3ee4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysRoleMenuService.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysMenu; +import com.qs.serve.modules.sys.entity.SysRoleMenu; + +import java.util.List; + +/** + * 菜单用户 服务接口 + * @author YenHex + * @date 2022-03-16 + */ +public interface SysRoleMenuService extends IService { + + boolean removeByRoleId(String roleId,Integer clientType); + + List listByRoleId(String roleId); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysRoleService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysRoleService.java new file mode 100644 index 0000000..47483c7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysRoleService.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysRole; + +import java.util.List; + +/** + * 系统角色 服务接口 + * @author YenHex + * @date 2022-03-01 + */ +public interface SysRoleService extends IService { + + /** + * 加载可用角色 + * @param ids + * @return + */ + List getEnableByIds(List ids); + + /** + * 默认的角色 + * @return + */ + List getDefaultRole(); + + void saveUserRole4Edit(List roleIds,String userId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysSyncLogService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysSyncLogService.java new file mode 100644 index 0000000..b1997b0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysSyncLogService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysSyncLog; + +/** + * 同步日志 服务接口 + * @author YenHex + * @date 2023-03-15 + */ +public interface SysSyncLogService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysTenantService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysTenantService.java new file mode 100644 index 0000000..19ef731 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysTenantService.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysTenant; + +import java.util.List; + +/** + * 系统租户 服务接口 + * @author YenHex + * @date 2022-03-01 + */ +public interface SysTenantService extends IService { + + List list2(); + + SysTenant getCurrent(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysUserLeaveService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysUserLeaveService.java new file mode 100644 index 0000000..cec9e02 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysUserLeaveService.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.entity.SysUserLeave; + +/** + * 用户离职 服务接口 + * @author YenHex + * @date 2023-02-13 + */ +public interface SysUserLeaveService extends IService { + + SysUserLeave getOneByUserId(String userId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysUserLoginService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysUserLoginService.java new file mode 100644 index 0000000..c8cbdf9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysUserLoginService.java @@ -0,0 +1,32 @@ +package com.qs.serve.modules.sys.service; + +import com.qs.serve.modules.sys.entity.dto.SysLoginByPhoneParam; +import com.qs.serve.modules.sys.entity.dto.SysLoginParam; + +import java.util.Map; + +/** + * @author YenHex + * @since 2022/3/1 + */ +public interface SysUserLoginService { + + + /** + * 登录 + * @param loginParam + * @return + */ + Map login(SysLoginParam loginParam); + + Map login(String loginCode); + + String loginBySyUserId(String syUserId); + + /** + * 手机登陆 + * @param loginParam + * @return + */ + Map login(SysLoginByPhoneParam loginParam); +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysUserRoleService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysUserRoleService.java new file mode 100644 index 0000000..8b65df3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysUserRoleService.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysUserRole; + +import java.util.List; + +/** + * 用户角色 服务接口 + * @author YenHex + * @date 2022-03-01 + */ +public interface SysUserRoleService extends IService { + /** + * 用户查询列表 + * @param uid + * @return + */ + List listByUid(String uid); + + List notDataUserIds(String roleId,List userIds); + + boolean removeByRoleId(String roleId); + + boolean remove(String roleId,List userIds); + + boolean replaceAndRemove(String leafUserId,String enterUserId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysUserSalesService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysUserSalesService.java new file mode 100644 index 0000000..58f2675 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysUserSalesService.java @@ -0,0 +1,38 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.sys.entity.SysUserSales; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 服务接口 + * @author YenHex + * @date 2022-10-12 + */ +public interface SysUserSalesService extends IService { + + /** + * 加载所有销售人员 + * @param userSales + * @return + */ + List selectSysUserSalesList(SysUserSales userSales); + + /** + * 通过路径查询 + * @param pathId + * @return + */ + List listByPathId(String pathId); + + /** + * 加载销售人员下所有下级 + * @param userId + * @return + */ + List listByChildIds(String userId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysUserService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysUserService.java new file mode 100644 index 0000000..f928570 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/SysUserService.java @@ -0,0 +1,85 @@ +package com.qs.serve.modules.sys.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.common.framework.security.model.LoginUser; +import com.qs.serve.modules.sys.entity.SysPostUser; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.entity.bo.SysUserLeaveBo; + +import java.time.LocalDate; +import java.util.List; + +/** + * 系统用户 服务接口 + * @author YenHex + * @date 2022-03-01 + */ +public interface SysUserService extends IService { + + void updateSeeYonPassword(String syUserId,String password); + + /** + * 账号查询 + * @param acc + * @return + */ + SysUser getByAccount(String acc); + + SysUser getByIdentityNo(String acc); + + SysUser getBySyId(String acc); + + LoginUser getLoginUserByAccount(String account); + + LoginUser getLoginUserById(String id); + + /** + * 用户列表 + * @param sysUser + * @return + */ + List listUser(SysUser sysUser); + + void relateInfo(SysUser sysUser,boolean loadLeave); + + LoginUser buildLoginUser(SysUser sysUser); + + List listByOaMemberIds(List memberIds); + List listByCodes(List codes); + + SysUser listByOaMemberId(String memberId); + + /** + * 用户离职 + * @param userLeaveParam + */ + void leave(SysUserLeaveBo userLeaveParam); + + /** + * 立刻离职执行函数 + * @param userIds + * @param updateLeaveStatus + */ + void leaveNow(List userIds,Boolean updateLeaveStatus); + + /** + * 取消离职 + * @param userId + */ + void cancelLeave(String userId); + + /** + * 重新入职 + * @param userId + */ + void reEntry(String userId); + + /** + * 通过岗位上下级加载下级用户 + * @param userId + * @return + */ + List listByChildIds(String userId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysAttachServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysAttachServiceImpl.java new file mode 100644 index 0000000..740a8b7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysAttachServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.sys.entity.SysAttach; +import com.qs.serve.modules.sys.mapper.SysAttachMapper; +import com.qs.serve.modules.sys.service.SysAttachService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 系统附件 服务实现类 + * @author YenHex + * @since 2022-03-24 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysAttachServiceImpl extends ServiceImpl implements SysAttachService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysBusinessLogServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysBusinessLogServiceImpl.java new file mode 100644 index 0000000..7f317ff --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysBusinessLogServiceImpl.java @@ -0,0 +1,82 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.DiffFieldVal; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.BusinessDifferenceUtil; +import com.qs.serve.common.util.JsonUtil; +import com.qs.serve.modules.sys.common.enums.BusinessLogOption; +import com.qs.serve.modules.sys.common.enums.BusinessLogType; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.sys.entity.SysBusinessLog; +import com.qs.serve.modules.sys.service.SysBusinessLogService; +import com.qs.serve.modules.sys.mapper.SysBusinessLogMapper; + +import java.util.List; + +/** + * 服务实现类 + * @author YenHex + * @since 2023-04-25 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysBusinessLogServiceImpl extends ServiceImpl implements SysBusinessLogService { + + SysUserMapper sysUserMapper; + + @Override + public void buildLog4Save(BusinessLogType logType, String targetId,String targetCode,String targetName,String targetRelateId, Object newVal) { + BusinessLogOption option = BusinessLogOption.SAVE; + this.baseBuildLog(logType,targetId,targetCode,targetName,targetRelateId,null,newVal,option); + } + + @Override + public void buildLog4Delete(BusinessLogType logType, String targetId,String targetCode,String targetName,String targetRelateId) { + BusinessLogOption option = BusinessLogOption.DELETE; + this.baseBuildLog(logType,targetId,targetCode,targetName,targetRelateId,null,null,option); + } + + @Override + public void buildLog4Change(BusinessLogType logType, String targetId,String targetCode,String targetName,String targetRelateId, Object orgVal, Object newVal) { + BusinessLogOption option = BusinessLogOption.UPDATE; + this.baseBuildLog(logType,targetId,targetCode,targetName,targetRelateId,orgVal,newVal,option); + } + + @Override + public void baseBuildLog(BusinessLogType logType, String targetId,String targetCode,String targetName, String targetRelateId,Object orgVal, Object newVal, BusinessLogOption option) { + try { + List diffFieldValList = BusinessDifferenceUtil.getDifferenceList(orgVal,newVal); + if(option.equals(BusinessLogOption.UPDATE)&&diffFieldValList.size()<1){ + return; + } + SysBusinessLog businessLog = new SysBusinessLog(); + SysUser sysUser = sysUserMapper.selectById(AuthContextUtils.getSysUserId()); + businessLog.setUserId(sysUser.getId()); + businessLog.setUserCode(sysUser.getCode()); + businessLog.setUserName(sysUser.getName()); + businessLog.setTargetType(logType.getLabel()); + businessLog.setTargetId(targetId); + businessLog.setOptType(option.getLabel()); + if(orgVal!=null){ + businessLog.setOrgJson(JsonUtil.objectToJson(orgVal)); + } + if(newVal!=null){ + businessLog.setNewJson(JsonUtil.objectToJson(newVal)); + } + businessLog.setDiffJson(JsonUtil.objectToJson(diffFieldValList)); + businessLog.setTargetCode(targetCode); + businessLog.setTargetName(targetName); + businessLog.setTargetRelateId(targetRelateId); + this.save(businessLog); + } catch (Exception e) { + e.printStackTrace(); + } + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysConfigServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysConfigServiceImpl.java new file mode 100644 index 0000000..99dc88c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysConfigServiceImpl.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.sys.entity.SysConfig; +import com.qs.serve.modules.sys.service.SysConfigService; +import com.qs.serve.modules.sys.mapper.SysConfigMapper; + +/** + * 服务实现类 + * @author YenHex + * @since 2022-11-12 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysConfigServiceImpl extends ServiceImpl implements SysConfigService { + + @Override + public SysConfig getByKey(String key) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SysConfig::getConfigKey,key); + SysConfig sysConfig = this.getOne(lqw); + return sysConfig; + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysDeleteLogServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysDeleteLogServiceImpl.java new file mode 100644 index 0000000..77b4608 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysDeleteLogServiceImpl.java @@ -0,0 +1,177 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.R; +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.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.entity.dto.CostDeletion; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.entity.TbsCostTodo; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyRemoveMapper; +import com.qs.serve.modules.tbs.mapper.TbsCostTodoMapper; +import com.qs.serve.modules.third.entity.ThirtyVerification; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.sys.entity.SysDeleteLog; +import com.qs.serve.modules.sys.service.SysDeleteLogService; +import com.qs.serve.modules.sys.mapper.SysDeleteLogMapper; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +/** + * 删除日志 服务实现类 + * @author YenHex + * @since 2023-12-08 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysDeleteLogServiceImpl extends ServiceImpl implements SysDeleteLogService { + + private final TbsCostApplyRemoveMapper tbsCostApplyRemoveMapper; + private final TbsCostApplyMapper tbsCostApplyMapper; + private final VtbVerificationMapper verificationMapper; + private final TbsCostTodoMapper tbsCostTodoMapper; + private final BmsSupplierMapper supplierMapper; + private final SeeYonRequestService seeYonService; + private final SysUserService sysUserService; + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteCostApply(Long costApplyId, String remark, boolean skipPayFlag,String userCode) { + + if(!StringUtils.hasText(userCode)){ + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + userCode = sysUser.getCode(); + } + + if(!StringUtils.hasText(remark)||remark.length()<6){ + Assert.throwEx("请详细注明删除备注"); + } + + TbsCostApply costApply = tbsCostApplyMapper.selectById(costApplyId); + BmsSupplier supplier = supplierMapper.selectById(costApply.getSupplierId()); + + String batchCode = System.currentTimeMillis()+""; + List deleteLogList = new ArrayList<>(); + String skipMsg = skipPayFlag?"(跳过删除支付)":""; + if(costApply!=null){ + SysDeleteLog deleteLog = new SysDeleteLog(); + deleteLog.setBatchCode(batchCode); + deleteLog.setTargetTable("tbs_cost_apply"); + deleteLog.setTargetId(costApply.getId()+""); + deleteLog.setTargetCode(costApply.getCode()); + deleteLog.setRemark(remark+skipMsg); + deleteLogList.add(deleteLog); + } + + if(costApply.getContractFlag().equals(1)){ + boolean checkExist = seeYonService.checkConstCodeExist(costApply.getCode()); + if(!checkExist){ + Assert.throwEx("流程在OA已存在,优先删除OA数据,再调用该接口"); + } + } + + if (!skipPayFlag){ + // 远程删除ERP + String url = "http://59.37.164.96:2505/api/cms/cost/deletion"; + // 试吃品删除逻辑 + if(costApply.getCode().contains("SHX")){ + url = "http://59.37.164.96:2505/api/cms/cost/shxDelete"; + } + CostDeletion costDeletion = new CostDeletion(); + costDeletion.setEmpNo(userCode); + String bookCode = ThirtyVerification.getInitBookCode(supplier.getBookCode(),supplier.getCode()); + costDeletion.setCacc(bookCode); + costDeletion.setVerificationCode(costApply.getCode()); + String rs = HttpUtil.doPost(url, JsonUtil.objectToJson(costDeletion),null); + R rsObj = JsonUtil.jsonToPojo(rs, R.class); + log.warn("【请求删除ERP费用】{},返回结果:{}",costApplyId,rs); + if(rsObj==null||!rsObj.getStatus().equals(200)){ + Assert.throwEx("远程删除失败:"+rs); + } + } + + + tbsCostApplyRemoveMapper.tbs_cost_apply(costApplyId); + + tbsCostApplyRemoveMapper.tbs_activity(costApplyId); + tbsCostApplyRemoveMapper.tbs_activity_center(costApplyId); + tbsCostApplyRemoveMapper.tbs_activity_center_goods(costApplyId); + tbsCostApplyRemoveMapper.tbs_activity_goods(costApplyId); + tbsCostApplyRemoveMapper.tbs_activity_channel(costApplyId); + tbsCostApplyRemoveMapper.tbs_activity_channel_point(costApplyId); + tbsCostApplyRemoveMapper.tbs_activity_pay_condition(costApplyId); + tbsCostApplyRemoveMapper.tbs_activity_slotting_fee(costApplyId); + tbsCostApplyRemoveMapper.tbs_activity_subject(costApplyId); + tbsCostApplyRemoveMapper.tbs_activity_subject_yarn(costApplyId); + //记录进行中的核销 + LambdaQueryWrapper verificationLqw = new LambdaQueryWrapper<>(); + verificationLqw.eq(VtbVerification::getCostApplyId,costApplyId); + List vtbVerificationList = verificationMapper.selectList(verificationLqw); + for (VtbVerification verification : vtbVerificationList) { + SysDeleteLog deleteLog = new SysDeleteLog(); + deleteLog.setBatchCode(batchCode); + deleteLog.setTargetTable("vtb_verification"); + deleteLog.setTargetId(verification.getId()+""); + deleteLog.setTargetCode(verification.getVerificationCode()); + deleteLog.setRemark(remark); + deleteLogList.add(deleteLog); + } + tbsCostApplyRemoveMapper.vtb_verification(costApplyId); + tbsCostApplyRemoveMapper.pay_payment(costApplyId); + tbsCostApplyRemoveMapper.pay_payment_item(costApplyId); + tbsCostApplyRemoveMapper.tbs_budget_log(costApplyId); + //移除CA订单 + tbsCostApplyRemoveMapper.tbs_budget_log_policy(costApplyId); + tbsCostApplyRemoveMapper.tbs_budget_cost_item(costApplyId); + tbsCostApplyRemoveMapper.tbs_budget_cost_item_split(costApplyId); + tbsCostApplyRemoveMapper.vtb_fund_flow(costApplyId); + //tbsCostApplyRemoveMapper.bir_activity_center_goods(costApplyId); + tbsCostApplyRemoveMapper.bir_base_activity(costApplyId); + tbsCostApplyRemoveMapper.bir_payment_item(costApplyId); + tbsCostApplyRemoveMapper.vtb_verification_subject(costApplyId); + tbsCostApplyRemoveMapper.vtb_verification_yard_item(costApplyId); + tbsCostApplyRemoveMapper.vtb_verification_yard_center_item(costApplyId); + tbsCostApplyRemoveMapper.vtb_verification_subject_center(costApplyId); + tbsCostApplyRemoveMapper.vtb_verification_channel_point(costApplyId); + tbsCostApplyRemoveMapper.vtb_verification_channel(costApplyId); + tbsCostApplyRemoveMapper.tbs_cost_contract(costApplyId); + tbsCostApplyRemoveMapper.tbs_cost_percent(costApplyId); + //记录进行中的协议条款 + LambdaQueryWrapper todoLqw = new LambdaQueryWrapper<>(); + todoLqw.eq(TbsCostTodo::getCostApplyId,costApplyId); + List costTodoList = tbsCostTodoMapper.selectList(todoLqw); + for (TbsCostTodo costTodo : costTodoList) { + SysDeleteLog deleteLog = new SysDeleteLog(); + deleteLog.setBatchCode(batchCode); + deleteLog.setTargetTable("tbs_cost_todo"); + deleteLog.setTargetId(costTodo.getId()+""); + deleteLog.setTargetCode(costTodo.getTodoCode()); + deleteLog.setRemark(remark); + deleteLogList.add(deleteLog); + } + tbsCostApplyRemoveMapper.tbs_cost_todo(costApplyId); + this.saveBatch(deleteLogList); + BirActivityCenterGoodsUtil.buildBir(costApplyId); + } + + @Override + public void deleteCostApply(Long costApplyId,String remark) { + this.deleteCostApply(costApplyId, remark,false,null); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysDeptServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysDeptServiceImpl.java new file mode 100644 index 0000000..e25223f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysDeptServiceImpl.java @@ -0,0 +1,68 @@ +package com.qs.serve.modules.sys.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.util.IdUtil; +import com.qs.serve.common.util.TreeUtil; +import com.qs.serve.modules.sys.entity.SysDept; +import com.qs.serve.modules.sys.mapper.SysDeptMapper; +import com.qs.serve.modules.sys.service.SysDeptService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 部门信息 服务实现类 + * @author YenHex + * @since 2022-02-28 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysDeptServiceImpl extends ServiceImpl implements SysDeptService { + + @Override + public boolean save2(SysDept dept) { + dept.setId(IdUtil.getSnowFlakeId()+""); + if(dept.getParentId().equals(TreeUtil.DEFAULT_PID_STRING)){ + dept.setLevelPath(dept.getId()); + }else{ + SysDept parentDept = getById(dept.getParentId()); + dept.setLevelPath(parentDept.getLevelPath()+"_"+dept.getId()); + } + save(dept); + return true; + } + + @Override + public List listDept(SysDept sysDept) { + return baseMapper.listDept(sysDept); + } + + @Override + public List listDeptByIds(List ids, boolean loadChild) { + if(CollectionUtil.isEmpty(ids)){return null;} + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SysDept::getId,ids); + List list = list(wrapper); + if(loadChild){ + final List levels = list.stream().map(SysDept::getLevelPath).collect(Collectors.toList()); + LambdaQueryWrapper deptQueryWrapper = new LambdaQueryWrapper<>(); + deptQueryWrapper.and(wq->{ + for (int i = 0; i < levels.size(); i++) { + if(i != 0 ){ + wq.or(); + } + wq.likeRight(SysDept::getLevelPath,levels.get(i)); + } + }); + return list(deptQueryWrapper); + } + return list; + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysDictDataServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysDictDataServiceImpl.java new file mode 100644 index 0000000..948c06a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysDictDataServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.sys.entity.SysDictData; +import com.qs.serve.modules.sys.service.SysDictDataService; +import com.qs.serve.modules.sys.mapper.SysDictDataMapper; + +/** + * 字典数据 服务实现类 + * @author YenHex + * @since 2022-11-04 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysDictDataServiceImpl extends ServiceImpl implements SysDictDataService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysDictServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysDictServiceImpl.java new file mode 100644 index 0000000..b7768f6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysDictServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.sys.entity.SysDict; +import com.qs.serve.modules.sys.service.SysDictService; +import com.qs.serve.modules.sys.mapper.SysDictMapper; + +/** + * 字典 服务实现类 + * @author YenHex + * @since 2022-05-20 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysDictServiceImpl extends ServiceImpl implements SysDictService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysMenuPermitServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysMenuPermitServiceImpl.java new file mode 100644 index 0000000..c8be382 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysMenuPermitServiceImpl.java @@ -0,0 +1,38 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.sys.entity.SysMenuPermit; +import com.qs.serve.modules.sys.mapper.SysMenuPermitMapper; +import com.qs.serve.modules.sys.service.SysMenuPermitService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 菜单权限 服务实现类 + * @author YenHex + * @since 2022-03-15 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysMenuPermitServiceImpl extends ServiceImpl implements SysMenuPermitService { + + @Override + public void removeByMenuId(String menuId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysMenuPermit::getMenuId,menuId); + remove(wrapper); + } + + @Override + public List listByMenuId(String menuId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysMenuPermit::getMenuId,menuId); + return list(wrapper); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysMenuServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..2347fe6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.sys.entity.SysMenu; +import com.qs.serve.modules.sys.mapper.SysMenuMapper; +import com.qs.serve.modules.sys.service.SysMenuService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 系统菜单 服务实现类 + * @author YenHex + * @since 2022-03-15 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysNoticeServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysNoticeServiceImpl.java new file mode 100644 index 0000000..3712ede --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysNoticeServiceImpl.java @@ -0,0 +1,89 @@ +package com.qs.serve.modules.sys.service.impl; + +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.CollectionUtil; +import com.qs.serve.modules.sys.common.consts.SysStatusConst; +import com.qs.serve.modules.sys.entity.SysNotice; +import com.qs.serve.modules.sys.entity.SysNoticeUser; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysNoticeMapper; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.sys.service.SysNoticeService; +import com.qs.serve.modules.sys.service.SysNoticeUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 注意信息 服务实现类 + * @author YenHex + * @since 2022-03-01 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysNoticeServiceImpl extends ServiceImpl implements SysNoticeService { + + private SysUserMapper sysUserMapper; + private SysNoticeUserService sysNoticeUserService; + + @Override + @Transactional(rollbackFor = Exception.class) + public void publish(String id) { + SysNotice notice = getById(id); + //移除旧记录 + removeUserRelate(id); + LambdaQueryWrapper userLambdaQueryWrapper = new LambdaQueryWrapper<>(); + userLambdaQueryWrapper.select(SysUser::getId); + List userIds = null; + if(notice.getVisibleType().equals(SysStatusConst.SysNotice_VisibleType_0)){ + List userList = sysUserMapper.selectList(userLambdaQueryWrapper); + userIds = userList.stream().map(SysUser::getId).collect(Collectors.toList()); + }else if (notice.getVisibleType().equals(SysStatusConst.SysNotice_VisibleType_1)){ + if(notice.getVisibleIds()==null||notice.getVisibleIds().length<1){ + Assert.throwEx("请设置可见人员"); + } + userIds = Arrays.asList(notice.getVisibleIds()); + }else if(notice.getVisibleType().equals(SysStatusConst.SysNotice_VisibleType_2)){ + if(notice.getVisibleIds()==null||notice.getVisibleIds().length<1){ + Assert.throwEx("请设置可见部门"); + } + userLambdaQueryWrapper.in(SysUser::getDeptId,Arrays.asList(notice.getVisibleIds())); + List userList = sysUserMapper.selectList(userLambdaQueryWrapper); + userIds = userList.stream().map(SysUser::getId).collect(Collectors.toList()); + } + if(userIds!=null){ + List noticeUserList = new ArrayList<>(); + for (String userId : userIds) { + SysNoticeUser noticeUser = new SysNoticeUser(); + noticeUser.setUserId(userId); + noticeUser.setNoticeId(id); + noticeUserList.add(noticeUser); + } + List> tmpList = CollectionUtil.createList(noticeUserList,50); + for (List sysNoticeUsers : tmpList) { + sysNoticeUserService.saveBatch(sysNoticeUsers); + } + //TODO gyApiService.sendYmMsg("广雅公告消息",userIds,notice.getId(), GyApiConst.Notice); + notice.setLastPublishTime(LocalDateTime.now()); + updateById(notice); + } + } + + @Override + public void removeUserRelate(String id) { + LambdaQueryWrapper delWarp = new LambdaQueryWrapper<>(); + delWarp.eq(SysNoticeUser::getNoticeId,id); + sysNoticeUserService.remove(delWarp); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysNoticeTypeServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysNoticeTypeServiceImpl.java new file mode 100644 index 0000000..d913db6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysNoticeTypeServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.sys.entity.SysNoticeType; +import com.qs.serve.modules.sys.mapper.SysNoticeTypeMapper; +import com.qs.serve.modules.sys.service.SysNoticeTypeService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 注意信息分类 服务实现类 + * @author YenHex + * @since 2022-03-01 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysNoticeTypeServiceImpl extends ServiceImpl implements SysNoticeTypeService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysNoticeUserServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysNoticeUserServiceImpl.java new file mode 100644 index 0000000..a2c6343 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysNoticeUserServiceImpl.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysNoticeUser; +import com.qs.serve.modules.sys.mapper.SysNoticeUserMapper; +import com.qs.serve.modules.sys.service.SysNoticeUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 注意信息&用户关系 服务实现类 + * @author YenHex + * @since 2022-03-01 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysNoticeUserServiceImpl extends ServiceImpl implements SysNoticeUserService { + + @Override + public IPage list2(Page page, SysNoticeUser grouponUser) { + grouponUser.setTenantId(AuthContextUtils.getTenant()); + return baseMapper.list2(page, grouponUser); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysOperationLogServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysOperationLogServiceImpl.java new file mode 100644 index 0000000..1447f08 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysOperationLogServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.sys.entity.SysOperationLog; +import com.qs.serve.modules.sys.mapper.SysOperationLogMapper; +import com.qs.serve.modules.sys.service.SysOperationLogService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 操作日志 服务实现类 + * @author YenHex + * @since 2022-03-08 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysOperationLogServiceImpl extends ServiceImpl implements SysOperationLogService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysOperationManualServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysOperationManualServiceImpl.java new file mode 100644 index 0000000..d2cfafc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysOperationManualServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.sys.entity.SysOperationManual; +import com.qs.serve.modules.sys.service.SysOperationManualService; +import com.qs.serve.modules.sys.mapper.SysOperationManualMapper; + +/** + * 服务实现类 + * @author YenHex + * @since 2023-08-11 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysOperationManualServiceImpl extends ServiceImpl implements SysOperationManualService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysPermitServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysPermitServiceImpl.java new file mode 100644 index 0000000..0654bbe --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysPermitServiceImpl.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.sys.entity.SysPermit; +import com.qs.serve.modules.sys.mapper.SysPermitMapper; +import com.qs.serve.modules.sys.service.SysPermitService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 系统权限 服务实现类 + * @author YenHex + * @since 2022-03-01 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysPermitServiceImpl extends ServiceImpl implements SysPermitService { + + @Override + //@Cacheable(cacheNames = RedisCacheKeys.PERMIT_ALL_LIST) + public List listByCache() { + return list(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysPostServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysPostServiceImpl.java new file mode 100644 index 0000000..32e8970 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysPostServiceImpl.java @@ -0,0 +1,128 @@ +package com.qs.serve.modules.sys.service.impl; + +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.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.IdUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.sys.entity.SysPost; +import com.qs.serve.modules.sys.mapper.SysPostMapper; +import com.qs.serve.modules.sys.service.SysPostService; +import com.qs.serve.modules.sys.service.SysPostUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 系统职务 服务实现类 + * @author YenHex + * @since 2022-04-01 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysPostServiceImpl extends ServiceImpl implements SysPostService { + + SysPostUserService postUserService; + + @Override + @Transactional(rollbackFor = Exception.class) + public void modify(SysPost param) { + SysPost dbData = this.getById(param.getId()); + SysPost parent = null; + if(param.getPid()!=null&&!param.getPid().equals("0")){ + parent = this.getById(param.getPid()); + if(parent==null){ + Assert.throwEx("父级标签不存在"); + } + if(param.getId()!=null){ + String[] pids = parent.getPathIds().split("_"); + for (String pid : pids) { + if(pid.equals(param.getId())){ + Assert.throwEx("出现循环节点"); + } + } + } + } + if(param.getId()==null){ + this.save(param); + } + if(parent==null){ + param.setPid("0"); + param.setPathIds(param.getId()); + }else { + param.setPathIds(parent.getPathIds()+"_"+param.getId()); + } + if(dbData==null){ + param.setPostCode(StringUtils.genShortId()+IdUtil.genCode(4)); + this.saveOrUpdate(param); + }else { + param.setPostCode(null); + this.updateById(param); + boolean changePid = !dbData.getPid().equals(param.getPid()); + if(changePid){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.and(v1->{ + v1.eq(SysPost::getPathIds,dbData.getPathIds()) + .or().likeRight(SysPost::getPathIds,dbData.getPathIds()+"_"); + }); + List childList = this.list(lqw); + List childList4Upd = childList.stream().map(obj->{ + SysPost par = new SysPost(); + par.setId(obj.getId()); + par.setPathIds(obj.getPathIds().replace(dbData.getPathIds(),param.getPathIds())); + return par; + }).collect(Collectors.toList()); + this.updateBatchById(childList4Upd); + //更新关联表 + postUserService.updatePathIds(dbData.getPathIds(),param.getPathIds(), + dbData.getPathNames(), param.getPathNames()); + + }else { + //不进行更新 + param.setPathIds(null); + param.setPid(null); + } + this.updateById(param); + } + + } + + @Override + public void flushPathIds() { + AuthContextUtils.setTenant("001"); + String pid = "0"; + toFlushPathIds(pid, null,null); + //更新绑定的用户路径 + baseMapper.updatePostUserIdPaths(); + baseMapper.updatePostUserInfo(); + } + + /** + * 递归设置 + * @param pid + * @param pPathId + * @param pPathName + */ + private void toFlushPathIds(String pid, String pPathId,String pPathName) { + List list = list(new LambdaQueryWrapper().eq(SysPost::getPid, pid)); + for (SysPost post : list) { + if("0".equals(pid)){ + post.setPathIds(post.getId()); + post.setPathNames(post.getPostName()); + }else { + post.setPathIds(pPathId +"_"+post.getId()); + post.setPathNames(pPathName+"_"+post.getPostName()); + } + this.updateById(post); + this.toFlushPathIds(post.getId(),post.getPathIds(),post.getPostName()); + } + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysPostUserServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysPostUserServiceImpl.java new file mode 100644 index 0000000..f15e522 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysPostUserServiceImpl.java @@ -0,0 +1,137 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.sys.entity.SysPost; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.entity.bo.SysPostUserBo; +import com.qs.serve.modules.sys.mapper.SysPostMapper; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.sys.service.SysPostService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tag.entity.TagData; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.sys.entity.SysPostUser; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.mapper.SysPostUserMapper; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * 系统职务 服务实现类 + * @author YenHex + * @since 2023-04-27 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysPostUserServiceImpl extends ServiceImpl implements SysPostUserService { + + SysPostMapper postMapper; + SysUserMapper userMapper; + + + @Override + public List listByChildIds(String userId) { + List postUserList = this.listByUserId(userId); + Set userIdSet = new HashSet<>(); + for (SysPostUser postUser : postUserList) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.likeRight(SysPostUser::getPathIds,postUser.getPathIds()+"_"); + //lqw.select(SysPostUser::getUserId,SysPostUser::getId); + List sysPostUsers = this.list(lqw); + for (SysPostUser childUser : sysPostUsers) { + userIdSet.add(childUser.getUserId()); + } + } + return new ArrayList<>(userIdSet); + } + + @Override + public List listByUserId(String userId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SysPostUser::getUserId,userId); + return this.list(lqw); + } + + @Override + public List listByUserIds(List userIds) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(SysPostUser::getUserId,userIds); + return this.list(lqw); + } + + @Override + public void updatePathIds(String orgPathIds,String newPathIds,String orgPathNames,String newPathNames){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.likeRight(SysPostUser::getPathIds,orgPathIds+"_"); + lqw.select(SysPostUser::getId,SysPostUser::getPathIds); + List postUserList = this.list(lqw); + if(CollectionUtil.isNotEmpty(postUserList)){ + for (SysPostUser postUser : postUserList) { + postUser.setPathIds(postUser.getPathIds().replace(orgPathIds,newPathIds)); + } + this.updateBatchById(postUserList); + } + } + + @Override + public void bind(SysPostUserBo param) { + Integer saveType = param.getSaveType()==null?0: param.getSaveType(); + LambdaQueryWrapper postLqw = new LambdaQueryWrapper<>(); + postLqw.in(SysPost::getId,param.getPostIds()); + List postList = postMapper.selectList(postLqw); + LambdaQueryWrapper userLqw = new LambdaQueryWrapper<>(); + userLqw.in(SysUser::getId,param.getUserIds()); + List userList = userMapper.selectList(userLqw); + if(CollectionUtil.isNotEmpty(postList)&&CollectionUtil.isNotEmpty(userList)){ + //移除历史数据 + if (saveType.equals(1)){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(SysPostUser::getUserId,param.getUserIds()); + this.remove(lqw); + }else if (saveType.equals(2)){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(SysPostUser::getPostId,param.getPostIds()); + this.remove(lqw); + } + List resultList = new ArrayList<>(); + for (SysUser sysUser : userList) { + for (SysPost sysPost : postList) { + //避免重复 + if(saveType.equals(0)){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SysPostUser::getPostId,sysPost.getId()); + lqw.eq(SysPostUser::getUserId,sysUser.getId()); + if(this.count(lqw)>0){ + continue; + } + } + SysPostUser postUser = new SysPostUser(); + postUser.setUserId(sysUser.getId()); + postUser.setUserCode(sysUser.getCode()); + postUser.setUserName(sysUser.getName()); + postUser.setPostId(sysPost.getId()); + postUser.setPostName(sysPost.getPostName()); + postUser.setPostCode(sysPost.getPostCode()); + postUser.setPid(sysPost.getPid()); + postUser.setPathIds(sysPost.getPathIds()); + postUser.setPathNames(sysPost.getPathNames()); + resultList.add(postUser); + } + } + if(CollectionUtil.isNotEmpty(resultList)){ + this.saveBatch(resultList); + } + } + + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysRoleMenuServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysRoleMenuServiceImpl.java new file mode 100644 index 0000000..bfed947 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysRoleMenuServiceImpl.java @@ -0,0 +1,68 @@ +package com.qs.serve.modules.sys.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.sys.entity.SysMenu; +import com.qs.serve.modules.sys.entity.SysRoleMenu; +import com.qs.serve.modules.sys.mapper.SysRoleMenuMapper; +import com.qs.serve.modules.sys.service.SysMenuService; +import com.qs.serve.modules.sys.service.SysRoleMenuService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 菜单用户 服务实现类 + * @author YenHex + * @since 2022-03-16 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysRoleMenuServiceImpl extends ServiceImpl implements SysRoleMenuService { + + private SysMenuService sysMenuService; + + @Override + public boolean removeByRoleId(String roleId,Integer clientType) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysRoleMenu::getRoleId,roleId); + if(clientType!=null){ + List sysRoleMenus = list(wrapper); + List menuIds = sysRoleMenus.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList()); + LambdaQueryWrapper menuLambdaQueryWrapper = new LambdaQueryWrapper<>(); + menuLambdaQueryWrapper.eq(SysMenu::getClientType,clientType); + if(CollectionUtil.isNotEmpty(menuIds)){ + menuLambdaQueryWrapper.in(SysMenu::getId,menuIds); + } + List menuList = sysMenuService.list(menuLambdaQueryWrapper); + menuIds = menuList.stream().map(SysMenu::getId).collect(Collectors.toList()); + if(CollectionUtil.isNotEmpty(menuIds)){ + wrapper.in(SysRoleMenu::getMenuId,menuIds); + }else { + return true; + } + } + remove(wrapper); + return true; + } + + @Override + public List listByRoleId(String roleId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysRoleMenu::getRoleId,roleId); + List roleMenus = list(wrapper); + List menuIds = roleMenus.stream().map(SysRoleMenu::getMenuId).distinct().collect(Collectors.toList()); + if(CollectionUtil.isNotEmpty(menuIds)){ + LambdaQueryWrapper wrapper2 = new LambdaQueryWrapper<>(); + wrapper2.in(SysMenu::getId,menuIds); + return sysMenuService.list(wrapper2); + } + return null; + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysRoleServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..3fc36ea --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,94 @@ +package com.qs.serve.modules.sys.service.impl; + +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.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.sys.entity.SysRole; +import com.qs.serve.modules.sys.entity.SysUserRole; +import com.qs.serve.modules.sys.mapper.SysRoleMapper; +import com.qs.serve.modules.sys.mapper.SysUserRoleMapper; +import com.qs.serve.modules.sys.service.SysRoleService; +import com.qs.serve.modules.sys.service.SysUserRoleService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 系统角色 服务实现类 + * @author YenHex + * @since 2022-03-01 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysRoleServiceImpl extends ServiceImpl implements SysRoleService { + + private SysRoleMapper sysRoleMapper; + private SysUserRoleMapper sysUserRoleMapper; + private SysUserRoleService sysUserRoleService; + @Override + public List getEnableByIds(List ids) { + if(CollectionUtil.isEmpty(ids)){return new ArrayList<>();} + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SysRole::getId,ids); + wrapper.eq(SysRole::getEnable,1); + return list(wrapper); + } + + @Override + public List getDefaultRole() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysRole::getIsDefault,1); + wrapper.eq(SysRole::getTenantId, AuthContextUtils.getTenant()); + return list(wrapper); + } + + @Override + public void saveUserRole4Edit(List roleIds, String userId) { + //适配空选项移除角色 + if(CollectionUtil.isEmpty(roleIds)){ + LambdaQueryWrapper roleWrap = new LambdaQueryWrapper<>(); + roleWrap.eq(SysRole::getEnable,1); + roleWrap.eq(SysRole::getIsDefault,0); + List list = list(roleWrap); + roleIds = list.stream().map(SysRole::getId).collect(Collectors.toList()); + if(CollectionUtil.isNotEmpty(list)){ + //移除用户关联的用户板块的可见角色关联 + LambdaQueryWrapper delUserRole = new LambdaQueryWrapper<>(); + delUserRole.eq(SysUserRole::getUserId,userId); + delUserRole.in(SysUserRole::getRoleId,roleIds); + sysUserRoleMapper.delete(delUserRole); + } + } + //校验ID是否正常 + LambdaQueryWrapper roleWrap = new LambdaQueryWrapper<>(); + roleWrap.in(SysRole::getId,roleIds); + roleWrap.eq(SysRole::getEnable,1); + roleWrap.eq(SysRole::getUserVisible,1); + int count = baseMapper.selectCount(roleWrap).intValue(); + if(count!=roleIds.size()){ + Assert.throwEx("数据不配"); + } + //移除用户关联的用户板块的可见角色关联 + LambdaQueryWrapper delUserRole = new LambdaQueryWrapper<>(); + delUserRole.eq(SysUserRole::getUserId,userId); + delUserRole.in(SysUserRole::getRoleId,roleIds); + sysUserRoleMapper.delete(delUserRole); + //重新关联已有的角色 + List sysUserRoles = new ArrayList<>(); + for (String roleId : roleIds) { + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(userId); + userRole.setRoleId(roleId); + sysUserRoles.add(userRole); + } + sysUserRoleService.saveBatch(sysUserRoles); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysSyncLogServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysSyncLogServiceImpl.java new file mode 100644 index 0000000..3fd8ac8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysSyncLogServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.sys.entity.SysSyncLog; +import com.qs.serve.modules.sys.service.SysSyncLogService; +import com.qs.serve.modules.sys.mapper.SysSyncLogMapper; + +/** + * 同步日志 服务实现类 + * @author YenHex + * @since 2023-03-15 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysSyncLogServiceImpl extends ServiceImpl implements SysSyncLogService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysTenantServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysTenantServiceImpl.java new file mode 100644 index 0000000..aedafb9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysTenantServiceImpl.java @@ -0,0 +1,37 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.consts.RedisCacheKeys; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysTenant; +import com.qs.serve.modules.sys.mapper.SysTenantMapper; +import com.qs.serve.modules.sys.service.SysTenantService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 系统租户 服务实现类 + * @author YenHex + * @since 2022-03-01 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysTenantServiceImpl extends ServiceImpl implements SysTenantService { + + @Override + @Cacheable(cacheNames = RedisCacheKeys.Tenant_ALL_LIST) + public List list2() { + return list(); + } + + @Override + public SysTenant getCurrent() { + return getById(AuthContextUtils.getTenant()); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserDetailsServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserDetailsServiceImpl.java new file mode 100644 index 0000000..b6d784e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserDetailsServiceImpl.java @@ -0,0 +1,28 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.qs.serve.common.framework.security.model.LoginUser; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import lombok.AllArgsConstructor; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +/** + * @author YenHex + * @since 2022/3/1 + */ +@Service +@AllArgsConstructor +public class SysUserDetailsServiceImpl implements UserDetailsService { + + private final SysUserService sysUserService; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + return sysUserService.getLoginUserByAccount(username); + } + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserFlowApplication.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserFlowApplication.java new file mode 100644 index 0000000..ec093f9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserFlowApplication.java @@ -0,0 +1,104 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.oms.entity.bo.SysFlowCancelBo; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper; +import com.qs.serve.modules.tbs.service.TbsCostApplyService; +import com.qs.serve.modules.tzc.mapper.TzcPolicyMapper; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 员工任务交付主要方法 + * @author YenHex + * @since 2023/10/27 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysUserFlowApplication { + + private final TbsCostApplyMapper tbsCostApplyMapper; + private final VtbVerificationMapper verificationMapper; + private final TzcPolicyMapper tzcPolicyMapper; + private final SysUserMapper sysUserMapper; + + /** + * 费用核销 任务交付 + */ + @Transactional(rollbackFor = Exception.class) + public void tranCostApplyAndVerification(String sourUserId,String targetUserId){ + if(!StringUtils.hasText(targetUserId)){ + return; + } + SysUser sysUser = sysUserMapper.selectById(targetUserId); + tbsCostApplyMapper.updateCostExtUser(sourUserId,sysUser); + verificationMapper.updateCostExtUser(sourUserId,sysUser); + } + + /** + * 费用核销 设置数据的继承人 + * @param costIds + * @param targetUserId + * @return + */ + @Transactional(rollbackFor = Exception.class) + public void updateCostExtUserByCostIds(List costIds,String targetUserId){ + SysUser sysUser = sysUserMapper.selectById(targetUserId); + tbsCostApplyMapper.updateCostExtUserByCostIds(costIds,sysUser); + verificationMapper.updateCostExtUserByCostIds(costIds,sysUser); + } + + /** + * 费用核销 取消继承人 + * @param costIds + */ + @Transactional(rollbackFor = Exception.class) + public void cancelCostExtUserByCostIds(List costIds){ + tbsCostApplyMapper.cancelCostExtUserByCostId(costIds); + verificationMapper.cancelCostExtUserByCostIds(costIds); + } + + /** + * 政策 设置数据的继承人 + * @param policyIds + * @param targetUserId + * @return + */ + public void updateCostExtUserByPolicyIds(List policyIds,String targetUserId){ + SysUser sysUser = sysUserMapper.selectById(targetUserId); + tzcPolicyMapper.updateCostExtUserByPolicyIds(policyIds,sysUser); + } + + /** + * 政策 取消继承人 + * @param costIds + */ + public void cancelCostExtUserByPolicyIds(List costIds){ + tzcPolicyMapper.cancelCostExtUserByPolicyIds(costIds); + } + + /** + * 政策 任务交付 + */ + @Transactional(rollbackFor = Exception.class) + public void tranPolicy(String sourUserId,String targetUserId){ + if(!StringUtils.hasText(targetUserId)){ + return; + } + SysUser sysUser = sysUserMapper.selectById(targetUserId); + tzcPolicyMapper.updatePolicyExtUser(sourUserId,sysUser); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserLeaveServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserLeaveServiceImpl.java new file mode 100644 index 0000000..d289dc7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserLeaveServiceImpl.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.sys.entity.SysUserLeave; +import com.qs.serve.modules.sys.service.SysUserLeaveService; +import com.qs.serve.modules.sys.mapper.SysUserLeaveMapper; + +/** + * 用户离职 服务实现类 + * @author YenHex + * @since 2023-02-13 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysUserLeaveServiceImpl extends ServiceImpl implements SysUserLeaveService { + + @Override + public SysUserLeave getOneByUserId(String userId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SysUserLeave::getUserId,userId); + lqw.eq(SysUserLeave::getLeaveStatus,0); + return getOne(lqw,false); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserLoginServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserLoginServiceImpl.java new file mode 100644 index 0000000..dd578ea --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserLoginServiceImpl.java @@ -0,0 +1,136 @@ +package com.qs.serve.modules.sys.service.impl; + +import cn.hutool.crypto.SecureUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.framework.security.model.LoginUser; +import com.qs.serve.common.model.consts.RedisCacheKeys; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.entity.dto.SysLoginByPhoneParam; +import com.qs.serve.modules.sys.entity.dto.SysLoginParam; +import com.qs.serve.modules.sys.mapper.SysTenantMapper; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.sys.service.SysUserLoginService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.wx.mapper.WxUserMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author YenHex + * @since 2022/3/1 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysUserLoginServiceImpl implements SysUserLoginService { + + private final SysUserService sysUserService; + + private final SysUserDetailsServiceImpl userDetailsService; + + private final SysTenantMapper sysTenantMapper; + + private final SysUserMapper sysUserMapper; + + private final RedisService redisService; + + private final WxUserMapper wxUserMapper; + + @Override + public Map login(SysLoginParam loginParam) { + UserDetails userDetails = userDetailsService.loadUserByUsername(loginParam.getAccount()); + if(userDetails == null || !userDetails.getPassword().equalsIgnoreCase(SecureUtil.md5(loginParam.getPassword()))){ + throw new BadCredentialsException("账号或登录密码不正确"); + } + return buildResultMap(userDetails, loginParam.getLoginType(), loginParam.getYmToken()); + } + + @Override + public Map login(String loginCode) { + UserDetails userDetails = userDetailsService.loadUserByUsername(loginCode); + if(userDetails == null){ + throw new BadCredentialsException("账号不正确或未被收录"); + } + return buildResultMap(userDetails, "sso", null); + } + + @Override + public String loginBySyUserId(String syUserId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysUser::getSyUserId,syUserId); + List userList = sysUserMapper.selectList(wrapper); + if(userList.size()>0){ + UserDetails userDetails = sysUserService.buildLoginUser(userList.get(0)); + return buildResultMap(userDetails, "sy", "").get("token").toString(); + } + return null; + } + + @Override + public Map login(SysLoginByPhoneParam loginParam) { + String key = RedisCacheKeys.PHONE_KEY+loginParam.getPhone(); + String code = redisService.getString(key); + if(!loginParam.getCode().equals(code)){ + Assert.throwEx("验证码无效或过期"); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysUser::getAccount,loginParam.getPhone()); + List list = sysUserMapper.selectList(wrapper); + SysUser sysUser = null; + if(list.size()>0){ + if(list.size()>1){ + log.warn("用户表电话号码[{}]重复!!",loginParam.getPhone()); + } + sysUser = list.get(0); + } + AuthContextUtils.setTenant(sysUser.getTenantId()); + UserDetails userDetails = sysUserService.buildLoginUser(sysUser); + return buildResultMap(userDetails, loginParam.getLoginType(), loginParam.getYmToken()); + } + + + private Map buildResultMap(UserDetails userDetails,String loginType,String ymToken){ + LoginUser loginUser = (LoginUser)userDetails; + UsernamePasswordAuthenticationToken authentication = + new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + SecurityContextHolder.getContext().setAuthentication(authentication); + String appClient = null; + if("android".equalsIgnoreCase(loginType)){ + appClient = "android"; + }else if("ios".equalsIgnoreCase(loginType)){ + appClient = "ios"; + } + /*if(appClient!=null&&StringUtils.isNotEmpty(ymToken)){ + sysUserMapper.clearYmToken(ymToken); + sysUserMapper.updateYmTokenInt(loginUser.getUserId(),ymToken,appClient); + }*/ + String client = appClient==null?"pc":"app"; + String redisKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client,loginUser.getUserId()); + //更新管理员最后登录时间 + Map tokenMap = new HashMap<>(10); + String token = JwtUtils.generateToken(loginUser.getUserId(),loginUser.getTypeFlag(),client); + redisService.set(redisKey,token); + tokenMap.put("token", token); + tokenMap.put("userId", loginUser.getUserId()); + tokenMap.put("IP", loginUser.getLoginIp()); + tokenMap.put("tenant", sysTenantMapper.selectById(loginUser.getTenant())); + tokenMap.put("loginType",loginType); + tokenMap.put("client",client); + //拓展微信token + tokenMap.put("wxToken",""); + return tokenMap; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserRoleServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserRoleServiceImpl.java new file mode 100644 index 0000000..71ce796 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserRoleServiceImpl.java @@ -0,0 +1,81 @@ +package com.qs.serve.modules.sys.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.sys.entity.SysUserRole; +import com.qs.serve.modules.sys.mapper.SysUserRoleMapper; +import com.qs.serve.modules.sys.service.SysUserRoleService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 用户角色 服务实现类 + * @author YenHex + * @since 2022-03-01 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysUserRoleServiceImpl extends ServiceImpl implements SysUserRoleService { + + @Override + public boolean removeByRoleId(String roleId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysUserRole::getRoleId,roleId); + remove(wrapper); + return true; + } + + @Override + public List listByUid(String uid) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysUserRole::getUserId,uid); + return list(wrapper); + } + + @Override + public List notDataUserIds(String roleId, final List userIds) { + if(CollectionUtil.isEmpty(userIds)){ + return new ArrayList<>(); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.select(SysUserRole::getUserId); + wrapper.in(SysUserRole::getUserId,userIds); + wrapper.eq(SysUserRole::getRoleId,roleId); + List sysUserRoles = list(wrapper); + List dbUserIds = sysUserRoles.stream().map(SysUserRole::getUserId).collect(Collectors.toList()); + return userIds.stream().filter(uid->!dbUserIds.contains(uid)).collect(Collectors.toList()); + } + + @Override + public boolean remove(String roleId, List userIds) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SysUserRole::getUserId,userIds); + wrapper.eq(SysUserRole::getRoleId,roleId); + return remove(wrapper); + } + + @Override + public boolean replaceAndRemove(String leafUserId, String enterUserId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysUserRole::getUserId,leafUserId); + if(!StringUtils.hasText(enterUserId)){ + super.remove(wrapper); + }else { + List list = super.list(wrapper); + for (SysUserRole userRole : list) { + userRole.setUserId(enterUserId); + } + super.updateBatchById(list); + } + return true; + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserSalesServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserSalesServiceImpl.java new file mode 100644 index 0000000..fead353 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserSalesServiceImpl.java @@ -0,0 +1,67 @@ +package com.qs.serve.modules.sys.service.impl; + +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.StringUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.sys.entity.SysUserSales; +import com.qs.serve.modules.sys.service.SysUserSalesService; +import com.qs.serve.modules.sys.mapper.SysUserSalesMapper; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * @author YenHex + * @since 2022-10-12 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysUserSalesServiceImpl extends ServiceImpl implements SysUserSalesService { + + @Override + public List selectSysUserSalesList(SysUserSales userSales) { + return baseMapper.selectSysUserSalesList(userSales); + } + + @Override + public List listByPathId(String pathId) { + if(!StringUtils.hasText(pathId)){ + return new ArrayList<>(); + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.likeRight(SysUserSales::getPathIds,pathId); + lqw.ne(SysUserSales::getPathIds,pathId); + List list = this.list(lqw); +// List result = new ArrayList<>(); + //过滤数值类型脏数据 +// for (SysUserSales userSales : list) { +// String[] arr = userSales.getPathIds().split("_"); +// String lastId = arr[arr.length-1]; +// if(!lastId.equals(userSales.getUserId())){ +// continue; +// } +// result.add(userSales); +// } + return list; + } + + @Override + public List listByChildIds(String userId) { + SysUserSales sysUserSales = this.getById(userId); + if(sysUserSales!=null){ + List userSales = this.listByPathId(sysUserSales.getPathIds()); + return userSales.stream().map(SysUserSales::getUserId).collect(Collectors.toList()); + } + return new ArrayList<>(); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..5cb54eb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/sys/service/impl/SysUserServiceImpl.java @@ -0,0 +1,390 @@ +package com.qs.serve.modules.sys.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.DesensitizedUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.config.properties.SeeYonProperties; +import com.qs.serve.common.framework.security.model.LoginUser; +import com.qs.serve.common.framework.security.model.LoginUserType; +import com.qs.serve.common.model.enums.HttpCode; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.impl.BmsSupplierApplicationService; +import com.qs.serve.modules.his.service.HisUserSupplierService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.*; +import com.qs.serve.modules.sys.entity.bo.SysUserLeaveBo; +import com.qs.serve.modules.sys.entity.dto.SysUpdateSeeYonPassword; +import com.qs.serve.modules.sys.mapper.*; +import com.qs.serve.modules.sys.service.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 系统用户 服务实现类 + * @author YenHex + * @since 2022-03-01 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysUserServiceImpl extends ServiceImpl implements SysUserService { + + private final SysPostUserService sysPostUserService; + private final SysUserRoleService sysUserRoleService; + private final SysUserLeaveService sysUserLeaveService; + private final SysPermitService sysPermitService; + private final SysRoleService sysRoleService; + private final SysUserRoleService userRoleService; + private final SysDeptMapper sysDeptMapper; + private final SysMenuMapper sysMenuMapper; + private final SysPostMapper postMapper; + private final BmsSupplierMapper supplierMapper; + private final BmsSupplierApplicationService supplierApplicationService; + private final SysUserFlowApplication sysUserFlowApplication; + private final SeeYonProperties seeYonProperties; + + @Override + public void updateSeeYonPassword(String syUserId, String password) { + String apihost = seeYonProperties.getExtApi(); + if(StringUtils.hasText(syUserId)&&StringUtils.hasText(apihost)){ + String updateJson = JsonUtil.objectToJson(new SysUpdateSeeYonPassword(syUserId,password)); + try { + HttpUtil.doPost(apihost+"/api/oa/base/user/changePassword",updateJson,null); + } catch (Exception e) { + log.error(e.getMessage()); + } + } + } + + @Override + public SysUser getByAccount(String acc) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysUser::getAccount,acc); + return getOne(wrapper,false); + } + + @Override + public SysUser getByIdentityNo(String acc) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysUser::getIdentityNo,acc); + return getOne(wrapper,false); + } + + @Override + public SysUser getBySyId(String acc) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysUser::getSyUserId,acc); + return getOne(wrapper,false); + } + + @Override + public LoginUser getLoginUserByAccount(String account) { + SysUser sysUser = getByAccount(account); + if(AuthContextUtils.getTenant()==null){ + AuthContextUtils.setTenant(sysUser.getTenantId()); + } + return buildLoginUser(sysUser); + } + + @Override + public LoginUser getLoginUserById(String id) { + SysUser sysUser = getById(id); + return buildLoginUser(sysUser); + } + + @Override + public List listUser(SysUser sysUser) { + List list = baseMapper.listUser(sysUser); + list.forEach(usr->{ + usr.setMobile(DesensitizedUtil.mobilePhone(usr.getMobile())); + usr.setPassword(null); + }); + return list; + } + + @Override + public void relateInfo(SysUser sysUser,boolean loadLeave) { + if(sysUser==null){return;} + sysUser.setPassword(null); + List userRoles = sysUserRoleService.listByUid(sysUser.getId()); + List roleIds = userRoles.stream().map(SysUserRole::getRoleId).distinct().collect(Collectors.toList()); + List sysRoles = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(roleIds)){ + sysRoles = sysRoleService.getEnableByIds(roleIds); + } + sysUser.setRoleList(sysRoles); + if(sysUser.getDeptId()!=null){ + sysUser.setDeptInfo(sysDeptMapper.selectById(sysUser.getDeptId())); + } + if(loadLeave){ + SysUserLeave sysUserLeave = sysUserLeaveService.getOneByUserId(sysUser.getId()); + sysUser.setLeaveInfo(sysUserLeave); + } + List postUserList = sysPostUserService.listByUserId(sysUser.getId()); + if(CollectionUtil.isNotEmpty(postUserList)){ + List postIds = postUserList.stream().map(SysPostUser::getPostId).distinct().collect(Collectors.toList()); + List postList = postMapper.selectBatchIds(postIds); + sysUser.setPositionList(postList); + } + } + + + + @Override + public LoginUser buildLoginUser(SysUser sysUser){ + if(sysUser==null){return null;} + if(sysUser.getLoginEnable().equals(0)){ + Assert.throwEx(HttpCode.LOGIN_ERR_2); + } + List authorCodes = new ArrayList<>(); + List menuIds = new ArrayList<>(); + //以下细分到权限和菜单 +// if(sysUser.getSuperFlag().equals(1)){ +// List sysRolePermits = sysPermitService.listByCache(); +// authorCodes = sysRolePermits.stream().map(SysPermit::getCode).distinct().collect(Collectors.toList()); +// menuIds = sysMenuMapper.searchMenuIds(); +// }else { +// List userRoles = sysUserRoleService.listByUid(sysUser.getId()); +// List roleIds = userRoles.stream().map(SysUserRole::getRoleId).distinct().collect(Collectors.toList()); +// //添加默认的角色ID +// List defaultRole = sysRoleService.getDefaultRole(); +// List defaultRoleIds = defaultRole.stream().map(SysRole::getId).collect(Collectors.toList()); +// roleIds.addAll(defaultRoleIds); +// List sysRoles = sysRoleService.getEnableByIds(roleIds); +// List sysRolePermits = new ArrayList<>(); +// if(CollectionUtil.isNotEmpty(sysRoles)){ +// //listPermitCode +// sysRolePermits = sysRoleMenuMapper.listPermitCode(sysRoles.stream().map(SysRole::getId).collect(Collectors.toList())); +// } +// for (SysPermit sysRolePermit : sysRolePermits) { +// if(sysRolePermit==null){continue;} +// authorCodes.add(sysRolePermit.getCode()); +// } +// menuIds = sysMenuMapper.searchUserMenuIds(sysUser.getId()); +// List defaultRoleMenuIds = sysMenuMapper.searchDefaultMenuIds(defaultRoleIds); +// menuIds.addAll(defaultRoleMenuIds); +// } + + + List sysRolePermits = sysPermitService.listByCache(); + authorCodes = sysRolePermits.stream().map(SysPermit::getCode).distinct().collect(Collectors.toList()); + List userRoles = sysUserRoleService.listByUid(sysUser.getId()); + List roleIds = userRoles.stream().map(SysUserRole::getRoleId).distinct().collect(Collectors.toList()); + //添加默认的角色ID + List defaultRole = sysRoleService.getDefaultRole(); + List defaultRoleIds = defaultRole.stream().map(SysRole::getId).collect(Collectors.toList()); + roleIds.addAll(defaultRoleIds); + + for (SysPermit sysRolePermit : sysRolePermits) { + if(sysRolePermit==null){continue;} + authorCodes.add(sysRolePermit.getCode()); + } + menuIds = sysMenuMapper.searchUserMenuIds(sysUser.getId()); + if(defaultRoleIds.size()<1){ + Assert.throwEx("请刷新页面"); + } + List defaultRoleMenuIds = sysMenuMapper.searchDefaultMenuIds(defaultRoleIds); + menuIds.addAll(defaultRoleMenuIds); + + + + + LoginUserType userType = sysUser.getSuperFlag()==0?LoginUserType.SYS_USER:LoginUserType.SYS_SUP_USER; + return new LoginUser(sysUser.getId(),sysUser.getName(),sysUser.getPassword(), ServletUtils.getIp(null),userType,authorCodes,menuIds,sysUser.getTenantId()); + } + + @Override + public List listByOaMemberIds(List memberIds) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(SysUser::getSyUserId,memberIds); + return this.list(lqw); + } + + @Override + public List listByCodes(List codes) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(SysUser::getCode,codes); + return this.list(lqw); + } + + @Override + public SysUser listByOaMemberId(String memberId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SysUser::getSyUserId,memberId); + return this.getOne(lqw,false); + } + + @Override + public void leave(SysUserLeaveBo param) { + LocalDate currDate = LocalDate.now(); + SysUser leaveUser = this.getById(param.getUserId()); + if(currDate.isAfter(param.getLeaveEffectDate())){ + Assert.throwEx("离职日期必须大于等于今天"); + } + if(leaveUser.getServingState().equals(0)){ + Assert.throwEx("员工已离职"); + } + SysUserLeave userLeaveObj = sysUserLeaveService.getOneByUserId(param.getUserId()); + if(userLeaveObj==null){ + userLeaveObj = new SysUserLeave(); + } + userLeaveObj.setLeaveEffectDate(param.getLeaveEffectDate()); + userLeaveObj.setUserId(leaveUser.getId()); + userLeaveObj.setUserName(leaveUser.getName()); + userLeaveObj.setUserCode(leaveUser.getCode()); + if(StringUtils.hasText(param.getCusUserId())){ + SysUser cusUser = this.getById(param.getCusUserId()); + userLeaveObj.setCusUserId(cusUser.getId()); + userLeaveObj.setCusUserCode(cusUser.getCode()); + userLeaveObj.setCusUserName(cusUser.getName()); + } + if(StringUtils.hasText(param.getFlowUserId())){ + SysUser flowUser = this.getById(param.getFlowUserId()); + userLeaveObj.setFlowUserId(flowUser.getId()); + userLeaveObj.setFlowUserName(flowUser.getName()); + userLeaveObj.setFlowUserCode(flowUser.getCode()); + } + if(StringUtils.hasText(param.getRoleUserId())){ + SysUser roleUser = this.getById(param.getRoleUserId()); + userLeaveObj.setRoleUserId(roleUser.getId()); + userLeaveObj.setRoleUserCode(roleUser.getCode()); + userLeaveObj.setRoleUserName(roleUser.getName()); + }else { + userLeaveObj.setRoleUserId(""); + userLeaveObj.setRoleUserCode(""); + userLeaveObj.setRoleUserName(""); + } + userLeaveObj.setLeaveReason(param.getLeaveReason()); + sysUserLeaveService.saveOrUpdate(userLeaveObj); + //更新员工信息 + SysUser user = new SysUser(); + user.setId(leaveUser.getId()); + user.setServingState(2); + this.updateById(user); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void leaveNow(List userIds,Boolean updateLeaveStatus) { + if(userIds==null||userIds.size()<1){ + return; + } + //人员业务继承-start + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(SysUserLeave::getUserId,userIds); + lqw.eq(SysUserLeave::getLeaveStatus,0); + List sysUserLeaves = sysUserLeaveService.list(lqw); + + for (String userId : userIds) { + SysUser leaveUser = super.baseMapper.selectById(userId); + boolean match = false; + for (SysUserLeave userLeave : sysUserLeaves) { + if(userId.equals(userLeave.getUserId())){ + match = true; + //客户交接人 + String cusUserId = userLeave.getCusUserId(); + if(StringUtils.hasText(cusUserId)){ + SysUser cusUser = super.baseMapper.selectById(cusUserId); + supplierApplicationService.removeUserOfSupplierList(leaveUser,cusUser); + } + //角色交接人 + String roleUserId = userLeave.getRoleUserId(); + userRoleService.replaceAndRemove(userId,roleUserId); + //工作交接人 + String flowUserId = userLeave.getFlowUserId(); + sysUserFlowApplication.tranCostApplyAndVerification(userId,flowUserId); + } + } + //不匹配也要移除客户权限和角色 + if(!match){ + supplierApplicationService.removeUserOfSupplierList(leaveUser,null); + } + } + + + //更新离职记录标为完成 + if(updateLeaveStatus&&sysUserLeaves.size()>0){ + for (SysUserLeave userLeaf : sysUserLeaves) { + userLeaf.setLeaveStatus(1); + } + sysUserLeaveService.updateBatchById(sysUserLeaves); + } + + //离职人员信息更新 + LambdaQueryWrapper updLqw = new LambdaQueryWrapper<>(); + updLqw.in(SysUser::getId,userIds); + SysUser sysUser = new SysUser(); + sysUser.setServingState(0); + sysUser.setLoginEnable(0); + sysUser.setServingLeaveDate(LocalDate.now()); + super.update(sysUser,updLqw); + HisUserSupplierService hisUserSupplierService = SpringUtils.getBean(HisUserSupplierService.class); + hisUserSupplierService.cleanTable(); + + } + + + + + @Override + public void cancelLeave(String userId) { + SysUser sysUser = this.getById(userId); + if(!sysUser.getServingState().equals(2)){ + Assert.throwEx("非准备离职状态,取消失败"); + } + SysUser user = new SysUser(); + user.setId(sysUser.getId()); + user.setServingState(1); + this.updateById(user); + LambdaQueryWrapper leaveLqw = new LambdaQueryWrapper<>(); + leaveLqw.eq(SysUserLeave::getUserId,userId); + leaveLqw.eq(SysUserLeave::getLeaveStatus,0); + SysUserLeave userLeave = new SysUserLeave(); + userLeave.setLeaveStatus(2); + userLeave.setLeaveCancelDate(LocalDateTime.now()); + sysUserLeaveService.update(userLeave,leaveLqw); + } + + @Override + public void reEntry(String userId) { + SysUser sysUser = this.getById(userId); + if(!sysUser.getServingState().equals(0)){ + Assert.throwEx("非离职状态,操作失败"); + } + SysUser user = new SysUser(); + user.setId(userId); + user.setServingDate(LocalDate.now()); + user.setServingState(1); + user.setLoginEnable(1); + this.updateById(user); + } + + @Override + public List listByChildIds(String userId) { + List postUsers = sysPostUserService.listByUserId(userId); + if(CollectionUtil.isEmpty(postUsers)){ + return new ArrayList<>(); + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.ne(SysPostUser::getUserId,userId); + lqw.and(aa->{ + for (SysPostUser postUser : postUsers) { + aa.or().likeRight(SysPostUser::getPathIds,postUser.getPathIds()+"_"); + } + }); + List childPostUsers = sysPostUserService.list(lqw); + return childPostUsers; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/TagTypeConst.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/TagTypeConst.java new file mode 100644 index 0000000..ecdb88a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/TagTypeConst.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.tag; + +/** + * @author YenHex + * @since 2023/4/24 + */ +public interface TagTypeConst { + + String Customer = "customer"; + String Point = "point"; + String Channel = "channel"; + String Salesman = "salesman"; + + String SPU = "spu"; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/controller/TagCategoryController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/controller/TagCategoryController.java new file mode 100644 index 0000000..0c99694 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/controller/TagCategoryController.java @@ -0,0 +1,143 @@ +package com.qs.serve.modules.tag.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.common.util.TreeUtil; +import com.qs.serve.modules.tag.entity.TagData; +import com.qs.serve.modules.tag.entity.TagInfo; +import com.qs.serve.modules.tag.entity.vo.TagCategoryTreeVo; +import com.qs.serve.modules.tag.service.TagInfoService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tag.entity.TagCategory; +import com.qs.serve.modules.tag.service.TagCategoryService; + +import javax.validation.Valid; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 标签 标签分类 + * @author YenHex + * @since 2023-04-23 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tag/category") +public class TagCategoryController { + + private TagCategoryService tagCategoryService; + private TagInfoService tagInfoService; + + /** + * 树列表 + * @param param + * @return + */ + @GetMapping("/tree") + public R> getList(TagCategory param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = tagCategoryService.list(lqw); + List treeVoList = list.stream().map(cate->{ + TagCategoryTreeVo treeVo = new TagCategoryTreeVo(); + treeVo.setCategoryName(cate.getCategoryName()); + treeVo.setId(cate.getId()); + treeVo.setParentId(cate.getPid()); + treeVo.setSort(0); + treeVo.setCategoryName(cate.getCategoryName()); + treeVo.setColorVal(cate.getColorVal()); + treeVo.setBgColorVal(cate.getBgColorVal()); + treeVo.setRemark(cate.getRemark()); + return treeVo; + }).collect(Collectors.toList()); + treeVoList = TreeUtil.buildByRecursive(treeVoList,TreeUtil.DEFAULT_PID_STRING); + return R.ok(treeVoList); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(TagCategory param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = tagCategoryService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + TagCategory tagCategory = tagCategoryService.getById(id); + if(tagCategory.getPid()!=null&&!tagCategory.getPid().equals("0")){ + TagCategory p = tagCategoryService.getById(tagCategory.getPid()); + tagCategory.setParentInfo(p); + } + return R.ok(tagCategory); + } + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.Tag, title = "标签分类", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid TagCategory param){ + if(param.getId()==null){ + return R.errorNotFound(); + } + tagCategoryService.modify(param); + return R.ok(); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.Tag, title = "标签分类", biz = BizType.INSERT) + public R save(@RequestBody @Valid TagCategory param){ + param.setId(null); + tagCategoryService.modify(param); + return R.ok(param); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.Tag, title = "标签分类", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idString = StringUtils.splitIdString(ids); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(TagInfo::getTagCategoryId,idString); + if(tagInfoService.count(lqw)>0){ + return R.error("含有标签的类目无法删除"); + } + boolean result = tagCategoryService.removeByIds(idString); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/controller/TagDataController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/controller/TagDataController.java new file mode 100644 index 0000000..1a2a4ea --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/controller/TagDataController.java @@ -0,0 +1,478 @@ +package com.qs.serve.modules.tag.controller; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.dto.TargetObjectDTO; +import com.qs.serve.common.model.enums.BizType; +import com.qs.serve.common.model.enums.SystemModule; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.bms.entity.BmsChannel; +import com.qs.serve.modules.bms.entity.BmsChannelPoint; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsChannelPointService; +import com.qs.serve.modules.bms.service.BmsChannelService; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tag.TagTypeConst; +import com.qs.serve.modules.tag.entity.TagData; +import com.qs.serve.modules.tag.entity.TagInfo; +import com.qs.serve.modules.tag.entity.bo.*; +import com.qs.serve.modules.tag.entity.so.TagDataSo; +import com.qs.serve.modules.tag.entity.vo.TagDataVo; +import com.qs.serve.modules.tag.service.TagDataService; +import com.qs.serve.modules.tag.service.TagInfoService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 标签 标签信息 + * @author YenHex + * @since 2023-04-23 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tag/data") +public class TagDataController { + + private TagDataService tagDataService; + private TagInfoService tagInfoService; + private BmsSupplierService bmsSupplierService; + private BmsChannelPointService bmsChannelPointService; + private BmsChannelService bmsChannelService; + private SysUserService sysUserService; + private GoodsSpuService goodsSpuService; + + + /** + * 批量获取标签 + * @param param + * @return + */ + @PostMapping("batchQuery") + public R queryBatch(@RequestBody TagDataSo.TagBatchSo param){ + List tagDataVoList = new ArrayList<>(); + for (TagDataSo dataSo : param.getParams()) { + if(dataSo.getIds().size()==0){ + continue; + } + TagData query = new TagData(); + query.setTargetType(dataSo.getType()); + query.setQueryTagIds(dataSo.getIds()); + List tagDataList = tagDataService.selectList(query); + TagDataVo vo = new TagDataVo(); + vo.setFieldName(dataSo.getFieldName()); + vo.setType(dataSo.getType()); + vo.setInfoList(tagDataList); + tagDataVoList.add(vo); + } + return R.ok(tagDataVoList); + } + + /** + * 获取标签数据(LIST) + * @param query + * @return + */ + @GetMapping("batchQueryList") + public R batchQueryList(TagData query){ + //忽略日期拦截 + query.setIgnoreDateFlag(1); + List tagDataList = tagDataService.selectList(query); + return R.ok(tagDataList); + } + + /** + * 获取标签数据(PAGE) + * @param query + * @return + */ + @GetMapping("batchQueryPage") + public R queryBatchPage(TagData query){ + PageUtil.startPage(); + //忽略日期拦截 + query.setIgnoreDateFlag(1); + List tagDataList = tagDataService.selectList(query); + return R.byPageHelperList(tagDataList); + } + + /** + * Id查询 + * @param id + * @return + */ + @GetMapping("getById/{id}") + public R getById(@PathVariable String id){ + TagData data = tagDataService.getById(id); + return R.ok(data); + } + + /** + * Id更新 + * @param param + * @return + */ + @PostMapping("updateById") + public R updateById(@RequestBody TagData param){ + TagData data = new TagData(); + data.setId(param.getId()); + data.setStartDate(param.getStartDate()); + data.setEndDate(param.getEndDate()); + tagDataService.updateById(data); + return R.ok(); + } + + /** + * Id更新 + * @param id + * @return + */ + @DeleteMapping("deleteById/{id}") + public R deleteById(@PathVariable String id){ + tagDataService.removeById(id); + return R.ok(); + } + + /** + * 删除(对接JSL接口) + * @param param + * @return + */ + @PostMapping("/apiDelete") + @SysLog(module = SystemModule.Tag, title = "标签信息", biz = BizType.DELETE) + public R apiDelete(@RequestBody @Valid TagInfoApiBindBo param){ + TagInfo tagInfo = tagInfoService.getOne(new LambdaQueryWrapper() + .eq(TagInfo::getTagCode,param.getTagCode())); + if(tagInfo==null){ + return R.error("无效的标签编码"); + } + tagDataService.remove(new LambdaQueryWrapper() + .eq(TagData::getTargetType,param.getTargetType()) + .eq(TagData::getTagId,tagInfo.getId()) + .in(TagData::getTargetCode,param.getTargetCodeList()) + ); + return R.ok(); + } + + /** + * 新增(对接JSL接口) + * @param param + * @return + */ + @PostMapping("/apiSave") + @SysLog(module = SystemModule.Tag, title = "标签信息", biz = BizType.INSERT) + public R apiSave(@RequestBody @Valid TagInfoApiBindBo param){ + if(CollUtil.isEmpty(param.getTargetCodeList())){ + return R.error("编码列表不能为空"); + } + TagInfo tagInfo = tagInfoService.getOne(new LambdaQueryWrapper() + .eq(TagInfo::getTagCode,param.getTagCode())); + if(tagInfo==null){ + return R.error("无效的标签编码"); + } + List tagDataList = new ArrayList<>(); + if(param.getTargetType().equals(TagTypeConst.Customer)){ + List bmsSuppliers = bmsSupplierService.list(new LambdaQueryWrapper() + .in(BmsSupplier::getCode,param.getTargetCodeList())); + for (BmsSupplier supplier : bmsSuppliers) { + TagData data = new TagData(); + data.setTargetId(supplier.getId()); + data.setTargetCode(supplier.getCode()); + data.setTargetName(supplier.getName()); + tagDataList.add(data); + } + } + + //其它类型暂未用的上 +// else if (param.getTargetType().equals(TagTypeConst.Channel)){ +// BmsChannel channel = bmsChannelService.getById(objectDTO.getTargetId()); +// }else if (param.getTargetType().equals(TagTypeConst.Point)){ +// BmsChannelPoint point = bmsChannelPointService.getById(objectDTO.getTargetId()); +// }else{ +// SysUser sysUser = sysUserService.getById(objectDTO.getTargetId()); +// } + for (TagData data : tagDataList) { + data.setTargetType(param.getTargetType()); + data.setTagName(tagInfo.getTagName()); + data.setTagId(tagInfo.getId()); + } + tagDataService.saveBatch(tagDataList); + return R.ok(); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/bind") + @SysLog(module = SystemModule.Tag, title = "标签信息", biz = BizType.INSERT) + public R save(@RequestBody @Valid TagInfoBindBo param){ + Integer saveType = param.getSaveType(); + List tagInfoList = new ArrayList<>(); + if(CollUtil.isNotEmpty(param.getTagIds())){ + long count = tagInfoService.count(new LambdaQueryWrapper() + .eq(TagInfo::getBusinessFlag,1) + .in(TagInfo::getId,param.getTagIds())); + if(count>0){ + return R.error("业务标签不支持绑定"); + } + tagInfoList = tagInfoService.listByIds(param.getTagIds()); + } + for (TargetObjectDTO objectDTO : param.getTargetList()) { + if(objectDTO.getTargetType().equals(TagTypeConst.Customer)){ + BmsSupplier bmsSupplier = bmsSupplierService.getById(objectDTO.getTargetId()); + objectDTO.setTargetCode(bmsSupplier.getCode()); + objectDTO.setTargetName(bmsSupplier.getName()); + }else if (objectDTO.getTargetType().equals(TagTypeConst.Channel)){ + BmsChannel channel = bmsChannelService.getById(objectDTO.getTargetId()); + objectDTO.setTargetCode(channel.getChannelCode()); + objectDTO.setTargetName(channel.getChannelName()); + }else if (objectDTO.getTargetType().equals(TagTypeConst.Point)){ + BmsChannelPoint point = bmsChannelPointService.getById(objectDTO.getTargetId()); + objectDTO.setTargetCode(point.getPointCode()); + objectDTO.setTargetName(point.getPointName()); + }else{ + SysUser sysUser = sysUserService.getById(objectDTO.getTargetId()); + objectDTO.setTargetCode(sysUser.getCode()); + objectDTO.setTargetName(sysUser.getName()); + } + } + if(saveType==null||saveType.equals(0)){ + List tagDataList = new ArrayList<>(); + for (TagInfo tagInfo : tagInfoList) { + for (TargetObjectDTO objectDTO : param.getTargetList()) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TagData::getTagId,tagInfo.getId()); + lqw.eq(TagData::getTargetType,objectDTO.getTargetType()); + lqw.eq(TagData::getTargetId,objectDTO.getTargetId()); + if(tagDataService.count(lqw)>0){ + continue; + } + TagData data = new TagData(); + data.setTagName(tagInfo.getTagName()); + data.setTagId(tagInfo.getId()); + data.setTargetType(objectDTO.getTargetType()); + data.setTargetId(objectDTO.getTargetId()); + data.setTargetCode(objectDTO.getTargetCode()); + data.setTargetName(objectDTO.getTargetName()); + tagDataList.add(data); + } + } + if(CollectionUtil.isNotEmpty(tagDataList)){ + tagDataService.saveBatch(tagDataList); + } + }else if (saveType.equals(1)){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(TagData::getTagId,param.getTagIds()); + tagDataService.remove(lqw); + List tagDataList = new ArrayList<>(); + for (TagInfo tagInfo : tagInfoList) { + for (TargetObjectDTO objectDTO : param.getTargetList()) { + TagData data = new TagData(); + data.setTagName(tagInfo.getTagName()); + data.setTagId(tagInfo.getId()); + data.setTargetType(objectDTO.getTargetType()); + data.setTargetId(objectDTO.getTargetId()); + data.setTargetCode(objectDTO.getTargetCode()); + data.setTargetName(objectDTO.getTargetName()); + tagDataList.add(data); + } + } + if(CollectionUtil.isNotEmpty(tagDataList)){ + tagDataService.saveBatch(tagDataList); + } + }else if (saveType.equals(2)){ + List tagDataList = new ArrayList<>(); + for (TargetObjectDTO objectDTO : param.getTargetList()) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TagData::getTargetId,objectDTO.getTargetId()); + lqw.eq(TagData::getTargetType,objectDTO.getTargetType()); + //移除历史记录时,加载所有业务标签,并排除在外 + List tagInfos = tagInfoService.list(new LambdaQueryWrapper() + .eq(TagInfo::getBusinessFlag,1)); + List businessTagIds = tagInfos.stream().map(TagInfo::getId).collect(Collectors.toList()); + businessTagIds.add(-999L); + lqw.notIn(TagData::getTagId,businessTagIds); + tagDataService.remove(lqw); + for (TagInfo tagInfo : tagInfoList) { + TagData data = new TagData(); + data.setTagName(tagInfo.getTagName()); + data.setTagId(tagInfo.getId()); + data.setTargetType(objectDTO.getTargetType()); + data.setTargetId(objectDTO.getTargetId()); + data.setTargetCode(objectDTO.getTargetCode()); + data.setTargetName(objectDTO.getTargetName()); + tagDataList.add(data); + } + } + if(CollectionUtil.isNotEmpty(tagDataList)){ + tagDataService.saveBatch(tagDataList); + } + }else { + return R.error2(); + } + return R.ok(); + } + + /** + * 新增(拓展了数据和时间绑定) + * @param param + * @return + */ + @PostMapping("/bind2") + @SysLog(module = SystemModule.Tag, title = "标签信息", biz = BizType.INSERT) + public R save2(@RequestBody @Valid TagInfoBind2Bo param){ + + //移除历史记录时,加载所有业务标签,并排除在外 + List tagInfos = tagInfoService.list(new LambdaQueryWrapper() + .eq(TagInfo::getBusinessFlag,1)); + List businessTagIds = tagInfos.stream() + .map(TagInfo::getId) + .collect(Collectors.toList()); + businessTagIds.add(-999L); + + if(CollUtil.isNotEmpty(param.getSave1Params())){ + List tagDataList = new ArrayList<>(); + for (TagTargetObject3Bo obj : param.getSave1Params()) { + //跳过业务类标签数据 + boolean isBsn = businessTagIds.stream().anyMatch(a->a.equals(obj.getTagId())); + if(isBsn){ + continue; + } + //移除旧数据 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TagData::getTagId,obj.getTagId()) + .eq(TagData::getTargetType,obj.getTargetType()) + .eq(TagData::getTargetId,obj.getTargetId()); + tagDataService.remove(lqw); + //重新保存 + String targetType = obj.getTargetType(); + String targetId = obj.getTargetId(); + TagData data = new TagData(); + //设置target信息 + this.toSetTagData(targetType, targetId, data); + Long tagId = obj.getTagId(); + TagInfo tagInfo = tagInfoService.getById(tagId); + data.setTagId(tagId); + data.setStartDate(obj.getStartDate()); + data.setEndDate(obj.getEndDate()); + if(tagInfo!=null){ + data.setTagName(tagInfo.getTagName()); + data.setTagRemark(tagInfo.getRemark()); + } + tagDataList.add(data); + } + if(CollectionUtil.isNotEmpty(tagDataList)){ + tagDataService.saveBatch(tagDataList); + } + } + else if (CollUtil.isNotEmpty(param.getSave2Params())){ + List tagDataList = new ArrayList<>(); + for (TagItem2Bo obj : param.getSave2Params()) { + Long tagId = obj.getTagId(); + TagInfo tagInfo = tagInfoService.getById(tagId); + if(tagInfo.getBusinessFlag().equals("1")){ + continue; + } + for (TagTargetObject2Bo object2Bo : obj.getTargetList()) { + TagData data = new TagData(); + data.setTagName(tagInfo.getTagName()); + data.setTagId(tagInfo.getId()); + this.toSetTagData(object2Bo.getTargetType(), object2Bo.getTargetId(), data); + tagDataList.add(data); + } + } + //移除历史记录 + List tagIds = param.getSave2Params().stream().map(TagItem2Bo::getTagId).collect(Collectors.toList()); + if(CollUtil.isNotEmpty(tagIds)){ + tagDataService.remove( + new LambdaQueryWrapper() + .in(TagData::getTagId,tagIds) + .notIn(TagData::getTagId,businessTagIds) + ); + } + //重新保存 + if(CollectionUtil.isNotEmpty(tagDataList)){ + tagDataService.saveBatch(tagDataList); + } + }else if (CollUtil.isNotEmpty(param.getSave3Params())){ + List tagDataList = new ArrayList<>(); + for (TagTargetObjectBo objectDTO : param.getSave3Params()) { + //移除历史数据 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TagData::getTargetId,objectDTO.getTargetId()) + .eq(TagData::getTargetType,objectDTO.getTargetType()) + .notIn(TagData::getTagId,businessTagIds); + tagDataService.remove(lqw); + TagData tmpTagData = new TagData(); + this.toSetTagData(objectDTO.getTargetType(), objectDTO.getTargetId(),tmpTagData); + for (TagItemBo item : objectDTO.getTagItems()) { + //跳过业务类型 + boolean isBsn = businessTagIds.stream().anyMatch(a->a.equals(item.getTagId())); + if(isBsn){ + continue; + } + TagInfo tagInfo = tagInfoService.getById(item.getTagId()); + TagData data = CopierUtil.copy(tmpTagData,new TagData()); + data.setTagId(item.getTagId()); + data.setStartDate(item.getStartDate()); + data.setEndDate(item.getEndDate()); + if(tagInfo!=null){ + data.setTagName(tagInfo.getTagName()); + data.setTagRemark(tagInfo.getRemark()); + } + tagDataList.add(data); + } + } + if(CollectionUtil.isNotEmpty(tagDataList)){ + tagDataService.saveBatch(tagDataList); + } + }else { + return R.error2(); + } + return R.ok(); + } + + private void toSetTagData(String targetType, String targetId, TagData data) { + data.setTargetId(targetId); + data.setTargetType(targetType); + if(targetType.equals(TagTypeConst.Customer)){ + BmsSupplier bmsSupplier = bmsSupplierService.getById(targetId); + data.setTargetCode(bmsSupplier.getCode()); + data.setTargetName(bmsSupplier.getName()); + }else if (targetType.equals(TagTypeConst.Channel)){ + BmsChannel channel = bmsChannelService.getById(targetId); + data.setTargetCode(channel.getChannelCode()); + data.setTargetName(channel.getChannelName()); + }else if (targetType.equals(TagTypeConst.Point)){ + BmsChannelPoint point = bmsChannelPointService.getById(targetId); + data.setTargetCode(point.getPointCode()); + data.setTargetName(point.getPointName()); + }else if (targetType.equals(TagTypeConst.SPU)){ + GoodsSpu spu = goodsSpuService.getById(targetId); + data.setTargetCode(spu.getSpuCode()); + data.setTargetName(spu.getName()); + }else{ + SysUser sysUser = sysUserService.getById(targetId); + data.setTargetCode(sysUser.getCode()); + data.setTargetName(sysUser.getName()); + } + } + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/controller/TagInfoController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/controller/TagInfoController.java new file mode 100644 index 0000000..f3dc360 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/controller/TagInfoController.java @@ -0,0 +1,135 @@ +package com.qs.serve.modules.tag.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.github.pagehelper.PageHelper; +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.tag.entity.TagCategory; +import com.qs.serve.modules.tag.service.TagCategoryService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tag.entity.so.TagInfoSo; +import com.qs.serve.modules.tag.entity.bo.TagInfoBo; +import com.qs.serve.modules.tag.entity.TagInfo; +import com.qs.serve.modules.tag.service.TagInfoService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 标签 标签信息 + * @author YenHex + * @since 2023-04-23 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tag/info") +public class TagInfoController { + + private TagInfoService tagInfoService; + private TagCategoryService tagCategoryService; + + /** + * 列表 + * @param param + * @return + */ + @PostMapping("/list") + public R> getList(@RequestBody TagInfoSo param){ + TagInfo entity = CopierUtil.copy(param,new TagInfo()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + if(CollectionUtil.isNotEmpty(param.getTagCategoryIds())){ + lqw.in(TagInfo::getTagCategoryId,param.getTagCategoryIds()); + } + List list = tagInfoService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @PostMapping("/page") + public R> getPage(@RequestBody TagInfoSo param){ + TagInfo entity = CopierUtil.copy(param,new TagInfo()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + if(CollectionUtil.isNotEmpty(param.getTagCategoryIds())){ + lqw.in(TagInfo::getTagCategoryId,param.getTagCategoryIds()); + } + PageHelper.startPage(param.getPageNum(),param.getPageSize()); + List list = tagInfoService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Tag, title = "标签信息", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + TagInfo tagInfo = tagInfoService.getById(id); + return R.ok(tagInfo); + } + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.Tag, title = "标签信息", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid TagInfoBo param){ + TagInfo entity = CopierUtil.copy(param,new TagInfo()); + TagCategory tagCategory = tagCategoryService.getById(param.getTagCategoryId()); + entity.setTagCategoryId(param.getTagCategoryId()); + entity.setTagCategoryName(tagCategory.getCategoryName()); + entity.setColorVal(param.getColorVal()); + entity.setBgColorVal(param.getBgColorVal()); + entity.setRemark(param.getRemark()); + boolean result = tagInfoService.updateById(entity); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.Tag, title = "标签信息", biz = BizType.INSERT) + public R save(@RequestBody @Valid TagInfoBo param){ + param.setId(null); + TagInfo entity = CopierUtil.copy(param,new TagInfo()); + entity.setTagCode(CodeGenUtil.getDataCode(CodeGenUtil.SourceDataKey.TagInfo)); + TagCategory tagCategory = tagCategoryService.getById(param.getTagCategoryId()); + entity.setTagCategoryName(tagCategory.getCategoryName()); + boolean result = tagInfoService.save(entity); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.Tag, title = "标签信息", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = tagInfoService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/TagCategory.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/TagCategory.java new file mode 100644 index 0000000..70a36f5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/TagCategory.java @@ -0,0 +1,108 @@ +package com.qs.serve.modules.tag.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 2023-04-23 + */ +@Data +@TableName("tag_category") +public class TagCategory implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 标签名 */ + @Length(max = 255,message = "标签名长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String categoryName; + + /** 上级标签类目id */ + private String pid; + + /** */ + @Length(max = 255,message = "长度不能超过255字") + private String pathIds; + + /** 颜色 */ + private String colorVal; + + /** 背景颜色 */ + private String bgColorVal; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** 父级信息 */ + @TableField(exist = false) + private Object parentInfo; + + + public static TagCategory toNewObject(TagCategory source){ + TagCategory category = new TagCategory(); + category.setId(source.getId()); + category.setCategoryName(source.getCategoryName()); + category.setPid(source.getPid()); + category.setPathIds(source.getPathIds()); + category.setRemark(source.getRemark()); + category.setCreateTime(source.getCreateTime()); + category.setUpdateTime(source.getUpdateTime()); + category.setCreateBy(source.getCreateBy()); + category.setUpdateBy(source.getUpdateBy()); + category.setTenantId(source.getTenantId()); + category.setDelFlag(source.getDelFlag()); + return category; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/TagData.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/TagData.java new file mode 100644 index 0000000..6f040c6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/TagData.java @@ -0,0 +1,139 @@ +package com.qs.serve.modules.tag.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; +import java.util.List; +/** + * 标签数据 实体类 + * @author YenHex + * @since 2023-04-24 + */ +@Data +@TableName("tag_data") +public class TagData implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 标签名 */ + @Length(max = 255,message = "标签名长度不能超过255字") + private String tagName; + + /** 标签id */ + private Long tagId; + + /** 业务类型 {@link com.qs.serve.modules.tag.TagTypeConst} */ + @Length(max = 30,message = "业务类型长度不能超过30字") + private String targetType; + + /** 目标id */ + @Length(max = 100,message = "目标id长度不能超过100字") + private String targetId; + + /** 目标编码 */ + @Length(max = 255,message = "目标编码长度不能超过255字") + private String targetCode; + + /** 目标名称 */ + @Length(max = 255,message = "目标名称长度不能超过255字") + private String targetName; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate startDate; + + /** 结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate endDate; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** 颜色 */ + @TableField(exist = false) + private String colorVal; + + /** 背景颜色 */ + @TableField(exist = false) + private String bgColorVal; + + /** 背景颜色 */ + @TableField(exist = false) + private String tagRemark; + + @TableField(exist = false) + private List queryTagIds; + + @TableField(exist = false) + private Integer ignoreDateFlag; + + public static TagData toNewObject(TagData source){ + TagData data = new TagData(); + data.setId(source.getId()); + data.setTagName(source.getTagName()); + data.setTagId(source.getTagId()); + data.setTargetType(source.getTargetType()); + data.setTargetId(source.getTargetId()); + data.setTargetCode(source.getTargetCode()); + data.setTargetName(source.getTargetName()); + data.setRemark(source.getRemark()); + data.setCreateTime(source.getCreateTime()); + data.setUpdateTime(source.getUpdateTime()); + data.setCreateBy(source.getCreateBy()); + data.setUpdateBy(source.getUpdateBy()); + data.setTenantId(source.getTenantId()); + data.setDelFlag(source.getDelFlag()); + return data; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/TagInfo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/TagInfo.java new file mode 100644 index 0000000..a48dca7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/TagInfo.java @@ -0,0 +1,100 @@ +package com.qs.serve.modules.tag.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 2023-04-23 + */ +@Data +@TableName("tag_info") +public class TagInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 标签名 */ + @TableField(condition = SqlCondition.LIKE) + private String tagCode; + + /** 标签名 */ + @Length(max = 255,message = "标签名长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String tagName; + + /** 标签类目id */ + private String tagCategoryId; + + /** 颜色 */ + private String colorVal; + + /** 背景颜色 */ + private String bgColorVal; + + /** 标签类目名称 */ + @Length(max = 255,message = "标签类目名称长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String tagCategoryName; + + /** 工作类别 */ + private String workType; + + /** 表示是否系统业务标签 */ + private String businessFlag; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagInfoApiBindBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagInfoApiBindBo.java new file mode 100644 index 0000000..7567ddf --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagInfoApiBindBo.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.tag.entity.bo; + +import com.qs.serve.common.model.dto.TargetObjectDTO; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 标签信息 Bo + * @author YenHex + * @since 2023-04-23 + */ +@Data +public class TagInfoApiBindBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 标签编码 */ + private String tagCode; + + /** 目标数据。目标类型:customer、point、channel、salesman */ + private String targetType; + + /** 对应数据的编码 */ + private List targetCodeList; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagInfoBind2Bo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagInfoBind2Bo.java new file mode 100644 index 0000000..2c81807 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagInfoBind2Bo.java @@ -0,0 +1,42 @@ +package com.qs.serve.modules.tag.entity.bo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 标签信息 Bo + * @author YenHex + * @since 2023-04-23 + */ +@Data +public class TagInfoBind2Bo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 0:添加不进行删除 + */ + private List save1Params; + + /** + * 1:以`标签`为参照物,删除历史`目标数据`,并重新添加新的`目标数据` + * */ + private List save2Params; + + + /** + * 2以`目标数据`为参照物,删除历史`标签`,并重新添加新的`标签` + **/ + private List save3Params; + + /** + * 0:添加不进行删除 + * 1:以`标签`为参照物,删除历史`目标数据`,并重新添加新的`目标数据` + * 2:以`目标数据`为参照物,删除历史`标签`,并重新添加新的`标签` + */ + //private Integer saveType; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagInfoBindBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagInfoBindBo.java new file mode 100644 index 0000000..7cb428e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagInfoBindBo.java @@ -0,0 +1,34 @@ +package com.qs.serve.modules.tag.entity.bo; + +import com.qs.serve.common.model.dto.TargetObjectDTO; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import java.io.Serializable; +import java.util.List; + +/** + * 标签信息 Bo + * @author YenHex + * @since 2023-04-23 + */ +@Data +public class TagInfoBindBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 标签地址 */ + private List tagIds; + + /** 目标数据。目标类型:customer、point、channel、salesman */ + private List targetList; + + /** + * 0:添加不进行删除 + * 1:以`标签`为参照物,删除历史`目标数据`,并重新添加新的`目标数据` + * 2:以`目标数据`为参照物,删除历史`标签`,并重新添加新的`标签` + */ + private Integer saveType; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagInfoBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagInfoBo.java new file mode 100644 index 0000000..46892d1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagInfoBo.java @@ -0,0 +1,50 @@ +package com.qs.serve.modules.tag.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 标签信息 Bo + * @author YenHex + * @since 2023-04-23 + */ +@Data +public class TagInfoBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 标签名 */ + @Length(max = 255,message = "标签名长度不能超过255字") + private String tagName; + + /** 标签类目id */ + private String tagCategoryId; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 颜色 */ + private String colorVal; + + /** 背景颜色 */ + private String bgColorVal; + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagItem2Bo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagItem2Bo.java new file mode 100644 index 0000000..19463d6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagItem2Bo.java @@ -0,0 +1,24 @@ +package com.qs.serve.modules.tag.entity.bo; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/8/5 + */ +@Data +public class TagItem2Bo { + + /** + * 标签ID + */ + private Long tagId; + + /** + * 目标数据。目标类型:customer、point、channel、salesman + */ + List targetList; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagItemBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagItemBo.java new file mode 100644 index 0000000..d157f81 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagItemBo.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.tag.entity.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; + +/** + * @author YenHex + * @since 2024/8/5 + */ +@Data +public class TagItemBo { + + /** + * 标签ID + */ + private Long tagId; + + /** 开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate startDate; + + /** 结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate endDate; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagTargetObject2Bo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagTargetObject2Bo.java new file mode 100644 index 0000000..382eb80 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagTargetObject2Bo.java @@ -0,0 +1,28 @@ +package com.qs.serve.modules.tag.entity.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.qs.serve.common.model.dto.TargetObjectDTO; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; +import java.util.List; + +/** + * @author YenHex + * @since 2024/8/5 + */ +@Data +public class TagTargetObject2Bo extends TargetObjectDTO { + + /** 开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate startDate; + + /** 结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate endDate; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagTargetObject3Bo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagTargetObject3Bo.java new file mode 100644 index 0000000..dd86e20 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagTargetObject3Bo.java @@ -0,0 +1,32 @@ +package com.qs.serve.modules.tag.entity.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.qs.serve.common.model.dto.TargetObjectDTO; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; + +/** + * @author YenHex + * @since 2024/8/5 + */ +@Data +public class TagTargetObject3Bo extends TargetObjectDTO { + + /** + * 标签ID + */ + private Long tagId; + + /** 开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate startDate; + + /** 结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate endDate; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagTargetObjectBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagTargetObjectBo.java new file mode 100644 index 0000000..b30a24b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/bo/TagTargetObjectBo.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.tag.entity.bo; + +import com.qs.serve.common.model.dto.TargetObjectDTO; +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/8/5 + */ +@Data +public class TagTargetObjectBo extends TargetObjectDTO { + + /** + * 标签列表 + */ + List tagItems; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/so/TagDataSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/so/TagDataSo.java new file mode 100644 index 0000000..2771cfb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/so/TagDataSo.java @@ -0,0 +1,34 @@ +package com.qs.serve.modules.tag.entity.so; + +import lombok.Data; +import java.util.List; + +/** + * @author YenHex + * @since 2023/10/8 + */ +@Data +public class TagDataSo { + + /** + * 仅用于查询数据,标签查询不需要传入 + */ + private String fieldName; + + /** + * customer + * point + * channel + * salesman + */ + private String type; + + private List ids; + + @Data + public static class TagBatchSo{ + + List params; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/so/TagInfoSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/so/TagInfoSo.java new file mode 100644 index 0000000..6ae11e1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/so/TagInfoSo.java @@ -0,0 +1,81 @@ +package com.qs.serve.modules.tag.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.SqlCondition; +import com.baomidou.mybatisplus.annotation.TableField; +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; +import java.util.List; + +/** + * 标签信息 查询参数 + * @author YenHex + * @since 2023-04-23 + */ +@Data +public class TagInfoSo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 标签名 */ + private String tagCode; + + /** 标签名 */ + private String tagName; + + /** 标签类目id */ + private String tagCategoryId; + + /** 标签类目id */ + private List tagCategoryIds; + + /** 标签类目名称 */ + private String tagCategoryName; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + private Integer pageNum; + + private Integer pageSize; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/so/TagQuery.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/so/TagQuery.java new file mode 100644 index 0000000..d972517 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/so/TagQuery.java @@ -0,0 +1,33 @@ +package com.qs.serve.modules.tag.entity.so; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/7/12 + */ +@Data +public class TagQuery { + + /** + * 类型 + */ + private String targetType; + + private String tagName; + + private List tagIds; + + /** + * 列名 creator.checker + */ + private String dataField; + + /** + * 不用传 + */ + private String sqlColumn; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/vo/TagCategoryTreeVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/vo/TagCategoryTreeVo.java new file mode 100644 index 0000000..bceebbd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/vo/TagCategoryTreeVo.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tag.entity.vo; + +import com.qs.serve.common.model.dto.TreeNode; +import lombok.Data; + +/** + * @author YenHex + * @since 2023/4/23 + */ +@Data +public class TagCategoryTreeVo extends TreeNode { + + /** 颜色 */ + private String colorVal; + + /** 背景颜色 */ + private String bgColorVal; + + private String categoryName; + private String remark; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/vo/TagDataVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/vo/TagDataVo.java new file mode 100644 index 0000000..16285f9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/entity/vo/TagDataVo.java @@ -0,0 +1,21 @@ +package com.qs.serve.modules.tag.entity.vo; + +import lombok.Data; +import java.util.List; + +/** + * @author YenHex + * @since 2023/10/8 + */ +@Data +public class TagDataVo { + + private String fieldName; + + private String type; + + private String remark; + + private List infoList; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/mapper/TagCategoryMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/mapper/TagCategoryMapper.java new file mode 100644 index 0000000..383053f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/mapper/TagCategoryMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tag.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tag.entity.TagCategory; + +/** + * 标签分类 Mapper + * @author YenHex + * @date 2023-04-23 + */ +public interface TagCategoryMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/mapper/TagDataMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/mapper/TagDataMapper.java new file mode 100644 index 0000000..7757603 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/mapper/TagDataMapper.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.tag.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tag.entity.TagData; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +/** + * 标签数据 Mapper + * @author YenHex + * @date 2023-04-23 + */ +public interface TagDataMapper extends BaseMapper { + + /** + * 移除逾期数据 + * @return + */ + @InterceptorIgnore(tenantLine = "1") + @Update("update tag_data set del_flag = 1 where end_date < now() ") + int deleteExpireData(); + + List selectList(@Param("query") TagData param); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/mapper/TagInfoMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/mapper/TagInfoMapper.java new file mode 100644 index 0000000..f07622d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/mapper/TagInfoMapper.java @@ -0,0 +1,32 @@ +package com.qs.serve.modules.tag.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tag.entity.TagInfo; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 标签信息 Mapper + * @author YenHex + * @date 2023-04-23 + */ +public interface TagInfoMapper extends BaseMapper { + + @InterceptorIgnore(tenantLine = "1") + @Select(" SELECT " + + " DISTINCT " + + " tag_info.tag_name " + + " FROM `tag_data` " + + " left join tag_info on tag_id = tag_info.id " + + " where " + + " tag_data.del_flag = 0 " + + " and tag_info.del_flag = 0 " + + " and target_type = 'customer' " + + " and target_code = #{supplierCode} ") + List lisTagsBySupplierCode(@Param("supplierCode") String supplierCode); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/package-info.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/package-info.java new file mode 100644 index 0000000..3dfcef3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/package-info.java @@ -0,0 +1 @@ +package com.qs.serve.modules.tag; diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/service/TagCategoryService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/service/TagCategoryService.java new file mode 100644 index 0000000..ed55829 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/service/TagCategoryService.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.tag.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tag.entity.TagCategory; + +/** + * 标签分类 服务接口 + * @author YenHex + * @date 2023-04-23 + */ +public interface TagCategoryService extends IService { + + /** + * 编辑 + * @param category + */ + void modify(TagCategory category); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/service/TagDataService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/service/TagDataService.java new file mode 100644 index 0000000..7b2acf0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/service/TagDataService.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.tag.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tag.entity.TagData; +import java.util.List; +/** + * 标签数据 服务接口 + * @author YenHex + * @date 2023-04-23 + */ +public interface TagDataService extends IService { + + List selectList(TagData param); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/service/TagInfoService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/service/TagInfoService.java new file mode 100644 index 0000000..a88cb06 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/service/TagInfoService.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.tag.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tag.entity.TagInfo; +import com.qs.serve.modules.tag.entity.bo.TagInfoBo; + +/** + * 标签信息 服务接口 + * @author YenHex + * @date 2023-04-23 + */ +public interface TagInfoService extends IService { + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/service/impl/TagCategoryServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/service/impl/TagCategoryServiceImpl.java new file mode 100644 index 0000000..1264527 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/service/impl/TagCategoryServiceImpl.java @@ -0,0 +1,107 @@ +package com.qs.serve.modules.tag.service.impl; + +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.modules.goods.entity.GoodsCategory; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tag.entity.TagCategory; +import com.qs.serve.modules.tag.service.TagCategoryService; +import com.qs.serve.modules.tag.mapper.TagCategoryMapper; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 标签分类 服务实现类 + * @author YenHex + * @since 2023-04-23 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TagCategoryServiceImpl extends ServiceImpl implements TagCategoryService { + + @Override + @Transactional(rollbackFor = Exception.class) + public void modify(TagCategory current) { + TagCategory orgData = this.getById(current.getId()); + TagCategory parent = null; + if(current.getPid()!=null&&!current.getPid().equals("0")){ + parent = this.getById(current.getPid()); + if(parent==null){ + Assert.throwEx("父级标签不存在"); + } + } + if(current.getId()==null){ + this.save(current); + } + + String newParentPathIds = null; + if(parent==null) { + //无上级 + current.setPid("0"); + current.setPathIds(current.getId()); + }else if (parent.getPathIds().contains(current.getId())){ + //上下级互换 + Assert.throwEx("不支持上下级互换"); + current.setPathIds(parent.getPathIds().replace(parent.getId(),"") + current.getId()); + newParentPathIds = current.getPathIds()+"_"+parent.getId(); + }else { + //一般设置上级 + current.setPathIds(parent.getPathIds()+"_"+current.getId()); + } + if(orgData==null){ + this.saveOrUpdate(current); + }else { + this.updateById(current); + boolean changePid = !orgData.getPid().equals(current.getPid()); + if(changePid){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.and(v1->{ + v1.eq(TagCategory::getPathIds,orgData.getPathIds()) + .or().likeRight(TagCategory::getPathIds,orgData.getPathIds()+"_"); + }); + List childList = this.list(lqw); + List categoryList = childList.stream().map(obj->{ + TagCategory par = new TagCategory(); + par.setId(obj.getId()); + par.setPathIds(obj.getPathIds().replace(orgData.getPathIds(),current.getPathIds())); + return par; + }).collect(Collectors.toList()); + this.updateBatchById(categoryList); + //补充上下级互换 + if(newParentPathIds!=null){ + LambdaQueryWrapper lqwParent = new LambdaQueryWrapper<>(); + TagCategory finalParent = parent; + lqwParent.and(v1->{ + v1.eq(TagCategory::getPathIds, finalParent.getPathIds()) + .or().likeRight(TagCategory::getPathIds,finalParent.getPathIds()+"_"); + }); + List parentChildList = this.list(lqwParent); + String finalNewParentPathIds = newParentPathIds; + List parentCategoryList = parentChildList.stream().map(obj->{ + TagCategory par = new TagCategory(); + par.setId(obj.getId()); + par.setPathIds(obj.getPathIds().replace(finalParent.getPathIds(), finalNewParentPathIds)); + return par; + }).collect(Collectors.toList()); + this.updateBatchById(parentCategoryList); + } + }else { + //不进行更新 + current.setPathIds(null); + current.setPid(null); + } + this.updateById(current); + + } + + } + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/service/impl/TagDataServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/service/impl/TagDataServiceImpl.java new file mode 100644 index 0000000..2bff2b2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/service/impl/TagDataServiceImpl.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.tag.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tag.entity.TagData; +import com.qs.serve.modules.tag.service.TagDataService; +import com.qs.serve.modules.tag.mapper.TagDataMapper; + +import java.util.List; + +/** + * 标签数据 服务实现类 + * @author YenHex + * @since 2023-04-23 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TagDataServiceImpl extends ServiceImpl implements TagDataService { + + @Override + public List selectList(TagData param) { + return baseMapper.selectList(param); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/service/impl/TagInfoServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/service/impl/TagInfoServiceImpl.java new file mode 100644 index 0000000..14a15a4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/service/impl/TagInfoServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tag.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tag.entity.TagInfo; +import com.qs.serve.modules.tag.service.TagInfoService; +import com.qs.serve.modules.tag.mapper.TagInfoMapper; + +/** + * 标签信息 服务实现类 + * @author YenHex + * @since 2023-04-23 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TagInfoServiceImpl extends ServiceImpl implements TagInfoService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/util/TagFiledUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/util/TagFiledUtil.java new file mode 100644 index 0000000..81c037f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tag/util/TagFiledUtil.java @@ -0,0 +1,119 @@ +package com.qs.serve.modules.tag.util; + +import cn.hutool.core.collection.CollUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.his.entity.HisUserSupplier; +import com.qs.serve.modules.tag.entity.so.TagQuery; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.entity.so.VtbVerificationBatchQuery; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import lombok.experimental.UtilityClass; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author YenHex + * @since 2024/7/15 + */ +@UtilityClass +public class TagFiledUtil { + + public final static Map TbsCostApplyPageMap = new HashMap(){{ + put("supplierId","tbs_cost_apply.supplier_id"); + }}; + + public final static Map VtbVerificationPageMap = new HashMap(){{ + put("supplierId","vtb_verification.supplier_id"); + }}; + + public final static Map VtbVerificationBatchPageMap = new HashMap(){{ + put("supplierId","vtb_verification_batch.supplier_id"); + }}; + + public final static Map BmsSupplierPageMap = new HashMap(){{ + put("id","bms_supplier.id"); + }}; + + public final static Map HisSupplierPageMap = new HashMap(){{ + put("id","his_user_supplier.supplier_id"); + }}; + + public final static Map goodsSpuPageMap = new HashMap(){{ + put("id","goods_spu.id"); + }}; + + public static void TbsCostApplyPage(TbsCostApply param){ + List paramTagList = param.getTagQueryList(); + List newList = getNewList(paramTagList,TbsCostApplyPageMap); + param.setTagQueryList(newList); + } + + + public static void VtbVerificationPage(VtbVerification param){ + List paramTagList = param.getTagQueryList(); + List newList = getNewList(paramTagList,VtbVerificationPageMap); + param.setTagQueryList(newList); + } + + + public static void VtbVerificationBatchPage(VtbVerificationBatchQuery param){ + List paramTagList = param.getTagQueryList(); + List newList = getNewList(paramTagList,VtbVerificationBatchPageMap); + param.setTagQueryList(newList); + } + + public static void BmsSupplierPage(BmsSupplier param){ + List paramTagList = param.getTagQueryList(); + List newList = getNewList(paramTagList,BmsSupplierPageMap); + param.setTagQueryList(newList); + } + + public static void GoodsSpuPage(GoodsSpu param){ + List paramTagList = param.getTagQueryList(); + List newList = getNewList(paramTagList,goodsSpuPageMap); + param.setTagQueryList(newList); + } + + public static void HisSupplierPage(HisUserSupplier param){ + List paramTagList = param.getTagQueryList(); + List newList = getNewList(paramTagList,HisSupplierPageMap); + param.setTagQueryList(newList); + } + + /** + * 创建新的且有效性的查询参数(sql使用了非严谨写法,这里做了sql注入过滤) + * @param paramTagList + * @param columnMap + * @return + */ + @NotNull + private static List getNewList(List paramTagList,Map columnMap) { + List newList = new ArrayList<>(); + if(paramTagList!=null){ + for (TagQuery tag : paramTagList) { + if(!StringUtils.hasText(tag.getTargetType())){ + continue; + } + if (StringUtils.hasText(tag.getTagName()) || CollUtil.isNotEmpty(tag.getTagIds())){ + String sqlColumn = columnMap.get(tag.getDataField()); + if(StringUtils.hasText(sqlColumn)){ + TagQuery newVal = new TagQuery(); + newVal.setTargetType(tag.getTargetType()); + newVal.setTagName(tag.getTagName()); + newVal.setTagIds(tag.getTagIds()); + newVal.setSqlColumn(sqlColumn); + newList.add(newVal); + } + } + } + } + return newList; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/TbsActivityState.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/TbsActivityState.java new file mode 100644 index 0000000..f3f2fed --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/TbsActivityState.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.tbs.common; + +/** + * @author YenHex + * @since 2022/12/6 + */ +public interface TbsActivityState { + + /** + * 活动状态:0-待核销;1-审批中;2-完成;3-冻结;4-已释放费用;5-关闭 + */ + Integer STATE_0_Todo = 0; + Integer STATE_1_Checking = 1; + Integer STATE_1_Finished = 2; + Integer STATE_1_Baning = 3; + Integer STATE_4_Release = 4; + Integer STATE_5_Close = 5; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/TbsCenterType.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/TbsCenterType.java new file mode 100644 index 0000000..cfeec8c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/TbsCenterType.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.tbs.common; + +/** + * @author YenHex + * @since 2022/11/9 + */ +public enum TbsCenterType { + + center, + customer, + bizRegion, + saleRegion, + dept, + saleman + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/TbsCommonCheckState.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/TbsCommonCheckState.java new file mode 100644 index 0000000..bdbfc55 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/TbsCommonCheckState.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.tbs.common; + +/** + * @author YenHex + * @since 2023/8/8 + */ +public interface TbsCommonCheckState { + + /** + * 0=未发布;1=审批中;2=完成;3-被驳回;4-中止;5关闭 + */ + int State_0_unPublish = 0; + int State_1_apply = 1; + int State_2_finished = 2; + int State_3_setback = 3; + int State_4_stop = 4; + int State_5_close = 5; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/TbsCostApplyState.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/TbsCostApplyState.java new file mode 100644 index 0000000..c04a165 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/TbsCostApplyState.java @@ -0,0 +1,49 @@ +package com.qs.serve.modules.tbs.common; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * @author YenHex + * @since 2022/11/28 + */ +@Getter +@AllArgsConstructor +public enum TbsCostApplyState { + + //状态:0=未发布;1=审批中;2=待执行;3=完成;4-被驳回;5-中止;6-作废;7-异动;8-异动中止 + State_0_unPublish(0), + State_1_apply(1), + State_2_actioning(2), + State_3_finished(3), + State_4_refused(4), + State_5_stop(5), + State_6_remove(6), + State_7_changed(7), + State_8_changed_fail(8) + ; + + private Integer code; + + private final static List passCodes = new ArrayList<>(Arrays.asList(2, 3)); + + public static List getPassCode(){ + return passCodes; + } + + public static Boolean checkUseBudget(Integer state){ + if(state==null){return null;} + int[] ints = new int[]{0,5,6,8,4}; + for (int anInt : ints) { + if(anInt==state){ + return false; + } + } + return true; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/TbsGoodsType.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/TbsGoodsType.java new file mode 100644 index 0000000..8c7d12a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/TbsGoodsType.java @@ -0,0 +1,11 @@ +package com.qs.serve.modules.tbs.common; + +/** + * @author YenHex + * @since 2022/11/9 + */ +public enum TbsGoodsType { + + brand,category,series,spu,sku + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java new file mode 100644 index 0000000..b9881ae --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java @@ -0,0 +1,140 @@ +package com.qs.serve.modules.tbs.common; + +import com.qs.serve.common.config.DevEnvironmentConfig; + +/** + * @author YenHex + * @since 2022/11/23 + */ +public interface TbsSeeYonConst { + + String PRE_TITLE_COST_APPLY = "【预算费用申请】"; + String PRE_TITLE_VERIFICATION = "【预算费用核销】"; + + /** 政策申请模板 */ + class PolicyConf { + public static String Code(){ + return DevEnvironmentConfig.isDev()?"ReleasePolicy_Test":"ReleasePolicy"; + } + } + + /** 费用申请 */ + class CostApplyConf{ + public static String Code(){ + return DevEnvironmentConfig.isDev()?"CostBill_Test":"CostBill"; + } + } + /** 费用申请2-协议类 */ + class CostApplyContractConf{ + public static String Code(){ + return DevEnvironmentConfig.isDev()?"contractApply_Test":"contractApply"; + } + } + + /** 核销 */ + class CostCheckConf{ + public static String Code(){ + return DevEnvironmentConfig.isDev()?"CheckCost_Test":"CheckCost"; + } + //public static String Id(){return DevEnvironmentConfig.isDev()?"8370474123848467567":"5117622466085866816";} + } + + /** 核销 */ + class BatchCostCheckConf{ + //public static String Id(){return DevEnvironmentConfig.isDev()?"6989459208782694349":"7718060534670183779";} + public static String Code(){ + return DevEnvironmentConfig.isDev()?"BatchCheckCost_Test":"BatchCheckCost"; + } + } + + /** 核销 */ + class ExpiredOrderConf{ + public static String Code(){ + return DevEnvironmentConfig.isDev()?"ExpiredOrder_Test":"ExpiredOrder"; + } + } + + /** 预算申请 */ + class BudgetApplyConf{ + public static String Code(){ + return DevEnvironmentConfig.isDev()?"budgetAdjust_Test":"budgetAdjust"; + } + } + + /** 协议条款申请 */ + class CheckCostAgreeConf{ + public static String Code(){ + return DevEnvironmentConfig.isDev()?"CheckCostAgree_Test":"CheckCostAgree"; + } + } + + /** 预算变更申请 */ + class BudgetChangeConf{ + public static String Code(){ + return DevEnvironmentConfig.isDev()?"budgetAdjust2_Test":"budgetAdjust2"; + } + } + + /** 预算批量变更申请 */ + class BudgetBatchApplyConf{ + public static String Code(){ + return DevEnvironmentConfig.isDev()?"budgetBatch_Test":"budgetBatch"; + } + } + + String API_TEST = "/testConnection"; + String API_PROCESS_CREATE = "/process/create"; + String API_CONTRACT_RELEASE_CANCEL = "/process/cancelReleaseContractApply"; + String API_CONTRACT_RELEASE = "/process/releaseContractApply"; + 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"; + String API_PROCESS_CANCEL = "/process/cancel"; + String API_GET_FORM_ID = "/process/getFormId"; + String API_GET_COST_FORM_ID = "/process/getCostApplyFormId"; + String API_GET_CHECK_FORM_ID = "/process/getCheckFormId"; + String API_PAGE_AFFAIR = "/process/pageMemberAffair"; + String API_CHECK_AFFAIR = "/process/checkAffair"; + String API_LIST_AFFAIR = "/process/listFormAffair"; + String API_LIST_CHECK = "/process/getCheckList"; + String API_ADD_NODE = "/process/addNode"; + String API_COUNT_NOT_OK = "/process/countUnfinished"; + String API_CHECK_SUMMERY = "/process/checkAffairSummery"; + String API_GET_TARGET_ID = "/process/getTargetByFormId"; + + String OA_USER_LIST = "/process/getUsersByCode"; + String OA_USER_INFO = "/process/getUserByCode"; + String OA_USER_LIST_1 = "/process/getUsersList"; + + String OTHER_RATE_ID = "1515704296494220585"; + String OA_DATA_EXPIRE_ORDER_DR = "/process/data/expiredOrderDiscountRate/"; + String OA_DATA_EXPIRE_ORDER_DR2 = "/process/data/expiredOrderDiscountRateValue/"; + + /** 获取流水号 */ + String API_FLOW_CODE_TODO = "/process/getTodoFlowCode?todoId="; + + String TASK_SYNC_DISPATCH = "/task/dispatch"; + + /** 客户账单余额 */ + String ERP_CUS_AMOUNT = "/erp/customer/amount"; + String ERP_CUS_AMOUNT_QUO = "/erp/customer/quoAmount"; + String ERP_CUS_INV_PRICE = "/erp/inventory/invPrices"; + String ERP_CUS_INV_PRICE_CUS = "/erp/inventory/invPricesByCusCode?cusCode="; + String ERP_CUS_INV_LAST_UPD = "/erp/inventory/lastUpdateCusInvPrices"; + String ERP_CUS_INV_LAST_DEL = "/erp/inventory/lastDeleteCusInvPrices"; + String ERP_CUS_INV_STAND = "/erp/inventory/standList"; + String ERP_CUS_INV_SYNC_PRICE = "/erp/inventory/syncPrice"; + String ERP_CUS_INV_SPECIAL = "/erp/inventory/specialSyncCrm"; + String ERP_CUS_INV_SHELF = "/erp/inventory/shelfSyncCrm"; + String ERP_ORDER_CREATE = "/erp/order/create"; + String ERP_ORDER_STATUS = "/erp/order/getStatus"; + String ERP_ORDER_CANCEL = "/erp/order/cancelOrder"; + String ERP_ORDER_SOURCE = "/erp/order/getOrderRelateInfo"; + + String XLT_SAVE_CHECK = "/xlt/saveCheck"; + String XLT_SAVE_PAYMENT = "/xlt/savePayment"; + String XLT_SAVE_POLICY = "/xlt/savePolicyItem"; + String XLT_LIST_POLICY = "/xlt/listPolicyPayments"; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/consts/ChangeTypeEnum.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/consts/ChangeTypeEnum.java new file mode 100644 index 0000000..f8ecacb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/consts/ChangeTypeEnum.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.common.consts; + +/** + * @author YenHex + * @since 2023/8/30 + */ +public enum ChangeTypeEnum { + + batchApply, + batchChange, + apply, + change + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/consts/ConditionMapEnum.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/consts/ConditionMapEnum.java new file mode 100644 index 0000000..bacc08c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/consts/ConditionMapEnum.java @@ -0,0 +1,13 @@ +package com.qs.serve.modules.tbs.common.consts; + +/** + * @author YenHex + * @since 2023/1/31 + */ +public enum ConditionMapEnum { + + Match, + Break, + Continue; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/consts/ReleaseConst.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/consts/ReleaseConst.java new file mode 100644 index 0000000..91aa479 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/consts/ReleaseConst.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.common.consts; + +/** + * @author YenHex + * @since 2024/5/22 + */ +public class ReleaseConst { + + /** + * 默认开启true,需要修复数据时打开false + */ + public static final boolean UseFilter = true; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/dto/CompensateDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/dto/CompensateDTO.java new file mode 100644 index 0000000..8830dda --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/dto/CompensateDTO.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.common.dto; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/5/16 + */ +@Data +public class CompensateDTO { + + String id; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/dto/CostSortWrapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/dto/CostSortWrapper.java new file mode 100644 index 0000000..cd2ccc2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/dto/CostSortWrapper.java @@ -0,0 +1,70 @@ +package com.qs.serve.modules.tbs.common.dto; + +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.entity.TbsBudgetCondition; +import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; +import lombok.Data; + +import java.util.*; + +/** + * 用于排序 + * @author YenHex + * @since 2023/5/18 + */ +@Data +public class CostSortWrapper { + + Set budgetSet4Subject = new HashSet<>(); + Set budgetSet4NoSubject = new HashSet<>(); + + Set budgetSet4Condition = new HashSet<>(); + Set budgetSet4NoCondition = new HashSet<>(); + + + Map> activityCostConditionsOfSort = new HashMap<>(); + Map> activityAllowBudgetId; + + /** + * sort of timeline,filter timeline + * key is activity_id, value is schedule list + */ + Map> activityScheduleItemMap = new HashMap<>(); + + + public void putActivityCostCondition(Long activityId, List list){ + activityCostConditionsOfSort.put(activityId,list); +// List lastList = activityCostConditionsOfSort.get(activityId); +// if(lastList == null){ +// activityCostConditionsOfSort.put(activityId, list); +// }else { +// lastList.addAll(list); +// activityCostConditionsOfSort.put(activityId,lastList); +// } + } + + /** + * 初始化科目排序因子 + * @param budgetList + */ + public void initializeBudget(List budgetList){ + if(CollectionUtil.isNotEmpty(budgetList)){ + for (TbsBudget budget : budgetList) { + if(budget.getSubjectId()==null||budget.getSubjectId().equals(0L)){ + budgetSet4NoSubject.add(budget.getId()); + }else { + budgetSet4Subject.add(budget.getId()); + } + if(budget.getConditionFlag()==null||budget.getConditionFlag().equals(0)){ + budgetSet4NoCondition.add(budget.getId()); + }else { + budgetSet4Condition.add(budget.getId()); + } + } + } + } + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/dto/TbsBudgetChangeVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/dto/TbsBudgetChangeVo.java new file mode 100644 index 0000000..2036e74 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/dto/TbsBudgetChangeVo.java @@ -0,0 +1,131 @@ +package com.qs.serve.modules.tbs.common.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.SqlCondition; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * @author YenHex + * @since 2023/8/11 + */ +@Data +public class TbsBudgetChangeVo { + + /** 类型:apply,change */ + private String type; + + /** 预算id */ + private Long budgetId; + + /** 预算更变id */ + private Long budgetChangeId; + + /** 更变记录编码 */ + @Length(max = 30,message = "更变记录编码长度不能超过30字") + private String changeCode; + + /** 名称 */ + @NotBlank(message = "名称不能为空") + @Length(max = 30,message = "名称长度不能超过30字") + private String budgetTitle; + + /** 名称 */ + private String newBudgetTitle; + + /** 编码 */ + @Length(max = 30,message = "编码长度不能超过30字") + private String budgetNumber; + + /** 审批状态 */ + @NotNull(message = "审批状态不能为空") + private Integer budgetCheckState; + + private Integer budgetState; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @Length(max = 30,message = "科目编码长度不能超过30字") + private String subjectCode; + + /** 科目名称 */ + @Length(max = 30,message = "科目名称长度不能超过30字") + private String subjectName; + + /** 成本中心类型 */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 20,message = "成本中心类型长度不能超过20字") + private String centerType; + + /** 成本中心id */ + @NotBlank(message = "成本中心id不能为空") + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 30,message = "成本中心编码长度不能超过30字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 30,message = "成本中心名称长度不能超过30字") + private String centerName; + + /** 考核期id */ + @NotNull(message = "考核期id不能为空") + private Long scheduleId; + + /** 考核期编码 */ + @NotBlank(message = "考核期编码不能为空") + @Length(max = 30,message = "考核期编码长度不能超过30字") + private String scheduleCode; + + /** 考核期名称 */ + @NotBlank(message = "考核期名称不能为空") + @Length(max = 30,message = "考核期名称长度不能超过30字") + private String scheduleName; + + /** 致远表单id */ + private String syFormId; + + /** 提交审批时间 */ + @Length(max = 0,message = "提交审批时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime submitTime; + + /** 申请人 */ + @NotBlank(message = "申请人不能为空") + @Length(max = 32,message = "申请人长度不能超过32字") + private String userId; + + /** 用户编码 */ + @Length(max = 32,message = "长度不能超过32字") + private String userCode; + + /** 用户名称 */ + @Length(max = 32,message = "长度不能超过32字") + @TableField(condition = SqlCondition.LIKE) + private String userName; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 是否批量提交 */ + private Integer batchApplyFlag; + + private Long batchApplyId; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/BirHttpUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/BirHttpUtil.java new file mode 100644 index 0000000..c17786b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/BirHttpUtil.java @@ -0,0 +1,142 @@ +package com.qs.serve.modules.tbs.common.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.qs.serve.common.config.properties.ProjectProperties; +import com.qs.serve.common.model.consts.GySysConst; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.tbs.entity.dto.TbsCostSubItem; +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Map; + +/** + * @author YenHex + * @since 2022/11/23 + */ +@Slf4j +@UtilityClass +public class BirHttpUtil { + + /** + * 判断当前环境是否请求bir + * @return + */ + public static boolean isRestBir(){ + ProjectProperties projectProperties = SpringUtils.getBean(ProjectProperties.class); + return projectProperties.getBirService().equals("true"); + } + + public static String getBaseUrl(){ + ProjectProperties projectProperties = SpringUtils.getBean(ProjectProperties.class); + return projectProperties.getBirServiceUrl(); + } + + public static R get(String action){ + return get(action,null); + } + + public static R get(String action,Object query){ + String baseUrl = getBaseUrl(); + String url = "/"+action; + if(query!=null){ + Map map = JsonUtil.objectToMap(query); + String params = HttpUtil.createUrl(map); + if(url.contains("?")){ + url = url+params; + }else { + url = url+"?"+params; + } + } + HashMap hearders = new HashMap<>(); + HttpServletRequest request = ServletUtils.getRequest(); + String tenant = request.getHeader(GySysConst.TENANT_PROP); + String token = request.getHeader(GySysConst.AUTHORIZATION_PROP); + hearders.put(GySysConst.TENANT_PROP,tenant); + hearders.put(GySysConst.AUTHORIZATION_PROP,token); + //自动封装翻页参数 + if(!url.contains("?")){ + url += "?"; + } + if(PageUtil.getPageSize()!=null){ + url += "&pageSize="+PageUtil.getPageSize(); + } + if(PageUtil.getPageNum()!=null){ + url += "&pageNum="+PageUtil.getPageNum(); + } + url = baseUrl + url; + url = url.replace("//","/"); + url = url.replace("http:/","http://"); + url = url.replace("https:/","https://"); + log.debug("请求BIR中转URL:{}",url); + String result = HttpUtil.doGet(url,hearders); + log.debug("请求BIR中转URL:{}\n数据返回:{}",url,result); + JSONObject object = JSON.parseObject(result); + Integer status = object.getInteger("status"); + String msg = object.getString("msg"); + Object data = object.get("data"); + R r = R.ok(data); + r.setStatus(status); + r.setMsg(msg); + return r; + } + + public static R post(String action,Object query){ + String baseUrl = getBaseUrl(); + String url = baseUrl+"/"+action; + + HashMap hearders = new HashMap<>(); + HttpServletRequest request = ServletUtils.getRequest(); + String tenant = request.getHeader(GySysConst.TENANT_PROP); + String token = request.getHeader(GySysConst.AUTHORIZATION_PROP); + hearders.put(GySysConst.TENANT_PROP,tenant); + hearders.put(GySysConst.AUTHORIZATION_PROP,token); + //自动封装翻页参数 +// if(!url.contains("?")){ +// url += "?"; +// } +// if(PageUtil.getPageSize()!=null){ +// url += "&pageSize="+PageUtil.getPageSize(); +// } +// if(PageUtil.getPageNum()!=null){ +// url += "&pageNum="+PageUtil.getPageNum(); +// } + url = url.replace("//","/"); + url = url.replace("http:/","http://"); + url = url.replace("https:/","https://"); + log.debug("请求BIR中转URL:{}",url); + String json = JsonUtil.objectToJson(query); + log.debug("请求BIR中转Query:{}",json); + String result = HttpUtil.doPost(url,json,hearders); + log.debug("请求BIR中转URL:{}\n数据返回:{}",url,result); + JSONObject object = JSON.parseObject(result); + Integer status = object.getInteger("status"); + String msg = object.getString("msg"); + Object data = object.get("data"); + R r = R.ok(data); + r.setStatus(status); + r.setMsg(msg); + return r; + } + + public static TbsCostSubItem.CostCenterTranStr buildCostCenter(String centerType, String centerId, String centerName, String supplierCode){ + try { + Map map = new HashMap<>(); + map.put("centerType",centerType); + map.put("centerId",centerId); + map.put("centerName",centerName); + map.put("supplierCode",supplierCode); + R result = get("/bir/roiRate/getCostCenter",map); + String json = result.getData().toString(); + return JsonUtil.jsonToPojo(json,TbsCostSubItem.CostCenterTranStr.class); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/CostSort2WrapperUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/CostSort2WrapperUtil.java new file mode 100644 index 0000000..a71e346 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/CostSort2WrapperUtil.java @@ -0,0 +1,91 @@ +package com.qs.serve.modules.tbs.common.util; + +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.tbs.common.dto.CostSortWrapper; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsBudgetCondition; +import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * 用于排序 + * @author YenHex + * @since 2023/5/18 + */ +@Slf4j +@Data +public class CostSort2WrapperUtil { + + public static List sort(List list){ + List listResult = new ArrayList<>(); + //有无科目 + List sortOfSubject = new ArrayList<>(); + List sortOfNoSubject = new ArrayList<>(); + for (TbsScheduleItemBudget itemBudget : list) { + if( itemBudget.getBudgetSubjectId() != null && !itemBudget.getBudgetSubjectId().equals(0L)){ + sortOfSubject.add(itemBudget); + }else { + sortOfNoSubject.add(itemBudget); + } + } + List list1 = sortOfCondition(sortOfSubject); + List list2 = sortOfCondition(sortOfNoSubject); + listResult.addAll(list1); + listResult.addAll(list2); + return listResult; + } + + public static List sortOfCondition(List list){ + if(list.size()==0){ + return new ArrayList<>(); + } + List listResult = new ArrayList<>(); + //条件排序 + List sortOfCondition = new ArrayList<>(); + List sortOfNoCondition = new ArrayList<>(); + for (TbsScheduleItemBudget scheduleItemBudget : list) { + if(scheduleItemBudget.getBudgetConditionFlag().equals(1)){ + sortOfCondition.add(scheduleItemBudget); + }else { + sortOfNoCondition.add(scheduleItemBudget); + } + } + sortProductAndTime(sortOfNoCondition); + sortProductAndTime(sortOfCondition); + listResult.addAll(sortOfCondition); + listResult.addAll(sortOfNoCondition); + return listResult; + } + + private static void sortProductAndTime(List list) { + //时间区间内,区间长度取最短 + Collections.sort(list, (o1, o2) -> { + Integer day1 = o1.getEndDate().getDayOfYear(); + Integer day2 = o2.getEndDate().getDayOfYear(); + return day2-day1; + }); + + Collections.sort(list, (o1, o2) -> { + Long day1 = Duration.between(o1.getStartDate(), o1.getEndDate()).toDays(); + Long day2 = Duration.between(o2.getStartDate(), o2.getEndDate()).toDays(); + log.debug("时间区间相同,day1:{} , day2:{}",day1,day2); + return (int) (day2-day1); + }); + + //商品排序 + Collections.sort(list, (o1, o2) -> { + int len1 = o1.getConditionGoodsIds()==null?0:o1.getConditionGoodsIds().split("_").length; + int len2 = o2.getConditionGoodsIds()==null?0:o2.getConditionGoodsIds().split("_").length; + log.debug("时间区间相同,len1:{} , len2:{}",len1,len2); + return len2 - len1; + }); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/CostSortWrapperUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/CostSortWrapperUtil.java new file mode 100644 index 0000000..900c7b8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/CostSortWrapperUtil.java @@ -0,0 +1,137 @@ +package com.qs.serve.modules.tbs.common.util; + +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.tbs.common.dto.CostSortWrapper; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.entity.TbsBudgetCondition; +import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.time.Duration; +import java.util.*; + +/** + * 用于排序 + * @author YenHex + * @since 2023/5/18 + */ +@Slf4j +@Data +public class CostSortWrapperUtil { + + + public static List initializeSort(TbsActivity activity, List list, CostSortWrapper wrapper){ + List resultSortList = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(list)){ + //1.科目限制>品类之间>时间区间 + //2.相同品类,取纬度最小值 + //3.时间区间内,区间长度取最短 + //3.时间区间内,区间长度相同,取最近结束时间 + List tmpList4Subject = new ArrayList<>(); + List tmpList4NotSubject = new ArrayList<>(); + for (TbsScheduleItemBudget scheduleItemBudget : list) { + Long budgetId = scheduleItemBudget.getBudgetId(); + if(wrapper.getBudgetSet4Subject().contains(budgetId)){ + tmpList4Subject.add(scheduleItemBudget); + }else{ + tmpList4NotSubject.add(scheduleItemBudget); + } + } + log.debug("活动【{}】匹配有科目预算数:{},无科目预算:{}",activity.getActivityCode() ,tmpList4Subject.size() , tmpList4NotSubject.size()); + if(CollectionUtil.isNotEmpty(tmpList4Subject)){ + CostSortWrapperUtil.sort4Condition(activity,tmpList4Subject,resultSortList,wrapper); + } + if(CollectionUtil.isNotEmpty(tmpList4NotSubject)){ + CostSortWrapperUtil.sort4Condition(activity,tmpList4NotSubject,resultSortList,wrapper); + } + } + if(resultSortList.size()!=list.size()){ + log.error("排序有误"); + Assert.throwEx("排序有误"); + } + return resultSortList; + } + + /** + * 按有无条件分割 + * @param activity + * @param list + * @param result + * @param wrapper + */ + private static void sort4Condition(TbsActivity activity,List list,List result,CostSortWrapper wrapper) { + List tmpList4Condition = new ArrayList<>(); + List tmpList4NoCondition = new ArrayList<>(); + for (TbsScheduleItemBudget scheduleItemBudget : list) { + Long budgetId = scheduleItemBudget.getBudgetId(); + if(wrapper.getBudgetSet4Condition().contains(budgetId)){ + tmpList4Condition.add(scheduleItemBudget); + }else{ + tmpList4NoCondition.add(scheduleItemBudget); + } + } + log.debug("活动【{}】匹配有科目预算数:{},无科目预算:{}",activity.getActivityCode() ,tmpList4Condition.size() , tmpList4NoCondition.size()); + if(CollectionUtil.isNotEmpty(tmpList4Condition)){ + CostSortWrapperUtil.sort4GoodsCondition(activity,tmpList4Condition,result,wrapper); + } + if(CollectionUtil.isNotEmpty(tmpList4NoCondition)){ + CostSortWrapperUtil.sort4NotGoodsCondition(tmpList4NoCondition,result,wrapper); + } + } + + private static void sort4GoodsCondition(TbsActivity activity,List list,List result,CostSortWrapper wrapper){ + if(CollectionUtil.isNotEmpty(list)){ + List activityCostConditions = wrapper.getActivityCostConditionsOfSort().get(activity.getId()); + Collections.sort(activityCostConditions, (o1, o2) -> { + int len1 = o1.getTargetLevelPathIds().split("_").length; + int len2 = o2.getTargetLevelPathIds().split("_").length; + if(len1==len2){ + List scheduleItemBudgets = list; + Long day1 = null; + Long day2 = null; + for (TbsScheduleItemBudget itemBudget : scheduleItemBudgets) { + if(itemBudget.getBudgetId().equals(o1.getBudgetId())){ + day1 = Duration.between(itemBudget.getStartDate(), itemBudget.getEndDate()).toDays(); + }else if (itemBudget.getBudgetId().equals(o2.getBudgetId())){ + day2 = Duration.between(itemBudget.getStartDate(), itemBudget.getEndDate()).toDays(); + } + } + log.debug("活动【{}】 时间区间相同,day1:{} , day2:{}",activity.getActivityCode(),day1,day2); + if(day1!=null&&day2!=null){ + return (int) (day1-day2); + } + } + return len2 - len1; + }); + List newSortList = new ArrayList<>(); + for (TbsBudgetCondition costCondition : activityCostConditions) { + for (TbsScheduleItemBudget scheduleItemBudget : list) { + if(scheduleItemBudget.getBudgetId().equals(costCondition.getBudgetId())){ + newSortList.add(scheduleItemBudget); + } + } + } + if(newSortList.size()!=list.size()){ + log.error("排序有误"); + Assert.throwEx("排序有误"); + } + result.addAll(newSortList); + } + } + + private static void sort4NotGoodsCondition(List list,List result,CostSortWrapper wrapper){ + if(CollectionUtil.isNotEmpty(list)){ + Collections.sort(list, (o1, o2) -> { + Long day1 = Duration.between(o1.getStartDate(), o1.getEndDate()).toDays(); + Long day2 = Duration.between(o2.getStartDate(), o2.getEndDate()).toDays(); + log.debug("时间区间相同,day1:{} , day2:{}",day1,day2); + return (int) (day1-day2); + }); + result.addAll(list); + } + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/QuarterUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/QuarterUtil.java new file mode 100644 index 0000000..44c1160 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/QuarterUtil.java @@ -0,0 +1,57 @@ +package com.qs.serve.modules.tbs.common.util; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/7/13 + */ +public class QuarterUtil { + + public static final List q1 = Arrays.asList(1,2,3); + public static final List q2 = Arrays.asList(4,5,6); + public static final List q3 = Arrays.asList(7,8,9); + public static final List q4 = Arrays.asList(10,11,12); + + /** + * 获取季度月份 + * @param year + * @param month + * @return + */ + public static List getQuarterNumbers(Integer year,Integer month){ + Integer year100 = year*100; + if(q1.contains(month)){ + return q1.stream().map(a->year100+a).collect(Collectors.toList()); + }else if(q2.contains(month)){ + return q2.stream().map(a->year100+a).collect(Collectors.toList()); + }else if(q3.contains(month)){ + return q3.stream().map(a->year100+a).collect(Collectors.toList()); + }else if(q4.contains(month)){ + return q4.stream().map(a->year100+a).collect(Collectors.toList()); + } + return null; + } + + /** + * 返回第几季度 + * @param month + * @return + */ + public static Integer getQuarterNumber(Integer month){ + if(q1.contains(month)){ + return 1; + }else if(q2.contains(month)){ + return 2; + }else if(q3.contains(month)){ + return 3; + }else if(q4.contains(month)){ + return 4; + } + return null; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/TbsActivityUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/TbsActivityUtil.java new file mode 100644 index 0000000..974fafd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/TbsActivityUtil.java @@ -0,0 +1,62 @@ +package com.qs.serve.modules.tbs.common.util; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.util.SpringUtils; +import com.qs.serve.modules.sys.entity.SysConfig; +import com.qs.serve.modules.sys.service.SysConfigService; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import org.springframework.beans.BeansException; + +import javax.swing.*; +import java.time.LocalDate; + +/** + * @author YenHex + * @since 2023/6/19 + */ +public class TbsActivityUtil { + + public static Integer getSysConfOfWarningDays(){ + int sysConfOfWarningDays = 0; + try { + SysConfigService configService = SpringUtils.getBean(SysConfigService.class); + SysConfig config = configService.getByKey("ExpenseApplicationActivityWriteOffOverdueWarningDays"); + String val = config.getConfigValue(); + sysConfOfWarningDays = Integer.parseInt(val); + } catch (BeansException | NumberFormatException e) { + e.printStackTrace(); + } + return sysConfOfWarningDays; + } + + /** + * 建立预期条件 + * @param lqw + * @param queryState 0=>未逾期、1=>已逾期、2=>即将逾期 + */ + public static void buildOverdue(LambdaQueryWrapper lqw,Integer queryState){ + if(queryState!=null){ + if(queryState.equals(0)){ + lqw.gt(TbsActivity::getPreCheckDate, LocalDate.now()); + }else if(queryState.equals(1)){ + lqw.and(qw->{ + qw.le(TbsActivity::getPreCheckDate, LocalDate.now()) + .or() + .le(TbsActivity::getPreEndDateBack, LocalDate.now()); + }); + }else if(queryState.equals(2)){ + LocalDate now = LocalDate.now(); + int sysConfOfWarningDays = getSysConfOfWarningDays(); + LocalDate startNow = now.plusDays( - sysConfOfWarningDays ); + lqw.and(qw->{ + qw.between(TbsActivity::getPreCheckDate,startNow , now) + .or() + .between(TbsActivity::getPreEndDateBack,startNow , now); + }); + }else { + lqw.eq(TbsActivity::getId,"0"); + } + } + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetConditionUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetConditionUtil.java new file mode 100644 index 0000000..634fe52 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetConditionUtil.java @@ -0,0 +1,114 @@ +package com.qs.serve.modules.tbs.common.util; + +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.SpringUtils; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.service.GoodsCategoryService; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.entity.TbsBudgetCondition; + +import javax.swing.*; +import java.util.ArrayList; +import java.util.List; + +/** + * @author YenHex + * @since 2023/8/9 + */ +public class TbsBudgetConditionUtil { + + /** + * 建立条件数据 + * @param budgetId + * @param brandIds + * @param categoryIds + * @param seriesIds + * @param spuIds + * @param skuIds + */ + public static List buildCondition(Long budgetId, List brandIds, List categoryIds, List seriesIds, List spuIds, List skuIds){ + GoodsSkuService goodsSkuService = SpringUtils.getBean(GoodsSkuService.class); + GoodsSpuService goodsSpuService = SpringUtils.getBean(GoodsSpuService.class); + GoodsCategoryService goodsCategoryService = SpringUtils.getBean(GoodsCategoryService.class); + + List budgetConditions = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(skuIds)) { + List skuList = goodsSkuService.listByIds(skuIds); + for (GoodsSku sku : skuList) { + GoodsSpu goodsSpu = goodsSpuService.getById(sku.getSpuId()); + GoodsCategory category1 = goodsCategoryService.getById(goodsSpu.getCategoryFirst()); + GoodsCategory category2 = goodsCategoryService.getById(goodsSpu.getCategorySecond()); + GoodsCategory category3 = goodsCategoryService.getById(goodsSpu.getCategoryThird()); + TbsBudgetCondition condition = new TbsBudgetCondition(); + condition.setBudgetId(budgetId); + condition.setBrandId(category1.getId()+""); + condition.setTargetType(TbsGoodsType.sku.name()); + condition.setTargetId(sku.getId()); + condition.setTargetCode(sku.getSkuCode()); + condition.setTargetName(sku.getSpecInfos()); + condition.setTargetLevelPathIds(category1.getId() + "_" + category2.getId() + "_" + category3.getId() + "_" + goodsSpu.getId() + "_" + sku.getId()); + condition.setTargetLevelPathNames(category1.getName() + "_" + category2.getName() + "_" + category3.getName() + "_" + goodsSpu.getName() + "_" + sku.getSpecInfos()); + budgetConditions.add(condition); + } + } + if (CollectionUtil.isNotEmpty(spuIds)) { + List spuList = goodsSpuService.listByIds(spuIds); + for (GoodsSpu goodsSpu : spuList) { + GoodsCategory category1 = goodsCategoryService.getById(goodsSpu.getCategoryFirst()); + GoodsCategory category2 = goodsCategoryService.getById(goodsSpu.getCategorySecond()); + GoodsCategory category3 = goodsCategoryService.getById(goodsSpu.getCategoryThird()); + TbsBudgetCondition condition = new TbsBudgetCondition(); + condition.setBudgetId(budgetId); + condition.setTargetType(TbsGoodsType.spu.name()); + condition.setBrandId(category1.getId()+""); + condition.setTargetId(goodsSpu.getId()); + condition.setTargetCode(goodsSpu.getSpuCode()); + condition.setTargetName(goodsSpu.getName()); + condition.setTargetLevelPathIds(category1.getId() + "_" + category2.getId() + "_" + category3.getId() + "_" + goodsSpu.getId()); + condition.setTargetLevelPathNames(category1.getName() + "_" + category2.getName() + "_" + category3.getName() + "_" + goodsSpu.getName()); + budgetConditions.add(condition); + } + } + budgetConditions.addAll(buildCategoryCondition(goodsCategoryService,budgetId, seriesIds, TbsGoodsType.series.name())); + budgetConditions.addAll(buildCategoryCondition(goodsCategoryService,budgetId, categoryIds, TbsGoodsType.category.name())); + budgetConditions.addAll(buildCategoryCondition(goodsCategoryService,budgetId, brandIds, TbsGoodsType.brand.name())); + return budgetConditions; + } + + /** + * 建立类目条件 + * @param goodsCategoryService + * @param budgetId + * @param categoryIds + * @param targetType + * @return + */ + private static List buildCategoryCondition(GoodsCategoryService goodsCategoryService, Long budgetId, List categoryIds, String targetType){ + List budgetConditions = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(categoryIds)){ + List categoryList = goodsCategoryService.listByIds(categoryIds); + for (GoodsCategory category : categoryList) { + TbsBudgetCondition condition = new TbsBudgetCondition(); + condition.setBudgetId(budgetId); + condition.setTargetType(targetType); + condition.setTargetId(category.getId()); + condition.setTargetCode(category.getCode()); + condition.setTargetName(category.getName()); + condition.setTargetLevelPathIds(category.getLevelPath()); + condition.setTargetLevelPathNames(category.getLevelPathNames()); + if(StringUtils.hasText(category.getLevelPath())){ + condition.setBrandId(category.getLevelPath().split("_")[0]); + } + budgetConditions.add(condition); + } + } + return budgetConditions; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetCostUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetCostUtil.java new file mode 100644 index 0000000..65320f3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetCostUtil.java @@ -0,0 +1,110 @@ +package com.qs.serve.modules.tbs.common.util; + +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods; +import com.qs.serve.modules.tbs.entity.TbsBudgetCostItem; +import org.jetbrains.annotations.NotNull; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.temporal.TemporalAdjusters; +import java.util.*; + +/** + * @author YenHex + * @since 2022/12/5 + */ +public class TbsBudgetCostUtil { + + /** + * 统计费用占用历史 + * @param budgetCostItems + * @return + */ + public static BigDecimal totalHisCost(List budgetCostItems){ + BigDecimal total = BigDecimal.ZERO; + if(CollectionUtil.isNotEmpty(budgetCostItems)){ + for (TbsBudgetCostItem item : budgetCostItems) { + total = total.add(item.getCenterGoodsAmount()); + } + } + return total; + } + + /** + * 拆分条件 + * @param path + * @param paths + */ + public static void buildPaths(String path, Set paths){ + if(path.contains("_")){ + String subPath = path.substring(0,path.lastIndexOf("_")); + paths.add(subPath); + buildPaths(subPath,paths); + } + } + + public static void main(String[] args) { + String aa = "1_9_3_4_5_6"; + Set stringSet = new LinkedHashSet<>(); + buildPaths(aa,stringSet); + stringSet.forEach(System.out::println); + } + + /** + * 按月份创建预算占用明细 + * @param centerGoodsList + * @return + */ + @NotNull + public static List createBudgetCostItems(List centerGoodsList) { + List budgetCostItems = new ArrayList<>(); + for (TbsActivityCenterGoods centerGoods : centerGoodsList) { + //按月份拆分 + LocalDate actStartDate = centerGoods.getActStartDate(); + LocalDate itemStartDate = centerGoods.getActStartDate(); + LocalDate actEndDate = centerGoods.getActEndDate(); + int days = actEndDate.getDayOfYear() - actStartDate.getDayOfYear() + 1; + int count = Math.max(days / 28, 2); + BigDecimal totalAmount = centerGoods.getCenterGoodsAmount(); + BigDecimal balance = centerGoods.getCenterGoodsAmount(); + for (int i = 0; i < count ; i++) { + if(itemStartDate.getDayOfYear() > actEndDate.getDayOfYear()){ + break; + } + LocalDate itemLastDay = itemStartDate.with(TemporalAdjusters.lastDayOfMonth()); + boolean isEnd = false; + if(itemLastDay.getDayOfYear() >= actEndDate.getDayOfYear()){ + itemLastDay = actEndDate; + isEnd = true; + } + int daysOfMonth = itemStartDate.getDayOfYear()-itemLastDay.getDayOfYear()+1; + BigDecimal currentItemAmount; + if(isEnd){ + currentItemAmount = balance; + }else { + currentItemAmount = BigDecimal.valueOf(daysOfMonth) + .divide(BigDecimal.valueOf(days), RoundingMode.HALF_UP) + .multiply(totalAmount); + balance = balance.subtract(currentItemAmount); + } + //构建明细项 + TbsBudgetCostItem budgetCostItem = CopierUtil.copy(centerGoods,new TbsBudgetCostItem()); + budgetCostItem.setId(null); + budgetCostItem.setCenterGoodItemId(centerGoods.getId()); + /* + budgetCostItem.setItemStartDate(itemStartDate); + budgetCostItem.setItemEndDate(itemLastDay); + budgetCostItem.setMonthAmount(currentItemAmount); + */ + budgetCostItems.add(budgetCostItem); + //跨月份重新赋值 + itemStartDate = itemLastDay.plusDays(1); + } + } + return budgetCostItems; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetLogBuildUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetLogBuildUtil.java new file mode 100644 index 0000000..3a9815b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/common/util/TbsBudgetLogBuildUtil.java @@ -0,0 +1,214 @@ +package com.qs.serve.modules.tbs.common.util; + +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tzc.entity.TzcPolicy; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; + +import java.math.BigDecimal; +import java.util.List; +/** + * @author YenHex + * @since 2023/5/25 + */ +public class TbsBudgetLogBuildUtil { + + public static BigDecimal buildAmount(BigDecimal amount,BudgetLogOptFlag optFlag){ + if(amount.compareTo(BigDecimal.ZERO)>0&&!optFlag.isAddBudget()){ + return amount.negate(); + }else if(amount.compareTo(BigDecimal.ZERO)<0&&optFlag.isAddBudget()){ + return amount.negate(); + }else { + return amount; + } + } + + public static TbsBudgetLog toTbsBudgetLog(SysUser sysUser, TbsBudget budget, TbsScheduleItemBudget scheduleItemBudget, BudgetLogOptFlag optType, BigDecimal amount) { + TbsBudgetLog budgetLog = new TbsBudgetLog(); + budgetLog.setBudgetId(budget.getId()); + budgetLog.setBudgetCode(budget.getBudgetCode()); + budgetLog.setOptType(optType.getCode()); + budgetLog.setOptUserId(sysUser.getId()); + budgetLog.setOptUserCode(sysUser.getCode()); + budgetLog.setOptUserName(sysUser.getName()); + budgetLog.setAmount(buildAmount(amount,optType)); + budgetLog.setScheduleId(scheduleItemBudget.getScheduleId()); + budgetLog.setScheduleItemId(scheduleItemBudget.getScheduleItemId()); + budgetLog.setScheduleItemBudgetId(scheduleItemBudget.getId()); + budgetLog.setItemName(scheduleItemBudget.getItemName()); + budgetLog.setStartDate(scheduleItemBudget.getStartDate()); + budgetLog.setEndDate(scheduleItemBudget.getEndDate()); + budgetLog.setSubjectId(budget.getSubjectId()); + budgetLog.setSubjectCode(budget.getSubjectCode()); + budgetLog.setSubjectName(budget.getSubjectName()); + budgetLog.setCenterType(budget.getCenterType()); + budgetLog.setCenterId(budget.getCenterId()); + budgetLog.setCenterCode(budget.getCenterCode()); + budgetLog.setCenterName(budget.getCenterName()); + return budgetLog; + } + + /** + * 费用申请相关 + * @param optType + * @param sysUser + * @param costApply + * @param item + * @param budget + * @param amount + * @param activity + * @return + */ + 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()); + budgetLog.setOptType(optType.getCode()); + budgetLog.setOptUserId(sysUser.getId()); + budgetLog.setOptUserCode(sysUser.getCode()); + budgetLog.setOptUserName(sysUser.getName()); + budgetLog.setAmount(buildAmount(amount,optType)); + budgetLog.setScheduleId(item.getScheduleId()); + budgetLog.setScheduleItemId(item.getScheduleItemId()); + budgetLog.setScheduleItemBudgetId(item.getScheduleItemBudgetId()); + budgetLog.setItemName(item.getScheduleItemName()); + budgetLog.setStartDate(item.getActStartDate().atStartOfDay()); + budgetLog.setEndDate(item.getActEndDate().atStartOfDay()); + budgetLog.setSubjectId(item.getSubjectId()); + budgetLog.setSubjectCode(item.getSubjectCode()); + budgetLog.setSubjectName(item.getSubjectName()); + budgetLog.setCenterId(item.getCenterId()); + budgetLog.setCenterCode(item.getCenterCode()); + budgetLog.setCenterName(item.getCenterName()); + budgetLog.setCenterType(item.getCenterType()); + budgetLog.setSupplierId(item.getSupplierId()); + budgetLog.setSupplierCode(item.getSupplierCode()); + budgetLog.setSupplierName(item.getSupplierName()); + budgetLog.setActivityId(item.getActivityId()); + budgetLog.setActivityCode(item.getActivityCode()); + budgetLog.setActivityTheme(activity.getActTitle()); + budgetLog.setCostApplyId(costApply.getId()); + budgetLog.setCostApplyCode(costApply.getCode()); + budgetLog.setCostApplyTheme(costApply.getChargeTheme()); + budgetLog.setTargetType(item.getTargetType()); + budgetLog.setTargetId(item.getTargetId()); + budgetLog.setTargetCode(item.getTargetCode()); + budgetLog.setTargetName(item.getTargetName()); + budgetLog.setTargetLevelPathIds(item.getTargetLevelPathIds()); + budgetLog.setTargetLevelPathNames(item.getTargetLevelPathNames()); + return budgetLog; + } + + /** + * 费用申请相关 + * @param optType + * @param sysUser + * @param costApply + * @param item + * @param centerGoods + * @param amount + * @param activity + * @return + */ + public static TbsBudgetLog buildTbsBudgetLog(BudgetLogOptFlag optType, SysUser sysUser, TbsCostApply costApply, TbsScheduleItemBudget item, TbsActivityCenterGoods centerGoods, BigDecimal amount, TbsActivity activity) { + TbsBudgetLog budgetLog = new TbsBudgetLog(); + budgetLog.setBudgetId(item.getBudgetId()); + budgetLog.setBudgetCode(item.getBudgetCode()); + budgetLog.setOptType(optType.getCode()); + budgetLog.setOptUserId(sysUser.getId()); + budgetLog.setOptUserCode(sysUser.getCode()); + budgetLog.setOptUserName(sysUser.getName()); + budgetLog.setAmount(buildAmount(amount,optType)); + budgetLog.setScheduleId(item.getScheduleId()); + budgetLog.setScheduleItemId(item.getScheduleItemId()); + budgetLog.setScheduleItemBudgetId(centerGoods.getScheduleItemBudgetId()); + budgetLog.setItemName(item.getItemName()); + budgetLog.setStartDate(centerGoods.getActStartDate().atStartOfDay()); + budgetLog.setEndDate(centerGoods.getActEndDate().atStartOfDay()); + budgetLog.setSubjectId(centerGoods.getSubjectId()); + budgetLog.setSubjectCode(centerGoods.getSubjectCode()); + budgetLog.setSubjectName(centerGoods.getSubjectName()); + budgetLog.setCenterId(centerGoods.getCenterId()); + budgetLog.setCenterCode(centerGoods.getCenterCode()); + budgetLog.setCenterName(centerGoods.getCenterName()); + budgetLog.setCenterType(centerGoods.getCenterType()); + budgetLog.setSupplierId(centerGoods.getSupplierId()); + budgetLog.setSupplierCode(centerGoods.getSupplierCode()); + budgetLog.setSupplierName(centerGoods.getSupplierName()); + budgetLog.setActivityId(centerGoods.getActivityId()); + budgetLog.setActivityCode(centerGoods.getActivityCode()); + budgetLog.setActivityTheme(StringUtils.tailorLen(activity.getActTitle(),230)); + budgetLog.setCostApplyId(costApply.getId()); + budgetLog.setCostApplyCode(costApply.getCode()); + budgetLog.setCostApplyTheme(StringUtils.tailorLen(costApply.getChargeTheme(),140)); + budgetLog.setTargetType(centerGoods.getTargetType()); + budgetLog.setTargetId(centerGoods.getTargetId()); + budgetLog.setTargetCode(centerGoods.getTargetCode()); + budgetLog.setTargetName(centerGoods.getTargetName()); + budgetLog.setTargetLevelPathIds(centerGoods.getTargetLevelPathIds()); + budgetLog.setTargetLevelPathNames(centerGoods.getTargetLevelPathNames()); + return budgetLog; + } + + /** + * 政策相关 + * @param optType + * @param sysUser + * @param tzcPolicy + * @param item + * @param budget + * @param amount + * @param policyItem + * @return + */ + public static TbsBudgetLog buildTbsBudgetLog(BudgetLogOptFlag optType, SysUser sysUser, TzcPolicy tzcPolicy, TbsBudgetCostItemPolicy item, TbsBudget budget, BigDecimal amount, TzcPolicyItem policyItem) { + TbsBudgetLog budgetLog = new TbsBudgetLog(); + budgetLog.setBudgetId(item.getBudgetId()); + budgetLog.setBudgetCode(budget.getBudgetCode()); + budgetLog.setOptType(optType.getCode()); + budgetLog.setOptUserId(sysUser.getId()); + budgetLog.setOptUserCode(sysUser.getCode()); + budgetLog.setOptUserName(sysUser.getName()); + budgetLog.setAmount(buildAmount(amount,optType)); + budgetLog.setScheduleId(item.getScheduleId()); + budgetLog.setScheduleItemId(item.getScheduleItemId()); + budgetLog.setScheduleItemBudgetId(item.getScheduleItemBudgetId()); + budgetLog.setItemName(item.getScheduleItemName()); + budgetLog.setStartDate(policyItem.getPolicyStartDate().atStartOfDay()); + budgetLog.setEndDate(policyItem.getPolicyEndDate().atStartOfDay()); + budgetLog.setSubjectId(item.getSubjectId()); + budgetLog.setSubjectCode(item.getSubjectCode()); + budgetLog.setSubjectName(item.getSubjectName()); + budgetLog.setCenterId(item.getCenterId()); + budgetLog.setCenterCode(item.getCenterCode()); + budgetLog.setCenterName(item.getCenterName()); + budgetLog.setCenterType(item.getCenterType()); + budgetLog.setSupplierId(item.getSupplierId()); + budgetLog.setSupplierCode(item.getSupplierCode()); + budgetLog.setSupplierName(item.getSupplierName()); + budgetLog.setPolicyId(tzcPolicy.getId()); + budgetLog.setPolicyCode(tzcPolicy.getPolicyCode()); + budgetLog.setPolicyTitle(tzcPolicy.getTitle()); + budgetLog.setPolicyItemId(item.getPolicyItemId()); + budgetLog.setPolicyItemCode(item.getPolicyItemCode()); + List usedConditionList = policyItem.getUsedConditionList(); + if(usedConditionList!=null&&usedConditionList.size()>0){ + for (TbsBudgetCondition usedCondition : usedConditionList) { + if(usedCondition.getBudgetId().equals(budget.getId())){ + budgetLog.setTargetType(usedCondition.getTargetType()); + budgetLog.setTargetName(usedCondition.getTargetName()); + budgetLog.setTargetCode(usedCondition.getTargetCode()); + budgetLog.setTargetLevelPathIds(usedCondition.getTargetLevelPathIds()); + budgetLog.setTargetLevelPathNames(usedCondition.getTargetLevelPathNames()); + break; + } + } + } + return budgetLog; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController.java new file mode 100644 index 0000000..aed4c36 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController.java @@ -0,0 +1,418 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qs.serve.common.model.annotation.LimitSubmit; +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.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsActivityState; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.common.util.TbsActivityUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.bo.TbsActivityDefaultCenterBo; +import com.qs.serve.modules.tbs.entity.bo.TbsActivityReopenBo; +import com.qs.serve.modules.tbs.entity.vo.TbsActivityCenterGoodsVo; +import com.qs.serve.modules.tbs.entity.vo.TbsActivityDefaultCenterVo; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tbs.entity.so.TbsActivitySo; +import com.qs.serve.modules.tbs.entity.bo.TbsActivityBo; + +import javax.validation.Valid; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 预算 费用活动 + * @module 预算 + * @service 费用活动 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/activity") +public class TbsActivityController { + + private final SysUserService sysUserService; + private final TbsCostApplyService costApplyService; + private final TbsActivityService tbsActivityService; + private final TbsActivityGoodsService activityGoodsService; + private final TbsActivitySubjectService activitySubjectService; + private final TbsActivityCenterService activityCenterService; + private final TbsActivityCenterGoodsService activityCenterGoodsService; + private final TbsActivityChannelService activityChannelService; + private final TbsActivityChannelPointService activityChannelPointService; + private final VtbVerificationService verificationService; + private final TbsActivityApplicationService tbsActivityApplicationService; + private final TbsCostApplyPart1Service tbsCostApplyPart1Service; + private final TbsCostApplyService tbsCostApplyService; + TbsActivityDebugApplicationService tbsActivityDebugApplicationService; + + @GetMapping("/reset/{id}") + public R reset(@PathVariable("id") Long id){ + String msg = tbsActivityDebugApplicationService.reset(id); + TbsActivity activity = tbsActivityService.getById(id); + return R.ok(msg); + } + + @GetMapping("/resetList") + public R reset(){ + Long[] ids = new Long[]{ + }; + for (Long id : ids) { + System.out.println(tbsActivityDebugApplicationService.reset(id)); + } + return R.ok(); + } + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + @PreAuthorize("hasRole('tbs:activity:query')") + public R> getList(TbsActivitySo param){ + TbsActivity entity = CopierUtil.copy(param,new TbsActivity()); + TbsCostApply costApply = null; + if(entity.getCostApplyId()!=null){ + costApply = costApplyService.getById(entity.getCostApplyId()); + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + TbsActivityUtil.buildOverdue(lqw,param.getOverdueState()); + List list = tbsActivityService.list(lqw); + int overflowDays = TbsActivityUtil.getSysConfOfWarningDays(); + for (TbsActivity activity : list) { + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("activity_id",activity.getId()); + List goodsList = activityGoodsService.list(qw); + if(goodsList.size()>0){ + activity.setGoodsType(goodsList.get(0).getTargetType()); + } + goodsList.forEach(TbsActivityGoods::initSpuSkuName); + activity.setGoodsList(goodsList); + List activitySubjects = activitySubjectService.list(qw); + activity.setSubjectCenterList(activitySubjects); + tbsCostApplyPart1Service.buildDetailVo(activity); + activity.initWarningDay(overflowDays); + if(costApply!=null){ + //修改预期状态显示 + if(costApply.getChargeState().equals(5) + ||costApply.getChargeState().equals(6) + ||costApply.getChargeState().equals(8)){ + activity.setActivityState(5); + activity.setOverdueState(0); + activity.setOverdueWarningDays(0L); + }else if(!costApply.getChargeState().equals(2)){ + activity.setOverdueState(0); + activity.setOverdueWarningDays(0L); + } + + } + } + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('tbs:activity:query')") + public R> getPage(TbsActivitySo param){ + TbsActivity entity = CopierUtil.copy(param,new TbsActivity()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + lqw.select(TbsActivity::getId); + if(param.getPassEndTime()!=null){ + lqw.le(TbsActivity::getCostPassTime,param.getPassEndTime()); + } + if(param.getPassStartTime()!=null){ + lqw.ge(TbsActivity::getCostPassTime,param.getPassStartTime()); + } + lqw.orderByDesc(TbsActivity::getId); + PageUtil.startPage(); + List listObjects = tbsActivityService.list(lqw); + int overflowDays = TbsActivityUtil.getSysConfOfWarningDays(); + if(listObjects.size()>0){ + List listIds = listObjects.stream().map(a->a.getId()).collect(Collectors.toList()); + List list = tbsActivityService.listByIds(listIds); + List userIds = list.stream().filter(a->a.getCreateBy()!=null).map(TbsActivity::getCreateBy).distinct().collect(Collectors.toList()); + if(userIds.size()<1){ + return R.byPageHelperList(listObjects,list); + } + List sysUsers = sysUserService.listByIds(userIds); + for (TbsActivity activity : list) { + activity.initWarningDay(overflowDays); + if(activity.getCreateBy()==null){ + continue; + } + for (SysUser sysUser : sysUsers) { + if(activity.getCreateBy().equals(sysUser.getId())){ + activity.setApplyUser(sysUser.toSysUserVo()); + break; + } + } + } + return R.byPageHelperList(listObjects,list); + }else { + return R.byEmptyList(); + } + } + + /** + * 翻页 + * @return + */ + @GetMapping("/page4Home") + public R> getPage2(){ + TbsActivity entity = new TbsActivity(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + TbsActivityUtil.buildOverdue(lqw,2); + lqw.eq(TbsActivity::getCreateBy, AuthContextUtils.getSysUserId()); + lqw.orderByDesc(TbsActivity::getPreCheckDate); + PageUtil.startPage(); + List listObjects = tbsActivityService.list(lqw); + int overflowDays = TbsActivityUtil.getSysConfOfWarningDays(); + listObjects.forEach(a->a.initWarningDay(overflowDays)); + return R.byPageHelperList(listObjects); + } + + + /** + * 费用详情列表 + * @param id + * @return + */ + @GetMapping("/getCostListById/{id}") + @SysLog(module = SystemModule.Budget, title = "费用活动", biz = BizType.QUERY) + @PreAuthorize("hasRole('tbs:activity:query')") + public R> getCostListById(@PathVariable("id") String id){ + QueryWrapper qw = new QueryWrapper(); + qw.eq("cost_apply_id",id); + List activityList = tbsActivityService.list(qw); + List centerGoodsList = activityCenterGoodsService.list(qw); + List voList = new ArrayList<>(); + + //初始化预期状态 + int overflowDays = TbsActivityUtil.getSysConfOfWarningDays(); + for (TbsActivity activity : activityList) { + activity.initWarningDay(overflowDays); + } + + for (TbsActivityCenterGoods centerGoods : centerGoodsList) { + TbsActivityCenterGoodsVo goods = CopierUtil.copy(centerGoods,new TbsActivityCenterGoodsVo()); + for (TbsActivity activity : activityList) { + if(goods.getActivityId().equals(activity.getId())){ + goods.setActivityInfo(activity); + break; + } + } + if(goods.getTargetType().equals(TbsGoodsType.sku.name())){ + try { + String[] names = goods.getTargetLevelPathNames().split("_"); + goods.setSkuName(names[names.length-1]); + goods.setSpuName(names[names.length-2]); + } catch (Exception e) { + log.error("格式错误:{}",goods.getTargetLevelPathNames()); + } + } + voList.add(goods); + } + return R.ok(voList); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Budget, title = "费用活动", biz = BizType.QUERY) + @PreAuthorize("hasRole('tbs:activity:query')") + public R getById(@PathVariable("id") String id){ + TbsActivity activity = tbsActivityService.getById(id); + tbsCostApplyPart1Service.buildDetailVo(activity); + return R.ok(activity); + } + + /** + * 对比预算 + * @param param + * @return + */ + @PostMapping("/matchBudget") + @SysLog(module = SystemModule.Budget, title = "费用活动", biz = BizType.UPDATE) + public R matchBudget(@RequestBody @Valid TbsActivityBo param){ + return R.ok(tbsActivityApplicationService.matchBudgetCostResult(false,param)); + } + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.Budget, title = "费用活动", biz = BizType.UPDATE) + @PreAuthorize("hasRole('tbs:activity:update')") + public R updateById(@RequestBody @Valid TbsActivityBo param){ + if(param.getId()==null){ + return R.error("id is null"); + } + tbsActivityService.modify(param); + return R.ok(); + } + + /** + * 冻结活动 + * @param param + * @return + */ + @LimitSubmit + @PostMapping("/reopen") + @SysLog(module = SystemModule.Budget, title = "费用活动", biz = BizType.UPDATE) + @PreAuthorize("hasRole('tbs:activity:update')") + public R freeze(@RequestBody @Valid TbsActivityReopenBo param){ + return verificationService.freeze(param); + } + + + /** + * 新增 + * @param param + * @return + */ + @LimitSubmit + @PostMapping("/save") + @SysLog(module = SystemModule.Budget, title = "费用活动", biz = BizType.INSERT) + @PreAuthorize("hasRole('tbs:activity:insert')") + public R save(@RequestBody @Valid TbsActivityBo param){ + param.setId(null); + tbsActivityService.modify(param); + return R.ok(); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.Budget, title = "费用活动", biz = BizType.DELETE) + @PreAuthorize("hasRole('tbs:activity:delete')") + @Transactional(rollbackFor = Exception.class) + public R deleteById(@PathVariable("id") Long id){ + TbsActivity activity = tbsActivityService.getById(id); + TbsCostApply costApply = costApplyService.getById(activity.getCostApplyId()); + if(!costApply.getChargeState().equals(TbsCostApplyState.State_0_unPublish.getCode()) + &&!costApply.getChargeState().equals(TbsCostApplyState.State_4_refused.getCode())){ + return R.error("因费用状态不支持编辑!!"); + } + boolean result = tbsActivityService.removeById(id); + //删除子表数据 + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("activity_id",id); + activitySubjectService.remove(queryWrapper); + activityGoodsService.remove(queryWrapper); + activityChannelPointService.remove(queryWrapper); + activityChannelService.remove(queryWrapper); + activityCenterService.remove(queryWrapper); + activityCenterGoodsService.remove(queryWrapper); + //删除活动数量到费用申请 + costApplyService.flushAmtByAct(activity.getCostApplyId()); + return R.isTrue(result); + } + + /** + * 释放活动费用 + * @param id + * @return + */ + @PostMapping("/release/{id}") + @SysLog(module = SystemModule.Budget, title = "费用活动", biz = BizType.DELETE) + @PreAuthorize("hasRole('tbs:activity:release')") + public R release(@PathVariable("id") Long id){ + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + verificationService.release(id,sysUser.getCode(),true); + return R.ok(); + } + + /** + * 释放活动费用 + * @param id + * @return + */ + @Transactional + @PostMapping("/releaseByDev/{id}") + @SysLog(module = SystemModule.Budget, title = "费用活动", biz = BizType.DELETE) + @PreAuthorize("hasRole('tbs:activity:release')") + public R release2(@PathVariable("id") Long id){ + SysUser sysUser = new SysUser(); + sysUser.setName("系统执行"); + sysUser.setCode("0"); + sysUser.setId("0"); + TbsActivity activity = tbsActivityService.getById(id); + if( + activity.getActivityState().equals(TbsActivityState.STATE_4_Release) + && activity.getReleaseFlag().equals(0) + ){ + TbsCostApply costApply = tbsCostApplyService.getById(activity.getCostApplyId()); + verificationService.mainRelease(id,sysUser,activity,costApply,activity.getTotalAmount().subtract(activity.getUsedAmount())); + } + return R.ok(); + } + + /** + * 释放活动费用 + * @return + */ + @PostMapping("/compenstateRelease") + @SysLog(module = SystemModule.Budget, title = "费用活动", biz = BizType.DELETE) + public R release(){ + tbsActivityApplicationService.compenstateRelease(); + return R.ok(); + } + + /** + * 释放活动费用 + * @param id 活动ID + * @return + */ + @PostMapping("/cancelRelease/{id}") + @SysLog(module = SystemModule.Budget, title = "费用活动", biz = BizType.DELETE) + @PreAuthorize("hasRole('tbs:activity:release')") + public R cancelRelease(@PathVariable("id") Long id){ + verificationService.cancelRelease(id); + return R.ok(); + } + + /** + * 获取默认的成本中心 + * @param defaultCenterBo + * @return + */ + @PostMapping("/getDefaultCenter") + public R getDefaultCenter(@RequestBody TbsActivityDefaultCenterBo defaultCenterBo){ + return tbsCostApplyPart1Service.getDefaultCenter(defaultCenterBo); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController2.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController2.java new file mode 100644 index 0000000..71d3cb3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityController2.java @@ -0,0 +1,90 @@ +package com.qs.serve.modules.tbs.controller; + +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.dto.CommonIdsParam; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.enums.BizType; +import com.qs.serve.common.model.enums.SystemModule; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.vtb.service.VtbFundFlowService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +/** + * 预算 费用活动 + * @module 预算 + * @service 费用活动 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/activity") +public class TbsActivityController2 { + + private final VtbFundFlowService vtbFundFlowService; + private final TbsActivityService tbsActivityService; + private final TbsCostApplyPart1Service tbsCostApplyPart1Service; + + /** + * 批量查询活动详情 + * @param param + * @return + */ + @PostMapping("/getByIds") + public R> getByIds(@RequestBody CommonIdsParam param){ + List activityList = tbsActivityService.listByIds(param.getIds()); + for (TbsActivity activity : activityList) { + tbsCostApplyPart1Service.buildDetailVo(activity); + } + return R.ok(activityList); + } + + + /** + * 刷新活动相关金额 + * @param id + * @return + */ + @GetMapping("/flushAmount/{id}") + @SysLog(module = SystemModule.Budget, title = "费用活动", biz = BizType.DELETE) + public R flushActivityAmount(@PathVariable("id") Long id){ + Long[] ids = new Long[]{id}; + List errorIds = new ArrayList<>(); + for (Long aLong : ids) { + try { + vtbFundFlowService.flushActivityAmount(aLong); + } catch (Exception e) { + errorIds.add(aLong); + } + } + for (Long errorId : errorIds) { + System.out.println(errorId); + } + //vtbFundFlowService.flushActivityAmount(id); + return R.ok(); + } + + /** + * 刷新活动相关金额 + * @param id + * @return + */ + @GetMapping("/flushAmount2/{id}") + @SysLog(module = SystemModule.Budget, title = "费用活动", biz = BizType.DELETE) + public R flushActivityAmount2(@PathVariable("id") Long id){ +// Long[] ids = new Long[]{} +// for (Long aLong : ids) { +// tbsCostApplyPart1Service.updateAmtAndRateByActSubject(aLong); +// } + tbsCostApplyPart1Service.updateAmtAndRateByActSubject(id); + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityPayConditionController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityPayConditionController.java new file mode 100644 index 0000000..2812e6c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityPayConditionController.java @@ -0,0 +1,151 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.mapper.TbsActivityPayConditionMapper; +import com.qs.serve.modules.tbs.service.TbsActivityService; +import com.qs.serve.modules.tbs.service.TbsCostApplyService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tbs.entity.so.TbsActivityPayConditionSo; +import com.qs.serve.modules.tbs.entity.bo.TbsActivityPayConditionBo; +import com.qs.serve.modules.tbs.entity.TbsActivityPayCondition; +import com.qs.serve.modules.tbs.service.TbsActivityPayConditionService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 预算 活动支付条件 + * @author YenHex + * @since 2023-05-10 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/activityPayCondition") +public class TbsActivityPayConditionController { + + private TbsActivityPayConditionMapper tbsActivityPayConditionMapper; + private TbsActivityPayConditionService tbsActivityPayConditionService; + private TbsActivityService tbsActivityService; + private final TbsCostApplyService costApplyService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(TbsActivityPayConditionSo param){ + TbsActivityPayCondition entity = CopierUtil.copy(param,new TbsActivityPayCondition()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + List list = tbsActivityPayConditionService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(TbsActivityPayConditionSo param){ + TbsActivityPayCondition entity = CopierUtil.copy(param,new TbsActivityPayCondition()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + PageUtil.startPage(); + List list = tbsActivityPayConditionService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Budget, title = "活动支付条件", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + TbsActivityPayCondition tbsActivityPayCondition = tbsActivityPayConditionService.getById(id); + return R.ok(tbsActivityPayCondition); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.Budget, title = "活动支付条件", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid TbsActivityPayConditionBo param){ + TbsCostApply costApply = costApplyService.getById(param.getCostApplyId()); + if(!costApply.getChargeState().equals(TbsCostApplyState.State_0_unPublish.getCode()) + &&!costApply.getChargeState().equals(TbsCostApplyState.State_4_refused.getCode())){ + Assert.throwEx("因费用状态不支持编辑!!"); + } + TbsActivityPayCondition entity = CopierUtil.copy(param,new TbsActivityPayCondition()); + entity.setPreNotifyStatus(param.getPreNotifyTime()==null?0:1); + if(param.getPreNotifyTime()==null){ + tbsActivityPayConditionMapper.updateSetNotifyTimeNull(entity.getId()+""); + } + entity.setCostApplyId(null); + boolean result = tbsActivityPayConditionService.updateById(entity); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.Budget, title = "活动支付条件", biz = BizType.INSERT) + public R save(@RequestBody @Valid TbsActivityPayConditionBo param){ + TbsCostApply costApply = costApplyService.getById(param.getCostApplyId()); + if(!costApply.getChargeState().equals(TbsCostApplyState.State_0_unPublish.getCode()) + &&!costApply.getChargeState().equals(TbsCostApplyState.State_4_refused.getCode())){ + Assert.throwEx("因费用状态不支持编辑!!"); + } + TbsActivityPayCondition entity = CopierUtil.copy(param,new TbsActivityPayCondition()); + List activityList = tbsActivityService.listByCostApplyId(param.getCostApplyId()); + if(activityList.size()>0){ + Long actId = activityList.get(0).getId(); + entity.setActivityId(actId); + }else { + // 临时状态 + entity.setActivityId(0L); + } + entity.setPreNotifyStatus(param.getPreNotifyTime()==null?0:1); + entity.setCode(CodeGenUtil.getDataCode(CodeGenUtil.SourceDataKey.ActivityPayCondition)); + boolean result = tbsActivityPayConditionService.save(entity); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.Budget, title = "活动支付条件", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = tbsActivityPayConditionService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivitySlottingFeeController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivitySlottingFeeController.java new file mode 100644 index 0000000..aee0644 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivitySlottingFeeController.java @@ -0,0 +1,130 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.service.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 预算 活动进场费 + * @author YenHex + * @since 2023-06-26 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/activitySlottingFee") +public class TbsActivitySlottingFeeController { + + private TbsActivitySlottingFeeService tbsActivitySlottingFeeService; + private TbsActivityChannelPointService channelPointService; + private TbsActivityChannelService channelService; + private TbsActivityGoodsService activityGoodsService; + private TbsCostApplyService costApplyService; + + /** + * 列表 + * @param param + * @return + */ + //@GetMapping("/list") + public R> getList(TbsActivitySlottingFee param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = tbsActivitySlottingFeeService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(TbsActivitySlottingFee param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + lqw.eq(TbsActivitySlottingFee::getPassFlag,1); + List list = tbsActivitySlottingFeeService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page2") + public R> getPage2(TbsActivitySlottingFee param) { + TbsCostApply costApply = costApplyService.getById(param.getCostApplyId()); + if (!costApply.getContractFlag().equals(2)) { + log.warn("非进场费请求当前接口,申请id:{}", param.getCostApplyId()); + return R.byEmptyList(); + } + //查询费用申请所有的网点和商品 + QueryWrapper qw = new QueryWrapper(); + qw.eq("cost_apply_id", param.getCostApplyId()); + List goodsList = activityGoodsService.list(qw); + List channelList = channelService.list(qw); + List pointList = channelPointService.list(qw); + List goodsIds = goodsList.stream().map(TbsActivityGoods::getTargetId).distinct().collect(Collectors.toList()); + List channelIds = channelList.stream().map(TbsActivityChannel::getChannelId).distinct().collect(Collectors.toList()); + List pointIds = pointList.stream().map(TbsActivityChannelPoint::getPointId).distinct().collect(Collectors.toList()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.like(StringUtils.hasText(param.getTargetName()),TbsActivitySlottingFee::getTargetName,param.getTargetName()); + lqw.like(StringUtils.hasText(param.getTargetCode()),TbsActivitySlottingFee::getTargetCode,param.getTargetCode()); + lqw.like(StringUtils.hasText(param.getChannelName()),TbsActivitySlottingFee::getChannelName,param.getChannelName()); + lqw.like(StringUtils.hasText(param.getChannelCode()),TbsActivitySlottingFee::getChannelCode,param.getChannelCode()); + lqw.like(StringUtils.hasText(param.getPointName()),TbsActivitySlottingFee::getPointName,param.getPointName()); + lqw.like(StringUtils.hasText(param.getPointCode()),TbsActivitySlottingFee::getPointCode,param.getPointCode()); + if (goodsIds.size() > 0) { + lqw.in(TbsActivitySlottingFee::getTargetId, goodsIds); + lqw.eq(TbsActivitySlottingFee::getTargetType, "spu"); + } + if (channelIds.size() > 0) { + lqw.in(TbsActivitySlottingFee::getChannelId, channelIds); + } + if (pointIds.size() > 0) { + lqw.in(TbsActivitySlottingFee::getPointId, pointIds); + } + if(goodsIds.size()==0 && channelIds.size()==0 && pointIds.size()==0){ + //防止查其他数据 + lqw.eq(TbsActivitySlottingFee::getId,"0"); + } + lqw.eq(TbsActivitySlottingFee::getPassFlag,1); + PageUtil.startPage(); + List list = tbsActivitySlottingFeeService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + TbsActivitySlottingFee tbsActivitySlottingFee = tbsActivitySlottingFeeService.getById(id); + return R.ok(tbsActivitySlottingFee); + } + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivitySubjectYarnController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivitySubjectYarnController.java new file mode 100644 index 0000000..ba1ba81 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivitySubjectYarnController.java @@ -0,0 +1,75 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tbs.entity.TbsActivitySubjectYarn; +import com.qs.serve.modules.tbs.service.TbsActivitySubjectYarnService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 预算 活动科目审批线 + * @author YenHex + * @since 2023-08-03 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/activitySubjectYarn") +public class TbsActivitySubjectYarnController { + + private TbsActivitySubjectYarnService tbsActivitySubjectYarnService; + + /** + * 列表 + * @param id + * @return + */ + @GetMapping("/list") + public R> getList(Long id){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivitySubjectYarn::getCostApplyId,id); + List list = tbsActivitySubjectYarnService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(TbsActivitySubjectYarn param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = tbsActivitySubjectYarnService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Budget, title = "活动科目审批线", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + TbsActivitySubjectYarn tbsActivitySubjectYarn = tbsActivitySubjectYarnService.getById(id); + return R.ok(tbsActivitySubjectYarn); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityTemplateController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityTemplateController.java new file mode 100644 index 0000000..02cf931 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityTemplateController.java @@ -0,0 +1,332 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsRegionUserService; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplateLog; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplateRegion; +import com.qs.serve.modules.tbs.service.TbsActivityTemplateLogService; +import com.qs.serve.modules.tbs.service.TbsActivityTemplateRegionService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tbs.entity.so.TbsActivityTemplateSo; +import com.qs.serve.modules.tbs.entity.bo.TbsActivityTemplateBo; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplate; +import com.qs.serve.modules.tbs.service.TbsActivityTemplateService; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 预算 活动模板 + * @author YenHex + * @since 2022-11-29 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/activityTemplate") +public class TbsActivityTemplateController { + + private TbsActivityTemplateService tbsActivityTemplateService; + private TbsActivityTemplateRegionService tbsActivityTemplateRegionService; + private BmsRegionUserService bmsRegionUserService; + private final TbsActivityTemplateLogService activityTemplateLogService; + private BmsSupplierService bmsSupplierService; + + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + @PreAuthorize("hasRole('tbs:activityTemplate:query')") + public R> getList(TbsActivityTemplateSo param){ + TbsActivityTemplate entity = CopierUtil.copy(param,new TbsActivityTemplate()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + lqw.orderByDesc(TbsActivityTemplate::getTemplateState); + PageUtil.startPage(); + List list = tbsActivityTemplateService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('tbs:activityTemplate:query')") + public R> getPage(TbsActivityTemplateSo param){ + TbsActivityTemplate entity = CopierUtil.copy(param,new TbsActivityTemplate()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + lqw.orderByDesc(TbsActivityTemplate::getId); + PageUtil.startPage(); + List list = tbsActivityTemplateService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Budget, title = "活动模板", biz = BizType.QUERY) + @PreAuthorize("hasRole('tbs:activityTemplate:query')") + public R getById(@PathVariable("id") String id){ + TbsActivityTemplate tbsActivityTemplate = tbsActivityTemplateService.getById(id); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivityTemplateRegion::getTemplateId,tbsActivityTemplate.getId()); + List templateRegionList = tbsActivityTemplateRegionService.list(lqw); + Map> templateRegionListMap = templateRegionList.stream().collect(Collectors.groupingBy(TbsActivityTemplateRegion::getType)); + tbsActivityTemplate.setSaleRegionList(templateRegionListMap.get("sale")); + tbsActivityTemplate.setBizRegionList(templateRegionListMap.get("biz")); + return R.ok(tbsActivityTemplate); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.Budget, title = "活动模板", biz = BizType.UPDATE) + @PreAuthorize("hasRole('tbs:activityTemplate:update')") + public R updateById(@RequestBody TbsActivityTemplateBo param){ + if(param.getId()==null){ + return R.error("id is null"); + } + TbsActivityTemplate template = tbsActivityTemplateService.modify(param); + return R.ok(template); + } + + /** + * 更新状态 + * @param param + * @return + */ + @PostMapping("/updateState") + @SysLog(module = SystemModule.Budget, title = "活动模板", biz = BizType.UPDATE) + @PreAuthorize("hasRole('tbs:activityTemplate:update')") + public R updateState(@RequestBody TbsActivityTemplateBo param){ + if(param.getId()==null){ + return R.error("id is null"); + } + TbsActivityTemplate template = tbsActivityTemplateService.getById(param.getId()); + template.setTemplateState(param.getTemplateState()); + tbsActivityTemplateService.updateById(template); + TbsActivityTemplateLog templateLog = activityTemplateLogService.toLog(template,param.getTemplateState()); + activityTemplateLogService.save(templateLog); + return R.ok(template); + } + + /** + * 更新状态 + * @return + */ + @PostMapping("/updateState2") + @SysLog(module = SystemModule.Budget, title = "活动模板", biz = BizType.UPDATE) + @PreAuthorize("hasRole('tbs:activityTemplate:update')") + public R updateState(){ + tbsActivityTemplateService.updateState(); + return R.ok(); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.Budget, title = "活动模板", biz = BizType.INSERT) + @PreAuthorize("hasRole('tbs:activityTemplate:insert')") + public R save(@RequestBody TbsActivityTemplateBo param){ + if(param.getId()!=null){ + return R.error("id is not null"); + } + TbsActivityTemplate template = tbsActivityTemplateService.modify(param); + return R.ok(template); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.Budget, title = "活动模板", biz = BizType.DELETE) + @PreAuthorize("hasRole('tbs:activityTemplate:delete')") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + //校验是否可删除 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(TbsActivityTemplateRegion::getTemplateId,idsLong); + if(tbsActivityTemplateRegionService.count(lqw)>0){ + return R.error("部分模板被使用无法删除"); + } + List tmps = tbsActivityTemplateService.listByIds(idsLong); + if(CollectionUtil.isNotEmpty(tmps)){ + for (TbsActivityTemplate template : tmps) { + TbsActivityTemplateLog templateLog = activityTemplateLogService.toLog(template,2); + activityTemplateLogService.save(templateLog); + } + } + boolean result = tbsActivityTemplateService.removeByIds(idsLong); + return R.isTrue(result); + } + + /** + * 通过供应商获取模板列表 + * @param id + * @return + */ + @GetMapping("/listBySupplier/{id}") + public R> listBySupplier(@PathVariable("id") String id){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivityTemplate::getBizRegionFlag,0).or().eq(TbsActivityTemplate::getSaleRegionFlag,0); + List activityTemplateList = tbsActivityTemplateService.list(lqw); + List tmpIds = activityTemplateList.stream().map(TbsActivityTemplate::getId).collect(Collectors.toList()); + List templateRegions = tbsActivityTemplateRegionService.getTemplateIds(id,tmpIds); + List templateIds = templateRegions.stream().map(TbsActivityTemplateRegion::getTemplateId) + .distinct().collect(Collectors.toList()); + if(CollectionUtil.isEmpty(templateIds)){ + return R.ok(); + } + List templates = tbsActivityTemplateService.listByIds(templateIds); + templates.addAll(activityTemplateList); + return R.ok(templates); + } + + /** + * 获取当前用户的模板列表 LIST + * @return + */ + @GetMapping("/listMyTemplate") + public R> listMyTemplate(String templateName,Integer contractFlag){ + LambdaQueryWrapper tmpLqw = buildMyTempQueryWrapper(templateName); + if(contractFlag!=null){ + tmpLqw.eq(TbsActivityTemplate::getContractFlag,contractFlag); + } + PageUtil.startPage(); + List templates = tbsActivityTemplateService.list(tmpLqw); + return R.byPageHelperList(templates); + } + + /** + * 获取当前用户的模板统计 COUNT + * @return + */ + @GetMapping("/countMyTemplate") + public R countMyTemplate(String templateName){ + LambdaQueryWrapper tmpLqw = buildMyTempQueryWrapper(templateName); + Long count = tbsActivityTemplateService.count(tmpLqw); + return R.ok(count); + } + + private List getSaleRegionIds(List list){ + List regionIds = list.stream() + .filter(sup -> sup.getRegionLast() != null && !sup.getRegionLast().equals("0")) + .map(BmsSupplier::getRegionLast).collect(Collectors.toList()); + regionIds.addAll(list.stream() + .filter(sup -> sup.getRegionFirst() != null && !sup.getRegionFirst().equals("0")) + .map(BmsSupplier::getRegionFirst).collect(Collectors.toList())); + regionIds.addAll(list.stream() + .filter(sup -> sup.getRegionSecond() != null && !sup.getRegionSecond().equals("0")) + .map(BmsSupplier::getRegionSecond).collect(Collectors.toList())); + regionIds.addAll(list.stream() + .filter(sup -> sup.getRegionThird() != null && !sup.getRegionThird().equals("0")) + .map(BmsSupplier::getRegionThird).collect(Collectors.toList())); + regionIds.addAll(list.stream() + .filter(sup -> sup.getRegionFourthly() != null && !sup.getRegionFourthly().equals("0")) + .map(BmsSupplier::getRegionFourthly).collect(Collectors.toList())); + return regionIds; + } + + private List getBizRegionIds(List list){ + List regionIds = list.stream() + .filter(sup->sup.getRegion2Last()!=null&&!sup.getRegion2Last().equals("0")) + .map(BmsSupplier::getRegion2Last).collect(Collectors.toList()); + regionIds.addAll(list.stream() + .filter(sup -> sup.getRegion2First() != null && !sup.getRegion2First().equals("0")) + .map(BmsSupplier::getRegion2First).collect(Collectors.toList())); + regionIds.addAll(list.stream() + .filter(sup -> sup.getRegion2Second() != null && !sup.getRegion2Second().equals("0")) + .map(BmsSupplier::getRegion2Second).collect(Collectors.toList())); + regionIds.addAll(list.stream() + .filter(sup -> sup.getRegion2Third() != null && !sup.getRegion2Third().equals("0")) + .map(BmsSupplier::getRegion2Third).collect(Collectors.toList())); + regionIds.addAll(list.stream() + .filter(sup -> sup.getRegion2Fourthly() != null && !sup.getRegion2Fourthly().equals("0")) + .map(BmsSupplier::getRegion2Fourthly).collect(Collectors.toList())); + return regionIds; + } + + @NotNull + private LambdaQueryWrapper buildMyTempQueryWrapper(String templateName) { + String userId = AuthContextUtils.getSysUserId(); + BmsSupplier param = new BmsSupplier(); + param.setCurrUserId(userId); + param.setCooperatePauseFlag(0); + param.setStopFlag(0); + List supplierList = bmsSupplierService.selectSupplierList(param); + + List saleRegionIds = getSaleRegionIds(supplierList); + List bizRegionIds = getBizRegionIds(supplierList); + + LambdaQueryWrapper tempLqw = new LambdaQueryWrapper<>(); + if(CollectionUtil.isNotEmpty(saleRegionIds)){ + tempLqw.or(con->{ + con.eq(TbsActivityTemplateRegion::getType,"sale"); + con.in(TbsActivityTemplateRegion::getRegionId,saleRegionIds); + }); + } + if(CollectionUtil.isNotEmpty(bizRegionIds)){ + tempLqw.or(con->{ + con.eq(TbsActivityTemplateRegion::getType,"biz"); + con.in(TbsActivityTemplateRegion::getRegionId,bizRegionIds); + }); + } + + List templateRegions = null; + if(CollectionUtil.isNotEmpty(saleRegionIds)||CollectionUtil.isNotEmpty(bizRegionIds)){ + templateRegions = tbsActivityTemplateRegionService.list(tempLqw); + } + List templateIds = templateRegions!=null&&templateRegions.size()>0?templateRegions.stream() + .map(TbsActivityTemplateRegion::getTemplateId).distinct().collect(Collectors.toList()):new ArrayList<>(); + templateIds.add(0L); + LambdaQueryWrapper tmpLqw = new LambdaQueryWrapper<>(); + tmpLqw.eq(TbsActivityTemplate::getTemplateState,1); + List finalTemplateRegions = templateRegions; + tmpLqw.and(a->{ + a.or(b->b.eq(TbsActivityTemplate::getSaleRegionFlag,0)); + a.or(b->b.eq(TbsActivityTemplate::getBizRegionFlag,0)); + if(CollectionUtil.isNotEmpty(finalTemplateRegions)){ + a.or(b->b.in(TbsActivityTemplate::getId,templateIds)); + } + }); + if(StringUtils.hasText(templateName)){ + tmpLqw.like(TbsActivityTemplate::getTemplateName, templateName); + } + return tmpLqw; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityTemplateLogController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityTemplateLogController.java new file mode 100644 index 0000000..debd16f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsActivityTemplateLogController.java @@ -0,0 +1,93 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tbs.entity.so.TbsActivityTemplateLogSo; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplateLog; +import com.qs.serve.modules.tbs.service.TbsActivityTemplateLogService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 预算 活动模板日志 + * @author YenHex + * @since 2023-01-05 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/activityTemplateLog") +public class TbsActivityTemplateLogController { + + private TbsActivityTemplateLogService tbsActivityTemplateLogService; + + /** + * 列表 + * @param param + * @return + */ + //@GetMapping("/list") + @PreAuthorize("hasRole('tbs:activityTemplateLog:query')") + public R> getList(TbsActivityTemplateLogSo param){ + TbsActivityTemplateLog entity = CopierUtil.copy(param,new TbsActivityTemplateLog()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + PageUtil.startPage(); + List list = tbsActivityTemplateLogService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(TbsActivityTemplateLogSo param){ + TbsActivityTemplateLog entity = CopierUtil.copy(param,new TbsActivityTemplateLog()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + lqw.orderByDesc(TbsActivityTemplateLog::getCreateTime); + PageUtil.startPage(); + List list = tbsActivityTemplateLogService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Budget, title = "活动模板", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + TbsActivityTemplateLog tbsActivityTemplateLog = tbsActivityTemplateLogService.getById(id); + return R.ok(tbsActivityTemplateLog); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.Budget, title = "活动模板", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = tbsActivityTemplateLogService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetBatchController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetBatchController.java new file mode 100644 index 0000000..576e77a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetBatchController.java @@ -0,0 +1,201 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.annotation.LimitSubmit; +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.CollectionUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.seeyon.entity.bo.CtpAddNodeParam; +import com.qs.serve.modules.sys.entity.SysAttach; +import com.qs.serve.modules.sys.service.SysAttachService; +import com.qs.serve.modules.tbs.common.consts.ChangeTypeEnum; +import com.qs.serve.modules.tbs.entity.TbsBudgetBatchItem; +import com.qs.serve.modules.tbs.entity.TbsBudgetChange; +import com.qs.serve.modules.tbs.entity.TbsBudgetChangeScheduleItem; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.entity.bo.TbsBudgetBatchBo; +import com.qs.serve.modules.tbs.entity.vo.CtpAffairVo; +import com.qs.serve.modules.tbs.service.TbsBudgetBatchItemService; +import com.qs.serve.modules.tbs.service.TbsBudgetChangeService; +import com.qs.serve.modules.tbs.service.impl.TbsBudgetBatchOperationServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tbs.entity.TbsBudgetBatch; +import com.qs.serve.modules.tbs.service.TbsBudgetBatchService; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; + +/** + * 预算 批量申请 + * @author YenHex + * @since 2023-08-24 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/budgetBatch") +public class TbsBudgetBatchController { + + private TbsBudgetBatchService tbsBudgetBatchService; + private TbsBudgetBatchOperationServiceImpl budgetBatchOperationService; + private final TbsBudgetBatchItemService budgetBatchItemService; + private final TbsBudgetChangeService tbsBudgetChangeService; + private final SysAttachService sysAttachService; + + + /** + * 提交审批-预算批量申请 + * @param param + * @return + */ + @PostMapping("/commit") + @SysLog(module = SystemModule.Budget, title = "批量申请", biz = BizType.INSERT) + public R commit(@RequestBody @Valid TbsBudgetBatchBo param){ + Object result = tbsBudgetBatchService.commit(param); + return R.ok(result); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(TbsBudgetBatch param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = tbsBudgetBatchService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Budget, title = "批量申请", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + TbsBudgetBatch budgetBatch = tbsBudgetBatchService.getById(id); + List budgetBatchItemList = budgetBatchItemService.listByBatchId(budgetBatch.getId()); + List changeList = new ArrayList<>(); + for (TbsBudgetBatchItem batchItem : budgetBatchItemList) { + if(batchItem.getChangeId()!=null){ + TbsBudgetChange budgetChange = tbsBudgetChangeService.getDetailById(batchItem.getChangeId().toString(), + ChangeTypeEnum.batchChange); + changeList.add(budgetChange); + }else { + TbsBudgetChange budgetChange = tbsBudgetChangeService.getDetailByBudgetId(batchItem.getBudgetId().toString(), + ChangeTypeEnum.batchApply); + changeList.add(budgetChange); + } + } + + for (TbsBudgetChange change : changeList) { + if(change.getNewBudgetTitle()!=null&&!change.getNewBudgetTitle().equals(change.getBudgetTitle())){ + List items = (List)change.getChangeScheduleItemList(); + if(items==null){ + items = new ArrayList<>(); + } + if(CollectionUtil.isEmpty(items)){ + TbsBudgetChangeScheduleItem changeTitle = new TbsBudgetChangeScheduleItem(); + items.add(changeTitle); + } + change.setChangeScheduleItemList(items); + } + } + + budgetBatch.setChangeList(changeList); + List attachList = sysAttachService.listByIdArrs(budgetBatch.getAttachIds()); + budgetBatch.setAttachList(attachList); + return R.ok(budgetBatch); + } + + + /** + * 审批结果-预算批量申请 + * @param batchId + * @return + */ + @GetMapping("/ListAffairs") + public R> ListBudgetAffairs(String batchId){ + TbsBudgetBatch budgetBatch = tbsBudgetBatchService.getById(batchId); + return budgetBatchOperationService.pageAffairV2(batchId,budgetBatch.getBatchCode()); + } + + + /** + * 提交审批节点-预算批量申请 + * @return + */ + @LimitSubmit + @PostMapping("/commitAffair") + @SysLog(module = SystemModule.Budget, title = "预算申请", biz = BizType.OTHER) + public R commitAffair(@RequestBody @Valid TbsAffairCommitBo affairCommit){ + return budgetBatchOperationService.commitAffair(affairCommit); + } + + /** + * 加签-预算批量申请 + * @param param + * @return + */ + @LimitSubmit + @PostMapping("/addNode") + @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.OTHER) + public R addNode(@RequestBody CtpAddNodeParam param){ + return budgetBatchOperationService.addNode(param); + } + + /** + * 个人未完成审批统计-预算批量申请 + * @return + */ + @PostMapping("/getUnfinished") + public R getUnfinished(){ + return budgetBatchOperationService.getUnfinished(); + } + + + /** + * 个人未完成审批统计-预算批量申请 + * @return + */ + @PostMapping("/compensate/{code}") + public R compensate(@PathVariable("code") String code){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsBudgetBatch::getBatchCode,code); + TbsBudgetBatch budgetBatch = tbsBudgetBatchService.getOne(lqw); + budgetBatchOperationService.runCompensate(budgetBatch.getId().toString()); + return R.ok(); + } + + /** + * test + * @return + */ + //@PostMapping("/ok1/{code}") + @SysLog(module = SystemModule.Budget, title = "补充调用", biz = BizType.OTHER) + public R compensate2(@PathVariable("code") String code){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsBudgetBatch::getBatchCode,code); + TbsBudgetBatch budgetBatch = tbsBudgetBatchService.getOne(lqw); + TbsAffairCommitBo param = new TbsAffairCommitBo(); + param.setTargetId(budgetBatch.getId().toString()); + budgetBatchOperationService.doFinished(param); + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetChangeController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetChangeController.java new file mode 100644 index 0000000..d47b002 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetChangeController.java @@ -0,0 +1,141 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.framework.manager.AsyncManager; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.sync.AsyncFactory; +import com.qs.serve.modules.sys.service.SysAttachService; +import com.qs.serve.modules.tbs.common.TbsCommonCheckState; +import com.qs.serve.modules.tbs.common.dto.TbsBudgetChangeVo; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.entity.so.TbsBudgetChangeSo; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.tbs.service.impl.TbsBudgetChangeOperationServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 预算 预算更变记录 + * @author YenHex + * @since 2023-08-09 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/budgetChange") +public class TbsBudgetChangeController { + + private SysAttachService sysAttachService; + private TbsBudgetChangeService tbsBudgetChangeService; + private TbsBudgetChangeScheduleItemService tbsBudgetChangeScheduleItemService; + private TbsBudgetChangeConditionService tbsBudgetChangeConditionService; + private TbsBudgetService tbsBudgetService; + private TbsScheduleItemBudgetService tbsScheduleItemBudgetService; + private TbsBudgetConditionService tbsBudgetConditionService; + + + /** + * 测试 + * @param param + * @return + */ + @PostMapping("/testChangeAmt") + public R testChangeAmt(@RequestBody TbsAffairCommitBo param){ + TbsBudgetChangeOperationServiceImpl impl = SpringUtils.getBean(TbsBudgetChangeOperationServiceImpl.class); + impl.doFinished(param); + return R.ok(); + } + + /** + * 预算审批整合翻页 + * @param query + * @return + */ + @GetMapping("/comboPage") + public R> selectComboPage(TbsBudgetChangeSo query){ + Long count = tbsBudgetChangeService.countChangeVo(query); + PageVo pageVo = new PageVo<>(); + pageVo.initPageByTotal(count); + if(count>0){ + List list = tbsBudgetChangeService.selectChangeVoList(query); + pageVo.setList(list); + } + return R.ok(pageVo); + } + + /** + * changeId查询 + * @param id + * @return + */ + @GetMapping("/{id}") + public R getList(@PathVariable("id")String id ){ + TbsBudgetChange budgetChange = tbsBudgetChangeService.getDetailById(id, null); + if (budgetChange.getBudgetCheckState().equals(TbsCommonCheckState.State_1_apply)){ + AsyncManager.me().execute(AsyncFactory.submitBudgetChange(budgetChange.getId()+"")); + } + return R.ok(budgetChange); + } + + /** + * budgetId查询 + * @param id + * @return + */ + @GetMapping("/apply/{id}") + public R getApplyBudget(@PathVariable("id")String id ){ + TbsBudgetChange budgetChange = tbsBudgetChangeService.getDetailByBudgetId(id, null); + if (budgetChange.getBudgetCheckState().equals(TbsCommonCheckState.State_1_apply)){ + AsyncManager.me().execute(AsyncFactory.submitBudgetApply(id)); + } + return R.ok(budgetChange); + } + + /** + * 列表 + * @param param + * @return + */ + //@GetMapping("/list") + public R> getList(TbsBudgetChange param){ + if(param.getBudgetId()==null){ + return R.error("BudgetId不能为空"); + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = tbsBudgetChangeService.list(lqw); + for (TbsBudgetChange budgetChange : list) { + List changeScheduleItemList = tbsBudgetChangeScheduleItemService.listByChangeId(budgetChange.getId()); + List changeConditionList = tbsBudgetChangeConditionService.listByChangeId(budgetChange.getId()); + budgetChange.setChangeScheduleItemList(changeScheduleItemList); + budgetChange.setChangeConditionList(changeConditionList); + } + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + //@GetMapping("/page") + public R> getPage(TbsBudgetChange param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = tbsBudgetChangeService.list(lqw); + for (TbsBudgetChange budgetChange : list) { + List changeScheduleItemList = tbsBudgetChangeScheduleItemService.listByChangeId(budgetChange.getId()); + List changeConditionList = tbsBudgetChangeConditionService.listByChangeId(budgetChange.getId()); + budgetChange.setChangeScheduleItemList(changeScheduleItemList); + budgetChange.setChangeConditionList(changeConditionList); + } + return R.byPageHelperList(list); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetCheckController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetCheckController.java new file mode 100644 index 0000000..359a075 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetCheckController.java @@ -0,0 +1,207 @@ +package com.qs.serve.modules.tbs.controller; + +import com.qs.serve.common.model.annotation.LimitSubmit; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.enums.BizType; +import com.qs.serve.common.model.enums.SystemModule; +import com.qs.serve.modules.seeyon.entity.bo.CtpAddNodeParam; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.entity.TbsBudgetChange; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.entity.bo.TbsBudgetUpdateAfterStartBo; +import com.qs.serve.modules.tbs.entity.vo.CtpAffairVo; +import com.qs.serve.modules.tbs.service.TbsBudgetChangeService; +import com.qs.serve.modules.tbs.service.TbsBudgetService; +import com.qs.serve.modules.tbs.service.impl.TbsBudgetApplyOperationServiceImpl; +import com.qs.serve.modules.tbs.service.impl.TbsBudgetBatchOperationServiceImpl; +import com.qs.serve.modules.tbs.service.impl.TbsBudgetChangeOperationServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * 预算 预算审批 + * @author YenHex + * @since 2023/8/8 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/budgetCheck") +public class TbsBudgetCheckController { + + private final TbsBudgetService tbsBudgetService; + private final TbsBudgetChangeService tbsBudgetChangeService; + private final TbsBudgetApplyOperationServiceImpl tbsBudgetApplyOperationService; + private final TbsBudgetChangeOperationServiceImpl tbsBudgetChangeOperationService; + private final TbsBudgetBatchOperationServiceImpl tbsBudgetBatchOperationService; + + + //直达通过审批 + //@PostMapping("dev/{budgetId}") + public R dev(@PathVariable("budgetId") Long id){ + tbsBudgetApplyOperationService.doFinished(new TbsAffairCommitBo(id+"")); + return R.ok(); + } + + /** + * 提交申请 + * @return + */ + @PostMapping("commitApply/{budgetId}") + public R commitApply(@PathVariable("budgetId") Long id){ + tbsBudgetService.commitApply(id); + return R.ok(); + } + + /** + * 补偿申请单子 + * @param budgetId + * @return + */ + @PostMapping("runApplyCompensate/{budgetId}") + public R runCompensate(@PathVariable("budgetId") Long budgetId){ + TbsBudget budget = tbsBudgetService.getById(budgetId); + if(budget.getBatchApplyId()!=null){ + tbsBudgetBatchOperationService.runCompensate(budget.getBatchApplyId()+""); + }else { + tbsBudgetApplyOperationService.runCompensate(budgetId+""); + } + return R.ok(); + } + + /** + * 补偿修改单子 + * @param changeId + * @return + */ + @PostMapping("runChangeCompensate/{changeId}") + public R runChangeCompensate(@PathVariable("changeId") Long changeId){ + TbsBudgetChange change = tbsBudgetChangeService.getById(changeId); + //如果时批量的申请,调用批量补偿 + if(change.getBatchApplyId()!=null){ + tbsBudgetBatchOperationService.runCompensate(change.getBatchApplyId()+""); + }else { + tbsBudgetChangeOperationService.runCompensate(changeId+""); + } + return R.ok(); + } + + + /** + * 补偿批量单子 + * @param batchId + * @return + */ + @PostMapping("runBatchCompensate/{batchId}") + public R runBatchCompensate(@PathVariable("batchId") Long batchId){ + tbsBudgetBatchOperationService.runCompensate(batchId+""); + return R.ok(); + } + + /** + * 提交更新申请 + * @param param + * @return + */ + @PostMapping("commitChangeApply") + public R commitApply(@RequestBody TbsBudgetUpdateAfterStartBo param){ + TbsBudgetChange budgetChange = tbsBudgetChangeService.commitApply(param); + return R.ok(budgetChange); + } + + /** + * 审批结果-预算申请 + * @param budgetId + * @return + */ + @GetMapping("/ListAffairs") + public R> ListBudgetAffairs(String budgetId){ + TbsBudget tbsBudget = tbsBudgetService.getById(budgetId); + return tbsBudgetApplyOperationService.pageAffairV2(budgetId,tbsBudget.getBudgetNumber()); + } + + + /** + * 审批结果-修改预算申请 + * @param changeId + * @return + */ + @GetMapping("/ListChangeAffairs") + public R> pageAffair(String changeId){ + TbsBudgetChange budgetChange = tbsBudgetChangeService.getById(changeId); + return tbsBudgetChangeOperationService.pageAffairV2(changeId,budgetChange.getChangeCode()); + } + + /** + * 提交审批节点-预算申请 + * @return + */ + @LimitSubmit + @PostMapping("/commitAffair") + @SysLog(module = SystemModule.Budget, title = "预算申请", biz = BizType.OTHER) + public R commitAffair(@RequestBody @Valid TbsAffairCommitBo affairCommit){ + return tbsBudgetApplyOperationService.commitAffair(affairCommit); + } + + /** + * 提交审批节点-修改预算申请 + * @return + */ + @LimitSubmit + @PostMapping("/commitChangeAffair") + @SysLog(module = SystemModule.Budget, title = "修改预算申请", biz = BizType.OTHER) + public R commitChangeAffair(@RequestBody @Valid TbsAffairCommitBo affairCommit){ + return tbsBudgetChangeOperationService.commitAffair(affairCommit); + } + + /** + * 加签-预算申请 + * @param param + * @return + */ + @LimitSubmit + @PostMapping("/addNode") + @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.OTHER) + public R addNode(@RequestBody CtpAddNodeParam param){ + return tbsBudgetApplyOperationService.addNode(param); + } + + + /** + * 加签-修改预算申请 + * @param param + * @return + */ + @LimitSubmit + @PostMapping("/addChangeNode") + @SysLog(module = SystemModule.Budget, title = "修改预算申请", biz = BizType.OTHER) + public R addChangeNode(@RequestBody CtpAddNodeParam param){ + return tbsBudgetChangeOperationService.addNode(param); + } + + /** + * 个人未完成审批统计-预算申请 + * @return + */ + @PostMapping("/getUnfinished") + public R getUnfinished(){ + return tbsBudgetApplyOperationService.getUnfinished(); + } + + + /** + * 个人未完成审批统计-修改预算申请 + * @return + */ + @PostMapping("/getChangeUnfinished") + public R getChangeUnfinished(){ + return tbsBudgetChangeOperationService.getUnfinished(); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetController.java new file mode 100644 index 0000000..238269e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetController.java @@ -0,0 +1,550 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +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.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsCommonCheckState; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.bo.*; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetLogWithAmount; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetVo; +import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; +import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudgetMapper; +import com.qs.serve.modules.tbs.service.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tbs.entity.so.TbsBudgetSo; + +import javax.validation.Valid; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 预算 预算 + * @author YenHex + * @since 2022-11-12 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/budget") +public class TbsBudgetController { + + private final TbsBudgetService tbsBudgetService; + private final TbsBudgetMapper tbsBudgetMapper; + private final TbsBudgetCostItemService tbsBudgetCostItemService; + private final TbsBudgetLogService tbsBudgetLogService; + private final TbsScheduleItemBudgetService tbsScheduleItemBudgetService; + private final TbsBudgetConditionService tbsBudgetConditionService; + private final TbsScheduleItemBudgetMapper tbsScheduleItemBudgetMapper; + private final TbsScheduleItemService tbsScheduleItemService; + private final SysUserService sysUserService; + + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + @PreAuthorize("hasRole('tbs:budget:query')") + public R> getList(TbsBudgetSo param){ + List budgetIds = tbsBudgetMapper.selectBudgetId(param); + if(budgetIds.size()>0){ + List list = tbsBudgetService.listByIds(budgetIds); + return R.ok(list); + } + return R.ok(); + } + + /** + * 导出 + * @param param + * @return + */ + @PostMapping("/list4Export") + @PreAuthorize("hasRole('tbs:budget:query')") + public R> list4Export(@RequestBody TbsBudgetSo param){ + List budgetIds = tbsBudgetMapper.selectBudgetId(param); + if(budgetIds.size()>0){ + List list = tbsBudgetService.listByIds(budgetIds); + if(list.size()>120){ + Assert.throwEx("请添加查询条件,服务无法大批量导出数据,最大120行"); + } + for (TbsBudget budget : list) { + List conditionList = tbsBudgetConditionService + .list(new LambdaQueryWrapper() + .eq(TbsBudgetCondition::getBudgetId, budget.getId())); + List scheduleItemBudgetList = tbsScheduleItemBudgetService + .list(new LambdaQueryWrapper() + .eq(TbsScheduleItemBudget::getBudgetId, budget.getId())); + List scheduleItemBudgetIds = scheduleItemBudgetList.stream() + .map(TbsScheduleItemBudget::getId).collect(Collectors.toList()); + //实际发布预算 + List budgetLogWithAmountList = tbsScheduleItemBudgetMapper.getSumAmtInList(scheduleItemBudgetIds, Arrays.asList(0,2,3)); + for (TbsScheduleItemBudget itemBudget : scheduleItemBudgetList) { + for (TbsBudgetLogWithAmount withAmount : budgetLogWithAmountList) { + if (itemBudget.getId().equals(withAmount.getId())){ + itemBudget.setBudgetAmount(withAmount.getAmt()); + break; + } + } + } + //已用的预算 + List budgetLogWithUsedAmountList = tbsScheduleItemBudgetMapper.getSumAmtNotInList(scheduleItemBudgetIds, Arrays.asList(0,2,3)); + for (TbsScheduleItemBudget itemBudget : scheduleItemBudgetList) { + for (TbsBudgetLogWithAmount withAmount : budgetLogWithUsedAmountList) { + if (itemBudget.getId().equals(withAmount.getId())){ + itemBudget.setUsedBudgetAmount(withAmount.getAmt()); + break; + } + } + } + budget.setBudgetConditionList(conditionList); + Map> map = conditionList.stream().collect(Collectors.groupingBy(TbsBudgetCondition::getTargetType)); + budget.setBrandConditions(map.get(TbsGoodsType.brand.name())); + budget.setCategoryConditions(map.get(TbsGoodsType.category.name())); + budget.setSeriesConditions(map.get(TbsGoodsType.series.name())); + budget.setSkuConditions(map.get(TbsGoodsType.sku.name())); + budget.setSpuConditions(map.get(TbsGoodsType.spu.name())); + List scheduleItems = tbsScheduleItemService.listByScheduleId(budget.getScheduleId()); + budget.setScheduleItem(scheduleItems); + budget.setScheduleItemBudgets(scheduleItemBudgetList); + } + return R.ok(list); + } + return R.ok(); + } + + /** + * 列表(通过IDS查询) + * @apiNote 用于加载模板选中的预算 + * @param param + * @return + */ + @PostMapping("/listByIds") + @PreAuthorize("hasRole('tbs:budget:query')") + public R> getListByParam(@RequestBody TbsBudgetSo param){ + if(param.getSelectIdList()!=null && param.getSelectIdList().size()>0){ + List list = tbsBudgetService.listByIds(param.getSelectIdList()); + return R.ok(list); + }else{ + return R.ok(); + } + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('tbs:budget:query')") + public R> getPage(TbsBudgetSo param){ + List budgetIds = tbsBudgetMapper.selectBudgetId(param); + if(budgetIds.size()>0){ + PageUtil.startPage(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(TbsBudget::getId,budgetIds); + lqw.orderByDesc(TbsBudget::getCreateTime); + List list = tbsBudgetService.list(lqw); + List voList = new ArrayList<>(); + for (TbsBudget budget : list) { + TbsBudgetVo budgetVo = tbsBudgetService.toVoEntity(budget); + if(budgetVo.getBudgetCheckState().equals(TbsCommonCheckState.State_2_finished)){ + long count = tbsBudgetMapper.countLastChange(budgetVo.getId()); + if(count>0){ + budgetVo.setBudgetCheckState(TbsCommonCheckState.State_1_apply); + } + } + voList.add(budgetVo); + } + return R.byPageHelperList(list,voList); + } + return R.byEmptyList(); + } + + /** + * ID查询 + * @param id + * @param changeId + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Budget, title = "预算", biz = BizType.QUERY) + @PreAuthorize("hasRole('tbs:budget:query')") + public R getById(@PathVariable("id") String id,String changeId){ + TbsBudget budget = tbsBudgetService.getById(id); + TbsBudgetVo vo = tbsBudgetService.toVoEntity(budget); +// TbsBudgetVo vo2 = tbsBudgetService.getEntityForExcel(budget); +// vo.setScheduleItemBudgets(vo2.getScheduleItemBudgets()); + return R.ok(vo); + } + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.Budget, title = "预算", biz = BizType.UPDATE) + @PreAuthorize("hasRole('tbs:budget:update')") + public R updateById(@RequestBody @Valid TbsBudgetBo param){ + if(param.getId()==null){ + return R.error("缺少参数"); + } + tbsBudgetService.modify(param); + return R.ok(); + } + + /** + * 批量更新跨年 + * @param param + * @return + */ + @PostMapping("/updateCrossYearBatch") + public R updateCrossYearBatch(@RequestBody TbsBudgetStateBo param){ + tbsBudgetService.updateCrossYearFlag(param.getCrossYearFlag()); + return R.ok(); + } + + /** + * 更新预算的不运作状态 + * @param param + * @return + */ + @PostMapping("/updateInactiveFlag") + @SysLog(module = SystemModule.Budget, title = "预算不运作状态", biz = BizType.UPDATE) + public R updateInactiveFlag(@RequestBody @Valid TbsBudgetStateBo param){ + tbsBudgetService.update(new LambdaUpdateWrapper() + .set(TbsBudget::getInactiveFlag,param.getInactiveFlag()) + .eq(TbsBudget::getId,param.getId())); + return R.ok(); + } + + /** + * 更新跨年状态 + * @param param + * @return + */ + @PostMapping("/updateCrossYearState") + @SysLog(module = SystemModule.Budget, title = "预算", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid TbsBudgetStateBo param){ + TbsBudget budget = tbsBudgetService.getById(param.getId()); +// LocalDate nowDate = LocalDate.now(); +// int currYear = nowDate.getYear(); +// List scheduleItems = tbsScheduleItemService.listByScheduleId(budget.getScheduleId()); +// budget.setCrossYearFlag(param.getCrossYearFlag()); +// if(scheduleItems.size()>0){ +// TbsScheduleItem s = scheduleItems.get(0); +// int year = s.getEndDate().getYear(); +// int diff = currYear-year ; +// //默认值 +// budget.setStopFlag(0); +// if(diff>1){ +// //超过1年 +// budget.setStopFlag(1); +// }else if (diff==1){ +// //刚过1年期间 +// if(!param.getCrossYearFlag().equals(1)){ +// budget.setStopFlag(1); +// } +// } +// }else { +// //未设置周期,定义为停用 +// budget.setStopFlag(1); +// } + budget.setCrossYearFlag(param.getCrossYearFlag()); + tbsBudgetService.updateById(budget); + tbsBudgetService.syncStopFlag(); + return R.ok(); + } + + /** + * 更新预算指定模板 + * @param param + * @return + */ + @PostMapping("/updateTemplates") + @SysLog(module = SystemModule.Budget, title = "更新预算指定模板", biz = BizType.UPDATE) + @PreAuthorize("hasRole('tbs:budget:update')") + public R updateById(@RequestBody @Valid TbsBudgetTempBo param){ + tbsBudgetService.updateTemplates(param); + return R.ok(); + } + + /** + * 修改周期金额 + * @param param + * @return + */ + @PostMapping("/updateScheduleItemAmount") + @SysLog(module = SystemModule.Budget, title = "预算", biz = BizType.UPDATE) + @PreAuthorize("hasRole('tbs:budget:update')") + public R updateById(@RequestBody @Valid TbsScheduleItemBudgetBo param){ + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + TbsScheduleItemBudget scheduleItemBudget = tbsScheduleItemBudgetService.getById(param.getId()); + TbsBudget budget = tbsBudgetService.getById(scheduleItemBudget.getBudgetId()); + if(budget.getBudgetCheckState().equals(TbsCommonCheckState.State_1_apply)){ + Assert.throwEx("预算审批中无法编辑"); + } + LambdaQueryWrapper logLambdaQueryWrapper = new LambdaQueryWrapper<>(); + logLambdaQueryWrapper.in(TbsBudgetLog::getOptType,BudgetLogOptFlag.getFinalBudgetOptFlag()); + logLambdaQueryWrapper.eq(TbsBudgetLog::getScheduleItemBudgetId,scheduleItemBudget.getId()); + List tbsBudgetLogs = tbsBudgetLogService.list(logLambdaQueryWrapper); + BigDecimal logAmount = tbsBudgetLogs.stream().map(a->a.getAmount()).reduce(BigDecimal.ZERO,BigDecimal::add); + + BudgetLogOptFlag optType; + BigDecimal amount = param.getBudgetAmount().subtract(logAmount); + if(amount.compareTo(BigDecimal.ZERO)>0){ + optType = BudgetLogOptFlag.State_2; + }else if(amount.compareTo(BigDecimal.ZERO)<0){ + optType = BudgetLogOptFlag.State_3; + }else{ + return R.ok(); + } + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.toTbsBudgetLog(sysUser,budget,scheduleItemBudget,optType, amount); + tbsBudgetLogService.save(budgetLog); + return R.ok(); + } + + /** + * 修改周期金额 + * @param param + * @return + */ + @PostMapping("/updateScheduleItemAmountAdd") + @SysLog(module = SystemModule.Budget, title = "预算", biz = BizType.UPDATE) + @PreAuthorize("hasRole('tbs:budget:update')") + public R updateScheduleItemAmountAdd(@RequestBody @Valid TbsScheduleItemBudgetBo param){ + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + TbsScheduleItemBudget scheduleItemBudget = tbsScheduleItemBudgetService.getById(param.getId()); + //金额相同时退出 +// if(scheduleItemBudget.getBudgetAmount().compareTo(param.getBudgetAmount())==0){return R.ok();} + TbsBudget budget = tbsBudgetService.getById(scheduleItemBudget.getBudgetId()); + if(budget.getBudgetCheckState().equals(TbsCommonCheckState.State_1_apply)){ + Assert.throwEx("预算审批中无法编辑"); + } +// TbsScheduleItemBudget itemBudget = new TbsScheduleItemBudget(); +// itemBudget.setId(param.getId()); +// itemBudget.setBudgetAmount(param.getBudgetAmount()); +// tbsScheduleItemBudgetService.updateById(itemBudget); + //0-预算新增;1-费用申请;2-预算调增;3-预算调减;4-费用释放 + BudgetLogOptFlag optType; + BigDecimal amount; + if(param.getBudgetAmount().compareTo(BigDecimal.ZERO)>0){ + amount = param.getBudgetAmount(); + optType = BudgetLogOptFlag.State_2; + }else { + amount = param.getBudgetAmount(); + optType = BudgetLogOptFlag.State_3; + } + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.toTbsBudgetLog(sysUser,budget,scheduleItemBudget,optType, amount); + tbsBudgetLogService.save(budgetLog); + return R.ok(); + } + + /** + * 修改预计发货金额 + * @param param + * @return + */ + @PostMapping("/updateScheduleItemPreDispatchAmount") + @SysLog(module = SystemModule.Budget, title = "预算", biz = BizType.UPDATE) + @PreAuthorize("hasRole('tbs:budget:update')") + public R updateScheduleItemPreDispatchAmount(@RequestBody @Valid TbsScheduleItemBudgetPreDispatchBo param){ + TbsScheduleItemBudget itemBudget = new TbsScheduleItemBudget(); + itemBudget.setId(param.getId()); + itemBudget.setPreDispatchAmount(param.getPreDispatchAmount()); + //添加拦截 + TbsScheduleItemBudget scheduleItemBudget = tbsScheduleItemBudgetService.getById(param.getId()); + TbsBudget budget = tbsBudgetService.getById(scheduleItemBudget.getBudgetId()); + if(budget.getBudgetCheckState().equals(TbsCommonCheckState.State_1_apply)){ + Assert.throwEx("预算审批中无法编辑"); + } + tbsScheduleItemBudgetService.updateById(itemBudget); + return R.ok(); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.Budget, title = "预算", biz = BizType.INSERT) + @PreAuthorize("hasRole('tbs:budget:insert')") + public R save(@RequestBody @Valid TbsBudgetBo param){ + param.setId(null); + tbsBudgetService.modify(param); + return R.ok(); + } + + /** + * excel导入 + * @param budgetBo + * @return 返回错误列表 + */ +// @PostMapping("/import") +// @SysLog(module = SystemModule.Budget, title = "预算", biz = BizType.INSERT) +// @PreAuthorize("hasRole('tbs:budget:insert')") +// public R> importBo(@RequestBody @Valid TbsBudgetExcelBatchDto budgetBo){ +// ValidateTools.valid(budgetBo.getItems()); +// List errorList = new ArrayList<>(); +// for (int i = 0; i < budgetBo.getItems().size(); i++) { +// TbsBudgetExcelBo item = budgetBo.getItems().get(i); +// item.setSkuCodes(item.getSkuCodes().stream().filter(a->StringUtils.isNotEmpty(a.trim())).collect(Collectors.toList())); +// item.setSpuNames(item.getSpuNames().stream().filter(a->StringUtils.isNotEmpty(a.trim())).collect(Collectors.toList())); +// item.setCategoryNames(item.getCategoryNames().stream().filter(a->StringUtils.isNotEmpty(a.trim())).collect(Collectors.toList())); +// item.setSeriesNames(item.getSeriesNames().stream().filter(a->StringUtils.isNotEmpty(a.trim())).collect(Collectors.toList())); +// item.setBrandNames(item.getBrandNames().stream().filter(a->StringUtils.isNotEmpty(a.trim())).collect(Collectors.toList())); +// +// try { +// tbsBudgetService.modifyByExcel(item); +// } catch (BusinessException e) { +// item.setErrorMsg("预算编码["+item.getBudgetCode()+"]"+e.getMessage()); +// errorList.add(item); +// }catch (Exception e) { +// log.error(e.getMessage()); +// item.setErrorMsg("预算编码["+item.getBudgetCode()+"]未知错误,请联系管理员"); +// errorList.add(item); +// } +// } +// return R.ok(errorList,"成功导入:"+(budgetBo.getItems().size()-errorList.size())+"条记录,失败数:"+errorList.size()); +// } + + /** + * 导出 + * @param ids + * @return + */ +// @GetMapping("/export") +// public R> exportVo(String ids){ +// List idsLong = StringUtils.splitIdLong(ids); +// return R.ok(tbsBudgetService.listBudgetExcel(idsLong)); +// } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.Budget, title = "预算", biz = BizType.DELETE) + @PreAuthorize("hasRole('tbs:budget:delete')") + public R deleteById(@PathVariable("ids") String ids){ + //预算记录则不允许删除 + List idsLong = StringUtils.splitIdLong(ids); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(TbsBudgetCostItem::getBudgetId,idsLong); + if(tbsBudgetCostItemService.count(lqw)>0){ + return R.error("预算已被使用"); + } + long countUnPub = tbsBudgetService.count( + new LambdaQueryWrapper() + .in(TbsBudget::getId,idsLong) + .eq(TbsBudget::getBudgetState,0) + .ne(TbsBudget::getBudgetCheckState,TbsCommonCheckState.State_0_unPublish) + ); + if(countUnPub>0){ + return R.error("预算状态不支持删除"); + } + boolean result = tbsBudgetService.removeByIds(idsLong); + //移除考核期预算 + LambdaQueryWrapper rmItemBudget = new LambdaQueryWrapper<>(); + rmItemBudget.in(TbsScheduleItemBudget::getBudgetId,idsLong); + tbsScheduleItemBudgetService.remove(rmItemBudget); + return R.isTrue(result); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getExcelDataById/{id}") + @SysLog(module = SystemModule.Budget, title = "预算", biz = BizType.QUERY) + @PreAuthorize("hasRole('tbs:budget:query')") + public R getExcelDataById(@PathVariable("id") String id){ + TbsBudget budget = tbsBudgetService.getById(id); + return R.ok(tbsBudgetService.getEntityForExcel(budget)); + } + + /** + * 迁移成本中心 + * @return + */ + @GetMapping("/moveCenter") + public R moveCenter(String sourceId,String sourceType,String targetId,String targetType){ + tbsBudgetService.moveCenterBudgetAndCostAmount(sourceId,sourceType,targetId,targetType); + return R.ok(); + } + + /** + * 更新周期预算金额 + * @return + */ + @PostMapping("/moveBudgetAmount") + public R moveBudgetAmount(@RequestBody @Valid TbsBudgetMoveAmountBo bo){ + tbsBudgetService.moveBudgetAmount(bo); + return R.ok(); + } + + @PostMapping("/updateBudgetAfterStart") + public R updateBudgetAfterStart(@RequestBody @Valid TbsBudgetUpdateAfterStartBo param){ + if(param.getId()==null){ + Assert.throwEx("预算ID不能为空!"); + } + tbsBudgetService.updateBudgetAfterStart(param); + return R.ok(); + } + + @GetMapping("/syncNotExitLog") + public R syncNotExitLog(){ + List items = tbsScheduleItemBudgetMapper.listNotCreateLogBudget(); + for (TbsScheduleItemBudget item : items) { + TbsBudget budget = tbsBudgetService.getById(item.getBudgetId()); + SysUser sysUser = sysUserService.getById(budget.getUserId()); + if(sysUser==null){ + sysUser = new SysUser(); + sysUser.setId("1"); + sysUser.setName("Admin"); + sysUser.setCode("Admin"); + } + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.toTbsBudgetLog(sysUser,budget,item,BudgetLogOptFlag.State_0,item.getBudgetAmount()); + budgetLog.setRemark("sync"); + tbsBudgetLogService.save(budgetLog); + } + return R.ok(); + } + + /** + * 补偿缺失的项 + * @return + */ + @GetMapping("/syncMissSchItem") + public R syncMissSchItem(){ + tbsBudgetService.syncMissSchItem(); + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetLogController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetLogController.java new file mode 100644 index 0000000..ac81472 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetLogController.java @@ -0,0 +1,224 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.annotation.LimitSubmit; +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.BudgetLogOptFlag; +import com.qs.serve.common.model.enums.SystemModule; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetLogWithAmount; +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.TbsBudgetLog2Mapper; +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; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.Nullable; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tbs.entity.so.TbsBudgetLogSo; +import com.qs.serve.modules.tbs.entity.TbsBudgetLog; +import com.qs.serve.modules.tbs.service.TbsBudgetLogService; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * 预算 预算日志 + * @author YenHex + * @since 2023-01-05 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/budgetLog") +public class TbsBudgetLogController { + + private TbsBudgetReleaseApplicationService tbsBudgetReleaseApplicationService; + private TbsBudgetLogService tbsBudgetLogService; + private TbsBudgetService tbsBudgetService; + private TbsBudgetLogMapper tbsBudgetLogMapper; + private TbsBudgetLog2Mapper tbsBudgetLog2Mapper; + private final TbsBudgetMapper tbsBudgetMapper; + 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 + * @return + */ + @GetMapping("/page") + public R> getPage(TbsBudgetLogSo param){ + TbsBudgetLog entity = CopierUtil.copy(param,new TbsBudgetLog()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + PageUtil.startPage(); + List list = tbsBudgetLogService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(TbsBudgetLogSo param){ + TbsBudgetLog entity = CopierUtil.copy(param,new TbsBudgetLog()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + List list = tbsBudgetLogService.list(lqw); + return R.ok(list); + } + + /** + * 导出使用明细 + * @param param + * @return + */ + @LimitSubmit(interval = 3000) + @GetMapping("/export") + public R> getExport(TbsBudgetSo param){ + List budgetIds = tbsBudgetMapper.selectBudgetId(param); + List budgetVoList = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(budgetIds)){ + TbsBudget param4Query = new TbsBudget(); + param4Query.setSelectBudgetIds(budgetIds); + List budgetList = tbsBudgetMapper.selectBatchIds(budgetIds); + List scheduleItemBudgets = tbsBudgetService.getEntityForExcel(param4Query).getScheduleItemBudgets(); + Map> map = scheduleItemBudgets.stream().collect(Collectors.groupingBy(TbsScheduleItemBudget::getBudgetId)); + for (TbsBudget budget : budgetList) { + TbsBudgetVo budgetVo = CopierUtil.copy(budget,new TbsBudgetVo()); + List tmp = map.get(budget.getId()); + budgetVo.setScheduleItemBudgets(tmp); + budgetVoList.add(budgetVo); + } + } + return R.ok(budgetVoList); + } + + /** + * 获取统计金额 + * @param budgetId + * @param itemId + * @return + */ + @GetMapping("/getItemAmount") + public R getAmount(Long budgetId,Long itemId){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsScheduleItemBudget::getBudgetId,budgetId); + lqw.eq(TbsScheduleItemBudget::getScheduleItemId,itemId); + List tbsScheduleItemBudgetList = tbsScheduleItemBudgetService.list(lqw); + TbsScheduleItemBudget rs = this.getItemBudget(budgetId, tbsScheduleItemBudgetList); + return R.ok(rs); + } + + + + /** + * 获取统计金额(返回预算列表) + * @param budgetId + * @return + */ + @GetMapping("/getItemListAmount") + public R> getItemListAmount(Long budgetId){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsScheduleItemBudget::getBudgetId,budgetId); + List tbsScheduleItemBudgetList = tbsScheduleItemBudgetService.list(lqw); + + Map> tbsScheduleItemBudgetListMap = tbsScheduleItemBudgetList.stream() + .collect(Collectors.groupingBy(TbsScheduleItemBudget::getScheduleItemId)); + List resultList = new ArrayList<>(); + for (Long schItemId : tbsScheduleItemBudgetListMap.keySet()) { + tbsScheduleItemBudgetList = tbsScheduleItemBudgetListMap.get(schItemId); + TbsScheduleItemBudget rs = this.getItemBudget(budgetId, tbsScheduleItemBudgetList); + resultList.add(rs); + } + return R.ok(resultList); + } + + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Budget, title = "预算日志", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + TbsBudgetLog tbsBudgetLog = tbsBudgetLogService.getById(id); + return R.ok(tbsBudgetLog); + } + + @Nullable + private TbsScheduleItemBudget getItemBudget(Long budgetId, List tbsScheduleItemBudgetList) { + Optional optional = tbsScheduleItemBudgetList.stream().findFirst(); + TbsScheduleItemBudget rs = null; + if(optional.isPresent()){ + TbsScheduleItemBudget a = optional.get(); + LambdaQueryWrapper lqwLog = new LambdaQueryWrapper<>(); + lqwLog.eq(TbsBudgetLog::getScheduleItemBudgetId,a.getId()); + lqwLog.eq(TbsBudgetLog::getBudgetId, budgetId); + List tbsBudgetLogList = budgetLogService.list(lqwLog); + BigDecimal finalBudgetAmount = tbsBudgetLogList.stream().filter(b-> BudgetLogOptFlag.getFinalBudgetOptFlag().contains(b.getOptType())).map(TbsBudgetLog::getAmount) + .reduce(BigDecimal.ZERO,BigDecimal::add); + + BigDecimal usedBudgetAmount = tbsBudgetLogList.stream().filter(b->!BudgetLogOptFlag.getFinalBudgetOptFlag().contains(b.getOptType())).map(TbsBudgetLog::getAmount) + .reduce(BigDecimal.ZERO,BigDecimal::add); + + BigDecimal unUsedBudgetAmount = tbsBudgetLogList.stream().map(TbsBudgetLog::getAmount) + .reduce(BigDecimal.ZERO,BigDecimal::add); + + BigDecimal sumPolicyAmt = tbsBudgetLogList.stream().filter(b->b.getPolicyId()!=null).map(TbsBudgetLog::getAmount) + .reduce(BigDecimal.ZERO,BigDecimal::add); + + // 费用退回的金额 + TbsBudgetLogWithAmount backAmt = tbsBudgetLog2Mapper.getSumBackAmt(budgetId,a.getId()); + + a.setSumCostBackAmount(backAmt==null?BigDecimal.ZERO:backAmt.getAmt()); + a.setSumPolicyAmount(sumPolicyAmt); + a.setFinalBudgetAmount(finalBudgetAmount); + a.setUnUsedBudgetAmount(unUsedBudgetAmount); + a.setUsedBudgetAmount(usedBudgetAmount); + rs = a; + } + return rs; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetPlanController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetPlanController.java new file mode 100644 index 0000000..f223cd6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsBudgetPlanController.java @@ -0,0 +1,124 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.tbs.entity.TbsBudgetPlan; +import com.qs.serve.modules.tbs.service.TbsBudgetPlanService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + + +import javax.validation.Valid; +import java.util.List; + +/** + * 预算 预算 + * @author YenHex + * @since 2023-07-10 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/budgetPlan") +public class TbsBudgetPlanController { + + private TbsBudgetPlanService tbsBudgetPlanService; + + /** + * 列表 + * @param param + * @return + */ + //@GetMapping("/list") +// @PreAuthorize("hasRole('tbs:budgetPlan:query')") + public R> getList(TbsBudgetPlan param){ + TbsBudgetPlan entity = CopierUtil.copy(param,new TbsBudgetPlan()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + PageUtil.startPage(); + List list = tbsBudgetPlanService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") +// @PreAuthorize("hasRole('tbs:budgetPlan:query')") + public R> getPage(TbsBudgetPlan param){ + TbsBudgetPlan entity = CopierUtil.copy(param,new TbsBudgetPlan()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + PageUtil.startPage(); + List list = tbsBudgetPlanService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Budget, title = "预算", biz = BizType.QUERY) +// @PreAuthorize("hasRole('tbs:budgetPlan:query')") + public R getById(@PathVariable("id") String id){ + TbsBudgetPlan tbsBudgetPlan = tbsBudgetPlanService.getById(id); + return R.ok(tbsBudgetPlan); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.Budget, title = "预算", biz = BizType.UPDATE) +// @PreAuthorize("hasRole('tbs:budgetPlan:update')") + public R updateById(@RequestBody @Valid TbsBudgetPlan param){ + TbsBudgetPlan entity = CopierUtil.copy(param,new TbsBudgetPlan()); + boolean result = tbsBudgetPlanService.updateById(entity); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.Budget, title = "预算", biz = BizType.INSERT) +// @PreAuthorize("hasRole('tbs:budgetPlan:insert')") + public R save(@RequestBody @Valid TbsBudgetPlan param){ + TbsBudgetPlan entity = CopierUtil.copy(param,new TbsBudgetPlan()); + boolean result = tbsBudgetPlanService.save(entity); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.Budget, title = "预算", biz = BizType.DELETE) +// @PreAuthorize("hasRole('tbs:budgetPlan:delete')") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = tbsBudgetPlanService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyCheckController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyCheckController.java new file mode 100644 index 0000000..71af766 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyCheckController.java @@ -0,0 +1,249 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.annotation.LimitSubmit; +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.consts.BirActivityCenterGoodsUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.seeyon.entity.CtpAffairQo; +import com.qs.serve.modules.seeyon.entity.bo.CtpAddNodeParam; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.entity.vo.CtpAffairVo; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetMatchMsgVo; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.tbs.service.impl.TbsCostApplyOperationServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 预算 费用申请(审批) + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/costApply") +public class TbsCostApplyCheckController { + + private BmsSupplierService bmsSupplierService; + private TbsCostApplyService tbsCostApplyService; + private TbsCostApplyOperationServiceImpl tbsCostApplyOperationServiceImpl; + private TbsActivityTemplateService tbsActivityTemplateService; + private TbsActivityService activityService; + private TbsBudgetManagerService budgetManagerService; + + /** + * 测试接口(正式环境无法调用) + * @return + */ + @GetMapping("devDoFinished") + public R devDoFinished(String costApplyId){ + TbsAffairCommitBo commitBo = new TbsAffairCommitBo(); + commitBo.setCostApplyId(Long.parseLong(costApplyId)); + //tbsCostApplyOperationServiceImpl.doFinished(commitBo); + BirActivityCenterGoodsUtil.buildBir(Long.parseLong(costApplyId)); + return R.ok(); + } + + /** + * 统计即将逾期 + * @return + */ + @GetMapping("myCountOverdue4Home") + public R countOverdue(){ + long data = tbsCostApplyService.selectCountOverdueState(AuthContextUtils.getSysUserId()); + return R.ok(data); + } + + /** + * 核对客户可用费用模板 + * @param supplierId + * @param templateId + * @return + */ + @GetMapping("/checkTemplate") + public R checkTemplate(String supplierId,String templateId){ + BmsSupplier supplier = bmsSupplierService.getById(supplierId); + TbsActivityTemplate template = tbsActivityTemplateService.getById(templateId); + boolean rs = tbsCostApplyService.checkTemplateId(supplier,template); + return R.isTrue(rs); + } + + /** + * 提交费用申请 + * @param id + * @return + */ + @LimitSubmit + @PostMapping("/commit/{id}") + @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.UPDATE) + @PreAuthorize("hasRole('tbs:costApply:update')") + public R commit(@PathVariable("id") Long id){ + tbsCostApplyService.commitApply(id+""); + BirActivityCenterGoodsUtil.buildBir(id); + return R.ok(); + } + + /** + * 重置申请 + * @return + */ + @PostMapping("/replaceCommit/{id}") + public R replaceApplySyData(@PathVariable("id") Long id){ + Long[] ids = new Long[]{id}; + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(TbsCostApply::getId,Arrays.asList(ids)); + //lqw.notIn(TbsCostApply::getId,Arrays.asList(notIds)); + //lqw.notLike(TbsCostApply::getRemark,"审批节点重置"); + lqw.in(TbsCostApply::getChargeState,1,2,3); + lqw.select(TbsCostApply::getId,TbsCostApply::getChargeState,TbsCostApply::getCode); + List costApplyList = tbsCostApplyService.list(lqw); + + List msgs = new ArrayList<>(); + for (TbsCostApply costApply : costApplyList) { + String msg = tbsCostApplyService.replaceApplySyData(costApply.getId()+""); + msgs.add(costApply.getCode() + " : " + msg); + } + msgs.forEach(System.out::println); + return R.ok(); + } + + /** + * 审批列表(用于详情页) + * @param costApplyId + * @return + */ + @GetMapping("/ListAffairs") + public R> pageAffair(String costApplyId){ + //已重构该方法 + return tbsCostApplyOperationServiceImpl.pageAffairV2(costApplyId,null); + } + + /** + * 审批列表(翻页) + * @param param + * @return + */ + @GetMapping("/pageMemberAffair") + public R> pageMemberAffair(CtpAffairQo param){ + return tbsCostApplyOperationServiceImpl.pageMemberAffair(param); + } + /** + * 提交审批节点 + * @return + */ + @LimitSubmit + @PostMapping("/commitAffair") + @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.DELETE) + @PreAuthorize("hasRole('tbs:costApply:commit')") + public R commitAffair(@RequestBody @Valid TbsAffairCommitBo affairCommit){ + BirActivityCenterGoodsUtil.buildBir(affairCommit.getCostApplyId()); + return tbsCostApplyOperationServiceImpl.commitAffair(affairCommit); + } + + /** + * 补偿按钮 + * @param id + * @return + */ + @LimitSubmit + @PostMapping("/compensate/{id}") + @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.UPDATE) + public R compensate(@PathVariable("id") Long id){ + tbsCostApplyOperationServiceImpl.runCompensate(id+""); + BirActivityCenterGoodsUtil.buildBir(id); + return R.ok(); + } + + /** + * 加签 + * @param param + * @return + */ + @LimitSubmit + @PostMapping("/addNode") + @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.DELETE) + public R addNode(@RequestBody CtpAddNodeParam param){ + return tbsCostApplyOperationServiceImpl.addNode(param); + } + + /** + * 获取未完成审批统计(个人) + * @return + */ + @PostMapping("/getAffairUnfinished") + public R getUnfinished(){ + return tbsCostApplyOperationServiceImpl.getUnfinished(); + } + + /** + * 更新核销状态 + * @return + */ + @GetMapping("updateCheckState") + public R updateCheckState(){ + tbsCostApplyService.updateCheckState(); + return R.ok(); + } + + /** + * 获取匹配列表 + * @param costApplyId + * @return + */ + @GetMapping("compareBudget") + public R> compareBudget(Long costApplyId){ + List activityList = activityService.listByCostApplyId(costApplyId); + if(activityList.size()<1){ + return R.ok(); + } + List activityIds = activityList.stream().map(TbsActivity::getId).collect(Collectors.toList()); + List budgetIds = budgetManagerService.listBudgetIdsByActivityId(activityIds); + if(CollectionUtil.isEmpty(budgetIds)){ + return R.ok( + activityList.stream().map(activity -> + new TbsBudgetMatchMsgVo(new TbsBudget(),activity, + "科目与品类组合的预算,不存在或不可用")) + .collect(Collectors.toList()) + ); + } + List result = budgetManagerService.compare(activityIds,budgetIds); + return R.ok(result); + } + + + private final TbsCostApplyOperationServiceImpl tbsCostApplyOperationService; + + + //@GetMapping("/devTest") + public R devTest(Long costApplyId){ + Long[] cids = new Long[]{ + + }; + for (Long cid : cids) { + TbsCostApply costApply = new TbsCostApply(); + costApply.setId(cid); + tbsCostApplyOperationService.doEditAmtCallback(costApply); + } + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyController.java new file mode 100644 index 0000000..14c07fc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyController.java @@ -0,0 +1,814 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.qs.serve.common.model.annotation.LimitSubmit; +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.consts.BirActivityCenterGoodsUtil; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsRegion2Service; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysDeleteLogService; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.bo.*; +import com.qs.serve.modules.tbs.entity.dto.*; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetTableVo; +import com.qs.serve.modules.tbs.entity.vo.TbsCostApplyVo; +import com.qs.serve.modules.tbs.mapper.TbsBudgetLogMapper; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.tbs.service.impl.TbsCostApplyOperationServiceImpl; +import com.qs.serve.modules.tbs.service.impl.TbsCostTodoOperationServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 预算 费用申请 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/costApply") +public class TbsCostApplyController { + + private TbsCostApplyPart1Service costApplyPart1Service; + private TbsCostContractService costContractService; + private TbsCostApplyService tbsCostApplyService; + private TbsCostTodoService costTodoService; + private TbsActivityService tbsActivityService; + private TbsActivityTemplateService tbsActivityTemplateService; + private TbsActivityCenterGoodsService tbsActivityCenterGoodsService; + private final TbsActivityGoodsService activityGoodsService; + private final TbsActivitySubjectService activitySubjectService; + private final TbsActivityCenterService activityCenterService; + private final TbsActivityCenterGoodsService activityCenterGoodsService; + private final TbsActivityChannelService activityChannelService; + private final TbsActivityChannelPointService activityChannelPointService; + private final TbsCostTodoOperationServiceImpl costTodoOperationService; + private BmsSupplierService bmsSupplierService; + private final TbsBudgetLogMapper tbsBudgetLogMapper; + private BmsRegion2Service region2Service; + private SysUserService sysUserService; + private TbsBudgetApplicationService budgetApplicationService; + private TbsBudgetService tbsBudgetService; + private SysPostUserService postUserService; + private TbsCostApplyOperationServiceImpl tbsCostApplyOperationServiceImpl; + private TbsBudgetMatchApplication tbsBudgetMatchApplication; + private TbsBudgetCostItemService tbsBudgetCostItemService; + private TbsBudgetLogService tbsBudgetLogService; + private TbsScheduleItemBudgetService tbsScheduleItemBudgetService; + private SysDeleteLogService deleteLogService; + private TbsCostApplyMapper tbsCostApplyMapper; + private TbsCostChangeInfoService tbsCostChangeInfoService; + + + /** + * 临时接口 + * 重建费用申请的预算占用(用于OA已经生成表单,但是费用申请回调报错后补发) + * @param id + * @return + */ + //@PostMapping("/testBanding") + public R bu(Long id){ + //tbsCostApplyService.rebuildBudgetInit(id); + return R.ok(); + } + + /** + * 复制 + * @param id + * @return + */ + @PostMapping("/copyById/{id}") + public R copyById(@PathVariable("id") Long id){ + return R.ok(costApplyPart1Service.copyById(id)); + } + + + /** + * 作废费用申请 + * @param id + * @return + */ + @DeleteMapping("/removeCostById/{id}") + public R removeCostById(@PathVariable("id") Long id){ + tbsCostApplyService.removeCostById(id); + BirActivityCenterGoodsUtil.buildBir(id); + return R.ok(); + } + + /** + * 预览 + * @param id + * @return + */ + @GetMapping("preview") + @PreAuthorize("hasRole('tbs:costApply:query')") + public R preview(Long id){ + TbsCostApply costApply = tbsCostApplyService.getById(id); + TbsBudgetTableVo tableVo = tbsBudgetMatchApplication.getMatchResult(id,true,false).getTableVo(); +// if(costApply.getMatchType().equals(0)){ +// TbsBudgetCostResult result = budgetApplicationService.buildBudgetCostResult(id,false,true); +// tableVo = result.getTableData(); +// }else if (costApply.getMatchType().equals(1)){ +// tableVo = tbsBudgetMatchApplication.getMatchResult(id,true).getTableVo(); +// } + return R.ok(tableVo); + } + + /** + * 预览2 提交审批后调用 + * @param id + * @return + */ + @GetMapping("preview2") + public R viewTable(Long id){ + TbsBudgetTableVo result = budgetApplicationService.buildResultTable(id); + return R.ok(result); + } + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + @PreAuthorize("hasRole('tbs:costApply:query')") + public R> getList(TbsCostApplyVo param){ + TbsCostApply entity = CopierUtil.copy(param,new TbsCostApply()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + lqw.orderByDesc(TbsCostApply::getId); + List list = tbsCostApplyService.list(lqw); + return R.ok(list); + } + + /** + * 列表(个人及下属的费用申请) + * @param param + * @return + */ + @GetMapping("/listMy") + public R> getListMy(TbsCostApplyVo param){ + String userId = AuthContextUtils.getSysUserId(); + List userIds = new ArrayList<>(); + if(param.getLoadChild()!=null&¶m.getLoadChild().equals(1)){ + userIds = postUserService.listByChildIds(userId); + } + userIds.add(userId); + TbsCostApply entity = CopierUtil.copy(param,new TbsCostApply()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + lqw.in(TbsCostApply::getCreateBy,userIds); + lqw.orderByDesc(TbsCostApply::getId); + PageUtil.startPage(); + List list = tbsCostApplyService.list(lqw); + return R.ok(list); + } + + /** + * 列表(个人及下属的费用申请) + * @param param + * @return + */ + @PostMapping("/listMy") + public R> getListMy4Post(@RequestBody TbsCostApplyVo param){ + PageUtil.setPageSize(param.getPageSize()); + PageUtil.setPageNum(param.getPageNum()); + return this.getListMy4Post(param); + } + + /** + * 翻页(个人及所属的费用申请,GET) + * @param param + * @return + */ + @GetMapping("/pageMy") + @PreAuthorize("hasRole('tbs:costApply:query')") + public R> getPageMy(TbsCostApplyVo param){ + String userId = AuthContextUtils.getSysUserId(); + List userIds = new ArrayList<>(); + if(param.getLoadChild()!=null&¶m.getLoadChild().equals(1)){ + userIds = postUserService.listByChildIds(userId); + } + userIds.add(userId); + TbsCostApply entity = CopierUtil.copy(param,new TbsCostApply()); + entity.setSelectUserIds(userIds); + IPage page = tbsCostApplyService.selectPage(entity); + return R.byMbpList(page); + } + + /** + * 翻页(个人及所属的费用申请,GET) + * @param param + * @return + */ + @PostMapping("/pageMy") + @PreAuthorize("hasRole('tbs:costApply:query')") + public R> getPageMy4Post(@RequestBody TbsCostApplyVo param){ + PageUtil.setPageSize(param.getPageSize()); + PageUtil.setPageNum(param.getPageNum()); + return this.getPageMy(param); + } + + /** + * 翻页(Get) + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(TbsCostApply param){ + IPage page = tbsCostApplyService.selectPage(param); + return R.byMbpList(page); + } + + + /** + * 翻页(Post) + * @param param + * @return + */ + @PostMapping("/page") + public R> getPage4Post(@RequestBody TbsCostApply param){ + PageUtil.setPageSize(param.getPageSize()); + PageUtil.setPageNum(param.getPageNum()); + return this.getPage(param); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.QUERY) + @PreAuthorize("hasRole('tbs:costApply:query')") + @Transactional(rollbackFor = Exception.class) + public R getById(@PathVariable("id") String id){ + TbsCostApply tbsCostApply = tbsCostApplyService.getById(id); + if(tbsCostApply.getChargeState().equals(TbsCostApplyState.State_1_apply.getCode())){ + try { + tbsCostApplyOperationServiceImpl.runCompensate(id); + } catch (Exception e) { + e.printStackTrace(); + } + } + if(tbsCostApply.getChargeState().equals(TbsCostApplyState.State_7_changed.getCode())){ + try { + tbsCostChangeInfoService.compareToBuildChangeInfo(tbsCostApply.getId(),tbsCostApply.getChangeExtendId()); + } catch (Exception e) { + e.printStackTrace(); + } + } + TbsCostContract contract = costContractService.getByCostApplyId(tbsCostApply.getId()); + tbsCostApply.setContractInfo(contract); + return R.ok(tbsCostApply); + } + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.UPDATE) + @PreAuthorize("hasRole('tbs:costApply:update')") + public R updateById(@RequestBody TbsCostApplyBo param){ + TbsCostApply entity = new TbsCostApply(); + entity.setId(param.getId()); + entity.setRemark(param.getRemark()); + entity.setChargeTheme(param.getChargeTheme()); + entity.setContractFlag(param.getContractFlag()); + tbsCostApplyService.updateById(entity); + return R.ok(); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.INSERT) + @PreAuthorize("hasRole('tbs:costApply:insert')") + public R save(@RequestBody @Valid TbsCostApplyBo param){ + TbsCostApply entity = CopierUtil.copy(param,new TbsCostApply()); + //entity.setId(IdUtil.getSnowFlakeId()); + BmsSupplier supplier = bmsSupplierService.getById(entity.getSupplierId()); + if(StringUtils.hasText(supplier.getRegion2Last())){ + + } + boolean contract = entity.getContractFlag()!=null&&entity.getContractFlag().equals(1); + if(contract&&!(supplier.getSupplierFlag().equals(1)||supplier.getSupplierFlag().equals(2))){ + return R.error("当前用户非供应商"); + } + entity.setMatchType(1); + entity.setCode(CodeGenUtil.generate(CodeGenUtil.SourceKey.CostApply)); + entity.setSupplierCode(supplier.getCode()); + entity.setSupplierName(supplier.getName()); + if(StringUtils.hasText(supplier.getRegion2First())){ + BmsRegion2 region2 = region2Service.getById(supplier.getRegion2First()); + if(region2!=null){ + //Assert.throwEx("客户行政区域1错误"); + entity.setSupplierBizRegionFirstName(region2.getName()); + } + } + if(StringUtils.hasText(supplier.getRegion2Second())){ + BmsRegion2 region2 = region2Service.getById(supplier.getRegion2Second()); + if(region2!=null){ + //Assert.throwEx("客户行政区域2错误"); + entity.setSupplierBizRegionSecondName(region2.getName()); + } + } + if(StringUtils.hasText(supplier.getRegion2Third())){ + BmsRegion2 region2 = region2Service.getById(supplier.getRegion2Third()); + if(region2!=null){ + //Assert.throwEx("客户行政区域3错误"); + entity.setSupplierBizRegionThirdName(region2.getName()); + } + } + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + entity.setUserId(sysUser.getId()); + entity.setUserCode(sysUser.getCode()); + entity.setUserName(sysUser.getName()); + tbsCostApplyService.save(entity); + return R.ok(entity); + } + + /** + * 异动申请 + * @param id + * @return + */ + @LimitSubmit + @PostMapping("/settingWithChange/{id}") + @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.INSERT) + @Transactional(rollbackFor = Exception.class) + public R settingWithChange(@PathVariable("id") Long id){ + return R.ok(costApplyPart1Service.toSetChanged(id)); + } + + /** + * 异动申请(取消) + * @param id + * @return + */ + @LimitSubmit + @PostMapping("/cancelWithChange/{id}") + @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.INSERT) + @Transactional(rollbackFor = Exception.class) + public R cancelWithChange(@PathVariable("id") Long id){ + costApplyPart1Service.cancelSetChanged(id,true); + return R.ok(); + } + + /** + * 通过编号加载费用 + * @param id + * @return + */ + @PostMapping("/listById/{id}") + public R getChangeList(@PathVariable("id") String id){ + TbsCostApply costApply = tbsCostApplyService.getById(id); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostApply::getCode,costApply.getCode()); + lqw.orderByAsc(TbsCostApply::getCreateTime); + List costApplyList = tbsCostApplyService.list(lqw); + for (TbsCostApply apply : costApplyList) { + tbsCostChangeInfoService.compareToBuildChangeInfo(apply.getId(),apply.getChangeExtendId()); + List changeInfoList = tbsCostChangeInfoService.listByExtendCostApplyId(apply.getId()); + apply.setChangeInfoLogs(changeInfoList); + } + return R.ok(costApplyList); + } + + /** + * 根据模板,新增费用及活动 + * @param param + * @return + */ + @PostMapping("/saveWithActivity") + @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.INSERT) + @PreAuthorize("hasRole('tbs:costApply:insert')") + @Transactional(rollbackFor = Exception.class) + public R save(@RequestBody @Valid TbsCostApplyActivityBo param){ + TbsActivityTemplate activityTemplate = tbsActivityTemplateService.getById(param.getTemplateId()); + if(activityTemplate.getTemplateState().equals(0)){ + return R.error("当前模板已停用"); + } + TbsActivityBo activityBo = param.getActivityBo(); + TbsCostApplyBo costApplyBo = param.getCostApplyBo(); + ValidateTools.valid(costApplyBo); + TbsCostApply entity = CopierUtil.copy(costApplyBo,new TbsCostApply()); + BmsSupplier supplier = bmsSupplierService.getById(entity.getSupplierId()); + //entity.setId(IdUtil.getSnowFlakeId()); + entity.setCode(CodeGenUtil.generate(CodeGenUtil.SourceKey.CostApply)); + entity.setTemplateId(param.getTemplateId()); + entity.setTemplateTitle(param.getTemplateTitle()); + entity.setMatchType(1); + activityBo.setTemplateId(param.getTemplateId()); + activityBo.setTemplateTitle(param.getTemplateTitle()); + entity.setSupplierCode(supplier.getCode()); + if(StringUtils.hasText(supplier.getRegion2First())){ + BmsRegion2 region2 = region2Service.getById(supplier.getRegion2First()); + if(region2!=null){ + //Assert.throwEx("客户行政区域1错误"); + entity.setSupplierBizRegionFirstName(region2.getName()); + } + } + if(StringUtils.hasText(supplier.getRegion2Second())){ + BmsRegion2 region2 = region2Service.getById(supplier.getRegion2Second()); + if(region2!=null){ + //Assert.throwEx("客户行政区域2错误"); + entity.setSupplierBizRegionSecondName(region2.getName()); + } + } + if(StringUtils.hasText(supplier.getRegion2Third())){ + BmsRegion2 region2 = region2Service.getById(supplier.getRegion2Third()); + if(region2!=null){ + //Assert.throwEx("客户行政区域3错误"); + entity.setSupplierBizRegionThirdName(region2.getName()); + } + } + entity.setSupplierName(supplier.getName()); + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + entity.setUserId(sysUser.getId()); + entity.setUserCode(sysUser.getCode()); + entity.setUserName(sysUser.getName()); + tbsCostApplyService.save(entity); + activityBo.setCostApplyId(entity.getId()); + ValidateTools.valid(activityBo); + tbsActivityService.modify(activityBo); + return R.ok(entity); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.DELETE) + @PreAuthorize("hasRole('tbs:costApply:delete')") + @Transactional(rollbackFor = Exception.class) + public R deleteById(@PathVariable("id") Long id){ + TbsCostApply entity = tbsCostApplyService.getById(id); + if(entity.getCancelFlag().equals(1)||entity.getChangeExtendId()!=null||entity.getChangeSourceId()!=null){ + return R.error("异动记录不可删除"); + } + boolean stateFlag = !entity.getChargeState().equals(0)&& + !entity.getChargeState().equals(TbsCostApplyState.State_5_stop.getCode()); + LambdaQueryWrapper lqwCostItem = new LambdaQueryWrapper<>(); + lqwCostItem.eq(TbsBudgetCostItem::getCostApplyId,id); + long countItem = tbsBudgetCostItemService.count(lqwCostItem); + if(stateFlag&&countItem>0){ + return R.error("占用预算的申请,不支持删除"); + } + //模板类直接删除 + if(entity.getTemplateId()!=null){ + tbsCostApplyService.removeById(id); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivity::getCostApplyId,id); + List activityList = tbsActivityService.list(lqw); + for (TbsActivity activity : activityList) { + Long actId = activity.getId(); + tbsActivityService.removeById(actId); + //删除子表数据 + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("activity_id",actId); + activitySubjectService.remove(queryWrapper); + activityGoodsService.remove(queryWrapper); + activityChannelPointService.remove(queryWrapper); + activityChannelService.remove(queryWrapper); + activityCenterService.remove(queryWrapper); + activityCenterGoodsService.remove(queryWrapper); + } + return R.ok(); + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivity::getCostApplyId,id); + long count = tbsActivityService.count(lqw); + if(count>0L){ + return R.ok("含活动数据无法删除"); + } + boolean result = tbsCostApplyService.removeById(id); + BirActivityCenterGoodsUtil.buildBir(id); + return R.isTrue(result); + } + + /** + * 获取费用申请相关的预算项使用合计 + * @return + */ + @GetMapping("/listBudgetInfo") + public R> listBudgetInfo(String costApplyId,String policyId){ + LambdaQueryWrapper loadCostLogLqw = new LambdaQueryWrapper<>(); + if(costApplyId!=null){ + loadCostLogLqw.eq(TbsBudgetLog::getCostApplyId,costApplyId); + }else if(policyId!=null){ + loadCostLogLqw.eq(TbsBudgetLog::getPolicyId,policyId); + }else { + return R.error("error params"); + } + List costApplyBudgetLogs = tbsBudgetLogService.list(loadCostLogLqw); + if(costApplyBudgetLogs.size()<1){ + return R.ok(); + } + Map> groupCurrentMap = costApplyBudgetLogs.stream().collect(Collectors.groupingBy(TbsBudgetLog::getScheduleItemBudgetId)); + List budgetIds = costApplyBudgetLogs.stream().map(TbsBudgetLog::getBudgetId).distinct().collect(Collectors.toList()); + List resultInfoList = new ArrayList<>(); + for (Long budgetId : budgetIds) { + if(budgetId==0L){continue;} + TbsBudget budget = tbsBudgetService.getById(budgetId); + LambdaQueryWrapper scheduleLqw = new LambdaQueryWrapper<>(); + scheduleLqw.eq(TbsScheduleItemBudget::getBudgetId,budgetId); + List scheduleItemBudgetList = tbsScheduleItemBudgetService.list(scheduleLqw); + List scheduleItemBudgetIds = scheduleItemBudgetList.stream().map(TbsScheduleItemBudget::getId).collect(Collectors.toList()); + scheduleItemBudgetIds.add(0L); + List amountList = tbsScheduleItemBudgetService.listScheduleAmountByIds(scheduleItemBudgetIds); + List relateInfoList = amountList.stream().map(obj->{ + TbsCostBudgetRelateInfo info = CopierUtil.copy(obj,new TbsCostBudgetRelateInfo()); + info.setBudgetCode(budget.getBudgetNumber()); + info.setBudgetTitle(budget.getBudgetCode()); + return info; + }).collect(Collectors.toList()); + for (TbsCostBudgetRelateInfo info : relateInfoList) { + for (TbsScheduleItemBudget itemBudget : scheduleItemBudgetList) { + if(info.getScheduleItemBudgetId().equals(itemBudget.getId())){ + info.setScheduleItemName(itemBudget.getItemName()); + //关联当前项 + List budgetLogList = groupCurrentMap.get(itemBudget.getId()); + BigDecimal currentAmt = BigDecimal.ZERO; + if(budgetLogList!=null){ + for (TbsBudgetLog budgetLog : budgetLogList) { + //log负数,取正数 + currentAmt = currentAmt.add(budgetLog.getAmount().negate()); + } + } + info.setCurrentItemAmt(currentAmt); + break; + } + } + } + resultInfoList.addAll(relateInfoList); + } + return R.ok(resultInfoList); + } + + @GetMapping("removeDhxCost") + public R removeDhxCost(String code,String remark,Integer skipPayFlag){ + if(!code.contains("DHX")){ + return R.error("非DHX费用,不支持删除"); + } + List costApplys = tbsCostApplyMapper.selectList(new LambdaQueryWrapper() + .eq(TbsCostApply::getCode,code)); + if(costApplys.size()>0){ + TbsCostApply costApply = costApplys.get(0); + Long costApplyId = costApply.getId(); + deleteLogService.deleteCostApply(costApplyId,remark,skipPayFlag!=null&&skipPayFlag.equals(1),null); + BirActivityCenterGoodsUtil.buildBir(costApplyId); + } + return R.ok(); + } + + /** + * 移除费用申请 + * @param costCode + * @param remark + * @return + */ + @GetMapping("removeByAdmin2") + public R removeByAdmin2(String costCode,String remark,Integer skipPayFlag){ + TbsCostApply costApply = tbsCostApplyMapper.selectList(new LambdaQueryWrapper().eq(TbsCostApply::getCode,costCode)).get(0); + Long costApplyId = costApply.getId(); + deleteLogService.deleteCostApply(costApplyId,remark,skipPayFlag!=null&&skipPayFlag.equals(1),null); + BirActivityCenterGoodsUtil.buildBir(costApplyId); + return R.ok(); + } + + /** + * 移除费用申请 + * @param costApplyId + * @param remark + * @return + */ + @GetMapping("removeByAdmin") + public R removeByAdmin(Long costApplyId,String remark,Integer skipPayFlag){ + BirActivityCenterGoodsUtil.buildBir(costApplyId); + deleteLogService.deleteCostApply(costApplyId,remark,skipPayFlag!=null&&skipPayFlag.equals(1),null); + return R.ok(); + } + + + @GetMapping("rebuildBudgetLog") + public R dealCostBudget(Long costApplyId){ + if(costApplyId!=null){ + rebuildBudgetLog(costApplyId); + return R.ok(); + } + List costErrorBudgetDTOList = tbsCostApplyMapper.selectCostErrorBudgetDTO(); + for (TbsCostErrorBudgetDTO budgetDTO : costErrorBudgetDTOList) { + Long costApplyId2 = budgetDTO.getId(); + rebuildBudgetLog(costApplyId2); + } + return R.ok(); + } + + @GetMapping("rebuildBudgetLog3") + public void dealCostBudget3(){ + List costErrorBudgetDTOList = tbsCostApplyMapper.selectCostErrorBudgetDTO(); + for (TbsCostErrorBudgetDTO budgetDTO : costErrorBudgetDTOList) { + Long costApplyId = budgetDTO.getId(); + centerGoodsAmtToBudgetLog(costApplyId); + } + } + + @GetMapping("flushActivityCenterGoodsAmount") + public void flushActivityCenterGoodsAmount(){ + //List costErrorBudgetDTOList = tbsCostApplyMapper.selectCostErrorBudgetDTO(); + //过滤大额错误订单 +// costErrorBudgetDTOList = costErrorBudgetDTOList.stream().filter(a->a.getTotalActivityAmount() +// .subtract(a.getSumBudget()) +// .abs() +// .compareTo(BigDecimal.ONE)<1).collect(Collectors.toList()); + //List costApplyIds = costErrorBudgetDTOList.stream().map(TbsCostErrorBudgetDTO::getId).distinct().collect(Collectors.toList()); + List costApplyIds = new ArrayList<>(); + costApplyIds.add(263925L); + costApplyIds.add(263930L); + costApplyIds.add(270102L); + List notMatchAmtCenterGoodsList = activityCenterGoodsService.listNotMatchAmtCenterGoods(costApplyIds); + List activityIds = notMatchAmtCenterGoodsList.stream().map(a->a.getActivityId()).collect(Collectors.toList()); + for (Long activityId : activityIds) { + List activityCenterGoodsList = activityCenterGoodsService.listByActivityId(activityId); + Map> stringListMap = activityCenterGoodsList.stream() + .collect(Collectors.groupingBy(a->a.getSubjectId()+"_"+a.getCenterType()+"_"+a.getCenterId())); + for (String key : stringListMap.keySet()) { + List list = stringListMap.get(key); + BigDecimal totalAmountOfCenter = list.get(0).getCenterAmount(); + BigDecimal totalCenterGoods = BigDecimal.ZERO; + for (TbsActivityCenterGoods centerGoods : list) { + totalCenterGoods = totalCenterGoods.add(centerGoods.getCenterGoodsAmount()); + } + BigDecimal diff = totalAmountOfCenter.subtract(totalCenterGoods); + if(diff.compareTo(BigDecimal.ZERO)!=0&&diff.compareTo(BigDecimal.ONE)<0){ + TbsActivityCenterGoods centerGoods = list.get(0); + centerGoods.setCenterGoodsAmount(centerGoods.getCenterGoodsAmount().add(diff)); + activityCenterGoodsService.updateById(centerGoods); + } + } + } + } + + private void centerGoodsAmtToBudgetLog(Long costApplyId) { + LambdaQueryWrapper logLqw = new LambdaQueryWrapper<>(); + logLqw.eq(TbsBudgetLog::getCostApplyId, costApplyId); + logLqw.lt(TbsBudgetLog::getOptType,7); + List budgetLogList = tbsBudgetLogMapper.selectList(logLqw); + List activityCenterGoodsList = activityCenterGoodsService.listByCostApplyId(costApplyId); + if(budgetLogList.size()==activityCenterGoodsList.size()){ + List updBudgetLogList = new ArrayList<>(); + for (TbsBudgetLog budgetLog : budgetLogList) { + TbsBudgetLog tmpObject = null; + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + if(budgetLog.getActivityId().equals(centerGoods.getActivityId()) + &&budgetLog.getSubjectId().equals(centerGoods.getSubjectId()) + &&budgetLog.getCenterType().equals(centerGoods.getCenterType()) + &&budgetLog.getCenterId().equals(centerGoods.getCenterId()) + &&budgetLog.getTargetId().equals(centerGoods.getTargetId()) + //&&budgetLog.getScheduleItemBudgetId().equals(centerGoods.getScheduleItemBudgetId()) + ){ + budgetLog.setAmount(centerGoods.getCenterGoodsAmount().negate()); + tmpObject = budgetLog; + //tbsBudgetLogMapper.updateById(budgetLog); + } + } + if(tmpObject==null){ + break; + } + updBudgetLogList.add(tmpObject); + } + if(updBudgetLogList.size()== budgetLogList.size()){ + for (TbsBudgetLog budgetLog : updBudgetLogList) { + tbsBudgetLogMapper.updateById(budgetLog); + } + } + } + } + + /** + * 方法不可行 + */ + @Deprecated + //@GetMapping("rebuildBudgetLog2") + public void dealCostBudget2(){ + List costErrorBudgetDTOList = new ArrayList<>(); + costErrorBudgetDTOList.add(new TbsCostErrorBudgetDTO()); + //List costErrorBudgetDTOList = tbsCostApplyMapper.selectCostErrorBudgetDTO(); + for (TbsCostErrorBudgetDTO budgetDTO : costErrorBudgetDTOList) { + //Long costApplyId = budgetDTO.getId(); + Long costApplyId = 115356L; + //BigDecimal diff = budgetDTO.getTotalActivityAmount().subtract(budgetDTO.getSumBudget()); +// if(diff.abs().compareTo(BigDecimal.ONE)<0){ + LambdaQueryWrapper logLqw = new LambdaQueryWrapper<>(); + logLqw.eq(TbsBudgetLog::getCostApplyId,costApplyId); + logLqw.lt(TbsBudgetLog::getOptType,7); + List budgetLogList = tbsBudgetLogMapper.selectList(logLqw); + + List budgetCostItemList = tbsBudgetCostItemService.listByCostApplyId(costApplyId); + + if(budgetCostItemList.size()==budgetLogList.size()){ + for (TbsBudgetLog budgetLog : budgetLogList) { + for (TbsBudgetCostItem costItem : budgetCostItemList) { + if(budgetLog.getActivityId().equals(costItem.getActivityId()) + &&budgetLog.getSubjectId().equals(costItem.getSubjectId()) + &&budgetLog.getCenterType().equals(costItem.getCenterType()) + &&budgetLog.getCenterId().equals(costItem.getCenterId()) + &&budgetLog.getTargetId().equals(costItem.getTargetId()) + &&budgetLog.getScheduleItemBudgetId().equals(costItem.getScheduleItemBudgetId()) + ){ + budgetLog.setAmount(costItem.getCenterGoodsAmount().negate()); + tbsBudgetLogMapper.updateById(budgetLog); + } + } + } +// } + + } + return; + } + } + + + public void rebuildBudgetLog(Long costApplyId) { + TbsCostApply costApply = tbsCostApplyMapper.selectById(costApplyId); + //调整center_goods和budget_log之间的占用 + BigDecimal centerGoodsTotal = tbsCostApplyMapper.sumCostCenterGoodsAmount(costApplyId); + BigDecimal costAmt = costApply.getTotalActivityAmount(); + //判断合计金额与预算是否有差距过大 + boolean diffCostCenterGoods = costAmt.subtract(centerGoodsTotal).intValue()!=0; + if(diffCostCenterGoods){ + log.error("{}金额错误",costApply.getId()); + return; + } + //BigDecimal costAmountBudget = tbsCostApplyMapper.sumCostAmountBudget(costApplyId); + + //判断是否有释放,没有直接清理(后续可修改为全部清理) + + LambdaQueryWrapper budgetLogLqw = new LambdaQueryWrapper<>(); + budgetLogLqw.eq(TbsBudgetLog::getCostApplyId,costApply.getId()); + budgetLogLqw.eq(TbsBudgetLog::getOptType,1); + List budgetLogList = tbsBudgetLogMapper.selectList(budgetLogLqw); + + List activityCenterGoodsList = tbsActivityCenterGoodsService.listByCostApplyId(costApplyId); + + List updateLogIdsList = new ArrayList<>(); + updateLogIdsList.add(0L); + + if(activityCenterGoodsList.size()==budgetLogList.size()){ + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + for (TbsBudgetLog budgetLog : budgetLogList) { + if( budgetLog.getActivityId().equals(centerGoods.getActivityId()) + &&budgetLog.getSubjectId().equals(centerGoods.getSubjectId()) + && budgetLog.getCenterType().equals(centerGoods.getCenterType()) + && budgetLog.getCenterId().equals(centerGoods.getCenterId()) + && budgetLog.getTargetId().equals(centerGoods.getTargetId()) + ){ + budgetLog.setAmount(centerGoods.getCenterGoodsAmount().negate()); + tbsBudgetLogMapper.updateById(budgetLog); + updateLogIdsList.add(budgetLog.getId()); + break; + } + } + } + + LambdaQueryWrapper delBudgetLogLqw = new LambdaQueryWrapper<>(); + delBudgetLogLqw.eq(TbsBudgetLog::getCostApplyId,costApply.getId()); + delBudgetLogLqw.notIn(TbsBudgetLog::getId,updateLogIdsList); + tbsBudgetLogMapper.delete(delBudgetLogLqw); + } + } + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyTestController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyTestController.java new file mode 100644 index 0000000..7917759 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyTestController.java @@ -0,0 +1,629 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.qs.serve.common.model.annotation.LimitSubmit; +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.BudgetLogOptFlag; +import com.qs.serve.common.model.enums.SystemModule; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsRegion2Service; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.sys.entity.SysTableTemp; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysTableTempMapper; +import com.qs.serve.modules.sys.service.SysDeleteLogService; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.bo.TbsActivityBo; +import com.qs.serve.modules.tbs.entity.bo.TbsCostApplyActivityBo; +import com.qs.serve.modules.tbs.entity.bo.TbsCostApplyBo; +import com.qs.serve.modules.tbs.entity.dto.TbsActNotMatchAmtCenterGoods; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetScheduleWithAmount; +import com.qs.serve.modules.tbs.entity.dto.TbsCostBudgetRelateInfo; +import com.qs.serve.modules.tbs.entity.dto.TbsCostErrorBudgetDTO; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetTableResultVo; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetTableVo; +import com.qs.serve.modules.tbs.entity.vo.TbsCostApplyVo; +import com.qs.serve.modules.tbs.mapper.TbsBudgetConditionMapper; +import com.qs.serve.modules.tbs.mapper.TbsBudgetLogMapper; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.tbs.service.impl.TbsCostApplyOperationServiceImpl; +import com.qs.serve.modules.vtb.common.VtbVerificationState; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 预算 费用申请 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/costTest") +public class TbsCostApplyTestController { + + private TbsCostApplyPart1Service costApplyPart1Service; + private TbsCostContractService costContractService; + private TbsCostApplyService tbsCostApplyService; + private TbsActivityService tbsActivityService; + private TbsActivityTemplateService tbsActivityTemplateService; + private TbsActivityCenterGoodsService tbsActivityCenterGoodsService; + private BmsSupplierService bmsSupplierService; + private final TbsBudgetLogMapper tbsBudgetLogMapper; + private BmsRegion2Service region2Service; + private SysUserService sysUserService; + private TbsBudgetApplicationService budgetApplicationService; + private TbsBudgetService tbsBudgetService; + private SysPostUserService postUserService; + private TbsCostApplyOperationServiceImpl tbsCostApplyOperationServiceImpl; + private TbsBudgetMatchApplication tbsBudgetMatchApplication; + private TbsBudgetCostItemService tbsBudgetCostItemService; + private TbsBudgetLogService tbsBudgetLogService; + private TbsScheduleItemBudgetService tbsScheduleItemBudgetService; + private SysDeleteLogService deleteLogService; + private TbsCostApplyMapper tbsCostApplyMapper; + private TbsCostChangeInfoService tbsCostChangeInfoService; + private TbsBudgetCostItemService budgetCostItemService; + private TbsBudgetLogService budgetLogService; + private SysTableTempMapper sysTableTempMapper; + private TbsBudgetConditionMapper tbsBudgetConditionMapper; + private VtbVerificationMapper vtbVerificationMapper; + + + @GetMapping("/toDoBack") + public R toDoBack(){ + Long[] ids = new Long[]{ + + }; + for (Long id : ids) { + backCommit(id+""); + } + return R.ok(); + } + + /** + * 回退进行中的流程 + * @param costApplyId + * @return + */ + public boolean backCommit( String costApplyId){ + TbsCostApply costApply = tbsCostApplyService.getById(costApplyId); + if(costApply.getChargeState().equals(TbsCostApplyState.State_2_actioning.getCode())|| + costApply.getChargeState().equals(TbsCostApplyState.State_1_apply.getCode())){ + //判断是否有核销 + List vtbVerificationList = vtbVerificationMapper.selectList(new LambdaQueryWrapper() + .eq(VtbVerification::getCostApplyId,costApplyId) + ); + //有完成的不进行回退 + for (VtbVerification verification : vtbVerificationList) { + if (verification.getVerificationState().equals(VtbVerificationState.Finished.getCode())){ + SysTableTemp sysTableTemp = new SysTableTemp(); + sysTableTemp.setTableName("VtbVerification"); + sysTableTemp.setTableId(""+verification.getId()); + sysTableTemp.setRemark(verification.getVerificationCode()); + sysTableTemp.setOptionTitle("关闭核销失败"); + sysTableTempMapper.insert(sysTableTemp); + return false; + } + } + //更新核销状态 + for (VtbVerification verification : vtbVerificationList) { + if (verification.getVerificationState().equals(VtbVerificationState.Commiting.getCode())){ + verification.setVerificationState(VtbVerificationState.Close.getCode()); + SysTableTemp sysTableTemp = new SysTableTemp(); + sysTableTemp.setTableName("VtbVerification"); + sysTableTemp.setTableId(""+verification.getId()); + sysTableTemp.setRemark(verification.getVerificationCode()); + sysTableTemp.setOptionTitle("关闭核销"); + sysTableTempMapper.insert(sysTableTemp); + vtbVerificationMapper.updateById(verification); + } + } + //是否budgetLog费用 + LambdaQueryWrapper bLqw = new LambdaQueryWrapper<>(); + bLqw.eq(TbsBudgetLog::getCostApplyId,costApplyId); + List dbbudgetLogs = budgetLogService.list(bLqw); + for (TbsBudgetLog budgetLog : dbbudgetLogs) { + budgetLog.setRemark("toDel3"); + } + budgetLogService.updateBatchById(dbbudgetLogs); + List budIds = dbbudgetLogs.stream().map(TbsBudgetLog::getId).collect(Collectors.toList()); + budgetLogService.removeBatchByIds(budIds); + //移除TbsBudgetCostItem + LambdaQueryWrapper citemLqw = new LambdaQueryWrapper<>(); + citemLqw.eq(TbsBudgetCostItem::getCostApplyId,costApplyId); + List itemList = budgetCostItemService.list(citemLqw); + // 设置remark标记防止误删,移除旧的记录 + for (TbsBudgetCostItem costItem : itemList) { + costItem.setRemark("toDel3"); + } + budgetCostItemService.updateBatchById(itemList); + List itemIds = itemList.stream().map(TbsBudgetCostItem::getId).collect(Collectors.toList()); + budgetCostItemService.removeBatchByIds(itemIds); + //修改状态 + costApply.setChargeState(TbsCostApplyState.State_0_unPublish.getCode()); + tbsCostApplyMapper.updateById(costApply); + + SysTableTemp sysTableTemp = new SysTableTemp(); + sysTableTemp.setTableName("costApply"); + sysTableTemp.setTableId(""+costApply.getId()); + sysTableTemp.setOptionTitle("退回草稿"); + sysTableTempMapper.insert(sysTableTemp); + } + return true; + } + + /** + * 判断预算商品的条件是否匹配 + * @return + */ + @GetMapping("matchGoods") + public R matchGoods(){ + for (int i = 0; i < 1000; i++) { + matchGoods1000(); + } + return R.ok(); + } + + //@GetMapping("reBuildGoods") + public R reBuildGoods(){ + List costIds = sysTableTempMapper.getGoodsUnMatchCostIds(); + for (Long costId : costIds) { + //overRebuildCost(costId); + } + return R.ok(); + } + + + private void matchGoods1000() { + List conditionList = tbsBudgetConditionMapper.selectList(new QueryWrapper<>()); + Map> conditionListMap = conditionList.stream().collect(Collectors.groupingBy(TbsBudgetCondition::getBudgetId)); + List budgetCostItemList = sysTableTempMapper.getListByCostId(); + if(budgetCostItemList.size()<1){ + Assert.throwEx("匹配完成"); + } + List mIds = new ArrayList<>(); + mIds.add(0L); + List umIds = new ArrayList<>(); + umIds.add(0L); + for (TbsBudgetCostItem item : budgetCostItemList) { + List conditions = conditionListMap.get(item.getBudgetId()); + if(conditions==null||conditions.size()<1){ + mIds.add(item.getId()); + continue; + } + boolean m = false; + for (TbsBudgetCondition condition : conditions) { + String itemLevels = item.getTargetLevelPathIds(); + String conGoodsId = condition.getTargetId()+""; + if(itemLevels.equals(conGoodsId) || itemLevels.contains(conGoodsId+"_")){ + mIds.add(item.getId()); + m = true; + break; + } + } + //没有匹配到预算 + if(!m){ + umIds.add(item.getId()); + } + } + sysTableTempMapper.updateBudgetCoistItemState(mIds,1); + sysTableTempMapper.updateBudgetCoistItemState(umIds,2); + } + + + + public void saveTableTmp(SysTableTemp sysTableTemp){ + sysTableTempMapper.insert(sysTableTemp); + } + + + /** + * 有bug + * @param costApplyId + * @return + */ + public R overRebuildCost(Long costApplyId){ + SysTableTemp sysTableTemp = new SysTableTemp(); + sysTableTemp.setTableName("tbs_cost_apply"); + sysTableTemp.setTableId(""+costApplyId); + //后缀数字 2 标识第几次批次 + sysTableTemp.setOptionTitle("overRebuildCost2"); + + LambdaQueryWrapper checkExist = new LambdaQueryWrapper<>(); + long count = sysTableTempMapper.selectCount(checkExist.eq(SysTableTemp::getTableId,costApplyId) + .eq(SysTableTemp::getOptionTitle,sysTableTemp.getOptionTitle())); + if(count>0){ + return R.ok(); + } + + TbsCostApply costApply = tbsCostApplyService.getById(costApplyId); + TbsBudgetTableResultVo resultVo = tbsBudgetMatchApplication.getMatchResult(costApplyId ,false,true); + + List activityList = tbsActivityService.listByCostApplyId(costApplyId); + + SysUser sysUser = sysUserService.getById(costApply.getUserId()); + + // 未命中预算 + List costUnItems = new ArrayList<>(); + // 所有记录情况 + List allBudgetItem = new ArrayList<>(); + // 命中的预算 + List budgetLogList = new ArrayList<>(); + + Map matchItemBudgetsMap = resultVo.getMatchItemBudgetsMap(); + for (TbsActivityCenterGoods centerGoods : resultVo.getActivityCenterGoodsList()) { + 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()); + + if(centerGoods.getScheduleItemBudgetId()==null){ + TbsCostUnItem costUnItem = new TbsCostUnItem(); + costUnItem.setCostApplyId(centerGoods.getCostApplyId()); + costUnItem.setActivityId(centerGoods.getActivityId()); + costUnItem.setActivityCode(centerGoods.getActivityCode()); + costUnItem.setSubjectId(centerGoods.getSubjectId()); + costUnItem.setSubjectCode(centerGoods.getSubjectCode()); + costUnItem.setSubjectName(centerGoods.getSubjectName()); + costUnItem.setCenterType(centerGoods.getCenterType()); + costUnItem.setCenterId(centerGoods.getCenterId()); + costUnItem.setCenterCode(centerGoods.getCenterCode()); + costUnItem.setCenterName(centerGoods.getCenterName()); + costUnItem.setAmount(centerGoods.getCenterGoodsAmount()); + costUnItem.setTargetType(centerGoods.getTargetType()); + costUnItem.setTargetId(centerGoods.getTargetId()); + costUnItem.setTargetCode(centerGoods.getTargetCode()); + costUnItem.setTargetName(centerGoods.getTargetName()); + costUnItem.setTargetLevelPathIds(centerGoods.getTargetLevelPathIds()); + costUnItem.setTargetLevelPathNames(centerGoods.getTargetLevelPathNames()); + costUnItem.setActStartDate(centerGoods.getActStartDate()); + costUnItem.setActEndDate(centerGoods.getActEndDate()); + costUnItem.setPreStartDate(centerGoods.getPreStartDate()); + costUnItem.setPreEndDate(centerGoods.getPreEndDate()); + costUnItem.setPreCheckDate(centerGoods.getPreCheckDate()); + costUnItem.setSupplierId(centerGoods.getSupplierId()); + costUnItem.setSupplierCode(centerGoods.getSupplierCode()); + costUnItem.setSupplierName(centerGoods.getSupplierName()); + costUnItems.add(costUnItem); + + costItem.setBudgetId(0L); + costItem.setScheduleId(0L); + costItem.setScheduleItemId(0L); + costItem.setScheduleItemAmount(BigDecimal.ZERO); + costItem.setScheduleItemAmountUsed(BigDecimal.ZERO); + costItem.setScheduleItemAmountApply(BigDecimal.ZERO); + costItem.setScheduleItemBudgetId(0L); + + }else { + TbsScheduleItemBudget itemBudget = matchItemBudgetsMap.get(centerGoods.getScheduleItemBudgetId()); + TbsActivity currActivity = null; + for (TbsActivity activity : activityList) { + if(centerGoods.getActivityId().equals(activity.getId())){ + currActivity = activity; + } + } + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.buildTbsBudgetLog(BudgetLogOptFlag.State_1,sysUser, costApply, itemBudget, centerGoods,centerGoods.getCenterGoodsAmount(),currActivity); + budgetLog.setRemark("tr2"); + budgetLogList.add(budgetLog); + + costItem.setBudgetId(itemBudget.getBudgetId()); + costItem.setScheduleId(itemBudget.getScheduleId()); + costItem.setScheduleItemId(itemBudget.getScheduleItemId()); + costItem.setScheduleItemName(itemBudget.getItemName()); + costItem.setScheduleItemAmount(itemBudget.getFinalBudgetAmount()); + costItem.setScheduleItemAmountUsed(itemBudget.getUsedBudgetAmount()); + costItem.setScheduleItemAmountApply(itemBudget.getUnUsedBudgetAmount()); + costItem.setScheduleItemBudgetId(itemBudget.getId()); + } + allBudgetItem.add(costItem); + } + + //保存 + if(costUnItems.size() > 0 || budgetLogList.size() < 1){ + sysTableTemp.setResultMsg("预算未匹配"); + StringBuilder strBuild = new StringBuilder(); + for (TbsCostUnItem item : costUnItems) { + String string = "【科目:" + item.getSubjectCode() + item.getSubjectName() + + " 成本中心:" + item.getCenterCode() + item.getCenterName() + + " 品类:" + item.getTargetLevelPathNames() + + " 时间:" + item.getActStartDate() + "-" + item.getActEndDate()+"】 \t "; + strBuild.append(string); + } + sysTableTemp.setRemark(strBuild.toString()); + saveTableTmp(sysTableTemp); + log.error("预算未匹配:{}",costApplyId); + return R.error(); + }else { + String budgetCodes = budgetLogList.stream().map(TbsBudgetLog::getBudgetCode) + .distinct().collect(Collectors.joining(",")); + sysTableTemp.setResultMsg("预算超支"); + sysTableTemp.setRemark("超支的预算编码:"+budgetCodes); + saveTableTmp(sysTableTemp); + log.error("预算超支:{}",costApplyId); + } + + //判断是否正常数据 + LambdaQueryWrapper citemLqw = new LambdaQueryWrapper<>(); + citemLqw.eq(TbsBudgetCostItem::getCostApplyId,costApplyId); + List itemList = budgetCostItemService.list(citemLqw); + + // 设置remark标记防止误删,移除旧的记录 + for (TbsBudgetCostItem costItem : itemList) { + costItem.setRemark("toDel2"); + } + budgetCostItemService.updateBatchById(itemList); + List itemIds = itemList.stream().map(TbsBudgetCostItem::getId).collect(Collectors.toList()); + budgetCostItemService.removeBatchByIds(itemIds); + //重新保存 + budgetCostItemService.saveBatch(allBudgetItem); + + // 设置remark标记防止误删,移除旧的记录 + LambdaQueryWrapper bLqw = new LambdaQueryWrapper<>(); + bLqw.eq(TbsBudgetLog::getCostApplyId,costApplyId); + List dbbudgetLogs = budgetLogService.list(bLqw); + for (TbsBudgetLog budgetLog : dbbudgetLogs) { + budgetLog.setRemark("toDel2"); + } + budgetLogService.updateBatchById(dbbudgetLogs); + List budIds = dbbudgetLogs.stream().map(TbsBudgetLog::getId).collect(Collectors.toList()); + budgetLogService.removeBatchByIds(budIds); + //重新保存 + if(CollectionUtil.isNotEmpty(budgetLogList)){ + budgetLogService.saveBatch(budgetLogList); + } + return R.error("预算超支"); + } + + /** + * 重写适配预算 + * @param costApplyId + * @return + */ + //@GetMapping("/rebuild") + public R rebuildCost(Long costApplyId){ + + SysTableTemp sysTableTemp = new SysTableTemp(); + sysTableTemp.setTableName("tbs_cost_apply"); + sysTableTemp.setTableId(""+costApplyId); + sysTableTemp.setOptionTitle("rebuildCost"); + + TbsCostApply costApply = tbsCostApplyService.getById(costApplyId); + + TbsBudgetTableResultVo resultVo = tbsBudgetMatchApplication.getMatchResult(costApplyId ,false,false); + + List activityList = tbsActivityService.listByCostApplyId(costApplyId); + + SysUser sysUser = sysUserService.getById(costApply.getUserId()); + + // 未命中预算 + List costUnItems = new ArrayList<>(); + // 所有记录情况 + List allBudgetItem = new ArrayList<>(); + // 命中的预算 + List budgetLogList = new ArrayList<>(); + + Map matchItemBudgetsMap = resultVo.getMatchItemBudgetsMap(); + for (TbsActivityCenterGoods centerGoods : resultVo.getActivityCenterGoodsList()) { + 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()); + + if(centerGoods.getScheduleItemBudgetId()==null){ + TbsCostUnItem costUnItem = new TbsCostUnItem(); + costUnItem.setCostApplyId(centerGoods.getCostApplyId()); + costUnItem.setActivityId(centerGoods.getActivityId()); + costUnItem.setActivityCode(centerGoods.getActivityCode()); + costUnItem.setSubjectId(centerGoods.getSubjectId()); + costUnItem.setSubjectCode(centerGoods.getSubjectCode()); + costUnItem.setSubjectName(centerGoods.getSubjectName()); + costUnItem.setCenterType(centerGoods.getCenterType()); + costUnItem.setCenterId(centerGoods.getCenterId()); + costUnItem.setCenterCode(centerGoods.getCenterCode()); + costUnItem.setCenterName(centerGoods.getCenterName()); + costUnItem.setAmount(centerGoods.getCenterGoodsAmount()); + costUnItem.setTargetType(centerGoods.getTargetType()); + costUnItem.setTargetId(centerGoods.getTargetId()); + costUnItem.setTargetCode(centerGoods.getTargetCode()); + costUnItem.setTargetName(centerGoods.getTargetName()); + costUnItem.setTargetLevelPathIds(centerGoods.getTargetLevelPathIds()); + costUnItem.setTargetLevelPathNames(centerGoods.getTargetLevelPathNames()); + costUnItem.setActStartDate(centerGoods.getActStartDate()); + costUnItem.setActEndDate(centerGoods.getActEndDate()); + costUnItem.setPreStartDate(centerGoods.getPreStartDate()); + costUnItem.setPreEndDate(centerGoods.getPreEndDate()); + costUnItem.setPreCheckDate(centerGoods.getPreCheckDate()); + costUnItem.setSupplierId(centerGoods.getSupplierId()); + costUnItem.setSupplierCode(centerGoods.getSupplierCode()); + costUnItem.setSupplierName(centerGoods.getSupplierName()); + costUnItems.add(costUnItem); + + costItem.setBudgetId(0L); + costItem.setScheduleId(0L); + costItem.setScheduleItemId(0L); + costItem.setScheduleItemAmount(BigDecimal.ZERO); + costItem.setScheduleItemAmountUsed(BigDecimal.ZERO); + costItem.setScheduleItemAmountApply(BigDecimal.ZERO); + costItem.setScheduleItemBudgetId(0L); + + }else { + TbsScheduleItemBudget itemBudget = matchItemBudgetsMap.get(centerGoods.getScheduleItemBudgetId()); + TbsActivity currActivity = null; + for (TbsActivity activity : activityList) { + if(centerGoods.getActivityId().equals(activity.getId())){ + currActivity = activity; + } + } + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.buildTbsBudgetLog(BudgetLogOptFlag.State_1,sysUser, costApply, itemBudget, centerGoods,centerGoods.getCenterGoodsAmount(),currActivity); + budgetLogList.add(budgetLog); + + costItem.setBudgetId(itemBudget.getBudgetId()); + costItem.setScheduleId(itemBudget.getScheduleId()); + costItem.setScheduleItemId(itemBudget.getScheduleItemId()); + costItem.setScheduleItemName(itemBudget.getItemName()); + costItem.setScheduleItemAmount(itemBudget.getFinalBudgetAmount()); + costItem.setScheduleItemAmountUsed(itemBudget.getUsedBudgetAmount()); + costItem.setScheduleItemAmountApply(itemBudget.getUnUsedBudgetAmount()); + costItem.setScheduleItemBudgetId(itemBudget.getId()); + } + allBudgetItem.add(costItem); + } + + //保存 + if(costUnItems.size() > 0 || budgetLogList.size() < 1){ + sysTableTemp.setResultMsg("预算未匹配"); + saveTableTmp(sysTableTemp); + log.error("预算未匹配:{}",costApplyId); + return R.error(); + } + + //判断是否正常数据 + LambdaQueryWrapper citemLqw = new LambdaQueryWrapper<>(); + citemLqw.eq(TbsBudgetCostItem::getCostApplyId,costApplyId); + List itemList = budgetCostItemService.list(citemLqw); + + + boolean isMatch = true; + for (TbsBudgetCostItem item1 : allBudgetItem) { + boolean isMatchItem = false; + for (TbsBudgetCostItem item2 : itemList) { + if(item1.getCenterGoodItemId().equals(item2.getCenterGoodItemId())&&item1.getScheduleItemBudgetId().equals(item2.getScheduleItemBudgetId())){ + isMatchItem = true; + break; + } + } + if(!isMatchItem){ + isMatch = false; + } + } + if(isMatch){ + sysTableTemp.setResultMsg("预算正常"); + saveTableTmp(sysTableTemp); + return R.ok("预算正常"); + } + + sysTableTemp.setResultMsg("需重新生成但含释放"); + saveTableTmp(sysTableTemp); + return R.ok("预算正常"); + + +// // 设置remark标记防止误删,移除旧的记录 +// for (TbsBudgetCostItem costItem : itemList) { +// costItem.setRemark("toDel"); +// } +// budgetCostItemService.updateBatchById(itemList); +// List itemIds = itemList.stream().map(TbsBudgetCostItem::getId).collect(Collectors.toList()); +// budgetCostItemService.removeBatchByIds(itemIds); +// //重新保存 +// budgetCostItemService.saveBatch(allBudgetItem); +// +// // 设置remark标记防止误删,移除旧的记录 +// LambdaQueryWrapper bLqw = new LambdaQueryWrapper<>(); +// bLqw.eq(TbsBudgetLog::getCostApplyId,costApplyId); +// List dbbudgetLogs = budgetLogService.list(bLqw); +// for (TbsBudgetLog budgetLog : dbbudgetLogs) { +// budgetLog.setRemark("toDel"); +// } +// budgetLogService.updateBatchById(dbbudgetLogs); +// List budIds = dbbudgetLogs.stream().map(TbsBudgetLog::getId).collect(Collectors.toList()); +// budgetLogService.removeBatchByIds(budIds); +// //重新保存 +// if(CollectionUtil.isNotEmpty(budgetLogList)){ +// budgetLogService.saveBatch(budgetLogList); +// } +// +// sysTableTemp.setResultMsg("重新生成"); +// tableTempMapper.insert(sysTableTemp); +// //移除历史释放金额 +// +// //根据释放记录,重新生成释放金额 +// +// +// return R.ok(); + } + + + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostContractController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostContractController.java new file mode 100644 index 0000000..56c1bc1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostContractController.java @@ -0,0 +1,205 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.CollectionUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.entity.BmsDutyInfo; +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; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tbs.entity.TbsCostContract; +import com.qs.serve.modules.tbs.service.TbsCostContractService; + +import javax.validation.Valid; +import java.util.Arrays; +import java.util.List; + +/** + * 预算 费用合同 + * @author YenHex + * @since 2023-03-14 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/costContract") +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(); + } + + /** + * 列表 + * @param param + * @return + */ + //@GetMapping("/list") + @PreAuthorize("hasRole('tbs:costApply:query')") + public R> getList(TbsCostContract param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = tbsCostContractService.list(lqw); + for (TbsCostContract contract : list) { + if(CollectionUtil.isNotEmpty(contract.getAttachIds())){ + List attachIds = Arrays.asList(contract.getAttachIds()); + List attachList = attachService.listByIds(attachIds); + contract.setAttachInfoList(attachList); + } + } + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + //@GetMapping("/page") + @PreAuthorize("hasRole('tbs:costApply:query')") + public R> getPage(TbsCostContract param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = tbsCostContractService.list(lqw); + for (TbsCostContract contract : list) { + if(CollectionUtil.isNotEmpty(contract.getAttachIds())){ + List attachIds = Arrays.asList(contract.getAttachIds()); + List attachList = attachService.listByIds(attachIds); + contract.setAttachInfoList(attachList); + } + } + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getByCostApplyId/{id}") + @SysLog(module = SystemModule.Budget, title = "费用合同", biz = BizType.QUERY) + @PreAuthorize("hasRole('tbs:costApply:query')") + public R getById(@PathVariable("id") Long id){ + TbsCostContract contract = tbsCostContractService.getByCostApplyId(id); + if(contract!=null&&CollectionUtil.isNotEmpty(contract.getAttachIds())){ + List attachIds = Arrays.asList(contract.getAttachIds()); + List attachList = attachService.listByIds(attachIds); + contract.setAttachInfoList(attachList); + } + return R.ok(contract); + } + + + /** + * 更新 + * @param param + * @return + */ + //@PostMapping("/updateByCostApplyId") + @SysLog(module = SystemModule.Budget, title = "费用合同", biz = BizType.UPDATE) + @PreAuthorize("hasRole('tbs:costApply:update')") + public R updateById(@RequestBody @Valid TbsCostContractBo param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostContract::getCostApplyId,param.getCostApplyId()); + TbsCostContract contract = tbsCostContractService.getOne(lqw,false); + if(contract==null){ + return R.error2(); + } + contract.setContractName(param.getContractName()); + contract.setContractAmount(param.getContractAmount()); + contract.setContractCondition(param.getContractCondition()); + contract.setAttachIds(param.getAttachIds()); + contract.setSignTime(param.getSignTime()); + contract.setExpireTime(param.getExpireTime()); + contract.setBusinessCompany(param.getBusinessCompany()); + contract.setDutyNumber(param.getDutyNumber()); + BmsDutyInfo bmsDutyInfo = bmsDutyInfoService.getByDutyNumber(param.getDutyNumber()); + if(bmsDutyInfo!=null){ + contract.setOaDeptId(bmsDutyInfo.getOaDeptId()); + } + boolean result = tbsCostContractService.updateById(contract); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.Budget, title = "费用合同", biz = BizType.INSERT) + @PreAuthorize("hasRole('tbs:costApply:insert')") + public R save(@RequestBody @Valid TbsCostContractBo param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostContract::getCostApplyId,param.getCostApplyId()); + TbsCostContract contract = tbsCostContractService.getOne(lqw,false); + if(contract==null){ + contract = CopierUtil.copy(param,new TbsCostContract()); + }else { + contract.setContractName(param.getContractName()); + contract.setContractAmount(param.getContractAmount()); + contract.setContractCondition(param.getContractCondition()); + contract.setAttachIds(param.getAttachIds()); + contract.setSignTime(param.getSignTime()); + contract.setExpireTime(param.getExpireTime()); + contract.setPayee(param.getPayee()); + contract.setBankName(param.getBankName()); + contract.setBankAccount(param.getBankAccount()); + contract.setSealName(param.getSealName()); + contract.setSealId(param.getSealId()); + contract.setSealNum(param.getSealNum()); + contract.setFileNum(param.getFileNum()); + contract.setBusinessCompany(param.getBusinessCompany()); + contract.setDutyNumber(param.getDutyNumber()); + BmsDutyInfo bmsDutyInfo = bmsDutyInfoService.getByDutyNumber(param.getDutyNumber()); + if(bmsDutyInfo!=null){ + contract.setOaDeptId(bmsDutyInfo.getOaDeptId()); + } + } + if(contract.getId()==null){ + tbsCostContractService.save(contract); + }else { + tbsCostContractService.updateById(contract); + } + return R.ok(); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteByCostApplyId/{id}") + @SysLog(module = SystemModule.Budget, title = "费用合同", biz = BizType.DELETE) + @PreAuthorize("hasRole('tbs:costApply:delete')") + public R deleteById(@PathVariable("id") String id){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostContract::getCostApplyId,id); + boolean result = tbsCostContractService.remove(lqw); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostTodoCheckController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostTodoCheckController.java new file mode 100644 index 0000000..031b995 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostTodoCheckController.java @@ -0,0 +1,117 @@ +package com.qs.serve.modules.tbs.controller; + +import com.qs.serve.common.model.annotation.LimitSubmit; +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.modules.seeyon.entity.CtpAffairQo; +import com.qs.serve.modules.seeyon.entity.bo.CtpAddNodeParam; +import com.qs.serve.modules.tbs.entity.TbsCostTodo; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.entity.bo.TbsSubmitToDoBo; +import com.qs.serve.modules.tbs.entity.vo.CtpAffairVo; +import com.qs.serve.modules.tbs.mapper.TbsCostTodoMapper; +import com.qs.serve.modules.tbs.service.impl.TbsCostTodoOperationServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * 预算 协议条款(审批) + * @author YenHex + * @since 2023-02-17 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/costTodo") +public class TbsCostTodoCheckController { + + private final TbsCostTodoMapper tbsCostTodoMapper; + private TbsCostTodoOperationServiceImpl costTodoOperationService; + + /** + * 提交审批 + * @param param + * @return + */ + @PostMapping("/submit") + public R save(@RequestBody TbsSubmitToDoBo param){ + costTodoOperationService.submit(param); + return R.ok(); + } + + /** + * 审批列表(用于详情页) + * @param targetId + * @return + */ + @GetMapping("/ListAffairs") + public R> pageAffair(String targetId){ + TbsCostTodo costTodo = tbsCostTodoMapper.selectById(targetId); + return costTodoOperationService.pageAffairV2(targetId,costTodo.getTodoCode()); + } + + /** + * 审批列表(翻页) + * @param param + * @return + */ + @GetMapping("/pageMemberAffair") + public R> pageMemberAffair(CtpAffairQo param){ + return costTodoOperationService.pageMemberAffair(param); + } + + /** + * 提交审批节点 + * @return + */ + @LimitSubmit + @PostMapping("/commitAffair") + @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.DELETE) + @PreAuthorize("hasRole('tbs:costApply:commit')") + public R commitAffair(@RequestBody @Valid TbsAffairCommitBo affairCommit){ + return costTodoOperationService.commitAffair(affairCommit); + } + + /** + * 补偿按钮 + * @param id + * @return + */ + @LimitSubmit + @PostMapping("/compensate/{id}") + @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.UPDATE) + public R compensate(@PathVariable("id") String id){ + return costTodoOperationService.runCompensate(id); + } + + /** + * 加签 + * @param param + * @return + */ + @LimitSubmit + @PostMapping("/addNode") + @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.DELETE) + public R addNode(@RequestBody CtpAddNodeParam param){ + return costTodoOperationService.addNode(param); + } + + /** + * 获取未完成审批统计(个人) + * @return + */ + @PostMapping("/getAffairUnfinished") + public R getUnfinished(){ + return costTodoOperationService.getUnfinished(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostTodoController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostTodoController.java new file mode 100644 index 0000000..6403463 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostTodoController.java @@ -0,0 +1,162 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.service.SysAttachService; +import com.qs.serve.modules.tbs.common.TbsCommonCheckState; +import com.qs.serve.modules.tbs.service.impl.TbsCostTodoOperationServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tbs.entity.TbsCostTodo; +import com.qs.serve.modules.tbs.service.TbsCostTodoService; + +import javax.validation.Valid; +import java.util.Arrays; +import java.util.List; + +/** + * 预算 协议条款(数据) + * @author YenHex + * @since 2023-02-17 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/costTodo") +public class TbsCostTodoController { + + private TbsCostTodoService tbsCostTodoService; + private TbsCostTodoOperationServiceImpl costTodoOperationService; + private SysAttachService attachService; + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + public R save(@RequestBody @Valid TbsCostTodo param){ + String todoCode = "XY"+ CodeGenUtil.generate(CodeGenUtil.SourceKey.AgreeCheck); + param.setTodoCode(todoCode); + param.setFinishedFlag(null); + param.setCheckStatus(0); + tbsCostTodoService.save(param); + return R.ok(); + } + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(TbsCostTodo param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = tbsCostTodoService.list(lqw); + for (TbsCostTodo tbsCostTodo : list) { + if(tbsCostTodo.getAttachIds()!=null&&tbsCostTodo.getAttachIds().length>0){ + List list2 = attachService.listByIds(Arrays.asList(tbsCostTodo.getAttachIds())); + tbsCostTodo.setAttachList(list2); + } + if(tbsCostTodo.getAttachIds2()!=null&&tbsCostTodo.getAttachIds2().length>0){ + List list2 = attachService.listByIds(Arrays.asList(tbsCostTodo.getAttachIds2())); + tbsCostTodo.setAttachList2(list2); + } + if(tbsCostTodo.getCheckStatus().equals(1)){ + costTodoOperationService.runCompensate(tbsCostTodo.getId()+""); + } + } + return R.ok(list); + } + + + + /** + * 我的翻页 + * @param param + * @return + */ + @GetMapping("/myPage") + public R> myPage(TbsCostTodo param){ + param.setCreateBy(AuthContextUtils.getSysUserId()); + PageUtil.startPage(); + List list = tbsCostTodoService.selectTbsCostTodoList(param); + return R.byPageHelperList(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(TbsCostTodo param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = tbsCostTodoService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + TbsCostTodo tbsCostTodo = tbsCostTodoService.getById(id); + if(tbsCostTodo.getAttachIds()!=null&&tbsCostTodo.getAttachIds().length>0){ + List list = attachService.listByIds(Arrays.asList(tbsCostTodo.getAttachIds())); + tbsCostTodo.setAttachList(list); + } + if(tbsCostTodo.getAttachIds2()!=null&&tbsCostTodo.getAttachIds2().length>0){ + List list = attachService.listByIds(Arrays.asList(tbsCostTodo.getAttachIds2())); + tbsCostTodo.setAttachList2(list); + } + return R.ok(tbsCostTodo); + } + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + public R updateById(@RequestBody @Valid TbsCostTodo param){ + String userId = AuthContextUtils.getSysUserId(); + TbsCostTodo tbsCostTodo = tbsCostTodoService.getById(param.getId()); +// if(!tbsCostTodo.getCreateBy().equals(userId)){ +// return R.ok(); +// } + Integer state = tbsCostTodo.getCheckStatus(); + if(state.equals(TbsCommonCheckState.State_1_apply)||state.equals(TbsCommonCheckState.State_2_finished)){ + return R.error("审批中或已完成的无法编辑"); + } + boolean result = tbsCostTodoService.updateById(param); + return R.isTrue(result); + } + + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + String userId = AuthContextUtils.getSysUserId(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(TbsCostTodo::getId,idsLong); + //lqw.eq(TbsCostTodo::getCreateBy,userId); + boolean result = tbsCostTodoService.remove(lqw); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostUnItemController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostUnItemController.java new file mode 100644 index 0000000..9133fd2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostUnItemController.java @@ -0,0 +1,66 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tbs.entity.so.TbsCostUnItemSo; +import com.qs.serve.modules.tbs.entity.TbsCostUnItem; +import com.qs.serve.modules.tbs.service.TbsCostUnItemService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 预算 无预算的费用明细 + * @author YenHex + * @since 2023-02-02 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/noBudgetCost") +public class TbsCostUnItemController { + + private TbsCostUnItemService tbsCostUnItemService; + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('tbs:costUnItem:query')") + public R> getPage(TbsCostUnItemSo param){ + TbsCostUnItem entity = CopierUtil.copy(param,new TbsCostUnItem()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + PageUtil.startPage(); + List list = tbsCostUnItemService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Budget, title = "无预算的费用明细", biz = BizType.QUERY) + @PreAuthorize("hasRole('tbs:costUnItem:query')") + public R getById(@PathVariable("id") String id){ + TbsCostUnItem tbsCostUnItem = tbsCostUnItemService.getById(id); + return R.ok(tbsCostUnItem); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsDealErrorController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsDealErrorController.java new file mode 100644 index 0000000..b2e3e8e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsDealErrorController.java @@ -0,0 +1,82 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.annotation.LimitSubmit; +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.BudgetLogOptFlag; +import com.qs.serve.common.model.enums.SystemModule; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.entity.TbsBudgetLog; +import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; +import com.qs.serve.modules.tbs.entity.so.TbsBudgetLogSo; +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.TbsBudgetLogService; +import com.qs.serve.modules.tbs.service.TbsBudgetService; +import com.qs.serve.modules.tbs.service.TbsScheduleItemBudgetService; +import com.qs.serve.modules.tbs.service.impl.TbsDealErrorApplication; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * 预算 预算日志 + * @author YenHex + * @since 2023-01-05 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/budgetLog") +public class TbsDealErrorController { + + private TbsBudgetLogService tbsBudgetLogService; + private TbsBudgetService tbsBudgetService; + private TbsBudgetLogMapper tbsBudgetLogMapper; + private final TbsBudgetMapper tbsBudgetMapper; + private TbsScheduleItemBudgetService tbsScheduleItemBudgetService; + private TbsBudgetLogService budgetLogService; + private TbsDealErrorApplication tbsDealErrorApplication; + + + /** + * 补偿处理错误的第三方订单 + * @return + */ + @GetMapping("/dealErrorThirtyCost") + public R dealErrorThirtyCost(){ + tbsDealErrorApplication.dealThirtyBuildCost(); + return R.ok(); + } + + /** + * 将整张单废弃 + * @param costId + * @return + */ + @GetMapping("/releaseAll") + public R releaseAll(Long costId){ + tbsDealErrorApplication.releaseAll(costId); + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsScheduleController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsScheduleController.java new file mode 100644 index 0000000..ff884e6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsScheduleController.java @@ -0,0 +1,162 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.Assert; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.modules.bms.entity.BmsSubject; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.entity.TbsScheduleItem; +import com.qs.serve.modules.tbs.service.TbsBudgetService; +import com.qs.serve.modules.tbs.service.TbsScheduleItemBudgetService; +import com.qs.serve.modules.tbs.service.TbsScheduleItemService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tbs.entity.vo.TbsScheduleVo; +import com.qs.serve.modules.tbs.entity.bo.TbsScheduleBo; +import com.qs.serve.modules.tbs.entity.TbsSchedule; +import com.qs.serve.modules.tbs.service.TbsScheduleService; + +import javax.validation.Valid; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 预算 考核期 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/schedule") +public class TbsScheduleController { + + private TbsScheduleService tbsScheduleService; + private TbsScheduleItemService tbsScheduleItemService; + private TbsBudgetService tbsBudgetService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + @PreAuthorize("hasRole('tbs:schedule:query')") + public R> getList(TbsScheduleVo param){ + TbsSchedule entity = CopierUtil.copy(param,new TbsSchedule()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + List list = tbsScheduleService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('tbs:schedule:query')") + public R> getPage(TbsScheduleVo param){ + TbsSchedule entity = CopierUtil.copy(param,new TbsSchedule()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + lqw.orderByDesc(TbsSchedule::getName); + PageUtil.startPage(); + List list = tbsScheduleService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Budget, title = "考核期", biz = BizType.QUERY) + @PreAuthorize("hasRole('tbs:schedule:query')") + public R getById(@PathVariable("id") Long id){ + TbsSchedule tbsSchedule = tbsScheduleService.getById(id); + tbsSchedule.setScheduleItemlist(tbsScheduleItemService.listByScheduleId(id)); + return R.ok(tbsSchedule); + } + + + + /** + * 更新 + * @entity entity + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.Budget, title = "考核期", biz = BizType.UPDATE) + @PreAuthorize("hasRole('tbs:schedule:update')") + public R updateById(@RequestBody @Valid TbsSchedule entity){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsBudget::getScheduleId,entity.getId()); + if(tbsBudgetService.count(lqw)>0){ + Assert.throwEx("修改失败,预算中已使用该周期模板"); + } + boolean result = tbsScheduleService.updateById(entity); + List scheduleItems = tbsScheduleItemService.listByScheduleId(entity.getId()); + tbsScheduleItemService.removeBatchByIds(scheduleItems); + List items = entity.getScheduleItemlist().stream().map(a->{ + a.setScheduleId(entity.getId()); + return a; + }).collect(Collectors.toList()); + tbsScheduleItemService.saveBatch(items); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.Budget, title = "考核期", biz = BizType.INSERT) + @PreAuthorize("hasRole('tbs:schedule:insert')") + public R save(@RequestBody @Valid TbsSchedule param){ + TbsSchedule entity = CopierUtil.copy(param,new TbsSchedule()); + boolean result = tbsScheduleService.save(entity); + if(!result){ + Assert.throwEx("保存失败!"); + } + for(TbsScheduleItem item:entity.getScheduleItemlist()){ + if(item.getStartDate().isAfter(item.getEndDate())){ + Assert.throwEx("开始时间不能大于结束时间"); + } + item.setScheduleId(entity.getId()); + } + tbsScheduleItemService.saveBatch(entity.getScheduleItemlist()); + + return R.isTrue(result); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.Budget, title = "考核期", biz = BizType.DELETE) + @PreAuthorize("hasRole('tbs:schedule:delete')") + public R deleteById(@PathVariable("id") Long id){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsBudget::getScheduleId,id); + if(tbsBudgetService.count(lqw)>0){ + Assert.throwEx("删除失败,预算中已使用该周期模板"); + } + boolean result = tbsScheduleService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsScheduleItemBudgetController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsScheduleItemBudgetController.java new file mode 100644 index 0000000..186d577 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsScheduleItemBudgetController.java @@ -0,0 +1,125 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.Assert; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tbs.entity.vo.TbsScheduleItemBudgetVo; +import com.qs.serve.modules.tbs.entity.bo.TbsScheduleItemBudgetBo; +import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; +import com.qs.serve.modules.tbs.service.TbsScheduleItemBudgetService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 预算 预算考核期项 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/scheduleItemBudget") +public class TbsScheduleItemBudgetController { + + private TbsScheduleItemBudgetService tbsScheduleItemBudgetService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + @PreAuthorize("hasRole('tbs:schedule:query')") + public R> getList(TbsScheduleItemBudgetVo param){ + TbsScheduleItemBudget entity = CopierUtil.copy(param,new TbsScheduleItemBudget()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + List list = tbsScheduleItemBudgetService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('tbs:schedule:query')") + public R> getPage(TbsScheduleItemBudgetVo param){ + TbsScheduleItemBudget entity = CopierUtil.copy(param,new TbsScheduleItemBudget()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + PageUtil.startPage(); + List list = tbsScheduleItemBudgetService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Budget, title = "预算考核期项", biz = BizType.QUERY) + @PreAuthorize("hasRole('tbs:schedule:query')") + public R getById(@PathVariable("id") String id){ + TbsScheduleItemBudget tbsScheduleItemBudget = tbsScheduleItemBudgetService.getById(id); + return R.ok(tbsScheduleItemBudget); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.Budget, title = "预算考核期项", biz = BizType.UPDATE) + @PreAuthorize("hasRole('tbs:schedule:update')") + public R updateById(@RequestBody @Valid TbsScheduleItemBudgetBo param){ + TbsScheduleItemBudget entity = CopierUtil.copy(param,new TbsScheduleItemBudget()); + boolean result = tbsScheduleItemBudgetService.updateById(entity); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.Budget, title = "预算考核期项", biz = BizType.INSERT) + @PreAuthorize("hasRole('tbs:schedule:insert')") + public R save(@RequestBody @Valid TbsScheduleItemBudget param){ + param.setPreDispatchAmountFirst(param.getPreDispatchAmount()); + TbsScheduleItemBudget entity = CopierUtil.copy(param,new TbsScheduleItemBudget()); + boolean result = tbsScheduleItemBudgetService.save(entity); + return R.isTrue(result); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.Budget, title = "预算考核期项", biz = BizType.DELETE) + @PreAuthorize("hasRole('tbs:schedule:delete')") + public R deleteById(@PathVariable("id") Long id){ + boolean result = tbsScheduleItemBudgetService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsScheduleItemController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsScheduleItemController.java new file mode 100644 index 0000000..c41860c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/controller/TbsScheduleItemController.java @@ -0,0 +1,123 @@ +package com.qs.serve.modules.tbs.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tbs.entity.vo.TbsScheduleItemVo; +import com.qs.serve.modules.tbs.entity.bo.TbsScheduleItemBo; +import com.qs.serve.modules.tbs.entity.TbsScheduleItem; +import com.qs.serve.modules.tbs.service.TbsScheduleItemService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 预算 考核时间项 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tbs/scheduleItem") +public class TbsScheduleItemController { + + private TbsScheduleItemService tbsScheduleItemService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + @PreAuthorize("hasRole('tbs:schedule:query')") + public R> getList(TbsScheduleItemVo param){ + TbsScheduleItem entity = CopierUtil.copy(param,new TbsScheduleItem()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + List list = tbsScheduleItemService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('tbs:schedule:query')") + public R> getPage(TbsScheduleItemVo param){ + TbsScheduleItem entity = CopierUtil.copy(param,new TbsScheduleItem()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + PageUtil.startPage(); + List list = tbsScheduleItemService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Budget, title = "考核时间项", biz = BizType.QUERY) + @PreAuthorize("hasRole('tbs:schedule:query')") + public R getById(@PathVariable("id") String id){ + TbsScheduleItem tbsScheduleItem = tbsScheduleItemService.getById(id); + return R.ok(tbsScheduleItem); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.Budget, title = "考核时间项", biz = BizType.UPDATE) + @PreAuthorize("hasRole('tbs:schedule:update')") + public R updateById(@RequestBody @Valid TbsScheduleItemBo param){ + TbsScheduleItem entity = CopierUtil.copy(param,new TbsScheduleItem()); + boolean result = tbsScheduleItemService.updateById(entity); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.Budget, title = "考核时间项", biz = BizType.INSERT) + @PreAuthorize("hasRole('tbs:schedule:insert')") + public R save(@RequestBody @Valid TbsScheduleItem param){ + TbsScheduleItem entity = CopierUtil.copy(param,new TbsScheduleItem()); + boolean result = tbsScheduleItemService.save(entity); + return R.isTrue(result); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.Budget, title = "考核时间项", biz = BizType.DELETE) + @PreAuthorize("hasRole('tbs:schedule:delete')") + public R deleteById(@PathVariable("id") Long id){ + boolean result = tbsScheduleItemService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivity.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivity.java new file mode 100644 index 0000000..aac5600 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivity.java @@ -0,0 +1,340 @@ +package com.qs.serve.modules.tbs.entity; + +import java.math.BigDecimal; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; +import java.time.Period; +import java.time.temporal.ChronoUnit; +import java.util.List; +/** + * 费用活动 实体类 + * @author YenHex + * @since 2022-11-08 + */ +@Data +@TableName(value = "tbs_activity", autoResultMap = true) +public class TbsActivity implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 附件id */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] attachIds; + + /** 编码 */ + @TableField(condition = SqlCondition.LIKE) + private String activityCode; + + /** 活动状态:0-待核销;1-审批中;2-完成;3-冻结;4-已释放;5-已关闭(费用申请拒绝后关闭) */ + private Integer activityState; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 费用通过时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime costPassTime; + + /** 费用通过标识,用于已申请费用活动列表 */ + private Integer costPassFlag; + + /** 活动简述及目的 */ + @NotBlank(message = "活动简述及目的不能为空") + @Length(max = 255,message = "活动简述及目的长度不能超过255字") + private String actTitle; + + /** 客户id */ + @NotNull(message = "客户id不能为空") + private Long supplierId; + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + @Length(max = 30,message = "客户编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String supplierCode; + + /** 客户名称 */ + @NotBlank(message = "客户名称不能为空") + @Length(max = 30,message = "客户名称长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String supplierName; + + /** 活动开始时间 */ + @NotNull(message = "活动开始时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate actStartDate; + + /** 活动结束时间 */ + @NotNull(message = "活动结束时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate actEndDate; + + /** 预算结束时间(用于回退后设置) */ + @NotNull(message = "活动结束时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate preEndDateBack; + + /** 预算开始时间 */ + @NotNull(message = "活动开始时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate preStartDate; + + /** 预算结束时间 */ + @NotNull(message = "活动结束时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate preEndDate; + + /** 预计核销时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate preCheckDate; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 完成标识 */ + private Integer finishedFlag; + + /** 完成时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime finishedTime; + + private Integer preActFlag; + + /** 预计活动销量 */ + private BigDecimal preActQuantity; + + /** 预计不做活动销量 */ + private BigDecimal preNotActQuantity; + + /** 预估roi费率(人工输入) */ + private BigDecimal preRoiRate; + + /** 合计金额 */ + private BigDecimal totalAmount; + + /** 使用金额 */ + private BigDecimal usedAmount; + + /** 支付金额 */ + private BigDecimal payAmount; + + /** 释放人员id */ + private String releaseUserId; + + /** 释放人员 */ + private String releaseUserName; + + /** 释放标识 */ + private Integer releaseFlag; + + /** 重新打开标识(可重新打开过期活动进行核销) */ + private Integer reopenFlag; + + /** 重新打开时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime reopenTime; + + /** 释放金额 */ + private BigDecimal releaseAmount; + + /** 释放时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime releaseTime; + + /** 模板值 */ + private String templateValue; + + /** 模板id */ + private Long templateId; + + @TableField(condition = SqlCondition.LIKE) + private String templateTitle; + + private String templateBudgetIds; + + /** 是否取消(异动时设置) */ + private Integer cancelFlag; + + /** + * 核销匹配标识(区分是否自定义核销比例) + */ + private Integer vtbMatchTypeFlag; + + /** + * 当前核销单(支持总单) + */ + private String currVerificationId; + + @TableField(exist = false) + private List attachList; + + /** 产品类型 */ + @TableField(exist = false) + private String goodsType; + + /** 产品详情 */ + @TableField(exist = false) + private List goodsList; + + /** 客户详情1(三选一) */ + @TableField(exist = false) + private List customChannelList; + + /** 客户详情2 */ + @TableField(exist = false) + private List customChannelPointList; + + /** 客户详情3 */ + @TableField(exist = false) + private BmsSupplier customSupplier; + + /** 成本中心与商品配比列表 */ + @TableField(exist = false) + private List centerGoodsList; + + /** 科目与成本中心 */ + @TableField(exist = false) + private List subjectCenterList; + + /** 后端参数,预算考核期 */ + @TableField(exist = false) + List scheduleItemBudgetList; + + /** 申请人 */ + @TableField(exist = false) + Object applyUser; + + /** + * 逾期值 + */ + @TableField(exist = false) + private Long overdueWarningDays; + + /** + * 提交核销次数 + */ + @TableField(exist = false) + private Long verificationNum; + + /** + * 系统参数 + */ + @TableField(exist = false) + private Integer expenseApplicationActivityWriteOffOverdueWarningDays; + + /** + * overdueState【0=>未逾期、1=>已逾期、2=>即将逾期】 + */ + @TableField(exist = false) + private Integer overdueState; + + @TableField(exist = false) + private Long birActId; + + /** + * 核销ID + */ + @JsonIgnore + @TableField(exist = false) + private Long verificationId; + + /** + * 处理预警时间 + * @param preDays + */ + public void initWarningDay(int preDays){ + overdueWarningDays = 0L; + if(!this.getActivityState().equals(2) + &&!this.getActivityState().equals(5) + &&this.getPreCheckDate()!=null){ + try { + LocalDate now = LocalDate.now(); + LocalDate end = this.getPreCheckDate(); + overdueWarningDays = ChronoUnit.DAYS.between(now,end); + } catch (Exception e) { + e.printStackTrace(); + } + } + expenseApplicationActivityWriteOffOverdueWarningDays = preDays; + if(this.getActivityState().equals(0)||this.getActivityState().equals(1)||this.getActivityState().equals(3)){ + if(overdueWarningDays >= expenseApplicationActivityWriteOffOverdueWarningDays){ + overdueState = 0; + }else if(overdueWarningDays<0){ + overdueState = 1; + }else { + overdueState = 2; + } + }else { + overdueState = 0; + overdueWarningDays = 0L; + } + //调为正数 + overdueWarningDays = -overdueWarningDays; + //未逾期设置为0 + if(overdueWarningDays <= 0){ + overdueWarningDays = 0L; + } + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenter.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenter.java new file mode 100644 index 0000000..b18e582 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenter.java @@ -0,0 +1,129 @@ +package com.qs.serve.modules.tbs.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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 2022-11-09 + */ +@Data +@TableName("tbs_activity_center") +public class TbsActivityCenter implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 费用额度 */ + @NotNull(message = "费用额度不能为空") + private BigDecimal centerRate; + + /** 费用额度 */ + @NotNull(message = "费用额度不能为空") + private BigDecimal orgCenterAmount; + + /** 费用额度 */ + @NotNull(message = "费用额度不能为空") + private BigDecimal centerAmount; + + private BigDecimal usedAmount; + + private BigDecimal payAmount; + + /** 成本中心类型 + center, + customer, + dept, + bizRegion, + saleRegion, + saleman */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 255,message = "成本中心类型长度不能超过255字") + private String centerType; + + /** 成本中心id */ + @NotNull(message = "成本中心id不能为空") + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 50,message = "成本中心编码长度不能超过50字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 50,message = "成本中心名称长度不能超过50字") + private String centerName; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 模板唯一健 */ + private String tmpUk; + + @TableField(exist = false) + private List matchBudgetList; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java new file mode 100644 index 0000000..c6b5755 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityCenterGoods.java @@ -0,0 +1,296 @@ +package com.qs.serve.modules.tbs.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 com.qs.serve.common.util.CopierUtil; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.entity.dto.TbsCenterGoodsGroupDTO; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * 活动成本中心配比项 实体类 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@Data +@TableName("tbs_activity_center_goods") +public class TbsActivityCenterGoods implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + private String centerGoodsCode; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 活动编码 */ + private String activityCode; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** 费用额度 */ + @NotNull(message = "费用额度不能为空") + private BigDecimal centerGoodsAmount; + + /** 费用额度 */ + @NotNull(message = "费用额度不能为空") + private BigDecimal orgCenterGoodsAmount; + + /** 费用占比 */ + @NotNull(message = "费用占比不能为空") + private BigDecimal centerGoodsRate; + + /** 费用已用额度 */ + private BigDecimal usedAmount; + + private BigDecimal payAmount; + + /** 成本中心类型 */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 50,message = "成本中心类型长度不能超过50字") + private String centerType; + + /** 成本中心id */ + @NotNull(message = "成本中心id不能为空") + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 50,message = "成本中心编码长度不能超过50字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 50,message = "成本中心名称长度不能超过50字") + private String centerName; + + /** 费用额度 */ + @NotNull(message = "费用额度不能为空") + private BigDecimal orgCenterAmount; + + /** 费用额度 */ + @NotNull(message = "费用额度不能为空") + private BigDecimal centerAmount; + + /** 费用占比 */ + @NotNull(message = "费用占比不能为空") + private BigDecimal centerRate; + + /** 目标类型(brand、category、series、spu、sku) */ + @NotBlank(message = "目标类型(brand、category、series、spu、sku)不能为空") + @Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字") + private String targetType; + + /** 目标id */ + @NotNull(message = "目标id不能为空") + private Long targetId; + + /** 目标编码 */ + @NotBlank(message = "目标编码不能为空") + @Length(max = 30,message = "目标编码长度不能超过30字") + private String targetCode; + + /** 目标名称 */ + @NotBlank(message = "目标名称不能为空") + @Length(max = 30,message = "目标名称长度不能超过30字") + private String targetName; + + /** 目标等级id路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathIds; + + /** 目标等级名称路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathNames; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 活动开始时间 */ + @NotNull(message = "活动开始时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate actStartDate; + + /** 活动结束时间 */ + @NotNull(message = "活动结束时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate actEndDate; + + /** 预算开始时间 */ + @NotNull(message = "活动开始时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate preStartDate; + + /** 预算结束时间 */ + @NotNull(message = "活动结束时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate preEndDate; + + /** 预计核销时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate preCheckDate; + + /** 模板唯一健 */ + private String tmpUk; + + /** 客户id */ + private Long supplierId; + + /** 客户编码 */ + private String supplierCode; + + /** 客户名称 */ + private String supplierName; + + @TableField(exist = false) + private String spuName; + + @TableField(exist = false) + private String skuName; + + /** 后台参数:预算id */ + @TableField(exist = false) + private Long budgetId; + + /** 后台参数:考核id */ + @TableField(exist = false) + private Long scheduleId; + + /** 后台参数:考核期项id */ + @TableField(exist = false) + private Long scheduleItemId; + + /** 后台参数:考核期项id */ + @TableField(exist = false) + private String scheduleItemName; + + /** 后台参数:录入时考核期可用预算 */ + @TableField(exist = false) + private BigDecimal scheduleItemAmount; + + /** 后台参数:录入时,考核期已用金额(含申请占用金额) */ + @TableField(exist = false) + private BigDecimal scheduleItemAmountUsed; + + /** 后台参数:录入时,考核期申请占用金额 */ + @TableField(exist = false) + private BigDecimal scheduleItemAmountApply; + + /** 后台参数:费用考核期项id */ + @TableField(exist = false) + private Long scheduleItemBudgetId; + + /** 后台参数:用于生成BIR */ + @TableField(exist = false) + private BigDecimal activityAmt; + + /** 后台参数:用于生成BIR */ + @TableField(exist = false) + private BigDecimal activityCheckAmt; + + /** 后台参数:用于生成BIR */ + @TableField(exist = false) + private Integer activityFinishedFlag = 0; + + @TableField(exist = false) + private List queryGoodsGroups; + + @JsonIgnore + @TableField(exist = false) + private List match2ScheduleItemBudgetList ; + + @JsonIgnore + @TableField(exist = false) + private String subjectCenterKey ; + + public TbsBudgetCostItem toBudgetCostItem(){ + TbsBudgetCostItem budgetCostItem = CopierUtil.copy(this,new TbsBudgetCostItem()); + budgetCostItem.setId(null); + budgetCostItem.setCenterGoodItemId(this.getId()); + return budgetCostItem; + } + + public void initSpuSkuName(){ + if(this.getTargetType().equals(TbsGoodsType.sku.name())){ + try { + String[] names = this.getTargetLevelPathNames().split("_"); + this.setSkuName(names[names.length-1]); + this.setSpuName(names[names.length-2]); + } catch (Exception e) { + log.error("格式错误:{}",this.getTargetLevelPathNames()); + } + } + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityChannel.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityChannel.java new file mode 100644 index 0000000..3c5b8cc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityChannel.java @@ -0,0 +1,101 @@ +package com.qs.serve.modules.tbs.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 2022-11-08 + */ +@Data +@TableName("tbs_activity_channel") +public class TbsActivityChannel implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 渠道id */ + @NotNull(message = "渠道id不能为空") + private Long channelId; + + /** 渠道编码 */ + @NotBlank(message = "渠道编码不能为空") + @Length(max = 50,message = "渠道编码长度不能超过50字") + private String channelCode; + + /** 渠道名称 */ + @NotBlank(message = "渠道名称不能为空") + @Length(max = 50,message = "渠道名称长度不能超过50字") + private String channelName; + + /** 渠道费用占比 */ + @NotNull(message = "渠道费用占比不能为空") + private BigDecimal channelRate; + + /** 预计头发网点数量 */ + @NotNull(message = "预计头发网点数量不能为空") + private Integer preCountPoint; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 模板唯一健 */ + private String tmpUk; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityChannelPoint.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityChannelPoint.java new file mode 100644 index 0000000..93aa24a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityChannelPoint.java @@ -0,0 +1,120 @@ +package com.qs.serve.modules.tbs.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 com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +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 2022-11-08 + */ +@Data +@TableName("tbs_activity_channel_point") +public class TbsActivityChannelPoint implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 渠道id */ + @NotNull(message = "渠道id不能为空") + private Long channelId; + + /** 渠道编码 */ + @NotBlank(message = "渠道编码不能为空") + @Length(max = 50,message = "渠道编码长度不能超过50字") + private String channelCode; + + /** 渠道名称 */ + @NotBlank(message = "渠道名称不能为空") + @Length(max = 50,message = "渠道名称长度不能超过50字") + private String channelName; + + /** 网点id */ + @NotNull(message = "网点id不能为空") + private Long pointId; + + /** 网点编码 */ + @NotBlank(message = "网点编码不能为空") + @Length(max = 50,message = "网点编码长度不能超过50字") + private String pointCode; + + /** 网点名称 */ + @NotBlank(message = "网点名称不能为空") + @Length(max = 50,message = "网点名称长度不能超过50字") + private String pointName; + + /** 网点费用占比 */ + @NotNull(message = "网点费用占比不能为空") + private BigDecimal pointRate; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonSerialize(using = LocalDateTimeSerializer.class) + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonSerialize(using = LocalDateTimeSerializer.class) + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 模板唯一健 */ + private String tmpUk; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityGoods.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityGoods.java new file mode 100644 index 0000000..acba267 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityGoods.java @@ -0,0 +1,157 @@ +package com.qs.serve.modules.tbs.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 com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +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 2022-11-08 + */ +@Slf4j +@Data +@TableName("tbs_activity_goods") +public class TbsActivityGoods implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 目标类型(brand、category、series、spu、sku) */ + @NotBlank(message = "目标类型(brand、category、series、spu、sku)不能为空") + @Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字") + private String targetType; + + /** 目标id */ + @NotNull(message = "目标id不能为空") + private Long targetId; + + /** 目标编码 */ + @NotBlank(message = "目标编码不能为空") + @Length(max = 30,message = "目标编码长度不能超过30字") + private String targetCode; + + /** 目标名称 */ + @NotBlank(message = "目标名称不能为空") + @Length(max = 30,message = "目标名称长度不能超过30字") + private String targetName; + + /** 目标等级id路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathIds; + + /** 目标等级名称路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathNames; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 模板唯一健 */ + private String tmpUk; + + @TableField(exist = false) + private String spuName; + + @TableField(exist = false) + private String skuName; + + @TableField(exist = false) + private String brandLabel; + + @TableField(exist = false) + private String categoryLabel; + + @TableField(exist = false) + private String seriseLabel; + + public void initCategoryNameByPathsName(){ + if(!StringUtils.hasText(this.getTargetLevelPathNames())){ + return; + } + String[] names = this.getTargetLevelPathNames().split("_"); + if(names.length==1){ + this.brandLabel = names[0]; + }else if(names.length==2){ + this.brandLabel = names[0]; + this.categoryLabel = names[1]; + }else if(names.length >=3){ + this.brandLabel = names[0]; + this.categoryLabel = names[1]; + this.seriseLabel = names[2]; + } + } + + public void initSpuSkuName(){ + if(!StringUtils.hasText(this.getTargetLevelPathNames())){ + return; + } + if(this.getTargetType().equals(TbsGoodsType.sku.name())){ + try { + String[] names = this.getTargetLevelPathNames().split("_"); + this.setSkuName(names[names.length-1]); + this.setSpuName(names[names.length-2]); + } catch (Exception e) { + log.error("格式错误:{}",this.getTargetLevelPathNames()); + } + } + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityPayCondition.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityPayCondition.java new file mode 100644 index 0000000..88193fd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityPayCondition.java @@ -0,0 +1,132 @@ +package com.qs.serve.modules.tbs.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 2023-05-10 + */ +@Data +@TableName("tbs_activity_pay_condition") +public class TbsActivityPayCondition implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + private String code; + + /** 标题 */ + @TableField(condition = SqlCondition.LIKE) + private String title; + + /** 费用id */ + @NotNull(message = "费用id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** + * 支付次数 + */ + private Integer payTimes; + + /** 付款条件 */ + @NotBlank(message = "付款条件不能为空") + @Length(max = 4000,message = "付款条件长度不能超过4000字") + private String conditionMsg; + + /** 付款金额 */ + @NotNull(message = "付款金额不能为空") + private BigDecimal paymentPrice; + + /** 预通知标识:0->无通知;1->未通知;2->已通知 */ + private Integer preNotifyStatus; + + /** 预通知时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime preNotifyTime; + + /** 付款时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate paymentDate; + + /** 1->完成标识 2->审批中,0->未处理 */ + private Integer finishedFlag; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + + public static TbsActivityPayCondition toNewObject(TbsActivityPayCondition source){ + TbsActivityPayCondition activityPayCondition = new TbsActivityPayCondition(); + activityPayCondition.setId(source.getId()); + activityPayCondition.setCostApplyId(source.getCostApplyId()); + activityPayCondition.setActivityId(source.getActivityId()); + activityPayCondition.setConditionMsg(source.getConditionMsg()); + activityPayCondition.setPaymentPrice(source.getPaymentPrice()); + activityPayCondition.setPaymentDate(source.getPaymentDate()); + activityPayCondition.setRemark(source.getRemark()); + activityPayCondition.setCreateTime(source.getCreateTime()); + activityPayCondition.setUpdateTime(source.getUpdateTime()); + activityPayCondition.setCreateBy(source.getCreateBy()); + activityPayCondition.setUpdateBy(source.getUpdateBy()); + activityPayCondition.setTenantId(source.getTenantId()); + activityPayCondition.setDelFlag(source.getDelFlag()); + return activityPayCondition; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivitySlottingFee.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivitySlottingFee.java new file mode 100644 index 0000000..a91e752 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivitySlottingFee.java @@ -0,0 +1,192 @@ +package com.qs.serve.modules.tbs.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.context.annotation.Conditional; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * 活动进场费 实体类 + * @author YenHex + * @since 2023-06-26 + */ +@Data +@TableName("tbs_activity_slotting_fee") +public class TbsActivitySlottingFee implements Serializable { + + private static final long serialVersionUID = 1L; + + /** */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 目标类型(brand、category、series、spu、sku) */ + @NotBlank(message = "目标类型(brand、category、series、spu、sku)不能为空") + @Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字") + private String targetType; + + /** 目标id */ + @NotNull(message = "目标id不能为空") + private Long targetId; + + /** 目标编码 */ + @NotBlank(message = "目标编码不能为空") + @Length(max = 30,message = "目标编码长度不能超过30字") + @TableField(condition=SqlCondition.LIKE) + private String targetCode; + + /** 目标名称 */ + @NotBlank(message = "目标名称不能为空") + @Length(max = 200,message = "目标名称长度不能超过200字") + @TableField(condition=SqlCondition.LIKE) + private String targetName; + + /** 目标等级路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathIds; + + /** 目标等级路径 */ + @Length(max = 800,message = "目标等级路径长度不能超过800字") + private String targetLevelPathNames; + + /** 渠道id */ + @NotNull(message = "渠道id不能为空") + private Long channelId; + + /** 渠道编码 */ + @NotBlank(message = "渠道编码不能为空") + @Length(max = 50,message = "渠道编码长度不能超过50字") + @TableField(condition=SqlCondition.LIKE) + private String channelCode; + + /** 渠道名称 */ + @NotBlank(message = "渠道名称不能为空") + @Length(max = 50,message = "渠道名称长度不能超过50字") + @TableField(condition=SqlCondition.LIKE) + private String channelName; + + /** 网点id */ + @NotNull(message = "网点id不能为空") + private Long pointId; + + /** 网点编码 */ + @NotBlank(message = "网点编码不能为空") + @Length(max = 50,message = "网点编码长度不能超过50字") + @TableField(condition=SqlCondition.LIKE) + private String pointCode; + + /** 网点名称 */ + @NotBlank(message = "网点名称不能为空") + @Length(max = 50,message = "网点名称长度不能超过50字") + @TableField(condition=SqlCondition.LIKE) + private String pointName; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** + * 通过标识 + * 0->未审批或审批被拒绝 + * 1->已通过审批 + * 2->审批中 + */ + private Integer passFlag; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + public static TbsActivitySlottingFee toNewObject(TbsActivitySlottingFee source){ + TbsActivitySlottingFee activitySlottingFee = new TbsActivitySlottingFee(); + activitySlottingFee.setId(source.getId()); + activitySlottingFee.setCostApplyId(source.getCostApplyId()); + activitySlottingFee.setActivityId(source.getActivityId()); + activitySlottingFee.setTargetType(source.getTargetType()); + activitySlottingFee.setTargetId(source.getTargetId()); + activitySlottingFee.setTargetCode(source.getTargetCode()); + activitySlottingFee.setTargetName(source.getTargetName()); + activitySlottingFee.setTargetLevelPathIds(source.getTargetLevelPathIds()); + activitySlottingFee.setTargetLevelPathNames(source.getTargetLevelPathNames()); + activitySlottingFee.setChannelId(source.getChannelId()); + activitySlottingFee.setChannelCode(source.getChannelCode()); + activitySlottingFee.setChannelName(source.getChannelName()); + activitySlottingFee.setPointId(source.getPointId()); + activitySlottingFee.setPointCode(source.getPointCode()); + activitySlottingFee.setPointName(source.getPointName()); + activitySlottingFee.setCreateTime(source.getCreateTime()); + activitySlottingFee.setTenantId(source.getTenantId()); + activitySlottingFee.setUpdateBy(source.getUpdateBy()); + activitySlottingFee.setCreateBy(source.getCreateBy()); + activitySlottingFee.setRemark(source.getRemark()); + activitySlottingFee.setUpdateTime(source.getUpdateTime()); + activitySlottingFee.setDelFlag(source.getDelFlag()); + activitySlottingFee.setSubjectId(source.getSubjectId()); + activitySlottingFee.setSubjectCode(source.getSubjectCode()); + activitySlottingFee.setSubjectName(source.getSubjectName()); + return activitySlottingFee; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivitySubject.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivitySubject.java new file mode 100644 index 0000000..2758cf1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivitySubject.java @@ -0,0 +1,135 @@ +package com.qs.serve.modules.tbs.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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 2022-11-09 + */ +@Data +@TableName("tbs_activity_subject") +public class TbsActivitySubject implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** 原费用额度 */ + @NotNull(message = "费用额度不能为空") + private BigDecimal orgAmount; + + /** 费用额度 */ + @NotNull(message = "费用额度不能为空") + private BigDecimal amount; + + /** 费用额度 */ + private BigDecimal usedAmount; + + /** 场次 */ + @NotNull(message = "场次不能为空") + private Integer countSession; + + /** 人数 */ + @NotNull(message = "人数不能为空") + private Integer countPerson; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 科目表单id */ + private Long subjectFormId; + + /** 科目表单标题 */ + private String subjectFormTitle; + + /** 科目表单内容 */ + private String subjectFormContext; + + /** 科目表单id */ + private String subjectFormValue; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + /** 模板唯一健 */ + private String tmpUk; + + @TableField(exist = false) + Object subjectFormInfo; + + @TableField(exist = false) + List activityCenterList; + + @TableField(exist = false) + private Integer slottingFlag; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivitySubjectYarn.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivitySubjectYarn.java new file mode 100644 index 0000000..28edaab --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivitySubjectYarn.java @@ -0,0 +1,194 @@ +package com.qs.serve.modules.tbs.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 2023-08-04 + */ +@Data +@TableName("tbs_activity_subject_yarn") +public class TbsActivitySubjectYarn implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** OA的审批ID */ + @NotBlank(message = "OA的审批ID不能为空") + @Length(max = 64,message = "OA的审批ID长度不能超过64字") + private String checkId; + + /** 审批人id */ + @NotBlank(message = "审批人id不能为空") + @Length(max = 64,message = "审批人id长度不能超过64字") + private String userId; + + /** 审批人编码 */ + @NotBlank(message = "审批人编码不能为空") + @Length(max = 255,message = "审批人编码长度不能超过255字") + private String userCode; + + /** 审批人 */ + @NotBlank(message = "审批人不能为空") + @Length(max = 255,message = "审批人长度不能超过255字") + private String userName; + + /** OA岗位 */ + @Length(max = 255,message = "OA岗位长度不能超过255字") + private String userHrInfo; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 费用申请编码 */ + @NotBlank(message = "费用申请编码不能为空") + @Length(max = 255,message = "费用申请编码长度不能超过255字") + private String costApplyCode; + + /** 费用申请编码 */ + @NotBlank(message = "费用申请编码不能为空") + @Length(max = 255,message = "费用申请编码长度不能超过255字") + private String costApplyTitle; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 活动编码 */ + @NotBlank(message = "活动编码不能为空") + @Length(max = 255,message = "活动编码长度不能超过255字") + private String activityCode; + + /** 活动标题 */ + @NotBlank(message = "活动标题不能为空") + @Length(max = 255,message = "活动标题长度不能超过255字") + private String activityTitle; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** 原费用额度 */ + private BigDecimal orgAmount; + + /** 原场次 */ + private Integer orgCountSession; + + /** 原人数 */ + private Integer orgCountPerson; + + /** 费用额度 */ + @NotNull(message = "费用额度不能为空") + private BigDecimal amount; + + /** 场次 */ + @NotNull(message = "场次不能为空") + private Integer countSession; + + /** 人数 */ + @NotNull(message = "人数不能为空") + private Integer countPerson; + + /** 原因 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String reason; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + public static TbsActivitySubjectYarn toNewObject(TbsActivitySubjectYarn source){ + TbsActivitySubjectYarn activitySubjectYarn = new TbsActivitySubjectYarn(); + activitySubjectYarn.setId(source.getId()); + activitySubjectYarn.setCheckId(source.getCheckId()); + activitySubjectYarn.setUserId(source.getUserId()); + activitySubjectYarn.setUserCode(source.getUserCode()); + activitySubjectYarn.setUserName(source.getUserName()); + activitySubjectYarn.setUserHrInfo(source.getUserHrInfo()); + activitySubjectYarn.setCostApplyId(source.getCostApplyId()); + activitySubjectYarn.setCostApplyCode(source.getCostApplyCode()); + activitySubjectYarn.setCostApplyTitle(source.getCostApplyTitle()); + activitySubjectYarn.setActivityId(source.getActivityId()); + activitySubjectYarn.setActivityCode(source.getActivityCode()); + activitySubjectYarn.setActivityTitle(source.getActivityTitle()); + activitySubjectYarn.setSubjectId(source.getSubjectId()); + activitySubjectYarn.setSubjectCode(source.getSubjectCode()); + activitySubjectYarn.setSubjectName(source.getSubjectName()); + activitySubjectYarn.setOrgAmount(source.getOrgAmount()); + activitySubjectYarn.setOrgCountSession(source.getOrgCountSession()); + activitySubjectYarn.setOrgCountPerson(source.getOrgCountPerson()); + activitySubjectYarn.setAmount(source.getAmount()); + activitySubjectYarn.setCountSession(source.getCountSession()); + activitySubjectYarn.setCountPerson(source.getCountPerson()); + activitySubjectYarn.setRemark(source.getRemark()); + activitySubjectYarn.setCreateTime(source.getCreateTime()); + activitySubjectYarn.setUpdateTime(source.getUpdateTime()); + activitySubjectYarn.setTenantId(source.getTenantId()); + activitySubjectYarn.setCreateBy(source.getCreateBy()); + activitySubjectYarn.setUpdateBy(source.getUpdateBy()); + activitySubjectYarn.setDelFlag(source.getDelFlag()); + return activitySubjectYarn; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityTemplate.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityTemplate.java new file mode 100644 index 0000000..33c0d49 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityTemplate.java @@ -0,0 +1,142 @@ +package com.qs.serve.modules.tbs.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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 2022-11-29 + */ +@Data +@TableName("tbs_activity_template") +public class TbsActivityTemplate implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 模板名称 */ + @NotBlank(message = "模板名称不能为空") + @Length(max = 60,message = "模板名称长度不能超过60字") + @TableField(condition = SqlCondition.LIKE) + private String templateName; + + /** 模板状态 */ + @NotNull(message = "模板状态不能为空") + private Integer templateState; + + /** 模板值 */ + @NotBlank(message = "模板值不能为空") + @Length(max = 6000,message = "模板值长度不能超过6000字") + private String templateValue; + + /** 销售区域标识:0-全部可见;1-部分可见;2-全部不可见 */ + @NotNull(message = "销售区域标识:0-全部可见;1-部分可见;2-全部不可见不能为空") + private Integer saleRegionFlag; + + /** 行政区域标识:0-全部可见;1-部分可见;2-全部不可 */ + @NotNull(message = "行政区域标识:0-全部可见;1-部分可见;2-全部不可不能为空") + private Integer bizRegionFlag; + + /** 合同类型:0->无;1->有合同 */ + private Integer contractFlag; + + /** 费用申请主题 */ + @Length(max = 255,message = "费用申请主题长度不能超过255字") + private String costTheme; + + /** 费用申请主题能否编辑 */ + private Integer costThemeEditFlag; + + /** 预设备注 */ + @Length(max = 255,message = "预设备注长度不能超过255字") + private String preRemark; + + /** 创建人ID */ + private String userId; + + /** 创建人编码 */ + private String userCode; + + /** 创建人名称 */ + private String userName; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** + * 选择类型 + * 1、只能选择客户,2、只能选择供应商,3、可以选择客户和供应商 + */ + private Integer selectType; + + /** 开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime startTime; + + /** 结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime endTime; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** 销售区域 */ + @TableField(exist = false) + List saleRegionList; + + /** 行政区域 */ + @TableField(exist = false) + List bizRegionList; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityTemplateLog.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityTemplateLog.java new file mode 100644 index 0000000..806046d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityTemplateLog.java @@ -0,0 +1,107 @@ +package com.qs.serve.modules.tbs.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 2023-01-05 + */ +@Data +@TableName("tbs_activity_template_log") +public class TbsActivityTemplateLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 模板id */ + @NotNull(message = "模板id不能为空") + private Long templateId; + + /** 模板名称 */ + @NotBlank(message = "模板名称不能为空") + @Length(max = 30,message = "模板名称长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String templateName; + + /** 操作状态:0:关闭;1-开启;2-删除;3-修改 */ + private Integer optionState; + + /** 模板值 */ + @NotBlank(message = "模板值不能为空") + @Length(max = 6000,message = "模板值长度不能超过6000字") + private String templateValue; + + /** 销售区域标识:0-全部可见;1-部分可见;2-全部不可见 */ + @NotNull(message = "销售区域标识:0-全部可见;1-部分可见;2-全部不可见不能为空") + private Integer saleRegionFlag; + + /** 行政区域标识:0-全部可见;1-部分可见;2-全部不可 */ + @NotNull(message = "行政区域标识:0-全部可见;1-部分可见;2-全部不可不能为空") + private Integer bizRegionFlag; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 开始时间 */ + @Length(max = 0,message = "开始时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime startTime; + + /** 结束时间 */ + @Length(max = 0,message = "结束时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime endTime; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityTemplateRegion.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityTemplateRegion.java new file mode 100644 index 0000000..1fc8b18 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsActivityTemplateRegion.java @@ -0,0 +1,87 @@ +package com.qs.serve.modules.tbs.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 2022-11-29 + */ +@Data +@TableName("tbs_activity_template_region") +public class TbsActivityTemplateRegion implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 类型:sale、biz */ + @NotBlank(message = "类型:sale、biz不能为空") + private String type; + + /** 商品id */ + @NotNull(message = "商品id不能为空") + private Long templateId; + + /** 区域ID */ + @NotNull(message = "区域ID不能为空") + private String regionId; + + /** 区域名称 */ + @Length(max = 30,message = "区域名称长度不能超过30字") + private String regionName; + + /** 区域编码 */ + private String regionCode; + + /** 区域等级 */ + private Integer regionLevel; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudget.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudget.java new file mode 100644 index 0000000..10c770a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudget.java @@ -0,0 +1,207 @@ +package com.qs.serve.modules.tbs.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +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 2022-11-12 + */ +@Data +@TableName(value = "tbs_budget", autoResultMap = true) +public class TbsBudget implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 预算名称 */ + private String budgetCode; + + /** 预算编码 */ + private String budgetNumber; + + /** 费用启用状态 0/1 */ + private Integer budgetState; + + /** 不活动的 0/1 用于随意关停预算 */ + private Integer inactiveFlag; + + /** 停用状态 0/1 用于标记跨年停用预算 */ + private Integer stopFlag; + + /** 是否允许跨年,控制停用状态 */ + private Integer crossYearFlag; + + /** 审批流程状态 */ + private Integer budgetCheckState; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 30,message = "科目编码长度不能超过30字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 30,message = "科目名称长度不能超过30字") + private String subjectName; + + /** 成本中心id */ + @NotNull(message = "成本中心id不能为空") + private String centerId; + + @NotNull(message = "成本中心类型不能为空") + private String centerType; + + private String centerCombo; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 30,message = "成本中心编码长度不能超过30字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 30,message = "成本中心名称长度不能超过30字") + private String centerName; + + /** 考核期id */ + @NotNull(message = "考核期id不能为空") + private Long scheduleId; + + /** 考核期编码 */ + @NotBlank(message = "考核期编码不能为空") + @Length(max = 30,message = "考核期编码长度不能超过30字") + private String scheduleCode; + + /** 考核期名称 */ + @NotBlank(message = "考核期名称不能为空") + @Length(max = 30,message = "考核期名称长度不能超过30字") + private String scheduleName; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 条件标识 */ + private Integer conditionFlag; + + /** 生成底表标识:默认0;同步成功为1 */ + private Integer birFlag; + + /** 申请人 */ + @NotBlank(message = "申请人不能为空") + @Length(max = 32,message = "申请人长度不能超过32字") + private String userId; + + /** 用户编码 */ + @Length(max = 32,message = "长度不能超过32字") + private String userCode; + + /** 用户名称 */ + @Length(max = 32,message = "长度不能超过32字") + @TableField(condition = SqlCondition.LIKE) + private String userName; + + /** 致远表单id */ + private String syFormId; + + /** 提交审批时间 */ + private LocalDateTime submitTime; + + /** 是否批量提交 */ + private Integer batchApplyFlag; + + private Long batchApplyId; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 是否指定模板类型的预算 */ + private Integer templateFlag; + + /** 附件id */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] attachIds; + + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] templateIds; + + /** 预算条件 */ + @TableField(exist = false) + private List budgetConditionList; + + @TableField(exist = false) + private List brandConditions; + @TableField(exist = false) + private List categoryConditions; + @TableField(exist = false) + private List seriesConditions; + @TableField(exist = false) + private List skuConditions; + @TableField(exist = false) + private List spuConditions; + @TableField(exist = false) + private List scheduleItem; + @TableField(exist = false) + private List scheduleItemBudgets; + + @TableField(exist = false) + private List attachList; + + //用于导出 区分 普通加载id + @TableField(exist = false) + private List selectBudgetIds; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetBatch.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetBatch.java new file mode 100644 index 0000000..925eaa9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetBatch.java @@ -0,0 +1,146 @@ +package com.qs.serve.modules.tbs.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +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 2023-08-24 + */ +@Data +@TableName(value = "tbs_budget_batch", autoResultMap = true) +public class TbsBudgetBatch implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 批次标题 */ + @NotBlank(message = "批次标题不能为空") + @Length(max = 255,message = "批次标题长度不能超过255字") + private String batchTitle; + + /** 批次编码 */ + @NotBlank(message = "批次编码不能为空") + @Length(max = 50,message = "批次编码长度不能超过50字") + private String batchCode; + + /** 状态 */ + @NotNull(message = "状态不能为空") + private Integer batchState; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime finishedTime; + + /** 预算类型 0->修改;1->新增 */ + //private Integer batchType; + + /** 致远表单id */ + @Length(max = 255,message = "致远表单id长度不能超过255字") + private String syFormId; + + /** 用户id */ + @Length(max = 255,message = "用户id长度不能超过255字") + private String userId; + + /** 用户编码 */ + @Length(max = 255,message = "用户编码长度不能超过255字") + private String userCode; + + /** 用户 */ + @Length(max = 255,message = "用户长度不能超过255字") + private String userName; + + /** 提交审批时间 */ + @Length(max = 0,message = "提交审批时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime submitTime; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 附件id */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] attachIds; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + @TableField(exist = false) + private List changeList; + + @TableField(exist = false) + private ListattachList;; + +// public static TbsBudgetBatch toNewObject(TbsBudgetBatch source){ +// TbsBudgetBatch budgetBatch = new TbsBudgetBatch(); +// budgetBatch.setId(source.getId()); +// budgetBatch.setBatchTitle(source.getBatchTitle()); +// budgetBatch.setBatchCode(source.getBatchCode()); +// budgetBatch.setBatchState(source.getBatchState()); +// budgetBatch.setSyFormId(source.getSyFormId()); +// budgetBatch.setUserId(source.getUserId()); +// budgetBatch.setUserCode(source.getUserCode()); +// budgetBatch.setUserName(source.getUserName()); +// budgetBatch.setSubmitTime(source.getSubmitTime()); +// budgetBatch.setRemark(source.getRemark()); +// budgetBatch.setCreateTime(source.getCreateTime()); +// budgetBatch.setUpdateTime(source.getUpdateTime()); +// budgetBatch.setTenantId(source.getTenantId()); +// budgetBatch.setCreateBy(source.getCreateBy()); +// budgetBatch.setUpdateBy(source.getUpdateBy()); +// budgetBatch.setDelFlag(source.getDelFlag()); +// return budgetBatch; +// } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetBatchItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetBatchItem.java new file mode 100644 index 0000000..802e32f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetBatchItem.java @@ -0,0 +1,122 @@ +package com.qs.serve.modules.tbs.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 2023-08-24 + */ +@Data +@TableName("tbs_budget_batch_item") +public class TbsBudgetBatchItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 批次id */ + private Long batchId; + + /** 预算id */ + @NotNull(message = "预算id不能为空") + private Long budgetId; + + /** 预算更变记录id */ + private Long changeId; + + /** 状态 */ + @NotNull(message = "状态不能为空") + private Integer batchState; + + /** 用户id */ + @Length(max = 255,message = "用户id长度不能超过255字") + private String userId; + + /** 用户编码 */ + @Length(max = 255,message = "用户编码长度不能超过255字") + private String userCode; + + /** 用户 */ + @Length(max = 255,message = "用户长度不能超过255字") + private String userName; + + /** 提交审批时间 */ + @Length(max = 0,message = "提交审批时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime submitTime; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + public static TbsBudgetBatchItem toNewObject(TbsBudgetBatchItem source){ + TbsBudgetBatchItem budgetBatchItem = new TbsBudgetBatchItem(); + budgetBatchItem.setId(source.getId()); + budgetBatchItem.setBudgetId(source.getBudgetId()); + budgetBatchItem.setChangeId(source.getChangeId()); + budgetBatchItem.setBatchState(source.getBatchState()); + budgetBatchItem.setUserId(source.getUserId()); + budgetBatchItem.setUserCode(source.getUserCode()); + budgetBatchItem.setUserName(source.getUserName()); + budgetBatchItem.setSubmitTime(source.getSubmitTime()); + budgetBatchItem.setRemark(source.getRemark()); + budgetBatchItem.setCreateTime(source.getCreateTime()); + budgetBatchItem.setUpdateTime(source.getUpdateTime()); + budgetBatchItem.setTenantId(source.getTenantId()); + budgetBatchItem.setCreateBy(source.getCreateBy()); + budgetBatchItem.setUpdateBy(source.getUpdateBy()); + budgetBatchItem.setDelFlag(source.getDelFlag()); + return budgetBatchItem; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetChange.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetChange.java new file mode 100644 index 0000000..2d8805a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetChange.java @@ -0,0 +1,217 @@ +package com.qs.serve.modules.tbs.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +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 2023-08-09 + */ +@Data +@TableName(value = "tbs_budget_change", autoResultMap = true) +public class TbsBudgetChange implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 预算id */ + private Long budgetId; + + /** 更变记录编码 */ + @Length(max = 30,message = "更变记录编码长度不能超过30字") + private String changeCode; + + /** 名称 */ + @NotBlank(message = "名称不能为空") + @Length(max = 30,message = "名称长度不能超过30字") + private String budgetTitle; + + /** 名称 */ + private String newBudgetTitle; + + /** 编码 */ + @Length(max = 30,message = "编码长度不能超过30字") + private String budgetNumber; + + /** 审批状态 */ + @NotNull(message = "审批状态不能为空") + private Integer budgetCheckState; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @Length(max = 30,message = "科目编码长度不能超过30字") + private String subjectCode; + + /** 科目名称 */ + @Length(max = 30,message = "科目名称长度不能超过30字") + private String subjectName; + + /** 成本中心类型 */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 20,message = "成本中心类型长度不能超过20字") + private String centerType; + + /** 成本中心id */ + @NotBlank(message = "成本中心id不能为空") + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 30,message = "成本中心编码长度不能超过30字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 30,message = "成本中心名称长度不能超过30字") + private String centerName; + + /** 考核期id */ + @NotNull(message = "考核期id不能为空") + private Long scheduleId; + + /** 考核期编码 */ + @NotBlank(message = "考核期编码不能为空") + @Length(max = 30,message = "考核期编码长度不能超过30字") + private String scheduleCode; + + /** 考核期名称 */ + @NotBlank(message = "考核期名称不能为空") + @Length(max = 30,message = "考核期名称长度不能超过30字") + private String scheduleName; + + /** 致远表单id */ + private String syFormId; + + /** 提交审批时间 */ + @Length(max = 0,message = "提交审批时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime submitTime; + + /** 是否批量提交 */ + private Integer batchApplyFlag; + + private Long batchApplyId; + + /** 申请人 */ + @NotBlank(message = "申请人不能为空") + @Length(max = 32,message = "申请人长度不能超过32字") + private String userId; + + /** 用户编码 */ + @Length(max = 32,message = "长度不能超过32字") + private String userCode; + + /** 用户名称 */ + @Length(max = 32,message = "长度不能超过32字") + @TableField(condition = SqlCondition.LIKE) + private String userName; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 附件id */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] orgAttachIds; + + + /** 附件id */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] newAttachIds; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 原来的条件 */ + @TableField(exist = false) + private List orgConditionList; + + @TableField(exist = false) + private List changeScheduleItemList; + + @TableField(exist = false) + private List changeConditionList; + + @TableField(exist = false) + private List newAttachInfos; + + @TableField(exist = false) + private List orgAttachInfos; + + @TableField(exist = false) + private String applyType; + + public static TbsBudgetChange toNewObject(TbsBudget source){ + TbsBudgetChange budgetChange = new TbsBudgetChange(); + budgetChange.setBudgetId(source.getId()); + budgetChange.setBudgetTitle(source.getBudgetCode()); + budgetChange.setBudgetNumber(source.getBudgetNumber()); + budgetChange.setBudgetCheckState(source.getBudgetCheckState()); + budgetChange.setSubjectId(source.getSubjectId()); + budgetChange.setSubjectCode(source.getSubjectCode()); + budgetChange.setSubjectName(source.getSubjectName()); + budgetChange.setCenterType(source.getCenterType()); + budgetChange.setCenterId(source.getCenterId()); + budgetChange.setCenterCode(source.getCenterCode()); + budgetChange.setCenterName(source.getCenterName()); + budgetChange.setScheduleId(source.getScheduleId()); + budgetChange.setScheduleCode(source.getScheduleCode()); + budgetChange.setScheduleName(source.getScheduleName()); + budgetChange.setRemark(source.getRemark()); + return budgetChange; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetChangeCondition.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetChangeCondition.java new file mode 100644 index 0000000..566fa1d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetChangeCondition.java @@ -0,0 +1,129 @@ +package com.qs.serve.modules.tbs.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 2023-08-09 + */ +@Data +@TableName("tbs_budget_change_condition") +public class TbsBudgetChangeCondition implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 更变记录id */ + @NotNull(message = "更变记录id不能为空") + private Long changeId; + + /** 预算id */ + @NotNull(message = "预算id不能为空") + private Long budgetId; + + /** 是否原来的 */ + private Integer sourceFlag; + + /** 目标类型(brand、category、series、spu、sku) */ + @NotBlank(message = "目标类型(brand、category、series、spu、sku)不能为空") + @Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字") + private String targetType; + + /** 目标id */ + @NotNull(message = "目标id不能为空") + private Long targetId; + + /** 目标编码 */ + @NotBlank(message = "目标编码不能为空") + @Length(max = 100,message = "目标编码长度不能超过100字") + private String targetCode; + + /** 目标名称 */ + @NotBlank(message = "目标名称不能为空") + @Length(max = 500,message = "目标名称长度不能超过500字") + private String targetName; + + /** 目标等级路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathIds; + + /** 目标等级路径 */ + @Length(max = 1200,message = "目标等级路径长度不能超过1200字") + private String targetLevelPathNames; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + public static TbsBudgetChangeCondition toNewObject(TbsBudgetCondition source){ + TbsBudgetChangeCondition budgetChangeCondition = new TbsBudgetChangeCondition(); + //budgetChangeCondition.setId(source.getId()); + //budgetChangeCondition.setChangeId(source.getChangeId()); + budgetChangeCondition.setBudgetId(source.getBudgetId()); + budgetChangeCondition.setTargetType(source.getTargetType()); + budgetChangeCondition.setTargetId(source.getTargetId()); + budgetChangeCondition.setTargetCode(source.getTargetCode()); + budgetChangeCondition.setTargetName(source.getTargetName()); + budgetChangeCondition.setTargetLevelPathIds(source.getTargetLevelPathIds()); + budgetChangeCondition.setTargetLevelPathNames(source.getTargetLevelPathNames()); + budgetChangeCondition.setRemark(source.getRemark()); +// budgetChangeCondition.setCreateTime(source.getCreateTime()); +// budgetChangeCondition.setUpdateTime(source.getUpdateTime()); +// budgetChangeCondition.setTenantId(source.getTenantId()); +// budgetChangeCondition.setCreateBy(source.getCreateBy()); +// budgetChangeCondition.setUpdateBy(source.getUpdateBy()); +// budgetChangeCondition.setDelFlag(source.getDelFlag()); + return budgetChangeCondition; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetChangeScheduleItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetChangeScheduleItem.java new file mode 100644 index 0000000..344c5b8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetChangeScheduleItem.java @@ -0,0 +1,156 @@ +package com.qs.serve.modules.tbs.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 2023-08-09 + */ +@Data +@TableName("tbs_budget_change_schedule_item") +public class TbsBudgetChangeScheduleItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 更变记录id */ + private Long changeId; + + /** 和原来记录做对比,判断是否更变 */ + private Integer changeFlag; + + /** TbsScheduleItemBudget.id */ + private Long sourceId; + + /** 考核id */ + @NotNull(message = "考核id不能为空") + private Long scheduleId; + + /** 考核期项id */ + @NotNull(message = "考核期项id不能为空") + private Long scheduleItemId; + + /** 考核编码 */ + @NotBlank(message = "考核编码不能为空") + @Length(max = 30,message = "考核编码长度不能超过30字") + private String itemName; + + /** 开始时间 */ + @NotNull(message = "开始时间不能为空") + @Length(max = 0,message = "开始时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime startDate; + + /** 结束时间 */ + @NotNull(message = "结束时间不能为空") + @Length(max = 0,message = "结束时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime endDate; + + /** 预算id */ + @NotNull(message = "预算id不能为空") + private Long budgetId; + + /** 预算金额 */ + @NotNull(message = "预算金额不能为空") + private BigDecimal budgetAmount; + + /** 预估发货金额 */ + private BigDecimal preDispatchAmount; + + /** 新的预算金额 */ + private BigDecimal newBudgetAmount; + + /** 新的预估发货金额 */ + private BigDecimal newPreDispatchAmount; + + /** 品牌名称 */ + private String brandNames; + + /** 类目名称 */ + private String categoryNames; + + /** 系列名称 */ + private String seriesNames; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + public static TbsBudgetChangeScheduleItem toNewObject(TbsScheduleItemBudget source){ + TbsBudgetChangeScheduleItem budgetChangeScheduleItem = new TbsBudgetChangeScheduleItem(); + budgetChangeScheduleItem.setSourceId(source.getId()); + //budgetChangeScheduleItem.setChangeId(source.getChangeId()); + budgetChangeScheduleItem.setScheduleId(source.getScheduleId()); + budgetChangeScheduleItem.setScheduleItemId(source.getScheduleItemId()); + budgetChangeScheduleItem.setItemName(source.getItemName()); + budgetChangeScheduleItem.setStartDate(source.getStartDate()); + budgetChangeScheduleItem.setEndDate(source.getEndDate()); + budgetChangeScheduleItem.setBudgetId(source.getBudgetId()); + budgetChangeScheduleItem.setBudgetAmount(source.getBudgetAmount()); + budgetChangeScheduleItem.setPreDispatchAmount(source.getPreDispatchAmount()); +// budgetChangeScheduleItem.setNewBudgetAmount(source.getNewBudgetAmount()); +// budgetChangeScheduleItem.setNewPreDispatchAmount(source.getNewPreDispatchAmount()); + budgetChangeScheduleItem.setRemark(source.getRemark()); +// budgetChangeScheduleItem.setCreateTime(source.getCreateTime()); +// budgetChangeScheduleItem.setUpdateTime(source.getUpdateTime()); +// budgetChangeScheduleItem.setTenantId(source.getTenantId()); +// budgetChangeScheduleItem.setCreateBy(source.getCreateBy()); +// budgetChangeScheduleItem.setUpdateBy(source.getUpdateBy()); +// budgetChangeScheduleItem.setDelFlag(source.getDelFlag()); + return budgetChangeScheduleItem; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetCondition.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetCondition.java new file mode 100644 index 0000000..48b8626 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetCondition.java @@ -0,0 +1,123 @@ +package com.qs.serve.modules.tbs.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 2022-11-12 + */ +@Data +@TableName("tbs_budget_condition") +public class TbsBudgetCondition implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 预算id */ + @NotNull(message = "预算id不能为空") + private Long budgetId; + + private Long changeId; + + /** 目标类型(brand、category、series、spu、sku) */ + @NotBlank(message = "目标类型(brand、category、series、spu、sku)不能为空") + @Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字") + private String targetType; + + /** 目标id */ + @NotNull(message = "目标id不能为空") + private Long targetId; + + /** 目标编码 */ + @NotBlank(message = "目标编码不能为空") + @Length(max = 30,message = "目标编码长度不能超过30字") + private String targetCode; + + /** 目标名称 */ + @NotBlank(message = "目标名称不能为空") + @Length(max = 30,message = "目标名称长度不能超过30字") + private String targetName; + + /** 目标等级路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathIds; + + /** 目标等级路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathNames; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + private String brandId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + @TableField(exist = false) + private String spuName; + + @TableField(exist = false) + private String skuName; + + public static TbsBudgetCondition toNewObject(TbsBudgetChangeCondition source){ + TbsBudgetCondition budgetCondition = new TbsBudgetCondition(); + budgetCondition.setBudgetId(source.getBudgetId()); + budgetCondition.setTargetType(source.getTargetType()); + budgetCondition.setTargetId(source.getTargetId()); + budgetCondition.setTargetCode(source.getTargetCode()); + budgetCondition.setTargetName(source.getTargetName()); + budgetCondition.setTargetLevelPathIds(source.getTargetLevelPathIds()); + budgetCondition.setTargetLevelPathNames(source.getTargetLevelPathNames()); + budgetCondition.setRemark(source.getRemark()); + return budgetCondition; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetCostItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetCostItem.java new file mode 100644 index 0000000..517181b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetCostItem.java @@ -0,0 +1,337 @@ +package com.qs.serve.modules.tbs.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 com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; +import java.util.List; +/** + * 预算费用明细 实体类 + * @author YenHex + * @since 2022-12-02 + */ +@Slf4j +@Data +@TableName("tbs_budget_cost_item") +public class TbsBudgetCostItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 成本明细编码 */ + @Length(max = 30,message = "成本明细编码长度不能超过30字") + private String centerGoodsCode; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 活动编码 */ + private String activityCode; + + /** 客户id */ + private Long supplierId; + + /** 客户编码 */ + private String supplierCode; + + /** 客户名称 */ + private String supplierName; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** 成本中心类型 */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 50,message = "成本中心类型长度不能超过50字") + private String centerType; + + /** 成本中心id */ + @NotBlank(message = "成本中心id不能为空") + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 50,message = "成本中心编码长度不能超过50字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 50,message = "成本中心名称长度不能超过50字") + private String centerName; + + /** 成本中心金额 */ + @NotNull(message = "成本中心金额不能为空") + private BigDecimal centerAmount; + + /** 成本中心占比 */ + @NotNull(message = "成本中心占比不能为空") + private BigDecimal centerRate; + + /** 费用额度 */ + @NotNull(message = "费用额度不能为空") + private BigDecimal centerGoodsAmount; + + /** 费用占比 */ + @NotNull(message = "费用占比不能为空") + private BigDecimal centerGoodsRate; + + /** 目标类型(brand、category、series、spu、sku) */ + @NotBlank(message = "目标类型(brand、category、series、spu、sku)不能为空") + @Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字") + private String targetType; + + /** 目标id */ + @NotNull(message = "目标id不能为空") + private Long targetId; + + /** 目标编码 */ + @NotBlank(message = "目标编码不能为空") + @Length(max = 30,message = "目标编码长度不能超过30字") + private String targetCode; + + /** 目标名称 */ + @NotBlank(message = "目标名称不能为空") + @Length(max = 30,message = "目标名称长度不能超过30字") + private String targetName; + + /** 目标等级路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathIds; + + /** 目标等级路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathNames; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 活动开始时间 */ + @NotNull(message = "活动开始时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate actStartDate; + + /** 活动结束时间 */ + @NotNull(message = "活动结束时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate actEndDate; + + /** 预算开始时间 */ + @NotNull(message = "预算开始时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate preStartDate; + + /** 预算结束时间 */ + @NotNull(message = "预算结束时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate preEndDate; + + /** 预计核销时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate preCheckDate; + + /** 预算id */ + @NotNull(message = "预算id不能为空") + private Long budgetId; + + /** 考核id */ + @NotNull(message = "考核id不能为空") + private Long scheduleId; + + /** 考核期项id */ + @NotNull(message = "考核期项id不能为空") + private Long scheduleItemId; + + private String scheduleItemName; + + /** 录入时考核期总预算 */ + @NotNull(message = "费用占比不能为空") + private BigDecimal scheduleItemAmount; + + /** 后台参数:录入时,考核期已用金额(含申请占用金额) */ + private BigDecimal scheduleItemAmountUsed; + + /** 录入时,考核期申请占用金额 */ + private BigDecimal scheduleItemAmountApply; + + /** 费用考核期项id */ + @NotNull(message = "费用考核期项id不能为空") + private Long scheduleItemBudgetId; + + /** TbsActivityCenterGoods的id */ + private Long centerGoodItemId; + + /** 标识是否政策生成的item,不参与业务,为以后拓展使用 */ + //private Integer policyFlag; + + /** 是否无效(退回,拒绝时使用,释放则不计入预算占用) */ + private Integer invalidFlag; + + + /** 请忽略,后端传输参数 */ + @TableField(exist = false) + private List tempScheduleItemDtoList; + + @TableField(exist = false) + private String spuName; + + @TableField(exist = false) + private String skuName; + + public void initSpuSkuName(){ + if(this.getTargetType().equals(TbsGoodsType.sku.name())){ + try { + String[] names = this.getTargetLevelPathNames().split("_"); + this.setSkuName(names[names.length-1]); + this.setSpuName(names[names.length-2]); + } catch (Exception e) { + log.error("格式错误:{}",this.getTargetLevelPathNames()); + } + } + } + + public TbsCostUnItem toTbsCostUnItem(TbsActivity activity){ + TbsCostUnItem item = new TbsCostUnItem(); + item.setCostApplyId(this.costApplyId); + item.setActivityId(this.activityId); + item.setActivityCode(this.activityCode); + item.setSubjectId(this.subjectId); + item.setSubjectCode(this.subjectCode); + item.setSubjectName(this.subjectName); + item.setCenterType(this.centerType); + item.setCenterId(this.centerId); + item.setCenterCode(this.centerCode); + item.setCenterName(this.centerName); + item.setAmount(this.centerGoodsAmount); + item.setTargetType(this.targetType); + item.setTargetId(this.targetId); + item.setTargetCode(this.targetCode); + item.setTargetName(this.targetName); + item.setTargetLevelPathIds(this.targetLevelPathIds); + item.setTargetLevelPathNames(this.targetLevelPathNames); + item.setSupplierId(this.supplierId); + item.setSupplierCode(this.supplierCode); + item.setSupplierName(this.supplierName); + if(activity!=null){ + item.setActStartDate(activity.getActStartDate()); + item.setActEndDate(activity.getActEndDate()); + item.setPreStartDate(activity.getPreStartDate()); + item.setPreEndDate(activity.getPreEndDate()); + item.setPreCheckDate(activity.getPreCheckDate()); + } + return item; + } + + public TbsBudgetLog toBudgetLog(TbsCostApply costApply,BudgetLogOptFlag optType, BigDecimal amount, SysUser sysUser,String budgetCode,String activityTitle){ + TbsBudgetLog budgetLog = new TbsBudgetLog(); + budgetLog.setBudgetId(this.getBudgetId()); + budgetLog.setBudgetCode(budgetCode); + budgetLog.setOptType(optType.getCode()); + budgetLog.setOptUserId(sysUser.getId()); + budgetLog.setOptUserCode(sysUser.getCode()); + budgetLog.setOptUserName(sysUser.getName()); + budgetLog.setAmount(TbsBudgetLogBuildUtil.buildAmount(amount,optType)); + budgetLog.setScheduleId(this.getScheduleId()); + budgetLog.setScheduleItemId(this.getScheduleItemId()); + budgetLog.setScheduleItemBudgetId(this.getScheduleItemBudgetId()); + budgetLog.setItemName(this.getScheduleItemName()); + budgetLog.setStartDate(this.getActStartDate().atStartOfDay()); + budgetLog.setEndDate(this.getActEndDate().atStartOfDay()); + budgetLog.setSubjectId(this.getSubjectId()); + budgetLog.setSubjectCode(this.getSubjectCode()); + budgetLog.setSubjectName(this.getSubjectName()); + budgetLog.setCenterId(this.getCenterId()); + budgetLog.setCenterCode(this.getCenterCode()); + budgetLog.setCenterName(this.getCenterName()); + budgetLog.setCenterType(this.getCenterType()); + budgetLog.setSupplierId(this.getSupplierId()); + budgetLog.setSupplierCode(this.getSupplierCode()); + budgetLog.setSupplierName(this.getSupplierName()); + budgetLog.setActivityId(this.getActivityId()); + budgetLog.setActivityCode(this.getActivityCode()); + budgetLog.setActivityTheme(activityTitle); + budgetLog.setCostApplyId(costApply.getId()); + budgetLog.setCostApplyCode(costApply.getCode()); + budgetLog.setCostApplyTheme(costApply.getChargeTheme()); + budgetLog.setTargetType(this.getTargetType()); + budgetLog.setTargetId(this.getTargetId()); + budgetLog.setTargetCode(this.getTargetCode()); + budgetLog.setTargetName(this.getTargetName()); + budgetLog.setTargetLevelPathIds(this.getTargetLevelPathIds()); + budgetLog.setTargetLevelPathNames(this.getTargetLevelPathNames()); + return budgetLog; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetCostItemPolicy.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetCostItemPolicy.java new file mode 100644 index 0000000..7bd54de --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetCostItemPolicy.java @@ -0,0 +1,182 @@ +package com.qs.serve.modules.tbs.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 2023-02-22 + */ +@Data +@TableName("tbs_budget_cost_item_policy") +public class TbsBudgetCostItemPolicy implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long policyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long policyItemId; + + /** 活动编码 */ + @Length(max = 30,message = "活动编码长度不能超过30字") + private String policyItemCode; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** 成本中心类型 */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 50,message = "成本中心类型长度不能超过50字") + private String centerType; + + /** 成本中心id */ + @NotBlank(message = "成本中心id不能为空") + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 50,message = "成本中心编码长度不能超过50字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 50,message = "成本中心名称长度不能超过50字") + private String centerName; + + /** 费用额度 */ + @NotNull(message = "费用额度不能为空") + private BigDecimal policyItemAmount; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 政策项开始时间 */ + @NotNull(message = "政策项开始时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate policyItemStartDate; + + /** 政策项结束时间 */ + @NotNull(message = "政策项结束时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate policyItemEndDate; + + /** 考核id */ + @NotNull(message = "考核id不能为空") + private Long scheduleId; + + /** 考核期项id */ + @NotNull(message = "考核期项id不能为空") + private Long scheduleItemId; + + /** 考核期名称 */ + @NotBlank(message = "考核期名称不能为空") + @Length(max = 30,message = "考核期名称长度不能超过30字") + private String scheduleItemName; + + /** 录入时,考核期可用预算 */ + @NotNull(message = "录入时,考核期可用预算不能为空") + private BigDecimal scheduleItemAmount; + + /** 录入时,考核期已用金额(含申请占用金额) */ + @NotNull(message = "录入时,考核期已用金额(含申请占用金额)不能为空") + private BigDecimal scheduleItemAmountUsed; + + /** 录入时,考核期申请占用金额 */ + @NotNull(message = "录入时,考核期申请占用金额不能为空") + private BigDecimal scheduleItemAmountApply; + + /** 预算id */ + @NotNull(message = "预算id不能为空") + private Long budgetId; + + /** 预算考核期id */ + @NotNull(message = "预算考核期id不能为空") + private Long scheduleItemBudgetId; + + /** 是否无效 */ + @NotNull(message = "是否无效不能为空") + private Integer invalidFlag; + + /** 客户id */ + @NotNull(message = "客户id不能为空") + private Long supplierId; + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + @Length(max = 30,message = "客户编码长度不能超过30字") + private String supplierCode; + + /** 客户名称 */ + @NotBlank(message = "客户名称不能为空") + @Length(max = 30,message = "客户名称长度不能超过30字") + private String supplierName; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetLog.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetLog.java new file mode 100644 index 0000000..2c88736 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetLog.java @@ -0,0 +1,335 @@ +package com.qs.serve.modules.tbs.entity; + +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 com.qs.serve.common.model.enums.BudgetLogOptFlag; +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 2023-01-05 + */ +@Data +@TableName("tbs_budget_log") +public class TbsBudgetLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 预算id */ + @NotNull(message = "预算id不能为空") + private Long budgetId; + + /** 预算编码 */ + @NotBlank(message = "预算编码不能为空") + @Length(max = 30,message = "预算编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String budgetCode; + + /** 类型: + * 0-预算新增;1-费用申请;2-预算调增;3-预算调减;4-费用释放;5-费用申请调增;6-费用申请调减 + * {@link BudgetLogOptFlag} + **/ + @NotNull(message = "类型不能为空") + private Integer optType; + + /** 操作人id */ + @NotBlank(message = "操作人id不能为空") + @Length(max = 32,message = "操作人id长度不能超过32字") + private String optUserId; + + /** 操作人名称 */ + @NotBlank(message = "操作人名称不能为空") + @Length(max = 32,message = "操作人名称长度不能超过32字") + @TableField(condition = SqlCondition.LIKE) + private String optUserName; + + /** 操作人编号 */ + @NotBlank(message = "操作人编号不能为空") + @Length(max = 32,message = "操作人编号长度不能超过32字") + @TableField(condition = SqlCondition.LIKE) + private String optUserCode; + + /** 预算金额/调整金额/释放金额 */ + @NotNull(message = "预算金额/调整金额/释放金额不能为空") + private BigDecimal amount; + + /** 考核id */ + @NotNull(message = "考核id不能为空") + private Long scheduleId; + + /** 考核期项id */ + @NotNull(message = "考核期项id不能为空") + private Long scheduleItemId; + + /** 预算的考核期id */ + @NotNull(message = "预算的考核期id不能为空") + private Long scheduleItemBudgetId; + + /** 原考核id */ + @NotNull(message = "考核id不能为空") + private Long scheduleOrgId; + + /** 原考核期项id */ + @NotNull(message = "考核期项id不能为空") + private Long scheduleItemOrgId; + + /** 原预算的考核期id */ + @NotNull(message = "预算的考核期id不能为空") + private Long scheduleItemBudgetOrgId; + + /** 考核编码 */ + @NotBlank(message = "考核编码不能为空") + @Length(max = 30,message = "考核编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String itemName; + + /** 开始时间 */ + @NotNull(message = "开始时间不能为空") + @Length(max = 0,message = "开始时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime startDate; + + /** 结束时间 */ + @NotNull(message = "结束时间不能为空") + @Length(max = 0,message = "结束时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime endDate; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 30,message = "科目编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 30,message = "科目名称长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String subjectName; + + /** 成本中心类型 */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 20,message = "成本中心类型长度不能超过20字") + private String centerType; + + /** 成本中心id */ + @NotBlank(message = "成本中心id不能为空") + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 30,message = "成本中心编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 30,message = "成本中心名称长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String centerName; + + + /** 原成本中心id */ + private String centerOrgId; + + /** 原成本中心编码 */ + private String centerOrgCode; + + /** 原成本中心名称 */ + private String centerOrgName; + + /** 客户id */ + private Long supplierId; + + /** 客户编码 */ + @Length(max = 30,message = "客户编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String supplierCode; + + /** 客户名称 */ + @Length(max = 30,message = "客户名称长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String supplierName; + + /** 活动id */ + private Long activityId; + + /** 活动编码 */ + @Length(max = 30,message = "活动编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String activityCode; + + @TableField(condition = SqlCondition.LIKE) + private String activityTheme; + + /** 政策id */ + private Long policyId; + + /** 政策编码 */ + @Length(max = 30,message = "政策编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String policyCode; + + /** 政策标题 */ + @Length(max = 255,message = "政策标题长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String policyTitle; + + /** 政策项id */ + @TableField(condition = SqlCondition.LIKE) + private Long policyItemId; + + /** 政策项编码 */ + @Length(max = 30,message = "政策项编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String policyItemCode; + + /** 政策生成的费用ID */ + private Long createCostId; + + /** 政策生成的政策ID */ + private Long createPolicyItemId; + + /** 费用申请id */ + private Long costApplyId; + + /** 费用申请编码 */ + @Length(max = 30,message = "费用申请编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String costApplyCode; + + /** 费用申请主题 */ + @Length(max = 150,message = "费用申请主题长度不能超过150字") + @TableField(condition = SqlCondition.LIKE) + private String costApplyTheme; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** + * 回退标识 + * */ + private Integer rollbackFlag; + + /** + * 迁移标识:0-未迁移;1-已迁移 + **/ + private Integer migrateFlag; + + /** + * 迁移时间 + **/ + private LocalDateTime migrateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 目标类型(brand、category、series、spu、sku) */ + @Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字") + private String targetType; + + /** 目标id */ + private Long targetId; + + /** 目标编码 */ + @Length(max = 30,message = "目标编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String targetCode; + + /** 目标名称 */ + @Length(max = 30,message = "目标名称长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String targetName; + + /** 目标等级路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathIds; + + /** 目标等级路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathNames; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + public TbsCostUnItem toTbsCostUnItem(TbsActivity activity){ + TbsCostUnItem item = new TbsCostUnItem(); + item.setCostApplyId(this.costApplyId); + item.setActivityId(this.activityId); + item.setActivityCode(this.activityCode); + item.setSubjectId(this.subjectId); + item.setSubjectCode(this.subjectCode); + item.setSubjectName(this.subjectName); + item.setCenterType(this.centerType); + item.setCenterId(this.centerId); + item.setCenterCode(this.centerCode); + item.setCenterName(this.centerName); + item.setAmount(this.amount); + item.setTargetType(this.targetType); + item.setTargetCode(this.targetCode); + item.setTargetName(this.targetName); + item.setTargetLevelPathIds(this.targetLevelPathIds); + item.setTargetLevelPathNames(this.targetLevelPathNames); + item.setSupplierId(this.supplierId); + item.setSupplierCode(this.supplierCode); + item.setSupplierName(this.supplierName); + if(activity!=null){ + item.setActStartDate(activity.getActStartDate()); + item.setActEndDate(activity.getActEndDate()); + item.setPreStartDate(activity.getPreStartDate()); + item.setPreEndDate(activity.getPreEndDate()); + item.setPreCheckDate(activity.getPreCheckDate()); + } + return item; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetPlan.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetPlan.java new file mode 100644 index 0000000..d3ae7eb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsBudgetPlan.java @@ -0,0 +1,99 @@ +package com.qs.serve.modules.tbs.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 2023-07-10 + */ +@Data +@TableName("tbs_budget_plan") +public class TbsBudgetPlan implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 年度 */ + @NotBlank(message = "年度不能为空") + @Length(max = 255,message = "年度长度不能超过255字") + private String budgetYear; + + /** 年度规划销售金额 */ + @NotNull(message = "年度规划销售金额不能为空") + private BigDecimal budgetPlanSaleAmout; + + /** 年度规划预算金额 */ + @NotNull(message = "年度规划预算金额不能为空") + private BigDecimal budgetPlanAmount; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + public static TbsBudgetPlan toNewObject(TbsBudgetPlan source){ + TbsBudgetPlan budgetPlan = new TbsBudgetPlan(); + budgetPlan.setId(source.getId()); + budgetPlan.setBudgetYear(source.getBudgetYear()); + budgetPlan.setBudgetPlanSaleAmout(source.getBudgetPlanSaleAmout()); + budgetPlan.setBudgetPlanAmount(source.getBudgetPlanAmount()); + budgetPlan.setRemark(source.getRemark()); + budgetPlan.setCreateTime(source.getCreateTime()); + budgetPlan.setUpdateTime(source.getUpdateTime()); + budgetPlan.setTenantId(source.getTenantId()); + budgetPlan.setCreateBy(source.getCreateBy()); + budgetPlan.setUpdateBy(source.getUpdateBy()); + budgetPlan.setDelFlag(source.getDelFlag()); + return budgetPlan; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostApply.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostApply.java new file mode 100644 index 0000000..52b7f31 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostApply.java @@ -0,0 +1,298 @@ +package com.qs.serve.modules.tbs.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 com.qs.serve.modules.tag.entity.so.TagQuery; +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; +import java.util.List; +import java.util.Map; + +/** + * 费用申请 实体类 + * @author YenHex + * @since 2022-11-09 + */ +@Data +@TableName("tbs_cost_apply") +public class TbsCostApply implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + private String code; + + /** 发货单号 */ + private String disCode; + + /** 发票号 */ + private String billNumber; + + /** 主题 */ + @NotBlank(message = "主题不能为空") + @Length(max = 60,message = "主题长度不能超过60字") + @TableField(condition = SqlCondition.LIKE) + private String chargeTheme; + + private String recId; + + /** 客户id */ + @NotNull(message = "客户id不能为空") + private Long supplierId; + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + @Length(max = 30,message = "客户编码长度不能超过30字") + private String supplierCode; + + /** 客户名称 */ + @NotBlank(message = "客户名称不能为空") + @Length(max = 30,message = "客户名称长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String supplierName; + + @TableField(condition = SqlCondition.LIKE) + private String supplierBizRegionFirstName; + + @TableField(condition = SqlCondition.LIKE) + private String supplierBizRegionSecondName; + + @TableField(condition = SqlCondition.LIKE) + private String supplierBizRegionThirdName; + + /** 状态:0=未发布;1=审批中;2=待执行;3=完成;4-被驳回;5-中止;6-作废;7-异动 @{link TbsCostApplyState} */ + @NotNull(message = "状态不能为空") + private Integer chargeState; + + /** + * 不参与业务流程,核销状态: + * 有这四个状态: + * 0-未核销:代表这案子里面的所有活动都还未开始核销; + * 1-已通过:代表这个案子的所有活动都已经核销完成; + * 2-核销中:代表这个案子的某些活动在核销中; + * 3-被拒绝;代表这个案子里面的所有活动金额都被释放了 + * 4-部分核销,部分已核销,还有未完成部分 + */ + private Integer checkState; + + /** + * 记录核销状态 + * 用于记录核销前状态 + */ + //private Integer logCheckState; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 匹配规则类型 */ + private Integer matchType; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime submitTime; + + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime passTime; + + /** 申请人 */ + @NotBlank(message = "申请人不能为空") + @Length(max = 32,message = "申请人长度不能超过32字") + private String userId; + + /** 用户编码 */ + @Length(max = 32,message = "长度不能超过32字") + @TableField(condition = SqlCondition.LIKE) + private String userCode; + + /** 用户名称 */ + @Length(max = 32,message = "长度不能超过32字") + @TableField(condition = SqlCondition.LIKE) + private String userName; + + private String syFormId; + + private String syFlowId; + + /** + * 合同类型:0->无;1->有合同;2->进场费 + */ + private Integer contractFlag; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 统计活动数量 */ + private Integer totalActivity; + + /** 统计所有活动申请的金额 */ + private BigDecimal totalActivityAmount; + + /** 统计所有活动预估发货的金额 */ + private BigDecimal totalActivityPreAmount; + + /** 统计所有活动预估不发货的金额 */ + private BigDecimal totalActivityPreNotAmount; + + /** 统计所有活动使用的金额 */ + private BigDecimal totalActivityUsedAmount; + + /** 政策项ID */ + private Long policyItemId; + + private String policyItemCode; + + /** 模板id */ + private Long templateId; + + private String templateTitle; + + private Integer costThemeEditFlag; + + private Integer cancelFlag; + + /** + * 异动来源id + */ + private Long changeSourceId; + + /** + * 异动继承的id + */ + private Long changeExtendId; + + /** + * 异动时记录状态 + */ + private Integer changeStateRecord; + + /** + * 异动发起时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime changeActionTime; + + private Integer selectType; + + /** + * 编辑金额标识 + * 审批通过时恢复0 + */ + private Integer editAmountFlag; + + /** + * 业务继承人 + */ + private String extUserId; + private String extUserCode; + private String extUserName; + + /** 支付状态: 0->未支付;1->部分支付;2->已支付 */ + private Integer payStatus; + + /** 验收状态: 0->未验收;1-验收中;2-部分验收;3完成 */ + private Integer agreeCheckStatus; + + private Integer tmpState; + + @TableField(exist = false) + private String affairId; + + @TableField(exist = false) + private Object contractInfo; + + /** + * 用于逾期判断 + */ + @TableField(exist = false) + private LocalDate actEndDate; + + /** + * 逾期结果(拼接,非持久化) + */ + @TableField(exist = false) + private Integer overdueState; + + /** + * 逾期结果(拼接,非持久化) + * 0=>未逾期、1=>已逾期、2=>即将逾期 + */ + @TableField(exist = false) + LocalDate nowDate; + + /** + * 逾期结果(拼接,非持久化) + */ + @TableField(exist = false) + LocalDate startNowDate; + + /** + * 逾期结果(拼接,非持久化) + */ + @TableField(exist = false) + List selectUserIds; + + + /** + * 异动修改日志 + */ + @TableField(exist = false) + List changeInfoLogs; + + @TableField(exist = false) + List tagQueryList; + + @TableField(exist = false) + String pageNum; + + @TableField(exist = false) + String pageSize; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostBirLog.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostBirLog.java new file mode 100644 index 0000000..a1c2ca8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostBirLog.java @@ -0,0 +1,72 @@ +package com.qs.serve.modules.tbs.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-03-27 + */ +@Data +@TableName("tbs_cost_bir_log") +public class TbsCostBirLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 费用id */ + private Long costId; + + /** 0-未处理;1-已处理 */ + private Integer status; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostChangeInfo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostChangeInfo.java new file mode 100644 index 0000000..65bec07 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostChangeInfo.java @@ -0,0 +1,103 @@ +package com.qs.serve.modules.tbs.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 2023-12-18 + */ +@Data +@TableName("tbs_cost_change_info") +public class TbsCostChangeInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 原费用申请ID */ + private Long sourceId; + + /** 新的费用申请ID */ + private Long extendId; + + /** 更变的表主体 */ + @Length(max = 255,message = "更变的表主体长度不能超过255字") + private String changeType; + + /** 修改信息 */ + @Length(max = 512,message = "修改信息长度不能超过512字") + private String changeInfo; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + public static TbsCostChangeInfo toNewObject(String changeType,String changeInfo){ + TbsCostChangeInfo costChangeInfo = new TbsCostChangeInfo(); + costChangeInfo.setChangeType(changeType); + costChangeInfo.setChangeInfo(changeInfo); + return costChangeInfo; + } + + public static TbsCostChangeInfo toNewObject(TbsCostChangeInfo source){ + TbsCostChangeInfo costChangeInfo = new TbsCostChangeInfo(); + costChangeInfo.setId(source.getId()); + costChangeInfo.setSourceId(source.getSourceId()); + costChangeInfo.setExtendId(source.getExtendId()); + costChangeInfo.setChangeType(source.getChangeType()); + costChangeInfo.setChangeInfo(source.getChangeInfo()); + costChangeInfo.setCreateTime(source.getCreateTime()); + costChangeInfo.setUpdateTime(source.getUpdateTime()); + costChangeInfo.setTenantId(source.getTenantId()); + costChangeInfo.setCreateBy(source.getCreateBy()); + costChangeInfo.setUpdateBy(source.getUpdateBy()); + costChangeInfo.setDelFlag(source.getDelFlag()); + return costChangeInfo; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostContract.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostContract.java new file mode 100644 index 0000000..187536e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostContract.java @@ -0,0 +1,163 @@ +package com.qs.serve.modules.tbs.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 com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * 费用合同 实体类 + * @author YenHex + * @since 2023-03-14 + */ +@Data +@TableName(value = "tbs_cost_contract",autoResultMap = true) +public class TbsCostContract implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 合同名称 */ + @NotBlank(message = "合同名称不能为空") + @Length(max = 50,message = "合同名称长度不能超过50字") + private String contractName; + + /** 合同金额 */ + private BigDecimal contractAmount; + + /** 合同条件(文本框) */ + private String contractCondition; + + /** 合同附件地址 */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] attachIds; + + /** 签约时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate signTime; + + /** 到期时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate expireTime; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 业务所属公司 */ + private String businessCompany; + + /** 税号 */ + private String dutyNumber; + + /** 致远的部门id */ + private String oaDeptId; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 收款单位 */ + @Length(max = 255,message = "收款单位长度不能超过255字") + private String payee; + + /** 开户银行 */ + @Length(max = 255,message = "开户银行长度不能超过255字") + private String bankName; + + /** 银行账号 */ + @Length(max = 255,message = "银行账号长度不能超过255字") + private String bankAccount; + + /** 印章名称 */ + @Length(max = 255,message = "印章名称长度不能超过255字") + private String sealName; + + /** 印章编号 */ + @Length(max = 255,message = "印章编号长度不能超过255字") + private String sealId; + + /** 使用印章次数 */ + @Length(max = 255,message = "使用印章次数长度不能超过255字") + private Integer sealNum; + + /** 文件份数 */ + @Length(max = 255,message = "文件份数长度不能超过255字") + private Integer fileNum; + + + /** 附件信息列表 */ + @TableField(exist = false) + private List attachInfoList; + + public static TbsCostContract toNewObject(TbsCostContract source){ + TbsCostContract costContract = new TbsCostContract(); + costContract.setId(source.getId()); + costContract.setCostApplyId(source.getCostApplyId()); + costContract.setContractName(source.getContractName()); + costContract.setContractAmount(source.getContractAmount()); + costContract.setContractCondition(source.getContractCondition()); + costContract.setAttachIds(source.getAttachIds()); + costContract.setSignTime(source.getSignTime()); + costContract.setExpireTime(source.getExpireTime()); + costContract.setRemark(source.getRemark()); + costContract.setCreateTime(source.getCreateTime()); + costContract.setUpdateTime(source.getUpdateTime()); + costContract.setTenantId(source.getTenantId()); + costContract.setCreateBy(source.getCreateBy()); + costContract.setUpdateBy(source.getUpdateBy()); + costContract.setDelFlag(source.getDelFlag()); + return costContract; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostPercent.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostPercent.java new file mode 100644 index 0000000..457177e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostPercent.java @@ -0,0 +1,128 @@ +package com.qs.serve.modules.tbs.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 2023-07-02 + */ +@Data +@TableName("tbs_cost_percent") +public class TbsCostPercent implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 客户费率(年) */ + private BigDecimal ytdCustomerPercent; + + /** 申请人费率(年) */ + private BigDecimal ytdUserPercent; + + /** 行政区域费率(年) */ + private BigDecimal ytdRegion2Percent; + + /** 销售区域费率(年) */ + private BigDecimal ytdRegionPercent; + + /** 预算费率(年) */ + private BigDecimal ytdBudgetPercent; + + /** 客户费率 */ + private BigDecimal qtdCustomerPercent; + + /** 申请人费率 */ + private BigDecimal qtdUserPercent; + + /** 行政区域费率 */ + private BigDecimal qtdRegion2Percent; + + /** 销售区域费率 */ + private BigDecimal qtdRegionPercent; + + /** 预算费率 */ + private BigDecimal qtdBudgetPercent; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + public static TbsCostPercent toNewObject(TbsCostPercent source){ + TbsCostPercent costPercent = new TbsCostPercent(); + costPercent.setId(source.getId()); + costPercent.setCostApplyId(source.getCostApplyId()); + costPercent.setYtdCustomerPercent(source.getYtdCustomerPercent()); + costPercent.setYtdUserPercent(source.getYtdUserPercent()); + costPercent.setYtdRegion2Percent(source.getYtdRegion2Percent()); + costPercent.setYtdRegionPercent(source.getYtdRegionPercent()); + costPercent.setYtdBudgetPercent(source.getYtdBudgetPercent()); + costPercent.setQtdCustomerPercent(source.getQtdCustomerPercent()); + costPercent.setQtdUserPercent(source.getQtdUserPercent()); + costPercent.setQtdRegion2Percent(source.getQtdRegion2Percent()); + costPercent.setQtdRegionPercent(source.getQtdRegionPercent()); + costPercent.setQtdBudgetPercent(source.getQtdBudgetPercent()); + costPercent.setRemark(source.getRemark()); + costPercent.setCreateTime(source.getCreateTime()); + costPercent.setUpdateTime(source.getUpdateTime()); + costPercent.setTenantId(source.getTenantId()); + costPercent.setCreateBy(source.getCreateBy()); + costPercent.setUpdateBy(source.getUpdateBy()); + costPercent.setDelFlag(source.getDelFlag()); + return costPercent; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostTodo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostTodo.java new file mode 100644 index 0000000..3332025 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostTodo.java @@ -0,0 +1,137 @@ +package com.qs.serve.modules.tbs.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +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 2023-02-17 + */ +@Data +@TableName(value = "tbs_cost_todo", autoResultMap = true) +public class TbsCostTodo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 编码 */ + private String todoCode; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 提交时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime submitTime; + + + /** 核销状态 0=未发布;1=审批中;2=完成;3-被驳回;4-中止;5关闭 */ + private Integer checkStatus; + + /** 致远表单id */ + private String syFormId; + + /** 致远表单流水号 */ + private String syFlowCode; + + /** 涉及品牌 */ + @Length(max = 255,message = "涉及品牌长度不能超过255字") + private String brands; + + /** 描述 */ + @NotBlank(message = "描述不能为空") + @Length(max = 255,message = "描述长度不能超过255字") + private String descr; + + /** 对应价值 */ + private BigDecimal amount; + + /** 完成状态 */ + private Integer finishedFlag; + + /** 完成时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime finishedTime; + + /** 交付标准 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String payMsg; + + /** 预付款时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate prePayDate; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + private String tenantId; + + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** 附件id */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] attachIds; + + /** 附件id */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] attachIds2; + + /** 附件说明 */ + private String attachDesc; + + @TableField(exist = false) + private List attachList; + @TableField(exist = false) + private List attachList2; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostUnItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostUnItem.java new file mode 100644 index 0000000..dbc61d6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostUnItem.java @@ -0,0 +1,189 @@ +package com.qs.serve.modules.tbs.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 2023-02-02 + */ +@Data +@TableName("tbs_cost_un_item") +public class TbsCostUnItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 活动编码 */ + @Length(max = 30,message = "活动编码长度不能超过30字") + private String activityCode; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** 成本中心类型 */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 50,message = "成本中心类型长度不能超过50字") + private String centerType; + + /** 成本中心id */ + @NotBlank(message = "成本中心id不能为空") + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 50,message = "成本中心编码长度不能超过50字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 50,message = "成本中心名称长度不能超过50字") + private String centerName; + + /** 费用额度 */ + @NotNull(message = "费用额度不能为空") + private BigDecimal amount; + + /** 目标类型(brand、category、series、spu、sku) */ + @NotBlank(message = "目标类型(brand、category、series、spu、sku)不能为空") + @Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字") + private String targetType; + + /** 目标id */ + @NotNull(message = "目标id不能为空") + private Long targetId; + + /** 目标编码 */ + @NotBlank(message = "目标编码不能为空") + @Length(max = 30,message = "目标编码长度不能超过30字") + private String targetCode; + + /** 目标名称 */ + @NotBlank(message = "目标名称不能为空") + @Length(max = 30,message = "目标名称长度不能超过30字") + private String targetName; + + /** 目标等级路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathIds; + + /** 目标等级路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathNames; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 活动开始时间 */ + @NotNull(message = "活动开始时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate actStartDate; + + /** 活动结束时间 */ + @NotNull(message = "活动结束时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate actEndDate; + + /** 预算开始时间 */ + @NotNull(message = "预算开始时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate preStartDate; + + /** 预算结束时间 */ + @NotNull(message = "预算结束时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate preEndDate; + + /** 预计核销时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate preCheckDate; + + /** 客户id */ + @NotNull(message = "客户id不能为空") + private Long supplierId; + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + @Length(max = 30,message = "客户编码长度不能超过30字") + private String supplierCode; + + /** 客户名称 */ + @NotBlank(message = "客户名称不能为空") + @Length(max = 30,message = "客户名称长度不能超过30字") + private String supplierName; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostUnItemPolicy.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostUnItemPolicy.java new file mode 100644 index 0000000..c367d2b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsCostUnItemPolicy.java @@ -0,0 +1,173 @@ +package com.qs.serve.modules.tbs.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 2023-02-24 + */ +@Data +@TableName("tbs_cost_un_item_policy") +public class TbsCostUnItemPolicy implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long policyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long policyItemId; + + /** 活动编码 */ + @Length(max = 30,message = "活动编码长度不能超过30字") + private String policyItemCode; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** 成本中心类型 */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 50,message = "成本中心类型长度不能超过50字") + private String centerType; + + /** 成本中心id */ + @NotBlank(message = "成本中心id不能为空") + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 50,message = "成本中心编码长度不能超过50字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 50,message = "成本中心名称长度不能超过50字") + private String centerName; + + /** 费用额度 */ + @NotNull(message = "费用额度不能为空") + private BigDecimal policyItemAmount; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 政策项开始时间 */ + @NotNull(message = "政策项开始时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate policyItemStartDate; + + /** 政策项结束时间 */ + @NotNull(message = "政策项结束时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate policyItemEndDate; + + /** 后补的考核id */ + private Long scheduleId; + + /** 后补的考核期项id */ + private Long scheduleItemId; + + /** 后补的预算id */ + private Long budgetId; + + /** 后补的预算考核期id */ + private Long scheduleItemBudgetId; + + /** 是否无效 */ + @NotNull(message = "是否无效不能为空") + private Integer invalidFlag; + + /** 客户id */ + @NotNull(message = "客户id不能为空") + private Long supplierId; + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + @Length(max = 30,message = "客户编码长度不能超过30字") + private String supplierCode; + + /** 客户名称 */ + @NotBlank(message = "客户名称不能为空") + @Length(max = 30,message = "客户名称长度不能超过30字") + private String supplierName; + + public void initSetNull(){ + this.setScheduleId(null); + this.setScheduleItemId(null); + this.setBudgetId(null); + this.setScheduleItemBudgetId(null); + this.setId(null); + this.setCreateBy(null); + this.setCreateTime(null); + this.setUpdateBy(null); + this.setUpdateTime(null); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsSchedule.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsSchedule.java new file mode 100644 index 0000000..c3f8a67 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsSchedule.java @@ -0,0 +1,85 @@ +package com.qs.serve.modules.tbs.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.modules.bms.entity.BmsRegionUser; +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 2022-11-08 + */ +@Data +@TableName("tbs_schedule") +public class TbsSchedule implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 考核名称 */ + @NotBlank(message = "考核名称不能为空") + @Length(max = 30,message = "考核名称长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String code; + + /** 考核编码 */ + @NotBlank(message = "考核编码不能为空") + @Length(max = 30,message = "考核编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String name; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + @TableField(exist = false) + private List scheduleItemlist; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsScheduleItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsScheduleItem.java new file mode 100644 index 0000000..c36db8e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsScheduleItem.java @@ -0,0 +1,92 @@ +package com.qs.serve.modules.tbs.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 2022-11-08 + */ +@Data +@TableName("tbs_schedule_item") +public class TbsScheduleItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 考核id */ + @NotNull(message = "考核id不能为空") + private Long scheduleId; + + /** 考核编码 */ + @NotBlank(message = "考核编码不能为空") + @Length(max = 30,message = "考核编码长度不能超过30字") + private String itemName; + + /** 开始时间 */ + @NotNull(message = "开始时间不能为空") + @Length(max = 0,message = "开始时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime startDate; + + /** 结束时间 */ + @NotNull(message = "结束时间不能为空") + @Length(max = 0,message = "结束时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime endDate; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsScheduleItemBudget.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsScheduleItemBudget.java new file mode 100644 index 0000000..93ba7c1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/TbsScheduleItemBudget.java @@ -0,0 +1,168 @@ +package com.qs.serve.modules.tbs.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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 2022-11-08 + */ +@Data +@TableName("tbs_schedule_item_budget") +public class TbsScheduleItemBudget implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 考核id */ + @NotNull(message = "考核id不能为空") + private Long scheduleId; + + /** 考核项id */ + private Long scheduleItemId; + + /** 考核编码 */ + @NotBlank(message = "考核编码不能为空") + @Length(max = 30,message = "考核编码长度不能超过30字") + private String itemName; + + /** 开始时间 */ + @NotNull(message = "开始时间不能为空") + @Length(max = 0,message = "开始时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime startDate; + + /** 结束时间 */ + @NotNull(message = "结束时间不能为空") + @Length(max = 0,message = "结束时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime endDate; + + /** 预算id */ + @NotNull(message = "预算id不能为空") + private Long budgetId; + + /** 预算金额 */ + @NotNull(message = "预算金额不能为空") + private BigDecimal budgetAmount; + + + @NotNull(message = "预估发货金额") + private BigDecimal preDispatchAmount; + + private BigDecimal preDispatchAmountFirst; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + @TableField(exist = false) + private List budgetLogList; + + /** + * 预算总额 + * select sum(tbg.amount),tbg.schedule_item_budget_id from tbs_budget_log tbg where tbg.opt_type in(0,2,3) GROUP BY tbg.schedule_item_budget_id limit 1000 + */ + @TableField(exist = false) + private BigDecimal finalBudgetAmount; + + /** + * 已用预算 + * select sum(tbg.amount),tbg.schedule_item_budget_id from tbs_budget_log tbg where tbg.opt_type not in(0,2,3) GROUP BY tbg.schedule_item_budget_id limit 1000 + */ + @TableField(exist = false) + private BigDecimal usedBudgetAmount; + + /** + * 未用预算 + * select sum(tbg.amount),tbg.schedule_item_budget_id from tbs_budget_log tbg where tbg.opt_type GROUP BY tbg.schedule_item_budget_id limit 1000 + */ + @TableField(exist = false) + private BigDecimal unUsedBudgetAmount; + + /** + * 政策占用的预算 + */ + @TableField(exist = false) + private BigDecimal sumPolicyAmount; + + /** + * 退回的费用申请占用预算 + */ + @TableField(exist = false) + private BigDecimal sumCostBackAmount; + + @TableField(exist = false) + private Integer budgetConditionFlag; + + @TableField(exist = false) + private Long budgetSubjectId; + + @TableField(exist = false) + private String conditionGoodsIds; + + @TableField(exist = false) + private String budgetName; + + @TableField(exist = false) + private String budgetCode; + +// public BigDecimal compareTargetExpenseRate(){ +// if(budgetAmount!=null&&preDispatchAmount!=null&&preDispatchAmount.compareTo(BigDecimal.ZERO)!=0){ +// return budgetAmount.divide(preDispatchAmount,BigDecimal.ROUND_DOWN); +// } +// return null; +// } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityBo.java new file mode 100644 index 0000000..53fc865 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityBo.java @@ -0,0 +1,119 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonFormat; +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; +import java.util.List; + +/** + * 费用活动 VO + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsActivityBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 模板标题 */ + private String templateTitle; + + /** 供应商id */ + private Long supplierId; + + /** 费用申请id */ + private Long costApplyId; + + /** 活动简述及目的 */ + @NotBlank(message = "活动简述及目的不能为空") + @Length(max = 255,message = "活动简述及目的长度不能超过255字") + private String actTitle; + + /** 活动开始时间 */ + @NotNull(message = "活动开始时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate actStartDate; + + /** 活动结束时间 */ + @NotNull(message = "活动结束时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate actEndDate; + + /** 预算开始时间 */ + @NotNull(message = "活动开始时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate preStartDate; + + /** 预算结束时间 */ + @NotNull(message = "活动结束时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate preEndDate; + + /** 预计核销时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate preCheckDate; + + /** + * 预算销量标识 + */ + private Integer preActFlag; + + /** 预计活动销量 */ + private BigDecimal preActQuantity; + + /** 预计不做活动销量 */ + private BigDecimal preNotActQuantity; + + /** 预估roi费率(人工输入) */ + private BigDecimal preRoiRate; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 产品类型(brand、category、series、spu、sku) */ + @NotBlank(message = "目标类型不能为空") + private String activityGoodsType; + + /** 产品id列表 */ + @NotNull(message = "请选择产品") + private List activityGoodsList; + + /** 成本中心列表 */ + @NotNull(message = "请选择成本中心") + private List activitySubjectList; + + /** 产品与成本中心配比 */ + @NotNull(message = "产品缺少配比") + private List activityCenterGoodsList; + + /** 客户详情可选:渠道配比列表 */ + List activityChannelList; + + /** 客户详情可选:网点配比列表 */ + List activityPointList; + + + private Long templateId; + + /** 模板值 */ + private String templateValue; + + private List templateBudgetIds; + + /** 附件id */ + private String[] attachIds; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityCenterGoodsBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityCenterGoodsBo.java new file mode 100644 index 0000000..58b4e24 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityCenterGoodsBo.java @@ -0,0 +1,68 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 活动成本中心配比项 Bo + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsActivityCenterGoodsBo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long subjectId; + + /** 成本中心类型: + center, + customer, + dept, + bizRegion, + saleRegion, + saleman + */ + @NotBlank(message = "成本中心类型不能为空") + private String centerType; + + /** 成本中心id */ + @NotNull(message = "成本中心id不能为空") + private String centerId; + + /** 费用额度 */ + @NotNull(message = "费用额度不能为空") + private BigDecimal centerGoodsAmount; + + /** 费用占比 */ + @NotNull(message = "费用占比不能为空") + private BigDecimal centerGoodsRate; + + /** 目标类型(brand、category、series、spu、sku) */ + @NotBlank(message = "目标类型不能为空") + private String targetType; + + /** 目标id */ + @NotNull(message = "目标id不能为空") + private Long targetId; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 模板唯一健 */ + private String tmpUk; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityChannelBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityChannelBo.java new file mode 100644 index 0000000..8c25f6d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityChannelBo.java @@ -0,0 +1,47 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 活动渠道项 Bo + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsActivityChannelBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 渠道id */ + @NotNull(message = "渠道id不能为空") + private Long channelId; + + /** 渠道费用占比 */ + @NotNull(message = "渠道费用占比不能为空") + private BigDecimal channelRate; + + /** 预计投放网点数量 */ + @NotNull(message = "预计投放网点数量不能为空") + private Integer preCountPoint; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 模板唯一健 */ + private String tmpUk; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityChannelPointBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityChannelPointBo.java new file mode 100644 index 0000000..67212e7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityChannelPointBo.java @@ -0,0 +1,41 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 活动网点项 Bo + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsActivityChannelPointBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 网点id */ + @NotNull(message = "网点id不能为空") + private Long pointId; + + /** 网点费用占比 */ + @NotNull(message = "网点费用占比不能为空") + private BigDecimal pointRate; + + private String remark; + + /** 模板唯一健 */ + private String tmpUk; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityDefaultCenterBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityDefaultCenterBo.java new file mode 100644 index 0000000..1f47dd8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityDefaultCenterBo.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import lombok.Data; +import java.util.List; + +/** + * @author YenHex + * @since 2022/12/20 + */ +@Data +public class TbsActivityDefaultCenterBo { + + /** 供应商id */ + private Long supplierId; + + /** 科目id */ + private Long subjectId; + + /** 产品类型(brand、category、series、spu、sku) */ + private String activityGoodsType; + + /** 商品id */ + private List goodsIds; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityGoodsBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityGoodsBo.java new file mode 100644 index 0000000..ce27e4e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityGoodsBo.java @@ -0,0 +1,40 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 活动商品项 Bo + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsActivityGoodsBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 目标id */ + @NotNull(message = "目标id不能为空") + private Long goodsId; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 模板唯一健 */ + private String tmpUk; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityPayConditionBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityPayConditionBo.java new file mode 100644 index 0000000..3071f8b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityPayConditionBo.java @@ -0,0 +1,73 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.SqlCondition; +import com.baomidou.mybatisplus.annotation.TableField; +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.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; + +/** + * 活动支付条件 Bo + * @author YenHex + * @since 2023-05-10 + */ +@Data +public class TbsActivityPayConditionBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 费用id */ + @NotNull(message = "费用id不能为空") + private Long costApplyId; + + /** 标题 */ + @TableField(condition = SqlCondition.LIKE) + private String title; + + /** 付款条件 */ + @NotBlank(message = "付款条件不能为空") + @Length(max = 4000,message = "付款条件长度不能超过4000字") + private String conditionMsg; + + /** 付款金额 */ + @NotNull(message = "付款金额不能为空") + private BigDecimal paymentPrice; + + /** + * 支付次数 + */ + @Min(value = 1,message = "支付最少1次数") + @Max(value = 30,message = "支付最多30次数") + private Integer payTimes; + + /** 付款时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate paymentDate; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 预支付通知时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime preNotifyTime; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityReopenBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityReopenBo.java new file mode 100644 index 0000000..10bc075 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityReopenBo.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import lombok.Data; + +/** + * @author YenHex + * @since 2022/11/28 + */ +@Data +public class TbsActivityReopenBo { + + private Long activityId; + + /** + * 0-关闭;1-打开 + */ + private Integer state; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivitySubjectBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivitySubjectBo.java new file mode 100644 index 0000000..60a075a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivitySubjectBo.java @@ -0,0 +1,94 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; +import java.util.List; +/** + * 活动成本中心项 Bo + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsActivitySubjectBo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long subjectId; + + /** 场次 */ + @NotNull(message = "场次不能为空") + private Integer countSession; + + /** 人数 */ + @NotNull(message = "人数不能为空") + private Integer countPerson; + + /** 费用额 */ + @NotNull(message = "费用额不能为空") + private BigDecimal amount; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 模板唯一健 */ + private String tmpUk; + + /** 成本中心列表 */ + private List centerList; + + /** 科目表单值 */ + private Long subjectFormId; + + /** 标题 */ + private String subjectFormTitle; + + /** 科目表单值 */ + private String subjectFormValue; + + /** 科目表单内容 */ + private String subjectFormContext; + + @Data + public static class ActivityCenterBo{ + + /** 成本中心类型 + center, + customer, + bizRegion, + saleRegion, + */ + @NotBlank(message = "成本中心类型不能为空") + private String centerType; + + /** 成本中心id */ + @NotNull(message = "成本中心id不能为空") + private String centerId; + + /** 费用占比率,单位百分位(该成本中心在费用中占比) */ + @NotNull(message = "费用占比率不能为空") + private BigDecimal centerRate; + + /** 费用占比金额(该成本中心在费用金额) */ + @NotNull(message = "费用占比率不能为空") + private BigDecimal centerAmount; + + /** 模板唯一健 */ + private String tmpUk; + + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityTemplateBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityTemplateBo.java new file mode 100644 index 0000000..8309c9a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsActivityTemplateBo.java @@ -0,0 +1,94 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +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; + +/** + * 活动模板 Bo + * @author YenHex + * @since 2022-11-29 + */ +@Data +public class TbsActivityTemplateBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 模板名称 */ + @NotBlank(message = "模板名称不能为空") + private String templateName; + + /** 模板状态 */ + @NotNull(message = "模板状态不能为空") + private Integer templateState; + + /** 模板值 */ + @NotBlank(message = "模板值不能为空") + private String templateValue; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 销售区域标识:0-全部可见;1-部分可见;2-全部不可见 */ + private Integer saleRegionFlag; + + /** 行政区域标识:0-全部可见;1-部分可见;2-全部不可 */ + private Integer bizRegionFlag; + + /** 合同类型:0->无;1->有合同 */ + private Integer contractFlag; + + /** 销售区域id列表 */ + private List saleRegionIds; + + /** 销售区域id列表 */ + private List bizRegionIds; + + /** 开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime startTime; + + /** 结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime endTime; + + /** 费用申请主题 */ + private String costTheme; + + /** 费用申请主题能否编辑 */ + private Integer costThemeEditFlag; + + /** 预设备注 */ + @Length(max = 255,message = "预设备注长度不能超过255字") + private String preRemark; + + + /** + * 选择类型 + * 1、只能选择客户,2、只能选择供应商,3、可以选择客户和供应商 + */ + private Integer selectType; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsAffairCommitBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsAffairCommitBo.java new file mode 100644 index 0000000..271dd43 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsAffairCommitBo.java @@ -0,0 +1,131 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; + +/** + * @author YenHex + * @since 2022/11/30 + */ +@Data +public class TbsAffairCommitBo { + + public TbsAffairCommitBo(){} + public TbsAffairCommitBo(String targetId){ + this.targetId = targetId; + } + + /** + * 旧版的:费用申请id、核销id(截止2023/5/23) + */ + private Long costApplyId; + + /** + * 新增所有审批业务使用该字段,作数据的目标ID + */ + private String targetId; + + /** + * 政策ID(截止2023/8/8) + */ + private Long policyId; + + /** 状态:0-否定,1-同意,2-退回 */ + @NotNull + private Integer state; + + /** 流程节点id */ + @NotNull + private String affairId; + + /** + * 评论 + */ + @Length(max = 800,message = "备注长度限制800字") + @NotNull + private String comment; + + + private String caseRemark; + + /** 释放费用 */ + private Integer releaseFlag; + + /** 附件id */ + private String[] attachIds; + + /** + * 修改金额列表(核销和费用审批接口专用) + */ + private List affairSubjectLines; + + /** + * 成本中心维度,修改金额列表(核销和费用审批接口专用) + */ + private List affairSubjectCenterLines; + + /** + * 用于明细单参数 + */ + private List childList; + + @Data + public static class AffairSubjectLine{ + + /** + * 科目id(费用申请,活动科目id) + */ + private Long subjectId; + + /** + * 调整金额 + */ + private BigDecimal amount; + + /** 场次 */ + private Integer countSession; + + /** 人数 */ + private Integer countPerson; + } + + @Data + public static class AffairSubjectCenterLine{ + + /** + * 科目id(费用申请,活动科目id) + */ + private Long subjectId; + + /** 场次 */ + private Integer countSession; + + /** 人数 */ + private Integer countPerson; + + + private List centerItemLines; + + } + + @Data + public static class AffairSubjectCenterItemLine{ + + /** 活动成本中心ID */ + private Long activityCenterId; + + /** + * 调整金额 + */ + private BigDecimal amount; + + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetAmtBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetAmtBo.java new file mode 100644 index 0000000..9f8d60b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetAmtBo.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/8/8 + */ +@Data +public class TbsBudgetAmtBo { + + private Long budgetScheduleItemId; + + private BigDecimal preDispatchAmount; + + private BigDecimal budgetAmount; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetBatchBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetBatchBo.java new file mode 100644 index 0000000..bd615d0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetBatchBo.java @@ -0,0 +1,93 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +/** + * @author YenHex + * @since 2023/8/24 + */ +@Data +public class TbsBudgetBatchBo { + + @JsonIgnore + private boolean errorFlag; + + private String remark; + + /** 附件ID */ + private String[] attachIds; + + List budgetList; + + @Data + public static class BudgetMain{ + + /** 预算编码,更新时必填 */ + private String budgetNumber; + + /** 预算名称 */ + private String budgetName; + + private String scheduleName; + + /** 科目编码 */ + private String subjectCode; + + /** 成本中心类型: + * center, + * customer, + * bizRegion, + * saleRegion, + **/ + @NotNull + private String centerType; + + /** 成本中心名称 */ + @NotNull + private String centerName; + + /** 品牌名称 */ + private String brandNames; + + /** 类目名称 */ + private String categoryNames; + + /** 系列名称 */ + private String seriesNames; + + private String remark; + + /** + * 周期金额 + */ + List scheduleAmount; + + private List errorInfos; + + public List getErrorInfos() { + if(errorInfos==null){ + errorInfos = new ArrayList<>(); + } + return errorInfos; + } + } + + @Data + public static class BudgetAmount{ + + private String scheduleItemName; + + private BigDecimal budgetAmount; + + private BigDecimal preDispatchAmount; + + private Object errorInfo; + + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetBo.java new file mode 100644 index 0000000..44675e6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetBo.java @@ -0,0 +1,104 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; +import java.util.List; +/** + * 预算 Bo + * @author YenHex + * @since 2022-11-12 + */ +@Data +public class TbsBudgetBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 预算编码 */ + private String budgetCode; + + /** 科目id */ + private Long subjectId; + + /** 成本中心id */ + @NotNull(message = "成本中心id不能为空") + private String centerId; + + /** 是否允许跨年,控制停用状态 */ + private Integer crossYearFlag; + + /** 不活动的 0/1 */ + private Integer inactiveFlag; + + /** + * 成本中心类型: + center, + customer, + bizRegion, + saleRegion, + */ + @NotNull(message = "成本中心类型不能为空") + private String centerType; + + /** 考核期id */ + @NotNull(message = "考核期id不能为空") + private Long scheduleId; + + @NotNull(message = "考核项不能为空") + private List scheduleItems; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 品牌Id列表 */ + private List brandIds; + + /** 品类Id列表 */ + private List categoryIds; + + /** 系列Id列表 */ + private List seriesIds; + + /** 商品Id列表(前端显示为sku) */ + private List spuIds; + + /** skuId列表(前端显示为单品) */ + private List skuIds; + + private String[] attachIds; + + private String[] templateIds; + + /** 是否指定模板类型的预算 */ + private Integer templateFlag; + + @Data + public static class ScheduleItem{ + + /** 考核期项ID */ + private Long scheduleItemId; + + /** 预算金额 */ + private BigDecimal amount; + + private BigDecimal preDispatchAmount; + + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetExcelBatchDto.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetExcelBatchDto.java new file mode 100644 index 0000000..c1a13c7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetExcelBatchDto.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 预算 Bo + * @author YenHex + * @since 2022-11-12 + */ +@Data +public class TbsBudgetExcelBatchDto implements Serializable { + + List items; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetExcelBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetExcelBo.java new file mode 100644 index 0000000..e45efce --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetExcelBo.java @@ -0,0 +1,89 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 预算 Bo + * @author YenHex + * @since 2022-11-12 + */ +@Data +public class TbsBudgetExcelBo implements Serializable { + + @NotNull(message = "预算编码不能为空") + private String budgetCode; + + /** 成本中心id */ + private String subjectName; + + /** + 成本中心类型: + center, + customer, + bizRegion, + saleRegion, + */ + @NotNull(message = "成本中心类型不能为空") + private String centerType; + + /** + * 成本中心名称 + */ + private String centerName; + + /** 成本中心编码 */ + private String centerCode; + + /** 品牌名称列表 */ + private List brandNames; + + /** 品类名称列表 */ + private List categoryNames; + + /** 系列名称列表 */ + private List seriesNames; + + /** 商品名称列表(前端显示为sku) */ + private List spuNames; + + /** sku名称(不用传) */ + private List skuNames; + + /** skuId列表(前端显示为单品) */ + private List skuCodes; + + /** 备注 */ + private String remark; + + /** 考核期名称 */ + @NotNull(message = "考核期名称不能为空") + private String scheduleName; + + private BigDecimal amountYear; + private BigDecimal amountQ1; + private BigDecimal amountQ2; + private BigDecimal amountQ3; + private BigDecimal amountQ4; + private BigDecimal amountM1; + private BigDecimal amountM2; + private BigDecimal amountM3; + private BigDecimal amountM4; + private BigDecimal amountM5; + private BigDecimal amountM6; + private BigDecimal amountM7; + private BigDecimal amountM8; + private BigDecimal amountM9; + private BigDecimal amountM10; + private BigDecimal amountM11; + private BigDecimal amountM12; + + private String errorMsg; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetMoveAmountBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetMoveAmountBo.java new file mode 100644 index 0000000..a65d274 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetMoveAmountBo.java @@ -0,0 +1,32 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 预算 Bo + * @author YenHex + * @since 2022-11-12 + */ +@Data +public class TbsBudgetMoveAmountBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @NotNull(message = "预算id不能为空") + private Long id; + + @NotNull(message = "预算子项源ID不能为空") + private List oriScheduleItemBudgetIds; + + @NotNull(message = "预算子项目标ID不能为空") + private Long targetScheduleItemBudgetId; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetStateBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetStateBo.java new file mode 100644 index 0000000..a99df0b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetStateBo.java @@ -0,0 +1,28 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/11/16 + */ +@Data +public class TbsBudgetStateBo { + + /** id */ + private Long id; + +// +// /** 费用启用状态 */ +// @NotNull +// private Integer budgetState; + + /** 是否允许跨年,控制停用状态 */ + private Integer crossYearFlag; + + /** 是否允许跨年,控制停用状态 */ + private Integer inactiveFlag; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetTempBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetTempBo.java new file mode 100644 index 0000000..e309304 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetTempBo.java @@ -0,0 +1,24 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/11/16 + */ +@Data +public class TbsBudgetTempBo { + + /** id */ + @NotNull + private Long id; + + + private String[] templateIds; + + /** 是否指定模板类型的预算 */ + private Integer templateFlag; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetUpdateAfterStartBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetUpdateAfterStartBo.java new file mode 100644 index 0000000..324e2ce --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsBudgetUpdateAfterStartBo.java @@ -0,0 +1,71 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 预算 Bo + * @author YenHex + * @since 2022-11-12 + */ +@Data +public class TbsBudgetUpdateAfterStartBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 预算编码 */ + private String budgetCode; + + /** 原来的更变记录id */ + private String orgChangeId; + + +// /** 批量参数,用于新增:科目id */ +// private String subjectId4Batch; +// /** 原来的更变记录id: */ +// private String centerType4Batch; +// /** 原来的更变记录id */ +// private String centerId4Batch; + + /** + * 成本中心类型: + center, + customer, + bizRegion, + saleRegion, + */ + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 品牌Id列表 */ + private List brandIds; + + /** 品类Id列表 */ + private List categoryIds; + + /** 系列Id列表 */ + private List seriesIds; + + /** 商品Id列表(前端显示为sku) */ + private List spuIds; + + /** skuId列表(前端显示为单品) */ + private List skuIds; + + private String[] attachIds; + + /** 修改的金额值 */ + private List budgetAmtUpdateList; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsCostApplyActivityBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsCostApplyActivityBo.java new file mode 100644 index 0000000..f9d17c1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsCostApplyActivityBo.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/12/19 + */ +@Data +public class TbsCostApplyActivityBo { + + @NotNull + TbsCostApplyBo costApplyBo; + + @NotNull + TbsActivityBo activityBo; + + @NotNull + Long templateId; + + /** 模板标题 */ + private String templateTitle; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsCostApplyBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsCostApplyBo.java new file mode 100644 index 0000000..96f0d1f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsCostApplyBo.java @@ -0,0 +1,54 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 费用申请 Bo + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsCostApplyBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 主题 */ + @NotBlank(message = "主题不能为空") + @Length(max = 60,message = "主题长度不能超过60字") + private String chargeTheme; + + /** 客户id */ + @NotNull(message = "客户id不能为空") + private Long supplierId; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** + * 合同类型:0->无;1->有合同 + */ + private Integer contractFlag; + + private Integer costThemeEditFlag; + + private Integer selectType; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsCostApplyChangeBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsCostApplyChangeBo.java new file mode 100644 index 0000000..f750cdb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsCostApplyChangeBo.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/12/19 + */ +@Data +public class TbsCostApplyChangeBo { + + @NotNull + TbsCostApplyBo costApplyBo; + + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsCostContractBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsCostContractBo.java new file mode 100644 index 0000000..5afea2f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsCostContractBo.java @@ -0,0 +1,95 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 费用合同 Bo + * @author YenHex + * @since 2023-03-14 + */ +@Data +public class TbsCostContractBo implements Serializable { + + private static final long serialVersionUID = 1L; + + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 合同名称 */ + @NotBlank(message = "合同名称不能为空") + private String contractName; + + /** 合同金额 */ + private BigDecimal contractAmount; + + /** 合同条件(文本框) */ + private String contractCondition; + + /** 业务所属公司 */ + private String businessCompany; + + /** 税号 */ + private String dutyNumber; + + /** 合同附件地址 */ + private String[] attachIds; + + /** 签约时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate signTime; + + /** 到期时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate expireTime; + + + + /** 收款单位 */ + @NotNull(message = "收款单位不能为空") + @Length(max = 255,message = "收款单位长度不能超过255字") + private String payee; + + /** 开户银行 */ + @NotNull(message = "开户银行不能为空") + @Length(max = 255,message = "开户银行长度不能超过255字") + private String bankName; + + /** 银行账号 */ + @NotNull(message = "银行账号不能为空") + @Length(max = 255,message = "银行账号长度不能超过255字") + private String bankAccount; + + /** 印章名称 */ + @Length(max = 255,message = "印章名称长度不能超过255字") + private String sealName; + + /** 印章编号 */ + @NotNull(message = "印章不能为空") + @Length(max = 255,message = "印章编号长度不能超过255字") + private String sealId; + + /** 使用印章次数 */ + @NotNull(message = "印章次数不能为空") + private Integer sealNum; + + /** 文件份数 */ + @NotNull(message = "文件份数不能为空") + private Integer fileNum; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsCostTodoBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsCostTodoBo.java new file mode 100644 index 0000000..4a7b7c2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsCostTodoBo.java @@ -0,0 +1,67 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +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; + +/** + * 费用申请代办 Bo + * @author YenHex + * @since 2023-02-17 + */ +@Data +public class TbsCostTodoBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 涉及品牌 */ + @Length(max = 255,message = "涉及品牌长度不能超过255字") + private String brands; + + /** 描述 */ + @Length(max = 255,message = "描述长度不能超过255字") + private String descr; + + /** 对应价值 */ + private BigDecimal amount; + + /** 完成状态 0-否、1-是 */ + @NotNull(message = "完成状态不能为空") + private Integer finishedFlag; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 交付标准 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String payMsg; + + /** 预付款时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDate prePayDate; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsScheduleBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsScheduleBo.java new file mode 100644 index 0000000..f18b713 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsScheduleBo.java @@ -0,0 +1,70 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 考核期 Bo + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsScheduleBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 考核名称 */ + @NotBlank(message = "考核名称不能为空") + @Length(max = 30,message = "考核名称长度不能超过30字") + private String code; + + /** 考核编码 */ + @NotBlank(message = "考核编码不能为空") + @Length(max = 30,message = "考核编码长度不能超过30字") + private String name; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsScheduleItemBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsScheduleItemBo.java new file mode 100644 index 0000000..8df8045 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsScheduleItemBo.java @@ -0,0 +1,81 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 考核时间项 Bo + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsScheduleItemBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 考核id */ + @NotNull(message = "考核id不能为空") + private Long scheduleId; + + /** 考核编码 */ + @NotBlank(message = "考核编码不能为空") + @Length(max = 30,message = "考核编码长度不能超过30字") + private String itemName; + + /** 开始时间 */ + @NotNull(message = "开始时间不能为空") + @Length(max = 0,message = "开始时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startDate; + + /** 结束时间 */ + @NotNull(message = "结束时间不能为空") + @Length(max = 0,message = "结束时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endDate; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsScheduleItemBudgetBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsScheduleItemBudgetBo.java new file mode 100644 index 0000000..184d7d7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsScheduleItemBudgetBo.java @@ -0,0 +1,37 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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.DecimalMin; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; + +/** + * 预算考核期项 Bo + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsScheduleItemBudgetBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 考核期项费用id */ + private Long id; + + /** 预算金额 */ + @NotNull(message = "预算金额不能为空") + private BigDecimal budgetAmount; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsScheduleItemBudgetPreDispatchBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsScheduleItemBudgetPreDispatchBo.java new file mode 100644 index 0000000..9ddf1ba --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsScheduleItemBudgetPreDispatchBo.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 预算考核期项 Bo + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsScheduleItemBudgetPreDispatchBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 考核期项费用id */ + private Long id; + + /** 预算金额 */ + @DecimalMin(value = "0") + @NotNull(message = "预计发货金额不能为空") + private BigDecimal preDispatchAmount; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsSubmitToDoBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsSubmitToDoBo.java new file mode 100644 index 0000000..a28f169 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/bo/TbsSubmitToDoBo.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.tbs.entity.bo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; + +/** + * @author YenHex + * @since 2023/11/1 + */ +@Data +public class TbsSubmitToDoBo { + + private Long id; + + /** 附件id */ + private String[] attachIds2; + + /** 附件说明 */ + private String attachDesc; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/CusTargetRateDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/CusTargetRateDTO.java new file mode 100644 index 0000000..47d4174 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/CusTargetRateDTO.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * @author YenHex + * @since 2023/9/15 + */ +@Data +@AllArgsConstructor +public class CusTargetRateDTO { + + String cusTargetRateQty; + String cusTargetRate; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsActNotMatchAmtCenterGoods.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsActNotMatchAmtCenterGoods.java new file mode 100644 index 0000000..bea5f6d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsActNotMatchAmtCenterGoods.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/12/12 + */ +@Data +public class TbsActNotMatchAmtCenterGoods { + + private Long activityId; + private BigDecimal totalAmount; + private BigDecimal sumGoodsAmt; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsActivityAmtCheck.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsActivityAmtCheck.java new file mode 100644 index 0000000..c559e06 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsActivityAmtCheck.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/12/11 + */ +@Data +public class TbsActivityAmtCheck { + + private Long activityId; + + private BigDecimal totalAmount; + private BigDecimal sumCenterGoods; + private BigDecimal diffAmount; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetCheckingWithAmount.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetCheckingWithAmount.java new file mode 100644 index 0000000..ceefa93 --- /dev/null +++ b/cms-modules/cms-system/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/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetCostResult.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetCostResult.java new file mode 100644 index 0000000..ca07003 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetCostResult.java @@ -0,0 +1,52 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.entity.TbsBudgetCostItem; +import com.qs.serve.modules.tbs.entity.TbsBudgetCostItemPolicy; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetTableVo; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author YenHex + * @since 2022/12/5 + */ +@Data +public class TbsBudgetCostResult { + + /** 活动:匹配费用占用(含超支预算) */ + private List budgetMatchList; + + /** 活动:没有匹配预算的费用 */ + private List budgetUnMatchList; + + /** 政策:匹配费用占用(含超支预算) */ + private List policyBudgetMatchList; + + /** 政策:没有匹配预算的费用 */ + private List policyBudgetUnMatchList; + + /** 表数据封装 */ + private TbsBudgetTableVo tableData; + + /** 后台数据数据封装 */ + private List budgetList; + + /** 后台数据数据封装 */ + private List activityList; + + /** 后台数据数据封装 */ + private List policyItemList; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetItemCostResult.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetItemCostResult.java new file mode 100644 index 0000000..f74e247 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetItemCostResult.java @@ -0,0 +1,78 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.modules.tbs.entity.TbsBudgetCostItem; +import com.qs.serve.modules.tbs.entity.TbsBudgetCostItemPolicy; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/2/22 + */ +@Data +public class TbsBudgetItemCostResult { + + /** 后台参数:预算id */ + private Long budgetId; + + /** 后台参数:考核id */ + private Long scheduleId; + + /** 后台参数:考核期项id */ + private Long scheduleItemId; + + /** 后台参数:考核期项id */ + private String scheduleItemName; + + /** 后台参数:录入时考核期可用预算 */ + private BigDecimal scheduleItemAmount; + + /** 后台参数:录入时,考核期已用金额(含申请占用金额) */ + private BigDecimal scheduleItemAmountUsed; + + /** 后台参数: */ + private BigDecimal scheduleItemAmountApply; + + /** 后台参数:费用考核期项id */ + private Long scheduleItemBudgetId; + + private TzcPolicyItem policyItem; + + public TbsBudgetCostItemPolicy toBudgetCostItem(){ + TbsBudgetCostItemPolicy itemPolicy = new TbsBudgetCostItemPolicy(); + if(policyItem!=null){ + itemPolicy.setPolicyId(policyItem.getPolicyId()); + itemPolicy.setPolicyItemId(policyItem.getId()); + itemPolicy.setPolicyItemCode(policyItem.getPolicyItemCode()); + itemPolicy.setSubjectId(policyItem.getSubjectId()); + itemPolicy.setSubjectCode(policyItem.getSubjectCode()); + itemPolicy.setSubjectName(policyItem.getSubjectName()); + itemPolicy.setCenterCode(policyItem.getCenterCode()); + itemPolicy.setCenterId(policyItem.getCenterId()); + itemPolicy.setCenterType(policyItem.getCenterType()); + itemPolicy.setCenterName(policyItem.getCenterName()); + itemPolicy.setSupplierId(policyItem.getSupplierId()); + itemPolicy.setSupplierCode(policyItem.getSupplierCode()); + itemPolicy.setSupplierName(policyItem.getSupplierName()); + itemPolicy.setPolicyItemAmount(policyItem.getDiscountMax()); + itemPolicy.setPolicyItemStartDate(policyItem.getPolicyStartDate()); + itemPolicy.setPolicyItemEndDate(policyItem.getPolicyEndDate()); + } + itemPolicy.setBudgetId(this.getBudgetId()); + itemPolicy.setScheduleId(this.getScheduleId()); + itemPolicy.setScheduleItemId(this.getScheduleItemId()); + itemPolicy.setScheduleItemBudgetId(this.getScheduleItemBudgetId()); + itemPolicy.setScheduleItemName(this.getScheduleItemName()); + //绑定录入时可用预算 + itemPolicy.setScheduleItemAmount(this.getScheduleItemAmount()); + //剩余的可用预算 + itemPolicy.setScheduleItemAmountUsed(this.getScheduleItemAmountUsed()); + itemPolicy.setScheduleItemAmountApply(this.getScheduleItemAmountApply()); + return itemPolicy; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetLogPreAmount.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetLogPreAmount.java new file mode 100644 index 0000000..2a379d0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetLogPreAmount.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/6/29 + */ +@Data +public class TbsBudgetLogPreAmount { + + Long budgetId; + + Long scheduleItemId; + + BigDecimal amount; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetLogWithAmount.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetLogWithAmount.java new file mode 100644 index 0000000..73c37b4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetLogWithAmount.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/6/29 + */ +@Data +public class TbsBudgetLogWithAmount { + + /** + * 预算id + */ + Long id; + + /** + * 预算itemId + */ + Long itemid; + + /** + * 预算item金额 + */ + BigDecimal amt; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetScheduleWithAmount.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetScheduleWithAmount.java new file mode 100644 index 0000000..5c065f7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetScheduleWithAmount.java @@ -0,0 +1,59 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/6/29 + */ +@Data +public class TbsBudgetScheduleWithAmount { + + /** + * 预算项的周期ID + */ + Long scheduleItemBudgetId; + + /** + * 预算总额 + */ + BigDecimal finalAmt = BigDecimal.ZERO; + + /** + * 当前占用中的预算 + */ + BigDecimal allUsingAmt = BigDecimal.ZERO; + + /** + * 申请中的预算占用 + */ + BigDecimal allCheckingAmt = BigDecimal.ZERO; + + /** + * 费用申请-申请中的预算 + */ + BigDecimal costUsingAmt = BigDecimal.ZERO; + + /** + * 费用申请-申请中的预算 + */ + BigDecimal costCheckingAmt = BigDecimal.ZERO; + + /** + * 政策-申请中的预算 + */ + BigDecimal policyUsingAmt = BigDecimal.ZERO; + + /** + * 政策-申请中的预算 + */ + BigDecimal policyCheckingAmt = BigDecimal.ZERO; + + /** + * 剩余预算(预算总额-当前占用的预算) + */ + BigDecimal surplusAmt = BigDecimal.ZERO; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetWithAmount.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetWithAmount.java new file mode 100644 index 0000000..26a5bd5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsBudgetWithAmount.java @@ -0,0 +1,78 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/6/29 + */ +@Data +public class TbsBudgetWithAmount { + + /** + * 周期项ID + */ + String budgetId; + + String budgetName; + + String scheduleName; + + String centerId; + + String centerName; + + String centerType; + + String scheduleItemBudgetId; + + String scheduleItemBudgetName; + + /** + * 预算总额 + */ + BigDecimal finalAmt = BigDecimal.ZERO; + + /** + * 当前占用中的预算 + */ + BigDecimal allUsingAmt = BigDecimal.ZERO; + + /** + * 申请中的预算占用 + */ + BigDecimal allCheckingAmt = BigDecimal.ZERO; + + /** + * 费用申请-申请中的预算 + */ + BigDecimal costUsingAmt = BigDecimal.ZERO; + + /** + * 费用申请-申请中的退回预算 + */ + BigDecimal costBackAmt = BigDecimal.ZERO; + + /** + * 费用申请-申请中的预算 + */ + BigDecimal costCheckingAmt = BigDecimal.ZERO; + + /** + * 政策-申请中的预算 + */ + BigDecimal policyUsingAmt = BigDecimal.ZERO; + + /** + * 政策-申请中的预算 + */ + BigDecimal policyCheckingAmt = BigDecimal.ZERO; + + /** + * 剩余预算(预算总额-当前占用的预算) + */ + BigDecimal surplusAmt = BigDecimal.ZERO; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCenterGoodBirDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCenterGoodBirDTO.java new file mode 100644 index 0000000..7fa8e94 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCenterGoodBirDTO.java @@ -0,0 +1,34 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/7/13 + */ +@Data +public class TbsCenterGoodBirDTO { + //实际销量(发货金额) + private BigDecimal realSales; + + //实际费用(核销和释放金额) + private BigDecimal realCost; + + //实际费用率(核销和释放金额/发货金额) + private BigDecimal realExpenseRate; + + //实际费用(核销) + private BigDecimal realCheck; + + //实际费用(释放金额) + private BigDecimal realRelease; + + public void initRealExpenseRate(){ + if(realSales!=null&&realSales.compareTo(BigDecimal.ZERO)!=0){ + realExpenseRate = realCost.divide(realCost,2,BigDecimal.ROUND_DOWN); + } + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCenterGoodsGroupDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCenterGoodsGroupDTO.java new file mode 100644 index 0000000..65cad52 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCenterGoodsGroupDTO.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * @author YenHex + * @since 2023/7/21 + */ +@Data +@AllArgsConstructor +public class TbsCenterGoodsGroupDTO { + + String targetType; + + String targetId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsContractCostSubItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsContractCostSubItem.java new file mode 100644 index 0000000..6cc7eea --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsContractCostSubItem.java @@ -0,0 +1,76 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + * @author YenHex + * @since 2023/5/9 + */ +public class TbsContractCostSubItem { + + @Data + public static class Activity{ + private String activityCode; + private String activityPurpose; + private String costCode; + private String startDate; + private String endDate; + private String writeOffDate; + private String productType; + private String product; + private String activityAccountCode; + private String activityAccountName; + private String activityCostCenterNo; + private String activityCostCenterName; + private BigDecimal money; + + } + + @Data + public static class Payment{ + private String payItem; + private String payCondition; + private BigDecimal payMoney; + private String payDate; + private String actualPayDate; + private String payCompleteState; + private String payRemark; + private String payCode;// 唯一 + } + + @Data + public static class ToDoItem{ + private String serviceDescription; + private String deliveryStandard; + private String deliveryDate; + private String agreeRemark; + private String agreeCompleteState; + + } + + @Data + public static class CusCenterRate{ + // 季度客户所属成本中心费用金额 + private String qtdCusCenterCost; + // 季度客户所属成本中心发货金额 + private String qtdCusCenterSend; + // 季度客户所属成本中心费用率 + private String qtdCusCenterExpenseRate; + // 季度客户所属成本中心目标费用率 + private String qtdCusCenterTargetExpenseRate; + + // 年度客户所属成本中心费用金额 + private String ytdCusCenterCost; + // 年度客户所属成本中心发货金额 + private String ytdCusCenterSend; + // 年度客户所属成本中心费用率 + private String ytdCusCenterExpenseRate; + // 年度客户所属成本中心目标费用率 + private String ytdCusCenterTargetExpenseRate; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostBudgetRelateInfo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostBudgetRelateInfo.java new file mode 100644 index 0000000..32b43fc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostBudgetRelateInfo.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/11/20 + */ +@Data +public class TbsCostBudgetRelateInfo extends TbsBudgetScheduleWithAmount{ + + /** 预算编码 */ + String budgetCode; + + /** 预算名称 */ + String budgetTitle; + + /** 周期名称 */ + String scheduleItemName; + + /** 当前政策或费用占用 */ + BigDecimal currentItemAmt; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostErrorBudgetDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostErrorBudgetDTO.java new file mode 100644 index 0000000..69c8c69 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostErrorBudgetDTO.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/12/10 + */ +@Data +public class TbsCostErrorBudgetDTO { + + Long id; + + String code; + + BigDecimal totalActivityAmount; + + BigDecimal totalActivityUsedAmount; + + BigDecimal releaseBudget; + + /** + * 统计budgetLog + */ + BigDecimal sumBudget; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostSubItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostSubItem.java new file mode 100644 index 0000000..f0ffc5c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostSubItem.java @@ -0,0 +1,189 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/5/9 + */ +public class TbsCostSubItem { + + @Data + public static class CostCenter{ + public CostCenter(String chengBenZhongXin, String chengBenZhongXinId) { + this.chengBenZhongXin = chengBenZhongXin; + this.chengBenZhongXinId = chengBenZhongXinId; + } + private String chengBenZhongXin; + private String chengBenZhongXinId; + + //区域预算,预算金额 + private BigDecimal areaBudget; + + //目标销量,预估发货金额 + private BigDecimal targetSales; + + //目标预算费率,预估费率。targetExpenseRate = areaBudget/targetSales + private BigDecimal targetExpenseRate; + + + //目标销量(发货金额) + private BigDecimal qtdTargetSales; + //目标预算(预算金额) + private BigDecimal qtdTargetBudget; + //目标费用率(预算金额/预估发货金额) + private BigDecimal qtdTargetExpenseRate; + + //实际销量(发货金额) + private BigDecimal qtdRealSales; + //实际费用(核销和释放金额) + private BigDecimal qtdRealCost; + //实际费用率(核销和释放金额/发货金额) + private BigDecimal qtdRealExpenseRate; + + + + //目标销量 + private BigDecimal ytdTargetSales; + //目标预算 + private BigDecimal ytdTargetBudget; + //目标费用率 + private BigDecimal ytdTargetExpenseRate; + //实际销量 + private BigDecimal ytdRealSales; + //实际费用 + private BigDecimal ytdRealCost; + //实际费用率 + private BigDecimal ytdRealExpenseRate; + + + //目标销量 + private BigDecimal mtdTargetSales; + //目标预算 + private BigDecimal mtdTargetBudget; + //目标费用率 + private BigDecimal mtdTargetExpenseRate; + //实际销量 + private BigDecimal mtdRealSales; + //实际费用 + private BigDecimal mtdRealCost; + //实际费用率 + private BigDecimal mtdRealExpenseRate; + + } + + @Data + @AllArgsConstructor + public static class Subject{ + private String keMuName; + } + + @Data + @AllArgsConstructor + public static class Amount{ + + //budgetAmount + private BigDecimal areaBudget; + + //preDispatchAmout + private BigDecimal targetSales; + + //targetExpenseRate = areaBudget/targetSales + private BigDecimal targetExpenseRate; + + + + } + + @Data + @NoArgsConstructor + public static class CostCenterTranStr{ + public CostCenterTranStr(String chengBenZhongXin, String chengBenZhongXinId) { + this.chengBenZhongXin = chengBenZhongXin; + this.chengBenZhongXinId = chengBenZhongXinId; + } + private String chengBenZhongXin; + private String chengBenZhongXinId; + private String centertype; + private String centerCode; + private String centerId; + + //区域预算,预算金额 + private String areaBudget; + + //目标销量,预估发货金额 + private String targetSales; + + //目标预算费率,预估费率。targetExpenseRate = areaBudget/targetSales + private String targetExpenseRate; + + + //目标销量(发货金额) + private String qtdTargetSales; + //目标预算(预算金额) + private String qtdTargetBudget; + //目标费用率(预算金额/预估发货金额) + private String qtdTargetExpenseRate; + + //实际销量(发货金额) + private String qtdRealSales; + //实际费用(核销和释放金额) + private String qtdRealCost; + //实际费用率(核销和释放金额/发货金额) + private String qtdRealExpenseRate; + + + + //目标销量 + private String ytdTargetSales; + //目标预算 + private String ytdTargetBudget; + //目标费用率 + private String ytdTargetExpenseRate; + //实际销量 + private String ytdRealSales; + //实际费用 + private String ytdRealCost; + //实际费用率 + private String ytdRealExpenseRate; + + + //目标销量 + private String mtdTargetSales; + //目标预算 + private String mtdTargetBudget; + //目标费用率 + private String mtdTargetExpenseRate; + //实际销量 + private String mtdRealSales; + //实际费用 + private String mtdRealCost; + //实际费用率 + private String mtdRealExpenseRate; + + + // 季度客户所属成本中心费用金额 + private String qtdCusCenterCost; + // 季度客户实际发货金额 + private String qtdCusCenterSend; + // 季度客户所属成本中心费用率 + private String qtdCusCenterExpenseRate; + // 季度客户所属成本中心目标费用率 + private String qtdCusCenterTargetExpenseRate; + + // 年度客户所属成本中心费用金额 + private String ytdCusCenterCost; + // 年度客户实际发货金额 + private String ytdCusCenterSend; + // 年度客户所属成本中心费用率 + private String ytdCusCenterExpenseRate; + // 年度客户所属成本中心目标费用率 + private String ytdCusCenterTargetExpenseRate; + + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsScheduleItemBudgetAmount.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsScheduleItemBudgetAmount.java new file mode 100644 index 0000000..b1af849 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsScheduleItemBudgetAmount.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/6/29 + */ +@Data +public class TbsScheduleItemBudgetAmount { + + Long scheduleItemId; + + BigDecimal totalAmount; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsScheduleItemBudgetIdDto.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsScheduleItemBudgetIdDto.java new file mode 100644 index 0000000..15f4c8c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsScheduleItemBudgetIdDto.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/6/29 + */ +@Data +public class TbsScheduleItemBudgetIdDto { + + Long scheduleItemId; + + Long scheduleItemBudgetId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsScheduleItemWithAmount.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsScheduleItemWithAmount.java new file mode 100644 index 0000000..409283f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsScheduleItemWithAmount.java @@ -0,0 +1,63 @@ +package com.qs.serve.modules.tbs.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/6/29 + */ +@Data +public class TbsScheduleItemWithAmount { + + /** + * 周期项ID + */ + Long scheduleItemId; + + String scheduleName; + + String scheduleItemName; + + /** + * 预算总额 + */ + BigDecimal finalAmt = BigDecimal.ZERO; + + /** + * 当前占用中的预算 + */ + BigDecimal allUsingAmt = BigDecimal.ZERO; + + /** + * 申请中的预算占用 + */ + BigDecimal allCheckingAmt = BigDecimal.ZERO; + + /** + * 费用申请-申请中的预算 + */ + BigDecimal costUsingAmt = BigDecimal.ZERO; + + /** + * 费用申请-申请中的预算 + */ + BigDecimal costCheckingAmt = BigDecimal.ZERO; + + /** + * 政策-申请中的预算 + */ + BigDecimal policyUsingAmt = BigDecimal.ZERO; + + /** + * 政策-申请中的预算 + */ + BigDecimal policyCheckingAmt = BigDecimal.ZERO; + + /** + * 剩余预算(预算总额-当前占用的预算) + */ + BigDecimal surplusAmt = BigDecimal.ZERO; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsActivityPayConditionSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsActivityPayConditionSo.java new file mode 100644 index 0000000..a5ec7d4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsActivityPayConditionSo.java @@ -0,0 +1,60 @@ +package com.qs.serve.modules.tbs.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.SqlCondition; +import com.baomidou.mybatisplus.annotation.TableField; +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 2023-05-10 + */ +@Data +public class TbsActivityPayConditionSo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 标题 */ + @TableField(condition = SqlCondition.LIKE) + private String title; + + /** 费用id */ + private Long costApplyId; + + /** 活动id */ + private Long activityId; + + /** 付款条件 */ + private String conditionMsg; + + /** 付款金额 */ + private BigDecimal paymentPrice; + + /** 完成标识 */ + private Integer finishedFlag; + + /** 付款时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate paymentDate; + + /** 备注 */ + private String remark; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsActivitySo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsActivitySo.java new file mode 100644 index 0000000..a068ee7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsActivitySo.java @@ -0,0 +1,86 @@ +package com.qs.serve.modules.tbs.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.TableField; +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; +import java.util.List; +/** + * 费用活动 VO + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsActivitySo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 编码 */ + private String activityCode; + + /** 费用申请id */ + private Long costApplyId; + + /** 活动简述及目的 */ + private String actTitle; + + /** 客户id */ + private Long supplierId; + + /** 客户编码 */ + private String supplierCode; + + /** 客户名称 */ + private String supplierName; + + /** 备注 */ + private String remark; + + private Integer activityState; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + @TableField(exist = false) + List testids; + + /** 生成费用开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime passStartTime; + + /** 生成费用结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime passEndTime; + + /** 0=>未逾期、1=>已逾期、2=>即将逾期 */ + private Integer overdueState; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsActivityTemplateLogSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsActivityTemplateLogSo.java new file mode 100644 index 0000000..790dd1c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsActivityTemplateLogSo.java @@ -0,0 +1,36 @@ +package com.qs.serve.modules.tbs.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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 2023-01-05 + */ +@Data +public class TbsActivityTemplateLogSo implements Serializable { + + /** 模板id */ + private Long templateId; + + /** 模板名称 */ + private String templateName; + + /** 操作状态:0:关闭;1-开启;2-删除;3-修改 */ + private Integer optionState; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsActivityTemplateSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsActivityTemplateSo.java new file mode 100644 index 0000000..2b6dabd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsActivityTemplateSo.java @@ -0,0 +1,42 @@ +package com.qs.serve.modules.tbs.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; +import java.util.List; +/** + * 活动模板 查询参数 + * @author YenHex + * @since 2022-11-29 + */ +@Data +public class TbsActivityTemplateSo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 供应商id */ + private Long supplierId; + + /** 模板名称 */ + private String templateName; + + /** 模板状态 */ + private Integer templateState; + + private Integer contractFlag; + + /** 备注 */ + private String remark; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsBudgetChangeSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsBudgetChangeSo.java new file mode 100644 index 0000000..0c51fc5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsBudgetChangeSo.java @@ -0,0 +1,43 @@ +package com.qs.serve.modules.tbs.entity.so; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/8/11 + */ +@Data +public class TbsBudgetChangeSo { + + /** 审批状态:0=未发布;1=审批中;2=完成;3-被驳回;4-中止 */ + private Integer budgetCheckState; + + /** 编码 */ + private String code; + + private String title; + + /** 预算ID */ + private Long budgetId; + + private String budgetNumber; + + private String userId; + + private String userName; + + private String userCode; + + private String subjectName; + + private String subjectCode; + + private String centerCode; + + private String centerName; + + private Integer startRow; + + private Integer pageSize; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsBudgetLogSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsBudgetLogSo.java new file mode 100644 index 0000000..3e253a1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsBudgetLogSo.java @@ -0,0 +1,151 @@ +package com.qs.serve.modules.tbs.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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 2023-01-05 + */ +@Data +public class TbsBudgetLogSo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 操作人编号 */ + private String optUserCode; + + /** 类型:0-预算新增;1-费用申请;2-预算调增;3-预算调减;4-费用释放 */ + private Integer optType; + + /** 预算金额/调整金额/释放金额 */ + private BigDecimal amount; + + /** 考核id */ + private Long scheduleId; + + /** 考核期项id */ + private Long scheduleItemId; + + /** 考核编码 */ + private String itemName; + + private String activityTheme; + private String targetType; + private String targetCode; + private String targetName; + + /** 开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startDate; + + /** 结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endDate; + + /** 预算id */ + private Long budgetId; + + /** 预算编码 */ + private String budgetCode; + + /** 科目id */ + private Long subjectId; + + /** 科目编码 */ + private String subjectCode; + + /** 科目名称 */ + private String subjectName; + + /** 成本中心类型 */ + private String centerType; + + /** 成本中心id */ + private String centerId; + + /** 成本中心编码 */ + private String centerCode; + + /** 成本中心名称 */ + private String centerName; + + /** 客户id */ + private Long supplierId; + + /** 客户编码 */ + private String supplierCode; + + /** 客户名称 */ + private String supplierName; + + /** 活动id */ + private Long activityId; + + /** 活动编码 */ + private String activityCode; + + /** 费用申请id */ + private Long costApplyId; + + /** 费用申请编码 */ + private String costApplyCode; + + /** 费用申请主题 */ + private String costApplyTheme; + + private String policyCode; + private String policyTitle; + private String policyItemCode; + + /** 操作人id */ + private String optUserId; + + /** 操作人名称 */ + private String optUserName; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsBudgetSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsBudgetSo.java new file mode 100644 index 0000000..d68f5dc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsBudgetSo.java @@ -0,0 +1,82 @@ +package com.qs.serve.modules.tbs.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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 2022-11-12 + */ +@Data +public class TbsBudgetSo implements Serializable { + + private List selectIdList; + + private Integer budgetState; + + /** 停用状态 0/1 */ + private Integer stopFlag; + + /** 不活动的 0/1 */ + private Integer inactiveFlag; + + /** 是否允许跨年,控制停用状态 */ + private Integer crossYearFlag; + + /** 预算标题 */ + private String budgetCode; + + /** 预算编码 */ + private String budgetNumber; + + /** 审批流程状态 */ + private Integer budgetCheckState; + + /** 科目编码搜索值 */ + private String subjectValue; + + /** 成本中心搜索值 */ + private String centerValue; + + /** 品牌搜索值 */ + private String brandValue; + + /** 品类搜索值 */ + private String categoryValue; + + /** 系列搜索值 */ + private String seriesValue; + + /** sku搜索值 */ + private String skuValue; + + /** 商品搜索值 */ + private String spuValue; + + /** 考核期id */ + private Long scheduleId; + + /** 考核期编码 */ + private String scheduleCode; + + /** 考核期名称 */ + private String scheduleName; + + private String centerType; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsCostUnItemSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsCostUnItemSo.java new file mode 100644 index 0000000..67c250d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsCostUnItemSo.java @@ -0,0 +1,151 @@ +package com.qs.serve.modules.tbs.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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 2023-02-02 + */ +@Data +public class TbsCostUnItemSo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 成本明细编码 */ + private String centerGoodsCode; + + /** 费用申请id */ + private Long costApplyId; + + /** 活动id */ + private Long activityId; + + /** 活动编码 */ + private String activityCode; + + /** 科目id */ + private Long subjectId; + + /** 科目编码 */ + private String subjectCode; + + /** 科目名称 */ + private String subjectName; + + /** 成本中心类型 */ + private String centerType; + + /** 成本中心id */ + private String centerId; + + /** 成本中心编码 */ + private String centerCode; + + /** 成本中心名称 */ + private String centerName; + + /** 成本中心金额 */ + private BigDecimal centerAmount; + + /** 成本中心占比 */ + private BigDecimal centerRate; + + /** 费用额度 */ + private BigDecimal centerGoodsAmount; + + /** 费用占比 */ + private BigDecimal centerGoodsRate; + + /** 目标类型(brand、category、series、spu、sku) */ + private String targetType; + + /** 目标id */ + private Long targetId; + + /** 目标编码 */ + private String targetCode; + + /** 目标名称 */ + private String targetName; + + /** 目标等级路径 */ + private String targetLevelPathIds; + + /** 目标等级路径 */ + private String targetLevelPathNames; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 活动开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate actStartDate; + + /** 活动结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate actEndDate; + + /** 预算开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate preStartDate; + + /** 预算结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate preEndDate; + + /** 预计核销时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate preCheckDate; + + /** 客户id */ + private Long supplierId; + + /** 客户编码 */ + private String supplierCode; + + /** 客户名称 */ + private String supplierName; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsScheduleItemSearch.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsScheduleItemSearch.java new file mode 100644 index 0000000..c85128b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/TbsScheduleItemSearch.java @@ -0,0 +1,80 @@ +package com.qs.serve.modules.tbs.entity.so; + +import com.qs.serve.common.util.CollectionUtil; +import lombok.Data; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/12/27 + */ +@Data +public class TbsScheduleItemSearch { + + /** + * 成本中心组合值列表,格式:centerType_centerId + */ + private List centerCombos; + + /** + * 周期ID + */ + private List scheduleIds; + + /** + * 周期ID + */ + private List scheduleItemIds; + + /** + * 周期项的预算ID(用于查询`审批中`的使用情况) + */ + private List scheduleItemBudgetIds; + + /** + * 品牌ID + */ + private List brandIds; + + /** + * 成本中心列表 + */ + private List centerList; + + @Data + public static class CenterItem{ + + private String centerType; + + private String centerId; + + } + + /** + * 调整数据结构 + */ + public void initCenterCombo(){ + if(CollectionUtil.isNotEmpty(centerList)){ + this.centerCombos = centerList.stream().map(a-> a.getCenterType()+"_"+a.getCenterId()).collect(Collectors.toList()); + } + } + + 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/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/VtbVerificationBatchQuery.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/VtbVerificationBatchQuery.java new file mode 100644 index 0000000..ffd7cfc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/so/VtbVerificationBatchQuery.java @@ -0,0 +1,65 @@ +package com.qs.serve.modules.tbs.entity.so; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.qs.serve.modules.tag.entity.so.TagQuery; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author YenHex + * @since 2024/7/3 + */ +@Data +public class VtbVerificationBatchQuery { + + private Integer loadChild; + + /** 批次编码 */ + private String vtbBatchCode; + + /** 状态:0-审批中;1-通过;2-拒绝;3-回退 */ + private Integer vtbBatchStatus; + + private String costCode; + + /** 客户编码 */ + private String supplierCode; + + /** 客户名称 */ + private String supplierName; + + private String supplierBizRegionFirstName; + + private String supplierBizRegionSecondName; + + private String supplierBizRegionThirdName; + + /** 申请人 */ + private String userCode; + + /** 申请人 */ + private String userName; + + /** 创建时间 */ + private LocalDateTime batchStartTime; + + /** 创建时间 */ + private LocalDateTime batchEndTime; + + private List userIds; + + String pageNum; + + String pageSize; + + @TableField(exist = false) + List tagQueryList; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/CtpAffairVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/CtpAffairVo.java new file mode 100644 index 0000000..17b1eb2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/CtpAffairVo.java @@ -0,0 +1,49 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import com.qs.serve.modules.seeyon.entity.CtpAffair; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.entity.VtbVerificationYard; +import lombok.Data; +import java.util.List; +/** + * @author YenHex + * @since 2022/12/7 + */ +@Data +public class CtpAffairVo { + + /** 审批信息 */ + private CtpAffair affairInfo; + + /** 费用申请信息 */ + private Object costApply; + + /** 核销信息 */ + private Object policyInfo; + + /** 费用核销信息 */ + private VtbVerification verification; + + /** 审批人 */ + private Object userInfo; + + /** 岗位列表(有可能返回null) */ + private List userPostList; + + /** 活动 */ + private Object activityInfo; + + /** 审批日志 */ + private Object commitLine; + + /** 审批日志明细 */ + private List commitItems; + + /** 附件列表 */ + private List attachments; + + /** 提交时的日志记录 */ + private Object commitInfo; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsActivityCenterGoodsVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsActivityCenterGoodsVo.java new file mode 100644 index 0000000..ca0ade7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsActivityCenterGoodsVo.java @@ -0,0 +1,120 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.modules.tbs.entity.TbsActivity; +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; + +/** + * 活动成本中心配比项 VO + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsActivityCenterGoodsVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + private String centerGoodsCode; + + /** 费用申请id */ + private Long costApplyId; + + /** 活动id */ + private Long activityId; + + /** 科目id */ + private Long subjectId; + + /** 科目编码 */ + private String subjectCode; + + /** 科目名称 */ + private String subjectName; + + /** 费用额度 */ + private BigDecimal centerGoodsAmount; + + /** 费用占比 */ + private BigDecimal centerGoodsRate; + + /** 费用已用额度 */ + private BigDecimal usedAmount; + + /** 成本中心类型 */ + private String centerType; + + /** 成本中心id */ + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 50,message = "成本中心编码长度不能超过50字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 50,message = "成本中心名称长度不能超过50字") + private String centerName; + + + /** 目标类型(brand、category、series、spu、sku) */ + @NotBlank(message = "目标类型(brand、category、series、spu、sku)不能为空") + @Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字") + private String targetType; + + /** 目标id */ + @NotNull(message = "目标id不能为空") + private Long targetId; + + /** 目标编码 */ + @NotBlank(message = "目标编码不能为空") + @Length(max = 30,message = "目标编码长度不能超过30字") + private String targetCode; + + /** 目标名称 */ + @NotBlank(message = "目标名称不能为空") + @Length(max = 30,message = "目标名称长度不能超过30字") + private String targetName; + + /** 目标等级id路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathIds; + + /** 目标等级名称路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathNames; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + @TableField(exist = false) + private String spuName; + + @TableField(exist = false) + private String skuName; + + /** 活动信息(活动执行时间,预计核销时间、活动简介) */ + private TbsActivity activityInfo; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsActivityCenterVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsActivityCenterVo.java new file mode 100644 index 0000000..7998cb6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsActivityCenterVo.java @@ -0,0 +1,95 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 活动成本中心项 VO + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsActivityCenterVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 费用申请id */ + private Long costApplyId; + + /** 活动id */ + private Long activityId; + + /** 科目id */ + private Long subjectId; + + /** 科目编码 */ + private String subjectCode; + + /** 科目名称 */ + private String subjectName; + + /** 费用额度 */ + private BigDecimal amount; + + /** 成本中心类型 */ + private String centerType; + + /** 成本中心id */ + private Long centerId; + + /** 成本中心编码 */ + private String centerCode; + + /** 成本中心名称 */ + private String centerName; + + /** 场次 */ + private Integer countSession; + + /** 人数 */ + private Integer countPerson; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsActivityChannelPointVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsActivityChannelPointVo.java new file mode 100644 index 0000000..2bb3366 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsActivityChannelPointVo.java @@ -0,0 +1,86 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 活动网点项 VO + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsActivityChannelPointVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 费用申请id */ + private Long costApplyId; + + /** 活动id */ + private Long activityId; + + /** 渠道id */ + private Long channelId; + + /** 渠道编码 */ + private String channelCode; + + /** 渠道名称 */ + private String channelName; + + /** 网点id */ + private Long pointId; + + /** 网点编码 */ + private String pointCode; + + /** 网点名称 */ + private String pointName; + + /** 网点费用占比 */ + private BigDecimal pointRate; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsActivityChannelVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsActivityChannelVo.java new file mode 100644 index 0000000..e277199 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsActivityChannelVo.java @@ -0,0 +1,80 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 活动渠道项 VO + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsActivityChannelVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 费用申请id */ + private Long costApplyId; + + /** 活动id */ + private Long activityId; + + /** 渠道id */ + private Long channelId; + + /** 渠道编码 */ + private String channelCode; + + /** 渠道名称 */ + private String channelName; + + /** 渠道费用占比 */ + private BigDecimal channelRate; + + /** 预计头发网点数量 */ + private Integer preCountPoint; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsActivityDefaultCenterVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsActivityDefaultCenterVo.java new file mode 100644 index 0000000..457ec3e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsActivityDefaultCenterVo.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import com.qs.serve.modules.bms.entity.BmsCostCenter; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import lombok.Data; +import java.util.List; + +/** + * @author YenHex + * @since 2022/12/26 + */ +@Data +public class TbsActivityDefaultCenterVo { + + BmsSupplier supplier; + + private BmsRegion saleRegion; + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsActivityGoodsVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsActivityGoodsVo.java new file mode 100644 index 0000000..9e0445c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsActivityGoodsVo.java @@ -0,0 +1,92 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 活动商品项 VO + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsActivityGoodsVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 费用申请id */ + private Long costApplyId; + + /** 活动id */ + private Long activityId; + + /** 网点费用占比 */ + private BigDecimal goodsRate; + + /** 目标类型(brand、category、series、spu、sku) */ + private String targetType; + + /** 目标id */ + private Long targetId; + + /** 目标编码 */ + private String targetCode; + + /** 目标名称 */ + private String targetName; + + /** 目标父级id */ + private Long targetParentId; + + /** 目标父级编码 */ + private String targetParentCode; + + /** 目标父级名称 */ + private String targetParentName; + + /** 目标等级路径 */ + private String targetLevelPath; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetMatchMsgVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetMatchMsgVo.java new file mode 100644 index 0000000..a38586f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetMatchMsgVo.java @@ -0,0 +1,43 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import lombok.Data; + +/** + * @author YenHex + * @since 2023/12/28 + */ +@Data +public class TbsBudgetMatchMsgVo { + + /** 活动ID */ + private Long activityId; + + /** 活动编码 */ + private String activityCode; + + /** 活动标题 */ + private String activityTitle; + + /** 预算ID */ + private Long budgetId; + + /** 预算编码 */ + private String budgetCode; + + /** 预算标题 */ + private String budgetTitle; + + private String msg; + + public TbsBudgetMatchMsgVo(TbsBudget budget, TbsActivity activity,String msg){ + this.activityId = activity.getId(); + this.activityCode = activity.getActivityCode(); + this.activityTitle = activity.getActTitle(); + this.budgetId = budget.getId(); + this.budgetCode = budget.getBudgetNumber(); + this.budgetTitle = budget.getBudgetCode(); + this.msg = msg; + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetMatchVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetMatchVo.java new file mode 100644 index 0000000..10583a6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetMatchVo.java @@ -0,0 +1,126 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author YenHex + * @since 2022/12/20 + */ +@Data +public class TbsBudgetMatchVo { + + /** + * 预算列表 + */ + private List budgetVoList; + + /** 预算金额 */ + private BigDecimal totalAmount; + + /** 预算已使用金额 */ + private BigDecimal usedAmount; + + /** 当前活动金额 */ + private BigDecimal currentAmount; + + @Data + public static class BudgetVo{ + /** 预算编码 */ + private String budgetCode; + + /** 费用启用状态 0/1 */ + private Integer budgetState; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 30,message = "科目编码长度不能超过30字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 30,message = "科目名称长度不能超过30字") + private String subjectName; + + /** 成本中心id */ + @NotNull(message = "成本中心id不能为空") + private String centerId; + + @NotNull(message = "成本中心类型不能为空") + private String centerType; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 30,message = "成本中心编码长度不能超过30字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 30,message = "成本中心名称长度不能超过30字") + private String centerName; + + /** 考核期id */ + @NotNull(message = "考核期id不能为空") + private Long scheduleId; + + /** 考核期编码 */ + @NotBlank(message = "考核期编码不能为空") + @Length(max = 30,message = "考核期编码长度不能超过30字") + private String scheduleCode; + + /** 考核期名称 */ + @NotBlank(message = "考核期名称不能为空") + @Length(max = 30,message = "考核期名称长度不能超过30字") + private String scheduleName; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 命中的考核期 */ + List itemBudgetVoList; + + /** 预算金额 */ + private BigDecimal totalAmount; + + /** 历史已用金额 */ + private BigDecimal totalHisAmount; + } + + @Data + public static class ItemBudgetVo{ + + /** 考核编码 */ + private String itemName; + + /** 开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime startDate; + + /** 结束时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime endDate; + + /** 预算金额 */ + private BigDecimal budgetAmount; + + /** 历史已用金额 */ + private BigDecimal hisAmount; + + /** 备注 */ + private String remark; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetSimpleVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetSimpleVo.java new file mode 100644 index 0000000..2206fb3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetSimpleVo.java @@ -0,0 +1,43 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 预算 实体类 + * @author YenHex + * @since 2022-11-12 + */ +@Data +public class TbsBudgetSimpleVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 预算编码 */ + private String budgetCode; + + /** 预算名称 */ + private String budgetName; + + /** 科目id */ + private Long subjectId; + + /** 科目编码 */ + private String subjectCode; + + /** 科目名称 */ + private String subjectName; + + /** 预算考核期编码 */ + private String scheduleCode; + + /** 预算考核期名称 */ + private String scheduleName; + + /** 备注 */ + private String remark; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetTableResultVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetTableResultVo.java new file mode 100644 index 0000000..fd4ae70 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetTableResultVo.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods; +import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + * @author YenHex + * @since 2022/12/6 + */ +@Data +public class TbsBudgetTableResultVo { + + private TbsBudgetTableVo tableVo; + + private List activityCenterGoodsList; + + private Map matchItemBudgetsMap; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetTableVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetTableVo.java new file mode 100644 index 0000000..8e5b1c9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetTableVo.java @@ -0,0 +1,65 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; +import java.util.function.LongFunction; + +/** + * @author YenHex + * @since 2022/12/6 + */ +@Data +public class TbsBudgetTableVo { + + private List topTheadHeaderList; + + private List leftTheadHeaderList; + + private List tableValueList; + + @Data + public static class LeftTheadHeader{ + private String id; + private String labelCombo; + private String label; + private String targetType; + private Long targetId; + private Long subjectId; + private String subjectName; + private String centerId; + private String centerName; + private String activityCode; + } + + @Data + public static class TopTheadHeader{ + private String id; + private String label; + + /** + * 可用预算 + * 考核期总预算 - (已申请费用的预算 + 费用申请未通过的预算) + **/ + private BigDecimal budgetAmount; + + /** 考核期总预算 */ + private BigDecimal totalAmount; + + /** 已申请费用的预算 */ + private BigDecimal costAppliedAmount; + + /** 费用申请但未通过的预算 */ + private BigDecimal costApplyAmount; + + } + + @Data + public static class TableValue{ + private String topId; + private String leftId; + private BigDecimal value; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetVo.java new file mode 100644 index 0000000..dd11da1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsBudgetVo.java @@ -0,0 +1,192 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import com.qs.serve.modules.tbs.entity.TbsBudgetCondition; +import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 预算 实体类 + * @author YenHex + * @since 2022-11-12 + */ +@Data +public class TbsBudgetVo implements Serializable { + + private static final long serialVersionUID = 1L; + + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 预算名称 */ + private String budgetCode; + + /** 预算编码 */ + private String budgetNumber; + + /** 费用启用状态 0/1 */ + private Integer budgetState; + + /** 审批流程状态 */ + private Integer budgetCheckState; + + /** 停用状态 0/1 */ + private Integer stopFlag; + + /** 是否允许跨年,控制停用状态 */ + private Integer crossYearFlag; + + /** 不活动的 0/1 用于随意关停预算 */ + private Integer inactiveFlag; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 30,message = "科目编码长度不能超过30字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 30,message = "科目名称长度不能超过30字") + private String subjectName; + + /** 成本中心id */ + @NotNull(message = "成本中心id不能为空") + private String centerId; + + @NotNull(message = "成本中心类型不能为空") + private String centerType; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 30,message = "成本中心编码长度不能超过30字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 30,message = "成本中心名称长度不能超过30字") + private String centerName; + + /** 考核期id */ + @NotNull(message = "考核期id不能为空") + private Long scheduleId; + + /** 考核期编码 */ + @NotBlank(message = "考核期编码不能为空") + @Length(max = 30,message = "考核期编码长度不能超过30字") + private String scheduleCode; + + /** 考核期名称 */ + @NotBlank(message = "考核期名称不能为空") + @Length(max = 30,message = "考核期名称长度不能超过30字") + private String scheduleName; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 条件标识 */ + private Integer conditionFlag; + + /** 生成底表标识:默认0;同步成功为1 */ + private Integer birFlag; + + /** 申请人 */ + @NotBlank(message = "申请人不能为空") + @Length(max = 32,message = "申请人长度不能超过32字") + private String userId; + + /** 用户编码 */ + @Length(max = 32,message = "长度不能超过32字") + private String userCode; + + /** 用户名称 */ + @Length(max = 32,message = "长度不能超过32字") + @TableField(condition = SqlCondition.LIKE) + private String userName; + + /** 致远表单id */ + private String syFormId; + + /** 提交审批时间 */ + private LocalDateTime submitTime; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 附件id */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] attachIds; + + /** 后端传输dto */ + @TableField(exist = false) + private List budgetConditionList; + + @TableField(exist = false) + private List attachList; + + + private List brandConditions; + private List categoryConditions; + private List seriesConditions; + private List skuConditions; + private List spuConditions; + private List scheduleItem; + private List scheduleItemBudgets; + + /** 变更列表 */ + private List changeList; + + /** 是否指定模板类型的预算 */ + private Integer templateFlag; + + /** 模板列表 */ + private List templateList; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsCostApplySumAmountVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsCostApplySumAmountVo.java new file mode 100644 index 0000000..8cf20e6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsCostApplySumAmountVo.java @@ -0,0 +1,65 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 费用申请 VO + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsCostApplySumAmountVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + /** + * 已批准(费用申请) + */ + private BigDecimal costApplyAmt; + + /** + * 已核销 + */ + private BigDecimal checkedAmt; + + /** + * 申请中 + */ + private BigDecimal checkingAmt; + + /** + * 未申请 + */ + private BigDecimal notCheckAmt; + + /** + * 不予核销 + */ + private BigDecimal dontCheckAmt; + + /** + * 已支付 + */ + private BigDecimal payAmt; + + /** + * 待支付 + */ + private BigDecimal unPayAmt; + + /** + * 不再支付 + */ + private BigDecimal notPayAmt; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsCostApplyVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsCostApplyVo.java new file mode 100644 index 0000000..37338fb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsCostApplyVo.java @@ -0,0 +1,122 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.modules.tag.entity.so.TagQuery; +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; + +/** + * 费用申请 VO + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsCostApplyVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + private String code; + + /** 主题 */ + private String chargeTheme; + + /** 客户id */ + private Long supplierId; + + /** 客户编码 */ + private String supplierCode; + + /** 客户名称 */ + private String supplierName; + + /** 状态:0=未发布;1=待执行;2=待核销;完成; */ + private Integer chargeState; + + /** 备注 */ + private String remark; + + /** 申请人 */ + private String userId; + + /** */ + private String userCode; + + /** */ + private String userName; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 加载下属标识 1 是,0否 */ + private Integer loadChild; + + private Integer contractFlag; + + + /** + * 0=>未逾期、1=>已逾期、2=>即将逾期 + */ + private Integer overdueState; + + private String templateTitle; + + /** + * 核销状态: + * 有这四个状态: + * 0-未核销:代表这案子里面的所有活动都还未开始核销; + * 1-已通过:代表这个案子的所有活动都已经核销完成; + * 2-核销中:代表这个案子的某些活动在核销中; + * 3-被拒绝;代表这个案子里面的所有活动金额都被释放了 + */ + private Integer checkState; + + /** + * 选择的标签ID + */ + @TableField(exist = false) + List tagQueryList; + + @TableField(exist = false) + String pageNum; + + @TableField(exist = false) + String pageSize; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsScheduleItemBudgetVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsScheduleItemBudgetVo.java new file mode 100644 index 0000000..f12a6a9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsScheduleItemBudgetVo.java @@ -0,0 +1,79 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 预算考核期项 VO + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsScheduleItemBudgetVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 考核id */ + private Long scheduleId; + + /** 考核编码 */ + private String itemName; + + /** 开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startDate; + + /** 结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endDate; + + /** 预算id */ + private Long budgetId; + + /** 预算金额 */ + private BigDecimal budgetAmount; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsScheduleItemVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsScheduleItemVo.java new file mode 100644 index 0000000..3180fdb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsScheduleItemVo.java @@ -0,0 +1,73 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 考核时间项 VO + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsScheduleItemVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 考核id */ + private Long scheduleId; + + /** 考核编码 */ + private String itemName; + + /** 开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startDate; + + /** 结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endDate; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsScheduleVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsScheduleVo.java new file mode 100644 index 0000000..b9acdeb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/entity/vo/TbsScheduleVo.java @@ -0,0 +1,65 @@ +package com.qs.serve.modules.tbs.entity.vo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 考核期 VO + * @author YenHex + * @since 2022-11-09 + */ +@Data +public class TbsScheduleVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 考核名称 */ + private String code; + + /** 考核编码 */ + private String name; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityAmtCheckMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityAmtCheckMapper.java new file mode 100644 index 0000000..e80f7ec --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityAmtCheckMapper.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.qs.serve.modules.tbs.entity.dto.TbsActivityAmtCheck; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/12/11 + */ +public interface TbsActivityAmtCheckMapper { + + @Select("") + @InterceptorIgnore(tenantLine = "true") + List listByCostApplyId(Long costApplyId); + + @Select("") + @InterceptorIgnore(tenantLine = "true") + List listByActivityId(Long activityId); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityCenterGoodsMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityCenterGoodsMapper.java new file mode 100644 index 0000000..15cc5ad --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityCenterGoodsMapper.java @@ -0,0 +1,50 @@ +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.TbsActivityCenterGoods; +import com.qs.serve.modules.tbs.entity.dto.TbsActNotMatchAmtCenterGoods; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Set; + +/** + * 活动成本中心配比项 Mapper + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsActivityCenterGoodsMapper extends BaseMapper { + + @InterceptorIgnore(tenantLine = "1") + @Select("SELECT cost_apply_id FROM tbs_activity_center_goods " + + " left join tbs_cost_apply on tbs_activity_center_goods.cost_apply_id = tbs_cost_apply.id " + + " where tbs_cost_apply.del_flag = 0 and tbs_activity_center_goods.del_flag = 0 " + + " and DATE(tbs_activity_center_goods.update_time) = DATE(CURDATE()) " + + " GROUP BY cost_apply_id") + Set selectUpdateCostApplyIds(); + + @Select("" + ) + @InterceptorIgnore(tenantLine = "1") + List listNotMatchAmtCenterGoods(@Param("costApplyIds") List costIds); + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityCenterMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityCenterMapper.java new file mode 100644 index 0000000..b1937ec --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityCenterMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsActivityCenter; + +/** + * 活动成本中心项 Mapper + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsActivityCenterMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityChannelMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityChannelMapper.java new file mode 100644 index 0000000..5e14b9a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityChannelMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsActivityChannel; + +/** + * 活动渠道项 Mapper + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsActivityChannelMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityChannelPointMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityChannelPointMapper.java new file mode 100644 index 0000000..0f19be1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityChannelPointMapper.java @@ -0,0 +1,38 @@ +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 + * @author YenHex + * @date 2022-11-08 + */ +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/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityGoodsMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityGoodsMapper.java new file mode 100644 index 0000000..2958a33 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityGoodsMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsActivityGoods; + +/** + * 活动商品项 Mapper + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsActivityGoodsMapper extends BaseMapper{ + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityMapper.java new file mode 100644 index 0000000..6880e85 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityMapper.java @@ -0,0 +1,67 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + * 费用活动 Mapper + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsActivityMapper extends BaseMapper { + + @Select("SELECT cost_apply_id FROM `tbs_activity` where del_flag = 0 and release_flag = 1 and activity_code LIKE '24%' GROUP BY cost_apply_id order by cost_apply_id") + List selectReleaseCostIds(); + + @Select("select vtb.id as verification_id ,act.* from tbs_activity act left join vtb_verification vtb on act.id = vtb.activity_id " + + " where " + + " vtb.verification_state = 1 and " + + " reg_release_flag = 1 " + + " and act.release_flag = 0 " + + " and act.del_flag = 0 and vtb.del_flag = 0 " + + " and act.activity_code like '2%' " + + " and act.cancel_flag = 0 " + + " and act.used_amount != act.total_amount") + List selectUnRelease(); + + @Select("select sum(tbs_activity.used_amount) from tbs_activity where cost_apply_id = #{costId} and del_flag = 0") + BigDecimal sumCostUsedAmount(@Param("costId") Long costId); + + /** + * 统计用户所有通过审核的费用 + * @param supplierId + * @return + */ + @Select({"" + }) + BigDecimal sumSupplierActivityCost(@Param("supplierId")String supplierId, @Param("costApplyIds") List costApplyIds); + + /** + * 不予核销金额 + * @param supplierId + * @return + */ + @Select({"" + }) + BigDecimal sumSupplierNotCheckCost(@Param("supplierId")String supplierId, @Param("costApplyIds") List costApplyIds); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityPayConditionMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityPayConditionMapper.java new file mode 100644 index 0000000..4f4ec32 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityPayConditionMapper.java @@ -0,0 +1,60 @@ +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 + * @date 2023-05-10 + */ +public interface TbsActivityPayConditionMapper extends BaseMapper { + + /** + * 统计所有的支付次数 + * @param activityId + * @return + */ + @Select("select sum(pay_times) from tbs_activity_pay_condition where del_flag = 0 and activity_id = #{activityId}") + Long sumActivityPayTimes(@Param("activityId") Long activityId); + + /** + * 统计完成的核销数量 + * @param activityId + * @return + */ + @Select("select count(1) from vtb_verification where del_flag = 0 and activity_id = #{activityId} and verification_state = '1' ") + Long sumFinishedCheck(@Param("activityId") Long activityId); + + @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/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivitySlottingFeeMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivitySlottingFeeMapper.java new file mode 100644 index 0000000..6f95e7c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivitySlottingFeeMapper.java @@ -0,0 +1,24 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsActivitySlottingFee; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +/** + * 活动进场费 Mapper + * @author YenHex + * @date 2023-06-26 + */ +public interface TbsActivitySlottingFeeMapper extends BaseMapper { + + /** + * 更新状态 + * @param costApplyId + * @param passFlag + */ + @Update("update tbs_activity_slotting_fee set pass_flag = #{passFlag} where cost_apply_id = #{costApplyId}") + void updatePassFlagByCostApplyId(@Param("costApplyId")Long costApplyId,@Param("passFlag") Integer passFlag); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivitySubjectMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivitySubjectMapper.java new file mode 100644 index 0000000..db35a27 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivitySubjectMapper.java @@ -0,0 +1,35 @@ +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 + * @author YenHex + * @date 2022-11-09 + */ +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/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivitySubjectYarnMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivitySubjectYarnMapper.java new file mode 100644 index 0000000..797e84c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivitySubjectYarnMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsActivitySubjectYarn; + +/** + * 活动科目审批线 Mapper + * @author YenHex + * @date 2023-08-03 + */ +public interface TbsActivitySubjectYarnMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityTemplateLogMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityTemplateLogMapper.java new file mode 100644 index 0000000..6a06243 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityTemplateLogMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplateLog; + +/** + * 活动模板 Mapper + * @author YenHex + * @date 2023-01-05 + */ +public interface TbsActivityTemplateLogMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityTemplateMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityTemplateMapper.java new file mode 100644 index 0000000..a7bbf8d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityTemplateMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplate; + +/** + * 活动模板 Mapper + * @author YenHex + * @date 2022-11-29 + */ +public interface TbsActivityTemplateMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityTemplateRegionMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityTemplateRegionMapper.java new file mode 100644 index 0000000..acc4d8a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsActivityTemplateRegionMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplateRegion; + +/** + * 活动模板区域 Mapper + * @author YenHex + * @date 2022-11-29 + */ +public interface TbsActivityTemplateRegionMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetBatchItemMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetBatchItemMapper.java new file mode 100644 index 0000000..d7f86f1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetBatchItemMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsBudgetBatchItem; + +/** + * 批量申请项 Mapper + * @author YenHex + * @date 2023-08-24 + */ +public interface TbsBudgetBatchItemMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetBatchMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetBatchMapper.java new file mode 100644 index 0000000..fe5ac39 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetBatchMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsBudgetBatch; + +/** + * 批量申请 Mapper + * @author YenHex + * @date 2023-08-24 + */ +public interface TbsBudgetBatchMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetChangeConditionMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetChangeConditionMapper.java new file mode 100644 index 0000000..4bef75f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetChangeConditionMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsBudgetChangeCondition; + +/** + * 预算更变记录条件 Mapper + * @author YenHex + * @date 2023-08-09 + */ +public interface TbsBudgetChangeConditionMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetChangeMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetChangeMapper.java new file mode 100644 index 0000000..e8372d3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetChangeMapper.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.common.dto.TbsBudgetChangeVo; +import com.qs.serve.modules.tbs.entity.TbsBudgetChange; +import com.qs.serve.modules.tbs.entity.so.TbsBudgetChangeSo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 预算更变记录 Mapper + * @author YenHex + * @date 2023-08-09 + */ +public interface TbsBudgetChangeMapper extends BaseMapper { + + List selectChangeVoList(@Param("query") TbsBudgetChangeSo query); + + Long countChangeVo(@Param("query") TbsBudgetChangeSo query); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetChangeScheduleItemMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetChangeScheduleItemMapper.java new file mode 100644 index 0000000..cea6650 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetChangeScheduleItemMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsBudgetChangeScheduleItem; + +/** + * 考核期更变记录 Mapper + * @author YenHex + * @date 2023-08-09 + */ +public interface TbsBudgetChangeScheduleItemMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetConditionMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetConditionMapper.java new file mode 100644 index 0000000..9df0146 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetConditionMapper.java @@ -0,0 +1,18 @@ +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.TbsBudgetCondition; +import org.apache.ibatis.annotations.Param; + +/** + * 预算条件 Mapper + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsBudgetConditionMapper extends BaseMapper { + + @InterceptorIgnore(tenantLine = "true") + Long findUnMatchConditionBySourceBudgetIdAndTargetBudgetId(@Param("sourceId")Long sourceId, @Param("targetId")Long targetId); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetCostItemMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetCostItemMapper.java new file mode 100644 index 0000000..912199d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetCostItemMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsBudgetCostItem; + +/** + * 预算费用明细 Mapper + * @author YenHex + * @date 2022-12-02 + */ +public interface TbsBudgetCostItemMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetCostItemPolicyMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetCostItemPolicyMapper.java new file mode 100644 index 0000000..04522a6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetCostItemPolicyMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsBudgetCostItemPolicy; + +/** + * 预算费用明细 Mapper + * @author YenHex + * @date 2023-02-22 + */ +public interface TbsBudgetCostItemPolicyMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetLog2Mapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetLog2Mapper.java new file mode 100644 index 0000000..affe3d4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetLog2Mapper.java @@ -0,0 +1,97 @@ +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; +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; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 预算日志 Mapper + * @author YenHex + * @date 2023-01-05 + */ +public interface TbsBudgetLog2Mapper extends BaseMapper { + + + /** + * 统计budget金额 + * @param ids budgetId + * @param optNumbers 包含 + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List getSumFinalAmtInList(@Param("selectIds") List ids, @Param("optNumbers")List optNumbers); + + /** + * 统计budget金额 + * @param ids budgetId + * @param optNumbers 包含 + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List getSumAmtInList(@Param("selectIds") List ids, @Param("optNumbers")List optNumbers); + + @InterceptorIgnore(tenantLine = "true") + List getSumBackAmtInList(@Param("selectIds") List ids); + + + @InterceptorIgnore(tenantLine = "true") + TbsBudgetLogWithAmount getSumBackAmt(@Param("budgetId") Long budgetId,@Param("scheduleItemBudgetId") Long scheduleItemBudgetId); + + /** + * 统计budget金额 + * @param ids budget_id + * @param optNumbers 不包含 + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List getSumAmtNotInList(@Param("selectIds") List ids,@Param("optNumbers")List optNumbers); + + + + /** + * 统计审批中的政策,占用多少的预算 + * @param ids + * @param optNumbers + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List getPolicyCheckingList(@Param("selectIds") List ids,@Param("optNumbers")List optNumbers); + + /** + * 统计审批中的费用,占用多少的预算 + * @param ids + * @param optNumbers + * @return + */ + @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/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetLogMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetLogMapper.java new file mode 100644 index 0000000..f067e47 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetLogMapper.java @@ -0,0 +1,77 @@ +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; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 预算日志 Mapper + * @author YenHex + * @date 2023-01-05 + */ +public interface TbsBudgetLogMapper extends BaseMapper { + + @Select("SELECT cost_apply_id FROM `tbs_budget_log` " + + "WHERE `budget_id` = #{budgetId} AND `del_flag` = '0' and cost_apply_id is not null\n" + + "group by cost_apply_id") + List getBudgetCostIds(Long budgetId); + + @Select("SELECT count(1) FROM `tbs_budget_log` WHERE cost_apply_id = #{errorCostId} AND del_flag = '3'") + Long countErrorCostId(@Param("errorCostId")Long errorCostId ); + + @Select("SELECT SUM(amount) FROM `tbs_budget_log` WHERE budget_id = #{budgetId} AND schedule_item_id = #{itemId} AND del_flag = '0'") + BigDecimal countBudgetItemAmount(@Param("budgetId")Long budgetId,@Param("itemId")Long itemId ); + + @Select("SELECT ROUND(SUM(l.amount),2) FROM `tbs_budget_log` l left join tbs_schedule_item_budget i " + + " on l.schedule_item_budget_id = i.id " + + " WHERE l.opt_type in (0,2,3) and l.del_flag = '0' " + + " and i.del_flag = '0' and year(i.start_date) = #{year} and year(i.end_date) = #{year}") + BigDecimal countPlannedBudgetAmount(@Param("year")String year); + + @Select("SELECT ROUND(abs(SUM(l.amount)),2) FROM `tbs_budget_log` l left join tbs_schedule_item_budget i " + + " on l.schedule_item_budget_id = i.id WHERE l.opt_type in (1,4,5,6,11,12,13,14,15) " + + " and l.del_flag = '0' and i.del_flag = '0' and year(i.start_date) = #{year} and year(i.end_date) = #{year}") + BigDecimal countUsedBudgetAmount(@Param("year")String year); + + /** + * 更新删除预算log记录,用于异动 + * @param costApplyId + * @param delState + */ + @Update("update tbs_budget_log set del_flag = #{delState} WHERE cost_apply_id = #{costApplyId}") + void updateLogDelFlagByCostApply(@Param("costApplyId")Long costApplyId,@Param("delState")Integer delState); + + /** + * 适配异动状态2的记录 + * @param costApplyId + * @param delState + */ + @Update("update tbs_budget_log set del_flag = #{delState} WHERE cost_apply_id = #{costApplyId} and del_flag = 2 ") + void updateLogDelFlagCancelByCostApply(@Param("costApplyId")Long costApplyId,@Param("delState")Integer delState); + + @Select("SELECT " + + " tbs_cost_apply.id," + + " tbs_cost_apply.code " + + " FROM " + + " tbs_cost_apply " + + " LEFT JOIN ( SELECT cost_apply_id, sum(- amount ) AS sum_budget FROM `tbs_budget_log` where tbs_budget_log.del_flag = 0 GROUP BY cost_apply_id ) AS tmp ON tbs_cost_apply.id = tmp.cost_apply_id " + + " LEFT JOIN ( SELECT cost_apply_id, sum( used_amount ) AS release_budget FROM `vtb_fund_flow` where vtb_fund_flow.del_flag = 0 and fund_type = 'release' GROUP BY cost_apply_id ) AS tmp2 ON tbs_cost_apply.id = tmp2.cost_apply_id " + + " WHERE " + + " xlt_sync IS NULL " + + " and tbs_cost_apply.del_flag = 0 " + + " and tbs_cost_apply.cancel_flag = 0 " + + " AND tbs_cost_apply.charge_state in (1,2,3,7) " + + " and (code like 'SHX%' or code like 'DHX%') " + + " AND ( sum_budget != (total_activity_amount-release_budget) or (release_budget is null and sum_budget!=total_activity_amount) ) " + + " and (total_activity_amount-sum_budget>1 or sum_budget - total_activity_amount>1 )") + List selectErrorThirtyCostId(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetMapper.java new file mode 100644 index 0000000..fb358f0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetMapper.java @@ -0,0 +1,155 @@ +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.TbsBudget; +import com.qs.serve.modules.tbs.entity.so.TbsBudgetSo; +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 + * @date 2022-11-08 + */ +public interface TbsBudgetMapper extends BaseMapper { + + /** + * 查询缺失tbs_schedule_item_budget的预算ID + * @return + */ + @InterceptorIgnore(tenantLine = "true") + @Select("select budget_id from ( " + + " select budget_id,tbs_schedule_item_budget.schedule_id,count(1) as count_bud from tbs_schedule_item_budget where tbs_schedule_item_budget.del_flag = 0 group by budget_id " + + ") tmp1 left join ( " + + " select schedule_id,count(1) as count_sch from tbs_schedule_item where tbs_schedule_item.del_flag = 0 group by schedule_id " + + ") tmp2 on tmp1.schedule_id = tmp2.schedule_id " + + " where count_bud != count_sch ") + List selectMissSchItemBudgetId(); + + /** + * 查询费用id + * @param budgetSo + * @return + */ + List selectBudgetId(@Param("query") TbsBudgetSo budgetSo); + + @InterceptorIgnore(tenantLine = "true") + @Update("update tbs_budget_condition set brand_id = SUBSTRING_INDEX(target_level_path_ids,'_',1) where budget_id = #{budgetId}") + int updateBudgetCondition(@Param("budgetId")Long budgetId); + + @InterceptorIgnore(tenantLine = "true") + @Update("update tbs_budget set center_combo = concat(center_type,'_',center_id) where id = #{budgetId}") + int updateBudgetComboCenter(@Param("budgetId")Long budgetId); + + /** + * 查询最新的审批申请是否在审批中 + * @param budgetId + * @return + */ + @Select("select count(1) from tbs_budget_change where budget_id = #{budgetId} and id = ( " + + " select max(id) from tbs_budget_change where budget_id = #{budgetId} and del_flag=0 ) and budget_check_state = 1") + long countLastChange(@Param("budgetId")Long budgetId); + + @InterceptorIgnore(tenantLine = "true") + @Select("select tbs_budget.id from tbs_budget " + + "LEFT JOIN tbs_budget_condition " + + " on tbs_budget_condition.budget_id = tbs_budget.id " + + "where tbs_budget.del_flag = 0 " + + " and tbs_budget_condition.del_flag = 0 " + + " and tbs_budget.condition_flag = 1 " + + " and tbs_budget_condition.id is null " + + "GROUP BY tbs_budget.id") + List selectConditionBudgetIds(); + + + /** + * 查询未过期的预算ID + * @return + */ + @InterceptorIgnore(tenantLine = "true") + @Select("select tbs_budget.id " + + " from tbs_schedule_item " + + " left join tbs_budget on tbs_schedule_item.schedule_id = tbs_budget.schedule_id " + + " where YEAR(CURRENT_DATE) - YEAR(end_date) >=1 " + + " and tbs_schedule_item.del_flag = 0 " + + " and tbs_budget.del_flag = 0 " + + " GROUP BY tbs_budget.id") + List selectEnableBudgetId(); + + /** + * 查询未过期的预算ID + * @return + */ + @InterceptorIgnore(tenantLine = "true") + @Select("select tbs_budget.id " + + " from tbs_schedule_item " + + " left join tbs_budget on tbs_schedule_item.schedule_id = tbs_budget.schedule_id " + + " where YEAR(end_date) >= YEAR(CURRENT_DATE) " + + " and tbs_schedule_item.del_flag = 0 " + + " and tbs_budget.del_flag = 0 " + + " GROUP BY tbs_budget.id") + List selectNotExpireBudgetId(); + + /** + * 查询上年过期的预算ID + * @return + */ + @InterceptorIgnore(tenantLine = "true") + @Select("select tbs_budget.id " + + "from tbs_schedule_item " + + "left join tbs_budget on tbs_schedule_item.schedule_id = tbs_budget.schedule_id " + + "where YEAR(end_date) = YEAR(CURRENT_DATE) -1 " + + "and cross_year_flag = 0 " + + "and tbs_schedule_item.del_flag = 0 " + + "and tbs_budget.del_flag = 0 " + + "GROUP BY tbs_budget.id") + List selectLastYearStopBudgetId(); + + /** + * 查询未过期的预算ID + * @return + */ + @InterceptorIgnore(tenantLine = "true") + @Select("select tbs_budget.id " + + "from tbs_schedule_item " + + "left join tbs_budget on tbs_schedule_item.schedule_id = tbs_budget.schedule_id " + + "where YEAR(end_date) = YEAR(CURRENT_DATE) -1 " + + "and cross_year_flag = 1 " + + "and tbs_schedule_item.del_flag = 0 " + + "and tbs_budget.del_flag = 0 " + + "GROUP BY tbs_budget.id") + List selectLastYearPassBudgetId(); + + /** + * 一年前的过期的预算 + * @return + */ + @InterceptorIgnore(tenantLine = "true") + @Select("select tbs_budget.id " + + "from tbs_schedule_item " + + "left join tbs_budget on tbs_schedule_item.schedule_id = tbs_budget.schedule_id " + + "where YEAR(end_date) < YEAR(CURRENT_DATE) -1 " + + "and tbs_schedule_item.del_flag = 0 " + + "and tbs_budget.del_flag = 0 " + + "GROUP BY tbs_budget.id ") + List selectExpireBudgetId(); + + + @InterceptorIgnore(tenantLine = "true") + @Select("update " + + " tbs_budget " + + " LEFT JOIN `tbs_budget_condition` ON tbs_budget.id = tbs_budget_condition.budget_id " + + " set tbs_budget.condition_flag = 1 " + + "WHERE " + + " tbs_budget.condition_flag = 0 " + + " AND tbs_budget_condition.id IS NOT NULL " + + " and tbs_budget_condition.del_flag = 0 " + + " and tbs_budget.del_flag = 0") + List updateConFlag(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetMatchMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetMatchMapper.java new file mode 100644 index 0000000..b799cff --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetMatchMapper.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.qs.serve.common.model.AmountDTO; +import com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods; +import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Set; + +/** + * @author YenHex + * @since 2023/7/21 + */ +public interface TbsBudgetMatchMapper { + + /** + * 通过TbsActivityCenterGoods获取匹配条件的预算 + * @param centerGoods + * @return + */ + List getTbsScheduleItemsByCenterGoods(@Param("query") TbsActivityCenterGoods centerGoods); + + + List getBudgetUsedAmount(@Param("ids") Set ids); + + List getBudgetNotUsedAmount(@Param("ids") Set ids, @Param("costId")Long costId); + + List getBudgetFinalUsedAmount(@Param("ids") Set ids); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetPlanMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetPlanMapper.java new file mode 100644 index 0000000..875dae4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsBudgetPlanMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsBudgetPlan; + +/** + * 预算 Mapper + * @author YenHex + * @date 2023-07-10 + */ +public interface TbsBudgetPlanMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostApplyMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostApplyMapper.java new file mode 100644 index 0000000..3321d75 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostApplyMapper.java @@ -0,0 +1,112 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.entity.dto.TbsCostErrorBudgetDTO; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; + +/** + * 费用申请 Mapper + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsCostApplyMapper extends BaseMapper { + + /** + * 更新协议类状态 + * @return + */ + @Update(" update tbs_cost_apply " + + " set charge_state = 3 , check_state = 1 " + + " where del_flag = 0 " + + " and cancel_flag = 0 " + + " and contract_flag = 1 " + + " and total_activity_used_amount = total_activity_amount " + + " and total_activity_amount != 0") + int updateContractFinishedState(); + + /** + * 统计即将逾期 + * @param userId + * @param startNowDate + * @param nowDate + * @return + */ + Long selectCountOverdueState(@Param("userId")String userId, + @Param("startNowDate") LocalDate startNowDate, + @Param("nowDate")LocalDate nowDate); + + /** + * 替换继承人 + * @param userId + * @param sysUser + * @return + */ + @Update( + "update tbs_cost_apply " + + " set ext_user_id = #{obj.id},ext_user_id=#{obj.code},ext_user_name=#{obj.name}" + + " where charge_State!=0 and (user_id = #{userId} or ext_user_id = #{userId}) and del_flag=0" + ) + int updateCostExtUser(@Param("userId") String userId,@Param("obj") SysUser sysUser); + + /** + * 设置数据的继承人 + * @param costIds + * @param sysUser + * @return + */ + int updateCostExtUserByCostIds(@Param("costIds") List costIds,@Param("obj") SysUser sysUser); + + /** + * 设空继承人 + * @param costIds + * @return + */ + int cancelCostExtUserByCostId(@Param("costIds") List costIds); + + /** + * 查询列表 + * @param page + * @param param + * @return + */ + IPage selectCostApplyList(IPage page,@Param("query")TbsCostApply param); + + /** + * 查找 + * @return + */ + @InterceptorIgnore(tenantLine = "1") + List selectCostErrorBudgetDTO(); + + /** + * 统计cost的budgetLog占用 + * @param costApplyId + * @return + */ + @InterceptorIgnore(tenantLine = "1") + @Select("SELECT sum(- amount ) AS sum_budget FROM `tbs_budget_log`" + + " where tbs_budget_log.del_flag = 0" + + " and cost_apply_id = #{costApplyId}") + BigDecimal sumCostAmountBudget(@Param("costApplyId") Long costApplyId); + + + @Select("select sum(center_goods_amount)" + + " from tbs_activity_center_goods" + + " where cost_apply_id = #{costApplyId} and del_flag = 0") + BigDecimal sumCostCenterGoodsAmount(@Param("costApplyId") Long costApplyId); + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostApplyRemoveMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostApplyRemoveMapper.java new file mode 100644 index 0000000..4679bf0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostApplyRemoveMapper.java @@ -0,0 +1,109 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +/** + * @author YenHex + * @since 2023/12/8 + */ +public interface TbsCostApplyRemoveMapper { + + @Update("update tbs_cost_apply set del_flag = 1 where id = #{costApplyId}") + int tbs_cost_apply(@Param("costApplyId") Long costId); + + @Update("update tbs_activity set del_flag = 1 where cost_apply_id = #{costApplyId}") + int tbs_activity(@Param("costApplyId") Long costId); + + @Update("update tbs_activity_center set del_flag = 1 where cost_apply_id = #{costApplyId}") + int tbs_activity_center(@Param("costApplyId") Long costId); + + @Update("update tbs_activity_center_goods set del_flag = 1 where cost_apply_id = #{costApplyId}") + int tbs_activity_center_goods(@Param("costApplyId") Long costId); + + @Update("update tbs_activity_goods set del_flag = 1 where cost_apply_id = #{costApplyId}") + int tbs_activity_goods(@Param("costApplyId") Long costId); + + @Update("update tbs_activity_channel set del_flag = 1 where cost_apply_id = #{costApplyId}") + int tbs_activity_channel(@Param("costApplyId") Long costId); + + @Update("update tbs_activity_channel_point set del_flag = 1 where cost_apply_id = #{costApplyId}") + int tbs_activity_channel_point(@Param("costApplyId") Long costId); + + @Update("update tbs_activity_pay_condition set del_flag = 1 where cost_apply_id = #{costApplyId}") + int tbs_activity_pay_condition(@Param("costApplyId") Long costId); + + @Update("update tbs_activity_slotting_fee set del_flag = 1 where cost_apply_id = #{costApplyId}") + int tbs_activity_slotting_fee(@Param("costApplyId") Long costId); + + @Update("update tbs_activity_subject set del_flag = 1 where cost_apply_id = #{costApplyId}") + int tbs_activity_subject(@Param("costApplyId") Long costId); + + @Update("update tbs_activity_subject_yarn set del_flag = 1 where cost_apply_id = #{costApplyId}") + int tbs_activity_subject_yarn(@Param("costApplyId") Long costId); + + @Update("update vtb_verification set del_flag = 1 where cost_apply_id = #{costApplyId}") + int vtb_verification(@Param("costApplyId") Long costId); + + @Update("update pay_payment set del_flag = 1 where cost_apply_id = #{costApplyId}") + int pay_payment(@Param("costApplyId") Long costId); + + @Update("update pay_payment_item set del_flag = 1 where cost_apply_id = #{costApplyId}") + int pay_payment_item(@Param("costApplyId") Long costId); + + @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); + + @Update("update tbs_budget_cost_item_split set del_flag = 1 where cost_apply_id = #{costApplyId}") + int tbs_budget_cost_item_split(@Param("costApplyId") Long costId); + + @Update("update vtb_fund_flow set del_flag = 1 where cost_apply_id = #{costApplyId}") + int vtb_fund_flow(@Param("costApplyId") Long costId); + + @InterceptorIgnore(tenantLine = "true") + @Delete("delete from bir_activity_center_goods where cost_apply_id = #{costApplyId}") + int bir_activity_center_goods(@Param("costApplyId") Long costId); + + @InterceptorIgnore(tenantLine = "true") + @Delete("delete from bir_base_activity where cost_apply_id = #{costApplyId}") + int bir_base_activity(@Param("costApplyId") Long costId); + + @InterceptorIgnore(tenantLine = "true") + @Delete("delete from bir_payment_item where cost_apply_id = #{costApplyId}") + int bir_payment_item(@Param("costApplyId") Long costId); + + @Update("update vtb_verification_subject set del_flag = 1 where cost_apply_id = #{costApplyId}") + int vtb_verification_subject(@Param("costApplyId") Long costId); + + @Update("update vtb_verification_yard_item set del_flag = 1 where cost_apply_id = #{costApplyId}") + int vtb_verification_yard_item(@Param("costApplyId") Long costId); + + @Update("update vtb_verification_yard_center_item set del_flag = 1 where cost_apply_id = #{costApplyId}") + int vtb_verification_yard_center_item(@Param("costApplyId") Long costId); + + @Update("update vtb_verification_subject_center set del_flag = 1 where cost_apply_id = #{costApplyId}") + int vtb_verification_subject_center(@Param("costApplyId") Long costId); + + @Update("update vtb_verification_channel_point set del_flag = 1 where cost_apply_id = #{costApplyId}") + int vtb_verification_channel_point(@Param("costApplyId") Long costId); + + @Update("update vtb_verification_channel set del_flag = 1 where cost_apply_id = #{costApplyId}") + int vtb_verification_channel(@Param("costApplyId") Long costId); + + @Update("update tbs_cost_contract set del_flag = 1 where cost_apply_id = #{costApplyId}") + int tbs_cost_contract(@Param("costApplyId") Long costId); + + @Update("update tbs_cost_percent set del_flag = 1 where cost_apply_id = #{costApplyId}") + int tbs_cost_percent(@Param("costApplyId") Long costId); + + @Update("update tbs_cost_todo set del_flag = 1 where cost_apply_id = #{costApplyId}") + int tbs_cost_todo(@Param("costApplyId") Long costId); +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostApplySumAmountMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostApplySumAmountMapper.java new file mode 100644 index 0000000..b6b013a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostApplySumAmountMapper.java @@ -0,0 +1,31 @@ +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.excel.entity.DataCheckApplyDetailItem; +import com.qs.serve.modules.excel.entity.DataCheckApplyMainInfo; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.vo.TbsCostApplySumAmountVo; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.springframework.security.core.parameters.P; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 费用活动 Mapper + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsCostApplySumAmountMapper { + + @InterceptorIgnore(tenantLine = "1") + List selectDataCheckApplyDetailItem(@Param("supplierId")String supplierId, + @Param("costApplyIds")List costApplyIds); + + @InterceptorIgnore(tenantLine = "1") + DataCheckApplyMainInfo selectDataCheckApplyMainInfo(@Param("supplierId")String supplierId, + @Param("costApplyIds")List costApplyIds); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostBirLogMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostBirLogMapper.java new file mode 100644 index 0000000..345916b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostBirLogMapper.java @@ -0,0 +1,21 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsCostBirLog; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Set; + +/** + * Mapper + * @author YenHex + * @date 2024-03-27 + */ +public interface TbsCostBirLogMapper extends BaseMapper { + + @Select("SELECT cost_id FROM `tbs_cost_bir_log` where del_flag = 0 and cost_id is not null GROUP BY cost_id") + List listCostIds(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostChangeInfoMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostChangeInfoMapper.java new file mode 100644 index 0000000..2a3b357 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostChangeInfoMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsCostChangeInfo; + +/** + * 异动信息 Mapper + * @author YenHex + * @date 2023-12-18 + */ +public interface TbsCostChangeInfoMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostCheckStateMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostCheckStateMapper.java new file mode 100644 index 0000000..8ee879c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostCheckStateMapper.java @@ -0,0 +1,61 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +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 + * @since 2023/11/24 + * -- * 不参与业务流程,核销状态: + * -- * 有这四个状态: + * -- * 0-未核销:代表这案子里面的所有活动都还未开始核销; + * -- * 1-已通过:代表这个案子的所有活动都已经核销完成; + * -- * 2-核销中:代表这个案子的某些活动在核销中; + * -- * 3-被拒绝;代表这个案子里面的所有活动金额都被释放了 + * -- * 4-部分核销,部分已核销,还有未完成部分 + */ +public interface TbsCostCheckStateMapper { + + @InterceptorIgnore(tenantLine = "1") + @Update("update tbs_cost_apply set check_state = 0 where charge_state is null ") + int updateCheckState0(); + + @InterceptorIgnore(tenantLine = "1") + @Update("update tbs_cost_apply set check_state = 0 " + + "where id not in ( " + + " select vtb.cost_apply_id from vtb_verification vtb where vtb.del_flag = 0 AND vtb.verification_state in (0,1) and vtb.cost_apply_id is not null group by vtb.cost_apply_id " + + ") and del_flag = 0 and charge_state = 2") + int updateCheckState0ByVtb(); + + @InterceptorIgnore(tenantLine = "1") + @Update("update tbs_cost_apply set check_state = 1 where charge_state = 3 ") + int updateCheckState1(); + + @InterceptorIgnore(tenantLine = "1") + @Update("update tbs_cost_apply set check_state = 2 where id in ( " + + " SELECT cost_apply_id from vtb_verification where verification_state = 0 and del_flag = 0 " + + ")") + int updateCheckState2(); + + @InterceptorIgnore(tenantLine = "1") + @Select("select cost_apply_id " + + " from tbs_activity " + + " group by cost_apply_id " + + " HAVING count(total_amount) = sum(release_amount) ") + List selectCheckState3(); + + @Update("") + int updateCheckState3(@Param("costIds") List costIds); + + @Update("update tbs_cost_apply set check_state = 4 where charge_state = 2 and total_activity_used_amount > 0") + int updateCheckState4(); +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostContractMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostContractMapper.java new file mode 100644 index 0000000..d7249dd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostContractMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsCostContract; + +/** + * 费用合同 Mapper + * @author YenHex + * @date 2023-03-14 + */ +public interface TbsCostContractMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostPercentMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostPercentMapper.java new file mode 100644 index 0000000..732ca85 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostPercentMapper.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsCostPercent; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +/** + * 申请费率 Mapper + * @author YenHex + * @date 2023-07-02 + */ +public interface TbsCostPercentMapper extends BaseMapper { + + @Update("update tbs_cost_percent set del_flag = 1 where cost_apply_id = #{costId}") + void delByCostApplyId(@Param("costId")Long costApplyId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostTodoMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostTodoMapper.java new file mode 100644 index 0000000..f319db8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostTodoMapper.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsCostTodo; +import org.apache.ibatis.annotations.Param; +import java.util.List; + +/** + * 费用申请代办 Mapper + * @author YenHex + * @date 2023-02-17 + */ +public interface TbsCostTodoMapper extends BaseMapper { + + List selectTbsCostTodoList(@Param("param") TbsCostTodo query); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostUnItemMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostUnItemMapper.java new file mode 100644 index 0000000..e6f14fb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostUnItemMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsCostUnItem; + +/** + * 无预算的费用明细 Mapper + * @author YenHex + * @date 2023-02-02 + */ +public interface TbsCostUnItemMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostUnItemPolicyMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostUnItemPolicyMapper.java new file mode 100644 index 0000000..3c4ce84 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsCostUnItemPolicyMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsCostUnItemPolicy; + +/** + * 预算费用明细 Mapper + * @author YenHex + * @date 2023-02-24 + */ +public interface TbsCostUnItemPolicyMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsScheduleItemBudget2Mapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsScheduleItemBudget2Mapper.java new file mode 100644 index 0000000..8842995 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsScheduleItemBudget2Mapper.java @@ -0,0 +1,72 @@ +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.TbsScheduleItemBudget; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetLogPreAmount; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetLogWithAmount; +import com.qs.serve.modules.tbs.entity.dto.TbsScheduleItemBudgetAmount; +import com.qs.serve.modules.tbs.entity.dto.TbsScheduleItemBudgetIdDto; +import com.qs.serve.modules.tbs.entity.so.TbsScheduleItemSearch; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 预算考核期项 Mapper + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsScheduleItemBudget2Mapper extends BaseMapper { + + /** + * 查询TbsScheduleItemBudget.id + * @param query + * @return + */ + List listItemBudgetIds(@Param("query") TbsScheduleItemSearch query); + + + /** + * 统计Schedule金额 + * @param ids scheduleItemIds + * @param optNumbers 包含 + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List getSumAmtInList(@Param("selectIds") List ids,@Param("optNumbers")List optNumbers); + + + /** + * 统计Schedule金额 + * @param ids scheduleItemIds + * @param optNumbers 不包含 + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List getSumAmtNotInList(@Param("selectIds") List ids,@Param("optNumbers")List optNumbers); + + + + /** + * 统计审批中的政策,占用多少的预算 + * @param ids + * @param optNumbers + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List getPolicyCheckingList(@Param("selectIds") List ids,@Param("optNumbers")List optNumbers); + + /** + * 统计审批中的费用,占用多少的预算 + * @param ids + * @param optNumbers + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List getCostCheckingList(@Param("selectIds") List ids,@Param("optNumbers")List optNumbers); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsScheduleItemBudgetMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsScheduleItemBudgetMapper.java new file mode 100644 index 0000000..6ead8ca --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsScheduleItemBudgetMapper.java @@ -0,0 +1,257 @@ +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.TbsScheduleItemBudget; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetLogPreAmount; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetLogWithAmount; +import com.qs.serve.modules.tbs.entity.dto.TbsScheduleItemBudgetAmount; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import java.util.List; +import java.math.BigDecimal; + +/** + * 预算考核期项 Mapper + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsScheduleItemBudgetMapper extends BaseMapper { + + /** + * 统计费用申请时,记录占用的预算金额 + * @param scheduleItemBudgetId 预算考核期id + * @param applyId 费用申请id(防止驳回后提交重复扣除) + * @return + * 已废弃,使用totalApplyAmountList(...)替代 + */ + @Deprecated + @Select("SELECT sum(`tbs_budget_cost_item`.center_goods_amount) FROM `tbs_budget_cost_item` " + + " LEFT JOIN `tbs_cost_apply` " + + " ON `tbs_budget_cost_item`.cost_apply_id = `tbs_cost_apply`.id " + + " WHERE `tbs_cost_apply`.charge_state = 1 OR `tbs_cost_apply`.charge_state = 4 " + + " AND `tbs_budget_cost_item`.schedule_item_id = #{scheduleItemBudgetId} and `tbs_cost_apply`.id != #{applyId}") + BigDecimal totalApplyAmount(@Param("scheduleItemBudgetId") Long scheduleItemBudgetId,@Param("applyId") Long applyId); + + /** + * 统计费用申请时,记录占用的预算金额 + * 用于替代 totalApplyAmount() + * @param scheduleItemBudgetIds + * @param applyId + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List totalApplyAmountList(@Param("sibIdList")List scheduleItemBudgetIds, + @Param("applyId")Long applyId); + + /** + * 统计政策申请已占用的预算金额 + * @param scheduleItemBudgetId + * @param policyId + * @return + */ + @Deprecated + @Select(" SELECT sum(`tbs_budget_cost_item_policy`.policy_item_amount) FROM `tbs_budget_cost_item_policy` " + + " LEFT JOIN `tzc_policy`" + + " ON `tbs_budget_cost_item_policy`.policy_id = `tzc_policy`.id " + + " WHERE `tzc_policy`.policy_status = 1 OR `tzc_policy`.policy_status = 4 " + + " AND `tbs_budget_cost_item_policy`.schedule_item_id = #{scheduleItemBudgetId} and `tzc_policy`.id !=#{policyId};") + BigDecimal totalPolicyAmount(@Param("scheduleItemBudgetId") Long scheduleItemBudgetId,@Param("policyId") Long policyId); + + + /** + * 统计费用申请时,记录占用的预算金额 + * 用于替代 totalApplyAmount() + * @param scheduleItemBudgetIds + * @param policyId + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List totalPolicyAmountList(@Param("sibIdList")List scheduleItemBudgetIds, + @Param("policyId")Long policyId); + + /** + * 统计费用申请占用的预算金额 + * 状态:0=未发布;1=审批中;2=待执行;3=完成;4-被驳回 + * @param budgetId 预算id + * @param scheduleItemId 考核期id + * @param applyId 费用申请id(防止驳回后提交重复扣除) + * @return + * 用于listLogCostAmount(...)替代 totalApplyAmount() + */ + @Deprecated + @Select("SELECT " + + " sum( amount ) " + + "FROM " + + " `tbs_budget_log` " + + " LEFT JOIN " + + " `tbs_cost_apply` " + + " ON `tbs_budget_log` .cost_apply_id = tbs_cost_apply.id " + + " AND `tbs_budget_log`.rollback_flag = '0' " + + "WHERE " + + " `tbs_budget_log`.budget_id = #{budgetId} " + + " AND `tbs_budget_log`.schedule_item_id = #{scheduleItemId} " + + " AND `tbs_cost_apply`.id != #{applyId} " + + " AND `tbs_cost_apply`.charge_state in (1,2,3) " + + " AND opt_type IN (1,4,5,6)") + BigDecimal totalCostAmountByApplyId(@Param("budgetId") Long budgetId, + @Param("scheduleItemId") Long scheduleItemId, + @Param("applyId") Long applyId); + + /** + * 统计费用申请占用的预算金额 + * 状态:0=未发布;1=审批中;2=待执行;3=完成;4-被驳回 + * @param budgetIds 预算id + * @param scheduleItemIds 考核期id + * @param applyId 费用申请id(防止驳回后提交重复扣除) + * @return + * 用于替代 totalCostAmountByApplyId() + */ + @InterceptorIgnore(tenantLine = "true") + List listLogCostAmount(@Param("budgetIds") List budgetIds, + @Param("scheduleItemIds") List scheduleItemIds, + @Param("applyId") Long applyId); + + /** + * 统计费用申请占用的预算金额 + * 状态:0=未发布;1=审批中;2=待执行;3=完成;4-被驳回 + * @param budgetIds 预算id + * @param scheduleItemIds 考核期id + * @param policyId 费用申请id(防止驳回后提交重复扣除) + * @return + * 用于替代 totalCostAmountByApplyId() + */ + @InterceptorIgnore(tenantLine = "true") + List listLogCostAmountWithPolicy(@Param("budgetIds") List budgetIds, + @Param("scheduleItemIds") List scheduleItemIds, + @Param("policyId") Long policyId); + + /** + * 统计费用申请占用的预算金额 + * 通过状态(0-未提交;1-审核中;2-已通过待执行;3-拒绝;4-被驳回;5-结束) + * @param budgetId 预算id + * @param scheduleItemId 考核期id + * @param policyId 政策申请id(防止驳回后提交重复扣除) + * @return + */ + @InterceptorIgnore(tenantLine = "true") + @Select("SELECT sum( amount ) FROM `tbs_budget_log` " + + " LEFT JOIN `tzc_policy` " + + " ON `tbs_budget_log`.policy_id = tzc_policy.id " + + //" AND `tbs_budget_log`.rollback_flag = '0' " + + "WHERE `tbs_budget_log`.budget_id = #{budgetId} " + + " AND `tbs_budget_log`.schedule_item_id = #{scheduleItemId} " + + " AND `tzc_policy`.id != #{policyId} " + + " AND `opt_type` in (11,12,13,14,15) ") + BigDecimal totalCostAmountByPolicyId(@Param("budgetId") Long budgetId, + @Param("scheduleItemId") Long scheduleItemId, + @Param("policyId") Long policyId); + + + @InterceptorIgnore(tenantLine = "true") + Long findUnMatchScheduleItemBySourceBudgetIdAndTargetBudgetId(@Param("sourceId")Long sourceId, @Param("targetId")Long targetId); + + /** + * 统计Schedule金额 + * @param ids scheduleItemBudgetIds + * @param optNumbers 包含 + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List getSumAmtInList(@Param("selectIds") List ids,@Param("optNumbers")List optNumbers); + + + /** + * 统计Schedule金额 + * @param ids scheduleItemBudgetIds + * @param optNumbers 不包含 + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List getSumAmtNotInList(@Param("selectIds") List ids,@Param("optNumbers")List optNumbers); + + /** + * 统计审批中的费用,占用多少的预算 + * @param ids + * @param optNumbers + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List getCostCheckingList(@Param("selectIds") List ids,@Param("optNumbers")List optNumbers); + + /** + * 统计审批中的政策,占用多少的预算 + * @param ids + * @param optNumbers + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List getPolicyCheckingList(@Param("selectIds") List ids,@Param("optNumbers")List optNumbers); + + @InterceptorIgnore(tenantLine = "true") + @Select(" SELECT tsib.* FROM `tbs_schedule_item_budget` tsib " + + " LEFT JOIN tbs_budget ON tsib.budget_id = tbs_budget.id " + + " LEFT JOIN tbs_budget_log ON (tsib.budget_id = tbs_budget_log.budget_id " + + " and tsib.schedule_item_id = tbs_budget_log.schedule_item_id and tbs_budget_log.opt_type = 0) " + + " where tbs_budget.del_flag = 0 and tbs_budget.budget_state = 1 and tbs_budget_log.id is null and budget_amount > 0") + List listNotCreateLogBudget(); + + @InterceptorIgnore(tenantLine = "true") + @Select("SELECT tbs_budget.budget_code as budgetName, " + + "tbs_budget.budget_number as budgetCode, " + + "tbs_schedule_item_budget.* " + + "FROM `tbs_schedule_item_budget` " + + "LEFT JOIN tbs_budget ON tbs_schedule_item_budget.budget_id = tbs_budget.id " + + "WHERE tbs_budget.del_flag = 0 " + + "and tbs_schedule_item_budget.del_flag = 0 " + + "and tbs_budget.budget_state = 1 " + + "and (tbs_budget.subject_id = 0 or tbs_budget.subject_id = #{subjectId}) " + + "and tbs_budget.center_id = #{centerId} " + + "and tbs_budget.center_type = #{centerType} ") + List listBySubjectAndCenter(@Param("subjectId") String subjectId, + @Param("centerType") String centerType, + @Param("centerId") String centerId); + + @InterceptorIgnore(tenantLine = "true") + @Select("SELECT " + + " tbs_budget.budget_code as budgetName, " + + " tbs_budget.budget_number as budgetCode, " + + " tbs_schedule_item_budget.* " + + "FROM " + + "tbs_schedule_item_budget " + + "left join tbs_budget_log " + + "on tbs_schedule_item_budget.id = tbs_budget_log.schedule_item_budget_id " + + "LEFT JOIN tbs_budget ON tbs_schedule_item_budget.budget_id = tbs_budget.id " + + "where " + + "tbs_budget_log.del_flag = 0 " + + "and tbs_budget.del_flag = 0 " + + "and tbs_schedule_item_budget.del_flag = 0 " + + "and tbs_budget_log.center_id = #{centerId} " + + "and tbs_budget_log.center_type = #{centerType} " + + "and tbs_budget_log.subject_id = #{subjectId} " + + "and tbs_budget_log.activity_id = #{activityId}") + List listByActivityAndSubjectAndCenter(@Param("activityId") String activityId, + @Param("subjectId") String subjectId, + @Param("centerType") String centerType, + @Param("centerId") String centerId); + + @InterceptorIgnore(tenantLine = "true") + @Select("SELECT " + + " tbs_budget.budget_code as budgetName, " + + " tbs_budget.budget_number as budgetCode, " + + " tbs_schedule_item_budget.* " + + "FROM " + + "tbs_schedule_item_budget " + + "left join tbs_budget_log " + + "on tbs_schedule_item_budget.id = tbs_budget_log.schedule_item_budget_id " + + "LEFT JOIN tbs_budget ON tbs_schedule_item_budget.budget_id = tbs_budget.id " + + "where " + + "tbs_budget_log.del_flag = 0 " + + "and tbs_budget.del_flag = 0 " + + "and tbs_schedule_item_budget.del_flag = 0 " + + "and tbs_budget.budget_state = 1 " + + "and tbs_budget_log.policy_item_id = #{policyItemId} ") + List listByPolicyItemId(@Param("policyItemId") String policyItemId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsScheduleItemMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsScheduleItemMapper.java new file mode 100644 index 0000000..2fc27a0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsScheduleItemMapper.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsScheduleItem; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 考核时间项 Mapper + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsScheduleItemMapper extends BaseMapper { + + @Select("SELECT item_name FROM tbs_schedule_item WHERE year(start_date)=#{year} ORDER BY item_name") + List getItemNames(String year); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsScheduleMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsScheduleMapper.java new file mode 100644 index 0000000..470ea63 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/mapper/TbsScheduleMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.TbsSchedule; + +/** + * 考核期 Mapper + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsScheduleMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityApplicationService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityApplicationService.java new file mode 100644 index 0000000..210d8b0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityApplicationService.java @@ -0,0 +1,280 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.consts.SysConfigKey; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.modules.bms.entity.BmsSubject; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.data.entity.DataAffairCommit; +import com.qs.serve.modules.data.service.DataAffairCommitService; +import com.qs.serve.modules.goods.entity.dto.TbsCenterDto; +import com.qs.serve.modules.sys.service.SysConfigService; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.common.util.TbsBudgetCostUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.bo.TbsActivityBo; +import com.qs.serve.modules.tbs.entity.bo.TbsActivitySubjectBo; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCostResult; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetMatchVo; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetTableVo; +import com.qs.serve.modules.tbs.mapper.TbsActivityGoodsMapper; +import com.qs.serve.modules.tbs.mapper.TbsActivityMapper; +import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; +import com.qs.serve.modules.tbs.service.impl.TbsActivityServiceImpl; +import com.qs.serve.modules.vtb.entity.VtbFundFlow; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.checkerframework.checker.units.qual.A; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 预算应用层服务 + * @author YenHex + * @since 2022/12/6 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsActivityApplicationService { + + private TbsScheduleItemBudgetService tbsScheduleItemBudgetService; + private TbsBudgetMapper tbsBudgetMapper; + private TbsBudgetConditionService tbsBudgetConditionService; + private TbsBudgetCostItemService tbsBudgetCostItemService; + private SysConfigService configService; + private TbsActivityServiceImpl activityService; + private TbsActivityMapper activityMapper; + private final BmsSupplierService supplierService; + private final VtbVerificationService verificationService; + private DataAffairCommitService dataAffairCommitService; + + /** + * 对比预算 + * @param throwEx + * @param activityBo + * @return + */ + public TbsBudgetMatchVo matchBudgetCostResult(Boolean throwEx, TbsActivityBo activityBo){ + //允许超出预算标识 + boolean overspend = configService.getByKey(SysConfigKey.TbsBudgetOverspend).getConfigValue().equals("1"); + //考核期有关的预算id,判断逻辑为活动需要允许在 + List budgetIds = new ArrayList<>(); + //所有满足条件的考核期,用于加载历史核销费用 + List scheduleItemList = this.loadScheduleBudgetAndSetting(activityBo, budgetIds); + if(budgetIds.size()<1&&throwEx){ + Assert.throwEx("无匹配的预算"); + } + //加载预算占用历史 + List scheduleItemBudgetIds = scheduleItemList.stream().map(TbsScheduleItemBudget::getId).collect(Collectors.toList()); + List hisBudgetCostItemList = tbsBudgetCostItemService.listByScheduleItemBudgetIds(scheduleItemBudgetIds,null); + Map> hisCostGroupByItemBudget = hisBudgetCostItemList.stream() + .collect(Collectors.groupingBy(TbsBudgetCostItem::getScheduleItemBudgetId)); + List activityGoodsList = activityService.buildActGoodsList(activityBo,null,null); + //补充添加科目拦截 + List subjectIds = activityBo.getActivitySubjectList().stream().map(TbsActivitySubjectBo::getSubjectId).collect(Collectors.toList()); + // 加载所有条件 + List budgetList = new ArrayList<>(); + if(budgetIds.size()>0){ + LambdaQueryWrapper budgetLqw = new LambdaQueryWrapper<>(); + budgetLqw.in(TbsBudget::getId,budgetIds); + budgetLqw.eq(TbsBudget::getBudgetState,1); + budgetLqw.in(TbsBudget::getSubjectId,subjectIds); + budgetList = tbsBudgetMapper.selectList(budgetLqw); + } + List noConditionBudgetList = new ArrayList<>(); + boolean budgetNoCondition = this.loadConditionByBudgetsAndMatch(budgetList, noConditionBudgetList); + //预算条件需包含活动条件, Map结构:活动id->满足的预算id列表 + List activityAllowBudgetIds = this.buildActivityBudgetMap(activityGoodsList, budgetList, noConditionBudgetList); + //活动拦截 + this.handleNoBudgetActivity(throwEx, overspend, budgetNoCondition,activityAllowBudgetIds); + Map> scheduleItemBudgetMap = scheduleItemList.stream() + .collect(Collectors.groupingBy(TbsScheduleItemBudget::getBudgetId)); + TbsBudgetMatchVo budgetMatchVo = new TbsBudgetMatchVo(); + BigDecimal totalAllAmount = BigDecimal.ZERO; + BigDecimal totalAllHisAmount = BigDecimal.ZERO; + if(CollectionUtil.isNotEmpty(activityAllowBudgetIds)){ + activityAllowBudgetIds = activityAllowBudgetIds.stream().distinct().collect(Collectors.toList()); + List matchVos = new ArrayList<>(); + for (Long allowBudgetId : activityAllowBudgetIds) { + TbsBudget budget = null; + for (TbsBudget budget2 : budgetList) { + if(allowBudgetId.equals(budget2.getId())){ + budget = budget2; + } + break; + } + if(budget!=null){ + BigDecimal totalBudgetAmount = BigDecimal.ZERO; + BigDecimal totalBudgetHisAmount = BigDecimal.ZERO; + List itemBudgets = scheduleItemBudgetMap.get(budget.getId()); + List itemBudgetVoList = new ArrayList<>(); + for (TbsScheduleItemBudget itemBudget : itemBudgets) { + List hisCostItems = hisCostGroupByItemBudget.get(itemBudget.getId()); + BigDecimal totalItemBudgetHis = TbsBudgetCostUtil.totalHisCost(hisCostItems); + totalBudgetHisAmount = totalBudgetHisAmount.add(totalBudgetHisAmount); + totalBudgetAmount = totalBudgetAmount.add(itemBudget.getBudgetAmount()); + + TbsBudgetMatchVo.ItemBudgetVo itemBudgetVo = CopierUtil.copy(itemBudget,new TbsBudgetMatchVo.ItemBudgetVo()); + itemBudgetVo.setHisAmount(totalItemBudgetHis); + itemBudgetVoList.add(itemBudgetVo); + } + TbsBudgetMatchVo.BudgetVo matchVo = CopierUtil.copy(budget,new TbsBudgetMatchVo.BudgetVo()); + matchVo.setTotalAmount(totalBudgetAmount); + matchVo.setTotalHisAmount(totalBudgetHisAmount); + matchVo.setItemBudgetVoList(itemBudgetVoList); + matchVos.add(matchVo); + totalAllAmount = totalAllAmount.add(totalBudgetAmount); + totalAllHisAmount = totalBudgetHisAmount.add(totalBudgetHisAmount); + } + } + //统计当前活动金额 + BigDecimal totalCurrent = BigDecimal.ZERO; + for (TbsActivitySubjectBo subjectBo : activityBo.getActivitySubjectList()) { + totalCurrent = totalCurrent.add(subjectBo.getAmount()); + } + budgetMatchVo.setCurrentAmount(totalCurrent); + budgetMatchVo.setBudgetVoList(matchVos); + budgetMatchVo.setUsedAmount(totalAllHisAmount); + budgetMatchVo.setTotalAmount(totalAllAmount); + } + return budgetMatchVo; + } + + /** + * 预算条件需包含活动条件, Map结构:活动id->满足的预算id列表 + * @param activityGoodsList + * @param budgetList + * @param noConditionBudgetList + * @return + */ + private List buildActivityBudgetMap(List activityGoodsList, + List budgetList, + List noConditionBudgetList) { + List budgetIdsOfActivity = new ArrayList<>(); + if(CollectionUtil.isEmpty(noConditionBudgetList)){ + budgetIdsOfActivity.addAll(noConditionBudgetList.stream().map(TbsBudget::getId).collect(Collectors.toList())); + } + for (TbsBudget budget : budgetList) { + if(budget.getConditionFlag().equals(1)){ + List budgetConditionList = budget.getBudgetConditionList(); + boolean hasNoMatch = false; + for (TbsActivityGoods activityGoods : activityGoodsList) { + boolean matchGoods = false; + for (TbsBudgetCondition budgetCondition : budgetConditionList) { + if(activityGoods.getTargetLevelPathIds().contains(budgetCondition.getTargetLevelPathIds())){ + matchGoods = true; + break; + } + } + if(!matchGoods){ + hasNoMatch = true; + break; + } + } + if(!hasNoMatch){ + budgetIdsOfActivity.add(budget.getId()); + } + }else { + budgetIdsOfActivity.add(budget.getId()); + } + } + return budgetIdsOfActivity; + } + + /** + * 1.加载所有的条件 + * 2.匹配初无条件预算 + * 3.预算条件关联到预算对象中 + * @param budgetList + * @param noConditionBudgetList + * @return 含有无条件预算标识 + */ + private boolean loadConditionByBudgetsAndMatch( List budgetList, List noConditionBudgetList) { + boolean budgetNoCondition = false; + for (TbsBudget budget : budgetList) { + if(budget.getConditionFlag().equals(1)){ + List budgetConditionListByBudgetId = tbsBudgetConditionService.getByBudgetId(budget.getId()); + budget.setBudgetConditionList(budgetConditionListByBudgetId); + }else { + budgetNoCondition = true; + noConditionBudgetList.add(budget); + } + } + return budgetNoCondition; + } + + /** + * 拦截没有预算的活动 + * @param throwEx 抛出异常 + * @param overspend 超支 + * @param budgetNoCondition 标识,没有条件的预算 + */ + private void handleNoBudgetActivity(Boolean throwEx, boolean overspend, + boolean budgetNoCondition, + List activityAllowBudgetIds) { + if(!overspend && !budgetNoCondition && throwEx ){ + Assert.throwEx("活动无可用预算"); + } + if(throwEx){ + if(activityAllowBudgetIds.size()<1){ + Assert.throwEx("活动无可用预算"); + } + } + } + + /** + * 1.通过活动加载所有满足条件的考核期(用于加载历史核销费用), + * 2.设置匹配的考核期列表到活动中 + * @param budgetIds + */ + public List loadScheduleBudgetAndSetting(TbsActivityBo activityBo, + List budgetIds) { + Set budgetIdsSet = new HashSet<>(); + List budgetItemList = tbsScheduleItemBudgetService + .betweenDateList(activityBo.getPreStartDate(),activityBo.getPreEndDate()); + if(CollectionUtil.isNotEmpty(budgetItemList)){ + for (TbsScheduleItemBudget item : budgetItemList) { + budgetIdsSet.add(item.getBudgetId()); + } + } + budgetIds.addAll(budgetIdsSet); + return budgetItemList; + } + + /** + * 补偿不执行释放的活动 + */ + public void compenstateRelease(){ + List activityList = activityMapper.selectUnRelease(); + for (TbsActivity activity : activityList) { + Long[] ids = new Long[]{1676500L}; + if(Arrays.stream(ids).anyMatch(a->a.equals(activity.getId()))){ + continue; + } + List affairCommitList = dataAffairCommitService.list(new LambdaQueryWrapper() + .eq(DataAffairCommit::getTargetCode,"CheckCost") + .eq(DataAffairCommit::getTargetId,activity.getVerificationId()) + ); + // 判断特殊情况 + // 1.是否有继续核销,有新则发送短信通知 + // 2.判断是否已核销没更新字段 + for (DataAffairCommit affairCommit : affairCommitList) { + if(affairCommit.getReleaseFlag().equals(1)){ + verificationService.release(activity.getId(),affairCommit.getUserCode(),false); + break; + } + } + } + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityCenterGoodsService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityCenterGoodsService.java new file mode 100644 index 0000000..460cc63 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityCenterGoodsService.java @@ -0,0 +1,33 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods; +import com.qs.serve.modules.tbs.entity.TbsActivitySubject; +import com.qs.serve.modules.tbs.entity.dto.TbsActNotMatchAmtCenterGoods; + +import java.util.List; +import java.util.Map; + +/** + * 活动成本中心配比项 服务接口 + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsActivityCenterGoodsService extends IService { + + + List listByActivityId(Long activityId); + + List listByCostApplyId(Long costApplyId); + + Map> listByActivityMap(List activityIds); + + /** + * 加载center_goods与activity不匹配的 + * @param costIds + * @return + */ + List listNotMatchAmtCenterGoods(List costIds); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityCenterService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityCenterService.java new file mode 100644 index 0000000..0ba3c64 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityCenterService.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsActivityCenter; + +import java.util.List; +import java.util.Map; + +/** + * 活动成本中心项 服务接口 + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsActivityCenterService extends IService { + + + List listByActivity(Long activityId); + + List listByActivity(Long activityId,Long subjectId); + + Map> listByActivityMap(List activityIds); + + List listByCostApplyId(Long costApplyId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityChannelPointService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityChannelPointService.java new file mode 100644 index 0000000..f856597 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityChannelPointService.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsActivityChannelPoint; +import java.util.List; + +/** + * 活动网点项 服务接口 + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsActivityChannelPointService extends IService { + + List listByActivityId(Long activityId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityChannelService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityChannelService.java new file mode 100644 index 0000000..facc55f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityChannelService.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsActivityChannel; +import java.util.List; + +/** + * 活动渠道项 服务接口 + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsActivityChannelService extends IService { + + List listByActivityId(Long activityId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityDebugApplicationService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityDebugApplicationService.java new file mode 100644 index 0000000..b6960e8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityDebugApplicationService.java @@ -0,0 +1,496 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bir.consts.BirActivityCenterGoodsUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.mapper.*; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import com.qs.serve.modules.vtb.mapper.VtbVerificationSubjectMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2024/5/25 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsActivityDebugApplicationService { + + private TbsActivityMapper activityMapper; + private TbsActivitySubjectService activitySubjectService; + private TbsActivitySubjectMapper activitySubjectMapper; + private TbsActivityCenterService activityCenterService; + private TbsActivityCenterGoodsService activityCenterGoodsService; + private TbsBudgetLogService budgetLogService; + private VtbVerificationMapper verificationMapper; + private TbsCostApplyMapper tbsCostApplyMapper; + + public String reset(Long activityId){ + + BigDecimal n100 = new BigDecimal("100"); + + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("activity_id",activityId); + + TbsActivity activity = activityMapper.selectById(activityId); + + //TbsCostApply costApply = tbsCostApplyMapper.selectById(activity.getCostApplyId()); +// if(costApply.getPolicyItemId()!=null){ +// log.warn("随货折让不支持该方法"); +// return "随货折让不支持该方法"; +// } +// //过滤 CA SHX YX06 PortalOfCostApplication.createCostProcess() +// if(StringUtils.hasText(costApply.getBillNumber())||StringUtils.hasText(costApply.getDisCode())){ +// log.warn("方法仅支持普通订单"); +// return "方法仅支持普通订单"; +// } + + BirActivityCenterGoodsUtil.buildBir(activity.getCostApplyId()); + BigDecimal checkeAmt = activity.getUsedAmount(); + if(activity.getReleaseFlag().equals(1)){ + checkeAmt = checkeAmt.add(activity.getReleaseAmount()); + } + if(checkeAmt.compareTo(activity.getTotalAmount())>0){ + 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/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityGoodsService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityGoodsService.java new file mode 100644 index 0000000..4e063c3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityGoodsService.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsActivityGoods; +import java.util.List; +/** + * 活动商品项 服务接口 + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsActivityGoodsService extends IService { + + List listByCostApplyId(Long id); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityPayConditionService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityPayConditionService.java new file mode 100644 index 0000000..d08e52d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityPayConditionService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsActivityPayCondition; + +/** + * 活动支付条件 服务接口 + * @author YenHex + * @date 2023-05-10 + */ +public interface TbsActivityPayConditionService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityService.java new file mode 100644 index 0000000..2e265be --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityService.java @@ -0,0 +1,48 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.bo.TbsActivityBo; + +import java.time.LocalDate; +import java.util.List; + +/** + * 费用活动 服务接口 + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsActivityService extends IService { + + /** + * 申请活动加载列表 + * @param id + * @return + */ + List listByCostApplyId(Long id); + + /** + * 修改 + * @param activityBo + */ + void modify(TbsActivityBo activityBo); + + /** + * 修复精确度 + * @param updateBudgetLog 新建活动为false,修复数据时为true + */ + void checkCenterGoods(boolean updateBudgetLog); + + /** + * 将重新打开的,过期修复回为未重新打开 + */ + void initReopenState(); + + /** + * 更新费用申请的活动的冻结状态 + * @param costApplyIds + */ + void flushBandingState(List costApplyIds); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivitySlottingFeeService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivitySlottingFeeService.java new file mode 100644 index 0000000..7216ef3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivitySlottingFeeService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsActivitySlottingFee; + +/** + * 活动进场费 服务接口 + * @author YenHex + * @date 2023-06-26 + */ +public interface TbsActivitySlottingFeeService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivitySubjectService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivitySubjectService.java new file mode 100644 index 0000000..7a66573 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivitySubjectService.java @@ -0,0 +1,35 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsActivityCenter; +import com.qs.serve.modules.tbs.entity.TbsActivitySubject; + +import java.util.List; +import java.util.Map; + +/** + * 活动科目项 服务接口 + * @author YenHex + * @date 2022-11-09 + */ +public interface TbsActivitySubjectService extends IService { + + /** + * 通过活动id获取列表 + * @param activityId + * @return + */ + List listByActivityId(Long activityId); + + + Map> listByActivityMap(List activityIds); + + /** + * 通过活动申请获取列表 + * @param costApplyId + * @return + */ + List listByCostApplyId(Long costApplyId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivitySubjectYarnService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivitySubjectYarnService.java new file mode 100644 index 0000000..d5a3a89 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivitySubjectYarnService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsActivitySubjectYarn; + +/** + * 活动科目审批线 服务接口 + * @author YenHex + * @date 2023-08-03 + */ +public interface TbsActivitySubjectYarnService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityTemplateLogService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityTemplateLogService.java new file mode 100644 index 0000000..d5f6adc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityTemplateLogService.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplate; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplateLog; + +/** + * 活动模板 服务接口 + * @author YenHex + * @date 2023-01-05 + */ +public interface TbsActivityTemplateLogService extends IService { + + /** + * 模板转换成模板日志对象 + * @param template + * @param optState + * @return + */ + TbsActivityTemplateLog toLog(TbsActivityTemplate template,Integer optState); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityTemplateRegionService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityTemplateRegionService.java new file mode 100644 index 0000000..1d9e906 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityTemplateRegionService.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplateRegion; + +import java.util.List; + +/** + * 活动模板区域 服务接口 + * @author YenHex + * @date 2022-11-29 + */ +public interface TbsActivityTemplateRegionService extends IService { + + List getTemplateIds(String supplierId,List ignoreTemplateIds); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityTemplateService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityTemplateService.java new file mode 100644 index 0000000..a73ec47 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsActivityTemplateService.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplate; +import com.qs.serve.modules.tbs.entity.bo.TbsActivityTemplateBo; + +/** + * 活动模板 服务接口 + * @author YenHex + * @date 2022-11-29 + */ +public interface TbsActivityTemplateService extends IService { + + TbsActivityTemplate modify(TbsActivityTemplateBo templateBo); + + void updateState(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetApplicationService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetApplicationService.java new file mode 100644 index 0000000..a92b673 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetApplicationService.java @@ -0,0 +1,896 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.consts.SysConfigKey; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.sys.service.SysConfigService; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.common.dto.CostSortWrapper; +import com.qs.serve.modules.tbs.common.util.CostSortWrapperUtil; +import com.qs.serve.modules.tbs.common.util.TbsBudgetCostUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCostResult; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetLogPreAmount; +import com.qs.serve.modules.tbs.entity.dto.TbsScheduleItemBudgetAmount; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetTableVo; +import com.qs.serve.modules.tbs.mapper.TbsActivityGoodsMapper; +import com.qs.serve.modules.tbs.mapper.TbsActivityMapper; +import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; +import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudgetMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.Duration; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 预算应用层服务 + * @author YenHex + * @since 2022/12/6 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsBudgetApplicationService { + + private TbsActivityCenterService tbsActivityCenterService; + private TbsActivityCenterGoodsService tbsActivityCenterGoodsService; + private TbsActivitySubjectService tbsActivitySubjectService; + private TbsScheduleItemBudgetService tbsScheduleItemBudgetService; + private TbsBudgetMapper tbsBudgetMapper; + private TbsBudgetConditionService tbsBudgetConditionService; + private TbsBudgetCostItemService tbsBudgetCostItemService; + private SysConfigService configService; + private TbsActivityMapper activityMapper; + private TbsActivityGoodsMapper activityGoodsMapper; + private TbsScheduleItemBudgetMapper tbsScheduleItemBudgetMapper; + + public TbsBudgetTableVo buildResultTable(Long costApplyId){ + //加载活动 + LambdaQueryWrapper activityLqw = new LambdaQueryWrapper<>(); + activityLqw.eq(TbsActivity::getCostApplyId,costApplyId); + List activityList = activityMapper.selectList(activityLqw); + + //费用占用 + LambdaQueryWrapper costItemLqw = new LambdaQueryWrapper<>(); + costItemLqw.eq(TbsBudgetCostItem::getCostApplyId,costApplyId); + List budgetCostItems = tbsBudgetCostItemService.list(costItemLqw); + + //预算 + List budgetIds = budgetCostItems.stream().map(TbsBudgetCostItem::getBudgetId) + .distinct().collect(Collectors.toList()); + List budgetList; + if(CollectionUtil.isNotEmpty(budgetIds)){ + budgetList = tbsBudgetMapper.selectBatchIds(budgetIds); + }else { + budgetList = new ArrayList<>(); + } + TbsBudgetTableVo tableVo = new TbsBudgetTableVo(); + List topTheadHeaders = new ArrayList<>(); + Map> tmpMap = budgetCostItems.stream().collect(Collectors.groupingBy(TbsBudgetCostItem::getScheduleItemBudgetId)); + for (Long scheduleItemBudgetId : tmpMap.keySet()) { + if(scheduleItemBudgetId.equals(0L)){continue;} + TbsBudgetCostItem budgetCostItem = tmpMap.get(scheduleItemBudgetId).get(0); + String budgetCode = null; + for (TbsBudget budget : budgetList) { + if(budget.getId().equals(budgetCostItem.getBudgetId())){ + budgetCode = budget.getBudgetCode(); + break; + } + } + TbsBudgetTableVo.TopTheadHeader theadHeader = new TbsBudgetTableVo.TopTheadHeader(); + theadHeader.setId(scheduleItemBudgetId+""); + theadHeader.setLabel(budgetCode+"("+budgetCostItem.getScheduleItemName()+")"); + //设置为提交时的金额数据 + theadHeader.setBudgetAmount(budgetCostItem.getScheduleItemAmount() + .subtract(budgetCostItem.getScheduleItemAmountUsed())); + theadHeader.setTotalAmount(budgetCostItem.getScheduleItemAmount()); + BigDecimal applyAmount = budgetCostItem.getScheduleItemAmountApply()==null?BigDecimal.ZERO:budgetCostItem.getScheduleItemAmountApply(); + theadHeader.setCostApplyAmount(applyAmount); + theadHeader.setCostAppliedAmount(budgetCostItem.getScheduleItemAmountUsed().subtract(applyAmount)); + topTheadHeaders.add(theadHeader); + } + //自定义超额预算 + TbsBudgetTableVo.TopTheadHeader overTopHeader = new TbsBudgetTableVo.TopTheadHeader(); + overTopHeader.setId("0"); + overTopHeader.setLabel("其它预算"); + overTopHeader.setBudgetAmount(BigDecimal.ZERO); + topTheadHeaders.add(overTopHeader); + + List leftTheadHeaders = new ArrayList<>(); + for (TbsBudgetCostItem centerGoods : budgetCostItems) { + TbsActivity activity = null; + for (TbsActivity obj : activityList) { + if(obj.getId().equals(centerGoods.getActivityId())){ + activity = obj; + break; + } + } + String actCode = activity==null?centerGoods.getActivityId().toString():activity.getActivityCode(); + TbsBudgetTableVo.LeftTheadHeader theadHeader = new TbsBudgetTableVo.LeftTheadHeader(); + theadHeader.setActivityCode(actCode); + theadHeader.setId(centerGoods.getCenterGoodItemId()+""); + theadHeader.setSubjectId(centerGoods.getSubjectId()); + theadHeader.setSubjectName(centerGoods.getSubjectName()); + theadHeader.setCenterId(centerGoods.getCenterId()); + theadHeader.setCenterName(centerGoods.getCenterName()); + theadHeader.setTargetType(centerGoods.getTargetType()); + theadHeader.setTargetId(centerGoods.getTargetId()); + if(centerGoods.getTargetType().equals(TbsGoodsType.sku.name())){ + centerGoods.initSpuSkuName(); + theadHeader.setLabel(centerGoods.getSpuName()+"("+centerGoods.getSkuName()+")"); + }else { + theadHeader.setLabel(centerGoods.getTargetName()); + } + theadHeader.setLabelCombo(actCode+"-" + +theadHeader.getSubjectName()+"-" + +theadHeader.getCenterName()+"-" + +theadHeader.getLabel()); + leftTheadHeaders.add(theadHeader); + } + List tableValueList = new ArrayList<>(); + for (TbsBudgetCostItem costItem : budgetCostItems) { + TbsBudgetTableVo.TableValue tableValue = new TbsBudgetTableVo.TableValue(); + tableValue.setTopId(costItem.getScheduleItemBudgetId()+""); + tableValue.setLeftId(costItem.getCenterGoodItemId()+""); + tableValue.setValue(costItem.getCenterGoodsAmount()); + tableValueList.add(tableValue); + } + tableVo.setTableValueList(tableValueList); + tableVo.setTopTheadHeaderList(topTheadHeaders); + tableVo.setLeftTheadHeaderList(leftTheadHeaders); + return tableVo; + } + + /** + * 创建费用占用结果 + * @param costApplyId 用于加载历史预算时,排除当前费用占比 + * @param throwEx 是否需要抛出异常 + * @param buildTableFlag 创建表VO + */ + public TbsBudgetCostResult buildBudgetCostResult(Long costApplyId,Boolean throwEx,Boolean buildTableFlag){ + //允许超出预算标识 + boolean overspend = configService.getByKey(SysConfigKey.TbsBudgetOverspend).getConfigValue().equals("1"); + //加载活动 + LambdaQueryWrapper activityLqw = new LambdaQueryWrapper<>(); + activityLqw.eq(TbsActivity::getCostApplyId,costApplyId); + List activityList = activityMapper.selectList(activityLqw); + List activitySubjects = tbsActivitySubjectService.listByCostApplyId(costApplyId); + if(activityList.size()<1){ + Assert.throwEx("当前费用未设置活动"); + } + //补充添加 科目与成本中心拦截 + List centerGoodsList = tbsActivityCenterGoodsService.listByCostApplyId(costApplyId); + List activityCenterList = tbsActivityCenterService.listByCostApplyId(costApplyId); + return this.buildBudgetCostResult(costApplyId,activityList,activitySubjects,centerGoodsList,activityCenterList,overspend,throwEx,buildTableFlag); + } + + /** + * 创建费用占用结果 + * @param costApplyId 用于加载历史预算时,排除当前费用占比 + * @param activityList 活动列表 + * @param activitySubjects 判断预算时,科目拦截 + * @param centerGoodsList 活动成本中心组商品 + * @param activityCenterList 判断预算时,成本中心拦截 + * @param overspend 是否支持超出预算 + * @param throwEx 是否需要抛出异常 + * @param buildTableFlag 创建表VO + * @return + */ + public TbsBudgetCostResult buildBudgetCostResult(Long costApplyId, + List activityList, + List activitySubjects, + List centerGoodsList, + List activityCenterList, + Boolean overspend, + Boolean throwEx, + Boolean buildTableFlag){ + //指定的预算 + String pointBudgetIdString = ServletUtils.getHeader("pointBudgetId"); + Long pointBudgetId = null; + if(StringUtils.hasText(pointBudgetIdString)){ + pointBudgetId = Long.parseLong(pointBudgetIdString); + } + + CostSortWrapper costSortWrapper = new CostSortWrapper(); + //考核期有关的预算id,判断逻辑为活动需要允许在 + List budgetIds = new ArrayList<>(); + //没有预算的活动 + List noBudgetActivityIds = new ArrayList<>(); + //所有满足条件的考核期,用于加载历史核销费用 + List scheduleItemList = this.loadScheduleBudgetAndSetting(activityList, budgetIds, noBudgetActivityIds,costSortWrapper); + this.checkPointBudgetId(pointBudgetId, budgetIds,"未满足预算考核期"); + List centerIds = activityCenterList.stream().map(TbsActivityCenter::getCenterId).collect(Collectors.toList()); + List subjectIds = activitySubjects.stream().map(TbsActivitySubject::getSubjectId).collect(Collectors.toList()); + //通过模板限制,选中指定的预算 + List limitBudgetIds = new ArrayList<>(); + for (TbsActivity activity : activityList) { + if(StringUtils.hasText(activity.getTemplateBudgetIds())){ + List budgetIdsList = Arrays.stream(activity.getTemplateBudgetIds().split(",")).map(Long::parseLong) + .collect(Collectors.toList()); + limitBudgetIds.addAll(budgetIdsList); + } + } + // budgetIds交集 + if(limitBudgetIds.size()>0){ + budgetIds = (List) CollectionUtils.intersection(budgetIds, limitBudgetIds); + } + this.checkPointBudgetId(pointBudgetId, budgetIds,"模板限制,选中指定的预算不符合"); + if(pointBudgetId!=null){ + budgetIds = Arrays.asList(pointBudgetId); + } + // 加载所有条件 + List budgetList; + if(budgetIds.size()>0){ + LambdaQueryWrapper budgetLqw = new LambdaQueryWrapper<>(); + budgetLqw.in(TbsBudget::getId,budgetIds); + budgetLqw.and(qw->qw.eq(TbsBudget::getSubjectId,0).or(qw2->qw2.in(TbsBudget::getSubjectId,subjectIds))); + //排除随货编码 + //budgetLqw.ne(TbsBudget::getSubjectCode,"FYMC05"); + budgetLqw.in(TbsBudget::getCenterId,centerIds); + budgetLqw.eq(TbsBudget::getBudgetState,1); + //科目限制>品类之间>时间区间 + budgetLqw.orderByDesc(TbsBudget::getSubjectId); + budgetList = tbsBudgetMapper.selectList(budgetLqw); + if(throwEx&&budgetList.size()<1){ + Assert.throwEx("无可用相关的成本中心或科目的预算"); + } + }else { + if(throwEx){ + Assert.throwEx("因预算考核期未命预算"); + } + budgetList = new ArrayList<>(); + } + costSortWrapper.initializeBudget(budgetList); + //预算移除多余的项 + List scheduleItemListTmp = new ArrayList<>(); + for (TbsScheduleItemBudget scheduleItemBudget : scheduleItemList) { + for (TbsBudget budget : budgetList) { + if(scheduleItemBudget.getBudgetId().equals(budget.getId())){ + scheduleItemListTmp.add(scheduleItemBudget); + break; + } + } + } + scheduleItemList = scheduleItemListTmp; + //加载预算条件和关联预算匹配,返回是否由无条件预算 + List noConditionBudgetList = new ArrayList<>(); + boolean budgetNoCondition = this.loadConditionByBudgetsAndMatch(budgetList, noConditionBudgetList); + //预算条件需包含活动条件, Map结构:活动id->满足的预算id列表 + //非严谨过滤,后续调用 this.filterMatchGoodsCondition(...) 过滤 + Map> activityAllowBudgetIdMap = this.buildActivityBudgetMap(activityList, budgetList, noConditionBudgetList); + costSortWrapper.setActivityAllowBudgetId(activityAllowBudgetIdMap); + //活动拦截 + if(!budgetNoCondition){ + this.handleNoBudgetActivity(throwEx, overspend, activityList, noBudgetActivityIds,activityAllowBudgetIdMap); + } + + //统计费用申请占用金额(记录录入时,考核期申请占用金额) + Map budgetItemApplyAmountMap = new HashMap<>(scheduleItemList.size()); + List scheduleItemIds = scheduleItemList.stream().map(TbsScheduleItemBudget::getScheduleItemId).collect(Collectors.toList()); + if(scheduleItemIds.size()>0){ + List scheduleItemBudgetAmounts = tbsScheduleItemBudgetMapper.totalApplyAmountList(scheduleItemIds,costApplyId); + for (TbsScheduleItemBudgetAmount budgetAmount : scheduleItemBudgetAmounts) { + Long scheduleItemBudgetId = null; + for (TbsScheduleItemBudget itemBudget : scheduleItemList) { + if(itemBudget.getScheduleItemId().equals(budgetAmount.getScheduleItemId())){ + scheduleItemBudgetId = itemBudget.getId(); + break; + } + } + if (budgetAmount.getTotalAmount()==null){ + budgetItemApplyAmountMap.put(scheduleItemBudgetId,BigDecimal.ZERO); + continue; + } + budgetItemApplyAmountMap.put(scheduleItemBudgetId,budgetAmount.getTotalAmount()); + } + } + + //统计所有占用预算金额 + Map budgetItemAmountMap = new HashMap<>(scheduleItemList.size()); + List budgetIdsFromScheduleItemList = scheduleItemList.stream().map(TbsScheduleItemBudget::getBudgetId).distinct().collect(Collectors.toList()); + List scheduleItemIdsFromScheduleItemList = scheduleItemList.stream().map(TbsScheduleItemBudget::getScheduleItemId).distinct().collect(Collectors.toList()); + if(scheduleItemIdsFromScheduleItemList.size()>0&&budgetIdsFromScheduleItemList.size()>0){ + List budgetLogPreAmounts = tbsScheduleItemBudgetMapper.listLogCostAmount(budgetIdsFromScheduleItemList,scheduleItemIdsFromScheduleItemList,costApplyId); + for (TbsScheduleItemBudget itemBudget : scheduleItemList) { + boolean isNotMatch = true; + for (TbsBudgetLogPreAmount logPreAmount : budgetLogPreAmounts) { + if(itemBudget.getBudgetId().equals(logPreAmount.getBudgetId())&&itemBudget.getScheduleItemId().equals(logPreAmount.getScheduleItemId())){ + BigDecimal budgetItemAmount = logPreAmount.getAmount(); + isNotMatch = false; + //因为已使用的预算费用为负数,需去相反数 + budgetItemAmount = budgetItemAmount==null?BigDecimal.ZERO:budgetItemAmount.negate(); + budgetItemAmountMap.put(itemBudget.getId(),budgetItemAmount); + } + } + if(isNotMatch){ + budgetItemAmountMap.put(itemBudget.getId(),BigDecimal.ZERO); + } + } + } + +// for (TbsScheduleItemBudget itemBudget : scheduleItemList) { +// BigDecimal budgetItemApplyAmount = tbsScheduleItemBudgetMapper.totalApplyAmount(itemBudget.getScheduleItemId(),costApplyId); +// if(budgetItemApplyAmount==null){ +// budgetItemApplyAmount = BigDecimal.ZERO; +// } +// budgetItemApplyAmountMap.put(itemBudget.getId(),budgetItemApplyAmount); +// +// BigDecimal budgetItemAmount = tbsScheduleItemBudgetMapper.totalCostAmountByApplyId(itemBudget.getBudgetId(),itemBudget.getScheduleItemId(),costApplyId); +// //因为结果为负数,需去相反数 +// budgetItemAmount = budgetItemAmount==null?BigDecimal.ZERO:budgetItemAmount.negate(); +// +// budgetItemAmountMap.put(itemBudget.getId(),budgetItemAmount); +// } + + //统计当前活动前置项占用预算 + Map counterMap = new HashMap<>(); + //匹配预算主要方法 + final List actMatchList = new ArrayList<>(); + final List actUnMatchList = new ArrayList<>(); + for (TbsActivityCenterGoods activityCostItem : centerGoodsList) { + this.matchActivityMain(activityCostItem,throwEx, overspend, activityList, budgetItemAmountMap, budgetList, + noConditionBudgetList, counterMap, actMatchList, actUnMatchList,activityAllowBudgetIdMap,budgetItemApplyAmountMap,costSortWrapper); + } + + List budgetMatchList = actMatchList.stream() + .map(TbsActivityCenterGoods::toBudgetCostItem).collect(Collectors.toList()); + List budgetUnMatchList = actUnMatchList.stream() + .map(TbsActivityCenterGoods::toBudgetCostItem).collect(Collectors.toList()); + TbsBudgetTableVo tableVo = null; + if(buildTableFlag){ + //构建tableDTO + tableVo = this.buildBudgetTableVo(activityList, budgetItemAmountMap, budgetList, budgetMatchList, budgetUnMatchList); + } + TbsBudgetCostResult result = new TbsBudgetCostResult(); + result.setBudgetMatchList(budgetMatchList); + result.setBudgetUnMatchList(budgetUnMatchList); + result.setTableData(tableVo); + result.setBudgetList(budgetList); + result.setActivityList(activityList); + return result; + } + + /** + * 检测指定的预算满足条件 + * @param pontBudgetId + * @param budgetIds + * @param msg + */ + private void checkPointBudgetId(Long pontBudgetId, List budgetIds,String msg) { + if(pontBudgetId!=null){ + if(budgetIds==null){ + Assert.throwEx(msg); + } + boolean mc = false; + for (Long budgetId : budgetIds) { + if(budgetId.equals(pontBudgetId)){ + mc = true; + } + } + if(!mc){ + Assert.throwEx(msg); + } + } + } + + /** + * 预算条件需包含活动条件, Map结构:活动id->满足的预算id列表 + * @param activityList + * @param budgetList + * @param noConditionBudgetList + * @return + */ + private Map> buildActivityBudgetMap(List activityList, + List budgetList, + List noConditionBudgetList) { + Map> activityAllowBudgetIdMap = new HashMap<>(); + for (TbsActivity activity : activityList) { + List budgetIdsOfActivity = new ArrayList<>(); + if(CollectionUtil.isEmpty(noConditionBudgetList)){ + budgetIdsOfActivity.addAll(noConditionBudgetList.stream().map(TbsBudget::getId).collect(Collectors.toList())); + } + LambdaQueryWrapper goodsLambdaQueryWrapper = new LambdaQueryWrapper<>(); + goodsLambdaQueryWrapper.eq(TbsActivityGoods::getActivityId,activity.getId()); + List activityGoodsList = activityGoodsMapper.selectList(goodsLambdaQueryWrapper); + for (TbsBudget budget : budgetList) { + if(budget.getConditionFlag().equals(1)){ + List budgetConditionList = budget.getBudgetConditionList(); + boolean matchGoods = false; + for (TbsActivityGoods activityGoods : activityGoodsList) { + for (TbsBudgetCondition budgetCondition : budgetConditionList) { + if(activityGoods.getTargetLevelPathIds().contains(budgetCondition.getTargetLevelPathIds())){ + matchGoods = true; + break; + } + } + } + if(matchGoods){ + List budgetIds = activityAllowBudgetIdMap.get(activity.getId()); + if(budgetIds==null){ + budgetIds = new ArrayList<>(); + } + budgetIds.add(budget.getId()); + budgetIds.addAll(budgetIdsOfActivity); + activityAllowBudgetIdMap.put(activity.getId(),budgetIds); + } + else { + log.warn("无法匹配条件预算[{}],\n条件:{},\n活动商品数据:{}", + budget.getBudgetCode(), + JsonUtil.objectToJson(budgetConditionList), + JsonUtil.objectToJson(activityGoodsList)); + } + +// for (TbsActivityGoods activityGoods : activityGoodsList) { +// boolean matchGoods = false; +// for (TbsBudgetCondition budgetCondition : budgetConditionList) { +// if(activityGoods.getTargetLevelPathIds().contains(budgetCondition.getTargetLevelPathIds())){ +// matchGoods = true; +// break; +// } +// } +// if(!matchGoods){ +// hasNoMatch = true; +// break; +// } +// } +// if(!hasNoMatch){ +// List budgetIds = activityAllowBudgetIdMap.get(activity.getId()); +// if(budgetIds==null){ +// budgetIds = new ArrayList<>(); +// } +// budgetIds.add(budget.getId()); +// budgetIds.addAll(budgetIdsOfActivity); +// activityAllowBudgetIdMap.put(activity.getId(),budgetIds); +// } + + }else { + List budgetIds = activityAllowBudgetIdMap.get(activity.getId()); + if(budgetIds==null){ + budgetIds = new ArrayList<>(); + } + budgetIds.add(budget.getId()); + budgetIds.addAll(budgetIdsOfActivity); + activityAllowBudgetIdMap.put(activity.getId(),budgetIds); + } + } + } + return activityAllowBudgetIdMap; + } + + /** + * 建立费用预算表 + * @param activityList + * @param budgetItemAmountMap + * @param budgetList + * @param budgetMatchList + * @param budgetUnMatchList + * @return + */ + private TbsBudgetTableVo buildBudgetTableVo(List activityList, + Map budgetItemAmountMap, + List budgetList, + List budgetMatchList, + List budgetUnMatchList) { + List allBudgetItem = new ArrayList<>(); + allBudgetItem.addAll(budgetMatchList); + allBudgetItem.addAll(budgetUnMatchList); + TbsBudgetTableVo tableVo = new TbsBudgetTableVo(); + List topTheadHeaders = new ArrayList<>(); + Map> tmpMap = allBudgetItem.stream().collect(Collectors.groupingBy(TbsBudgetCostItem::getScheduleItemBudgetId)); + for (Long scheduleItemBudgetId : tmpMap.keySet()) { + if(scheduleItemBudgetId.equals(0L)){continue;} + TbsBudgetCostItem budgetCostItem = tmpMap.get(scheduleItemBudgetId).get(0); + String budgetCode = null; + for (TbsBudget budget : budgetList) { + if(budget.getId().equals(budgetCostItem.getBudgetId())){ + budgetCode = budget.getBudgetCode(); + break; + } + } + BigDecimal budgetAmount = budgetCostItem.getScheduleItemAmount(); + String scheduleItemName = budgetCostItem.getScheduleItemName(); + TbsBudgetTableVo.TopTheadHeader theadHeader = new TbsBudgetTableVo.TopTheadHeader(); + theadHeader.setId(scheduleItemBudgetId+""); + theadHeader.setLabel(budgetCode+"("+scheduleItemName+")"); + BigDecimal totalUsed = budgetItemAmountMap.get(scheduleItemBudgetId); + theadHeader.setBudgetAmount(budgetAmount.subtract(totalUsed)); + theadHeader.setTotalAmount(budgetAmount); + BigDecimal applyAmount = budgetCostItem.getScheduleItemAmountApply()==null?BigDecimal.ZERO:budgetCostItem.getScheduleItemAmountApply(); + theadHeader.setCostApplyAmount(applyAmount); + theadHeader.setCostAppliedAmount(totalUsed.subtract(applyAmount)); + topTheadHeaders.add(theadHeader); + } + //自定义超额预算 + TbsBudgetTableVo.TopTheadHeader overTopHeader = new TbsBudgetTableVo.TopTheadHeader(); + overTopHeader.setId("0"); + overTopHeader.setLabel("其它预算"); + overTopHeader.setBudgetAmount(BigDecimal.ZERO); + topTheadHeaders.add(overTopHeader); + + List leftTheadHeaders = new ArrayList<>(); + for (TbsBudgetCostItem centerGoods : allBudgetItem) { + TbsActivity activity = null; + for (TbsActivity obj : activityList) { + if(obj.getId().equals(centerGoods.getActivityId())){ + activity = obj; + break; + } + } + String actCode = activity==null?centerGoods.getActivityId().toString():activity.getActivityCode(); + TbsBudgetTableVo.LeftTheadHeader theadHeader = new TbsBudgetTableVo.LeftTheadHeader(); + theadHeader.setActivityCode(actCode); + theadHeader.setId(centerGoods.getCenterGoodItemId()+""); + theadHeader.setSubjectId(centerGoods.getSubjectId()); + theadHeader.setSubjectName(centerGoods.getSubjectName()); + theadHeader.setCenterId(centerGoods.getCenterId()); + theadHeader.setCenterName(centerGoods.getCenterName()); + theadHeader.setTargetType(centerGoods.getTargetType()); + theadHeader.setTargetId(centerGoods.getTargetId()); + if(centerGoods.getTargetType().equals(TbsGoodsType.sku.name())){ + centerGoods.initSpuSkuName(); + theadHeader.setLabel(centerGoods.getSpuName()+"("+centerGoods.getSkuName()+")"); + }else { + theadHeader.setLabel(centerGoods.getTargetName()); + } + theadHeader.setLabelCombo(actCode+"-" + +theadHeader.getSubjectName()+"-" + +theadHeader.getCenterName()+"-" + +theadHeader.getLabel()); + leftTheadHeaders.add(theadHeader); + } + List tableValueList = new ArrayList<>(); + for (TbsBudgetCostItem costItem : allBudgetItem) { + TbsBudgetTableVo.TableValue tableValue = new TbsBudgetTableVo.TableValue(); + tableValue.setTopId(costItem.getScheduleItemBudgetId()+""); + tableValue.setLeftId(costItem.getCenterGoodItemId()+""); + tableValue.setValue(costItem.getCenterGoodsAmount()); + tableValueList.add(tableValue); + } + tableVo.setTableValueList(tableValueList); + tableVo.setTopTheadHeaderList(topTheadHeaders); + tableVo.setLeftTheadHeaderList(leftTheadHeaders); + return tableVo; + } + + /** + * 匹配的主要方法 + * @param activityCostItem 活动项 + * @param throwEx 预算不够时抛出异常 + * @param overspend 超值标识 + * @param activityList 所有活动 + * @param budgetItemAmountMap 统计所有占用预算金额 + * @param allBudgetList 所有预算 + * @param noConditionBudgetList 没有条件的预算列表 + * @param counterMap 历史预算占用 + * @param actMatchList 匹配预算占用的费用(含超支预算) + * @param actUnMatchList 没有匹配预算的费用 + * @param activityAllowBudgetIdMap 满足当前活动项的费用idMap + * @param budgetItemApplyAmountMap 统计费用申请占用金额(录入时,考核期申请占用金额) + */ + private void matchActivityMain(TbsActivityCenterGoods activityCostItem, + Boolean throwEx, + boolean overspend, + List activityList, + Map budgetItemAmountMap, + final List allBudgetList, + List noConditionBudgetList, + Map counterMap, + final List actMatchList, + final List actUnMatchList, + final Map> activityAllowBudgetIdMap, + Map budgetItemApplyAmountMap, + CostSortWrapper costSortWrapper) { + //过滤满全条件的预算 + List allowBudgetIds = activityAllowBudgetIdMap.get(activityCostItem.getActivityId()); + if(CollectionUtil.isEmpty(allowBudgetIds)){ + log.warn("[{}]{} 无预算,成本中心:{},科目:{}",activityCostItem.getTargetCode() + ,activityCostItem.getTargetName(),activityCostItem.getCenterName(),activityCostItem.getSubjectName()); + //添加到预算超支表 + activityCostItem.setBudgetId(0L); + activityCostItem.setScheduleId(0L); + activityCostItem.setScheduleItemId(0L); + activityCostItem.setScheduleItemBudgetId(0L); + activityCostItem.setScheduleItemName("无"); + actUnMatchList.add(activityCostItem); + return; + } + List budgetList = allBudgetList.stream().filter(obj->allowBudgetIds.contains(obj.getId())).collect(Collectors.toList()); + //排序 + TbsActivity currentActivity = null; + for (TbsActivity activity : activityList) { + if(activityCostItem.getActivityId().equals(activity.getId())){ + currentActivity = activity; + break; + } + } + List currentItemBudgetList = this.filterMatchGoodsCondition(budgetList, activityCostItem.getTargetLevelPathIds(),currentActivity,costSortWrapper); + //关联无条件预算 + currentItemBudgetList.addAll(noConditionBudgetList); + //提取可用预算的考核期 + List currentScheduleItemBudgets = new ArrayList<>(); + for (TbsActivity activity : activityList) { + //忽略重叠情况 + if(!activityCostItem.getActivityId().equals(activity.getId())){ + continue; + } + //当前科目 + Long subjectId = activityCostItem.getSubjectId(); + //拦截非当前成本中心 + String centerId = activityCostItem.getCenterId(); + String centerType = activityCostItem.getCenterType(); + /* 科目条件优先级最高 */ + List scheduleItemBudgets = activity.getScheduleItemBudgetList(); + for (TbsBudget budget : currentItemBudgetList) { + for (TbsScheduleItemBudget scheduleItemBudget : scheduleItemBudgets) { + if(!budget.getCenterId().equals(centerId) || + !budget.getCenterType().equals(centerType) ){ + continue; + } + if(!subjectId.equals(budget.getSubjectId())&&!budget.getSubjectId().equals(0L)){ + continue; + } + if(scheduleItemBudget.getBudgetId().equals(budget.getId())){ + currentScheduleItemBudgets.add(scheduleItemBudget); + } + } + } + + } + //进行排序 + currentScheduleItemBudgets = CostSortWrapperUtil.initializeSort(currentActivity,currentScheduleItemBudgets,costSortWrapper); + + //检测是否有是否足够预算 + BigDecimal goodsAmount = activityCostItem.getCenterGoodsAmount(); + if(CollectionUtil.isNotEmpty(currentScheduleItemBudgets)){ + boolean isMatch = false; + for (TbsScheduleItemBudget itemBudget : currentScheduleItemBudgets) { + //历史费用(含申请占用金额) + BigDecimal totalUsed = budgetItemAmountMap.get(itemBudget.getId()); + //当前项费用 + BigDecimal budgetAmount = itemBudget.getBudgetAmount(); + //前置费用 + BigDecimal lastAmount = counterMap.get(itemBudget.getId()); + if(lastAmount==null){ + lastAmount = BigDecimal.ZERO; + } + //判断是否够用 + if(budgetAmount.subtract(lastAmount).subtract(totalUsed).compareTo(goodsAmount)>=0){ + activityCostItem.setBudgetId(itemBudget.getBudgetId()); + activityCostItem.setScheduleId(itemBudget.getScheduleId()); + activityCostItem.setScheduleItemId(itemBudget.getScheduleItemId()); + activityCostItem.setScheduleItemBudgetId(itemBudget.getId()); + activityCostItem.setScheduleItemName(itemBudget.getItemName()); + //绑定录入时可用预算 + activityCostItem.setScheduleItemAmount(budgetAmount); + //剩余的可用预算 + activityCostItem.setScheduleItemAmountUsed(totalUsed); + activityCostItem.setScheduleItemAmountApply(budgetItemApplyAmountMap.get(itemBudget.getId())); + isMatch = true; + //记录当前费用使用考核期费用 + lastAmount = lastAmount.add(goodsAmount); + counterMap.put(itemBudget.getId(),lastAmount); + actMatchList.add(activityCostItem); + break; + } + } + //无匹配的预算 + if(!isMatch){ + if (throwEx){ + Assert.throwEx("匹配品类时预算不足["+ activityCostItem.getTargetCode()+"]"); + } + log.warn("[{}]{} 预算不足,成本中心:{},科目:{}",activityCostItem.getTargetCode() + ,activityCostItem.getTargetName(),activityCostItem.getCenterName(),activityCostItem.getSubjectName()); + if(overspend){ + TbsScheduleItemBudget itemBudget = currentScheduleItemBudgets.get(0); + activityCostItem.setBudgetId(itemBudget.getBudgetId()); + activityCostItem.setScheduleId(itemBudget.getScheduleId()); + activityCostItem.setScheduleItemId(itemBudget.getScheduleItemId()); + activityCostItem.setScheduleItemBudgetId(itemBudget.getId()); + activityCostItem.setScheduleItemName(itemBudget.getItemName()); + //记录当前费用使用考核期费用 + BigDecimal lastAmount = counterMap.get(itemBudget.getId()); + if(lastAmount==null){ + lastAmount = BigDecimal.ZERO; + } + lastAmount = lastAmount.add(goodsAmount); + counterMap.put(itemBudget.getId(),lastAmount); + actMatchList.add(activityCostItem); + }else{ + activityCostItem.setBudgetId(0L); + activityCostItem.setScheduleId(0L); + activityCostItem.setScheduleItemId(0L); + activityCostItem.setScheduleItemBudgetId(0L); + activityCostItem.setScheduleItemName("无"); + actUnMatchList.add(activityCostItem); + } + } + } + else { + if(throwEx){ + Assert.throwEx("品类["+ activityCostItem.getTargetName()+"]无可用预算"); + } + log.warn("[{}]{} 未命中考核期,成本中心:{},科目:{}",activityCostItem.getTargetCode() + ,activityCostItem.getTargetName(),activityCostItem.getCenterName(),activityCostItem.getSubjectName()); + //添加到预算超支表 + activityCostItem.setBudgetId(0L); + activityCostItem.setScheduleId(0L); + activityCostItem.setScheduleItemId(0L); + activityCostItem.setScheduleItemBudgetId(0L); + activityCostItem.setScheduleItemName("无"); + actUnMatchList.add(activityCostItem); + } + } + + /** + * 按品类条件,提取可用预算 + * @param budgetList + * @param targetLevelPathIds + * @return + */ + @NotNull + public List filterMatchGoodsCondition(List budgetList,String targetLevelPathIds,TbsActivity currentActivity,CostSortWrapper costSortWrapper) { + String levelPath = targetLevelPathIds; + Set levelPathSet = new LinkedHashSet<>(); + levelPathSet.add(levelPath); + TbsBudgetCostUtil.buildPaths(levelPath,levelPathSet); + List budgetConditionList = new ArrayList<>(); + for (TbsBudget budget : budgetList) { + if(budget.getConditionFlag().equals(1)){ + List budgetConditionListByBudget = budget.getBudgetConditionList(); + boolean unMatch = true; + for (String conditionString : levelPathSet) { + if(unMatch){ + for (TbsBudgetCondition budgetCondition : budgetConditionListByBudget) { + if(budgetCondition.getTargetLevelPathIds().contains(conditionString)){ + budgetConditionList.add(budgetCondition); + unMatch = false; + break; + } + } + } + } + } + } + costSortWrapper.putActivityCostCondition(currentActivity.getId(), budgetConditionList); +// Collections.sort(budgetConditionList, (o1, o2) -> { +// int len1 = o1.getTargetLevelPathIds().split("_").length; +// int len2 = o2.getTargetLevelPathIds().split("_").length; +// if(len1==len2){ +// List scheduleItemBudgets = currentActivity.getScheduleItemBudgetList(); +// Long day1 = null; +// Long day2 = null; +// for (TbsScheduleItemBudget itemBudget : scheduleItemBudgets) { +// if(itemBudget.getBudgetId().equals(o1.getBudgetId())){ +// day1 = Duration.between(itemBudget.getStartDate(), itemBudget.getEndDate()).toDays(); +// }else if (itemBudget.getBudgetId().equals(o2.getBudgetId())){ +// day2 = Duration.between(itemBudget.getStartDate(), itemBudget.getEndDate()).toDays(); +// } +// } +// if(day1!=null&&day2!=null){ +// return (int) (day1-day2); +// } +// } +// return len2 - len1; +// }); + List currentItemBudgetList = new ArrayList<>(); + for (TbsBudgetCondition condition : budgetConditionList) { + for (TbsBudget budget : budgetList) { + if(condition.getBudgetId().equals(budget.getId())){ + currentItemBudgetList.add(budget); + break; + } + } + } + return currentItemBudgetList; + } + + /** + * 加载预算条件和关联预算匹配,返回是否由无条件预算 + * 1.加载所有的条件 + * 2.匹配初无条件预算 + * 3.预算条件关联到预算对象中 + * @param budgetList + * @param noConditionBudgetList + * @return 含有无条件预算标识 + */ + public boolean loadConditionByBudgetsAndMatch( List budgetList, List noConditionBudgetList) { + boolean budgetNoCondition = false; + for (TbsBudget budget : budgetList) { + if(budget.getConditionFlag().equals(1)){ + List budgetConditionListByBudgetId = tbsBudgetConditionService.getByBudgetId(budget.getId()); + budget.setBudgetConditionList(budgetConditionListByBudgetId); + }else { + budgetNoCondition = true; + noConditionBudgetList.add(budget); + } + } + return budgetNoCondition; + } + + /** + * 拦截没有预算的活动 + * @param throwEx 抛出异常 + * @param overspend 超支 + * @param activityList 活动列表 + * @param noBudgetActivityIds 没有预算的活动id + * @param activityAllowBudgetIdMap 预算条件需包含活动条件, Map结构:活动id->满足的预算id列表 + */ + private void handleNoBudgetActivity(Boolean throwEx, boolean overspend, List activityList, + List noBudgetActivityIds, + Map> activityAllowBudgetIdMap) { + if(!overspend && throwEx && noBudgetActivityIds.size()>0){ + for (TbsActivity activity : activityList) { + for (Long activityId : noBudgetActivityIds) { + if(activity.getId().equals(activityId)){ + Assert.throwEx("活动["+activity.getActivityCode()+"]无可用预算"); + } + } + List budgetIds = activityAllowBudgetIdMap.get(activity.getId()); + if(CollectionUtil.isEmpty(budgetIds)){ + Assert.throwEx("活动["+activity.getActivityCode()+"]无可用预算"); + } + } + Assert.throwEx("活动无可用预算"); + } + } + + /** + * 1.通过活动加载所有满足条件的考核期(用于加载历史核销费用), + * 2.设置没有可用预算的活动id + * 3.设置匹配的考核期列表到活动中 + * @param activityList -> item设置满足条件的考核期列表 + * @param budgetIds + * @param noBudgetActivityIds + * @return scheduleItemList 命中的考核期列表 + */ + public List loadScheduleBudgetAndSetting(List activityList, + List budgetIds, List noBudgetActivityIds,CostSortWrapper costSortWrapper) { + List scheduleItemList = new ArrayList<>(); + Set budgetIdsSet = new HashSet<>(); + Map allAllowScheduleItemTempMap = new HashMap<>(); + // of sort + Map> activityScheduleItemMapOfSort = new HashMap<>(); + for (TbsActivity activity : activityList) { + List budgetItemList = tbsScheduleItemBudgetService + .betweenDateList(activity.getPreStartDate(),activity.getPreEndDate()); + + if(StringUtils.hasText(activity.getTemplateBudgetIds())){ + List budgetIdsList = Arrays.stream(activity.getTemplateBudgetIds().split(",")).map(Long::parseLong) + .collect(Collectors.toList()); + budgetItemList = budgetItemList.stream().filter(a->budgetIdsList.contains(a.getBudgetId())).collect(Collectors.toList()); + } + //设置关联用于后面条件过滤 + activity.setScheduleItemBudgetList(budgetItemList); + if(CollectionUtil.isNotEmpty(budgetItemList)){ + for (TbsScheduleItemBudget item : budgetItemList) { + budgetIdsSet.add(item.getBudgetId()); + allAllowScheduleItemTempMap.put(item.getId(),item); + } + activityScheduleItemMapOfSort.put(activity.getId(),budgetItemList); + }else { + noBudgetActivityIds.add(activity.getId()); + } + } + costSortWrapper.setActivityScheduleItemMap(activityScheduleItemMapOfSort); + for (Long tmpId : allAllowScheduleItemTempMap.keySet()) { + scheduleItemList.add(allAllowScheduleItemTempMap.get(tmpId)); + } + budgetIds.addAll(budgetIdsSet); +// Collections.sort(scheduleItemList, new Comparator() { +// @Override +// public int compare(TbsScheduleItemBudget o1, TbsScheduleItemBudget o2) { +// long d = Duration.between(o1.getStartDate(), o1.getEndDate()).toDays(); +// long d2 = Duration.between(o2.getStartDate(), o2.getEndDate()).toDays(); +// return (int) (d-d2); +// } +// }); + return scheduleItemList; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetBatchItemService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetBatchItemService.java new file mode 100644 index 0000000..1850089 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetBatchItemService.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsBudgetBatchItem; +import java.util.List; + +/** + * 批量申请项 服务接口 + * @author YenHex + * @date 2023-08-24 + */ +public interface TbsBudgetBatchItemService extends IService { + + List listByBatchId(Long batchId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetBatchService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetBatchService.java new file mode 100644 index 0000000..5e0ad1c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetBatchService.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsBudgetBatch; +import com.qs.serve.modules.tbs.entity.bo.TbsBudgetBatchBo; + +/** + * 批量申请 服务接口 + * @author YenHex + * @date 2023-08-24 + */ +public interface TbsBudgetBatchService extends IService { + + Object commit(TbsBudgetBatchBo param); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetChangeConditionService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetChangeConditionService.java new file mode 100644 index 0000000..39baa2b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetChangeConditionService.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsBudgetChangeCondition; +import java.util.List; + +/** + * 预算更变记录条件 服务接口 + * @author YenHex + * @date 2023-08-09 + */ +public interface TbsBudgetChangeConditionService extends IService { + + List listByChangeId(Long id); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetChangeScheduleItemService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetChangeScheduleItemService.java new file mode 100644 index 0000000..3020fd5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetChangeScheduleItemService.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsBudgetChangeScheduleItem; +import java.util.List; + +/** + * 考核期更变记录 服务接口 + * @author YenHex + * @date 2023-08-09 + */ +public interface TbsBudgetChangeScheduleItemService extends IService { + + List listByChangeId(Long id); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetChangeService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetChangeService.java new file mode 100644 index 0000000..372f88a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetChangeService.java @@ -0,0 +1,48 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.common.consts.ChangeTypeEnum; +import com.qs.serve.modules.tbs.common.dto.TbsBudgetChangeVo; +import com.qs.serve.modules.tbs.entity.TbsBudgetChange; +import com.qs.serve.modules.tbs.entity.bo.TbsBudgetUpdateAfterStartBo; +import com.qs.serve.modules.tbs.entity.so.TbsBudgetChangeSo; +import org.apache.ibatis.annotations.Param; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +/** + * 预算更变记录 服务接口 + * @author YenHex + * @date 2023-08-09 + */ +public interface TbsBudgetChangeService extends IService { + + /** + * 获取详情 + * @param id + * @param applyType + * @return + */ + TbsBudgetChange getDetailById(String id, ChangeTypeEnum applyType); + + /** + * 获取详情 + * @param budgetId + * @param applyType + * @return + */ + TbsBudgetChange getDetailByBudgetId(String budgetId,ChangeTypeEnum applyType); + + /** + * 提交修改 + * @param param + */ + TbsBudgetChange commitApply(TbsBudgetUpdateAfterStartBo param); + + List selectChangeVoList(TbsBudgetChangeSo query); + + Long countChangeVo(TbsBudgetChangeSo query); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetConditionService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetConditionService.java new file mode 100644 index 0000000..2a6e9ca --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetConditionService.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsBudgetCondition; +import java.util.List; +/** + * 预算条件 服务接口 + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsBudgetConditionService extends IService { + + List getByBudgetId(Long budgetId); + + Long findUnMatchConditionBySourceBudgetIdAndTargetBudgetId(Long sourceId,Long targetId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetCostItemPolicyService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetCostItemPolicyService.java new file mode 100644 index 0000000..9b444cb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetCostItemPolicyService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsBudgetCostItemPolicy; + +/** + * 预算费用明细 服务接口 + * @author YenHex + * @date 2023-02-22 + */ +public interface TbsBudgetCostItemPolicyService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetCostItemService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetCostItemService.java new file mode 100644 index 0000000..3a39f32 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetCostItemService.java @@ -0,0 +1,36 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsBudgetCostItem; + +import java.util.List; + +/** + * 预算费用明细 服务接口 + * @author YenHex + * @date 2022-12-02 + */ +public interface TbsBudgetCostItemService extends IService { + + /** + * 移除费用申请占用 + * @param costApplyId + */ + void removeByCostApplyId(Long costApplyId); + + /** + * 查询费用占用 + * @param ids + * @param neInCostApplyId 忽略的费用申请id + * @return + */ + List listByScheduleItemBudgetIds(List ids,Long neInCostApplyId); + + /** + * 根据申请ID查询费用占用 + * @param id + * @return + */ + public List listByCostApplyId(Long costApplyId); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetLogService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetLogService.java new file mode 100644 index 0000000..52fb7b2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetLogService.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tzc.entity.TzcPolicy; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; + +import java.math.BigDecimal; + +/** + * 预算日志 服务接口 + * @author YenHex + * @date 2023-01-05 + */ +public interface TbsBudgetLogService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetManagerService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetManagerService.java new file mode 100644 index 0000000..1d615cb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetManagerService.java @@ -0,0 +1,28 @@ +package com.qs.serve.modules.tbs.service; + +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetMatchMsgVo; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/12/28 + */ +public interface TbsBudgetManagerService { + + /** + * 通过活动的成本中心,时间,科目粗略过滤出预算id + * @param activityIds + * @return + */ + List listBudgetIdsByActivityId(List activityIds); + + /** + * 对比活动和预算进行条件匹配,返回不符合的内容(以Budget为参照物,全量匹配) + * @param activityIds + * @param budgetIds + * @return + */ + List compare(List activityIds, List budgetIds); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetMatchApplication.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetMatchApplication.java new file mode 100644 index 0000000..b57e8ed --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetMatchApplication.java @@ -0,0 +1,320 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.AmountDTO; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.common.util.CostSort2WrapperUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.dto.TbsCenterGoodsGroupDTO; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetTableResultVo; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetTableVo; +import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; +import com.qs.serve.modules.tbs.mapper.TbsBudgetMatchMapper; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 匹配规则2 + * @author YenHex + * @since 2023/7/21 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsBudgetMatchApplication { + + private final TbsCostApplyMapper tbsCostApplyMapper; + private final TbsActivityCenterGoodsService tbsActivityCenterGoodsService; + private final TbsActivityService activityService; + private final TbsBudgetMatchMapper budgetMatchMapper; + private final TbsBudgetMapper budgetMapper; + + /** + * 构建匹配预算 + * @param costApplyId + * @param buildTable + * @param overspendAmt 允许超额 + * @return + */ + public TbsBudgetTableResultVo getMatchResult(Long costApplyId,boolean buildTable,boolean overspendAmt){ + + List activityList = activityService.listByCostApplyId(costApplyId); + + //list转map,减少循环代码 + Map activityMap = new HashMap<>(activityList.size()); + //模板过滤-活动指定预算 + Map> activityBudgetIdsMap = new HashMap<>(activityList.size()); + for (TbsActivity activity : activityList) { + activityMap.put(activity.getId(),activity); + if(StringUtils.hasText(activity.getTemplateBudgetIds())){ + List budgetIdsList = Arrays.stream(activity.getTemplateBudgetIds().split(",")).map(Long::parseLong) + .collect(Collectors.toList()); + activityBudgetIdsMap.put(activity.getId(),budgetIdsList); + } + } + List activityCenterGoodsList = tbsActivityCenterGoodsService.listByCostApplyId(costApplyId); + // 记录使用金额 + Map usableAmountMap = new HashMap<>(); + // 提取命中的预算 + Map matchItemBudgetsMap = new HashMap<>(); + Set scheduleItemBudgetIds = new HashSet<>(); + //所有的预算 + Set allBudgetIds = new HashSet<>(); + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + // 通过TbsActivityCenterGoods获取匹配条件的预算 + List scheduleItemBudgetList = this.centerGoodsMatchTbsScheduleItemBudget(centerGoods); + // 优先级 + scheduleItemBudgetList = CostSort2WrapperUtil.sort(scheduleItemBudgetList); + if(scheduleItemBudgetList.size()>0){ + List sids = scheduleItemBudgetList.stream().map(TbsScheduleItemBudget::getId).collect(Collectors.toList()); + scheduleItemBudgetIds.addAll(sids); + List budgetIds = scheduleItemBudgetList.stream().map(TbsScheduleItemBudget::getBudgetId).collect(Collectors.toList()); + allBudgetIds.addAll(budgetIds); + } + centerGoods.setMatch2ScheduleItemBudgetList(scheduleItemBudgetList); + } + //加载金额统计 + this.batchInitScheduleAmount(activityCenterGoodsList, scheduleItemBudgetIds,costApplyId); + + + TbsCostApply costApply = tbsCostApplyMapper.selectById(costApplyId); + + + //加载所有预算 + allBudgetIds.add(0L); + List allBudgetList = budgetMapper.selectBatchIds(allBudgetIds); + Map allBudgetMap = new HashMap<>(allBudgetList.size()); + for (TbsBudget budget : allBudgetList) { + //不是回退和异动,需要过滤停用条件 + if(!costApply.getChargeState().equals(TbsCostApplyState.State_4_refused.getCode())&& + !costApply.getChargeState().equals(TbsCostApplyState.State_7_changed.getCode())){ + //跨年和不运作状态时跳过 + if(budget.getStopFlag().equals(1)||budget.getInactiveFlag().equals(1)){ + continue; + } + } + allBudgetMap.put(budget.getId(),budget); + } + + // 金额匹配 + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + // 通过TbsActivityCenterGoods获取匹配条件的预算 + List scheduleItemBudgetList = centerGoods.getMatch2ScheduleItemBudgetList(); + // 判断金额是否够扣 + for (TbsScheduleItemBudget itemBudget : scheduleItemBudgetList) { + + + //跳过活动模板指定的预算 + List matchActBudgetIds = activityBudgetIdsMap.get(centerGoods.getActivityId()); + boolean notMatch = false; + if(CollectionUtil.isNotEmpty(matchActBudgetIds)){ + notMatch = true; + for (Long budgetId : matchActBudgetIds) { + if(itemBudget.getBudgetId().equals(budgetId)){ + notMatch = false; + break; + } + } + } + if(notMatch){ + continue; + } + + //跳过预算指定的模板 + TbsActivity activity = activityMap.get(centerGoods.getActivityId()); + String templateId = activity.getTemplateId()==null||activity.getTemplateId()==0L?null:activity.getTemplateId().toString(); + TbsBudget budget = allBudgetMap.get(itemBudget.getBudgetId()); + if(budget==null){ + continue; + } + if (budget.getTemplateFlag().equals(1)) { + if(templateId==null||budget.getTemplateIds()==null||budget.getTemplateIds().length<1){ + continue; + } + boolean matchTemId = false; + for (String budgetTemplateId : budget.getTemplateIds()) { + if(templateId.equals(budgetTemplateId)){ + matchTemId = true; + break; + } + } + if(!matchTemId){ + continue; + } + } + + if(overspendAmt){ + //允许超预算 + Long scheduleItemBudgetId = itemBudget.getId(); + matchItemBudgetsMap.put(scheduleItemBudgetId,itemBudget); + centerGoods.setScheduleItemBudgetId(itemBudget.getId()); + break; + }else { + //开始匹配主要逻辑 + Long scheduleItemBudgetId = itemBudget.getId(); + BigDecimal usableAmt = usableAmountMap.get(scheduleItemBudgetId); + if(usableAmt==null){ + usableAmt = itemBudget.getUnUsedBudgetAmount(); + } + if(usableAmt!=null&&usableAmt.compareTo(centerGoods.getCenterGoodsAmount())>=0){ + usableAmt = usableAmt.subtract(centerGoods.getCenterGoodsAmount()); + //扣减后存放map + usableAmountMap.put(scheduleItemBudgetId,usableAmt); + //标记使用那个预算 + centerGoods.setScheduleItemBudgetId(itemBudget.getId()); + matchItemBudgetsMap.put(scheduleItemBudgetId,itemBudget); + break; + } + } + } + } + + TbsBudgetTableResultVo resultVo = new TbsBudgetTableResultVo(); + resultVo.setActivityCenterGoodsList(activityCenterGoodsList); + resultVo.setMatchItemBudgetsMap(matchItemBudgetsMap); + if(buildTable){ + //拼接Table,要重新设计显示内容 + TbsBudgetTableVo tableVo = buildTbsBudgetTableVo(activityMap, activityCenterGoodsList, matchItemBudgetsMap); + resultVo.setTableVo(tableVo); + } + return resultVo; + } + + /** + * 初始化金额 + * @param activityCenterGoodsList + * @param scheduleItemBudgetIds + */ + private void batchInitScheduleAmount(List activityCenterGoodsList, Set scheduleItemBudgetIds,Long costApplyId) { + if(scheduleItemBudgetIds.size()>0){ + List notUsedAmountList = budgetMatchMapper.getBudgetNotUsedAmount(scheduleItemBudgetIds,costApplyId); + List usedAmountList = budgetMatchMapper.getBudgetUsedAmount(scheduleItemBudgetIds); + List finalAmountList = budgetMatchMapper.getBudgetFinalUsedAmount(scheduleItemBudgetIds); + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + List scheduleItemBudgetList = centerGoods.getMatch2ScheduleItemBudgetList(); + if(CollectionUtil.isNotEmpty(scheduleItemBudgetList)){ + for (TbsScheduleItemBudget itemBudget : scheduleItemBudgetList) { + String itemBudgetId = itemBudget.getId().toString(); + for (AmountDTO dto : notUsedAmountList) { + if(dto.getId().equals(itemBudgetId)){ + itemBudget.setUnUsedBudgetAmount(dto.getAmount()); + break; + } + } + for (AmountDTO dto : usedAmountList) { + if(dto.getId().equals(itemBudgetId)){ + itemBudget.setUsedBudgetAmount(dto.getAmount()); + break; + } + } + for (AmountDTO dto : finalAmountList) { + if(dto.getId().equals(itemBudgetId)){ + itemBudget.setFinalBudgetAmount(dto.getAmount()); + break; + } + } + } + } + } + } + } + + @NotNull + private TbsBudgetTableVo buildTbsBudgetTableVo(Map activityMap, List activityCenterGoodsList, Map matchItemBudgetsMap) { + List topTheadHeaderList = new ArrayList<>(); + List tableValueList = new ArrayList<>(); + List leftTheadHeaderList = new ArrayList<>(); + + for (Long scheduleItemBudgetId : matchItemBudgetsMap.keySet()) { + TbsScheduleItemBudget itemBudget = matchItemBudgetsMap.get(scheduleItemBudgetId); + TbsBudgetTableVo.TopTheadHeader header = new TbsBudgetTableVo.TopTheadHeader(); + header.setId(scheduleItemBudgetId.toString()); + header.setLabel(itemBudget.getBudgetName()+"-"+itemBudget.getItemName()); + header.setBudgetAmount(itemBudget.getUnUsedBudgetAmount()); + header.setTotalAmount(itemBudget.getFinalBudgetAmount()); + header.setCostAppliedAmount(itemBudget.getUsedBudgetAmount()); + header.setCostApplyAmount(BigDecimal.ZERO); + topTheadHeaderList.add(header); + } + TbsBudgetTableVo.TopTheadHeader overTopHeader = new TbsBudgetTableVo.TopTheadHeader(); + overTopHeader.setId("0"); + overTopHeader.setLabel("无匹配预算"); + overTopHeader.setBudgetAmount(BigDecimal.ZERO); + topTheadHeaderList.add(overTopHeader); + + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + TbsBudgetTableVo.LeftTheadHeader theadHeader = new TbsBudgetTableVo.LeftTheadHeader(); + String actCode = activityMap.get(centerGoods.getActivityId()).getActivityCode(); + theadHeader.setActivityCode(actCode); + theadHeader.setId(centerGoods.getId()+""); + theadHeader.setSubjectId(centerGoods.getSubjectId()); + theadHeader.setSubjectName(centerGoods.getSubjectName()); + theadHeader.setCenterId(centerGoods.getCenterId()); + theadHeader.setCenterName(centerGoods.getCenterName()); + theadHeader.setTargetType(centerGoods.getTargetType()); + theadHeader.setTargetId(centerGoods.getTargetId()); + if(centerGoods.getTargetType().equals(TbsGoodsType.sku.name())){ + centerGoods.initSpuSkuName(); + theadHeader.setLabel(centerGoods.getSpuName()+"("+centerGoods.getSkuName()+")"); + }else { + theadHeader.setLabel(centerGoods.getTargetName()); + } + theadHeader.setLabelCombo(actCode+"-" + +theadHeader.getSubjectName()+"-" + +theadHeader.getCenterName()+"-" + +theadHeader.getLabel()); + leftTheadHeaderList.add(theadHeader); + + TbsBudgetTableVo.TableValue tableValue = new TbsBudgetTableVo.TableValue(); + tableValue.setTopId(centerGoods.getScheduleItemBudgetId()==null?"0":centerGoods.getScheduleItemBudgetId().toString()); + tableValue.setLeftId(centerGoods.getId()+""); + tableValue.setValue(centerGoods.getCenterGoodsAmount()); + tableValueList.add(tableValue); + } + TbsBudgetTableVo tableData = new TbsBudgetTableVo(); + tableData.setTableValueList(tableValueList); + tableData.setTopTheadHeaderList(topTheadHeaderList); + tableData.setLeftTheadHeaderList(leftTheadHeaderList); + return tableData; + } + + /** + * 通过TbsActivityCenterGoods获取匹配条件的预算 + * @param centerGoods + * @return + */ + private List centerGoodsMatchTbsScheduleItemBudget(TbsActivityCenterGoods centerGoods){ + //预处理,将商品维度分割 + String[] goodsIds = centerGoods.getTargetLevelPathIds().split("_"); + List groups = new ArrayList<>(); + List goodsIdList = Arrays.asList(goodsIds); + for (int i = 0; i < goodsIdList.size(); i++) { + if(i==0){ + //brand、category、series、spu、sku + groups.add(new TbsCenterGoodsGroupDTO("brand",goodsIdList.get(i))); + }else if (i==1){ + groups.add(new TbsCenterGoodsGroupDTO("category",goodsIdList.get(i))); + }else if (i==2){ + groups.add(new TbsCenterGoodsGroupDTO("series",goodsIdList.get(i))); + }else if (i==3){ + groups.add(new TbsCenterGoodsGroupDTO("spu",goodsIdList.get(i))); + }else { + groups.add(new TbsCenterGoodsGroupDTO("sku",goodsIdList.get(i))); + break; + } + } + centerGoods.setQueryGoodsGroups(groups); + return budgetMatchMapper.getTbsScheduleItemsByCenterGoods(centerGoods); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetPlanService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetPlanService.java new file mode 100644 index 0000000..fcf6172 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetPlanService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsBudgetPlan; + +/** + * 预算 服务接口 + * @author YenHex + * @date 2023-07-10 + */ +public interface TbsBudgetPlanService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetReleaseApplicationService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetReleaseApplicationService.java new file mode 100644 index 0000000..e997e36 --- /dev/null +++ b/cms-modules/cms-system/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/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetService.java new file mode 100644 index 0000000..b8b57ee --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsBudgetService.java @@ -0,0 +1,64 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.entity.TbsBudgetLog; +import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; +import com.qs.serve.modules.tbs.entity.bo.*; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetVo; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 预算 服务接口 + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsBudgetService extends IService { + + /** + * 提交申请 + * @param id + */ + void commitApply(Long id); + + /** + * 修改 + * @param budgetBo + */ + void modify(TbsBudgetBo budgetBo); + + void startBudget(Long id); + + /** 更新模板 */ + void updateTemplates(TbsBudgetTempBo tempBo); + +// void modifyByExcel(TbsBudgetExcelBo budgetBo); + + //void modifyByExcelBatch(TbsBudgetExcelBatchDto budgetBo); + + TbsBudget getByCode(String code); + +// List listBudgetExcel(List budgetIds); + + TbsBudgetVo toVoEntity(TbsBudget budget); + + TbsBudgetVo getEntityForExcel(TbsBudget budget); + + void moveCenterBudgetAndCostAmount(String sourceId,String sourceType,String targetId,String targetType); + + void moveBudgetAmount(TbsBudgetMoveAmountBo bo); + + void updateBudgetAfterStart(TbsBudgetUpdateAfterStartBo param); + + void updateCrossYearFlag(Integer crossYearFlag); + + void syncStopFlag(); + + void syncMissSchItem(); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCenterDtoService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCenterDtoService.java new file mode 100644 index 0000000..a025e23 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCenterDtoService.java @@ -0,0 +1,171 @@ +package com.qs.serve.modules.tbs.service; + +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.entity.BmsCostCenter; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.*; +import com.qs.serve.modules.goods.entity.dto.TbsCenterDto; +import com.qs.serve.modules.tbs.common.TbsCenterType; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @author YenHex + * @since 2022/11/18 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsCenterDtoService { + + + private final BmsCostCenterService costCenterService; + private final BmsSupplierService supplierService; + private final BmsRegionService saleRegionService; + private final BmsRegion2Service bizRegionService; + + /** + * 获取成本中心DTO + * @param centerType + * @param centerId + * @return + */ + public TbsCenterDto getCenterDto(String centerType, String centerId){ + if(centerType.equals(TbsCenterType.center.name())){ + BmsCostCenter costCenter = costCenterService.getById(centerId); + return new TbsCenterDto(centerId,costCenter.getCode(),costCenter.getName(),centerType,costCenter.getCreateTime()); + }else if (centerType.equals(TbsCenterType.customer.name())){ + BmsSupplier supplier4Center = supplierService.getById(centerId); + return new TbsCenterDto(centerId,supplier4Center.getCode(),supplier4Center.getName(),centerType,supplier4Center.getCreateTime()); + }else if(centerType.equals(TbsCenterType.saleRegion.name())){ + BmsRegion saleRegion = saleRegionService.getById(centerId); + return new TbsCenterDto(centerId,saleRegion.getCode(),saleRegion.getName(),centerType,saleRegion.getCreateTime()); + }else if (centerType.equals(TbsCenterType.bizRegion.name())){ + BmsRegion2 bizRegion = bizRegionService.getById(centerId); + return new TbsCenterDto(centerId,bizRegion.getCode(),bizRegion.getName(),centerType,bizRegion.getCreateTime()); + } + Assert.throwEx("无法匹配成本中心类型:"+centerType); + return null; + } + + + public TbsCenterDto getCenterDtoByName(String centerType,String centerNameOrCode,Boolean throwNull){ + if(!StringUtils.hasText(centerNameOrCode)){ + return null; + } + if(centerType.equals(TbsCenterType.center.name())){ + BmsCostCenter costCenter = costCenterService.getByNameOrCode(centerNameOrCode); + if(costCenter==null){ + if(throwNull) { + Assert.throwEx("无效的成本中心信息:"+centerNameOrCode); + } + return null; + } + return new TbsCenterDto(costCenter.getId()+"" ,costCenter.getCode(),costCenter.getName(),centerType); + }else if (centerType.equals(TbsCenterType.customer.name())){ + BmsSupplier supplier4Center = null; + if(StringUtils.hasText(centerNameOrCode)){ + String belong = null; + if(centerNameOrCode.contains("JSB")){ + centerNameOrCode = centerNameOrCode.replace("JSB",""); + belong = "JSB"; + }else if(centerNameOrCode.contains("JSL")){ + centerNameOrCode = centerNameOrCode.replace("JSL",""); + belong = "JSL"; + } + supplier4Center = supplierService.getByNameOrCode(centerNameOrCode); + }else { + supplier4Center = supplierService.getByNameOrCode(centerNameOrCode); + } + if(supplier4Center==null){ + if(throwNull) { + Assert.throwEx("无效的成本中心信息:"+centerNameOrCode); + } + return null; + } + return new TbsCenterDto(supplier4Center.getId(),supplier4Center.getCode(),supplier4Center.getName(),centerType); + }else if(centerType.equals(TbsCenterType.saleRegion.name())){ + BmsRegion saleRegion = saleRegionService.getByNameOrCode(centerNameOrCode); + if(saleRegion==null){ + if(throwNull) { + Assert.throwEx("无效的成本中心信息:"+centerNameOrCode); + } + return null; + } + return new TbsCenterDto(saleRegion.getId(),saleRegion.getCode(),saleRegion.getName(),centerType); + }else if (centerType.equals(TbsCenterType.bizRegion.name())){ + BmsRegion2 bizRegion = bizRegionService.getByNameOrCode(centerNameOrCode); + if(bizRegion==null){ + if(throwNull) { + Assert.throwEx("无效的成本中心信息:"+centerNameOrCode); + } + return null; + } + return new TbsCenterDto(bizRegion.getId(),bizRegion.getCode(),bizRegion.getName(),centerType); + } + //Assert.throwEx("无法匹配成本中心类型:"+centerType); + return null; + } + + /** + * 获取成本中心 + * @param centerType + * @param centerName + * @param centerCode + * @param centerRegionLevel + * @return + */ + public TbsCenterDto getCenterDtoByName(String centerType,String centerName,String centerCode,Integer centerRegionLevel){ + if(centerType.equals(TbsCenterType.center.name())){ + BmsCostCenter costCenter = null; + if(StringUtils.hasText(centerCode)){ + costCenter = costCenterService.getByCode(centerCode); + } + if(costCenter==null&&StringUtils.hasText(centerName)) { + costCenter = costCenterService.getByName(centerName); + } + return new TbsCenterDto(costCenter.getId()+"" ,costCenter.getCode(),costCenter.getName(),centerType); + }else if (centerType.equals(TbsCenterType.customer.name())){ + BmsSupplier supplier4Center = null; + if(StringUtils.hasText(centerCode)){ + String belong = null; + if(centerCode.contains("JSB")){ + centerCode = centerCode.replace("JSB",""); + belong = "JSB"; + }else if(centerCode.contains("JSL")){ + centerCode = centerCode.replace("JSL",""); + belong = "JSL"; + } + supplier4Center = supplierService.getByCode(centerCode,belong); + }if(supplier4Center==null&&StringUtils.hasText(centerName)) { + supplier4Center = supplierService.getByName(centerName); + } + return new TbsCenterDto(supplier4Center.getId(),supplier4Center.getCode(),supplier4Center.getName(),centerType); + }else if(centerType.equals(TbsCenterType.saleRegion.name())){ + BmsRegion saleRegion = null; + if(StringUtils.hasText(centerCode)){ + saleRegion = saleRegionService.getByCode(centerCode); + } + if(saleRegion==null&&StringUtils.hasText(centerName)){ + saleRegion = saleRegionService.getByName(centerName,centerRegionLevel); + } + return new TbsCenterDto(saleRegion.getId(),saleRegion.getCode(),saleRegion.getName(),centerType); + }else if (centerType.equals(TbsCenterType.bizRegion.name())){ + BmsRegion2 bizRegion = null; + if(StringUtils.hasText(centerCode)){ + bizRegion = bizRegionService.getByCode(centerCode); + } + if(bizRegion==null&&StringUtils.hasText(centerName)){ + bizRegion = bizRegionService.getByName(centerName,centerRegionLevel); + } + return new TbsCenterDto(bizRegion.getId(),bizRegion.getCode(),bizRegion.getName(),centerType); + } + Assert.throwEx("无法匹配成本中心类型:"+centerType); + return null; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostApplyPart1Service.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostApplyPart1Service.java new file mode 100644 index 0000000..ba5f859 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostApplyPart1Service.java @@ -0,0 +1,53 @@ +package com.qs.serve.modules.tbs.service; + +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.entity.bo.TbsActivityDefaultCenterBo; +import com.qs.serve.modules.tbs.entity.vo.TbsActivityDefaultCenterVo; +import org.springframework.web.bind.annotation.RequestBody; + +/** + * @author YenHex + * @since 2023/7/27 + */ +public interface TbsCostApplyPart1Service { + + /** + * 通过ID复制 + * @param costId + * @return + */ + TbsCostApply copyById(Long costId); + + /** + * 执行异动 + * @param costId + * @return 返回新的活动申请ID + */ + TbsCostApply toSetChanged(Long costId); + + /** + * 取消异动 + * @param costId 异动后的费用id + * @param checkThrow 检测抛异常 + */ + void cancelSetChanged(Long costId,boolean checkThrow); + + + /** + * 通过活动科目的金额重新分配,包含更新预算占用金额 + * @param activityId + */ + void updateAmtAndRateByActSubject(Long activityId); + + + /** + * 建立活动VO + * @param activity + */ + void buildDetailVo(TbsActivity activity); + + R getDefaultCenter(TbsActivityDefaultCenterBo defaultCenterBo); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostApplyService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostApplyService.java new file mode 100644 index 0000000..db0fa0d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostApplyService.java @@ -0,0 +1,122 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.bms.entity.BmsApplyMessage; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplate; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + * 费用申请 服务接口 + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsCostApplyService extends IService { + + /** + * 通过活动合计费用申请总支付金额 + * @param id + * @return + */ + BigDecimal totalCostUsed(Long id); + + void updateCheckState(); + + TbsCostApply getByCode(String code); + + /** + * 作废 + * @param id + */ + void removeCostById(Long id); + + /** + * 重建费用申请的预算占用(用于OA已经生成表单,但是费用申请回调报错后补发) + * @param costId + */ + void rebuildBudgetInit(Long costId); + + /** + * 统计即将逾期 + * @param userId + * @return + */ + Long selectCountOverdueState(String userId); + + IPage selectPage(TbsCostApply costApply) ; + + /** + * 提交申请 + * @param id + */ + void commitApply(String id); + + /** + * 校验模板是否正确 + * @param supplier + * @param template + * @return 是否正确 + */ + boolean checkTemplateId(BmsSupplier supplier, TbsActivityTemplate template); + + /** + * 批量关了客户校验后,可用的模板结果 + * @param supplier + * @param template + * @return 可用的客户id + */ + List checkTemplateId(List supplier, TbsActivityTemplate template); + + /** + * 事故修复方法,替换原来的审批流程(仅支持无核销的审批) + * @param id + */ + String replaceApplySyData(String id); + + /** + * 获取致远data + * @param id + * @return + */ + Map getOAData(String id); + + /** + * 释放预算占用 + * @param costApplyId + * @param invalidFlag 1-释放;0-重新绑定 + */ + void releaseCost(Long costApplyId,Integer invalidFlag); + + /** + * 属性费用申请的审批的状态 + * @param costApplyId + */ + void flushCostApply(Long costApplyId); + + /** + * 刷新费用申请状态 + * 1.前提先刷新活动状态 + * 2.在释放费用和审批完成后调用 + * @param costApplyId + * @param isContractFlag 是否协议类 + */ + void flushCostStatus(Long costApplyId,boolean isContractFlag); + + /** + * 活动变动时调用,同步费用数据 + * @param costApplyId + */ + void flushAmtByAct(Long costApplyId); + + void buildMainData4ROI(TbsCostApply tbsCostApply, Map data); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostChangeInfoService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostChangeInfoService.java new file mode 100644 index 0000000..cbf3158 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostChangeInfoService.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsCostChangeInfo; +import java.util.List; + +/** + * 异动信息 服务接口 + * @author YenHex + * @date 2023-12-18 + */ +public interface TbsCostChangeInfoService extends IService { + + void compareToBuildChangeInfo(Long orgId,Long newId); + + List listByExtendCostApplyId(Long newId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostContractApplication.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostContractApplication.java new file mode 100644 index 0000000..1d5355c --- /dev/null +++ b/cms-modules/cms-system/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/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostContractService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostContractService.java new file mode 100644 index 0000000..bcabfaa --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostContractService.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsCostContract; + +/** + * 费用合同 服务接口 + * @author YenHex + * @date 2023-03-14 + */ +public interface TbsCostContractService extends IService { + + TbsCostContract getByCostApplyId(Long id); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostTodoService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostTodoService.java new file mode 100644 index 0000000..df1ee4c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostTodoService.java @@ -0,0 +1,21 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsCostTodo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 费用申请代办 服务接口 + * @author YenHex + * @date 2023-02-17 + */ +public interface TbsCostTodoService extends IService { + + List listByCostId(Long costId); + + List selectTbsCostTodoList(TbsCostTodo query); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostUnItemPolicyService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostUnItemPolicyService.java new file mode 100644 index 0000000..b15440a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostUnItemPolicyService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsCostUnItemPolicy; + +/** + * 预算费用明细 服务接口 + * @author YenHex + * @date 2023-02-24 + */ +public interface TbsCostUnItemPolicyService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostUnItemService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostUnItemService.java new file mode 100644 index 0000000..ea18c75 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsCostUnItemService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsCostUnItem; + +/** + * 无预算的费用明细 服务接口 + * @author YenHex + * @date 2023-02-02 + */ +public interface TbsCostUnItemService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleItemBudgetService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleItemBudgetService.java new file mode 100644 index 0000000..3c562f7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleItemBudgetService.java @@ -0,0 +1,55 @@ +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.*; +import com.qs.serve.modules.tbs.entity.so.TbsScheduleItemSearch; + +import java.time.LocalDate; +import java.util.List; + +/** + * 预算考核期项 服务接口 + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsScheduleItemBudgetService extends IService { + + List betweenDateList(LocalDate startDate,LocalDate endDate); + + @InterceptorIgnore(tenantLine = "true") + Long findUnMatchScheduleItemBySourceBudgetIdAndTargetBudgetId(Long sourceId,Long targetId); + + /** + * 获取预算的项使用情况 + * @param scheduleItemBudgetIds + * @return + */ + List listScheduleAmountByIds(List scheduleItemBudgetIds); + + /** + * 统计预算周期使用情况 + * @param budgetIdDtoList + * @return + */ + List listScheduleItemAmountByIds(List budgetIdDtoList); + + + /** + * 预算维度统计 + * @param param + * @return + */ + List listBudgetAmountByIds(TbsScheduleItemSearch param); + + /** + * 查询审批中的费用或政策 + * @param param + * @return + */ + List listBudgetCheckingAmount(TbsScheduleItemSearch param); + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleItemService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleItemService.java new file mode 100644 index 0000000..27f6521 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleItemService.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsScheduleItem; + +import java.util.List; + +/** + * 考核时间项 服务接口 + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsScheduleItemService extends IService { + + List listByScheduleId(Long id); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleService.java new file mode 100644 index 0000000..9bb179e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/TbsScheduleService.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.tbs.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.TbsSchedule; + +/** + * 考核期 服务接口 + * @author YenHex + * @date 2022-11-08 + */ +public interface TbsScheduleService extends IService { + + TbsSchedule getByName(String name); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityCenterGoodsServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityCenterGoodsServiceImpl.java new file mode 100644 index 0000000..7c5277b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityCenterGoodsServiceImpl.java @@ -0,0 +1,55 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.tbs.entity.TbsActivitySubject; +import com.qs.serve.modules.tbs.entity.dto.TbsActNotMatchAmtCenterGoods; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsActivityCenterGoods; +import com.qs.serve.modules.tbs.service.TbsActivityCenterGoodsService; +import com.qs.serve.modules.tbs.mapper.TbsActivityCenterGoodsMapper; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 活动成本中心配比项 服务实现类 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsActivityCenterGoodsServiceImpl extends ServiceImpl implements TbsActivityCenterGoodsService { + + @Override + public List listByActivityId(Long activityId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivityCenterGoods::getActivityId,activityId); + return this.list(lqw); + } + + @Override + public List listByCostApplyId(Long costApplyId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivityCenterGoods::getCostApplyId,costApplyId); + return this.list(lqw); + } + + @Override + public Map> listByActivityMap(List activityIds) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(TbsActivityCenterGoods::getActivityId,activityIds); + List activityCenterList = this.list(lqw); + return activityCenterList.stream().collect(Collectors.groupingBy(TbsActivityCenterGoods::getActivityId)); + } + + @Override + public List listNotMatchAmtCenterGoods(List costIds) { + return baseMapper.listNotMatchAmtCenterGoods(costIds); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityCenterServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityCenterServiceImpl.java new file mode 100644 index 0000000..e0d9baa --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityCenterServiceImpl.java @@ -0,0 +1,56 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsActivityCenter; +import com.qs.serve.modules.tbs.service.TbsActivityCenterService; +import com.qs.serve.modules.tbs.mapper.TbsActivityCenterMapper; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 活动成本中心项 服务实现类 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsActivityCenterServiceImpl extends ServiceImpl implements TbsActivityCenterService { + + @Override + public List listByActivity(Long activityId, Long subjectId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivityCenter::getActivityId,activityId); + lqw.eq(TbsActivityCenter::getSubjectId,subjectId); + return this.list(lqw); + } + + @Override + public List listByActivity(Long activityId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivityCenter::getActivityId,activityId); + return this.list(lqw); + } + + @Override + public Map> listByActivityMap(List activityIds) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(TbsActivityCenter::getActivityId,activityIds); + List activityCenterList = this.list(lqw); + return activityCenterList.stream().collect(Collectors.groupingBy(TbsActivityCenter::getActivityId)); + } + + @Override + public List listByCostApplyId(Long costApplyId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivityCenter::getCostApplyId,costApplyId); + return this.list(lqw); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityChannelPointServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityChannelPointServiceImpl.java new file mode 100644 index 0000000..0c7de16 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityChannelPointServiceImpl.java @@ -0,0 +1,32 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsActivityChannelPoint; +import com.qs.serve.modules.tbs.service.TbsActivityChannelPointService; +import com.qs.serve.modules.tbs.mapper.TbsActivityChannelPointMapper; + +import java.util.List; + +/** + * 活动网点项 服务实现类 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsActivityChannelPointServiceImpl extends ServiceImpl implements TbsActivityChannelPointService { + + @Override + public List listByActivityId(Long activityId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivityChannelPoint::getActivityId,activityId); + return this.list(lqw); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityChannelServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityChannelServiceImpl.java new file mode 100644 index 0000000..78606e0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityChannelServiceImpl.java @@ -0,0 +1,32 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsActivityChannel; +import com.qs.serve.modules.tbs.service.TbsActivityChannelService; +import com.qs.serve.modules.tbs.mapper.TbsActivityChannelMapper; + +import java.util.List; + +/** + * 活动渠道项 服务实现类 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsActivityChannelServiceImpl extends ServiceImpl implements TbsActivityChannelService { + + @Override + public List listByActivityId(Long activityId) { + LambdaQueryWrapper act4Channel = new LambdaQueryWrapper<>(); + act4Channel.eq(TbsActivityChannel::getActivityId,activityId); + return this.list(act4Channel); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityGoodsServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityGoodsServiceImpl.java new file mode 100644 index 0000000..ddb5bc5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityGoodsServiceImpl.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsActivityGoods; +import com.qs.serve.modules.tbs.service.TbsActivityGoodsService; +import com.qs.serve.modules.tbs.mapper.TbsActivityGoodsMapper; +import java.util.List; +/** + * 活动商品项 服务实现类 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsActivityGoodsServiceImpl extends ServiceImpl implements TbsActivityGoodsService { + + + @Override + public List listByCostApplyId(Long id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivityGoods::getCostApplyId,id); + return this.list(lqw); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityPayConditionServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityPayConditionServiceImpl.java new file mode 100644 index 0000000..4686bff --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityPayConditionServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsActivityPayCondition; +import com.qs.serve.modules.tbs.service.TbsActivityPayConditionService; +import com.qs.serve.modules.tbs.mapper.TbsActivityPayConditionMapper; + +/** + * 活动支付条件 服务实现类 + * @author YenHex + * @since 2023-05-10 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsActivityPayConditionServiceImpl extends ServiceImpl implements TbsActivityPayConditionService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java new file mode 100644 index 0000000..59e18a9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityServiceImpl.java @@ -0,0 +1,744 @@ +package com.qs.serve.modules.tbs.service.impl; + +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.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.consts.SysConfigKey; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.entity.*; +import com.qs.serve.modules.bms.mapper.BmsSubjectFormMapper; +import com.qs.serve.modules.bms.service.*; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.entity.dto.TbsCenterDto; +import com.qs.serve.modules.goods.service.GoodsCategoryService; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.sys.entity.SysConfig; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysConfigService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsActivityState; +import com.qs.serve.modules.tbs.common.TbsCenterType; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.bo.*; +import com.qs.serve.modules.tbs.entity.dto.TbsActivityAmtCheck; +import com.qs.serve.modules.tbs.mapper.*; +import com.qs.serve.modules.tbs.service.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.annotations.One; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 费用活动 服务实现类 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsActivityServiceImpl extends ServiceImpl implements TbsActivityService { + + private final TbsActivityPayConditionMapper activityPayConditionMapper; + private final TbsActivityGoodsService activityGoodsService; + private final TbsActivitySubjectService activitySubjectService; + private final TbsActivityCenterService activityCenterService; + private final TbsActivityCenterGoodsService activityCenterGoodsService; + private final TbsActivityChannelService activityChannelService; + private final TbsActivityChannelPointService activityChannelPointService; + private final TbsActivityChannelPointMapper tbsActivityChannelPointMapper; + private final TbsActivityTemplateMapper activityTemplateMapper; + private final TbsCostApplyMapper costApplyMapper; + private final TbsActivitySlottingFeeService activitySlottingFeeService; + private final TbsCenterDtoService tbsCenterDtoService; + private final TbsBudgetLogMapper tbsBudgetLogMapper; + + private final BmsSubjectFormMapper subjectFormMapper; + private final BmsSupplierService supplierService; + private final BmsSubjectService subjectService; + private final BmsChannelService channelService; + private final BmsChannelPointService channelPointService; + + private final GoodsSkuService goodsSkuService; + private final GoodsSpuService goodsSpuService; + private final GoodsCategoryService goodsCategoryService; + + private final SysConfigService configService; + + private final TbsActivityAmtCheckMapper activityAmtCheckMapper; + + @Override + public void initReopenState() { + LocalDate now = LocalDate.now(); + // 拓展已解冻的费用限制在三天内可核销,逾期自动冻结 + LocalDate closeDay = now.plusDays(-3); + // 将重新打开的,过期修复回为未重新打开 + LambdaQueryWrapper updReopen = new LambdaQueryWrapper<>(); + updReopen.eq(TbsActivity::getReopenFlag,1) + .lt(TbsActivity::getReopenTime, closeDay) + .eq(TbsActivity::getActivityState,0) + .eq(TbsActivity::getCostPassFlag,1); + TbsActivity updReopenParam = new TbsActivity(); + updReopenParam.setReopenFlag(0); + super.update(updReopenParam,updReopen); + } + + @Override + public void flushBandingState(List costApplyIds1) { + List> idsArray = CollUtil.split(costApplyIds1,1000); + for (List ids : idsArray) { + LocalDate now = LocalDate.now(); + LocalDate yesterday = now.plusDays(-1); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(TbsActivity::getCostApplyId, ids); + lqw.and(qw->{ + qw.and( + qw1->qw1.le(TbsActivity::getPreCheckDate, yesterday) + .isNull(TbsActivity::getPreEndDateBack) + ).or().le(TbsActivity::getPreEndDateBack, yesterday); + }); + // 排除重新打开的活动 + lqw.ne(TbsActivity::getReopenFlag,1); + // 2-完成;4-已释放;5-已关闭 表流程已完结,冻结无意义 + lqw.eq(TbsActivity::getActivityState,TbsActivityState.STATE_0_Todo); + //通过审批的 + lqw.eq(TbsActivity::getCostPassFlag,1); + TbsActivity param = new TbsActivity(); + param.setActivityState(TbsActivityState.STATE_1_Baning); + super.update(param,lqw); + } + } + + @Override + public void checkCenterGoods(boolean updateBudgetLog) { + + + List activityAmtCheckList = activityAmtCheckMapper.listByCostApplyId(274022L); + for (TbsActivityAmtCheck amtCheck : activityAmtCheckList) { + LambdaQueryWrapper centerGoodsLqw = new LambdaQueryWrapper<>(); + centerGoodsLqw.eq(TbsActivityCenterGoods::getActivityId,amtCheck.getActivityId()); + centerGoodsLqw.apply(" limit 1"); + TbsActivityCenterGoods centerGoods = activityCenterGoodsService.getOne(centerGoodsLqw); + centerGoods.setCenterGoodsAmount(centerGoods.getCenterGoodsAmount().add(amtCheck.getDiffAmount())); + activityCenterGoodsService.updateById(centerGoods); + + } + + } + + @Override + public List listByCostApplyId(Long id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivity::getCostApplyId,id); + //lqw.eq(TbsActivity::getActivityState, TbsActivityState.STATE_0_Todo); + return this.list(lqw); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void modify(TbsActivityBo activityBo) { + TbsCostApply costApply = costApplyMapper.selectById(activityBo.getCostApplyId()); + if(!costApply.getChargeState().equals(TbsCostApplyState.State_0_unPublish.getCode()) + &&!costApply.getChargeState().equals(TbsCostApplyState.State_4_refused.getCode())){ + Assert.throwEx("因费用状态不支持编辑!!"); + } + for (TbsActivitySubjectBo subjectBo : activityBo.getActivitySubjectList()) { + if(subjectBo.getAmount().compareTo(BigDecimal.ZERO)<0){ + Assert.throwEx("支出金额不可为负数"); + } + for (TbsActivitySubjectBo.ActivityCenterBo centerBo : subjectBo.getCenterList()) { + if(centerBo.getCenterRate().compareTo(BigDecimal.ZERO)<0){ + Assert.throwEx("成本中心占比不可为负数"); + } + } + } + if(activityBo.getId()==null&&costApply.getContractFlag().equals(1)){ + List tbsActivities = this.listByCostApplyId(costApply.getId()); + if(tbsActivities.size()>0){ + Assert.throwEx("协议类申请只能有一个活动"); + } + } + BmsSupplier supplier = supplierService.getById(costApply.getSupplierId()); + TbsActivity activity; + //活动总金额 + BigDecimal totalAmount = BigDecimal.ZERO; + for (TbsActivityCenterGoodsBo centerGoodsBo : activityBo.getActivityCenterGoodsList()) { + totalAmount = totalAmount.add(centerGoodsBo.getCenterGoodsAmount()); + } + if(activityBo.getId()!=null){ + activity = this.getById(activityBo.getId()); + if(activity==null){ + Assert.throwEx("活动不存在"); + } + activity.setUpdateTime(null); + activity.setAttachIds(null); + }else { + activity = CopierUtil.copy(activityBo,new TbsActivity()); + List activityList = listByCostApplyId(costApply.getId()); + int max = 0; + for (TbsActivity tbsActivity : activityList) { + try { + String[] tmls = tbsActivity.getActivityCode().split("_"); + String tml = tmls.length>1?tmls[1]:"0"; + Integer i = Integer.parseInt(tml); + if(i>max){ + max = i; + } + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + activity.setActivityCode(costApply.getCode()+"_"+(max+1)); + } + if(activityBo.getTemplateBudgetIds()!=null && activityBo.getTemplateBudgetIds().size()>0){ + String budgetIds = activityBo.getTemplateBudgetIds().stream() + .map(a->a.toString()).collect(Collectors.joining(",")); + activity.setTemplateBudgetIds(budgetIds); + } + activity.setTemplateTitle(activityBo.getTemplateTitle()); + activity.setActStartDate(activityBo.getActStartDate()); + activity.setActEndDate(activityBo.getActEndDate()); + activity.setPreStartDate(activityBo.getPreStartDate()); + activity.setPreEndDate(activityBo.getPreEndDate()); + activity.setPreCheckDate(activityBo.getPreCheckDate()); + activity.setTemplateId(activityBo.getTemplateId()); + activity.setTemplateValue(activityBo.getTemplateValue()); + activity.setSupplierId(Long.parseLong(supplier.getId())); + activity.setSupplierCode(supplier.getCode()); + activity.setSupplierName(supplier.getName()); + activity.setPreActFlag(activityBo.getPreActFlag()); + if(activityBo.getPreActFlag()==null||activityBo.getPreActFlag().equals(0)){ + activity.setPreActQuantity(BigDecimal.ZERO); + activity.setPreNotActQuantity(BigDecimal.ZERO); + }else { + activity.setPreActQuantity(activityBo.getPreActQuantity()); + activity.setPreNotActQuantity(activityBo.getPreNotActQuantity()); + } + activity.setAttachIds(activityBo.getAttachIds()); + activity.setPreRoiRate(activityBo.getPreRoiRate()); + activity.setActTitle(activityBo.getActTitle()); + boolean isUpdate = activity.getId()!=null; + activity.setTotalAmount(totalAmount); +// SysConfig sysConfig = configService.getByKey(SysConfigKey.ActivityPreCheckDays); +// Integer days = Integer.parseInt(sysConfig.getConfigValue()); +// LocalDate preDay = DateUtils.beSetDate(activity.getActEndDate(),days); +// activity.setPreCheckDate(preDay); + this.saveOrUpdate(activity); + + //协议类更新付款条件绑定活动ID + if(costApply.getContractFlag().equals(1)){ + List conditions = activityPayConditionMapper.selectList( + new LambdaQueryWrapper() + .eq(TbsActivityPayCondition::getCostApplyId,activity.getCostApplyId()) + ); + for (TbsActivityPayCondition condition : conditions) { + condition.setActivityId(activity.getId()); + activityPayConditionMapper.updateById(condition); + } + } + + //统计费用信息 + this.updateCostTotal(costApply.getId()); + if(isUpdate){ + //删除旧数据 + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("activity_id",activity.getId()); + activityCenterService.remove(qw); + activityCenterGoodsService.remove(qw); + activityChannelService.remove(qw); + activityChannelPointService.remove(qw); + activityGoodsService.remove(qw); + activitySubjectService.remove(qw); + activitySlottingFeeService.remove(qw); + } + //产品详情 + List activityGoodsList = this.buildActGoodsList(activityBo,costApply.getId(),activity.getId()); + //费用详情 + Map subjectMap = new HashMap<>(); + List activitySubjects = new ArrayList<>(); + List activityCenterList = new ArrayList<>(); + Map centerDtoMap = new HashMap<>(); + this.initSubjectAndCenter(activityBo,subjectMap,centerDtoMap,activitySubjects,activityCenterList,costApply.getId(),activity.getId()); + //产品成本配占比 + List activityCenterGoodsList = new ArrayList<>(); + this.initCenterGoods(activityBo,subjectMap,centerDtoMap,activityGoodsList,activityCenterGoodsList,costApply.getId(),activity,supplier); + //校验金额和比率 + Map> actCenterGoodsMap = activityCenterGoodsList.stream().collect(Collectors.groupingBy(TbsActivityCenterGoods::getSubjectId)); + for (Long subjectId : actCenterGoodsMap.keySet()) { + List actCenterGoodsList = actCenterGoodsMap.get(subjectId); + BigDecimal rate = BigDecimal.ZERO; + for (TbsActivityCenterGoods centerGoods : actCenterGoodsList) { + if(rate.compareTo(BigDecimal.ZERO)>=0){ + rate = rate.add(centerGoods.getCenterGoodsRate()); + } + } + BigDecimal tmp = rate.divide(new BigDecimal(100)); + if(tmp.compareTo(new BigDecimal(tmp.longValue()))!=0){ + Assert.throwEx("成本中心与商品分配比例有误"); + } + } + //客户详情 + List activityChannelPointList = new ArrayList<>(); + List activityChannelList = new ArrayList<>(); + this.initChannelsAndSave(activityBo,costApply,activity,activityChannelList,activityChannelPointList); + //设置进程费 + List slottingFeeList = new ArrayList<>(); + this.buildSlottingFeeList(costApply, activity, activityGoodsList, activitySubjects, activityChannelPointList, activityChannelList, slottingFeeList); + List> slottingFeeSplitList = CollUtil.split(slottingFeeList,500); + for (List activitySlottingFeeList : slottingFeeSplitList) { + activitySlottingFeeService.saveBatch(activitySlottingFeeList); + } + //渠道网点 + if(activityChannelList.size()>0){ + activityChannelService.saveBatch(activityChannelList); + } + if(activityChannelPointList.size()>0){ + activityChannelPointService.saveBatch(activityChannelPointList); + } + Long actId = tbsActivityChannelPointMapper.checkSubjectPoint(activity.getId()); + if(actId!=null){ + Assert.throwEx("活动["+activity.getActivityCode() + "]因科目类型,必须选网点"); + } + //保存 + activityGoodsService.saveBatch(activityGoodsList); + activitySubjectService.saveBatch(activitySubjects); + activityCenterService.saveBatch(activityCenterList); + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + if(centerGoods.getCenterGoodsRate().compareTo(BigDecimal.ZERO)<0){ + Assert.throwEx("成本中心与商品分配比例有误,请重新检测商品比例"); + } + } + activityCenterGoodsService.saveBatch(activityCenterGoodsList); + } + + private void buildSlottingFeeList(TbsCostApply costApply, TbsActivity activity, List activityGoodsList, List activitySubjects, List activityChannelPointList, List activityChannelList, List slottingFeeList) { + if(!costApply.getContractFlag().equals(2)){ + return; + } + for (TbsActivitySubject activitySubject : activitySubjects) { + //判断是否进场费科目 + if(activityChannelList.size()>0){ + List channelIds = activityChannelList.stream().map(TbsActivityChannel::getChannelId).collect(Collectors.toList()); + LambdaQueryWrapper pointLqw = new LambdaQueryWrapper<>(); + pointLqw.in(BmsChannelPoint::getChannelId,channelIds); + List pointList = channelPointService.list(pointLqw); + for (BmsChannelPoint channelPoint : pointList) { + for (TbsActivityGoods activityGoods : activityGoodsList) { + TbsActivitySlottingFee slottingFee = new TbsActivitySlottingFee(); + slottingFee.setCostApplyId(costApply.getId()); + slottingFee.setActivityId(activity.getId()); + slottingFee.setTargetType(activityGoods.getTargetType()); + slottingFee.setTargetId(activityGoods.getTargetId()); + slottingFee.setTargetCode(activityGoods.getTargetCode()); + slottingFee.setTargetName(activityGoods.getTargetName()); + slottingFee.setTargetLevelPathIds(activityGoods.getTargetLevelPathIds()); + slottingFee.setTargetLevelPathNames(activityGoods.getTargetLevelPathNames()); + slottingFee.setChannelId(channelPoint.getChannelId()); + slottingFee.setChannelCode(channelPoint.getChannelCode()==null ? "" : channelPoint.getChannelCode()); + slottingFee.setChannelName(channelPoint.getChannelName()); + slottingFee.setPointId(channelPoint.getId()); + slottingFee.setPointCode(channelPoint.getPointCode()); + slottingFee.setPointName(channelPoint.getPointName()); + slottingFee.setSubjectId(activitySubject.getSubjectId()); + slottingFee.setSubjectCode(activitySubject.getSubjectCode()); + slottingFee.setSubjectName(activitySubject.getSubjectName()); + slottingFeeList.add(slottingFee); + } + } + } + if(activityChannelPointList.size() > 0){ + for (TbsActivityChannelPoint channelPoint : activityChannelPointList) { + for (TbsActivityGoods activityGoods : activityGoodsList) { + TbsActivitySlottingFee slottingFee = new TbsActivitySlottingFee(); + slottingFee.setCostApplyId(costApply.getId()); + slottingFee.setActivityId(activity.getId()); + slottingFee.setTargetType(activityGoods.getTargetType()); + slottingFee.setTargetId(activityGoods.getTargetId()); + slottingFee.setTargetCode(activityGoods.getTargetCode()); + slottingFee.setTargetName(activityGoods.getTargetName()); + slottingFee.setTargetLevelPathIds(activityGoods.getTargetLevelPathIds()); + slottingFee.setTargetLevelPathNames(activityGoods.getTargetLevelPathNames()); + slottingFee.setChannelId(channelPoint.getChannelId()); + slottingFee.setChannelCode(channelPoint.getChannelCode()); + slottingFee.setChannelName(channelPoint.getChannelName()); + slottingFee.setPointId(channelPoint.getPointId()); + slottingFee.setPointCode(channelPoint.getPointCode()); + slottingFee.setPointName(channelPoint.getPointName()); + slottingFee.setSubjectId(activitySubject.getSubjectId()); + slottingFee.setSubjectCode(activitySubject.getSubjectCode()); + slottingFee.setSubjectName(activitySubject.getSubjectName()); + slottingFeeList.add(slottingFee); + } + } + } + } + } + + /** + * 更新活动数量、总金额到费用申请 + * @param costApplyId + */ + private void updateCostTotal(Long costApplyId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(TbsActivity::getTotalAmount, + TbsActivity::getPreActQuantity, + TbsActivity::getPreNotActQuantity); + lqw.eq(TbsActivity::getCostApplyId,costApplyId); + List activityList = list(lqw); + BigDecimal totalCostAmount = BigDecimal.ZERO; + BigDecimal totalCostAmount2 = BigDecimal.ZERO; + BigDecimal totalCostAmount3 = BigDecimal.ZERO; + for (TbsActivity tbsActivity : activityList) { + totalCostAmount = totalCostAmount.add(tbsActivity.getTotalAmount()); + totalCostAmount2 = totalCostAmount2.add(tbsActivity.getPreActQuantity()); + totalCostAmount3 = totalCostAmount3.add(tbsActivity.getPreNotActQuantity()); + } + TbsCostApply costApplyParam = new TbsCostApply(); + costApplyParam.setId(costApplyId); + costApplyParam.setTotalActivity(activityList.size()); + costApplyParam.setTotalActivityAmount(totalCostAmount); + costApplyParam.setTotalActivityPreAmount(totalCostAmount2); + costApplyParam.setTotalActivityPreNotAmount(totalCostAmount3); + costApplyMapper.updateById(costApplyParam); + } + + /** + * 初始化渠道和网点 + * @param activityBo + * @param costApply + * @param activity + * @param activityChannelList + * @param activityChannelPointList + */ + private void initChannelsAndSave(TbsActivityBo activityBo,TbsCostApply costApply,TbsActivity activity, + List activityChannelList, + List activityChannelPointList){ + if(CollectionUtil.isNotEmpty(activityBo.getActivityChannelList())){ + Set channelIds = new HashSet<>(); + for (TbsActivityChannelBo activityChannelBo : activityBo.getActivityChannelList()) { + //排除重复 + boolean existChannelIds = channelIds.stream().anyMatch(a->a.equals(activityChannelBo.getChannelId())); + if(existChannelIds){ + continue; + } + channelIds.add(activityChannelBo.getChannelId()); + BmsChannel channel = channelService.getById(activityChannelBo.getChannelId()); + TbsActivityChannel activityChannel = new TbsActivityChannel(); + activityChannel.setActivityId(activity.getId()); + activityChannel.setCostApplyId(costApply.getId()); + activityChannel.setChannelId(channel.getId()); + activityChannel.setChannelCode(channel.getChannelCode()); + activityChannel.setChannelName(channel.getChannelName()); + activityChannel.setChannelRate(activityChannelBo.getChannelRate()); + activityChannel.setPreCountPoint(activityChannelBo.getPreCountPoint()); + activityChannel.setRemark(activityChannelBo.getRemark()); + activityChannel.setTmpUk(activityChannelBo.getTmpUk()); + activityChannelList.add(activityChannel); + } + }else if(CollectionUtil.isNotEmpty(activityBo.getActivityPointList())){ + Set channelPointIds = new HashSet<>(); + for (TbsActivityChannelPointBo activityChannelPointBo : activityBo.getActivityPointList()) { + BmsChannelPoint channelPoint = channelPointService.getById(activityChannelPointBo.getPointId()); + if(channelPoint==null){ + Assert.throwEx("部分网点不存在或已停用"); + } + BmsChannel channel = channelService.getById(channelPoint.getChannelId()); + if(channel==null){ + Assert.throwEx("渠道["+channelPoint.getChannelCode()+"]不存在或已停用"); + } + + if(channel.getId().equals(activity.getSupplierId())){ + Assert.throwEx("请检查活动网点数据"); + } + //排除重复 + boolean existChannelPointIds = channelPointIds.stream().anyMatch(a->a.equals(activityChannelPointBo.getPointId())); + if(existChannelPointIds){ + continue; + } + channelPointIds.add(activityChannelPointBo.getPointId()); + + TbsActivityChannelPoint activityChannelPoint = new TbsActivityChannelPoint(); + activityChannelPoint.setCostApplyId(costApply.getId()); + activityChannelPoint.setActivityId(activity.getId()); + activityChannelPoint.setChannelId(channel.getId()); + activityChannelPoint.setChannelCode(channel.getChannelCode()); + activityChannelPoint.setChannelName(channel.getChannelName()); + activityChannelPoint.setPointId(channelPoint.getId()); + activityChannelPoint.setPointCode(channelPoint.getPointCode()); + activityChannelPoint.setPointName(channelPoint.getPointName()); + activityChannelPoint.setPointRate(activityChannelPointBo.getPointRate()); + activityChannelPoint.setRemark(activityChannelPointBo.getRemark()); + activityChannelPoint.setTmpUk(activityChannelPointBo.getTmpUk()); + activityChannelPointList.add(activityChannelPoint); + } + } + } + + /** + * 初始化产品成本配占比 + * @param activityBo + * @param subjectMap + * @param centerDtoMap + * @param activityGoodsList + * @param activityCenterGoodsList + * @param costApplyId + * @param activity + */ + public void initCenterGoods(TbsActivityBo activityBo, + Map subjectMap, + Map centerDtoMap, + List activityGoodsList, + List activityCenterGoodsList, + Long costApplyId,TbsActivity activity,BmsSupplier supplier){ + for (int i = 0; i < activityBo.getActivityCenterGoodsList().size(); i++) { + TbsActivityCenterGoodsBo centerGoodsBo = activityBo.getActivityCenterGoodsList().get(i); + BmsSubject subject = subjectMap.get(centerGoodsBo.getSubjectId()); + TbsActivityCenterGoods centerGoods = new TbsActivityCenterGoods(); + centerGoods.setSupplierId(Long.parseLong(supplier.getId())); + centerGoods.setSupplierCode(supplier.getCode()); + centerGoods.setSupplierName(supplier.getName()); + centerGoods.setCenterGoodsCode(activity.getActivityCode()+"_"+(i+1)); + centerGoods.setTmpUk(centerGoodsBo.getTmpUk()); + //设置成本中心 + String key = centerGoodsBo.getCenterType()+":"+centerGoodsBo.getCenterId(); + TbsCenterDto tbsCenterDto = centerDtoMap.get(key); + centerGoods.setActivityId(activity.getId()); + centerGoods.setActivityCode(activity.getActivityCode()); + centerGoods.setCostApplyId(costApplyId); + centerGoods.setCenterType(centerGoodsBo.getCenterType()); + centerGoods.setCenterId(centerGoodsBo.getCenterId()); + if(tbsCenterDto==null){ + Assert.throwEx("部分成本中心不存在或被移除"); + } + centerGoods.setCenterCode(tbsCenterDto.getCenterCode()); + centerGoods.setCenterName(tbsCenterDto.getCenterName()); + for (TbsActivitySubjectBo subjectBo : activityBo.getActivitySubjectList()) { + if(subject.getId().equals(subjectBo.getSubjectId())){ + for (TbsActivitySubjectBo.ActivityCenterBo centerBo : subjectBo.getCenterList()) { + if(centerBo.getCenterType().equals(tbsCenterDto.getCenterType())&¢erBo.getCenterId().equals(tbsCenterDto.getId())){ + centerGoods.setCenterRate(centerBo.getCenterRate()); + centerGoods.setCenterAmount(centerBo.getCenterAmount()); + centerGoods.setOrgCenterAmount(centerBo.getCenterAmount()); + break; + } + } + } + } + //设置科目 + centerGoods.setCostApplyId(costApplyId); + centerGoods.setActivityId(activity.getId()); + centerGoods.setSubjectId(subject.getId()); + centerGoods.setSubjectCode(subject.getSubjectCode()); + centerGoods.setSubjectName(subject.getSubjectName()); + centerGoods.setCenterGoodsAmount(centerGoodsBo.getCenterGoodsAmount()); + centerGoods.setOrgCenterGoodsAmount(centerGoods.getCenterGoodsAmount()); + centerGoods.setCenterGoodsRate(centerGoodsBo.getCenterGoodsRate()); + //设置活动时间 + centerGoods.setActEndDate(activity.getActEndDate()); + centerGoods.setActStartDate(activity.getActStartDate()); + centerGoods.setPreEndDate(activity.getPreEndDate()); + centerGoods.setPreStartDate(activity.getPreStartDate()); + centerGoods.setPreCheckDate(activity.getPreCheckDate()); + + //设置商品 + Long cenTarId = centerGoodsBo.getTargetId(); + String cenTarType = centerGoodsBo.getTargetType(); + for (TbsActivityGoods activityGoods : activityGoodsList) { + Long actTarId = activityGoods.getTargetId(); + String actTarType = activityGoods.getTargetType(); + if(actTarId.equals(cenTarId)&&cenTarType.equals(actTarType)){ + centerGoods.setTargetId(activityGoods.getTargetId()); + centerGoods.setTargetType(activityGoods.getTargetType()); + centerGoods.setTargetCode(activityGoods.getTargetCode()); + centerGoods.setTargetName(activityGoods.getTargetName()); + centerGoods.setTargetLevelPathIds(activityGoods.getTargetLevelPathIds()); + centerGoods.setTargetLevelPathNames(activityGoods.getTargetLevelPathNames()); + break; + } + } + if(StringUtils.hasEmpty(centerGoods.getTargetLevelPathIds())){ + Assert.throwEx("商品数据无法匹配"); + } + activityCenterGoodsList.add(centerGoods); + } + } + + /** + * 初始化科目和成本中心 + * @param activityBo + * @param subjectMap + * @param centerDtoMap + * @param activitySubjects + * @param activityCenterList + * @param costApplyId + * @param activityId + */ + public void initSubjectAndCenter(TbsActivityBo activityBo, + Map subjectMap, + Map centerDtoMap, + List activitySubjects, + List activityCenterList, + Long costApplyId,Long activityId){ + + List existKeyList = new ArrayList<>(); + + for (TbsActivitySubjectBo subjectBo : activityBo.getActivitySubjectList()) { + boolean existChilds = subjectService.count(new LambdaQueryWrapper().eq(BmsSubject::getPid,subjectBo.getSubjectId()))>0; + if(existChilds){ + Assert.throwEx("部分科目不符合规范,请选择最后一级科目"); + } + BmsSubject subject = subjectService.getById(subjectBo.getSubjectId()); + if(subject==null){ + Assert.throwEx("部分科目不存在了,请重新编辑"); + } + subjectMap.put(subject.getId(),subject); + TbsActivitySubject activitySubject = new TbsActivitySubject(); + activitySubject.setTmpUk(subjectBo.getTmpUk()); + activitySubject.setCostApplyId(costApplyId); + activitySubject.setActivityId(activityId); + activitySubject.setSubjectId(subject.getId()); + activitySubject.setSubjectCode(subject.getSubjectCode()); + activitySubject.setSubjectName(subject.getSubjectName()); + activitySubject.setAmount(subjectBo.getAmount()); + activitySubject.setCountSession(subjectBo.getCountSession()); + activitySubject.setCountPerson(subjectBo.getCountPerson()); + activitySubject.setRemark(subjectBo.getRemark()); + activitySubject.setSubjectFormId(subjectBo.getSubjectFormId()); + activitySubject.setSubjectFormTitle(subjectBo.getSubjectFormTitle()); + activitySubject.setSubjectFormContext(subjectBo.getSubjectFormContext()); + activitySubject.setSubjectFormValue(subjectBo.getSubjectFormValue()); + activitySubject.setSlottingFlag(subject.getSlottingFlag()); + activitySubjects.add(activitySubject); + BigDecimal totalAmount = BigDecimal.ZERO; + BigDecimal totalRate = BigDecimal.ZERO; + + for (TbsActivitySubjectBo.ActivityCenterBo centerBo : subjectBo.getCenterList()) { + TbsActivityCenter activityCenter = new TbsActivityCenter(); + activityCenter.setCostApplyId(costApplyId); + activityCenter.setActivityId(activityId); + activityCenter.setSubjectId(subjectBo.getSubjectId()); + activityCenter.setCenterRate(centerBo.getCenterRate()); + activityCenter.setCenterAmount(centerBo.getCenterAmount()); + activityCenter.setOrgCenterAmount(centerBo.getCenterAmount()); + activityCenter.setCenterType(centerBo.getCenterType()); + totalAmount = totalAmount.add(centerBo.getCenterAmount()); + if(centerBo.getCenterRate().compareTo(BigDecimal.ZERO)<0){ + Assert.throwEx("成本中心费用配比有误"); + } + totalRate = totalRate.add(centerBo.getCenterRate()); + activityCenter.setCenterId(centerBo.getCenterId()); + String centerType = centerBo.getCenterType(); + String centerId = centerBo.getCenterId(); + String key = centerType+":"+centerId; + TbsCenterDto tbsCenterDto = centerDtoMap.get(key); + if(tbsCenterDto==null){ + tbsCenterDto = tbsCenterDtoService.getCenterDto(centerType,centerId); + if(tbsCenterDto==null){ + Assert.throwEx("部分成本中心不存在了,请重新编辑"); + } + tbsCenterDto.setCenterRate(centerBo.getCenterRate()); + tbsCenterDto.setCenterAmount(centerBo.getCenterAmount()); + centerDtoMap.put(key,tbsCenterDto); + } + activityCenter.setCenterName(tbsCenterDto.getCenterName()); + activityCenter.setCenterCode(tbsCenterDto.getCenterCode()); + activityCenter.setTmpUk(centerBo.getTmpUk()); + activityCenterList.add(activityCenter); + } + if(activitySubject.getAmount().compareTo(totalAmount)!=0){ + Assert.throwEx("成本中心费用入参有误"); + } + if(totalRate.compareTo(new BigDecimal(100))!=0){ + Assert.throwEx("成本中心费用配比有误"); + } + } + } + + /** + * 建立活动商品 + * @param activityBo + * @param costApplyId + * @param activityId + * @return + */ + public List buildActGoodsList(TbsActivityBo activityBo,Long costApplyId,Long activityId){ + List activityGoodsList = new ArrayList<>(); + String goodsType = activityBo.getActivityGoodsType(); + if(goodsType.equals(TbsGoodsType.spu.name())){ + for (TbsActivityGoodsBo goodsBo : activityBo.getActivityGoodsList()) { + GoodsSpu goodsSpu = goodsSpuService.getById(goodsBo.getGoodsId()); + GoodsCategory category1 = goodsCategoryService.getById(goodsSpu.getCategoryFirst()); + GoodsCategory category2 = goodsCategoryService.getById(goodsSpu.getCategorySecond()); + GoodsCategory category3 = goodsCategoryService.getById(goodsSpu.getCategoryThird()); + TbsActivityGoods activityGoods = new TbsActivityGoods(); + activityGoods.setCostApplyId(costApplyId); + activityGoods.setActivityId(activityId); + activityGoods.setTargetType(goodsType); + activityGoods.setTargetId(goodsSpu.getId()); + activityGoods.setTargetCode(goodsSpu.getSpuCode()); + activityGoods.setTargetName(goodsSpu.getName()); + activityGoods.setTargetLevelPathIds(category1.getId()+"_"+category2.getId()+"_"+category3.getId()+"_"+goodsSpu.getId()); + activityGoods.setTargetLevelPathNames(category1.getName()+"_"+category2.getName()+"_"+category3.getName()+"_"+goodsSpu.getName()); + activityGoods.setTmpUk(goodsBo.getTmpUk()); + activityGoods.setRemark(goodsBo.getRemark()); + activityGoodsList.add(activityGoods); + } + }else if (goodsType.equals(TbsGoodsType.sku.name())){ + for (TbsActivityGoodsBo goodsBo : activityBo.getActivityGoodsList()) { + GoodsSku sku = goodsSkuService.getById(goodsBo.getGoodsId()); + GoodsSpu goodsSpu = goodsSpuService.getById(sku.getSpuId()); + GoodsCategory category1 = goodsCategoryService.getById(goodsSpu.getCategoryFirst()); + GoodsCategory category2 = goodsCategoryService.getById(goodsSpu.getCategorySecond()); + GoodsCategory category3 = goodsCategoryService.getById(goodsSpu.getCategoryThird()); + TbsActivityGoods activityGoods = new TbsActivityGoods(); + activityGoods.setCostApplyId(costApplyId); + activityGoods.setActivityId(activityId); + activityGoods.setTargetType(goodsType); + activityGoods.setTargetId(sku.getId()); + activityGoods.setTargetCode(sku.getSkuCode()); + //activityGoods.setTargetName(goodsSpu.getName()+"("+sku.getSpecInfos()+")"); + activityGoods.setTargetName(sku.getSpecInfos()); + activityGoods.setTargetLevelPathIds(category1.getId()+"_"+category2.getId()+"_"+category3.getId()+"_"+goodsSpu.getId()+"_"+sku.getId()); + activityGoods.setTargetLevelPathNames(category1.getName()+"_"+category2.getName()+"_"+category3.getName()+"_"+goodsSpu.getName()+"_"+sku.getSpecInfos()); + activityGoods.setTmpUk(goodsBo.getTmpUk()); + activityGoods.setRemark(goodsBo.getRemark()); + activityGoodsList.add(activityGoods); + } + }else { + //品牌、品类、系列 + for (TbsActivityGoodsBo goodsBo : activityBo.getActivityGoodsList()) { + GoodsCategory category = goodsCategoryService.getById(goodsBo.getGoodsId()); + TbsActivityGoods activityGoods = new TbsActivityGoods(); + activityGoods.setCostApplyId(costApplyId); + activityGoods.setActivityId(activityId); + activityGoods.setTargetType(goodsType); + activityGoods.setTargetId(category.getId()); + activityGoods.setTargetCode(category.getCode()); + activityGoods.setTargetName(category.getName()); + activityGoods.setTargetLevelPathIds(category.getLevelPath()); + activityGoods.setTargetLevelPathNames(category.getLevelPathNames()); + activityGoods.setTmpUk(goodsBo.getTmpUk()); + activityGoods.setRemark(goodsBo.getRemark()); + activityGoodsList.add(activityGoods); + } + } + return activityGoodsList; + } + + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivitySlottingFeeServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivitySlottingFeeServiceImpl.java new file mode 100644 index 0000000..1997932 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivitySlottingFeeServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsActivitySlottingFee; +import com.qs.serve.modules.tbs.service.TbsActivitySlottingFeeService; +import com.qs.serve.modules.tbs.mapper.TbsActivitySlottingFeeMapper; + +/** + * 活动进场费 服务实现类 + * @author YenHex + * @since 2023-06-26 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsActivitySlottingFeeServiceImpl extends ServiceImpl implements TbsActivitySlottingFeeService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivitySubjectServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivitySubjectServiceImpl.java new file mode 100644 index 0000000..6af82ff --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivitySubjectServiceImpl.java @@ -0,0 +1,49 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.tbs.entity.TbsActivityCenter; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsActivitySubject; +import com.qs.serve.modules.tbs.service.TbsActivitySubjectService; +import com.qs.serve.modules.tbs.mapper.TbsActivitySubjectMapper; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 活动科目项 服务实现类 + * @author YenHex + * @since 2022-11-09 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsActivitySubjectServiceImpl extends ServiceImpl implements TbsActivitySubjectService { + + @Override + public List listByActivityId(Long activityId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivitySubject::getActivityId,activityId); + return this.list(lqw); + } + + @Override + public Map> listByActivityMap(List activityIds) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(TbsActivitySubject::getActivityId,activityIds); + List activityCenterList = this.list(lqw); + return activityCenterList.stream().collect(Collectors.groupingBy(TbsActivitySubject::getActivityId)); + } + + @Override + public List listByCostApplyId(Long activityId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivitySubject::getCostApplyId,activityId); + return this.list(lqw); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivitySubjectYarnServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivitySubjectYarnServiceImpl.java new file mode 100644 index 0000000..3dff482 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivitySubjectYarnServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsActivitySubjectYarn; +import com.qs.serve.modules.tbs.service.TbsActivitySubjectYarnService; +import com.qs.serve.modules.tbs.mapper.TbsActivitySubjectYarnMapper; + +/** + * 活动科目审批线 服务实现类 + * @author YenHex + * @since 2023-08-03 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsActivitySubjectYarnServiceImpl extends ServiceImpl implements TbsActivitySubjectYarnService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityTemplateLogServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityTemplateLogServiceImpl.java new file mode 100644 index 0000000..6eace50 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityTemplateLogServiceImpl.java @@ -0,0 +1,41 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplate; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplateLog; +import com.qs.serve.modules.tbs.service.TbsActivityTemplateLogService; +import com.qs.serve.modules.tbs.mapper.TbsActivityTemplateLogMapper; + +/** + * 活动模板 服务实现类 + * @author YenHex + * @since 2023-01-05 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsActivityTemplateLogServiceImpl extends ServiceImpl implements TbsActivityTemplateLogService { + + + @Override + public TbsActivityTemplateLog toLog(TbsActivityTemplate template, Integer optState) { + if(template==null){return null;} + TbsActivityTemplateLog templateLog = new TbsActivityTemplateLog(); + templateLog.setId(null); + templateLog.setTemplateId(template.getId()); + templateLog.setTemplateName(template.getTemplateName()); + templateLog.setTemplateValue(template.getTemplateValue()); + templateLog.setSaleRegionFlag(template.getSaleRegionFlag()); + templateLog.setBizRegionFlag(template.getBizRegionFlag()); + templateLog.setRemark(template.getRemark()); + //templateLog.setStartTime(template.getStartTime()); + //templateLog.setEndTime(template.getEndTime()); + templateLog.setOptionState(optState); + return templateLog; + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityTemplateRegionServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityTemplateRegionServiceImpl.java new file mode 100644 index 0000000..615381b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityTemplateRegionServiceImpl.java @@ -0,0 +1,68 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplate; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplateRegion; +import com.qs.serve.modules.tbs.service.TbsActivityTemplateRegionService; +import com.qs.serve.modules.tbs.mapper.TbsActivityTemplateRegionMapper; + +import java.util.ArrayList; +import java.util.List; +/** + * 活动模板区域 服务实现类 + * @author YenHex + * @since 2022-11-29 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsActivityTemplateRegionServiceImpl extends ServiceImpl implements TbsActivityTemplateRegionService { + + private final BmsSupplierService supplierService; + + @Override + public List getTemplateIds(String supplierId,List ignoreTemplateIds){ + List saleRegionIds = new ArrayList<>(); + List bizRegionIds = new ArrayList<>(); + BmsSupplier supplier = supplierService.getById(supplierId); + if(supplier.getRegionFirst()!=null){ saleRegionIds.add(supplier.getRegionFirst()); } + if(supplier.getRegionSecond()!=null){ saleRegionIds.add(supplier.getRegionSecond()); } + if(supplier.getRegionThird()!=null){ saleRegionIds.add(supplier.getRegionThird()); } + if(supplier.getRegionFourthly()!=null){ saleRegionIds.add(supplier.getRegionFourthly()); } + if(supplier.getRegion2First()!=null){ bizRegionIds.add(supplier.getRegion2First()); } + if(supplier.getRegion2Second()!=null){ bizRegionIds.add(supplier.getRegion2Second()); } + if(supplier.getRegion2Third()!=null){ bizRegionIds.add(supplier.getRegion2Third()); } + if(supplier.getRegion2Fourthly()!=null){ bizRegionIds.add(supplier.getRegion2Fourthly()); } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + if(CollectionUtil.isNotEmpty(ignoreTemplateIds)){ + lqw.notIn(TbsActivityTemplateRegion::getTemplateId,ignoreTemplateIds); + } + if(CollectionUtil.isNotEmpty(saleRegionIds) && bizRegionIds.size()==0 ){ + lqw.eq(TbsActivityTemplateRegion::getType,"sale") + .in(TbsActivityTemplateRegion::getRegionId,saleRegionIds); + }else if(CollectionUtil.isNotEmpty(bizRegionIds) && saleRegionIds.size()==0 ){ + lqw.eq(TbsActivityTemplateRegion::getType,"biz") + .in(TbsActivityTemplateRegion::getRegionId,bizRegionIds); + }else if (CollectionUtil.isNotEmpty(saleRegionIds)&&CollectionUtil.isNotEmpty(bizRegionIds)){ + lqw.and( + a1->a1.eq(TbsActivityTemplateRegion::getType,"sale") + .in(TbsActivityTemplateRegion::getRegionId,saleRegionIds) + ).or().and( + a1->a1.eq(TbsActivityTemplateRegion::getType,"biz") + .in(TbsActivityTemplateRegion::getRegionId,bizRegionIds) + ); + }else { + return new ArrayList<>(); + } + return this.list(lqw); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityTemplateServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityTemplateServiceImpl.java new file mode 100644 index 0000000..ea00939 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsActivityTemplateServiceImpl.java @@ -0,0 +1,153 @@ +package com.qs.serve.modules.tbs.service.impl; + +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.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.service.BmsRegion2Service; +import com.qs.serve.modules.bms.service.BmsRegionService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplateLog; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplateRegion; +import com.qs.serve.modules.tbs.entity.bo.TbsActivityTemplateBo; +import com.qs.serve.modules.tbs.service.TbsActivityTemplateLogService; +import com.qs.serve.modules.tbs.service.TbsActivityTemplateRegionService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsActivityTemplate; +import com.qs.serve.modules.tbs.service.TbsActivityTemplateService; +import com.qs.serve.modules.tbs.mapper.TbsActivityTemplateMapper; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 活动模板 服务实现类 + * @author YenHex + * @since 2022-11-29 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsActivityTemplateServiceImpl extends ServiceImpl implements TbsActivityTemplateService { + + private final TbsActivityTemplateRegionService templateRegionService; + private final BmsRegionService saleRegionService; + private final BmsRegion2Service bizRegionService; + private final TbsActivityTemplateLogService activityTemplateLogService; + private final SysUserMapper sysUserMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public TbsActivityTemplate modify(TbsActivityTemplateBo templateBo) { + if(templateBo.getStartTime()!=null&&templateBo.getEndTime()!=null){ + if(templateBo.getStartTime().isAfter(templateBo.getEndTime())){ + Assert.throwEx("启停时间异常"); + } + } + TbsActivityTemplate template = CopierUtil.copy(templateBo,new TbsActivityTemplate()); + String userId = AuthContextUtils.getSysUserId(); + SysUser sysUser = sysUserMapper.selectById(userId); + template.setUserId(userId); + template.setUserCode(sysUser.getCode()); + template.setUserName(sysUser.getName()); + this.saveOrUpdate(template); + if(templateBo.getId()!=null){ + TbsActivityTemplate templateDb = this.getById(template.getId()); + TbsActivityTemplateLog templateLog = activityTemplateLogService.toLog(templateDb,3); + activityTemplateLogService.save(templateLog); + } + //移除历史 + if(templateBo.getBizRegionFlag()!=null&&templateBo.getSaleRegionFlag()!=null){ + LambdaQueryWrapper rmRegion = new LambdaQueryWrapper<>(); + rmRegion.eq(TbsActivityTemplateRegion::getTemplateId,template.getId()); + templateRegionService.remove(rmRegion); + //保存区域 + List templateRegionList = new ArrayList<>(); + if(templateBo.getSaleRegionFlag() != null && templateBo.getSaleRegionFlag().equals(1) + && CollectionUtil.isNotEmpty(templateBo.getSaleRegionIds())){ + List saleRegionList = saleRegionService.listByIds(templateBo.getSaleRegionIds()); + List templateRegions = saleRegionList.stream().map(reg->{ + TbsActivityTemplateRegion templateRegion = new TbsActivityTemplateRegion(); + templateRegion.setTemplateId(template.getId()); + templateRegion.setType("sale"); + templateRegion.setRegionId(reg.getId()); + templateRegion.setRegionName(reg.getName()); + templateRegion.setRegionCode(reg.getCode()); + templateRegion.setRegionLevel(reg.getLevel()); + return templateRegion; + }).collect(Collectors.toList()); + templateRegionList.addAll(templateRegions); + } + if(templateBo.getBizRegionFlag() != null && templateBo.getBizRegionFlag().equals(1) + && CollectionUtil.isNotEmpty(templateBo.getBizRegionIds())){ + List bizRegionList = bizRegionService.listByIds(templateBo.getBizRegionIds()); + List templateRegions = bizRegionList.stream().map(reg->{ + TbsActivityTemplateRegion templateRegion = new TbsActivityTemplateRegion(); + templateRegion.setTemplateId(template.getId()); + templateRegion.setType("biz"); + templateRegion.setRegionId(reg.getId()); + templateRegion.setRegionName(reg.getName()); + templateRegion.setRegionCode(reg.getCode()); + templateRegion.setRegionLevel(reg.getLevel()); + return templateRegion; + }).collect(Collectors.toList()); + templateRegionList.addAll(templateRegions); + } + if(CollectionUtil.isNotEmpty(templateRegionList)){ + templateRegionService.saveBatch(templateRegionList); + } + } + this.updateState(); + return template; + } + + @Override + public void updateState() { + AuthContextUtils.setTenant("001"); + LocalDateTime nowTime = LocalDateTime.now(); + //启用未开始的模板 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select( + TbsActivityTemplate::getId, + TbsActivityTemplate::getStartTime, + TbsActivityTemplate::getEndTime + ) + .le(TbsActivityTemplate::getStartTime,nowTime) + .and(qw->{ + qw.isNull(TbsActivityTemplate::getEndTime) + .or() + .ge(TbsActivityTemplate::getEndTime,nowTime); + }) + .eq(TbsActivityTemplate::getTemplateState,0); + List preStartList = this.list(lqw); + if(CollectionUtil.isNotEmpty(preStartList)){ + preStartList.forEach(a->a.setTemplateState(1)); + this.updateBatchById(preStartList); + } + + //关闭超时模板 + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(); + lqw2.select(TbsActivityTemplate::getId, + TbsActivityTemplate::getStartTime, + TbsActivityTemplate::getEndTime); + lqw2.le(TbsActivityTemplate::getEndTime,nowTime); + lqw2.eq(TbsActivityTemplate::getTemplateState,1); + List preCloseList = this.list(lqw2); + if(CollectionUtil.isNotEmpty(preCloseList)){ + preCloseList.forEach(a->a.setTemplateState(0)); + this.updateBatchById(preCloseList); + } + + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetApplyOperationServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetApplyOperationServiceImpl.java new file mode 100644 index 0000000..8837bba --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetApplyOperationServiceImpl.java @@ -0,0 +1,132 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.framework.manager.AsyncManager; +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.seeyon.service.SeeYonOperationService; +import com.qs.serve.modules.sync.AsyncFactory; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.tbs.common.TbsCommonCheckState; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.entity.TbsBudgetLog; +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; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * 预算申请 + * @author YenHex + * @since 2023/8/8 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsBudgetApplyOperationServiceImpl implements SeeYonOperationService { + + private final TbsBudgetService budgetService; + private final TbsBudgetMapper budgetMapper; + private final TbsBudgetLogService budgetLogService; + private final TbsScheduleItemBudgetService scheduleItemBudgetService; + + @Override + public boolean checkSyFormIdIsNotNull(String targetId) { + TbsBudget tbsBudget = budgetMapper.selectById(targetId); + return tbsBudget.getSyFormId()!=null; + } + + @Override + public void doCommitBacked(String targetId) { + AsyncManager.me().execute(AsyncFactory.submitBudgetApply(targetId)); + } + + @Override + public String getTargetId(TbsAffairCommitBo affairCommit) { + return affairCommit.getTargetId(); + } + + @Override + public String getSyFormIdByTargetInfo(TbsAffairCommitBo affairCommit) { + TbsBudget tbsBudget = budgetMapper.selectById(affairCommit.getTargetId()); + if(!tbsBudget.getBudgetCheckState().equals(TbsCommonCheckState.State_1_apply)){ + Assert.throwEx("操作失败,预算处于非审批状态"); + } + return tbsBudget.getSyFormId(); + } + + @Override + public Object doBacked(TbsAffairCommitBo param) { + TbsBudget tbsBudget = budgetMapper.selectById(param.getTargetId()); + if(tbsBudget.getBudgetState().equals(0)&&tbsBudget.getBudgetCheckState().equals(TbsCommonCheckState.State_1_apply)){ + tbsBudget.setBudgetCheckState(TbsCommonCheckState.State_3_setback); + budgetMapper.updateById(tbsBudget); + } + return null; + } + + @Override + public Object compensateFinished(String targetId) { + TbsAffairCommitBo param = new TbsAffairCommitBo(); + param.setTargetId(targetId); + return doFinished(param); + } + + @Override + public Object doFinished(TbsAffairCommitBo param) { + TbsBudget tbsBudget = budgetMapper.selectById(param.getTargetId()); + if(tbsBudget.getBudgetState().equals(0)&&tbsBudget.getBudgetCheckState().equals(TbsCommonCheckState.State_1_apply)){ + tbsBudget.setBudgetCheckState(TbsCommonCheckState.State_2_finished); + //启用预算 + tbsBudget.setBudgetState(1); + budgetMapper.updateById(tbsBudget); + SysUser sysUser = getSysUserService().getById(tbsBudget.getUserId()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsScheduleItemBudget::getBudgetId,param.getTargetId()); + List scheduleItemBudgets = scheduleItemBudgetService.list(lqw); + //保存预算流水日志 + log.debug("保存预算流水日志 scheduleItemBudgets:{}",scheduleItemBudgets.size()); + List budgetLogList = new ArrayList<>(); + for (TbsScheduleItemBudget scheduleItemBudget : scheduleItemBudgets) { + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.toTbsBudgetLog(sysUser, tbsBudget, scheduleItemBudget, BudgetLogOptFlag.State_0,scheduleItemBudget.getBudgetAmount()); + budgetLogList.add(budgetLog); + } + budgetLogService.saveBatch(budgetLogList); + } + budgetMapper.updateConFlag(); + budgetService.syncMissSchItem(); + return null; + } + + @Override + public Object doRefuse(TbsAffairCommitBo param) { + TbsBudget tbsBudget = budgetMapper.selectById(param.getTargetId()); + if(tbsBudget.getBudgetState().equals(0)&&tbsBudget.getBudgetCheckState().equals(TbsCommonCheckState.State_1_apply)){ + tbsBudget.setBudgetCheckState(TbsCommonCheckState.State_4_stop); + budgetMapper.updateById(tbsBudget); + } + return null; + } + + @Override + public String getTemplateCode() { + return TbsSeeYonConst.BudgetApplyConf.Code(); + } + + @Override + public Object compensateBacked(String targetId) { + TbsAffairCommitBo commitBo = new TbsAffairCommitBo(); + commitBo.setTargetId(targetId); + return doBacked(commitBo); + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetBatchItemServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetBatchItemServiceImpl.java new file mode 100644 index 0000000..9e0b855 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetBatchItemServiceImpl.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsBudgetBatchItem; +import com.qs.serve.modules.tbs.service.TbsBudgetBatchItemService; +import com.qs.serve.modules.tbs.mapper.TbsBudgetBatchItemMapper; + +import java.util.List; + +/** + * 批量申请项 服务实现类 + * @author YenHex + * @since 2023-08-24 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsBudgetBatchItemServiceImpl extends ServiceImpl implements TbsBudgetBatchItemService { + + @Override + public List listByBatchId(Long batchId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsBudgetBatchItem::getBatchId,batchId); + return this.list(lqw); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetBatchOperationServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetBatchOperationServiceImpl.java new file mode 100644 index 0000000..224657f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetBatchOperationServiceImpl.java @@ -0,0 +1,150 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.qs.serve.common.framework.manager.AsyncManager; +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.seeyon.service.SeeYonOperationService; +import com.qs.serve.modules.sync.AsyncFactory; +import com.qs.serve.modules.tbs.common.TbsCommonCheckState; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.entity.TbsBudgetBatch; +import com.qs.serve.modules.tbs.entity.TbsBudgetBatchItem; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; +import com.qs.serve.modules.tbs.service.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 预算导入申请底层方法 + * @author YenHex + * @since 2023/8/24 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsBudgetBatchOperationServiceImpl implements SeeYonOperationService { + + private final TbsBudgetMapper tbsBudgetMapper; + private final TbsBudgetBatchService budgetBatchService; + private final TbsBudgetBatchItemService budgetBatchItemService; + private final TbsBudgetService tbsBudgetService; + private final TbsBudgetChangeOperationServiceImpl changeOperationService; + + @Override + public String getTemplateCode() { + return TbsSeeYonConst.BudgetBatchApplyConf.Code(); + } + + @Override + public String getSyFormIdByTargetInfo(TbsAffairCommitBo affairCommit) { + TbsBudgetBatch budgetBatch = budgetBatchService.getById(affairCommit.getTargetId()); + if (!budgetBatch.getBatchState().equals(TbsCommonCheckState.State_1_apply)) { + Assert.throwEx("操作失败,预算处于非审批状态"); + } + return budgetBatch.getSyFormId(); + } + + @Override + public Object doBacked(TbsAffairCommitBo param) { + //业务待定,暂当拒绝 + return doRefuse(param); + } + + @Override + public Object doFinished(TbsAffairCommitBo param) { + TbsBudgetBatch budgetBatch = budgetBatchService.getById(param.getTargetId()); + if(!budgetBatch.getBatchState().equals(TbsCommonCheckState.State_1_apply)){ + return null; + } + List budgetBatchItemList = budgetBatchItemService.listByBatchId(budgetBatch.getId()); + for (TbsBudgetBatchItem batchItem : budgetBatchItemList) { + if(batchItem.getChangeId()==null){ + //预算申请 + try { + tbsBudgetService.startBudget(batchItem.getBudgetId()); + } catch (Exception e) { + log.warn("警告 doFinished().startBudget({}) => {}",batchItem.getBudgetId(),e.getMessage()); + } + }else { + //预算修改 + changeOperationService.dofinishedAction(batchItem.getChangeId().toString()); + } + batchItem.setBatchState(TbsCommonCheckState.State_2_finished); + budgetBatchItemService.updateById(batchItem); + } + budgetBatch.setBatchState(TbsCommonCheckState.State_2_finished); + budgetBatch.setFinishedTime(LocalDateTime.now()); + budgetBatchService.updateById(budgetBatch); + tbsBudgetMapper.updateConFlag(); + tbsBudgetService.syncMissSchItem(); + return null; + } + + @Override + public Object doRefuse(TbsAffairCommitBo param) { + TbsBudgetBatch budgetBatch = budgetBatchService.getById(param.getTargetId()); + if(!budgetBatch.getBatchState().equals(TbsCommonCheckState.State_1_apply)){ + return null; + } + List budgetBatchItemList = budgetBatchItemService.listByBatchId(budgetBatch.getId()); + for (TbsBudgetBatchItem batchItem : budgetBatchItemList) { + if(batchItem.getChangeId()==null){ + //预算申请 + TbsBudget budget = new TbsBudget(); + budget.setId(batchItem.getBudgetId()); + budget.setBudgetCheckState(TbsCommonCheckState.State_0_unPublish); + tbsBudgetService.updateById(budget); + }else { + //预算修改 + TbsAffairCommitBo commitBo = new TbsAffairCommitBo(); + commitBo.setTargetId(batchItem.getChangeId()+""); + changeOperationService.doBacked(commitBo); + } + batchItem.setBatchState(TbsCommonCheckState.State_4_stop); + budgetBatchItemService.updateById(batchItem); + } + budgetBatch.setBatchState(TbsCommonCheckState.State_4_stop); + budgetBatch.setFinishedTime(LocalDateTime.now()); + budgetBatchService.updateById(budgetBatch); + return null; + } + + @Override + public boolean checkSyFormIdIsNotNull(String targetId) { + TbsBudgetBatch budgetBatch = budgetBatchService.getById(targetId); + return budgetBatch.getSyFormId()!=null; + } + + @Override + public Object compensateBacked(String targetId) { + TbsAffairCommitBo param = new TbsAffairCommitBo(); + param.setTargetId(targetId); + return doBacked(param); + } + + @Override + public Object compensateFinished(String targetId) { + TbsAffairCommitBo param = new TbsAffairCommitBo(); + param.setTargetId(targetId); + return doFinished(param); + } + + @Override + public Object compensateRefuse(String targetId) { + TbsAffairCommitBo param = new TbsAffairCommitBo(); + param.setTargetId(targetId); + return doRefuse(param); + } + + @Override + public void doCommitBacked(String targetId) { + //补偿接口 + AsyncManager.me().execute(AsyncFactory.submitBudgetBatch(targetId)); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetBatchServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetBatchServiceImpl.java new file mode 100644 index 0000000..7b6a768 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetBatchServiceImpl.java @@ -0,0 +1,737 @@ +package com.qs.serve.modules.tbs.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.config.properties.ProjectProperties; +import com.qs.serve.common.framework.manager.AsyncManager; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.common.util.model.DateFormatString; +import com.qs.serve.modules.bms.entity.BmsSubject; +import com.qs.serve.modules.bms.service.BmsSubjectService; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.dto.TbsCenterDto; +import com.qs.serve.modules.goods.service.GoodsCategoryService; +import com.qs.serve.modules.seeyon.entity.BaseCreateCallbackBo; +import com.qs.serve.modules.seeyon.entity.BaseCreateProcessBo; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.sync.AsyncFactory; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsCommonCheckState; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.bo.TbsBudgetBatchBo; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetLogWithAmount; +import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudgetMapper; +import com.qs.serve.modules.tbs.service.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.mapper.TbsBudgetBatchMapper; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 批量申请 服务实现类 + * @author YenHex + * @since 2023-08-24 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsBudgetBatchServiceImpl extends ServiceImpl implements TbsBudgetBatchService { + + private final SysUserService sysUserService; + private final SeeYonRequestService seeYonService; + private final ProjectProperties projectProperties; + private final TbsBudgetService tbsBudgetService; + private final TbsBudgetConditionService tbsBudgetConditionService; + private final BmsSubjectService bmsSubjectService; + private final TbsCenterDtoService tbsCenterDtoService; + private final TbsScheduleService tbsScheduleService; + private final TbsScheduleItemService tbsScheduleItemService; + private final TbsScheduleItemBudgetService tbsScheduleItemBudgetService; + private final GoodsCategoryService goodsCategoryService; + private final TbsBudgetChangeService tbsBudgetChangeService; + private final TbsBudgetChangeConditionService tbsBudgetChangeConditionService; + private final TbsScheduleItemBudgetMapper tbsScheduleItemBudgetMapper; + private final TbsBudgetChangeScheduleItemService tbsBudgetChangeScheduleItemService; + private final TbsBudgetBatchItemService tbsBudgetBatchItemService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Object commit(TbsBudgetBatchBo param) { + + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + String batchCode = "BH"+CodeGenUtil.generate(CodeGenUtil.SourceKey.BudgetBatch); + String templateCode = TbsSeeYonConst.BudgetBatchApplyConf.Code(); + //构建Batch + TbsBudgetBatch budgetBatch = buildBatchData(param, batchCode, sysUser); + + if(budgetBatch==null){ + return param; + } + + //保存后赋值 + Long budgetBatchId = budgetBatch.getId(); + + Map data = new HashMap<>(); + data.put("exsp5", batchCode); + data.put("orgId", budgetBatchId); + data.put("applyUserCode", sysUser.getCode()); + data.put("applyUserName", sysUser.getName()); + data.put("empId", sysUser.getSyUserId()); + data.put("targetId", budgetBatchId); + data.put("targetCode", batchCode); + data.put("budgetCode", batchCode); + data.put("exsp1", templateCode); + //添加跳转地址业务 + String baseJumpUrl = JumpToUtil.getJumpUrl(projectProperties.getWebUrl(),templateCode,budgetBatchId+""); + data.put("cmsLink",baseJumpUrl); + data.put("rowDate", DateUtils.format(LocalDateTime.now(), DateFormatString.DATE_TIME)); + data.put("rowState","03"); + + BaseCreateProcessBo createProcess = new BaseCreateProcessBo(); + createProcess.setTemplateCode(templateCode); + createProcess.setMemberLoginName(sysUser.getSyAccount()); + createProcess.setSubjectTitle("[预算导入]"+budgetBatch.getBatchTitle()); + createProcess.setTargetId(budgetBatchId+""); + createProcess.setDataJson(JsonUtil.objectToJson(data)); + R flowIdResult = seeYonService.baseCreateProcess(createProcess); + if(flowIdResult.getStatus()!=200){ + Assert.throwEx("远程服务调用失败"); + } + String formId = null; + R formIdResult = seeYonService.getFormId(templateCode,budgetBatchId); + if(formIdResult.getStatus()==200){ + formId = formIdResult.getData(); + } + + budgetBatch.setSubmitTime(LocalDateTime.now()); + budgetBatch.setBatchState(TbsCommonCheckState.State_1_apply); + budgetBatch.setSyFormId(formId); + this.updateById(budgetBatch); + //创建流程后回调 + BaseCreateCallbackBo callbackBo = new BaseCreateCallbackBo(templateCode,budgetBatchId+""); + seeYonService.createCallbackStatus(callbackBo); + //请求校验是否成功 + AsyncManager.me().execute(AsyncFactory.submitBudgetBatch(budgetBatchId+"")); + return null; + } + + public TbsBudgetBatch buildBatchData(TbsBudgetBatchBo param,String batchCode,SysUser sysUser){ + List paramBudgetList = param.getBudgetList(); + for (TbsBudgetBatchBo.BudgetMain budgetMain : paramBudgetList) { + if(!StringUtils.hasText(budgetMain.getScheduleName())){ + budgetMain.getErrorInfos().add("预算周期名称不能为空"); + param.setErrorFlag(true); + } + if(!StringUtils.hasText(budgetMain.getBudgetName())){ + budgetMain.getErrorInfos().add("预算名称不能为空"); + param.setErrorFlag(true); + } + if(!StringUtils.hasText(budgetMain.getCenterType())){ + budgetMain.getErrorInfos().add("成本中心类型不能为空"); + param.setErrorFlag(true); + } + if(!StringUtils.hasText(budgetMain.getCenterType())){ + budgetMain.getErrorInfos().add("成本中心不能为空"); + param.setErrorFlag(true); + } + for (TbsBudgetBatchBo.BudgetAmount budgetAmount : budgetMain.getScheduleAmount()) { + if(budgetAmount.getBudgetAmount()==null){ + budgetAmount.setBudgetAmount(BigDecimal.ZERO); + } + if(budgetAmount.getPreDispatchAmount()==null){ + budgetAmount.setPreDispatchAmount(BigDecimal.ZERO); + } + } + } + TbsBudgetBatch budgetBatch = new TbsBudgetBatch(); + budgetBatch.setBatchTitle(sysUser.getName()+"发起了批量导入预算"); + budgetBatch.setBatchCode(batchCode); + budgetBatch.setBatchState(TbsCommonCheckState.State_0_unPublish); + //budgetBatch.setSyFormId(); + budgetBatch.setUserId(sysUser.getId()); + budgetBatch.setUserCode(sysUser.getCode()); + budgetBatch.setUserName(sysUser.getName()); + budgetBatch.setSubmitTime(LocalDateTime.now()); + budgetBatch.setRemark(param.getRemark()); + budgetBatch.setAttachIds(param.getAttachIds()); + //构建BatchItems + List batchItems = new ArrayList<>(); + //加载 周期信息 + List scheduleNames = paramBudgetList.stream() + .map(TbsBudgetBatchBo.BudgetMain::getScheduleName).distinct().collect(Collectors.toList()); + Map scheduleMap = loadScheduleMap(scheduleNames,param); + //加载 科目 + Map subjectMap = loadSubjectMapWithFilterInvalid(param); + //加载 成本中心 + Map centerDtoMap = new HashMap<>(); + for (TbsBudgetBatchBo.BudgetMain budgetMain : paramBudgetList) { + TbsCenterDto centerDto = tbsCenterDtoService.getCenterDtoByName(budgetMain.getCenterType(),budgetMain.getCenterName(),false); + if(centerDto==null){ + budgetMain.getErrorInfos().add("无效的成本中心:"+budgetMain.getCenterType()+" "+budgetMain.getCenterName()); + param.setErrorFlag(true); + } + //key=> budgetMain.getCenterType()+"_&_"+budgetMain.getCenterName() + centerDtoMap.put(budgetMain.getCenterType()+"_&_"+budgetMain.getCenterName(),centerDto); + } + //加载 品类 + Map categoryMap = loadGoodsCategoryMap(param); + + //修改的生成为更变记录 + List updBudgetList = paramBudgetList.stream() + .filter(a->StringUtils.hasText(a.getBudgetNumber())).collect(Collectors.toList()); + List budgetList = new ArrayList<>(); + if(updBudgetList.size()>0){ + List budgetNumbers = updBudgetList.stream() + .map(TbsBudgetBatchBo.BudgetMain::getBudgetNumber).collect(Collectors.toList()); + budgetList = tbsBudgetService.list( + new LambdaQueryWrapper().in( + TbsBudget::getBudgetNumber,budgetNumbers + ) + ); + if(budgetList.size()>0){ + List budgetChanges = tbsBudgetChangeService.list( + new LambdaQueryWrapper() + .in(TbsBudgetChange::getBudgetNumber,budgetNumbers) + .eq(TbsBudgetChange::getBudgetCheckState, TbsCommonCheckState.State_1_apply) + ); + for (TbsBudgetChange change : budgetChanges) { + for (TbsBudgetBatchBo.BudgetMain budgetMain : updBudgetList) { + if(budgetMain.getBudgetNumber().equals(change.getBudgetNumber())){ + budgetMain.getErrorInfos().add("预算修改["+change.getBudgetTitle()+"]审批中,无法导入修改"); + param.setErrorFlag(true); + } + } + } + } + for (TbsBudget budget : budgetList) { + if(budget.getBudgetCheckState()== TbsCommonCheckState.State_1_apply){ + for (TbsBudgetBatchBo.BudgetMain budgetMain : updBudgetList) { + if(budgetMain.getBudgetNumber().equals(budget.getBudgetNumber())){ + budgetMain.getErrorInfos().add("预算["+budget.getBudgetCode()+"]审批中,无法导入修改"); + param.setErrorFlag(true); + } + } + } + } + } + + //有错误信息退出 + if(param.isErrorFlag()){ + return null; + } + + this.save(budgetBatch); + //保存后赋值 + Long batchId = budgetBatch.getId(); + + if(updBudgetList.size()>0){ + + for (TbsBudget budget : budgetList) { + TbsBudgetBatchBo.BudgetMain paramItem = null; + for (TbsBudgetBatchBo.BudgetMain budgetMain : updBudgetList) { + if(budgetMain.getBudgetNumber().equals(budget.getBudgetNumber())){ + paramItem = budgetMain; + break; + } + } + final Long budgetId = budget.getId(); + if(budget.getBudgetState().equals(1)){ + //适配更变记录 + TbsBudgetChange budgetChange = TbsBudgetChange.toNewObject(budget); + budgetChange.setChangeCode("BU"+CodeGenUtil.generate(CodeGenUtil.SourceKey.BudgetChange)); + budgetChange.setUserId(sysUser.getId()); + budgetChange.setUserCode(sysUser.getCode()); + budgetChange.setUserName(sysUser.getName()); + budgetChange.setBatchApplyFlag(1); + budgetChange.setBatchApplyId(batchId); + budgetChange.setBudgetCheckState(TbsCommonCheckState.State_1_apply); + boolean notChangeTitle = paramItem.getBudgetName()!=null&& paramItem.getBudgetName().equals(budget.getBudgetCode()); + if(!notChangeTitle){ + budgetChange.setNewBudgetTitle(paramItem.getBudgetName()); + } + tbsBudgetChangeService.save(budgetChange); + Long changeId = budgetChange.getId(); + //添加品类条件 + this.toSaveChangeCondition(categoryMap, budget, paramItem, budgetId, changeId); + List changeScheduleItemList = new ArrayList<>(); + this.buildChangeSchduleBudgetList(paramItem, budgetId, changeId, changeScheduleItemList); + if(CollUtil.isNotEmpty(changeScheduleItemList)){ + tbsBudgetChangeScheduleItemService.saveBatch(changeScheduleItemList); + } + TbsBudgetBatchItem batchItem = new TbsBudgetBatchItem(); + batchItem.setBudgetId(budgetId); + batchItem.setChangeId(changeId); + batchItem.setBatchState(TbsCommonCheckState.State_1_apply); + batchItem.setUserId(sysUser.getId()); + batchItem.setUserCode(sysUser.getCode()); + batchItem.setUserName(sysUser.getName()); + batchItem.setRemark(paramItem.getRemark()); + batchItems.add(batchItem); + }else { + //修改后为新增类型提交 + this.toUpdateBudgetInfo(batchId,sysUser, scheduleMap, subjectMap, centerDtoMap, categoryMap, paramItem, budgetId); + TbsBudgetBatchItem batchItem = new TbsBudgetBatchItem(); + batchItem.setBudgetId(budgetId); + batchItem.setBatchState(TbsCommonCheckState.State_1_apply); + batchItem.setUserId(sysUser.getId()); + batchItem.setUserCode(sysUser.getCode()); + batchItem.setUserName(sysUser.getName()); + batchItem.setRemark(paramItem.getRemark()); + batchItems.add(batchItem); + } + } + } + //新增的生成为草稿 + List addBudgetList = paramBudgetList.stream() + .filter(a->!StringUtils.hasText(a.getBudgetNumber())).collect(Collectors.toList()); + for (TbsBudgetBatchBo.BudgetMain budgetMain : addBudgetList) { + TbsBudget newBudget = new TbsBudget(); + newBudget.setBatchApplyFlag(1); + newBudget.setBatchApplyId(batchId); + TbsSchedule schedule = scheduleMap.get(budgetMain.getScheduleName()); + this.initBudget4Update(sysUser,schedule, subjectMap, centerDtoMap, budgetMain, newBudget); + newBudget.setBudgetNumber("BM"+CodeGenUtil.generate(CodeGenUtil.SourceKey.Budget)); + tbsBudgetService.save(newBudget); + Long budgetId = newBudget.getId(); + //创建新条件 + List conditionList = this.createTbsBudgetConditions(categoryMap, budgetMain, budgetId); + //创建新预算周期 + List scheduleItemBudgetList = this.createTbsScheduleItemBudgetList(budgetMain, budgetId, schedule); + //数据持久化 + if(CollectionUtil.isNotEmpty(conditionList)){ + tbsBudgetConditionService.saveBatch(conditionList); + } + tbsScheduleItemBudgetService.saveBatch(scheduleItemBudgetList); + + TbsBudgetBatchItem batchItem = new TbsBudgetBatchItem(); + batchItem.setBudgetId(budgetId); + batchItem.setBatchState(TbsCommonCheckState.State_1_apply); + batchItem.setUserId(sysUser.getId()); + batchItem.setUserCode(sysUser.getCode()); + batchItem.setUserName(sysUser.getName()); + batchItems.add(batchItem); + } + batchItems.forEach(batchItem->batchItem.setBatchId(batchId)); + tbsBudgetBatchItemService.saveBatch(batchItems); + return budgetBatch; + } + + private void toUpdateBudgetInfo(Long batchId,SysUser sysUser, Map scheduleMap, + Map subjectMap, Map centerDtoMap, + Map categoryMap, TbsBudgetBatchBo.BudgetMain paramItem, Long budgetId) { + //tbsBudgetService.removeById(budgetId); + tbsBudgetConditionService.remove( + new LambdaQueryWrapper() + .eq(TbsBudgetCondition::getBudgetId, budgetId) + ); + tbsScheduleItemBudgetService.remove( + new LambdaQueryWrapper() + .eq(TbsScheduleItemBudget::getBudgetId, budgetId) + ); + //设置新的值 + TbsBudget newBudget = new TbsBudget(); + newBudget.setId(budgetId); + newBudget.setBatchApplyFlag(1); + newBudget.setBatchApplyId(batchId); + newBudget.setUserId(sysUser.getId()); + newBudget.setUserCode(sysUser.getCode()); + newBudget.setUserName(sysUser.getName()); + TbsSchedule schedule = scheduleMap.get(paramItem.getScheduleName()); + this.initBudget4Update(sysUser,schedule, subjectMap, centerDtoMap, paramItem, newBudget); + //创建新条件 + List conditionList = this.createTbsBudgetConditions(categoryMap, paramItem, budgetId); + //创建新预算周期 + List scheduleItemBudgetList = this.createTbsScheduleItemBudgetList(paramItem, budgetId, schedule); + //数据持久化 + tbsBudgetService.updateById(newBudget); + if(CollectionUtil.isNotEmpty(conditionList)){ + tbsBudgetConditionService.saveBatch(conditionList); + } + tbsScheduleItemBudgetService.saveBatch(scheduleItemBudgetList); + } + + private void toSaveChangeCondition(Map categoryMap, TbsBudget budget, TbsBudgetBatchBo.BudgetMain paramItem, Long budgetId, Long changeId) { + if(budget.getConditionFlag().equals(1)){ +// List existingConditionList = tbsBudgetConditionService +// .list(new LambdaQueryWrapper() +// .eq(TbsBudgetCondition::getBudgetId, budgetId)); + String bandNames = paramItem.getBrandNames(); + String categoryNames = paramItem.getCategoryNames(); + String seriesNames = paramItem.getSeriesNames(); + //设置changeConditionList参数 + List changeConditionList = new ArrayList<>(); + this.buildChangeConditionList(categoryMap, budgetId, changeId, changeConditionList, null, + bandNames, TbsGoodsType.brand.name()); + this.buildChangeConditionList(categoryMap, budgetId, changeId, changeConditionList, null, + categoryNames, TbsGoodsType.category.name()); + this.buildChangeConditionList(categoryMap, budgetId, changeId, changeConditionList, null, + seriesNames, TbsGoodsType.series.name()); + if(CollUtil.isNotEmpty(changeConditionList)){ + tbsBudgetChangeConditionService.saveBatch(changeConditionList); + } + } + } + + private void buildChangeSchduleBudgetList(TbsBudgetBatchBo.BudgetMain paramItem, Long budgetId, Long changeId, List changeScheduleItemList) { + //预算参数 + List scheduleAmountList = paramItem.getScheduleAmount(); + //预算项 + List scheduleItemBudgetList = tbsScheduleItemBudgetService + .list(new LambdaQueryWrapper() + .eq(TbsScheduleItemBudget::getBudgetId, budgetId)); + List scheduleItemBudgetIds = scheduleItemBudgetList.stream() + .map(TbsScheduleItemBudget::getId).collect(Collectors.toList()); + //实际发布预算 + List budgetLogWithAmountList = tbsScheduleItemBudgetMapper.getSumAmtInList(scheduleItemBudgetIds,Arrays.asList(0,2,3)); + + for (TbsScheduleItemBudget itemBudget : scheduleItemBudgetList) { + BigDecimal realAmt = BigDecimal.ZERO; + for (TbsBudgetLogWithAmount withAmount : budgetLogWithAmountList) { + if(withAmount.getId().equals(itemBudget.getId())){ + realAmt = withAmount.getAmt(); + break; + } + } + for (TbsBudgetBatchBo.BudgetAmount budgetAmount : scheduleAmountList) { + if(budgetAmount.getScheduleItemName().equals(itemBudget.getItemName())){ + boolean ne1 = ! (itemBudget.getPreDispatchAmount().compareTo(budgetAmount.getPreDispatchAmount())==0); + boolean ne2 = ! (realAmt.compareTo(budgetAmount.getBudgetAmount())==0); + TbsBudgetChangeScheduleItem resultItem = TbsBudgetChangeScheduleItem.toNewObject(itemBudget); + resultItem.setChangeId(changeId); + resultItem.setBudgetAmount(realAmt); + resultItem.setChangeFlag((ne1 || ne2)?1:0); + resultItem.setNewBudgetAmount(budgetAmount.getBudgetAmount()); + resultItem.setNewPreDispatchAmount(budgetAmount.getPreDispatchAmount()); + resultItem.setCategoryNames(paramItem.getCategoryNames()); + resultItem.setBrandNames(paramItem.getBrandNames()); + resultItem.setSeriesNames(paramItem.getSeriesNames()); + resultItem.setRemark(paramItem.getRemark()); + changeScheduleItemList.add(resultItem); + } + } + } + } + + private void buildChangeConditionList(Map categoryMap, Long budgetId, Long changeId, List changeConditionList, List existingConditionList, String values, String targetType) { + if(StringUtils.hasText(values)){ + String[] valueArr = values.replace(",",",").split(","); + for (String val : valueArr) { + GoodsCategory goodsCategory = categoryMap.get(targetType+"_"+val); + if(goodsCategory!=null){ + TbsBudgetChangeCondition budgetChangeCondition = new TbsBudgetChangeCondition(); + budgetChangeCondition.setChangeId(changeId); + budgetChangeCondition.setBudgetId(budgetId); + budgetChangeCondition.setTargetType(targetType); + budgetChangeCondition.setTargetId(goodsCategory.getId()); + budgetChangeCondition.setTargetCode(goodsCategory.getCode()); + budgetChangeCondition.setTargetName(goodsCategory.getName()); + budgetChangeCondition.setTargetLevelPathIds(goodsCategory.getLevelPath()); + budgetChangeCondition.setTargetLevelPathNames(goodsCategory.getLevelPathNames()); + changeConditionList.add(budgetChangeCondition); + } + } + } + } + + @NotNull + private List createTbsBudgetConditions(Map categoryMap, TbsBudgetBatchBo.BudgetMain paramItem, Long budgetId) { + List conditionList = new ArrayList<>(); + if(StringUtils.hasText(paramItem.getBrandNames())){ + String[] values = paramItem.getBrandNames().split(","); + for (String value : values) { + GoodsCategory category = categoryMap.get(TbsGoodsType.brand.name()+"_"+value); + TbsBudgetCondition budgetCondition = new TbsBudgetCondition(); + budgetCondition.setBudgetId(budgetId); + budgetCondition.setTargetType(TbsGoodsType.brand.name()); + budgetCondition.setTargetId(category.getId()); + budgetCondition.setTargetCode(category.getCode()); + budgetCondition.setTargetName(category.getName()); + budgetCondition.setTargetLevelPathIds(category.getLevelPath()); + budgetCondition.setTargetLevelPathNames(category.getLevelPathNames()); + conditionList.add(budgetCondition); + } + } + if(StringUtils.hasText(paramItem.getCategoryNames())){ + String[] values = paramItem.getCategoryNames().split(","); + for (String value : values) { + GoodsCategory category = categoryMap.get(TbsGoodsType.category.name()+"_"+value); + TbsBudgetCondition budgetCondition = new TbsBudgetCondition(); + budgetCondition.setBudgetId(budgetId); + budgetCondition.setTargetType(TbsGoodsType.category.name()); + budgetCondition.setTargetId(category.getId()); + budgetCondition.setTargetCode(category.getCode()); + budgetCondition.setTargetName(category.getName()); + budgetCondition.setTargetLevelPathIds(category.getLevelPath()); + budgetCondition.setTargetLevelPathNames(category.getLevelPathNames()); + conditionList.add(budgetCondition); + } + } + if(StringUtils.hasText(paramItem.getSeriesNames())){ + String[] values = paramItem.getSeriesNames().split(","); + for (String value : values) { + GoodsCategory category = categoryMap.get(TbsGoodsType.series.name()+"_"+value); + TbsBudgetCondition budgetCondition = new TbsBudgetCondition(); + budgetCondition.setBudgetId(budgetId); + budgetCondition.setTargetType(TbsGoodsType.series.name()); + budgetCondition.setTargetId(category.getId()); + budgetCondition.setTargetCode(category.getCode()); + budgetCondition.setTargetName(category.getName()); + budgetCondition.setTargetLevelPathIds(category.getLevelPath()); + budgetCondition.setTargetLevelPathNames(category.getLevelPathNames()); + conditionList.add(budgetCondition); + } + } + return conditionList; + } + + @NotNull + private List createTbsScheduleItemBudgetList(TbsBudgetBatchBo.BudgetMain paramItem, Long budgetId, TbsSchedule schedule) { + List scheduleItemBudgetList = new ArrayList<>(); + for (TbsScheduleItem scheduleItem : schedule.getScheduleItemlist()) { + for (TbsBudgetBatchBo.BudgetAmount amountItem : paramItem.getScheduleAmount()) { + if(scheduleItem.getItemName().equals(amountItem.getScheduleItemName())){ + TbsScheduleItemBudget scheduleItemBudget = new TbsScheduleItemBudget(); + scheduleItemBudget.setScheduleId(schedule.getId()); + scheduleItemBudget.setScheduleItemId(scheduleItem.getId()); + scheduleItemBudget.setItemName(scheduleItem.getItemName()); + scheduleItemBudget.setStartDate(scheduleItem.getStartDate()); + scheduleItemBudget.setEndDate(scheduleItem.getEndDate()); + scheduleItemBudget.setBudgetId(budgetId); + scheduleItemBudget.setBudgetAmount(amountItem.getBudgetAmount()); + scheduleItemBudget.setPreDispatchAmount(amountItem.getPreDispatchAmount()); + scheduleItemBudget.setPreDispatchAmountFirst(amountItem.getPreDispatchAmount()); + scheduleItemBudgetList.add(scheduleItemBudget); + break; + } + } + } + return scheduleItemBudgetList; + } + + private void initBudget4Update(SysUser sysUser, TbsSchedule schedule, Map subjectMap, Map centerDtoMap, TbsBudgetBatchBo.BudgetMain paramItem, TbsBudget newBudget) { + if(StringUtils.hasText(paramItem.getBudgetName())){ + newBudget.setBudgetCode(paramItem.getBudgetName()); + } + newBudget.setBudgetNumber(paramItem.getBudgetNumber()); + newBudget.setBudgetState(0); + newBudget.setBudgetCheckState(TbsCommonCheckState.State_1_apply); + if(StringUtils.hasText(paramItem.getSubjectCode())){ + BmsSubject bmsSubject = subjectMap.get(paramItem.getSubjectCode()); + if(bmsSubject==null){ + + } + newBudget.setSubjectId(bmsSubject.getId()); + newBudget.setSubjectCode(bmsSubject.getSubjectCode()); + newBudget.setSubjectName(bmsSubject.getSubjectName()); + } + String centerKey = paramItem.getCenterType()+"_&_"+ paramItem.getCenterName(); + TbsCenterDto centerDto = centerDtoMap.get(centerKey); + newBudget.setCenterId(centerDto.getId()); + newBudget.setCenterType(centerDto.getCenterType()); + newBudget.setCenterCode(centerDto.getCenterCode()); + newBudget.setCenterName(centerDto.getCenterName()); + newBudget.setScheduleId(schedule.getId()); + newBudget.setScheduleCode(schedule.getCode()); + newBudget.setScheduleName(schedule.getName()); + boolean conditionFlag = StringUtils.hasText(paramItem.getCategoryNames()) + ||StringUtils.hasText(paramItem.getSeriesNames()) + ||StringUtils.hasText(paramItem.getBrandNames()); + newBudget.setConditionFlag(conditionFlag?1:0); + newBudget.setUserId(sysUser.getId()); + newBudget.setUserCode(sysUser.getCode()); + newBudget.setUserName(sysUser.getName()); + newBudget.setSubmitTime(LocalDateTime.now()); + } + + /** + * 加载类目 + * @param param + * @return + */ + private Map loadGoodsCategoryMap(TbsBudgetBatchBo param) { + List paramBudgetList = param.getBudgetList(); + //初始化三个维度的品类 + List allBandNameList = new ArrayList<>(), + allCategoryNameList = new ArrayList<>(), + allSeriesNameList = new ArrayList<>(); + for (TbsBudgetBatchBo.BudgetMain budgetMain : paramBudgetList) { + String bandNames = budgetMain.getBrandNames(); + String categoryNames = budgetMain.getCategoryNames(); + String seriesNames = budgetMain.getSeriesNames(); + allBandNameList.addAll(initCategorySet(bandNames)); + allCategoryNameList.addAll(initCategorySet(categoryNames)); + allSeriesNameList.addAll(initCategorySet(seriesNames)); + } + if(CollUtil.isEmpty(allBandNameList) + && CollUtil.isEmpty(allCategoryNameList) + && CollUtil.isEmpty(allSeriesNameList)){ + return new HashMap<>(); + } + //查询类目 + List bandList = this.queryCategory(1,allBandNameList); + List categoryList = this.queryCategory(2,allCategoryNameList); + List seriesList = this.queryCategory(3,allSeriesNameList); + + for (TbsBudgetBatchBo.BudgetMain budgetMain : paramBudgetList) { + String bandNames = budgetMain.getBrandNames(); + String categoryNames = budgetMain.getCategoryNames(); + String seriesNames = budgetMain.getSeriesNames(); + + List bandNameItemList = initCategorySet(bandNames); + List categoryNameItemList = initCategorySet(categoryNames); + List seriesNameItemList = initCategorySet(seriesNames); + checkMchError(1,param, budgetMain,bandList, bandNameItemList); + checkMchError(2,param, budgetMain,categoryList, categoryNameItemList); + checkMchError(3,param, budgetMain,seriesList, seriesNameItemList); + } + + Map categoryMap = new HashMap<>(); + for (GoodsCategory category : bandList) { + categoryMap.put(TbsGoodsType.brand.name()+"_"+category.getName(),category); + } + for (GoodsCategory category : categoryList) { + categoryMap.put(TbsGoodsType.category.name()+"_"+category.getName(),category); + } + for (GoodsCategory category : seriesList) { + categoryMap.put(TbsGoodsType.series.name()+"_"+category.getName(),category); + } + return categoryMap; + } + + /** + * 校验查询结果 + * @param level + * @param param + * @param budgetMain + * @param bandList + * @param cateNames + */ + private void checkMchError(int level,TbsBudgetBatchBo param, + TbsBudgetBatchBo.BudgetMain budgetMain, + List bandList, + List cateNames) { + for (String name : cateNames) { + boolean mch = false; + for (GoodsCategory category : bandList) { + if(name.equals(category.getName())){ + mch = true; + break; + } + } + if(!mch){ + if(level==1){ + budgetMain.getErrorInfos().add("无效的品牌:"+name); + }else if (level==2){ + budgetMain.getErrorInfos().add("无效的品类:"+name); + }else { + budgetMain.getErrorInfos().add("无效的系列:"+name); + } + param.setErrorFlag(true); + } + } + } + + /** + * 查询品类 + * @param level 等级1-品牌 2-类目 3-系列 + * @param nameOrCodes + * @return + */ + private List queryCategory(int level,List nameOrCodes) { + if(CollUtil.isEmpty(nameOrCodes)){ + return new ArrayList<>(); + } + List list = goodsCategoryService.list( + new LambdaQueryWrapper() + .eq(GoodsCategory::getLevel,level) + .and(cn->{ + cn.in(GoodsCategory::getName,nameOrCodes) + .or() + .in(GoodsCategory::getCode,nameOrCodes); + }) + ); + return list; + } + + /** + * 初始化set + * @param categoryString + */ + private List initCategorySet(String categoryString) { + if(StringUtils.hasText(categoryString)){ + String[] values = categoryString + .replace(",",",") + .split(","); + return Arrays.asList(values); + } + return new ArrayList<>(); + } + + private Map loadScheduleMap(List scheduleNames,TbsBudgetBatchBo param) { + List schedules = tbsScheduleService.list( + new LambdaQueryWrapper().in(TbsSchedule::getName, scheduleNames) + ); + if(scheduleNames.size()!=schedules.size()){ + for (String scheduleName : scheduleNames) { + boolean exist = schedules.stream() + .filter(b->b.getName()!=null) + .anyMatch(a->a.getName().equals(scheduleName)); + if(!exist){ + for (TbsBudgetBatchBo.BudgetMain budgetMain : param.getBudgetList()) { + if(budgetMain.getScheduleName()!=null&&budgetMain.getScheduleName().equals(scheduleName)){ + budgetMain.getErrorInfos().add("预算周期不存在:"+scheduleName); + param.setErrorFlag(true); + break; + } + } + } + } + } + Map scheduleMap = new HashMap<>(scheduleNames.size()); + for (TbsSchedule schedule : schedules) { + List scheduleItems = tbsScheduleItemService.listByScheduleId(schedule.getId()); + for (TbsBudgetBatchBo.BudgetMain budgetMain : param.getBudgetList()) { + if(budgetMain.getScheduleName().equals(schedule.getName())){ + for (TbsBudgetBatchBo.BudgetAmount budgetAmount : budgetMain.getScheduleAmount()) { + String scheduleItemName = budgetAmount.getScheduleItemName(); + boolean exist = scheduleItems.stream().anyMatch(item -> scheduleItemName.equals(item.getItemName())); + if(!exist){ + budgetAmount.setErrorInfo("周期项不存在:"+scheduleItemName); + param.setErrorFlag(true); + } + } + } + } + schedule.setScheduleItemlist(scheduleItems); + scheduleMap.put(schedule.getName(),schedule); + } + return scheduleMap; + } + + /** + * 加载param的所有科目 + * @param param + * @return + */ + private Map loadSubjectMapWithFilterInvalid(TbsBudgetBatchBo param){ + List subjectCodes = param.getBudgetList().stream().filter(a->StringUtils.hasText(a.getSubjectCode())) + .map(TbsBudgetBatchBo.BudgetMain::getSubjectCode) + .collect(Collectors.toList()); + return bmsSubjectService.loadByCode(subjectCodes,param); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetChangeConditionServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetChangeConditionServiceImpl.java new file mode 100644 index 0000000..c99d97b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetChangeConditionServiceImpl.java @@ -0,0 +1,32 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.tbs.entity.TbsBudgetChangeScheduleItem; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsBudgetChangeCondition; +import com.qs.serve.modules.tbs.service.TbsBudgetChangeConditionService; +import com.qs.serve.modules.tbs.mapper.TbsBudgetChangeConditionMapper; + +import java.util.List; + +/** + * 预算更变记录条件 服务实现类 + * @author YenHex + * @since 2023-08-09 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsBudgetChangeConditionServiceImpl extends ServiceImpl implements TbsBudgetChangeConditionService { + + @Override + public List listByChangeId(Long id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsBudgetChangeCondition::getChangeId,id); + return this.list(lqw); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetChangeOperationServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetChangeOperationServiceImpl.java new file mode 100644 index 0000000..4959832 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetChangeOperationServiceImpl.java @@ -0,0 +1,198 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.seeyon.service.SeeYonOperationService; +import com.qs.serve.modules.sync.AsyncFactory; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.tbs.common.TbsCommonCheckState; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.mapper.TbsBudgetChangeMapper; +import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; +import com.qs.serve.modules.tbs.service.*; +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.Map; +import java.util.stream.Collectors; + +/** + * 预算改动的申请 + * @author YenHex + * @since 2023/8/8 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsBudgetChangeOperationServiceImpl implements SeeYonOperationService { + + private TbsBudgetService budgetService; + private TbsBudgetMapper budgetMapper; + private TbsBudgetChangeMapper budgetChangeMapper; + private TbsBudgetConditionService tbsBudgetConditionService; + private TbsBudgetChangeScheduleItemService tbsBudgetChangeScheduleItemService; + private TbsBudgetChangeConditionService tbsBudgetChangeConditionService; + private TbsBudgetLogService tbsBudgetLogService; + + private TbsScheduleItemBudgetService tbsScheduleItemBudgetService; + + @Override + public boolean checkSyFormIdIsNotNull(String targetId) { + TbsBudgetChange budgetChange = budgetChangeMapper.selectById(targetId); + return budgetChange.getSyFormId()!=null; + } + + @Override + public void doCommitBacked(String targetId) { + AsyncFactory.submitBudgetChange(targetId); + } + + @Override + public String getSyFormIdByTargetInfo(TbsAffairCommitBo affairCommit) { + TbsBudgetChange budgetChange = budgetChangeMapper.selectById(affairCommit.getTargetId()); + if(!budgetChange.getBudgetCheckState().equals(TbsCommonCheckState.State_1_apply)){ + Assert.throwEx("操作失败,预算处于非审批状态"); + } + return budgetChange.getSyFormId(); + } + + @Override + public Object doBacked(TbsAffairCommitBo param) { + TbsBudgetChange budgetChange = budgetChangeMapper.selectById(param.getTargetId()); + if(budgetChange.getBudgetCheckState().equals(TbsCommonCheckState.State_1_apply)){ + budgetChange.setBudgetCheckState(TbsCommonCheckState.State_3_setback); + budgetChangeMapper.updateById(budgetChange); + } + return null; + } + + @Override + public Object doFinished(TbsAffairCommitBo param) { + dofinishedAction(param.getTargetId()); + return null; + } + + @Override + public Object compensateFinished(String targetId) { + dofinishedAction(targetId); + return null; + } + + /** + * 执行完成回调 + * @param changeId + */ + public void dofinishedAction(String changeId) { + TbsBudgetChange budgetChange = budgetChangeMapper.selectById(changeId); + if(budgetChange.getBudgetCheckState().equals(TbsCommonCheckState.State_1_apply)){ + budgetChange.setBudgetCheckState(TbsCommonCheckState.State_2_finished); + budgetChangeMapper.updateById(budgetChange); + }else { + return; + } + TbsBudget tbsBudget = budgetMapper.selectById(budgetChange.getBudgetId()); + boolean updBudget = false; + if(StringUtils.hasText(budgetChange.getNewBudgetTitle())){ + tbsBudget.setBudgetCode(budgetChange.getNewBudgetTitle()); + updBudget = true; + } + if(budgetChange.getNewAttachIds()!=null&& budgetChange.getNewAttachIds().length>0){ + tbsBudget.setAttachIds(budgetChange.getNewAttachIds()); + updBudget = true; + } + if(updBudget){ + budgetMapper.updateById(tbsBudget); + } + SysUser sysUser = getSysUserService().getById(budgetChange.getUserId()); + //更新条件 + List allChangeConditionList = tbsBudgetChangeConditionService.listByChangeId(budgetChange.getId()); + Map> map = allChangeConditionList.stream().collect(Collectors.groupingBy(TbsBudgetChangeCondition::getSourceFlag)); + List changeConditionList = map.get(0); + if(changeConditionList!=null&&changeConditionList.size()>0){ + List budgetConditionList = new ArrayList<>(); + for (TbsBudgetChangeCondition changeCondition : changeConditionList) { + TbsBudgetCondition budgetCondition = TbsBudgetCondition.toNewObject(changeCondition); + budgetCondition.setChangeId(budgetChange.getId()); + budgetConditionList.add(budgetCondition); + } + if(CollectionUtil.isNotEmpty(budgetConditionList)){ + tbsBudgetConditionService.saveBatch(budgetConditionList); + } + } + //更新金额 + List changeScheduleItemList = tbsBudgetChangeScheduleItemService.listByChangeId(budgetChange.getId()); + //过滤更变金额 + changeScheduleItemList = changeScheduleItemList.stream().filter(a->a.getChangeFlag().equals(1)).collect(Collectors.toList()); + if(CollectionUtil.isNotEmpty(changeScheduleItemList)){ + List scheduleItemBudgetIds = changeScheduleItemList.stream().map(TbsBudgetChangeScheduleItem::getSourceId).collect(Collectors.toList()); + List scheduleItemBudgetList = tbsScheduleItemBudgetService.listByIds(scheduleItemBudgetIds); + for (TbsScheduleItemBudget item : scheduleItemBudgetList) { + for (TbsBudgetChangeScheduleItem changeItem : changeScheduleItemList) { + if(item.getId().equals(changeItem.getSourceId())){ + //更新具体方法 + this.updateScheduleAmtAndBudgetLog(sysUser,tbsBudget,item, changeItem); + } + } + } + } + budgetMapper.updateConFlag(); + budgetService.syncMissSchItem(); + } + + /** + * 更新金额和预算日志 + * @param item + * @param changeItem + */ + private void updateScheduleAmtAndBudgetLog(SysUser sysUser,TbsBudget budget,TbsScheduleItemBudget item, TbsBudgetChangeScheduleItem changeItem) { + boolean changeAmtIsNotNull = changeItem.getBudgetAmount()!=null&&changeItem.getNewBudgetAmount()!=null; + if(changeAmtIsNotNull && changeItem.getBudgetAmount().compareTo(changeItem.getNewBudgetAmount())!=0){ + BudgetLogOptFlag optType; + BigDecimal amount = changeItem.getNewBudgetAmount().subtract(changeItem.getBudgetAmount()); + log.debug("预算:{},项:{},原金额:{},新金额:{}",budget.getBudgetCode(),changeItem.getItemName(),changeItem.getBudgetAmount(),changeItem.getNewBudgetAmount()); + if(amount.compareTo(BigDecimal.ZERO)>0){ + optType = BudgetLogOptFlag.State_2; + }else if(amount.compareTo(BigDecimal.ZERO)<0){ + optType = BudgetLogOptFlag.State_3; + }else{ + return; + } + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.toTbsBudgetLog(sysUser,budget,item,optType, amount); + tbsBudgetLogService.save(budgetLog); + } + if(changeItem.getNewPreDispatchAmount()!=null){ + item.setPreDispatchAmount(changeItem.getNewPreDispatchAmount()); + tbsScheduleItemBudgetService.updateById(item); + } + } + + @Override + public Object doRefuse(TbsAffairCommitBo param) { + TbsBudgetChange budgetChange = budgetChangeMapper.selectById(param.getTargetId()); + if(budgetChange.getBudgetCheckState().equals(TbsCommonCheckState.State_1_apply)){ + budgetChange.setBudgetCheckState(TbsCommonCheckState.State_4_stop); + budgetChangeMapper.updateById(budgetChange); + } + return null; + } + + @Override + public String getTemplateCode() { + return TbsSeeYonConst.BudgetChangeConf.Code(); + } + + @Override + public Object compensateBacked(String targetId) { + this.doBacked(new TbsAffairCommitBo(targetId)); + return null; + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetChangeScheduleItemServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetChangeScheduleItemServiceImpl.java new file mode 100644 index 0000000..01bdf66 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetChangeScheduleItemServiceImpl.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsBudgetChangeScheduleItem; +import com.qs.serve.modules.tbs.service.TbsBudgetChangeScheduleItemService; +import com.qs.serve.modules.tbs.mapper.TbsBudgetChangeScheduleItemMapper; + +import java.util.List; + +/** + * 考核期更变记录 服务实现类 + * @author YenHex + * @since 2023-08-09 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsBudgetChangeScheduleItemServiceImpl extends ServiceImpl implements TbsBudgetChangeScheduleItemService { + + @Override + public List listByChangeId(Long id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsBudgetChangeScheduleItem::getChangeId,id); + return this.list(lqw); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetChangeServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetChangeServiceImpl.java new file mode 100644 index 0000000..39d0c45 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetChangeServiceImpl.java @@ -0,0 +1,317 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.config.properties.ProjectProperties; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.common.util.model.DateFormatString; +import com.qs.serve.modules.seeyon.entity.BaseCreateCallbackBo; +import com.qs.serve.modules.seeyon.entity.BaseCreateProcessBo; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.sync.AsyncFactory; +import com.qs.serve.modules.sys.common.AuthContextUtils; +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.common.TbsCommonCheckState; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.common.consts.ChangeTypeEnum; +import com.qs.serve.modules.tbs.common.dto.TbsBudgetChangeVo; +import com.qs.serve.modules.tbs.common.util.TbsBudgetConditionUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.bo.TbsBudgetAmtBo; +import com.qs.serve.modules.tbs.entity.bo.TbsBudgetUpdateAfterStartBo; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetLogWithAmount; +import com.qs.serve.modules.tbs.entity.so.TbsBudgetChangeSo; +import com.qs.serve.modules.tbs.mapper.*; +import com.qs.serve.modules.tbs.service.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 预算更变记录 服务实现类 + * @author YenHex + * @since 2023-08-09 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsBudgetChangeServiceImpl extends ServiceImpl implements TbsBudgetChangeService { + + private final TbsBudgetMapper tbsBudgetMapper; + private final TbsBudgetChangeConditionMapper tbsBudgetChangeConditionMapper; + private final TbsBudgetConditionMapper tbsBudgetConditionMapper; + private final TbsScheduleItemBudgetMapper tbsScheduleItemBudgetMapper; + private final TbsBudgetChangeScheduleItemMapper tbsBudgetChangeScheduleItemMapper; + private final SysUserService sysUserService; + private final SeeYonRequestService seeYonService; + private final ProjectProperties projectProperties; + + private final TbsBudgetChangeScheduleItemService tbsBudgetChangeScheduleItemService; + private final TbsBudgetChangeConditionService tbsBudgetChangeConditionService; + private final SysAttachService sysAttachService; + private final TbsBudgetConditionService tbsBudgetConditionService; + private final TbsScheduleItemBudgetService tbsScheduleItemBudgetService; + + @Override + public TbsBudgetChange getDetailById(String id, ChangeTypeEnum applyType) { + TbsBudgetChange budgetChange = this.getById(id); + if(applyType==null){ + budgetChange.setApplyType(budgetChange.getBatchApplyFlag().equals(1)? + ChangeTypeEnum.batchChange.name(): + ChangeTypeEnum.change.name()); + }else { + budgetChange.setApplyType(applyType.name()); + } + List changeScheduleItemList = tbsBudgetChangeScheduleItemService.listByChangeId(budgetChange.getId()); + List changeConditionList = tbsBudgetChangeConditionService.listByChangeId(budgetChange.getId()); + Map> map = changeConditionList.stream().collect(Collectors.groupingBy(TbsBudgetChangeCondition::getSourceFlag)); + budgetChange.setChangeScheduleItemList(changeScheduleItemList); + budgetChange.setChangeConditionList(map.get(0)); + budgetChange.setOrgConditionList(map.get(1)); + if(budgetChange.getNewAttachIds()!=null&&budgetChange.getNewAttachIds().length>0){ + budgetChange.setNewAttachInfos(sysAttachService.listByIds(Arrays.asList(budgetChange.getNewAttachIds()))); + } + if(budgetChange.getOrgAttachIds()!=null&&budgetChange.getOrgAttachIds().length>0){ + budgetChange.setOrgAttachInfos(sysAttachService.listByIds(Arrays.asList(budgetChange.getOrgAttachIds()))); + } + return budgetChange; + } + + @Override + public TbsBudgetChange getDetailByBudgetId(String budgetId,ChangeTypeEnum applyType) { + TbsBudget budget = tbsBudgetMapper.selectById(budgetId); + LambdaQueryWrapper conditionLqw = new LambdaQueryWrapper<>(); + conditionLqw.eq(TbsBudgetCondition::getBudgetId,budgetId); + conditionLqw.isNull(TbsBudgetCondition::getChangeId); + List conditions = tbsBudgetConditionService.list(conditionLqw); + LambdaQueryWrapper schItemBudgetLqw = new LambdaQueryWrapper<>(); + schItemBudgetLqw.eq(TbsScheduleItemBudget::getBudgetId,budgetId); + List scheduleItemBudgetList = tbsScheduleItemBudgetService.list(schItemBudgetLqw); + TbsBudgetChange budgetChange = TbsBudgetChange.toNewObject(budget); + if(applyType==null){ + budgetChange.setApplyType(budget.getBatchApplyFlag().equals(1)? + ChangeTypeEnum.batchApply.name(): + ChangeTypeEnum.apply.name()); + }else { + budgetChange.setApplyType(applyType.name()); + } + List budgetChangeConditions = conditions.stream() + .map(TbsBudgetChangeCondition::toNewObject).collect(Collectors.toList()); + List budgetChangeScheduleItemList = scheduleItemBudgetList.stream() + .map(TbsBudgetChangeScheduleItem::toNewObject).collect(Collectors.toList()); + budgetChange.setChangeScheduleItemList(budgetChangeScheduleItemList); + budgetChange.setChangeConditionList(budgetChangeConditions); + if(budget.getAttachIds()!=null&&budget.getAttachIds().length>0){ + budgetChange.setNewAttachIds(budget.getAttachIds()); + budgetChange.setNewAttachInfos(sysAttachService.listByIds(Arrays.asList(budget.getAttachIds()))); + } + return budgetChange; + } + + @Override + public List selectChangeVoList(TbsBudgetChangeSo query) { + query.setPageSize(PageUtil.getPageSize()); + query.setStartRow(PageUtil.getStartRow()); + List result = baseMapper.selectChangeVoList(query); +// for (TbsBudgetChangeVo changeVo : result) { +// if(changeVo.getBatchApplyFlag().equals(1)){ +// if(changeVo.getType().equals(ChangeTypeEnum.change.name())){ +// changeVo.setType(ChangeTypeEnum.batchChange.name()); +// }else { +// changeVo.setType(ChangeTypeEnum.batchApply.name()); +// } +// } +// } + return result; + } + + @Override + public Long countChangeVo(TbsBudgetChangeSo query) { + return baseMapper.countChangeVo(query); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public TbsBudgetChange commitApply(TbsBudgetUpdateAfterStartBo param) { + seeYonService.testConnection(); + TbsBudget budget = tbsBudgetMapper.selectById(param.getId()); + if(budget.getConditionFlag().equals(0)){ + if(CollectionUtil.isNotEmpty(param.getBrandIds())|| + CollectionUtil.isNotEmpty(param.getCategoryIds())|| + CollectionUtil.isNotEmpty(param.getSeriesIds())|| + CollectionUtil.isNotEmpty(param.getSpuIds())|| + CollectionUtil.isNotEmpty(param.getSkuIds()) + ){ + Assert.throwEx("不可添加品类条件"); + } + } + //防止多种情况申请修改而导致金额异常 + Long countExist = this.count( + new LambdaQueryWrapper() + .in(TbsBudgetChange::getBudgetId,budget.getId()) + .eq(TbsBudgetChange::getBudgetCheckState, TbsCommonCheckState.State_1_apply) + ); + if(countExist>0){ + Assert.throwEx("当前预算已存在修改审批"); + } + + if(param.getOrgChangeId()!=null){ + TbsBudgetChange orgBudgetChange = this.getById(param.getOrgChangeId()); + if(orgBudgetChange.getBudgetCheckState().equals(TbsCommonCheckState.State_3_setback)){ + orgBudgetChange.setBudgetCheckState(TbsCommonCheckState.State_5_close); + this.updateById(orgBudgetChange); + } + } + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + TbsBudgetChange budgetChange = this.buildBudgetChange(param, budget,sysUser); + String templateCode = TbsSeeYonConst.BudgetChangeConf.Code(); + Map data = new HashMap<>(); + data.put("exsp5", budgetChange.getChangeCode()); + data.put("orgId", budgetChange.getId().toString()); + data.put("applyUserCode", sysUser.getCode()); + data.put("applyUserName", sysUser.getName()); + data.put("empId", sysUser.getSyUserId()); + data.put("targetId", budgetChange.getId()+""); + data.put("targetCode", budgetChange.getChangeCode()); + data.put("budgetCode", budgetChange.getBudgetNumber()); + data.put("exsp1", templateCode); + //添加跳转地址业务 + String baseJumpUrl = JumpToUtil.getJumpUrl(projectProperties.getWebUrl(),templateCode,budgetChange.getId()+""); + data.put("cmsLink",baseJumpUrl); + data.put("rowDate", DateUtils.format(LocalDateTime.now(), DateFormatString.DATE_TIME)); + data.put("rowState","03"); + + BaseCreateProcessBo createProcess = new BaseCreateProcessBo(); + createProcess.setTemplateCode(templateCode); + createProcess.setMemberLoginName(sysUser.getSyAccount()); + createProcess.setSubjectTitle("[预算修改]"+budgetChange.getBudgetTitle()+"("+budgetChange.getBudgetNumber()+")"); + createProcess.setTargetId(budgetChange.getId()+""); + createProcess.setDataJson(JsonUtil.objectToJson(data)); + R flowIdResult = seeYonService.baseCreateProcess(createProcess); + if(flowIdResult.getStatus()!=200){ + Assert.throwEx("远程服务调用失败"); + } + String formId = null; + R formIdResult = seeYonService.getFormId(templateCode,budgetChange.getId()); + if(formIdResult.getStatus()==200){ + formId = formIdResult.getData(); + } + if(formId==null){ + log.error("[预算创建失败]={}",flowIdResult); + Assert.throwEx("获取表单ID失败"); + } + budgetChange.setSubmitTime(LocalDateTime.now()); + budgetChange.setBudgetCheckState(TbsCommonCheckState.State_1_apply); + budgetChange.setSyFormId(formId); + this.updateById(budgetChange); + //创建流程后回调 + BaseCreateCallbackBo callbackBo = new BaseCreateCallbackBo(templateCode,budgetChange.getId()+""); + seeYonService.createCallbackStatus(callbackBo); + + //请求校验是否成功 + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + AsyncFactory.submitBudgetChange(budgetChange.getId()+""); + return budgetChange; + + } + + /** + * 创建更变记录 + * @param param + * @param budget + * @param sysUser + * @return + */ + private TbsBudgetChange buildBudgetChange(TbsBudgetUpdateAfterStartBo param, TbsBudget budget,SysUser sysUser) { + TbsBudgetChange budgetChange = TbsBudgetChange.toNewObject(budget); + budgetChange.setOrgAttachIds(budget.getAttachIds()); + budgetChange.setNewAttachIds(param.getAttachIds()); + budgetChange.setChangeCode("BU"+CodeGenUtil.generate(CodeGenUtil.SourceKey.BudgetChange)); + budgetChange.setUserId(sysUser.getId()); + budgetChange.setUserCode(sysUser.getCode()); + budgetChange.setUserName(sysUser.getName()); + budgetChange.setRemark(param.getRemark()); + budgetChange.setBudgetCheckState(TbsCommonCheckState.State_1_apply); + boolean notChangeTitle = param.getBudgetCode()!=null&& param.getBudgetCode().equals(budget.getBudgetCode()); + if(!notChangeTitle){ + budgetChange.setNewBudgetTitle(param.getBudgetCode()); + } + this.save(budgetChange); + Long changeId = budgetChange.getId(); + //设置新条件 + List budgetConditionList = TbsBudgetConditionUtil.buildCondition( + budget.getId(), param.getBrandIds(), param.getCategoryIds(), param.getSeriesIds(), param.getSpuIds(), param.getSkuIds()); + List changeConditionList = budgetConditionList.stream().map(cond->{ + TbsBudgetChangeCondition changeCondition = TbsBudgetChangeCondition.toNewObject(cond); + changeCondition.setChangeId(changeId); + return changeCondition; + }).collect(Collectors.toList()); + for (TbsBudgetChangeCondition changeCondition : changeConditionList) { + tbsBudgetChangeConditionMapper.insert(changeCondition); + } + //记录旧条件 + LambdaQueryWrapper conditionLambdaQueryWrapper = new LambdaQueryWrapper<>(); + conditionLambdaQueryWrapper.eq(TbsBudgetCondition::getBudgetId,budget.getId()); + List orgBudgetCondition = tbsBudgetConditionMapper.selectList(conditionLambdaQueryWrapper); + for (TbsBudgetCondition budgetCondition : orgBudgetCondition) { + TbsBudgetChangeCondition changeCondition = TbsBudgetChangeCondition.toNewObject(budgetCondition); + changeCondition.setChangeId(changeId); + changeCondition.setSourceFlag(1); + tbsBudgetChangeConditionMapper.insert(changeCondition); + } + //设置金额 + List budgetAmtUpdateList = param.getBudgetAmtUpdateList(); + if(CollectionUtil.isNotEmpty(budgetAmtUpdateList)){ + //更变的周期项 + List budgetScheduleIds = budgetAmtUpdateList.stream().map(TbsBudgetAmtBo::getBudgetScheduleItemId).collect(Collectors.toList()); + List budgetLogWithAmountList = tbsScheduleItemBudgetMapper.getSumAmtInList(budgetScheduleIds,Arrays.asList(0,2,3)); + //所有的周期项 + List allScheduleItemBudgetList = tbsScheduleItemBudgetMapper + .selectList(new LambdaQueryWrapper().eq(TbsScheduleItemBudget::getBudgetId,budget.getId())); + List changeScheduleItemList = new ArrayList<>(); + for (TbsScheduleItemBudget scheduleItemBudget : allScheduleItemBudgetList) { + if(!scheduleItemBudget.getBudgetId().equals(budget.getId())){ + Assert.throwEx("参数异常!!"); + } + boolean isChange = budgetScheduleIds.stream().anyMatch(a->a.equals(scheduleItemBudget.getId())); + TbsBudgetChangeScheduleItem resultItem = TbsBudgetChangeScheduleItem.toNewObject(scheduleItemBudget); + resultItem.setChangeId(changeId); + resultItem.setChangeFlag(isChange?1:0); + //设置当前项调整的最终金额 + for (TbsBudgetLogWithAmount withAmount : budgetLogWithAmountList) { + if(withAmount.getId().equals(scheduleItemBudget.getId())){ + resultItem.setBudgetAmount(withAmount.getAmt()); + break; + } + } + //设置更新的金额 + for (TbsBudgetAmtBo budgetAmtBo : budgetAmtUpdateList) { + if(budgetAmtBo.getBudgetScheduleItemId().equals(scheduleItemBudget.getId())){ + resultItem.setNewPreDispatchAmount(budgetAmtBo.getPreDispatchAmount()); + resultItem.setNewBudgetAmount(budgetAmtBo.getBudgetAmount()); + break; + } + } + changeScheduleItemList.add(resultItem); + } + for (TbsBudgetChangeScheduleItem item : changeScheduleItemList) { + tbsBudgetChangeScheduleItemMapper.insert(item); + } + } + return budgetChange; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetConditionServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetConditionServiceImpl.java new file mode 100644 index 0000000..1e071f0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetConditionServiceImpl.java @@ -0,0 +1,37 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsBudgetCondition; +import com.qs.serve.modules.tbs.service.TbsBudgetConditionService; +import com.qs.serve.modules.tbs.mapper.TbsBudgetConditionMapper; + +import java.util.List; + +/** + * 预算条件 服务实现类 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsBudgetConditionServiceImpl extends ServiceImpl implements TbsBudgetConditionService { + + @Override + public List getByBudgetId(Long budgetId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsBudgetCondition::getBudgetId,budgetId); + return this.list(lqw); + } + + @Override + public Long findUnMatchConditionBySourceBudgetIdAndTargetBudgetId(Long sourceId,Long targetId){ + return this.baseMapper.findUnMatchConditionBySourceBudgetIdAndTargetBudgetId(sourceId,targetId); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetCostItemPolicyServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetCostItemPolicyServiceImpl.java new file mode 100644 index 0000000..8579081 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetCostItemPolicyServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsBudgetCostItemPolicy; +import com.qs.serve.modules.tbs.service.TbsBudgetCostItemPolicyService; +import com.qs.serve.modules.tbs.mapper.TbsBudgetCostItemPolicyMapper; + +/** + * 预算费用明细 服务实现类 + * @author YenHex + * @since 2023-02-22 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsBudgetCostItemPolicyServiceImpl extends ServiceImpl implements TbsBudgetCostItemPolicyService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetCostItemServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetCostItemServiceImpl.java new file mode 100644 index 0000000..079695d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetCostItemServiceImpl.java @@ -0,0 +1,58 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.util.CollectionUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsBudgetCostItem; +import com.qs.serve.modules.tbs.service.TbsBudgetCostItemService; +import com.qs.serve.modules.tbs.mapper.TbsBudgetCostItemMapper; + +import java.util.ArrayList; +import java.util.List; + +/** + * 预算费用明细 服务实现类 + * @author YenHex + * @since 2022-12-02 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsBudgetCostItemServiceImpl extends ServiceImpl implements TbsBudgetCostItemService { + + @Override + public void removeByCostApplyId(Long costApplyId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsBudgetCostItem::getCostApplyId,costApplyId); + this.remove(lqw); + } + + @Override + public List listByScheduleItemBudgetIds(List ids,Long neCostApplyId) { + if(CollectionUtil.isNotEmpty(ids)){ + LambdaQueryWrapper costLqw = new LambdaQueryWrapper<>(); + costLqw.in(TbsBudgetCostItem::getScheduleItemBudgetId,ids); + costLqw.eq(TbsBudgetCostItem::getInvalidFlag,0); + if(neCostApplyId!=null){ + costLqw.ne(TbsBudgetCostItem::getCostApplyId,neCostApplyId); + } + return this.list(costLqw); + } + return new ArrayList<>(); + } + + @Override + public List listByCostApplyId(Long costApplyId) { + if(costApplyId!=null){ + LambdaQueryWrapper costLqw = new LambdaQueryWrapper<>(); + costLqw.eq(TbsBudgetCostItem::getCostApplyId,costApplyId); + return this.list(costLqw); + } + return new ArrayList<>(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetLogServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetLogServiceImpl.java new file mode 100644 index 0000000..8417a52 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetLogServiceImpl.java @@ -0,0 +1,32 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tzc.entity.TzcPolicy; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.omg.CORBA.DynAnyPackage.Invalid; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.service.TbsBudgetLogService; +import com.qs.serve.modules.tbs.mapper.TbsBudgetLogMapper; + +import java.math.BigDecimal; + +/** + * 预算日志 服务实现类 + * @author YenHex + * @since 2023-01-05 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsBudgetLogServiceImpl extends ServiceImpl implements TbsBudgetLogService { + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetManagerServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetManagerServiceImpl.java new file mode 100644 index 0000000..87047da --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetManagerServiceImpl.java @@ -0,0 +1,158 @@ +package com.qs.serve.modules.tbs.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetMatchMsgVo; +import com.qs.serve.modules.tbs.mapper.*; +import com.qs.serve.modules.tbs.service.TbsActivityCenterGoodsService; +import com.qs.serve.modules.tbs.service.TbsBudgetManagerService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/12/28 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsBudgetManagerServiceImpl implements TbsBudgetManagerService { + + private final TbsActivityMapper activityMapper; + private final TbsActivityCenterMapper activityCenterMapper; + private final TbsActivitySubjectMapper activitySubjectMapper; + private final TbsActivityGoodsMapper activityGoodsMapper; + private final TbsBudgetMapper budgetMapper; + private final TbsBudgetConditionMapper budgetConditionMapper; + private final TbsScheduleItemBudgetMapper scheduleItemBudgetMapper; + + @Override + public List listBudgetIdsByActivityId(List activityIds) { + //加载基础数据 + QueryWrapper acgLqw = new QueryWrapper<>(); + acgLqw.in("activity_id",activityIds); + List allCenterList = activityCenterMapper.selectList(acgLqw); + List centerComboList = allCenterList.stream().map(a->a.getCenterType()+"_"+a.getCenterId()).distinct().collect(Collectors.toList()); + List allSubjectList = activitySubjectMapper.selectList(acgLqw); + List subjectIds = allSubjectList.stream().map(TbsActivitySubject::getSubjectId).distinct().collect(Collectors.toList()); + subjectIds.add(0L); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.and(a->{ + a.eq(TbsBudget::getSubjectId,0) + .or().in(TbsBudget::getSubjectId,subjectIds); + + }).in(TbsBudget::getCenterCombo,centerComboList) + .eq(TbsBudget::getStopFlag,0) + .select(TbsBudget::getId); + List budgetList = budgetMapper.selectList(lqw); + return budgetList.stream().map(TbsBudget::getId).collect(Collectors.toList()); + } + + @Override + public List compare(List activityIds, List budgetIds) { + if(CollectionUtil.isEmpty(activityIds)||CollectionUtil.isEmpty(budgetIds)){ + return new ArrayList<>(); + } + //加载基础数据 + QueryWrapper acgLqw = new QueryWrapper<>(); + acgLqw.in("activity_id",activityIds); + + List budgetList = budgetMapper.selectBatchIds(budgetIds); + List activityList = activityMapper.selectBatchIds(activityIds); + List allCenterList = activityCenterMapper.selectList(acgLqw); + List allSubjectList = activitySubjectMapper.selectList(acgLqw); + List allGoodsList = activityGoodsMapper.selectList(acgLqw); + + Map> centerListMap = allCenterList.stream().collect(Collectors.groupingBy(TbsActivityCenter::getActivityId)); + Map> subjectListMap = allSubjectList.stream().collect(Collectors.groupingBy(TbsActivitySubject::getActivityId)); + Map> goodsListMap = allGoodsList.stream().collect(Collectors.groupingBy(TbsActivityGoods::getActivityId)); + + LambdaQueryWrapper conditionLqw = new LambdaQueryWrapper<>(); + conditionLqw.in(TbsBudgetCondition::getBudgetId,budgetIds); + List allConditionList = budgetConditionMapper.selectList(conditionLqw); + Map> conditionListMap = allConditionList.stream().collect(Collectors.groupingBy(TbsBudgetCondition::getBudgetId)); + + LambdaQueryWrapper sibLqw = new LambdaQueryWrapper<>(); + sibLqw.in(TbsScheduleItemBudget::getBudgetId,budgetIds); + List allItemBudgetList = scheduleItemBudgetMapper.selectList(sibLqw); + Map> allItemBudgetListMap = allItemBudgetList.stream().collect(Collectors.groupingBy(TbsScheduleItemBudget::getBudgetId)); + + List msgVoList = new ArrayList<>(); + //匹对 + for (TbsBudget budget : budgetList) { + for (TbsActivity activity : activityList) { + Long budgetId = budget.getId(); + Long activityId = activity.getId(); + //判断科目 + if(!budget.getSubjectId().equals(0L)){ + List subjectList = subjectListMap.get(activityId); + for (TbsActivitySubject subject : subjectList) { + if(!subject.getSubjectId().equals(budget.getSubjectId())){ + String msg = "无法匹配科目["+subject.getSubjectCode()+"]"+subject.getSubjectName(); + msgVoList.add(new TbsBudgetMatchMsgVo(budget,activity,msg)); + } + } + } + //判断成本中心 + List centerList = centerListMap.get(activityId); + for (TbsActivityCenter center : centerList) { + if(!center.getCenterType().equals(budget.getCenterType())||!center.getCenterId().equals(budget.getCenterId())){ + String msg = "无法匹配成本中心["+center.getCenterCode()+"]"+center.getCenterName(); + msgVoList.add(new TbsBudgetMatchMsgVo(budget,activity,msg)); + } + } + + //判断时间 + List scheduleItemBudgetList = allItemBudgetListMap.get(budgetId); + boolean isTimeMatch = false; + for (TbsScheduleItemBudget itemBudget : scheduleItemBudgetList) { + boolean startFlag = activity.getActStartDate().atStartOfDay().isAfter(itemBudget.getStartDate()); + boolean endFlag = activity.getActEndDate().atStartOfDay().isBefore(itemBudget.getEndDate()); + if(startFlag&&endFlag){ + isTimeMatch = true; + } + } + if(!isTimeMatch){ + String msg = "时间不匹配,活动时间:"+activity.getActStartDate().toString()+"-"+activity.getActEndDate().toString(); + msgVoList.add(new TbsBudgetMatchMsgVo(budget,activity,msg)); + } + + //判断品类 + if(budget.getConditionFlag().equals(1)){ + List budgetConditionList = conditionListMap.get(budgetId); + List activityGoodsList = goodsListMap.get(activityId); + for (TbsActivityGoods goods : activityGoodsList) { + boolean isMatch = false; + if(CollUtil.isNotEmpty(budgetConditionList)){ + for (TbsBudgetCondition condition : budgetConditionList) { + if(goods.getTargetLevelPathIds().contains(condition.getTargetLevelPathIds())){ + isMatch = true; + break; + } + } + } + if(!isMatch){ + String msg = "品类不匹配["+goods.getTargetCode()+"]"+goods.getTargetName(); + msgVoList.add(new TbsBudgetMatchMsgVo(budget,activity,msg)); + } + } + } + } + + } + + return msgVoList; + } + + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetPlanServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetPlanServiceImpl.java new file mode 100644 index 0000000..ada5ce5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetPlanServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsBudgetPlan; +import com.qs.serve.modules.tbs.service.TbsBudgetPlanService; +import com.qs.serve.modules.tbs.mapper.TbsBudgetPlanMapper; + +/** + * 预算 服务实现类 + * @author YenHex + * @since 2023-07-10 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsBudgetPlanServiceImpl extends ServiceImpl implements TbsBudgetPlanService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetServiceImpl.java new file mode 100644 index 0000000..f1514f7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsBudgetServiceImpl.java @@ -0,0 +1,1270 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.config.properties.ProjectProperties; +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.*; +import com.qs.serve.common.util.model.DateFormatString; +import com.qs.serve.modules.bms.entity.BmsSubject; +import com.qs.serve.modules.bms.service.BmsSubjectService; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.entity.dto.TbsCenterDto; +import com.qs.serve.modules.goods.service.GoodsCategoryService; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.seeyon.entity.BaseCreateCallbackBo; +import com.qs.serve.modules.seeyon.entity.BaseCreateProcessBo; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.sync.AsyncFactory; +import com.qs.serve.modules.sys.common.AuthContextUtils; +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.common.TbsCommonCheckState; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.bo.*; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetVo; +import com.qs.serve.modules.tbs.mapper.TbsActivityTemplateMapper; +import com.qs.serve.modules.tbs.mapper.TbsBudgetChangeMapper; +import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; +import com.qs.serve.modules.tzc.service.TzcPolicyItemService; +import com.qs.serve.modules.vtb.entity.VtbFundFlow; +import com.qs.serve.modules.vtb.service.VtbFundFlowService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 预算 服务实现类 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsBudgetServiceImpl extends ServiceImpl implements TbsBudgetService { + + private final BmsSubjectService subjectService; + private final TbsScheduleService scheduleService; + private final TbsBudgetConditionService budgetConditionService; + private final TbsBudgetChangeMapper tbsBudgetChangeMapper; + private final TbsBudgetLogService budgetLogService; + private final TbsScheduleItemBudgetService scheduleItemBudgetService; + private final TbsScheduleItemService scheduleItemService; + private final TbsCenterDtoService tbsCenterDtoService; + + private final GoodsSkuService goodsSkuService; + private final GoodsSpuService goodsSpuService; + private final GoodsCategoryService goodsCategoryService; + private final SysUserService sysUserService; + + private final TbsActivityCenterService tbsActivityCenterService; + private final TbsActivityCenterGoodsService tbsActivityCenterGoodsService; + private final TbsBudgetCostItemService tbsBudgetCostItemService; + private final TzcPolicyItemService tzcPolicyItemService; + private final TbsBudgetCostItemPolicyService tbsBudgetCostItemPolicyService; + private final VtbFundFlowService vtbFundFlowService; + private final TbsActivityTemplateMapper tbsActivityTemplateMapper; + + private RedisService redisService; + private SysAttachService attachService; + private SeeYonRequestService seeYonService; + private ProjectProperties projectProperties; + + + @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()); + + if(tbsBudget.getBudgetState().equals(1)){ + Assert.throwEx("已开启"); + } + Map data = new HashMap<>(); + data.put("exsp5", tbsBudget.getBudgetCode()); + data.put("orgId", tbsBudget.getId().toString()); + data.put("applyUserCode", sysUser.getCode()); + data.put("applyUserName", sysUser.getName()); + data.put("empId", sysUser.getSyUserId()); + data.put("targetId", tbsBudget.getId()+""); + data.put("targetCode", tbsBudget.getBudgetNumber()); + data.put("budgetCode", tbsBudget.getBudgetNumber()); + data.put("exsp1",templateCode); + //添加跳转地址业务 + String baseJumpUrl = JumpToUtil.getJumpUrl(projectProperties.getWebUrl(),templateCode,id+""); + data.put("cmsLink",baseJumpUrl); + data.put("rowDate",DateUtils.format(LocalDateTime.now(), DateFormatString.DATE_TIME)); + data.put("rowState","03"); + BaseCreateProcessBo createProcess = new BaseCreateProcessBo(); + createProcess.setTemplateCode(templateCode); + createProcess.setMemberLoginName(sysUser.getSyAccount()); + createProcess.setSubjectTitle(tbsBudget.getBudgetCode()+"【"+tbsBudget.getBudgetNumber()+"】"); + createProcess.setTargetId(tbsBudget.getId()+""); + createProcess.setDataJson(JsonUtil.objectToJson(data)); + R flowIdResult = seeYonService.baseCreateProcess(createProcess); + if(flowIdResult.getStatus()!=200){ + Assert.throwEx("远程服务调用失败"); + } + String formId = null; + R formIdResult = seeYonService.getFormId(templateCode,tbsBudget.getId()); + if(formIdResult.getStatus()==200){ + formId = formIdResult.getData(); + } + if(formId==null){ + log.error("[预算创建失败]={}",flowIdResult); + Assert.throwEx("获取表单ID失败"); + } + tbsBudget.setSubmitTime(LocalDateTime.now()); + tbsBudget.setBudgetCheckState(TbsCommonCheckState.State_1_apply); + tbsBudget.setSyFormId(formId); + tbsBudget.setUserId(sysUser.getId()); + tbsBudget.setUserCode(sysUser.getCode()); + tbsBudget.setUserName(sysUser.getName()); + tbsBudget.setBatchApplyFlag(0); + tbsBudget.setBatchApplyId(0L); + this.updateById(tbsBudget); + + //创建流程后回调 + BaseCreateCallbackBo callbackBo = new BaseCreateCallbackBo(templateCode,tbsBudget.getId()+""); + seeYonService.createCallbackStatus(callbackBo); + + //请求校验是否成功 + AsyncManager.me().execute(AsyncFactory.submitBudgetApply(tbsBudget.getId()+"")); + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void modify(TbsBudgetBo budgetBo) { + if(budgetBo.getSubjectId()==null){ + budgetBo.setSubjectId(0L); + } + TbsBudget budget; + if(budgetBo.getId()!=null){ + budget = this.getById(budgetBo.getId()); + if(budget==null){ + Assert.throwEx("预算不存在或被移除"); + } + if(budget.getBudgetState().equals(1)){ + Assert.throwEx("已开启的预算无法编辑"); + } + if(budget.getBudgetCheckState().equals(TbsCommonCheckState.State_1_apply)){ + Assert.throwEx("预算审批中无法编辑"); + } + LambdaQueryWrapper lqwName = new LambdaQueryWrapper<>(); + lqwName.eq(TbsBudget::getBudgetCode,budgetBo.getBudgetCode()); + lqwName.ne(TbsBudget::getId,budgetBo.getId()); + if(this.count(lqwName)>0){ + Assert.throwEx("名称已存在"); + } + //移除旧的条件数据 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsBudgetCondition::getBudgetId,budget.getId()); + budgetConditionService.remove(lqw); + }else { + LambdaQueryWrapper lqwName = new LambdaQueryWrapper<>(); + lqwName.eq(TbsBudget::getBudgetCode,budgetBo.getBudgetCode()); + if(this.count(lqwName)>0){ + Assert.throwEx("名称已存在"); + } + budget = CopierUtil.copy(budgetBo,new TbsBudget()); + budget.setBudgetNumber("BM"+CodeGenUtil.generate(CodeGenUtil.SourceKey.Budget)); + } + List skuIds = budgetBo.getSkuIds(); + List spuIds = budgetBo.getSpuIds(); + List seriesIds = budgetBo.getSeriesIds(); + List brandIds = budgetBo.getBrandIds(); + List categoryIds = budgetBo.getCategoryIds(); + Long scheduleId = budgetBo.getScheduleId(); + //添加条件拦截 + boolean sameCondition = filterSameCondition(scheduleId,budget,skuIds, spuIds, seriesIds, brandIds, categoryIds); + if(sameCondition){ + Assert.throwEx("已存在相同条件预算"); + } + budget.setBudgetCode(budgetBo.getBudgetCode()); + budget.setSubjectId(budgetBo.getSubjectId()); + budget.setAttachIds(budgetBo.getAttachIds()); + budget.setInactiveFlag(budgetBo.getInactiveFlag()); + //设置指定模板 + budget.setTemplateIds(new String[]{}); + if(budgetBo.getTemplateFlag()!=null&&budgetBo.getTemplateFlag().equals(1)){ + if(budgetBo.getTemplateIds()!=null&&budgetBo.getTemplateIds().length>0){ + budget.setTemplateIds(budgetBo.getTemplateIds()); + } + budget.setTemplateFlag(1); + }else { + budget.setTemplateFlag(0); + } + BmsSubject subject = null; + if(budget.getSubjectId()!=0L){ + subject = subjectService.getById(budgetBo.getSubjectId()); + } + TbsCenterDto centerDto = tbsCenterDtoService.getCenterDto(budgetBo.getCenterType(),budgetBo.getCenterId()); + TbsSchedule schedule = scheduleService.getById(budgetBo.getScheduleId()); + initEmptyBudget(budget,subject,centerDto,schedule); + //保存 费用项 + List scheduleItems = scheduleItemService.listByScheduleId(schedule.getId()); + List scheduleItemBudgets = new ArrayList<>(); + for (TbsScheduleItem scheduleItem : scheduleItems) { + TbsScheduleItemBudget itemBudget = new TbsScheduleItemBudget(); + itemBudget.setScheduleId(scheduleItem.getScheduleId()); + itemBudget.setScheduleItemId(scheduleItem.getId()); + itemBudget.setItemName(scheduleItem.getItemName()); + itemBudget.setStartDate(scheduleItem.getStartDate()); + itemBudget.setEndDate(scheduleItem.getEndDate()); + itemBudget.setBudgetId(budget.getId()); + for (TbsBudgetBo.ScheduleItem boScheduleItem : budgetBo.getScheduleItems()) { + if(scheduleItem.getId().equals(boScheduleItem.getScheduleItemId())){ + itemBudget.setBudgetAmount(boScheduleItem.getAmount()); + itemBudget.setPreDispatchAmount(boScheduleItem.getPreDispatchAmount()); + break; + } + } + if(itemBudget.getBudgetAmount()==null){ + Assert.throwEx("考核期周期需设置金额"); + } + scheduleItemBudgets.add(itemBudget); + } + scheduleItemBudgetService.saveBatch(scheduleItemBudgets); + //设置条件 + if(budget.getId()!=null){ + this.updateById(budget); + }else { + this.save(budget); + } + buildCondition(budget.getId(),brandIds,categoryIds,seriesIds,spuIds,skuIds); + //冗余字段初始化 + baseMapper.updateBudgetCondition(budget.getId()); + baseMapper.updateBudgetComboCenter(budget.getId()); + //实时更新预算条件 + List conditionIds = baseMapper.selectConditionBudgetIds(); + if(CollectionUtil.isNotEmpty(conditionIds)){ + TbsBudget budget1 = new TbsBudget(); + budget1.setConditionFlag(1); + baseMapper.update(budget1,new LambdaQueryWrapper() + .in(TbsBudget::getId,conditionIds)); + } + } + + /** + * 拦截相同条件的预算 + * @param scheduleId + * @param budget + * @param skuIds + * @param spuIds + * @param seriesIds + * @param brandIds + * @param categoryIds + * @return 满足无条件的返回true + */ + private boolean filterSameCondition(Long scheduleId,TbsBudget budget,List skuIds, List spuIds, List seriesIds, List brandIds, List categoryIds) { + boolean hasCondition = CollectionUtil.isNotEmpty(skuIds)|| + CollectionUtil.isNotEmpty(spuIds)|| + CollectionUtil.isNotEmpty(seriesIds)|| + CollectionUtil.isNotEmpty(brandIds)|| + CollectionUtil.isNotEmpty(categoryIds); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsBudget::getSubjectId,budget.getSubjectId()); + lqw.eq(TbsBudget::getCenterType,budget.getCenterType()); + lqw.eq(TbsBudget::getCenterId,budget.getCenterId()); + lqw.eq(TbsBudget::getScheduleId,scheduleId); + //忽略更新情况 + if(budget.getId()!=null){ + lqw.ne(TbsBudget::getId,budget.getId()); + } + //区分有无条件情况 + if(hasCondition){ + lqw.eq(TbsBudget::getConditionFlag,1); + lqw.select(TbsBudget::getId); + List budgetList = this.list(lqw); + if(budgetList.size()<1){return false;} + List budgetIds = budgetList.stream().map(TbsBudget::getId).collect(Collectors.toList()); + //存储相同条件的预算id + budgetIds = baseFilterBudgetIds(brandIds,TbsGoodsType.brand.name(),budgetIds); + if(CollectionUtil.isNotEmpty(budgetIds)){ + budgetIds = baseFilterBudgetIds(seriesIds,TbsGoodsType.series.name(),budgetIds); + if(CollectionUtil.isNotEmpty(budgetIds)){ + budgetIds = baseFilterBudgetIds(categoryIds,TbsGoodsType.category.name(),budgetIds); + if(CollectionUtil.isNotEmpty(budgetIds)){ + budgetIds = baseFilterBudgetIds(spuIds,TbsGoodsType.spu.name(),budgetIds); + if(CollectionUtil.isNotEmpty(budgetIds)){ + budgetIds = baseFilterBudgetIds(skuIds,TbsGoodsType.sku.name(),budgetIds); + if(CollectionUtil.isNotEmpty(budgetIds)){ + return true; + } + } + } + } + } + }else { + //满足无条件的返回true + lqw.eq(TbsBudget::getConditionFlag,0); + return this.count(lqw)>0; + } + return false; + } + + /** + * 根据品类获取预算id列表 + * @param targetIds + * @param targetType + * @return + */ + private List baseFilterBudgetIds(List targetIds, String targetType, List budgetIds){ + if(CollectionUtil.isNotEmpty(targetIds)&&CollectionUtil.isNotEmpty(budgetIds)){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(TbsBudgetCondition::getBudgetId); + lqw.eq(TbsBudgetCondition::getTargetType,targetType); + lqw.in(TbsBudgetCondition::getTargetId, targetIds); + lqw.in(TbsBudgetCondition::getBudgetId,budgetIds); + List conditions = budgetConditionService.list(lqw); + if(conditions.size()<1){ + return new ArrayList<>(); + } + budgetIds = conditions.stream().map(TbsBudgetCondition::getBudgetId).distinct().collect(Collectors.toList()); + //排插被包含关系 + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(); + lqw2.eq(TbsBudgetCondition::getTargetType,targetType); + lqw2.in(TbsBudgetCondition::getBudgetId,budgetIds); + List conditions2 = budgetConditionService.list(lqw2); + Map> conditions2Map = conditions2.stream() + .collect(Collectors.groupingBy(TbsBudgetCondition::getBudgetId)); + List selectBudgetIds = new ArrayList<>(); + for (Long budgetId : conditions2Map.keySet()) { + int size = conditions2Map.get(budgetId).size(); + if(size==targetIds.size()){ + selectBudgetIds.add(budgetId); + } + } + budgetIds = selectBudgetIds; + return budgetIds; + } + return budgetIds; + } + + @Override + public void startBudget(Long id) { + TbsBudget budget = this.getById(id); + if(budget.getBudgetState().equals(1)){ + Assert.throwEx("已开启"); + } + budget.setBudgetState(1); + budget.setBudgetCheckState(TbsCommonCheckState.State_2_finished); + this.updateById(budget); + SysUser sysUser = sysUserService.getById(budget.getUserId()); + + //补偿缺失的编码 + List scheduleItems = scheduleItemService.listByScheduleId(budget.getScheduleId()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsScheduleItemBudget::getBudgetId,id); + List scheduleItemBudgets = scheduleItemBudgetService.list(lqw); + List addSchItemBudgets = new ArrayList<>(); + for (TbsScheduleItem item : scheduleItems) { + boolean match = false; + for (TbsScheduleItemBudget itemBudget : scheduleItemBudgets) { + if (item.getId().equals(itemBudget.getScheduleItemId())){ + match = true; + } + } + if(!match){ + TbsScheduleItemBudget itemBudget = new TbsScheduleItemBudget(); + itemBudget.setScheduleId(item.getScheduleId()); + itemBudget.setScheduleItemId(item.getId()); + itemBudget.setItemName(item.getItemName()); + itemBudget.setStartDate(item.getStartDate()); + itemBudget.setEndDate(item.getEndDate()); + itemBudget.setBudgetId(id); + itemBudget.setBudgetAmount(BigDecimal.ZERO); + itemBudget.setPreDispatchAmount(BigDecimal.ZERO); + itemBudget.setPreDispatchAmountFirst(BigDecimal.ZERO); + addSchItemBudgets.add(itemBudget); + } + } + if(addSchItemBudgets.size()>0){ + scheduleItemBudgetService.saveBatch(addSchItemBudgets); + scheduleItemBudgets.addAll(addSchItemBudgets); + } + + + //保存预算流水日志 + List budgetLogList = new ArrayList<>(); + for (TbsScheduleItemBudget scheduleItemBudget : scheduleItemBudgets) { + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.toTbsBudgetLog(sysUser, budget, scheduleItemBudget,BudgetLogOptFlag.State_0,scheduleItemBudget.getBudgetAmount()); + budgetLogList.add(budgetLog); + } + budgetLogService.saveBatch(budgetLogList); + } + + @Override + public void updateTemplates(TbsBudgetTempBo tempBo) { + TbsBudget budget = new TbsBudget(); + budget.setId(tempBo.getId()); + budget.setTemplateIds(new String[]{}); + if(tempBo.getTemplateFlag()!=null&&tempBo.getTemplateFlag().equals(1)){ + if(tempBo.getTemplateIds()!=null&&tempBo.getTemplateIds().length>0){ + budget.setTemplateIds(tempBo.getTemplateIds()); + } + budget.setTemplateFlag(1); + }else { + budget.setTemplateFlag(0); + } + this.updateById(budget); + } + + @Override + public TbsBudget getByCode(String code) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsBudget::getBudgetCode,code); + return getOne(lqw,false); + } + + +// @Override +// public List listBudgetExcel(List budgetIds) { +// List budgetList = null; +// //考核期项 +// if (budgetIds==null||budgetIds.size()<1){ +// budgetList = this.list(); +// budgetIds = budgetList.stream().map(TbsBudget::getId).collect(Collectors.toList()); +// }else { +// budgetList = this.listByIds(budgetIds); +// } +// if(budgetIds.size()<1){ +// return null; +// } +// LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(); +// lqw2.in(TbsScheduleItemBudget::getBudgetId,budgetIds); +// List scheduleItemBudgets = scheduleItemBudgetService.list(lqw2); +// Map> listScheduleMapByBudgetId = scheduleItemBudgets.stream().collect(Collectors.groupingBy(TbsScheduleItemBudget::getBudgetId)); +// //加载条件 +// LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); +// lqw.in(TbsBudgetCondition::getBudgetId,budgetIds); +// List budgetConditions = budgetConditionService.list(lqw); +// Map> listConditionMapByBudgetId = budgetConditions.stream().collect(Collectors.groupingBy(TbsBudgetCondition::getBudgetId)); +// //拼装 +// return budgetList.stream().map(budget->{ +// TbsBudgetExcelBo excelBo = new TbsBudgetExcelBo(); +// excelBo.setBudgetCode(budget.getBudgetCode()); +// excelBo.setSubjectName(budget.getSubjectName()); +// excelBo.setCenterType(budget.getCenterType()); +// excelBo.setCenterName(budget.getCenterName()); +// excelBo.setCenterCode(budget.getCenterCode()); +// excelBo.setScheduleName(budget.getScheduleName()); +// excelBo.setRemark(budget.getRemark()); +// +// //拼装条件 +// List budgetConditionsOfBudget = listConditionMapByBudgetId.get(budget.getId()); +// if(budgetConditionsOfBudget!=null){ +// Map> listMap = budgetConditionsOfBudget.stream().collect(Collectors.groupingBy(TbsBudgetCondition::getTargetType)); +// List brandConditions = listMap.get(TbsGoodsType.brand.name()); +// List categoryConditions = listMap.get(TbsGoodsType.category.name()); +// List seriesConditions = listMap.get(TbsGoodsType.series.name()); +// List spuConditions = listMap.get(TbsGoodsType.spu.name()); +// List skuConditions = listMap.get(TbsGoodsType.sku.name()); +// +// excelBo.setBrandNames(getConditionNames(brandConditions)); +// excelBo.setCategoryNames(getConditionNames(categoryConditions)); +// excelBo.setSeriesNames(getConditionNames(seriesConditions)); +// excelBo.setSpuNames(getConditionNames(spuConditions)); +// excelBo.setSkuCodes(getConditionCodes(skuConditions)); +// excelBo.setSkuNames(getConditionSkus(skuConditions)); +// } +// +// //拼装考核期项 +// List scheduleItemBudgetList = listScheduleMapByBudgetId.get(budget.getId()); +// if(scheduleItemBudgetList!=null){ +// for (TbsScheduleItemBudget itemBudget : scheduleItemBudgetList) { +// if(itemBudget.getItemName().equals("M1")){ +// excelBo.setAmountM1(itemBudget.getBudgetAmount()); +// }else if (itemBudget.getItemName().equals("M2")){ +// excelBo.setAmountM2(itemBudget.getBudgetAmount()); +// }else if (itemBudget.getItemName().equals("M3")){ +// excelBo.setAmountM3(itemBudget.getBudgetAmount()); +// }else if (itemBudget.getItemName().equals("M4")){ +// excelBo.setAmountM4(itemBudget.getBudgetAmount()); +// }else if (itemBudget.getItemName().equals("M5")){ +// excelBo.setAmountM5(itemBudget.getBudgetAmount()); +// }else if (itemBudget.getItemName().equals("M6")){ +// excelBo.setAmountM6(itemBudget.getBudgetAmount()); +// }else if (itemBudget.getItemName().equals("M7")){ +// excelBo.setAmountM7(itemBudget.getBudgetAmount()); +// }else if (itemBudget.getItemName().equals("M8")){ +// excelBo.setAmountM8(itemBudget.getBudgetAmount()); +// }else if (itemBudget.getItemName().equals("M9")){ +// excelBo.setAmountM9(itemBudget.getBudgetAmount()); +// }else if (itemBudget.getItemName().equals("M10")){ +// excelBo.setAmountM10(itemBudget.getBudgetAmount()); +// }else if (itemBudget.getItemName().equals("M11")){ +// excelBo.setAmountM11(itemBudget.getBudgetAmount()); +// }else if (itemBudget.getItemName().equals("M12")){ +// excelBo.setAmountM12(itemBudget.getBudgetAmount()); +// }else if (itemBudget.getItemName().equals("Q1")){ +// excelBo.setAmountQ1(itemBudget.getBudgetAmount()); +// }else if (itemBudget.getItemName().equals("Q2")){ +// excelBo.setAmountQ2(itemBudget.getBudgetAmount()); +// }else if (itemBudget.getItemName().equals("Q3")){ +// excelBo.setAmountQ3(itemBudget.getBudgetAmount()); +// }else if (itemBudget.getItemName().equals("Q4")){ +// excelBo.setAmountQ4(itemBudget.getBudgetAmount()); +// }else if (itemBudget.getItemName().equals("Y")){ +// excelBo.setAmountYear(itemBudget.getBudgetAmount()); +// } +// } +// } +// return excelBo; +// }).collect(Collectors.toList()); +// } + + private List getConditionNames(List conditions){ + if(CollectionUtil.isNotEmpty(conditions)){ + return conditions.stream().map(TbsBudgetCondition::getTargetName).collect(Collectors.toList()); + } + return null; + } + + private List getConditionSkus(List conditions){ + if(CollectionUtil.isNotEmpty(conditions)){ + List strings = new ArrayList<>(); + for (TbsBudgetCondition budgetCondition : conditions) { + try { + String[] names = budgetCondition.getTargetLevelPathNames().split("_"); + String string = names[names.length-2] +"("+ names[names.length-1] +")"; + strings.add(string); + } catch (Exception e) { + log.error("格式错误:{}",budgetCondition.getTargetLevelPathNames()); + } + } + return strings; + } + return null; + } + + private List getConditionCodes(List conditions){ + if(CollectionUtil.isNotEmpty(conditions)){ + return conditions.stream().map(TbsBudgetCondition::getTargetCode).collect(Collectors.toList()); + } + return null; + } + + @Override + public TbsBudgetVo toVoEntity(TbsBudget budget) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsBudgetCondition::getBudgetId,budget.getId()); + List budgetConditions = budgetConditionService.list(lqw); + Map> listMap = budgetConditions.stream().collect(Collectors.groupingBy(TbsBudgetCondition::getTargetType)); + TbsBudgetVo budgetVo = CopierUtil.copy(budget,new TbsBudgetVo()); + budgetVo.setBrandConditions(listMap.get(TbsGoodsType.brand.name())); + budgetVo.setCategoryConditions(listMap.get(TbsGoodsType.category.name())); + budgetVo.setSeriesConditions(listMap.get(TbsGoodsType.series.name())); + List skuCondition = listMap.get(TbsGoodsType.sku.name()); + if(skuCondition!=null){ + for (TbsBudgetCondition budgetCondition : skuCondition) { + try { + String[] names = budgetCondition.getTargetLevelPathNames().split("_"); + budgetCondition.setSkuName(names[names.length-1]); + budgetCondition.setSpuName(names[names.length-2]); + } catch (Exception e) { + log.error("格式错误:{}",budgetCondition.getTargetLevelPathNames()); + } + } + } + budgetVo.setSkuConditions(skuCondition); + budgetVo.setSpuConditions(listMap.get(TbsGoodsType.spu.name())); + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(); + lqw2.eq(TbsScheduleItemBudget::getBudgetId,budget.getId()); + lqw2.orderByAsc(TbsScheduleItemBudget::getStartDate); + List scheduleItemBudgets = scheduleItemBudgetService.list(lqw2); + if(budgetVo.getBudgetState().equals(1)) { + //已开启才计算 + scheduleItemBudgets.forEach(a -> { + LambdaQueryWrapper budgetLogLambdaQueryWrapper = new LambdaQueryWrapper<>(); + budgetLogLambdaQueryWrapper.in(TbsBudgetLog::getOptType, BudgetLogOptFlag.getFinalBudgetOptFlag()); + budgetLogLambdaQueryWrapper.eq(TbsBudgetLog::getScheduleItemBudgetId, a.getId()); + List logList = budgetLogService.list(budgetLogLambdaQueryWrapper); + a.setBudgetAmount(logList.stream().map(b -> b.getAmount()).reduce(BigDecimal.ZERO, BigDecimal::add)); + + }); +// scheduleItemBudgets.forEach(a -> { +// LambdaQueryWrapper budgetLogLambdaQueryWrapper = new LambdaQueryWrapper<>(); +// budgetLogLambdaQueryWrapper.eq(TbsBudgetLog::getScheduleItemBudgetId, a.getId()); +// List logList = budgetLogService.list(budgetLogLambdaQueryWrapper); +// +// BigDecimal finalOrgBudget = BigDecimal.ZERO; +// BigDecimal usedOrgBudget = BigDecimal.ZERO; +// BigDecimal surplusOrgBudget = BigDecimal.ZERO; +// for (TbsBudgetLog budgetLog : logList) { +// boolean finalMatch = BudgetLogOptFlag.getFinalBudgetOptFlag() +// .stream().anyMatch(opt->budgetLog.getOptType().equals(opt)); +// if(finalMatch){ +// finalOrgBudget = finalOrgBudget.add(budgetLog.getAmount()); +// }else { +// usedOrgBudget = usedOrgBudget.add(budgetLog.getAmount()); +// } +// surplusOrgBudget = surplusOrgBudget.add(budgetLog.getAmount()); +// } +// +// //原预算金额 +// //a.setBudgetAmount(); +// //调整后预算金额 +// a.setFinalBudgetAmount(finalOrgBudget); +// a.setUsedBudgetAmount(usedOrgBudget); +// a.setUnUsedBudgetAmount(surplusOrgBudget); +// }); + } + budgetVo.setScheduleItem(scheduleItemBudgets); + + if(CollectionUtil.isNotEmpty(budget.getAttachIds())){ + List attachIds = Arrays.asList(budget.getAttachIds()); + List attachList = attachService.listByIds(attachIds); + budgetVo.setAttachList(attachList); + } + //TODO 添加子状态码;有更变时,修改为审批状态 +// if(budgetVo.getBudgetState().equals(1)&&!budgetVo.getBudgetCheckState().equals(TbsBudgetCheckState.State_1_apply)){ +// LambdaQueryWrapper change_lqw = new LambdaQueryWrapper<>(); +// change_lqw.eq(TbsBudgetChange::getBudgetId,budgetVo.getId()); +// change_lqw.eq(TbsBudgetChange::getBudgetCheckState,TbsBudgetCheckState.State_1_apply); +// long count = tbsBudgetChangeMapper.selectCount(change_lqw); +// if(count>0){ +// budgetVo.setBudgetCheckState(TbsBudgetCheckState.State_1_apply); +// } +// } + + budgetVo.setTemplateFlag(budget.getTemplateFlag()); + if(budget.getTemplateFlag().equals(1)&&budget.getTemplateIds()!=null&&budget.getTemplateIds().length>0){ + List templates = tbsActivityTemplateMapper.selectBatchIds(Arrays.asList(budget.getTemplateIds())); + budgetVo.setTemplateList(templates); + } + + return budgetVo; + } + + /** + * 建立类目条件 + * @param budgetId + * @param categoryIds + * @return + */ + public List buildCategoryCondition(Long budgetId,List categoryIds,String targetType){ + List budgetConditions = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(categoryIds)){ + List categoryList = goodsCategoryService.listByIds(categoryIds); + for (GoodsCategory category : categoryList) { + TbsBudgetCondition condition = new TbsBudgetCondition(); + condition.setBudgetId(budgetId); + condition.setTargetType(targetType); + condition.setTargetId(category.getId()); + condition.setTargetCode(category.getCode()); + condition.setTargetName(category.getName()); + condition.setTargetLevelPathIds(category.getLevelPath()); + condition.setTargetLevelPathNames(category.getLevelPathNames()); + budgetConditions.add(condition); + } + } + return budgetConditions; + } + +// @Override +// @Transactional(rollbackFor = Exception.class) +// public void modifyByExcel(TbsBudgetExcelBo budgetBo) { +// TbsBudget budget = this.getByCode(budgetBo.getBudgetCode()); +// if(budget!=null){ +// if(budget.getBudgetState().equals(1)){ +// Assert.throwEx("已开启的预算无法编辑"); +// } +// }else { +// budget = new TbsBudget(); +// budget.setBudgetCode(budgetBo.getBudgetCode()); +// } +// List skuIds = null; +// List spuIds = null; +// if(CollectionUtil.isNotEmpty(budgetBo.getSkuCodes())){ +// List goodsSkus = goodsSkuService.getByCodes(budgetBo.getSkuCodes()); +// if(goodsSkus.size()!=budgetBo.getSkuCodes().size()){ +// Assert.throwEx("部分存货编码不存在"); +// } +// skuIds = goodsSkus.stream().map(GoodsSku::getId).collect(Collectors.toList()); +// } +// if(CollectionUtil.isNotEmpty(budgetBo.getSpuNames())){ +// spuIds = new ArrayList<>(); +// for (String spuName : budgetBo.getSpuNames()) { +// GoodsSpu goodsSpu = goodsSpuService.getByName(spuName); +// if(goodsSpu==null){ +// Assert.throwEx("["+spuName+"]单品不存在"); +// } +// spuIds.add(goodsSpu.getId()); +// } +// } +// List brandIds = this.selectCategory(budgetBo.getBrandNames(),1); +// List categoryIds = this.selectCategory(budgetBo.getCategoryNames(),2); +// List seriesIds = this.selectCategory(budgetBo.getSeriesNames(),3); +// +// BmsSubject subject = subjectService.getByName(budgetBo.getSubjectName()); +// TbsCenterDto centerDto = tbsCenterDtoService.getCenterDtoByName( +// budgetBo.getCenterType(), +// budgetBo.getCenterName(), +// budgetBo.getBudgetCode(), +// null); +// TbsSchedule schedule = scheduleService.getByName(budgetBo.getScheduleName()); +// initEmptyBudget(budget,subject,centerDto,schedule); +// //保存 费用项 +// List scheduleItems = scheduleItemService.listByScheduleId(schedule.getId()); +// List scheduleItemBudgets = new ArrayList<>(); +// for (TbsScheduleItem scheduleItem : scheduleItems) { +// TbsScheduleItemBudget itemBudget = CopierUtil.copy(scheduleItem,new TbsScheduleItemBudget()); +// itemBudget.setId(null); +// itemBudget.setScheduleItemId(scheduleItem.getId()); +// itemBudget.setBudgetId(budget.getId()); +// if(scheduleItem.getItemName().equals("M1")){ +// itemBudget.setBudgetAmount(budgetBo.getAmountM1()); +// }else if (scheduleItem.getItemName().equals("M2")){ +// itemBudget.setBudgetAmount(budgetBo.getAmountM2()); +// }else if (scheduleItem.getItemName().equals("M3")){ +// itemBudget.setBudgetAmount(budgetBo.getAmountM3()); +// }else if (scheduleItem.getItemName().equals("M4")){ +// itemBudget.setBudgetAmount(budgetBo.getAmountM4()); +// }else if (scheduleItem.getItemName().equals("M5")){ +// itemBudget.setBudgetAmount(budgetBo.getAmountM5()); +// }else if (scheduleItem.getItemName().equals("M6")){ +// itemBudget.setBudgetAmount(budgetBo.getAmountM6()); +// }else if (scheduleItem.getItemName().equals("M7")){ +// itemBudget.setBudgetAmount(budgetBo.getAmountM7()); +// }else if (scheduleItem.getItemName().equals("M8")){ +// itemBudget.setBudgetAmount(budgetBo.getAmountM8()); +// }else if (scheduleItem.getItemName().equals("M9")){ +// itemBudget.setBudgetAmount(budgetBo.getAmountM9()); +// }else if (scheduleItem.getItemName().equals("M10")){ +// itemBudget.setBudgetAmount(budgetBo.getAmountM10()); +// }else if (scheduleItem.getItemName().equals("M11")){ +// itemBudget.setBudgetAmount(budgetBo.getAmountM11()); +// }else if (scheduleItem.getItemName().equals("M12")){ +// itemBudget.setBudgetAmount(budgetBo.getAmountM12()); +// }else if (scheduleItem.getItemName().equals("Q1")){ +// itemBudget.setBudgetAmount(budgetBo.getAmountQ1()); +// }else if (scheduleItem.getItemName().equals("Q2")){ +// itemBudget.setBudgetAmount(budgetBo.getAmountQ2()); +// }else if (scheduleItem.getItemName().equals("Q3")){ +// itemBudget.setBudgetAmount(budgetBo.getAmountQ3()); +// }else if (scheduleItem.getItemName().equals("Q4")){ +// itemBudget.setBudgetAmount(budgetBo.getAmountQ4()); +// }else if (scheduleItem.getItemName().equals("Y")){ +// itemBudget.setBudgetAmount(budgetBo.getAmountYear()); +// } +// if(itemBudget.getBudgetAmount()==null){ +// itemBudget.setBudgetAmount(BigDecimal.ZERO); +// } +// scheduleItemBudgets.add(itemBudget); +// } +// scheduleItemBudgetService.saveBatch(scheduleItemBudgets); +// //设置条件 +// buildCondition(budget.getId(),brandIds,categoryIds,seriesIds,spuIds,skuIds); +// } + + private List selectCategory(List names,Integer level){ + if(CollectionUtil.isNotEmpty(names)){ + List ids = new ArrayList<>(); + for (String name : names) { + GoodsCategory category = goodsCategoryService.getByName(name,level); + if(category==null){ + if(level==1){ + Assert.throwEx("品牌["+name+"]不存在"); + }else if (level==2){ + Assert.throwEx("分类["+name+"]不存在"); + }else if (level==3){ + Assert.throwEx("系列["+name+"]不存在"); + } + } + ids.add(category.getId()); + } + return ids; + } + return null; + } + + /** + * 初始化空预算 + * @param budget + * @param subject + * @param centerDto + * @param schedule + */ + private void initEmptyBudget(TbsBudget budget,BmsSubject subject,TbsCenterDto centerDto,TbsSchedule schedule){ + if(schedule==null){ + Assert.throwEx("考核期不存在"); + } + if(subject!=null){ + budget.setSubjectId(subject.getId()); + budget.setSubjectCode(subject.getSubjectCode()); + budget.setSubjectName(subject.getSubjectName()); + }else { + budget.setSubjectId(0L); + budget.setSubjectCode(""); + budget.setSubjectName(""); + } + budget.setCenterId(centerDto.getId()); + budget.setCenterType(centerDto.getCenterType()); + budget.setCenterCode(centerDto.getCenterCode()); + budget.setCenterName(centerDto.getCenterName()); + budget.setScheduleId(schedule.getId()); + budget.setScheduleCode(schedule.getCode()); + budget.setScheduleName(schedule.getName()); + //删除条件 + if(budget.getId()!=null){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsBudgetCondition::getBudgetId,budget.getId()); + budgetConditionService.remove(lqw); + //删除 费用项 + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(); + lqw2.eq(TbsScheduleItemBudget::getBudgetId,budget.getId()); + scheduleItemBudgetService.remove(lqw2); + } + this.saveOrUpdate(budget); + } + + /** + * 建立条件数据 + * @param budgetId + * @param brandIds + * @param categoryIds + * @param seriesIds + * @param spuIds + * @param skuIds + */ + private void buildCondition(Long budgetId,List brandIds,List categoryIds,List seriesIds,List spuIds,List skuIds){ + List budgetConditions = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(skuIds)) { + List skuList = goodsSkuService.listByIds(skuIds); + for (GoodsSku sku : skuList) { + GoodsSpu goodsSpu = goodsSpuService.getById(sku.getSpuId()); + GoodsCategory category1 = goodsCategoryService.getById(goodsSpu.getCategoryFirst()); + GoodsCategory category2 = goodsCategoryService.getById(goodsSpu.getCategorySecond()); + GoodsCategory category3 = goodsCategoryService.getById(goodsSpu.getCategoryThird()); + TbsBudgetCondition condition = new TbsBudgetCondition(); + condition.setBudgetId(budgetId); + condition.setTargetType(TbsGoodsType.sku.name()); + condition.setTargetId(sku.getId()); + condition.setTargetCode(sku.getSkuCode()); + condition.setTargetName(sku.getSpecInfos()); + condition.setTargetLevelPathIds(category1.getId() + "_" + category2.getId() + "_" + category3.getId() + "_" + goodsSpu.getId() + "_" + sku.getId()); + condition.setTargetLevelPathNames(category1.getName() + "_" + category2.getName() + "_" + category3.getName() + "_" + goodsSpu.getName() + "_" + sku.getSpecInfos()); + budgetConditions.add(condition); + } + } + if (CollectionUtil.isNotEmpty(spuIds)) { + List spuList = goodsSpuService.listByIds(spuIds); + for (GoodsSpu goodsSpu : spuList) { + GoodsCategory category1 = goodsCategoryService.getById(goodsSpu.getCategoryFirst()); + GoodsCategory category2 = goodsCategoryService.getById(goodsSpu.getCategorySecond()); + GoodsCategory category3 = goodsCategoryService.getById(goodsSpu.getCategoryThird()); + TbsBudgetCondition condition = new TbsBudgetCondition(); + condition.setBudgetId(budgetId); + condition.setTargetType(TbsGoodsType.spu.name()); + condition.setTargetId(goodsSpu.getId()); + condition.setTargetCode(goodsSpu.getSpuCode()); + condition.setTargetName(goodsSpu.getName()); + condition.setTargetLevelPathIds(category1.getId() + "_" + category2.getId() + "_" + category3.getId() + "_" + goodsSpu.getId()); + condition.setTargetLevelPathNames(category1.getName() + "_" + category2.getName() + "_" + category3.getName() + "_" + goodsSpu.getName()); + budgetConditions.add(condition); + } + } + budgetConditions.addAll(buildCategoryCondition(budgetId, seriesIds, TbsGoodsType.series.name())); + budgetConditions.addAll(buildCategoryCondition(budgetId, categoryIds, TbsGoodsType.category.name())); + budgetConditions.addAll(buildCategoryCondition(budgetId, brandIds, TbsGoodsType.brand.name())); + if(CollectionUtil.isNotEmpty(budgetConditions)) { + budgetConditionService.saveBatch(budgetConditions); + } + TbsBudget oriBudget = this.getById(budgetId); + if (oriBudget.getBudgetState() != 1 + || oriBudget.getConditionFlag() != 1 + || CollectionUtil.isNotEmpty(budgetConditions)) { + TbsBudget tbsBudget = new TbsBudget(); + tbsBudget.setId(budgetId); + tbsBudget.setConditionFlag(CollectionUtil.isNotEmpty(budgetConditions) ? 1 : 0); + this.updateById(tbsBudget); + } + } + + + @Override + public TbsBudgetVo getEntityForExcel(TbsBudget budget){ + TbsBudgetVo budgetVo = CopierUtil.copy(budget,new TbsBudgetVo()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + if(CollectionUtil.isNotEmpty(budget.getSelectBudgetIds())){ + lqw.in(TbsScheduleItemBudget::getBudgetId,budget.getSelectBudgetIds()); + }else { + lqw.eq(TbsScheduleItemBudget::getBudgetId,budget.getId()); + } + List tbsScheduleItemBudgetList = scheduleItemBudgetService.list(lqw); + tbsScheduleItemBudgetList.forEach(a->{ + LambdaQueryWrapper lqwLog = new LambdaQueryWrapper<>(); + lqwLog.eq(TbsBudgetLog::getScheduleItemBudgetId,a.getId()); + if(CollectionUtil.isNotEmpty(budget.getSelectBudgetIds())){ + lqwLog.in(TbsBudgetLog::getBudgetId,budget.getSelectBudgetIds()); + }else { + lqwLog.eq(TbsBudgetLog::getBudgetId,budget.getId()); + } + List tbsBudgetLogList = budgetLogService.list(lqwLog); + a.setBudgetLogList(tbsBudgetLogList); + + BigDecimal finalBudgetAmount = tbsBudgetLogList.stream().filter(b->BudgetLogOptFlag.getFinalBudgetOptFlag().contains(b.getOptType())).map(TbsBudgetLog::getAmount) + .reduce(BigDecimal.ZERO,BigDecimal::add); + + BigDecimal usedBudgetAmount = tbsBudgetLogList.stream().filter(b->!BudgetLogOptFlag.getFinalBudgetOptFlag().contains(b.getOptType())).map(TbsBudgetLog::getAmount) + .reduce(BigDecimal.ZERO,BigDecimal::add); + + BigDecimal unUsedBudgetAmount = tbsBudgetLogList.stream().map(TbsBudgetLog::getAmount) + .reduce(BigDecimal.ZERO,BigDecimal::add); + + a.setFinalBudgetAmount(finalBudgetAmount); + a.setUnUsedBudgetAmount(unUsedBudgetAmount); + a.setUsedBudgetAmount(usedBudgetAmount); + }); + budgetVo.setScheduleItemBudgets(tbsScheduleItemBudgetList); + return budgetVo; + } + + @Override + public void moveCenterBudgetAndCostAmount(String sourceId,String sourceType,String targetId,String targetType){ + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + + LambdaQueryWrapper budgetLqw = new LambdaQueryWrapper<>(); + budgetLqw.eq(TbsBudget::getCenterType,sourceType); + budgetLqw.eq(TbsBudget::getCenterId,sourceId); + List tbsBudgetSourceList = this.list(budgetLqw); + + LambdaQueryWrapper budgetTargetLqw = new LambdaQueryWrapper<>(); + budgetTargetLqw.eq(TbsBudget::getCenterType,targetType); + budgetTargetLqw.eq(TbsBudget::getCenterId,targetId); + List tbsBudgetTargetList = this.list(budgetTargetLqw); + + Map mapSourceTargetTbsbudget = new HashMap<>(); + for(TbsBudget tbsBudgetSouce:tbsBudgetSourceList){ + TbsBudget tbsBudgetTargetMatch = null; + for(TbsBudget tbsBudgetTarget:tbsBudgetTargetList){ + Long unMatchCountCondition = budgetConditionService.findUnMatchConditionBySourceBudgetIdAndTargetBudgetId(tbsBudgetSouce.getId(),tbsBudgetTarget.getId()); + Long unMatchCountScheduleItem = scheduleItemBudgetService.findUnMatchScheduleItemBySourceBudgetIdAndTargetBudgetId(tbsBudgetSouce.getId(),tbsBudgetTarget.getId()); + if(unMatchCountCondition==0 && unMatchCountScheduleItem==0){ + tbsBudgetTargetMatch = tbsBudgetTarget; + mapSourceTargetTbsbudget.put(tbsBudgetSouce,tbsBudgetTarget); + break; + } + } + if(tbsBudgetTargetMatch==null){ + Assert.throwEx("存在不匹配条件或周期的预算!"+tbsBudgetSouce.getBudgetCode()); + } + } + + for(TbsBudget tbsBudgetSouce:tbsBudgetSourceList) { + TbsBudget tartgetBudget = mapSourceTargetTbsbudget.get(tbsBudgetSouce); + LambdaQueryWrapper tsibLqw = new LambdaQueryWrapper<>(); + tsibLqw.eq(TbsScheduleItemBudget::getBudgetId,tbsBudgetSouce.getId()); + List scheduleItemBudgetList = scheduleItemBudgetService.list(tsibLqw); + //源预算周期 + for(TbsScheduleItemBudget tsib:scheduleItemBudgetList){ + LambdaQueryWrapper tsibTargetLqw = new LambdaQueryWrapper<>(); + tsibTargetLqw.eq(TbsScheduleItemBudget::getBudgetId,tartgetBudget.getId()); + tsibTargetLqw.ge(TbsScheduleItemBudget::getEndDate,tsib.getEndDate()); + tsibTargetLqw.le(TbsScheduleItemBudget::getStartDate,tsib.getStartDate()); + TbsScheduleItemBudget tsibTarget = scheduleItemBudgetService.getOne(tsibTargetLqw,false); + + //调增Log + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.toTbsBudgetLog(sysUser,tartgetBudget,tsibTarget,BudgetLogOptFlag.State_2, tsib.getBudgetAmount()); + budgetLogService.save(budgetLog); + LambdaQueryWrapper tsibRemoveLqw = new LambdaQueryWrapper<>(); + tsibRemoveLqw.eq(TbsBudgetLog::getScheduleItemBudgetId,tsib.getId()); + tsibRemoveLqw.eq(TbsBudgetLog::getOptType,BudgetLogOptFlag.State_0.getCode()); + budgetLogService.remove(tsibRemoveLqw); + + //更新发货目标 + BigDecimal preDispatchAmount = tsibTarget.getPreDispatchAmount()==null?BigDecimal.ZERO:tsibTarget.getPreDispatchAmount(); + preDispatchAmount = preDispatchAmount.add(tsib.getPreDispatchAmount()==null?BigDecimal.ZERO:tsib.getPreDispatchAmount()); + tsibTarget.setPreDispatchAmount(preDispatchAmount); + scheduleItemBudgetService.updateById(tsibTarget); + + //tbs_activity_center + LambdaUpdateWrapper tacLuw = new LambdaUpdateWrapper<>(); + tacLuw.set(TbsActivityCenter::getCenterType,targetType); + tacLuw.set(TbsActivityCenter::getCenterId,targetId); + tacLuw.set(TbsActivityCenter::getCenterName,tartgetBudget.getCenterName()); + tacLuw.eq(TbsActivityCenter::getCenterType,sourceType); + tacLuw.eq(TbsActivityCenter::getCenterId,sourceId); + tacLuw.eq(TbsActivityCenter::getCenterName,tbsBudgetSouce.getCenterName()); + tbsActivityCenterService.update(tacLuw); + + //tbs_activity_center_goods + LambdaUpdateWrapper tacgLuw = new LambdaUpdateWrapper<>(); + tacgLuw.set(TbsActivityCenterGoods::getCenterType,targetType); + tacgLuw.set(TbsActivityCenterGoods::getCenterId,targetId); + tacgLuw.set(TbsActivityCenterGoods::getCenterName,tartgetBudget.getCenterName()); + tacgLuw.eq(TbsActivityCenterGoods::getCenterType,sourceType); + tacgLuw.eq(TbsActivityCenterGoods::getCenterId,sourceId); + tacgLuw.eq(TbsActivityCenterGoods::getCenterName,tbsBudgetSouce.getCenterName()); + tbsActivityCenterGoodsService.update(tacgLuw); + + //tbs_budget_cost_item + LambdaUpdateWrapper tbciLuw = new LambdaUpdateWrapper<>(); + tbciLuw.set(TbsBudgetCostItem::getCenterType,targetType); + tbciLuw.set(TbsBudgetCostItem::getCenterId,targetId); + tbciLuw.set(TbsBudgetCostItem::getCenterName,tartgetBudget.getCenterName()); + tbciLuw.set(TbsBudgetCostItem::getBudgetId,tsibTarget.getBudgetId()); + tbciLuw.set(TbsBudgetCostItem::getScheduleId,tsibTarget.getScheduleId()); + tbciLuw.set(TbsBudgetCostItem::getScheduleItemName,tsibTarget.getItemName()); + tbciLuw.set(TbsBudgetCostItem::getScheduleItemId,tsibTarget.getScheduleItemId()); + tbciLuw.set(TbsBudgetCostItem::getScheduleItemBudgetId,tsibTarget.getId()); + tbciLuw.eq(TbsBudgetCostItem::getCenterType,sourceType); + tbciLuw.eq(TbsBudgetCostItem::getCenterId,sourceId); + tbciLuw.eq(TbsBudgetCostItem::getCenterName,tbsBudgetSouce.getCenterName()); + tbciLuw.eq(TbsBudgetCostItem::getScheduleItemBudgetId,tsib.getId()); + tbsBudgetCostItemService.update(tbciLuw); + + //tbs_budget_cost_item_policy + LambdaUpdateWrapper tbcipLuw = new LambdaUpdateWrapper<>(); + tbcipLuw.set(TbsBudgetCostItemPolicy::getCenterType,targetType); + tbcipLuw.set(TbsBudgetCostItemPolicy::getCenterId,targetId); + tbcipLuw.set(TbsBudgetCostItemPolicy::getCenterName,tartgetBudget.getCenterName()); + tbcipLuw.set(TbsBudgetCostItemPolicy::getBudgetId,tsibTarget.getBudgetId()); + tbcipLuw.set(TbsBudgetCostItemPolicy::getScheduleId,tsibTarget.getScheduleId()); + tbcipLuw.set(TbsBudgetCostItemPolicy::getScheduleItemName,tsibTarget.getItemName()); + tbcipLuw.set(TbsBudgetCostItemPolicy::getScheduleItemId,tsibTarget.getScheduleItemId()); + tbcipLuw.set(TbsBudgetCostItemPolicy::getScheduleItemBudgetId,tsibTarget.getId()); + tbcipLuw.eq(TbsBudgetCostItemPolicy::getCenterType,sourceType); + tbcipLuw.eq(TbsBudgetCostItemPolicy::getCenterId,sourceId); + tbcipLuw.eq(TbsBudgetCostItemPolicy::getCenterName,tbsBudgetSouce.getCenterName()); + tbcipLuw.eq(TbsBudgetCostItemPolicy::getScheduleItemBudgetId,tsib.getId()); + tbsBudgetCostItemPolicyService.update(tbcipLuw); + + //tzc_policy_item + LambdaUpdateWrapper tzpiLuw = new LambdaUpdateWrapper<>(); + tzpiLuw.set(TzcPolicyItem::getCenterType,targetType); + tzpiLuw.set(TzcPolicyItem::getCenterId,targetId); + tzpiLuw.set(TzcPolicyItem::getCenterName,tartgetBudget.getCenterName()); + tzpiLuw.eq(TzcPolicyItem::getCenterType,sourceType); + tzpiLuw.eq(TzcPolicyItem::getCenterId,sourceId); + tzpiLuw.eq(TzcPolicyItem::getCenterName,tbsBudgetSouce.getCenterName()); + tzcPolicyItemService.update(tzpiLuw); + + //BudgetLog + LambdaUpdateWrapper tblLuw = new LambdaUpdateWrapper<>(); + tblLuw.set(TbsBudgetLog::getCenterType,targetType); + tblLuw.set(TbsBudgetLog::getCenterId,targetId); + tblLuw.set(TbsBudgetLog::getCenterName,tartgetBudget.getCenterName()); + tblLuw.set(TbsBudgetLog::getBudgetId,tsibTarget.getBudgetId()); + tblLuw.set(TbsBudgetLog::getBudgetCode,tartgetBudget.getBudgetCode()); + tblLuw.set(TbsBudgetLog::getScheduleId,tsibTarget.getScheduleId()); + tblLuw.set(TbsBudgetLog::getItemName,tsibTarget.getItemName()); + tblLuw.set(TbsBudgetLog::getScheduleItemId,tsibTarget.getScheduleItemId()); + tblLuw.set(TbsBudgetLog::getScheduleItemBudgetId,tsibTarget.getId()); + tblLuw.eq(TbsBudgetLog::getCenterType,sourceType); + tblLuw.eq(TbsBudgetLog::getCenterId,sourceId); + tblLuw.eq(TbsBudgetLog::getCenterName,tbsBudgetSouce.getCenterName()); + tblLuw.eq(TbsBudgetLog::getScheduleItemBudgetId,tsib.getId()); + budgetLogService.update(tblLuw); + + //vtb_fund_flow + LambdaUpdateWrapper vffLuw = new LambdaUpdateWrapper<>(); + vffLuw.set(VtbFundFlow::getCenterType,targetType); + vffLuw.set(VtbFundFlow::getCenterId,targetId); + vffLuw.set(VtbFundFlow::getCenterName,tartgetBudget.getCenterName()); + vffLuw.eq(VtbFundFlow::getCenterType,sourceType); + vffLuw.eq(VtbFundFlow::getCenterId,sourceId); + vffLuw.eq(VtbFundFlow::getCenterName,tbsBudgetSouce.getCenterName()); + vtbFundFlowService.update(vffLuw); + + scheduleItemBudgetService.removeById(tsib); + } + LambdaQueryWrapper tbcLqw = new LambdaQueryWrapper<>(); + tbcLqw.eq(TbsBudgetCondition::getBudgetId,tbsBudgetSouce.getId()); + budgetConditionService.remove(tbcLqw); + + LambdaQueryWrapper tbllLqw = new LambdaQueryWrapper<>(); + tbllLqw.eq(TbsBudgetLog::getBudgetId,tbsBudgetSouce.getId()); + budgetLogService.remove(tbllLqw); + + this.removeById(tbsBudgetSouce.getId()); + } + + + } + + @Override + public void moveBudgetAmount(TbsBudgetMoveAmountBo bo) { + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(); + lqw2.eq(TbsScheduleItemBudget::getBudgetId,bo.getId()); + List scheduleItemBudgets = scheduleItemBudgetService.list(lqw2); + List scheduleItemBudgetIds = scheduleItemBudgets.stream().map(a->a.getId()).collect(Collectors.toList()); + bo.getOriScheduleItemBudgetIds().forEach(a->{ + if(!scheduleItemBudgetIds.contains(a)){ + Assert.throwEx("源ID不在请求的预算内"); + } + }); + if(!scheduleItemBudgetIds.contains(bo.getTargetScheduleItemBudgetId())){ + Assert.throwEx("目标ID不在请求的预算内"); + } + List budgetLogList = new ArrayList<>(); + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + TbsBudget budget = this.getById(bo.getId()); + TbsScheduleItemBudget targetTbsScheduleItemBudget = scheduleItemBudgetService.getById(bo.getTargetScheduleItemBudgetId()); + + bo.getOriScheduleItemBudgetIds().forEach(a->{ + TbsScheduleItemBudget scheduleItemBudget = scheduleItemBudgetService.getById(a); + LambdaQueryWrapper budgetLogLambdaQueryWrapper = new LambdaQueryWrapper<>(); + budgetLogLambdaQueryWrapper.eq(TbsBudgetLog::getScheduleItemBudgetId,a); + List logList = budgetLogService.list(budgetLogLambdaQueryWrapper); + BigDecimal unUserAmount = logList.stream().map(b->b.getAmount()).reduce(BigDecimal.ZERO,BigDecimal::add); + BigDecimal fixAmount = BigDecimal.ZERO.subtract(unUserAmount); + if(fixAmount.compareTo(BigDecimal.ZERO)>0){ + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.toTbsBudgetLog(sysUser, budget, scheduleItemBudget, + BudgetLogOptFlag.State_2,fixAmount); + budgetLogList.add(budgetLog); + + TbsBudgetLog targetBudgetLog = TbsBudgetLogBuildUtil.toTbsBudgetLog(sysUser, budget, targetTbsScheduleItemBudget, + BudgetLogOptFlag.State_3,unUserAmount); + budgetLogList.add(targetBudgetLog); + }else if(fixAmount.compareTo(BigDecimal.ZERO)<0){ + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.toTbsBudgetLog(sysUser, budget, scheduleItemBudget, + BudgetLogOptFlag.State_3,fixAmount); + budgetLogList.add(budgetLog); + + TbsBudgetLog targetBudgetLog = TbsBudgetLogBuildUtil.toTbsBudgetLog(sysUser, budget, targetTbsScheduleItemBudget, + BudgetLogOptFlag.State_2,unUserAmount); + budgetLogList.add(targetBudgetLog); + } + }); + budgetLogService.saveBatch(budgetLogList); + + } + + @Override + public void updateBudgetAfterStart(TbsBudgetUpdateAfterStartBo param) { + TbsBudget budget = this.getById(param.getId()); + if(budget==null){ + Assert.throwEx("不存在该预算!"); + } + if(!budget.getBudgetState().equals(1)){ + Assert.throwEx("预算未开启,请直接编辑!"); + } + budget.setBudgetCode(param.getBudgetCode()); + budget.setAttachIds(param.getAttachIds()); + this.updateById(budget); + buildCondition(budget.getId(),param.getBrandIds(),param.getCategoryIds(),param.getSeriesIds(),param.getSpuIds(),param.getSkuIds()); + + } + + @Override + public void updateCrossYearFlag(Integer crossYearFlag) { + + if(crossYearFlag==null||crossYearFlag!=1){ + crossYearFlag = 0; + } + + + TbsBudget crossBudget = new TbsBudget(); + crossBudget.setCrossYearFlag(crossYearFlag); + + this.update(crossBudget,new LambdaQueryWrapper()); + + this.syncStopFlag(); + + } + + @Override + public void syncStopFlag() { + + List budgetIds = baseMapper.selectLastYearPassBudgetId(); + List budgetIds2 = baseMapper.selectNotExpireBudgetId(); + + List expireBudgetIds2 = baseMapper.selectLastYearStopBudgetId(); + List expireBudgetIds = baseMapper.selectExpireBudgetId(); + + TbsBudget stopBudget = new TbsBudget(); + stopBudget.setStopFlag(1); + + TbsBudget numalBudget = new TbsBudget(); + numalBudget.setStopFlag(0); + + if(CollectionUtil.isNotEmpty(expireBudgetIds)){ + this.update(stopBudget,new LambdaQueryWrapper().in(TbsBudget::getId,expireBudgetIds)); + } + if(CollectionUtil.isNotEmpty(expireBudgetIds2)){ + this.update(stopBudget,new LambdaQueryWrapper().in(TbsBudget::getId,expireBudgetIds2)); + } + + if(CollectionUtil.isNotEmpty(budgetIds)){ + this.update(numalBudget,new LambdaQueryWrapper().in(TbsBudget::getId,budgetIds)); + } + if(CollectionUtil.isNotEmpty(budgetIds2)){ + this.update(numalBudget,new LambdaQueryWrapper().in(TbsBudget::getId,budgetIds2)); + } + } + + @Override + @Transactional + public void syncMissSchItem() { + List itemBudgetIds = baseMapper.selectMissSchItemBudgetId(); + //List itemBudgetIds = Arrays.asList(654L); + for (Long budgetId : itemBudgetIds) { + TbsBudget budget = baseMapper.selectById(budgetId); + SysUser sysUser = sysUserService.getById(budget.getUserId()); + List scheduleItems = scheduleItemService.listByScheduleId(budget.getScheduleId()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsScheduleItemBudget::getBudgetId,budgetId); + List scheduleItemBudgets = scheduleItemBudgetService.list(lqw); + List addSchItemBudgets = new ArrayList<>(); + for (TbsScheduleItem item : scheduleItems) { + boolean match = false; + for (TbsScheduleItemBudget itemBudget : scheduleItemBudgets) { + if (item.getId().equals(itemBudget.getScheduleItemId())){ + match = true; + } + } + if(!match){ + TbsScheduleItemBudget itemBudget = new TbsScheduleItemBudget(); + itemBudget.setScheduleId(item.getScheduleId()); + itemBudget.setScheduleItemId(item.getId()); + itemBudget.setItemName(item.getItemName()); + itemBudget.setStartDate(item.getStartDate()); + itemBudget.setEndDate(item.getEndDate()); + itemBudget.setBudgetId(budgetId); + itemBudget.setBudgetAmount(BigDecimal.ZERO); + itemBudget.setPreDispatchAmount(BigDecimal.ZERO); + itemBudget.setPreDispatchAmountFirst(BigDecimal.ZERO); + addSchItemBudgets.add(itemBudget); + } + } + if(addSchItemBudgets.size()>0){ + scheduleItemBudgetService.saveBatch(addSchItemBudgets); + } + //保存预算流水日志 + List budgetLogList = new ArrayList<>(); + for (TbsScheduleItemBudget scheduleItemBudget : addSchItemBudgets) { + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.toTbsBudgetLog(sysUser, budget, scheduleItemBudget,BudgetLogOptFlag.State_0,scheduleItemBudget.getBudgetAmount()); + budgetLogList.add(budgetLog); + } + budgetLogService.saveBatch(budgetLogList); + } + + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyOperationServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyOperationServiceImpl.java new file mode 100644 index 0000000..035e5a1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyOperationServiceImpl.java @@ -0,0 +1,945 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qs.serve.common.framework.manager.AsyncManager; +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.common.model.consts.BudgetLogRollbackFlag; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bir.consts.BirActivityCenterGoodsUtil; +import com.qs.serve.modules.data.entity.DataAffairCommit; +import com.qs.serve.modules.data.mapper.DataAffairCommitMapper; +import com.qs.serve.modules.seeyon.entity.CtpAffair; +import com.qs.serve.modules.seeyon.entity.SyAffairStateResult; +import com.qs.serve.modules.seeyon.entity.bo.CtpAddNodeDTO; +import com.qs.serve.modules.seeyon.entity.bo.CtpAddNodeParam; +import com.qs.serve.modules.seeyon.enums.SyAffairState; +import com.qs.serve.modules.seeyon.service.SeeYonOperationService; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.sync.AsyncFactory; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysPostUser; +import com.qs.serve.modules.sys.entity.SysSyncLog; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysAttachMapper; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.service.SysSyncLogService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsActivityState; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.entity.vo.CtpAffairVo; +import com.qs.serve.modules.tbs.mapper.*; +import com.qs.serve.modules.tbs.service.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/5/24 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsCostApplyOperationServiceImpl implements SeeYonOperationService { + + private final TbsBudgetLogService tbsBudgetLogService; + private final TbsBudgetCostItemService tbsBudgetCostItemService; + private final SeeYonRequestService requestService; + private final SysUserService sysUserService; + + private final TbsCostApplyService costApplyService; + private final TbsActivityMapper tbsActivityMapper; + private final TbsActivitySubjectYarnMapper tbsActivitySubjectYarnMapper; + private final SysUserMapper userMapper; + private final TbsActivitySlottingFeeMapper activitySlottingFeeMapper; + private final TbsBudgetLogMapper tbsBudgetLogMapper; + private final TbsBudgetMapper tbsBudgetMapper; + + private final TbsActivityService activityService; + private final TbsCostApplyPart1Service costApplyPart1Service; + private final TbsActivitySubjectMapper activitySubjectMapper; + private final TbsActivityCenterMapper activityCenterMapper; + private final TbsActivityCenterGoodsMapper activityCenterGoodsMapper; + private final DataAffairCommitMapper dataAffairCommitMapper; + private final SysSyncLogService sysSyncLogService; + + + @Override + public void doCommitBacked(String targetId) { + + } + + @Override + public SysUserService getSysUserService() { + return sysUserService; + } + + @Override + public boolean checkSyFormIdIsNotNull(String targetId) { + TbsCostApply costApplyParam = costApplyService.getById(targetId); + if(costApplyParam!=null&&costApplyParam.getSyFormId()!=null){ + return true; + } + return false; + } + + @Override + public String getTemplateCode() { + return TbsSeeYonConst.CostApplyConf.Code(); + } + + + @Override + public String checkAffairSummery(String targetId) { + TbsCostApply tbsCostApply = costApplyService.getById(targetId); + String templateCode = getTemplateCode(); + if(tbsCostApply.getContractFlag()!=null&&tbsCostApply.getContractFlag().equals(1)){ + templateCode = TbsSeeYonConst.CostApplyContractConf.Code(); + } + SyAffairStateResult stateResult =checkAffairState(targetId,templateCode); + return stateResult.getState().name(); + /* R result = getRequestService().checkAffairSummery(templateCode,targetId); + if(result.getData()==null||result.getData().equals(SyAffairState.next.name())){ + SyAffairStateResult stateResult =checkAffairState(targetId,templateCode); + return stateResult.getState().name(); + }*/ + //return result.getData(); + } + + @Override + public R addNode(CtpAddNodeParam param) { + getRequestService().testConnection(); + TbsCostApply tbsCostApply = costApplyService.getById(param.getTargetId()); + CtpAddNodeDTO addNodeDTO = new CtpAddNodeDTO(); + addNodeDTO.setBackToMe(param.getBackToMe()); + addNodeDTO.setTargetId(param.getTargetId()); + addNodeDTO.setComment(param.getComment()); + List selectUserIds = new ArrayList<>(); + SysUser loginUser = getUserMapper().selectById(AuthContextUtils.getSysUserId()); + for (String userId : param.getUserIds()) { + SysUser user = getUserMapper().selectById(userId); + if(loginUser.getSyUserId().equals(user.getSyUserId())){ + return R.error("不能选择相同的OA账号的员工"); + } + if(StringUtils.hasText(user.getSyUserId())&&!user.getSyUserId().equals("0")){ + selectUserIds.add(user.getSyUserId()); + } + } + + if(selectUserIds.size()==0){ + Assert.throwEx("选中的用户未绑定OA凭证"); + } + + List rList = this.pageAffair(param.getTargetId()).getData(); + String affairId = null; + if(rList.size()>0){ + CtpAffair affair = rList.get(0).getAffairInfo(); + if(affair!=null){ + affairId = affair.getAffairId(); + } + } + if(affairId==null&¶m.getAttachIds()!=null&¶m.getAttachIds().length>0){ + return R.error("附件上传失败(如果急需提交请移除附件)"); + } + + addNodeDTO.setUserIds(selectUserIds); + SysUser sysUser = getUserMapper().selectById(AuthContextUtils.getSysUserId()); + addNodeDTO.setUserCode(sysUser.getAccount()); + addNodeDTO.setUserSyId(sysUser.getSyUserId()); + String templateCode = getTemplateCode(); + if(tbsCostApply.getContractFlag()!=null&&tbsCostApply.getContractFlag().equals(1)){ + templateCode = TbsSeeYonConst.CostApplyContractConf.Code(); + } + addNodeDTO.setTemplateCode(templateCode); + R result = getRequestService().addNode(addNodeDTO); + if(result.getData()!=null&&result.getData().toLowerCase(Locale.ROOT).contains("ok")){ + DataAffairCommitMapper dataAffairCommitMapper = SpringUtils.getBean(DataAffairCommitMapper.class); + DataAffairCommit dataAffairCommit = new DataAffairCommit(); + dataAffairCommit.setTargetCode(getTemplateCode()); + dataAffairCommit.setTargetId(param.getTargetId()); + + dataAffairCommit.setId(affairId); + dataAffairCommit.setCommentVal("加签:"+param.getComment()); + dataAffairCommit.setReleaseFlag(0); + dataAffairCommit.setState(3); + dataAffairCommit.setUserId(sysUser.getId()); + dataAffairCommit.setUserCode(sysUser.getCode()); + dataAffairCommit.setUserName(sysUser.getName()); + dataAffairCommit.setResultData("addNode"); + dataAffairCommit.setAttachIds(param.getAttachIds()); + dataAffairCommitMapper.insert(dataAffairCommit); + return R.ok(); + } + return R.error(result.getMsg()); + } + + @Override + public SeeYonRequestService getRequestService() { + return requestService; + } + + @Override + public R> pageAffairV2(String targetId,String targetCode) { + boolean existFormId = checkSyFormIdIsNotNull(targetId); + if (!existFormId){ + return R.ok(new ArrayList<>()); + } + String templateCode = getTemplateCode(); + TbsCostApply costApply = costApplyService.getById(targetId); + if(costApply.getContractFlag()!=null&&costApply.getContractFlag().equals(1)){ + templateCode = TbsSeeYonConst.CostApplyContractConf.Code(); + } + R> syResult = getRequestService().commonListAffairsV3(targetId,costApply.getCode(),null,templateCode); + List ctpAffairs = syResult.getData(); + if(ctpAffairs.size()>0){ + DataAffairCommitMapper dataAffairCommitMapper = SpringUtils.getBean(DataAffairCommitMapper.class); + SysAttachMapper sysAttachMapper = SpringUtils.getBean(SysAttachMapper.class); + List affairCommits = dataAffairCommitMapper.selectBatchIds(ctpAffairs.stream() + .filter(Objects::nonNull).map(CtpAffair::getAffairId).collect(Collectors.toList())); + List oaUserIds = ctpAffairs.stream().map(CtpAffair::getMemberId).collect(Collectors.toList()); + List userList = getSysUserService().listByOaMemberIds(oaUserIds); + SysPostUserService postUserService = SpringUtils.getBean(SysPostUserService.class); + List userIds = userList.stream().map(SysUser::getId).collect(Collectors.toList()); + List postUserList = postUserService.listByUserIds(userIds); + Map> postMap = postUserList.stream().collect(Collectors.groupingBy(SysPostUser::getUserId)); + List result = new ArrayList<>(); + for (CtpAffair ctpAffair : ctpAffairs) { + CtpAffairVo ctpAffairVo = new CtpAffairVo(); + 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); +// } + } + for (SysUser user : userList) { + if(ctpAffair.getMemberId().equals(user.getSyUserId())){ + ctpAffairVo.setUserInfo(user.toSysUserVo()); + List postUsers = postMap.get(user.getId()); + ctpAffairVo.setUserPostList(postUsers); + } + } + //部分用户不存在CMS,会导致前端页面异常 + if(ctpAffairVo.getUserInfo()==null){ + SysUser user = new SysUser(); + user.setName(ctpAffairVo.getAffairInfo().getMemberId()); + ctpAffairVo.setUserInfo(user.toSysUserVo()); + } + for (DataAffairCommit affairCommit : affairCommits) { + if(affairCommit.getId().equals(ctpAffair.getAffairId())){ + ctpAffairVo.setCommitInfo(affairCommit); + if(affairCommit.getAttachIds()!=null&&affairCommit.getAttachIds().length>0){ + ctpAffairVo.setAttachments( + sysAttachMapper.selectBatchIds( + Arrays.asList(affairCommit.getAttachIds()))); + } + } + } + result.add(ctpAffairVo); + } + return R.ok(result); + } + return R.ok(new ArrayList<>()); + } + + @Override + public SysUserMapper getUserMapper() { + return userMapper; + } + + @Override + public boolean testConnection() { + return SeeYonOperationService.super.testConnection(); + } + + @Override + public Object doNext(TbsAffairCommitBo param) { + Long targetId = Long.parseLong(this.getTargetId(param)); + // 更新金额 + TbsCostApply apply = new TbsCostApply(); + // 有修改金额,调整预算占用 + BigDecimal totalApply = checkToChangeAmount(param); + apply.setId(targetId); + if(totalApply!=null){ + apply.setTotalActivityAmount(totalApply); + apply.setEditAmountFlag(1); + } + costApplyService.updateById(apply); + return null; + } + + @Override + public Object doBacked(TbsAffairCommitBo param) { + Long costApplyId = Long.parseLong(this.getTargetId(param)); + TbsCostApply apply = new TbsCostApply(); + apply.setId(costApplyId); + apply.setChargeState(TbsCostApplyState.State_4_refused.getCode()); + costApplyService.updateById(apply); + LambdaQueryWrapper logLqw = new LambdaQueryWrapper<>(); + logLqw.select(TbsBudgetLog::getId); + logLqw.eq(TbsBudgetLog::getCostApplyId,costApplyId); + logLqw.eq(TbsBudgetLog::getRollbackFlag, BudgetLogRollbackFlag.State_0); + List budgetLogList = tbsBudgetLogService.list(logLqw); + budgetLogList.forEach(a->a.setRollbackFlag(BudgetLogRollbackFlag.State_1)); + tbsBudgetLogService.updateBatchById(budgetLogList); + return null; + } + + @Override + public Object doFinished(TbsAffairCommitBo param) { + Long targetId = Long.parseLong(this.getTargetId(param)); + // 更新金额 + TbsCostApply apply = new TbsCostApply(); + BigDecimal totalApply = null; + boolean returnFlag = false; + try { + totalApply = checkToChangeAmount(param); + } catch (Exception e) { + e.printStackTrace(); + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("CostApply.doFinished"); + syncLog.setUrl(""); + syncLog.setEntityClass(TbsAffairCommitBo.class.getName()); + syncLog.setRequestJson(JsonUtil.objectToJson(param)); + syncLog.setFailReason(e.getMessage()); + syncLog.setSuccessStatus(0); + syncLog.setTodoState(1); + sysSyncLogService.save(syncLog); + returnFlag = true; + } + if(returnFlag){ + return null; + } + apply.setId(targetId); + if(totalApply!=null){ + apply.setTotalActivityAmount(totalApply); + apply.setEditAmountFlag(1); + } + apply.setChargeState(TbsCostApplyState.State_2_actioning.getCode()); + costApplyService.updateById(apply); + TbsCostApply costApply = costApplyService.getById(targetId); + //判断异动 + if(costApply.getChangeSourceId()!=null){ + //移除(标记2,用于区分一般删除) + tbsBudgetLogMapper.updateLogDelFlagByCostApply(costApply.getChangeSourceId(),2); + } + //判断审批过程,是否修改了金额 + if(costApply.getEditAmountFlag().equals(1)){ + doEditAmtCallback(costApply); + } + //更新活动通过时间 + TbsActivity tbsActivity = new TbsActivity(); + tbsActivity.setCostPassTime(LocalDateTime.now()); + tbsActivity.setCostPassFlag(1); + LambdaQueryWrapper actLqw = new LambdaQueryWrapper<>(); + actLqw.eq(TbsActivity::getCostApplyId,targetId); + tbsActivityMapper.update(tbsActivity,actLqw); + activitySlottingFeeMapper.updatePassFlagByCostApplyId(targetId,1); + //更新活动状态为冻结 + activityService.initReopenState(); + activityService.flushBandingState(Arrays.asList(costApply.getId())); + return null; + } + + /** + * 编辑金额后预算调整 + * @param param + */ + public void doEditAmtCallback(TbsCostApply param) { + + TbsActivityCenterGoodsService tbsActivityCenterGoodsService = SpringUtils.getBean(TbsActivityCenterGoodsService.class); + List activityCenterGoodsList = tbsActivityCenterGoodsService.listByCostApplyId(param.getId()); + + List budgetCostItemList = tbsBudgetCostItemService.listByCostApplyId(param.getId()); + for (TbsBudgetCostItem costItem : budgetCostItemList) { + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + if(costItem.getCenterGoodItemId().equals(centerGoods.getId())){ + costItem.setCenterGoodsAmount(centerGoods.getCenterGoodsAmount()); + tbsBudgetCostItemService.updateById(costItem); + } + } + } + //移除非申请状态异常 + LambdaQueryWrapper budgetLogRmLqw = new LambdaQueryWrapper<>(); + budgetLogRmLqw.eq(TbsBudgetLog::getCostApplyId,param.getId()); + tbsBudgetLogMapper.delete(budgetLogRmLqw); + //重新合计申请状态异常 + + TbsCostApply tbsCostApply = costApplyService.getById(param.getId()); + SysUser sysUser = sysUserService.getById(tbsCostApply.getUserId()); + LambdaQueryWrapper actLqw = new LambdaQueryWrapper<>(); + actLqw.eq(TbsActivity::getCostApplyId,param.getId()); + List activityList = tbsActivityMapper.selectList(actLqw); + + List budgetIds = budgetCostItemList.stream() + .map(TbsBudgetCostItem::getBudgetId).collect(Collectors.toList()); + if(budgetIds.size()<1){ + return; + } + List budgetList = tbsBudgetMapper.selectBatchIds(budgetIds); + + List budgetLogList = new ArrayList<>(); + for (TbsBudgetCostItem item : budgetCostItemList) { + TbsBudgetLog budgetLog = new TbsBudgetLog(); + budgetLog.setBudgetId(item.getBudgetId()); + for (TbsBudget budget : budgetList) { + if(item.getBudgetId().equals(budget.getId())){ + budgetLog.setBudgetCode(budget.getBudgetNumber()); + break; + } + } + budgetLog.setOptType(1); + budgetLog.setOptUserId(sysUser.getId()); + budgetLog.setOptUserCode(sysUser.getCode()); + budgetLog.setOptUserName(sysUser.getName()); + budgetLog.setAmount(item.getCenterGoodsAmount().negate()); + budgetLog.setScheduleId(item.getScheduleId()); + budgetLog.setScheduleItemId(item.getScheduleItemId()); + budgetLog.setScheduleItemBudgetId(item.getScheduleItemBudgetId()); + budgetLog.setItemName(item.getScheduleItemName()); + budgetLog.setStartDate(item.getActStartDate().atStartOfDay()); + budgetLog.setEndDate(item.getActEndDate().atStartOfDay()); + budgetLog.setSubjectId(item.getSubjectId()); + budgetLog.setSubjectCode(item.getSubjectCode()); + budgetLog.setSubjectName(item.getSubjectName()); + budgetLog.setCenterId(item.getCenterId()); + budgetLog.setCenterCode(item.getCenterCode()); + budgetLog.setCenterName(item.getCenterName()); + budgetLog.setCenterType(item.getCenterType()); + budgetLog.setSupplierId(item.getSupplierId()); + budgetLog.setSupplierCode(item.getSupplierCode()); + budgetLog.setSupplierName(item.getSupplierName()); + budgetLog.setActivityId(item.getActivityId()); + budgetLog.setActivityCode(item.getActivityCode()); + String actTitle = null; + for (TbsActivity activity : activityList) { + if(activity.getId().equals(item.getActivityId())){ + actTitle = activity.getActTitle(); + break; + } + } + budgetLog.setActivityTheme(actTitle); + budgetLog.setCostApplyId(tbsCostApply.getId()); + budgetLog.setCostApplyCode(tbsCostApply.getCode()); + budgetLog.setCostApplyTheme(tbsCostApply.getChargeTheme()); + budgetLog.setTargetType(item.getTargetType()); + budgetLog.setTargetId(item.getTargetId()); + budgetLog.setTargetCode(item.getTargetCode()); + budgetLog.setTargetName(item.getTargetName()); + budgetLog.setTargetLevelPathIds(item.getTargetLevelPathIds()); + budgetLog.setTargetLevelPathNames(item.getTargetLevelPathNames()); + budgetLogList.add(budgetLog); + } + tbsBudgetLogService.saveBatch(budgetLogList); + + } + + /** + * 创建新的预算占用记录 + * @param costApply + * @param activityCenterGoodsList + * @param sysUser + * @param budgetCostItemList + * @param budgetList + * @return + */ + @NotNull + private List createNewBudgetLogs(TbsCostApply costApply, List activityCenterGoodsList, SysUser sysUser, List budgetCostItemList, List budgetList) { + List newBudgetLogList = new ArrayList<>(); + for (TbsBudgetCostItem budgetCostItem : budgetCostItemList) { + TbsActivityCenterGoods currentCenterGoods = null; + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + if(centerGoods.getId().equals(budgetCostItem.getCenterGoodItemId())){ + currentCenterGoods = centerGoods; + break; + } + } + if(currentCenterGoods==null){ + log.error("费用申请单据异常,审批时费用调整后,数据不匹配。ID: {} ; 编码:{}", + costApply.getId(), costApply.getCode()); + continue; + } + String budgetCode = ""; + for (TbsBudget budget : budgetList) { + if(budget.getId().equals(currentCenterGoods.getBudgetId())){ + budgetCode = budget.getBudgetNumber(); + break; + } + } + TbsBudgetLog budgetLog = budgetCostItem.toBudgetLog( + costApply, + BudgetLogOptFlag.State_6, + //BudgetLogOptFlag.State_7, + currentCenterGoods.getCenterGoodsAmount(), + sysUser, + budgetCode + ,currentCenterGoods.getActivityCode()); + newBudgetLogList.add(budgetLog); + } + return newBudgetLogList; + } + + public BigDecimal checkToChangeAmount(TbsAffairCommitBo param) { + Long targetId = Long.parseLong(this.getTargetId(param)); + TbsCostApply costApply = costApplyService.getById(targetId); + boolean noChanged = costApply.getEditAmountFlag().equals(0); + if(CollectionUtil.isNotEmpty(param.getAffairSubjectLines())){ + SysUser sysUser = sysUserService.getById( AuthContextUtils.getSysUserId()); + QueryWrapper comm_qw = new QueryWrapper(); + comm_qw.eq("cost_apply_id", targetId); + List activityList = tbsActivityMapper.selectList(comm_qw); + List activitySubjectList = activitySubjectMapper.selectList(comm_qw); + //判断subjectId是否匹配 + Set activitySubjectIds = new HashSet<>(param.getAffairSubjectLines().stream() + .map(TbsAffairCommitBo.AffairSubjectLine::getSubjectId).collect(Collectors.toList())); + for (TbsActivitySubject activitySubject : activitySubjectList) { + activitySubjectIds.add(activitySubject.getId()); + } + if(activitySubjectIds.size()>activitySubjectList.size()){ + Assert.throwEx("请求有错误的参数"); + } + List activityCenterList = activityCenterMapper.selectList(comm_qw); + TbsActivityCenterGoodsService tbsActivityCenterGoodsService = SpringUtils.getBean(TbsActivityCenterGoodsService.class); + List activityCenterGoodsList = tbsActivityCenterGoodsService.listByCostApplyId(targetId); + //初始化重新计算 + activityList.forEach(a->a.setTotalAmount(BigDecimal.ZERO)); + //先计算科目的费用 + for (TbsActivitySubject activitySubject : activitySubjectList) { + for (TbsAffairCommitBo.AffairSubjectLine subjectLine : param.getAffairSubjectLines()) { + if(subjectLine.getSubjectId().equals(activitySubject.getId())){ + BigDecimal subjectAmount = subjectLine.getAmount(); + //重新计算活动金额 + TbsActivity currActivity = new TbsActivity(); + for (TbsActivity activity : activityList) { + if(activitySubject.getActivityId().equals(activity.getId())){ + activity.setTotalAmount(activity.getTotalAmount().add(subjectAmount)); + currActivity = activity; + } + } + //保持流程记录 + TbsActivitySubjectYarn subjectYarn = this.createActivitySubjectYarn(param, sysUser, costApply, activitySubject, subjectLine, currActivity); + tbsActivitySubjectYarnMapper.insert(subjectYarn); + if(noChanged){ + //审批期间,只对第一次审批赋值 + activitySubject.setOrgAmount(activitySubject.getAmount()); + } + activitySubject.setAmount(subjectAmount); + activitySubject.setCountPerson(subjectLine.getCountPerson()); + activitySubject.setCountSession(subjectLine.getCountSession()); + //更新科目 + activitySubjectMapper.updateById(activitySubject); + //计算科目下的成本中心 + this.changeActivityCenterGoodsAmt(noChanged, activityCenterList, activityCenterGoodsList, activitySubject, subjectAmount); + break; + } + } + } + + //更新活动 + BigDecimal total = BigDecimal.ZERO; + for (TbsActivity activity : activityList) { + tbsActivityMapper.updateById(activity); + total = total.add(activity.getTotalAmount()); + } + //更新活动的商品 + tbsActivityCenterGoodsService.updateBatchById(activityCenterGoodsList); + return total; + } + return null; + } + + @NotNull + private TbsActivitySubjectYarn createActivitySubjectYarn(TbsAffairCommitBo param, SysUser sysUser, TbsCostApply costApply, TbsActivitySubject subject, TbsAffairCommitBo.AffairSubjectLine subjectLine, TbsActivity currActivity) { + TbsActivitySubjectYarn subjectYarn = new TbsActivitySubjectYarn(); + subjectYarn.setCheckId(param.getAffairId()); + subjectYarn.setUserId(sysUser.getId()); + subjectYarn.setUserCode(sysUser.getCode()); + subjectYarn.setUserName(sysUser.getName()); + subjectYarn.setUserHrInfo(sysUser.getHrSystemInfo()); + subjectYarn.setCostApplyId(costApply.getId()); + subjectYarn.setCostApplyCode(costApply.getCode()); + subjectYarn.setCostApplyTitle(costApply.getChargeTheme()); + subjectYarn.setActivityId(currActivity.getId()); + subjectYarn.setActivityCode(currActivity.getActivityCode()); + subjectYarn.setActivityTitle(currActivity.getActTitle()); + subjectYarn.setSubjectId(subject.getSubjectId()); + subjectYarn.setSubjectCode(subject.getSubjectCode()); + subjectYarn.setSubjectName(subject.getSubjectName()); + subjectYarn.setOrgAmount(subject.getAmount()); + subjectYarn.setOrgCountSession(subject.getCountSession()); + subjectYarn.setOrgCountPerson(subject.getCountSession()); + subjectYarn.setAmount(subjectLine.getAmount()); + subjectYarn.setCountSession(subjectLine.getCountSession()); + subjectYarn.setCountPerson(subjectLine.getCountPerson()); + subjectYarn.setReason(param.getCaseRemark()); + return subjectYarn; + } + + /** + * 修改ActivityCenterGoods金额 + * @param noChanged + * @param activityCenterList + * @param activityCenterGoodsList + * @param subject + * @param subjectAmount + */ + public void changeActivityCenterGoodsAmt(boolean noChanged, + List activityCenterList, + List activityCenterGoodsList, + TbsActivitySubject subject, + BigDecimal subjectAmount) { + BigDecimal n100 = new BigDecimal("100"); + + BigDecimal subjectAmountSpuir = subjectAmount; + + List currentActivityCenterList = activityCenterList.stream().filter(center-> + center.getActivityId().equals(subject.getActivityId())&¢er.getSubjectId().equals(subject.getSubjectId()) + ).collect(Collectors.toList()); + + List currentActivityCenterGoodsList = activityCenterGoodsList.stream().filter(cg-> + cg.getActivityId().equals(subject.getActivityId())&&cg.getSubjectId().equals(subject.getSubjectId()) + ).collect(Collectors.toList()); + + //校验获得成本中心下的商品金额比例确保100% + for (TbsActivityCenter activityCenter : currentActivityCenterList) { + List activityCenterGoodsTmpList = this.getTbsActivityCenterGoodsByActCenter(currentActivityCenterGoodsList, activityCenter); + + BigDecimal goodsRateTotal = BigDecimal.ZERO; + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsTmpList) { + if(centerGoods.getCenterGoodsRate().compareTo(BigDecimal.ZERO)>0){ + goodsRateTotal = goodsRateTotal.add(centerGoods.getCenterGoodsRate()); + } + } + if(goodsRateTotal.compareTo(n100)!=0){ + log.error("活动ID:{} 的商品比例错误:{} ,即将重新分配活动成本中心比例",subject.getActivityId(),goodsRateTotal); + BigDecimal centerRateSurplus = n100; + BigDecimal itemRate = n100.divide(new BigDecimal(activityCenterGoodsTmpList.size()),1,RoundingMode.DOWN); + for (int i = 0; i < activityCenterGoodsTmpList.size(); i++) { + TbsActivityCenterGoods activityCenterGoods = activityCenterGoodsTmpList.get(i); + if( i+1 == activityCenterGoodsTmpList.size()){ + activityCenterGoods.setCenterGoodsRate(centerRateSurplus); + }else { + activityCenterGoods.setCenterGoodsRate(itemRate); + centerRateSurplus = centerRateSurplus.subtract(itemRate); + } + activityCenterGoodsMapper.updateById(activityCenterGoods); + } + } + } + + BigDecimal centerRateTotal = BigDecimal.ZERO; + for (TbsActivityCenter center : currentActivityCenterList) { + if(center.getCenterRate().compareTo(BigDecimal.ZERO)>0){ + centerRateTotal = centerRateTotal.add(center.getCenterRate()); + } + } + + //确保科目的百分比正确 + if(centerRateTotal.compareTo(n100)!=0){ + log.error("活动ID:{} 的比例错误:{} ,即将重新分配活动成本中心比例",subject.getActivityId(),centerRateTotal); + BigDecimal centerRateSurplus = n100; + BigDecimal itemRate = centerRateSurplus.divide(new BigDecimal(currentActivityCenterList.size()),1,RoundingMode.DOWN); + for (int i = 0; i < currentActivityCenterList.size(); i++) { + TbsActivityCenter center = currentActivityCenterList.get(i); + if( i+1 == currentActivityCenterList.size() ){ + center.setCenterRate(centerRateSurplus); + }else { + center.setCenterRate(itemRate); + centerRateSurplus = centerRateSurplus.subtract(itemRate); + } + for (TbsActivityCenterGoods centerGoods : currentActivityCenterGoodsList) { + boolean b1 = centerGoods.getSubjectId().equals(center.getSubjectId()); + boolean b2 = centerGoods.getCenterType().equals(center.getCenterType()); + boolean b3 = centerGoods.getCenterId().equals(center.getCenterId()); + if(b1&&b2&&b3){ + centerGoods.setCenterRate(center.getCenterRate()); + activityCenterGoodsMapper.updateById(centerGoods); + } + } + activityCenterMapper.updateById(center); + } + } + + for (int ii = 0; ii < currentActivityCenterList.size(); ii++) { + TbsActivityCenter activityCenter = currentActivityCenterList.get(ii); + boolean eqActivity = activityCenter.getActivityId().equals(subject.getActivityId()); + boolean eqSubject = activityCenter.getSubjectId().equals(subject.getSubjectId()); + if(eqActivity&&eqSubject){ + // 根据比例重新计算 + BigDecimal centerAmt = activityCenter.getCenterRate() + .multiply(subjectAmount).divide(n100,2, RoundingMode.HALF_UP); + if (noChanged){ + // 只对第一次赋值 + activityCenter.setOrgCenterAmount(activityCenter.getCenterAmount()); + } + if(ii+1 == currentActivityCenterList.size()){ + // 最后一项 + activityCenter.setCenterAmount(subjectAmountSpuir); + }else { + subjectAmountSpuir = subjectAmountSpuir.subtract(centerAmt); + activityCenter.setCenterAmount(centerAmt); + } + activityCenterMapper.updateById(activityCenter); + //计算成本中心下的商品 + BigDecimal tmpCenterAmt = activityCenter.getCenterAmount(); + + List activityCenterGoodsTmpList = this.getTbsActivityCenterGoodsByActCenter(currentActivityCenterGoodsList, activityCenter); + + for (int i = 0; i < activityCenterGoodsTmpList.size(); i++) { + TbsActivityCenterGoods centerGoods = activityCenterGoodsTmpList.get(i); + if(noChanged){ + //只对第一次赋值 + centerGoods.setOrgCenterAmount(activityCenter.getCenterAmount()); + centerGoods.setOrgCenterGoodsAmount(centerGoods.getCenterGoodsAmount()); + } + centerGoods.setCenterAmount(centerAmt); + BigDecimal centerGoodAmt = null; + if(i+1== activityCenterGoodsTmpList.size()){ + centerGoodAmt = tmpCenterAmt; + }else { + centerGoodAmt = centerAmt.multiply(centerGoods.getCenterGoodsRate()).divide(n100,2,RoundingMode.HALF_DOWN); + tmpCenterAmt = tmpCenterAmt.subtract(centerGoodAmt); + } + centerGoods.setCenterGoodsAmount(centerGoodAmt); + activityCenterGoodsMapper.updateById(centerGoods); + } + } + } + } + + @NotNull + private List getTbsActivityCenterGoodsByActCenter(List currentActivityCenterGoodsList, TbsActivityCenter activityCenter) { + return currentActivityCenterGoodsList.stream().filter(centerGoods -> { + boolean eqActivity4Goods = centerGoods.getActivityId().equals(activityCenter.getActivityId()); + boolean eqCenter4Goods = centerGoods.getCenterType().equals(activityCenter.getCenterType()) + && centerGoods.getCenterId().equals(activityCenter.getCenterId()); + boolean eqSubject4Goods = centerGoods.getSubjectId().equals(activityCenter.getSubjectId()); + return eqActivity4Goods && eqCenter4Goods && eqSubject4Goods; + }).collect(Collectors.toList()); + } + + @Override + public Object doRefuse(TbsAffairCommitBo param) { + Long costApplyId = Long.parseLong(this.getTargetId(param)); + TbsCostApply apply = new TbsCostApply(); + apply.setId(costApplyId); + apply.setChargeState(TbsCostApplyState.State_5_stop.getCode()); + costApplyService.updateById(apply); + costApplyService.releaseCost(costApplyId, 1); + //移除日志 + LambdaQueryWrapper logLqw = new LambdaQueryWrapper<>(); + logLqw.eq(TbsBudgetLog::getCostApplyId,costApplyId); + logLqw.eq(TbsBudgetLog::getRollbackFlag,BudgetLogRollbackFlag.State_0); + List oldLogList = tbsBudgetLogService.list(logLqw); + List oldLogList4Upd = oldLogList.stream().map(a->{ + TbsBudgetLog budgetLog = new TbsBudgetLog(); + budgetLog.setId(a.getId()); + budgetLog.setRollbackFlag(BudgetLogRollbackFlag.State_3); + return budgetLog; + }).collect(Collectors.toList()); + tbsBudgetLogService.updateBatchById(oldLogList4Upd); + for (TbsBudgetLog budgetLog : oldLogList) { + budgetLog.setCreateBy(null); + budgetLog.setCreateTime(null); + budgetLog.setUpdateBy(null); + budgetLog.setUpdateTime(null); + budgetLog.setId(null); + BudgetLogOptFlag optFlag = BudgetLogOptFlag.State_15; + budgetLog.setOptType(optFlag.getCode()); + budgetLog.setAmount(TbsBudgetLogBuildUtil.buildAmount(budgetLog.getAmount(),optFlag)); + } + tbsBudgetLogService.saveBatch(oldLogList); + //关闭活动 + LambdaQueryWrapper activityLqw = new LambdaQueryWrapper<>(); + activityLqw.eq(TbsActivity::getCostApplyId,costApplyId); + TbsActivity activityParam = new TbsActivity(); + activityParam.setActivityState(TbsActivityState.STATE_5_Close); + tbsActivityMapper.update(activityParam,activityLqw); + activitySlottingFeeMapper.updatePassFlagByCostApplyId(costApplyId,0); + //如果时异动,则恢复原来的异动状态 + TbsCostApply costApply = costApplyService.getById(costApplyId); + if(costApply.getChangeSourceId()!=null){ + costApplyPart1Service.cancelSetChanged(costApplyId,false); + } + return null; + } + + @Override + public void pageMemberAffair4packageVo(List result) { + List costApplyIds = result.stream() + .filter(a->a.getAffairInfo()!=null) + .map(b->b.getAffairInfo().getCostApplyId()) + .collect(Collectors.toList()); + List costApplyList = costApplyService.listByIds(costApplyIds); + for (CtpAffairVo affairVo : result) { + CtpAffair ctpAffair = affairVo.getAffairInfo(); + if(ctpAffair!=null){ + for (TbsCostApply costApply : costApplyList) { + if(costApply.getId().toString().equals(ctpAffair.getCostApplyId())){ + affairVo.setCostApply(costApply); + break; + } + } + } + } + + } + + @Override + public R commitAffair(TbsAffairCommitBo affairCommit) { + getRequestService().testConnection(); + TbsCostApply costApply = costApplyService.getById(affairCommit.getCostApplyId()); + if(!costApply.getChargeState().equals(TbsCostApplyState.State_1_apply.getCode())){ + Assert.throwEx("费用申请处于未非审批状态"); + } + String syFormId = costApply.getSyFormId(); + String templateCode = getTemplateCode(); + //判断是否协议类 + if(costApply.getContractFlag()!=null&&costApply.getContractFlag().equals(1)){ + templateCode = TbsSeeYonConst.CostApplyContractConf.Code(); + } + R result = getRequestService().commonCommit(affairCommit, templateCode ,syFormId); + boolean isBackCommit = affairCommit.getState()==2; + if(result.getStatus()==200){ + String flag = result.getData(); + try { + //保存记录 + // 判断是否含有下个节点 + String userId = AuthContextUtils.getSysUserId(); + SysUser sysUser = sysUserService.getById(userId); + DataAffairCommit dataAffairCommit = new DataAffairCommit(); + dataAffairCommit.setTargetCode(templateCode); + dataAffairCommit.setTargetId(costApply.getId()+""); + dataAffairCommit.setId(affairCommit.getAffairId()); + dataAffairCommit.setCommentVal(affairCommit.getComment()); + dataAffairCommit.setReleaseFlag(affairCommit.getReleaseFlag()); + dataAffairCommit.setState(affairCommit.getState()); + dataAffairCommit.setUserId(sysUser.getId()); + dataAffairCommit.setUserCode(sysUser.getCode()); + dataAffairCommit.setUserName(sysUser.getName()); + dataAffairCommit.setResultData(flag); + dataAffairCommit.setAttachIds(affairCommit.getAttachIds()); + dataAffairCommitMapper.insert(dataAffairCommit); + } catch (Exception e) { + e.printStackTrace(); + } + + //审批中(next)、完成(finish)、拒绝(refused) + log.warn("审批节点返回结果:{}",flag); + if("finish".equals(flag)){ + this.doFinished(affairCommit); + return R.ok(); + }else if ("stop".equals(flag)){ + if(isBackCommit){ + this.doBacked(affairCommit); + return R.ok(); + }else { + this.doRefuse(affairCommit); + return R.ok(); + } + }else if ("next".equals(flag)){ + this.doNext(affairCommit); + //特殊记录需要异步 + AsyncManager.me().execute(AsyncFactory.submitCostApply(costApply)); + return R.ok(); + } + }else if (result.getStatus()==500){ + return result; + } + return R.ok(); + } + + @Override + public String getTargetId(TbsAffairCommitBo affairCommit) { + return affairCommit.getCostApplyId().toString(); + } + + @Override + public String getSyFormIdByTargetInfo(TbsAffairCommitBo affairCommit) { + TbsCostApply costApply = costApplyService.getById(affairCommit.getCostApplyId()); + if(!costApply.getChargeState().equals(TbsCostApplyState.State_1_apply.getCode())){ + Assert.throwEx("费用申请处于未非审批状态"); + } + return costApply.getSyFormId(); + } + + @Override + public Object compensateBacked(String targetId) { + TbsCostApply costApply = costApplyService.getById(targetId); + if(costApply.getChargeState().equals(TbsCostApplyState.State_1_apply.getCode())){ + TbsAffairCommitBo bo = new TbsAffairCommitBo(); + bo.setCostApplyId(costApply.getId()); + this.doBacked(bo); + } + return null; + } + + @Override + public Object compensateFinished(String targetId) { + TbsCostApply costApply = costApplyService.getById(targetId); + if(costApply.getChargeState().equals(TbsCostApplyState.State_1_apply.getCode())){ + TbsAffairCommitBo bo = new TbsAffairCommitBo(); + bo.setCostApplyId(costApply.getId()); + this.doFinished(bo); + } + BirActivityCenterGoodsUtil.buildBir(costApply.getId()); + //更新活动状态为冻结 + activityService.initReopenState(); + activityService.flushBandingState(Arrays.asList(costApply.getId())); + return null; + } + + @Override + public Object compensateRefuse(String targetId) { + TbsCostApply costApply = costApplyService.getById(targetId); + if(costApply.getChargeState().equals(TbsCostApplyState.State_1_apply.getCode())){ + TbsAffairCommitBo bo = new TbsAffairCommitBo(); + bo.setCostApplyId(costApply.getId()); + this.doRefuse(bo); + } + return null; + } + + @Override + public R runCompensate(String targetId) { + testConnection(); + String templateCode = getTemplateCode(); + TbsCostApply costApply = costApplyService.getById(targetId); + if(costApply.getContractFlag()!=null&&costApply.getContractFlag().equals(1)){ + templateCode = TbsSeeYonConst.CostApplyContractConf.Code(); + } + SyAffairStateResult stateResult =checkAffairState(targetId,templateCode); + SyAffairState affairState = stateResult.getState(); + if(affairState.equals(SyAffairState.next)){ + return R.ok(compensateNext(targetId)); + }else if(affairState.equals(SyAffairState.backed)){ + return R.ok(compensateBacked(targetId)); + }else if(affairState.equals(SyAffairState.finished)){ + return R.ok(compensateFinished(targetId)); + }else if(affairState.equals(SyAffairState.refuse)){ + return R.ok(compensateRefuse(targetId)); + }else if(affairState.equals(SyAffairState.error)){ + return R.error("数据异常请联系管理员"); + }else{ + return R.error("OA无相关审批数据"); + } + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyPart1ServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyPart1ServiceImpl.java new file mode 100644 index 0000000..6c3ac08 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyPart1ServiceImpl.java @@ -0,0 +1,670 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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.*; +import com.qs.serve.modules.bir.consts.BirActivityCenterGoodsUtil; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsSubject; +import com.qs.serve.modules.bms.entity.BmsSubjectForm; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.*; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.service.GoodsCategoryService; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysAttach; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.sys.service.SysAttachService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsCenterType; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.bo.TbsActivityDefaultCenterBo; +import com.qs.serve.modules.tbs.entity.vo.TbsActivityDefaultCenterVo; +import com.qs.serve.modules.tbs.mapper.*; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.vtb.common.VtbVerificationState; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import com.qs.serve.modules.vtb.service.VtbFundFlowService; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/7/27 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsCostApplyPart1ServiceImpl implements TbsCostApplyPart1Service { + + private TbsCostApplyService tbsCostApplyService; + + private TbsActivityCenterService tbsActivityCenterService; + private TbsActivitySubjectService tbsActivitySubjectService; + private TbsActivityGoodsService tbsActivityGoodsService; + private TbsActivitySlottingFeeService tbsActivitySlottingFeeService; + private TbsActivityPayConditionService activitySlottingConditionService; + private TbsActivityMapper tbsActivityMapper; + private TbsActivityCenterGoodsService tbsActivityCenterGoodsService; + private TbsActivityChannelService tbsActivityChannelService; + private TbsActivityChannelPointService tbsActivityChannelPointService; + private TbsCostContractMapper costContractMapper; + private VtbVerificationMapper verificationMapper; + private TbsBudgetLogMapper tbsBudgetLogMapper; + private TbsBudgetCostItemMapper tbsBudgetCostItemMapper; + private SysUserMapper sysUserMapper; + private final SysUserService sysUserService; + + private final TbsCostApplyService costApplyService; + private final TbsActivityService tbsActivityService; + private final TbsActivityGoodsService activityGoodsService; + private final TbsActivitySubjectService activitySubjectService; + private final TbsActivityCenterService activityCenterService; + private final TbsActivityCenterGoodsService activityCenterGoodsService; + private final TbsActivityChannelService activityChannelService; + private final TbsActivityChannelPointService activityChannelPointService; + + private final GoodsSkuService goodsSkuService; + private final GoodsSpuService goodsSpuService; + private final GoodsCategoryService goodsCategoryService; + + private final BmsSupplierService bmsSupplierService; + private final BmsCostCenterService bmsCostCenterService; + private final BmsRegion2Service bmsRegion2Service; + private final BmsRegionService bmsRegionService; + private final BmsSubjectService bmsSubjectService; + private final BmsSubjectFormService bmsSubjectFormService; + + private final VtbVerificationService verificationService; + private final VtbFundFlowService vtbFundFlowService; + + private final TbsActivityApplicationService tbsActivityApplicationService; + private final TbsBudgetService tbsBudgetService; + private final TbsBudgetConditionService tbsBudgetConditionService; + private final TbsScheduleItemBudgetMapper tbsScheduleItemBudgetMapper; + private SysAttachService attachService; + private RedisService redisService; + + @Override + public TbsCostApply copyById(Long costId) { + final String newCostApplyCode = CodeGenUtil.generate(CodeGenUtil.SourceKey.CostApply); + TbsCostApply costApply = tbsCostApplyService.getById(costId); + costApply.setId(null); + SysUser sysUser = sysUserMapper.selectById(AuthContextUtils.getSysUserId()); + costApply.setUserId(sysUser.getId()); + costApply.setUserCode(sysUser.getCode()); + costApply.setUserName(sysUser.getName()); + costApply.setCode(newCostApplyCode); + costApply.setCheckState(null); + costApply.setCreateBy(null); + costApply.setCreateTime(null); + costApply.setUpdateTime(null); + costApply.setUpdateBy(null); + costApply.setChangeSourceId(null); + costApply.setChangeExtendId(null); + costApply.setCancelFlag(null); + costApply.setTotalActivityUsedAmount(null); + costApply.setEditAmountFlag(null); + costApply.setChargeState(TbsCostApplyState.State_0_unPublish.getCode()); + costApply.setChangeActionTime(null); + costApply.setChangeStateRecord(null); + tbsCostApplyService.save(costApply); + final Long newCostApplyId = costApply.getId(); + + QueryWrapper qw_cost_apply = new QueryWrapper(); + qw_cost_apply.eq("cost_apply_id",costId); + List contracts = costContractMapper.selectList(qw_cost_apply); + contracts.forEach(con->{ + con.setId(null); + con.setCostApplyId(newCostApplyId); + }); + //活动相关复制 + List activityList = tbsActivityMapper.selectList(qw_cost_apply); + //更新状态 + this.copyAboutActivityData(newCostApplyId,newCostApplyCode, activityList); + return costApply; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public TbsCostApply toSetChanged(Long costId) { + redisService.throwResLock(TbsCostApply.class.getSimpleName(),costId+""); + String userId = AuthContextUtils.getSysUserId(); + TbsCostApply orgCost = tbsCostApplyService.getById(costId); + 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("拒绝访问"); + } + if(!orgCost.getChargeState().equals(TbsCostApplyState.State_2_actioning.getCode())&& + !orgCost.getChargeState().equals(TbsCostApplyState.State_4_refused.getCode())){ + Assert.throwEx("费用申请的状态不支持"); + } + //判断是否有核销记录 + LambdaQueryWrapper vtbLqwCount = new LambdaQueryWrapper<>(); + vtbLqwCount.eq(VtbVerification::getCostApplyId,costId); + vtbLqwCount.and(qw->{ + qw.eq(VtbVerification::getVerificationState, VtbVerificationState.Commiting.getCode()) + .or().eq(VtbVerification::getVerificationState,VtbVerificationState.Finished.getCode()); + }); + Long count = verificationMapper.selectCount(vtbLqwCount); + if(count>0){ + Assert.throwEx("含有核销记录不支持异动"); + } + //复制新记录 + TbsCostApply costApply = CopierUtil.copy(orgCost,new TbsCostApply()); + costApply.setId(null); + costApply.setCreateBy(null); + costApply.setCreateTime(null); + costApply.setUpdateTime(null); + costApply.setUpdateBy(null); + costApply.setCancelFlag(null); + costApply.setSubmitTime(null); + costApply.setChangeSourceId(orgCost.getId()); + costApply.setChangeExtendId(null); + costApply.setChargeState(TbsCostApplyState.State_0_unPublish.getCode()); + tbsCostApplyService.save(costApply); + final Long newCostApplyId = costApply.getId(); + //费用相关复制 + QueryWrapper qw_cost_apply = new QueryWrapper(); + qw_cost_apply.eq("cost_apply_id",costId); + List contracts = costContractMapper.selectList(qw_cost_apply); + contracts.forEach(con->{ + con.setId(null); + con.setCostApplyId(newCostApplyId); + con.setCreateBy(null); + con.setCreateTime(null); + con.setUpdateBy(null); + con.setUpdateTime(null); + }); + if(contracts.size()>0){ + for (TbsCostContract contract : contracts) { + costContractMapper.insert(contract); + } + } + //活动相关复制 + List activityList = tbsActivityMapper.selectList(qw_cost_apply); + //更新状态 + List activityIds = activityList.stream().map(TbsActivity::getId).collect(Collectors.toList()); + TbsActivity activity4Update = new TbsActivity(); + activity4Update.setCancelFlag(1); + LambdaQueryWrapper activityLqw = new LambdaQueryWrapper<>(); + activityLqw.in(TbsActivity::getId,activityIds); + tbsActivityMapper.update(activity4Update,activityLqw); + this.copyAboutActivityData(newCostApplyId,null, activityList); + //更变旧记录 + orgCost.setChangeStateRecord(orgCost.getChargeState()); + orgCost.setChargeState(TbsCostApplyState.State_7_changed.getCode()); + orgCost.setCancelFlag(1); + orgCost.setChangeExtendId(costApply.getId()); + orgCost.setChangeActionTime(LocalDateTime.now()); + tbsCostApplyService.updateById(orgCost); + BirActivityCenterGoodsUtil.buildBir(costId); + BirActivityCenterGoodsUtil.buildBir(newCostApplyId); + return costApply; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelSetChanged(Long costId,boolean checkThrow) { + //判断是否有核销记录 + LambdaQueryWrapper vtbLqwCount = new LambdaQueryWrapper<>(); + vtbLqwCount.eq(VtbVerification::getCostApplyId,costId); + vtbLqwCount.and(qw->{ + qw.eq(VtbVerification::getVerificationState, VtbVerificationState.Commiting.getCode()) + .or().eq(VtbVerification::getVerificationState,VtbVerificationState.Finished.getCode()); + }); + + TbsCostApply extCost = tbsCostApplyService.getById(costId); + + long countErr = tbsBudgetLogMapper.countErrorCostId(extCost.getChangeSourceId()); + if(countErr>0){ + Assert.throwEx("审批流程错误无法取消异动"); + } + + if(checkThrow){ + Long count = verificationMapper.selectCount(vtbLqwCount); + if(count>0){ + Assert.throwEx("含有核销记录不支持取消异动"); + } + if(extCost.getCancelFlag().equals(1)){ + Assert.throwEx("请选择最新的异动记录"); + } + if(extCost.getChangeSourceId()==null){ + Assert.throwEx("无异动记录"); + } + } + extCost.setCancelFlag(1); + extCost.setChangeStateRecord(extCost.getChargeState()); + extCost.setChargeState(TbsCostApplyState.State_8_changed_fail.getCode()); + tbsCostApplyService.updateById(extCost); + //恢复原来费用申请的状态 + TbsCostApply costApply = tbsCostApplyService.getById(extCost.getChangeSourceId()); + costApply.setChargeState(costApply.getChangeStateRecord()); + costApply.setChangeActionTime(LocalDateTime.now()); + costApply.setCancelFlag(0); + tbsCostApplyService.updateById(costApply); + //恢复原来的活动的取消状态 + LambdaQueryWrapper updActLqw = new LambdaQueryWrapper<>(); + updActLqw.eq(TbsActivity::getCostApplyId,costApply.getId()); + TbsActivity updActEntity = new TbsActivity(); + updActEntity.setCancelFlag(0); + tbsActivityMapper.update(updActEntity,updActLqw); + //恢复原来的费用占用 + tbsBudgetLogMapper.updateLogDelFlagCancelByCostApply(extCost.getChangeSourceId(),0); + //删除当前的异动记录 + tbsBudgetLogMapper.updateLogDelFlagByCostApply(extCost.getId(),1); + + BirActivityCenterGoodsUtil.buildBir(extCost.getChangeSourceId()); + BirActivityCenterGoodsUtil.buildBir(extCost.getId()); + } + + /** + * 活动相关复制 + * @param newCostApplyId + * @param newCostApplyCode + * @param activityList + */ + private void copyAboutActivityData(Long newCostApplyId,String newCostApplyCode, List activityList) { + int idx = 1; + for (TbsActivity orgActivity : activityList) { + //原ActivityID + Long orgActivityId = orgActivity.getId(); + //重新保存 + orgActivity.setId(null); + if(newCostApplyCode!=null){ + orgActivity.setActivityCode(newCostApplyCode+"_"+idx); + idx++; + } + orgActivity.setCostApplyId(newCostApplyId); + orgActivity.setActivityState(0); + orgActivity.setCreateBy(null); + orgActivity.setCreateTime(null); + orgActivity.setUpdateTime(null); + orgActivity.setUpdateBy(null); + orgActivity.setUsedAmount(null); + orgActivity.setReleaseAmount(null); + orgActivity.setCancelFlag(null); + orgActivity.setReopenFlag(null); + orgActivity.setFinishedFlag(null); + orgActivity.setPreEndDateBack(null); + orgActivity.setFinishedTime(null); + orgActivity.setCostPassFlag(null); + orgActivity.setReleaseFlag(null); + tbsActivityMapper.insert(orgActivity); + final Long newActivityId = orgActivity.getId(); + + QueryWrapper qw_activity = new QueryWrapper(); + qw_activity.eq("activity_id",orgActivityId); + + List goodsList = tbsActivityGoodsService.list(qw_activity); + goodsList.forEach(obj->{ + obj.setId(null); + obj.setCostApplyId(newCostApplyId); + obj.setActivityId(newActivityId); + }); + tbsActivityGoodsService.saveBatch(goodsList); + + List centerList = tbsActivityCenterService.list(qw_activity); + centerList.forEach(obj->{ + obj.setId(null); + obj.setCostApplyId(newCostApplyId); + obj.setActivityId(newActivityId); + obj.setUsedAmount(BigDecimal.ZERO); + + }); + tbsActivityCenterService.saveBatch(centerList); + + List subjectList = tbsActivitySubjectService.list(qw_activity); + subjectList.forEach(obj->{ + obj.setId(null); + obj.setCostApplyId(newCostApplyId); + obj.setActivityId(newActivityId); + obj.setUsedAmount(BigDecimal.ZERO); + }); + tbsActivitySubjectService.saveBatch(subjectList); + + List centerGoodsList = tbsActivityCenterGoodsService.list(qw_activity); + centerGoodsList.forEach(obj->{ + obj.setId(null); + obj.setCostApplyId(newCostApplyId); + obj.setActivityId(newActivityId); + obj.setUsedAmount(BigDecimal.ZERO); + }); + tbsActivityCenterGoodsService.saveBatch(centerGoodsList); + + List channelList = tbsActivityChannelService.list(qw_activity); + channelList.forEach(obj->{ + obj.setId(null); + obj.setCostApplyId(newCostApplyId); + obj.setActivityId(newActivityId); + }); + tbsActivityChannelService.saveBatch(channelList); + + List channelPointList = tbsActivityChannelPointService.list(qw_activity); + channelPointList.forEach(obj->{ + obj.setId(null); + obj.setCostApplyId(newCostApplyId); + obj.setActivityId(newActivityId); + }); + tbsActivityChannelPointService.saveBatch(channelPointList); + + + List payConditionList = activitySlottingConditionService.list(qw_activity); + payConditionList.forEach(obj->{ + obj.setId(null); + obj.setCostApplyId(newCostApplyId); + obj.setActivityId(newActivityId); + }); + activitySlottingConditionService.saveBatch(payConditionList); + + List slottingFeeList = tbsActivitySlottingFeeService.list(qw_activity); + slottingFeeList.forEach(obj->{ + obj.setId(null); + obj.setCostApplyId(newCostApplyId); + obj.setActivityId(newActivityId); + }); + tbsActivitySlottingFeeService.saveBatch(slottingFeeList); + + } + } + + + @Override + public void updateAmtAndRateByActSubject(Long activityId) { + final TbsCostApplyOperationServiceImpl costApplyOperationService = SpringUtils.getBean(TbsCostApplyOperationServiceImpl.class); + List activitySubjectList = tbsActivitySubjectService.listByActivityId(activityId); + List activityCenterList = tbsActivityCenterService.listByActivity(activityId); + List activityCenterGoodsList = tbsActivityCenterGoodsService.listByActivityId(activityId); + for (TbsActivitySubject activitySubject : activitySubjectList) { + // 更新 TbsActivityCenter 和 TbsActivityCenterGoods的金额 + costApplyOperationService.changeActivityCenterGoodsAmt(false, + activityCenterList,activityCenterGoodsList,activitySubject,activitySubject.getAmount()); + } + //重新加载 + activityCenterGoodsList = tbsActivityCenterGoodsService.listByActivityId(activityId); + + // 更新 tbs_budget_cost_item + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + TbsBudgetCostItem costItem = new TbsBudgetCostItem(); + costItem.setCenterGoodsAmount(centerGoods.getCenterGoodsAmount()); + tbsBudgetCostItemMapper.update(costItem, + new LambdaQueryWrapper() + .eq(TbsBudgetCostItem::getCenterGoodItemId,centerGoods.getId())); + } + + //更新预算占用 + List budgetLogList = tbsBudgetLogMapper.selectList(new LambdaQueryWrapper() + .eq(TbsBudgetLog::getActivityId,activityId) + .eq(TbsBudgetLog::getOptType, BudgetLogOptFlag.State_1.getCode())); + + if(budgetLogList.size()<1){ + log.warn("活动ID:{} 无申请预算的日志",activityId); + return; + } + + if(budgetLogList.size()!=activityCenterGoodsList.size()){ + log.warn("活动ID:{} 申请预算的日志数量不匹配",activityId); + return; + } + List updateBudgetLog = new ArrayList<>(); + + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + for (TbsBudgetLog budgetLog : budgetLogList) { + boolean eqSubjectId = centerGoods.getSubjectId().equals(budgetLog.getSubjectId()); + boolean eqCenterId = centerGoods.getCenterId().equals(budgetLog.getCenterId()); + boolean eqCenterType = centerGoods.getCenterType().equals(budgetLog.getCenterType()); + boolean eqTargetType = centerGoods.getTargetType().equals(budgetLog.getTargetType()); + boolean eqTargetId = centerGoods.getTargetId().equals(budgetLog.getTargetId()); + if(eqSubjectId&&eqCenterId&&eqCenterType&&eqTargetType&&eqTargetId){ + TbsBudgetLog param = new TbsBudgetLog(); + param.setId(budgetLog.getId()); + //负数 + param.setAmount(centerGoods.getCenterGoodsAmount().negate()); + updateBudgetLog.add(param); + } + } + } + + if(updateBudgetLog.size() == activityCenterGoodsList.size()){ + for (TbsBudgetLog budgetLog : updateBudgetLog) { + tbsBudgetLogMapper.updateById(budgetLog); + } + }else { + log.warn("活动ID:{} 申请预算的日志,更新数量不匹配",activityId); + } + + } + + + @Override + public void buildDetailVo(TbsActivity activity) { + LambdaQueryWrapper actGoodsLqw = new LambdaQueryWrapper<>(); + actGoodsLqw.eq(TbsActivityGoods::getActivityId,activity.getId()); + actGoodsLqw.orderByDesc(TbsActivityGoods::getTargetName); + List goodsList = activityGoodsService.list(actGoodsLqw); + if(goodsList.size()>0){ + activity.setGoodsType(goodsList.get(0).getTargetType()); + goodsList.forEach(TbsActivityGoods::initSpuSkuName); + goodsList.forEach(TbsActivityGoods::initCategoryNameByPathsName); + } + activity.setGoodsList(goodsList); + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("activity_id", activity.getId()); + List activityChannels = activityChannelService.list(qw); + activity.setCustomChannelList(activityChannels); + if(activityChannels.size()<1){ + List channelPoints = activityChannelPointService.list(qw); + activity.setCustomChannelPointList(channelPoints); + if(channelPoints.size()<1 && activityChannels.size()<1){ + activity.setCustomSupplier(bmsSupplierService.getById(activity.getSupplierId())); + } + } + List activitySubjects = activitySubjectService.list(qw); + List activityCenters = activityCenterService.list(qw); + + TbsCostApply costApply = costApplyService.getById(activity.getCostApplyId()); + + //成本中心关联出相关预算 + for (TbsActivityCenter center : activityCenters) { + //没通过加载可选的所有预算,已通过加载出选中的预算 + String subjectId = center.getSubjectId()+""; + String centerType = center.getCenterType(); + String centerId = center.getCenterId(); + if(costApply.getChargeState()>0||activity.getCostPassFlag().equals(1)){ + //选中的预算 + String activityId = activity.getId()+""; + List list = tbsScheduleItemBudgetMapper.listByActivityAndSubjectAndCenter( + activityId,subjectId,centerType,centerId); + center.setMatchBudgetList(list); + }else { + //可选的所有预算 + List list = + tbsScheduleItemBudgetMapper.listBySubjectAndCenter(subjectId,centerType,centerId); + center.setMatchBudgetList(list); + } + } + + Map> centerListMap = activityCenters.stream().collect(Collectors.groupingBy(TbsActivityCenter::getSubjectId)); + List subjectIds = activitySubjects.stream().map(TbsActivitySubject::getSubjectId).distinct().collect(Collectors.toList()); + List subjectList = bmsSubjectService.listByIds(subjectIds); + List formIds = subjectList.stream().map(BmsSubject::getFormId).distinct().collect(Collectors.toList()); + List subjectForms = null; + if(CollectionUtil.isNotEmpty(formIds)){ + subjectForms = bmsSubjectFormService.listByIds(formIds); + } + for (TbsActivitySubject activitySubject : activitySubjects) { + if(CollectionUtil.isNotEmpty(subjectForms)){ + for (BmsSubject subject : subjectList) { + if(subject.getId().equals(activitySubject.getSubjectId())&&subject.getFormId()!=null){ + for (BmsSubjectForm subjectForm : subjectForms) { + if(subjectForm.getId().equals(subject.getFormId())){ + activitySubject.setSubjectFormInfo(subjectForm); + break; + } + } + break; + } + } + } + List activityCenterList = centerListMap.get(activitySubject.getSubjectId()); + activitySubject.setActivityCenterList(activityCenterList); + } + activity.setSubjectCenterList(activitySubjects); + List activityCenterGoodsList = activityCenterGoodsService.list(qw); + activityCenterGoodsList.forEach(TbsActivityCenterGoods::initSpuSkuName); + activity.setCenterGoodsList(activityCenterGoodsList); + + if(CollectionUtil.isNotEmpty(activity.getAttachIds())){ + List attachIds = Arrays.asList(activity.getAttachIds()); + List attachList = attachService.listByIds(attachIds); + activity.setAttachList(attachList); + } + + LambdaQueryWrapper vtbLqw = new LambdaQueryWrapper<>(); + vtbLqw.eq(VtbVerification::getActivityId,activity.getId()); + activity.setVerificationNum(verificationService.count(vtbLqw)); + } + + + @Override + public R getDefaultCenter(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); + List centerBudgetList = new ArrayList<>(); + //[产品List空] 或[科目ID空] ,返回[客户] + if(CollectionUtil.isNotEmpty(goodsIds)&&subjectId!=null){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsBudget::getBudgetState,1); + //排除随货编码 + lqw.ne(TbsBudget::getSubjectCode,"FYMC05"); + List budgetList = tbsBudgetService.list(lqw); + List idPaths = new ArrayList<>(); + if(budgetList.size()>0){ + if(TbsGoodsType.spu.name().equals(goodsType)){ + for (Long goodsId : goodsIds) { + GoodsSpu goodsSpu = goodsSpuService.getById(goodsId); + String idPath = goodsSpu.getCategoryFirst()+"_"+goodsSpu.getCategorySecond()+"_" + +goodsSpu.getCategoryThird()+"_"+goodsSpu.getId(); + idPaths.add(idPath); + } + }else if(TbsGoodsType.sku.name().equals(goodsType)){ + for (Long goodsId : goodsIds) { + GoodsSku sku = goodsSkuService.getById(goodsId); + GoodsSpu goodsSpu = goodsSpuService.getById(sku.getSpuId()); + String idPath = goodsSpu.getCategoryFirst()+"_"+goodsSpu.getCategorySecond()+"_" + +goodsSpu.getCategoryThird()+"_"+goodsSpu.getId()+"_"+sku.getId(); + idPaths.add(idPath); + } + }else { + for (Long goodsId : goodsIds) { + GoodsCategory category = goodsCategoryService.getById(goodsId); + if(category!=null){ + idPaths.add(category.getLevelPath()); + } + } + } + } + List budgetIds = budgetList.stream().map(TbsBudget::getId).collect(Collectors.toList()); + LambdaQueryWrapper lqwCon = new LambdaQueryWrapper<>(); + lqwCon.in(TbsBudgetCondition::getBudgetId,budgetIds); + List budgetConditionsAll = tbsBudgetConditionService.list(lqwCon); + Map> groupedConditions = budgetConditionsAll.stream() + .collect(Collectors.groupingBy(TbsBudgetCondition::getBudgetId)); + for (TbsBudget budget : budgetList) { + if(budget.getConditionFlag().equals(1)){ + List budgetConditions = groupedConditions.get(budget.getId()); + for (int i = 0; i < idPaths.size(); i++) { + String idPath = idPaths.get(i); + boolean isMatch = false; + if(budgetConditions!=null){ + for (TbsBudgetCondition budgetCondition : budgetConditions) { + if(idPath.contains(budgetCondition.getTargetLevelPathIds())){ + isMatch = true; + } + } + } + if(!isMatch){ + break; + } + //满足条件 + if(i+1==idPaths.size()){ + centerBudgetList.add(budget); + } + } + }else { + centerBudgetList.add(budget); + } + } + } + //匹配有预算并且成本中心为客户的 + for (TbsBudget budget : centerBudgetList) { + if (budget.getCenterType().equals(TbsCenterType.customer.name())){ + if(budget.getCenterId().equals(supplier.getId())){ + TbsActivityDefaultCenterVo defaultCenterVo = new TbsActivityDefaultCenterVo(); + defaultCenterVo.setSupplier(supplier); + return R.ok(defaultCenterVo); + } + } + } + + //匹配有预算并且成本中心为销售区域的,按最按近的销售区域优先级返回 + Optional regionThirdCenter = centerBudgetList.stream().filter(a -> a.getCenterType().equals(TbsCenterType.saleRegion.name()) + && a.getCenterId().equals(supplier.getRegionThird())).findFirst(); + if(regionThirdCenter.isPresent()){ + TbsActivityDefaultCenterVo defaultCenterVo = new TbsActivityDefaultCenterVo(); + BmsRegion saleRegionTemp = bmsRegionService.getById(regionThirdCenter.get().getCenterId()); + defaultCenterVo.setSaleRegion(saleRegionTemp); + return R.ok(defaultCenterVo); + } + Optional regionSecondCenter = centerBudgetList.stream().filter(a -> a.getCenterType().equals(TbsCenterType.saleRegion.name()) + && a.getCenterId().equals(supplier.getRegionSecond())).findFirst(); + if(regionSecondCenter.isPresent()){ + TbsActivityDefaultCenterVo defaultCenterVo = new TbsActivityDefaultCenterVo(); + BmsRegion saleRegionTemp = bmsRegionService.getById(regionSecondCenter.get().getCenterId()); + defaultCenterVo.setSaleRegion(saleRegionTemp); + return R.ok(defaultCenterVo); + } + Optional regionFirstCenter = centerBudgetList.stream().filter(a -> a.getCenterType().equals(TbsCenterType.saleRegion.name()) + && a.getCenterId().equals(supplier.getRegionFirst())).findFirst(); + if(regionFirstCenter.isPresent()){ + TbsActivityDefaultCenterVo defaultCenterVo = new TbsActivityDefaultCenterVo(); + BmsRegion saleRegionTemp = bmsRegionService.getById(regionFirstCenter.get().getCenterId()); + defaultCenterVo.setSaleRegion(saleRegionTemp); + return R.ok(defaultCenterVo); + } + + + TbsActivityDefaultCenterVo defaultCenterVo = new TbsActivityDefaultCenterVo(); + defaultCenterVo.setSupplier(supplier); + return R.ok(defaultCenterVo); + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java new file mode 100644 index 0000000..5fdbc68 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostApplyServiceImpl.java @@ -0,0 +1,1802 @@ +package com.qs.serve.modules.tbs.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.config.properties.ProjectApisProperties; +import com.qs.serve.common.config.properties.ProjectProperties; +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; +import com.qs.serve.common.model.enums.MonthValues; +import com.qs.serve.common.model.oa.OaFormMainProcess; +import com.qs.serve.common.model.oa.OaUploadFile; +import com.qs.serve.modules.sync.AsyncFactory; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.tag.util.TagFiledUtil; +import com.qs.serve.common.util.*; +import com.qs.serve.common.util.model.DateFormatString; +import com.qs.serve.modules.bir.entity.dto.BirRoiCostDTO; +import com.qs.serve.modules.bir.entity.vo.BirRoiCostItemVo; +import com.qs.serve.modules.bir.entity.vo.YtdQtdToOAVo; +import com.qs.serve.modules.bir.mapper.BirRoiRateMapper; +import com.qs.serve.modules.bir.service.BirCenterRateService; +import com.qs.serve.modules.bir.service.BirRoiRateService; +import com.qs.serve.modules.bms.entity.*; +import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierTargetMapper; +import com.qs.serve.modules.bms.service.BmsSubjectRegionService; +import com.qs.serve.modules.bms.service.BmsSubjectService; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.erp.entity.dto.ErpDispatchSumVo; +import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper; +import com.qs.serve.modules.goods.common.GoodsType; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.mapper.GoodsCategoryMapper; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.mapper.GoodsSpuMapper; +import com.qs.serve.modules.seeyon.entity.BaseCreateCallbackBo; +import com.qs.serve.modules.seeyon.entity.BaseCreateProcessBo; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.sys.entity.SysAttach; +import com.qs.serve.modules.sys.entity.SysConfig; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysAttachService; +import com.qs.serve.modules.sys.service.SysConfigService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tag.mapper.TagInfoMapper; +import com.qs.serve.modules.tbs.common.TbsActivityState; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.common.util.BirHttpUtil; +import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCostResult; +import com.qs.serve.modules.tbs.entity.dto.TbsContractCostSubItem; +import com.qs.serve.modules.tbs.entity.dto.TbsCostSubItem; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetTableResultVo; +import com.qs.serve.modules.tbs.mapper.*; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.vtb.common.VtbVerificationState; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.BeansException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.net.URLEncoder; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 费用申请 服务实现类 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsCostApplyServiceImpl extends ServiceImpl implements TbsCostApplyService { + + private RedisService redisService; + private TbsActivityChannelMapper tbsActivityChannelMapper; + private TbsActivityChannelPointMapper tbsActivityChannelPointMapper; + private TbsActivityTemplateRegionMapper tbsActivityTemplateRegionMapper; + private TbsActivityTemplateMapper tbsActivityTemplateMapper; + private VtbVerificationMapper vtbVerificationMapper; + private TbsBudgetApplicationService budgetApplicationService; + private TbsBudgetCostItemService budgetCostItemService; + private TbsBudgetLogService budgetLogService; + private SysUserService sysUserService; + private SeeYonRequestService seeYonService; + private TbsActivityTemplateService tbsActivityTemplateService; + private TbsActivityCenterService tbsActivityCenterService; + private TbsActivitySubjectService tbsActivitySubjectService; + private TbsActivityGoodsService tbsActivityGoodsService; + private TbsCostUnItemService tbsCostUnItemService; + private BmsSupplierService bmsSupplierService; + private BmsRegionMapper regionMapper; + private BmsRegion2Mapper region2Mapper; + private BmsSubjectService subjectService; + private TbsCostTodoMapper tbsCostTodoMapper; + private TbsActivitySlottingFeeMapper activitySlottingFeeMapper; + private TbsActivityPayConditionMapper tbsActivityPayConditionMapper; + private TbsActivityMapper tbsActivityMapper; + private TbsActivityCenterGoodsMapper tbsActivityCenterGoodsMapper; + private ProjectProperties projectProperties; + private TbsCostContractMapper costContractMapper; + private VtbVerificationMapper verificationMapper; + private SysAttachService sysAttachService; + + private GoodsSpuMapper goodsSpuMapper; + private GoodsSkuMapper goodsSkuMapper; + private GoodsCategoryMapper goodsCategoryMapper; + + private BirRoiRateService birRoiRateService; + private BirCenterRateService centerRateService; + private BirRoiRateMapper birRoiRateMapper; + private final ErpDispatchDataMapper dispatchDataMapper; + private TbsScheduleItemMapper tbsScheduleItemMapper; + + private BmsSupplierTargetMapper bmsSupplierTargetMapper; + + private TbsBudgetMatchApplication tbsBudgetMatchApplication; + + private BmsSubjectRegionService bmsSubjectRegionService; + private TbsCostCheckStateMapper costCheckStateMapper; + private TbsCostApplyMapper tbsCostApplyMapper; + private ProjectApisProperties projectApisProperties; + private TagInfoMapper tagInfoMapper; + + @Override + public BigDecimal totalCostUsed(Long id) { + return tbsActivityMapper.sumCostUsedAmount(id); + } + + @Override + public void updateCheckState() { + AuthContextUtils.setTenant("001"); + costCheckStateMapper.updateCheckState0(); + costCheckStateMapper.updateCheckState0ByVtb(); + costCheckStateMapper.updateCheckState1(); + costCheckStateMapper.updateCheckState2(); + List costIds = costCheckStateMapper.selectCheckState3(); + if(costIds.size()>0){ + costCheckStateMapper.updateCheckState3(costIds); + } + costCheckStateMapper.updateCheckState4(); + tbsCostApplyMapper.updateContractFinishedState(); + } + + @Override + public TbsCostApply getByCode(String code) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostApply::getCode,code); + lqw.eq(TbsCostApply::getCancelFlag,0); + return this.getOne(lqw,false); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void removeCostById(Long id) { + TbsCostApply costApply = this.getById(id); + if(costApply.getChangeExtendId()!=null&&!costApply.getChargeState().equals(TbsCostApplyState.State_2_actioning.getCode())){ + Assert.throwEx("异动的单据,待执行状态才可作废"); + } + if(costApply.getContractFlag().equals(1)){ + Assert.throwEx("协议类不支持作废"); + } + if(!costApply.getChargeState().equals(TbsCostApplyState.State_2_actioning.getCode()) + &&!costApply.getChargeState().equals(TbsCostApplyState.State_4_refused.getCode())) { + Assert.throwEx("当前单据状态不可作废"); + } + LambdaQueryWrapper vtbLqw = new LambdaQueryWrapper<>(); + vtbLqw.eq(VtbVerification::getCostApplyId,id); + vtbLqw.and( + qw->qw.eq(VtbVerification::getVerificationState, VtbVerificationState.Finished.getCode()) + .or() + .eq(VtbVerification::getVerificationState, VtbVerificationState.Commiting.getCode()) + ); + long count = verificationMapper.selectCount(vtbLqw); + if(count>0){ + Assert.throwEx("含核销记录不可作废"); + } + TbsCostApply costApply4Update = new TbsCostApply(); + costApply4Update.setId(id); + costApply4Update.setChargeState(TbsCostApplyState.State_6_remove.getCode()); + this.updateById(costApply4Update); + //删除费用占用的预算 + LambdaQueryWrapper rmLogLqw = new LambdaQueryWrapper<>(); + rmLogLqw.eq(TbsBudgetLog::getCostApplyId,id); + budgetLogService.remove(rmLogLqw); + //命中预算 + budgetCostItemService.removeByCostApplyId(id); + + } + + @Override + public void rebuildBudgetInit(Long costId) { + + TbsCostApply costApply = this.getById(costId); + SysUser sysUser = sysUserService.getById(costApply.getUserId()); + //相关活动 + LambdaQueryWrapper actLqw = new LambdaQueryWrapper<>(); + actLqw.eq(TbsActivity::getCostApplyId,costId); + List activityList = tbsActivityMapper.selectList(actLqw); + + List allBudgetItem = new ArrayList<>(); + + TbsBudgetTableResultVo result1 = tbsBudgetMatchApplication.getMatchResult(costApply.getId(),false,true); + Map matchItemBudgetsMap = result1.getMatchItemBudgetsMap(); + List budgetLogList = new ArrayList<>(); + for (TbsActivityCenterGoods centerGoods : result1.getActivityCenterGoodsList()) { + 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()); + + if(centerGoods.getScheduleItemBudgetId()!=null){ + TbsScheduleItemBudget itemBudget = matchItemBudgetsMap.get(centerGoods.getScheduleItemBudgetId()); + TbsActivity currActivity = null; + for (TbsActivity activity : activityList) { + if(centerGoods.getActivityId().equals(activity.getId())){ + currActivity = activity; + } + } + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.buildTbsBudgetLog(BudgetLogOptFlag.State_1,sysUser, costApply, itemBudget, centerGoods,centerGoods.getCenterGoodsAmount(),currActivity); + budgetLogList.add(budgetLog); + + costItem.setBudgetId(itemBudget.getBudgetId()); + costItem.setScheduleId(itemBudget.getScheduleId()); + costItem.setScheduleItemId(itemBudget.getScheduleItemId()); + costItem.setScheduleItemName(itemBudget.getItemName()); + costItem.setScheduleItemAmount(itemBudget.getFinalBudgetAmount()); + costItem.setScheduleItemAmountUsed(itemBudget.getUsedBudgetAmount()); + costItem.setScheduleItemAmountApply(itemBudget.getUnUsedBudgetAmount()); + costItem.setScheduleItemBudgetId(itemBudget.getId()); + } + allBudgetItem.add(costItem); + } +// budgetCostItemService.saveBatch(allBudgetItem); +// if(CollectionUtil.isNotEmpty(budgetLogList)){ +// budgetLogService.saveBatch(budgetLogList); +// } + } + + @Override + public Long selectCountOverdueState(String userId) { + int sysConfOfWarningDays = 0; + try { + SysConfigService configService = SpringUtils.getBean(SysConfigService.class); + SysConfig config = configService.getByKey("ExpenseApplicationActivityWriteOffOverdueWarningDays"); + String val = config.getConfigValue(); + sysConfOfWarningDays = Integer.parseInt(val); + } catch (BeansException | NumberFormatException e) { + e.printStackTrace(); + } + LocalDate now = LocalDate.now(); + LocalDate startNow = now.plusDays( - sysConfOfWarningDays ); + return baseMapper.selectCountOverdueState(userId,startNow,now); + } + + @Override + public IPage selectPage(TbsCostApply costApply) { + TagFiledUtil.TbsCostApplyPage(costApply); + int sysConfOfWarningDays = 0; + try { + SysConfigService configService = SpringUtils.getBean(SysConfigService.class); + SysConfig config = configService.getByKey("ExpenseApplicationActivityWriteOffOverdueWarningDays"); + String val = config.getConfigValue(); + sysConfOfWarningDays = Integer.parseInt(val); + } catch (BeansException | NumberFormatException e) { + e.printStackTrace(); + } + LocalDate now = LocalDate.now(); + LocalDate startNow = now.plusDays( - sysConfOfWarningDays ); + costApply.setNowDate(now); + costApply.setStartNowDate(startNow); + IPage iPage = PageUtil.getMbpPage(); + IPage result = baseMapper.selectCostApplyList(iPage,costApply); + for (TbsCostApply record : result.getRecords()) { + if (record.getActEndDate()==null){ + continue; + } + if(record.getActEndDate().isBefore(now)){ + record.setOverdueState(1); + }else if(record.getActEndDate().isBefore(startNow)){ + record.setOverdueState(2); + }else { + record.setOverdueState(0); + } + } + return result; + } + + @Override + public Map getOAData(String id) { + TbsCostApply tbsCostApply = this.getById(id); + LambdaQueryWrapper actLqw = new LambdaQueryWrapper<>(); + actLqw.eq(TbsActivity::getCostApplyId,id); + List activityList = tbsActivityMapper.selectList(actLqw); + BmsSupplier supplier = bmsSupplierService.getById(tbsCostApply.getSupplierId()); + if(supplier==null){ + supplier = bmsSupplierService.getByNameOrCode(tbsCostApply.getSupplierCode()); + } + if(supplier==null){ + return null; + } + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + List payConditions = null; + if(tbsCostApply.getContractFlag()!=null&&tbsCostApply.getContractFlag().equals(1)){ + LambdaQueryWrapper contractLambdaQueryWrapper = new LambdaQueryWrapper<>(); + contractLambdaQueryWrapper.eq(TbsCostContract::getCostApplyId,id); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivityPayCondition::getCostApplyId,id); + payConditions = tbsActivityPayConditionMapper.selectList(lqw); + } + Map data = new HashMap<>(10); + if(tbsCostApply.getContractFlag()!=null&&tbsCostApply.getContractFlag().equals(1)){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostContract::getCostApplyId, tbsCostApply.getId()); + List contracts = costContractMapper.selectList(lqw); + + // 协议条款 + LambdaQueryWrapper todoLqw = new LambdaQueryWrapper<>(); + todoLqw.eq(TbsCostTodo::getCostApplyId, tbsCostApply.getId()); + List costTodoList = tbsCostTodoMapper.selectList(todoLqw); + //创建协议的费用申请Data + this.buildContractApplyData(id, tbsCostApply, activityList, payConditions, supplier, sysUser, data,contracts,costTodoList,new HashMap<>()); + }else { + //创建通用的费用申请Data + this.buildCommonApplyData(id, tbsCostApply, activityList, supplier,sysUser, data); + } + return data; + } + + @Override + public String replaceApplySyData(String id) { + TbsCostApply tbsCostApply = this.getById(id); + + //确保只能执行一次 + if(tbsCostApply.getRemark()!=null && tbsCostApply.getRemark().contains("审批节点重置")){ + return "已存在"; + } + + LambdaQueryWrapper vtbLqw = new LambdaQueryWrapper<>(); + vtbLqw.eq(VtbVerification::getCostApplyId,id).in(VtbVerification::getVerificationState,0,1); + if(vtbVerificationMapper.selectCount(vtbLqw)>0){ + return "有核销"; + } + + BmsSupplier supplier = bmsSupplierService.getById(tbsCostApply.getSupplierId()); + + SysUser sysUser = sysUserService.getById(tbsCostApply.getUserId()); + + //相关活动 + LambdaQueryWrapper actLqw = new LambdaQueryWrapper<>(); + actLqw.eq(TbsActivity::getCostApplyId,id); + List activityList = tbsActivityMapper.selectList(actLqw); + + this.releaseCost(tbsCostApply.getId(),0); + Map data = new HashMap<>(10); + List oaAttachmentsIdList = new ArrayList<>(); + List oaContractAttachmentsIdList = new ArrayList<>(); + //新方式保存接口 + Map newWayData = new HashMap<>(); + if(tbsCostApply.getContractFlag()!=null&&tbsCostApply.getContractFlag().equals(1)){ + + LambdaQueryWrapper conLqw = new LambdaQueryWrapper<>(); + conLqw.eq(TbsActivityPayCondition::getCostApplyId,id); + List payConditions = tbsActivityPayConditionMapper.selectList(conLqw); + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostContract::getCostApplyId, tbsCostApply.getId()); + List contracts = costContractMapper.selectList(lqw); + for (TbsCostContract contract : contracts) { + if(contract.getAttachIds()==null||contract.getAttachIds().length<1){ + continue; + } + oaContractAttachmentsIdList.addAll(Arrays.asList(contract.getAttachIds())); + } + // 协议条款 + LambdaQueryWrapper todoLqw = new LambdaQueryWrapper<>(); + todoLqw.eq(TbsCostTodo::getCostApplyId, tbsCostApply.getId()); + List costTodoList = tbsCostTodoMapper.selectList(todoLqw); + for (TbsCostTodo costTodo : costTodoList) { + if(costTodo.getAttachIds()==null||costTodo.getAttachIds().length<1){ + continue; + } + oaAttachmentsIdList.addAll(Arrays.asList(costTodo.getAttachIds())); + } + //创建协议的费用申请Data + this.buildContractApplyData(id, tbsCostApply, activityList, payConditions, supplier, sysUser, data,contracts,costTodoList,newWayData); + }else { + //创建通用的费用申请Data + this.buildCommonApplyData(id, tbsCostApply, activityList, supplier,sysUser, data); + } + //协议类走新流程 + String templateCode = tbsCostApply.getContractFlag().equals(1) + ?TbsSeeYonConst.CostApplyContractConf.Code() + :TbsSeeYonConst.CostApplyConf.Code(); + R flowIdResult = null; + //启用新方法开关 + if( tbsCostApply.getContractFlag().equals(1)){ + + List uploadFileList = new ArrayList<>(); + + List actFileIds = new ArrayList<>(); + for (TbsActivity activity : activityList) { + if (CollectionUtil.isNotEmpty(activity.getAttachIds())){ + actFileIds.addAll(Arrays.asList(activity.getAttachIds())); + } + } + if(CollectionUtil.isNotEmpty(actFileIds)){ + List attachList = sysAttachService.listByIds(actFileIds); + for (SysAttach sysAttach : attachList) { + OaUploadFile uploadFile = new OaUploadFile(); + uploadFile.setField("file"); + uploadFile.setName("活动附件"+sysAttach.getName()); + uploadFile.setUrl("https://qsjslservice.oss-cn-guangzhou.aliyuncs.com/"+sysAttach.getRelativePath()); + uploadFileList.add(uploadFile); + } + } + + if(CollectionUtil.isNotEmpty(oaAttachmentsIdList)){ + List attachList = sysAttachService.listByIds(oaAttachmentsIdList); + for (SysAttach sysAttach : attachList) { + OaUploadFile uploadFile = new OaUploadFile(); + uploadFile.setField("file"); + uploadFile.setName("协议附件"+sysAttach.getName()); + uploadFile.setUrl("https://qsjslservice.oss-cn-guangzhou.aliyuncs.com/"+sysAttach.getRelativePath()); + uploadFileList.add(uploadFile); + } + } + if(CollectionUtil.isNotEmpty(oaContractAttachmentsIdList)){ + List attachContractList = sysAttachService.listByIds(oaContractAttachmentsIdList); + for (SysAttach sysAttach : attachContractList) { + OaUploadFile uploadFile = new OaUploadFile(); + uploadFile.setField("file"); + uploadFile.setName("合同附件"+sysAttach.getName()); + uploadFile.setUrl("https://qsjslservice.oss-cn-guangzhou.aliyuncs.com/"+sysAttach.getRelativePath()); + uploadFileList.add(uploadFile); + } + } + + OaFormMainProcess mainProcess = new OaFormMainProcess(); + mainProcess.setTargetId(id); + mainProcess.setUploadFiles(uploadFileList); + newWayData.put("formmain_1987",data); + mainProcess.setData(newWayData); + mainProcess.setTemplateCode(TbsSeeYonConst.CostApplyContractConf.Code()); + mainProcess.setSenderLoginName(sysUser.getAccount()); + flowIdResult = seeYonService.newCreateProcess(mainProcess); + }else { + //修改申请编码 + BaseCreateProcessBo createProcess = new BaseCreateProcessBo(); + createProcess.setTemplateCode(templateCode); + createProcess.setMemberLoginName(sysUser.getSyAccount()); + createProcess.setSubjectTitle(TbsSeeYonConst.PRE_TITLE_COST_APPLY + tbsCostApply.getChargeTheme()); + createProcess.setTargetId(tbsCostApply.getId()+""); + createProcess.setDataJson(JsonUtil.objectToJson(data)); + flowIdResult = seeYonService.baseCreateProcess(createProcess); + } + + if(flowIdResult==null||flowIdResult.getStatus()!=200){ + Assert.throwEx("远程服务调用失败:"+flowIdResult.getMsg()); + } + if(flowIdResult.getData().contains("按登录名查找发起人出错")){ + return "按登录名查找发起人出错"; + } + String flowId = flowIdResult.getData(); + if(flowId!=null&&flowId.length()>45){ + flowId = flowId.substring(0,40); + } + String formId = null; + R formIdResult = seeYonService.getFormId(templateCode,tbsCostApply.getId()); + if(formIdResult.getStatus()==200){ + formId = formIdResult.getData(); + } + TbsCostApply costApply = new TbsCostApply(); + costApply.setId(tbsCostApply.getId()); + costApply.setSyFlowId(flowId); + costApply.setSyFormId(formId); + costApply.setEditAmountFlag(0); + costApply.setChargeState(TbsCostApplyState.State_1_apply.getCode()); + costApply.setSubmitTime(LocalDateTime.now()); + costApply.setRemark("审批节点重置("+tbsCostApply.getSyFormId()+");" + +(tbsCostApply.getRemark()==null?"":tbsCostApply.getRemark())); + this.updateById(costApply); + + //创建流程后回调 + BaseCreateCallbackBo callbackBo = new BaseCreateCallbackBo(templateCode,costApply.getId()+""); + seeYonService.createCallbackStatus(callbackBo); + return "success"; + } + + @Override + public boolean checkTemplateId(BmsSupplier supplier, TbsActivityTemplate template) { + Long templateId = template.getId(); + boolean isIgnore = template.getSaleRegionFlag().equals(0)&&template.getBizRegionFlag().equals(0); + boolean isStop = template.getSaleRegionFlag().equals(2)&&template.getBizRegionFlag().equals(2); + if(isStop){ + Assert.throwEx("模板已停用"); + } + if(! isIgnore){ + List regionList = tbsActivityTemplateRegionMapper.selectList( + new LambdaQueryWrapper() + .eq(TbsActivityTemplateRegion::getTemplateId,templateId)); + List bizRegionIds = supplier.listBizRegionIds(); + List saleRegionIds = supplier.listSaleRegionIds(); + boolean isPass = false; + for (TbsActivityTemplateRegion templateRegion : regionList) { + if(templateRegion.getType().equals("sale")&&template.getSaleRegionFlag().equals(1)){ + if(saleRegionIds.contains(templateRegion.getRegionId())){ + isPass = true; + break; + } + } + if (templateRegion.getType().equals("biz")&&template.getBizRegionFlag().equals(1)){ + if(bizRegionIds.contains(templateRegion.getRegionId())){ + isPass = true; + break; + } + } + } + if(!isPass){ + return false; + } + } + return true; + } + + @Override + public List checkTemplateId(List supplierList, TbsActivityTemplate template) { + Long templateId = template.getId(); + boolean isIgnore = template.getSaleRegionFlag().equals(0)&&template.getBizRegionFlag().equals(0); + boolean isStop = template.getSaleRegionFlag().equals(2)&&template.getBizRegionFlag().equals(2); + if(isStop){ + return new ArrayList<>(); + } + if(! isIgnore){ + List regionList = tbsActivityTemplateRegionMapper.selectList( + new LambdaQueryWrapper() + .eq(TbsActivityTemplateRegion::getTemplateId,templateId)); + List passSupplierIdList = new ArrayList<>(); + for (BmsSupplier supplier : supplierList) { + List bizRegionIds = supplier.listBizRegionIds(); + List saleRegionIds = supplier.listSaleRegionIds(); + boolean isPass = false; + for (TbsActivityTemplateRegion templateRegion : regionList) { + if(templateRegion.getType().equals("sale")&&template.getSaleRegionFlag().equals(1)){ + if(saleRegionIds.contains(templateRegion.getRegionId())){ + passSupplierIdList.add(supplier.getId()); + break; + } + } + if (templateRegion.getType().equals("biz")&&template.getBizRegionFlag().equals(1)){ + if(bizRegionIds.contains(templateRegion.getRegionId())){ + passSupplierIdList.add(supplier.getId()); + break; + } + } + } + } + return passSupplierIdList; + } + return supplierList.stream().map(BmsSupplier::getId).collect(Collectors.toList()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void commitApply(String id) { + TbsCostApply tbsCostApply = this.getById(id); + redisService.throwResLock(TbsCostApply.class.getSimpleName(),id); + + BmsSupplier supplier = bmsSupplierService.getById(tbsCostApply.getSupplierId()); + if(supplier.getCostFlag().equals(0)||supplier.getStopFlag().equals(1)){ + Assert.throwEx("["+supplier.getName()+"]无投放费用权限"); + } + + // 商品拦截 + List activityCenterGoodsList = tbsActivityGoodsService.listByCostApplyId(Long.parseLong(id)); + this.validActivityGoods(activityCenterGoodsList); + + if(!tbsCostApply.getChargeState().equals(TbsCostApplyState.State_0_unPublish.getCode()) + &&!tbsCostApply.getChargeState().equals(TbsCostApplyState.State_4_refused.getCode())){ + Assert.throwEx("操作失败,申请费用状态不支持"); + } + if(tbsCostApply.getTemplateId()!=null){ + TbsActivityTemplate activityTemplate = tbsActivityTemplateService.getById(tbsCostApply.getTemplateId()); + if(tbsCostApply.getChangeSourceId()==null&&activityTemplate.getTemplateState().equals(0) + &&!tbsCostApply.getChargeState().equals(TbsCostApplyState.State_4_refused.getCode())){ + Assert.throwEx("当前模板已停用"); + } + } + //相关活动 + LambdaQueryWrapper actLqw = new LambdaQueryWrapper<>(); + actLqw.eq(TbsActivity::getCostApplyId,id); + List activityList = tbsActivityMapper.selectList(actLqw); + + for (TbsActivity activity : activityList) { + Long actId = tbsActivityChannelPointMapper.checkSubjectPoint(activity.getId()); + if(actId!=null){ + Assert.throwEx("活动["+activity.getActivityCode() + "]因科目类型,必须选网点"); + } + } + + //科目拦截:判断是否进场费 + List activitySubjects = tbsActivitySubjectService.listByCostApplyId(tbsCostApply.getId()); + List subjectList = subjectService.listByIds( + activitySubjects.stream().map(TbsActivitySubject::getSubjectId).collect(Collectors.toList())); + List activityChannelList = tbsActivityChannelMapper.selectList(new LambdaQueryWrapper() + .eq(TbsActivityChannel::getCostApplyId,tbsCostApply.getId())); + List activityChannelPointList = tbsActivityChannelPointMapper.selectList(new LambdaQueryWrapper() + .eq(TbsActivityChannelPoint::getCostApplyId,tbsCostApply.getId())); + if(tbsCostApply.getContractFlag()!=null&&tbsCostApply.getContractFlag().equals(2)){ + // 拦截进场费的历史记录和规则 + this.vaildEnterTypeCostHistoryAndRule(tbsCostApply, activityList, subjectList,activityCenterGoodsList, + activityChannelList,activityChannelPointList); + } + //模板拦截 + boolean isIgnoreSubject = false; + if(activityList.size()==1){ + Long templateId = activityList.get(0).getTemplateId(); + if (templateId!=null){ + // 模板不拦截科目范围 + isIgnoreSubject = true; + // 拦截模板的可见范围 + TbsActivityTemplate activityTemplate = tbsActivityTemplateService.getById(tbsCostApply.getTemplateId()); + boolean isPass = this.checkTemplateId(supplier,activityTemplate); + if(!isPass){ + Assert.throwEx("当前申请模板不可用"); + } + } + } + // 使用模板的忽略科目拦截 + if(!isIgnoreSubject){ + List subjectBizRegionList = bmsSubjectRegionService.listByRegionIds(supplier.listBizRegionIds(),1); + List subjectSaleRegionList = bmsSubjectRegionService.listByRegionIds(supplier.listSaleRegionIds(),0); + for (BmsSubject subject : subjectList) { + if(subject.getBizRegionFlag().equals(0)&&subject.getSaleRegionFlag().equals(0)){ + continue; + } + if(subject.getBizRegionFlag().equals(1)){ + if(subjectBizRegionList.stream().anyMatch(s->s.getSubjectId().equals(subject.getId()))){ + continue; + } + } + if(subject.getSaleRegionFlag().equals(1)){ + if(subjectSaleRegionList.stream().anyMatch(s->s.getSubjectId().equals(subject.getId()))){ + continue; + } + } + Assert.throwEx("当前申请含非业务区域科目:"+subject.getSubjectCode()); + } + } + + List 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); + if(contractList.size()<1||contractList.get(0).getAttachIds()==null||contractList.get(0).getAttachIds().length<1){ + Assert.throwEx("未补充合同内容或未上传合同!!"); + } + LambdaQueryWrapper todoLqw = new LambdaQueryWrapper<>(); + todoLqw.eq(TbsCostTodo::getCostApplyId,id); + Long countTodo = tbsCostTodoMapper.selectCount(todoLqw); + if(countTodo<1){ + Assert.throwEx("请补充协议条款,申请后不可更变条款"); + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivityPayCondition::getCostApplyId,id); + payConditions = tbsActivityPayConditionMapper.selectList(lqw); + if(payConditions.size()<1){ + Assert.throwEx("请补充支付条件"); + } + //暂且只有一个协议申请,只有一个活动,后续可能要改 + if(activityList.size()>1){ + Assert.throwEx("协议类申请出现多条活动,请联系管理员"); + }else if (activityList.size()<1){ + Assert.throwEx("没有有效的活动内容"); + }else { + Long supplierId = activityList.get(0).getSupplierId(); + if(!supplier.getSupplierFlag().equals(1)&&!supplier.getSupplierFlag().equals(2)){ + Assert.throwEx("协议类申请只对供应商开放"); + } + BigDecimal total = activityList.get(0).getTotalAmount(); + BigDecimal total2 = BigDecimal.ZERO; + for (TbsActivityPayCondition payCondition : payConditions) { + total2 = total2.add(payCondition.getPaymentPrice()); + } + if(total.compareTo(total2)!=0){ + Assert.throwEx("支付条件金额["+total2+"]与核销金额["+total+"]不匹配"); + } + } + } + + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + sysUser.checkSyAccount(); + + // 匹配方式的result + TbsBudgetCostResult result0 = null; + TbsBudgetTableResultVo result1 = null; + // 加载匹配方式 + Integer matchType = tbsCostApply.getMatchType(); + //if(matchType.equals(0)){ + // result0 = budgetApplicationService.buildBudgetCostResult(tbsCostApply.getId(),true,false); + //}else if (matchType.equals(1)){ + //新的匹配方式 + result1 = tbsBudgetMatchApplication.getMatchResult(tbsCostApply.getId(),false,false); + //} + //恢复绑定 + this.releaseCost(tbsCostApply.getId(),0); + Map data = new HashMap<>(10); + List oaAttachmentsIdList = new ArrayList<>(); + List oaContractAttachmentsIdList = new ArrayList<>(); + //新方式保存接口 + Map newWayData = new HashMap<>(); + if(tbsCostApply.getContractFlag()!=null&&tbsCostApply.getContractFlag().equals(1)){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostContract::getCostApplyId, tbsCostApply.getId()); + List contracts = costContractMapper.selectList(lqw); + for (TbsCostContract contract : contracts) { + if(contract.getAttachIds()==null||contract.getAttachIds().length<1){ + continue; + } + oaContractAttachmentsIdList.addAll(Arrays.asList(contract.getAttachIds())); + } + // 协议条款 + LambdaQueryWrapper todoLqw = new LambdaQueryWrapper<>(); + todoLqw.eq(TbsCostTodo::getCostApplyId, tbsCostApply.getId()); + List costTodoList = tbsCostTodoMapper.selectList(todoLqw); + for (TbsCostTodo costTodo : costTodoList) { + if(costTodo.getAttachIds()==null||costTodo.getAttachIds().length<1){ + continue; + } + oaAttachmentsIdList.addAll(Arrays.asList(costTodo.getAttachIds())); + } + //创建协议的费用申请Data + this.buildContractApplyData(id, tbsCostApply, activityList, payConditions, supplier, sysUser, data,contracts,costTodoList,newWayData); + }else { + //创建通用的费用申请Data + this.buildCommonApplyData(id, tbsCostApply, activityList, supplier,sysUser, data); + } + //协议类走新流程 + String templateCode = tbsCostApply.getContractFlag().equals(1) + ?TbsSeeYonConst.CostApplyContractConf.Code() + :TbsSeeYonConst.CostApplyConf.Code(); + R flowIdResult = null; + if(tbsCostApply.getContractFlag().equals(1)){ + List uploadFileList = new ArrayList<>(); + for (TbsActivity activity : activityList) { + if(CollectionUtil.isNotEmpty(activity.getAttachIds())){ + List attachList = sysAttachService.listByIds(Arrays.asList(activity.getAttachIds())); + for (SysAttach sysAttach : attachList) { + OaUploadFile uploadFile = new OaUploadFile(); + uploadFile.setField("file"); + uploadFile.setName("活动附件"+sysAttach.getName()); + uploadFile.setUrl("https://qsjslservice.oss-cn-guangzhou.aliyuncs.com/"+sysAttach.getRelativePath()); + uploadFileList.add(uploadFile); + } + } + } + if(CollectionUtil.isNotEmpty(oaAttachmentsIdList)){ + List attachList = sysAttachService.listByIds(oaAttachmentsIdList); + for (SysAttach sysAttach : attachList) { + OaUploadFile uploadFile = new OaUploadFile(); + uploadFile.setField("file"); + uploadFile.setName("协议附件"+sysAttach.getName()); + uploadFile.setUrl("https://qsjslservice.oss-cn-guangzhou.aliyuncs.com/"+sysAttach.getRelativePath()); + uploadFileList.add(uploadFile); + } + } + if(CollectionUtil.isNotEmpty(oaContractAttachmentsIdList)){ + List attachContractList = sysAttachService.listByIds(oaContractAttachmentsIdList); + for (SysAttach sysAttach : attachContractList) { + OaUploadFile uploadFile = new OaUploadFile(); + uploadFile.setField("file"); + uploadFile.setName("合同附件"+sysAttach.getName()); + uploadFile.setUrl("https://qsjslservice.oss-cn-guangzhou.aliyuncs.com/"+sysAttach.getRelativePath()); + uploadFileList.add(uploadFile); + } + } + OaFormMainProcess mainProcess = new OaFormMainProcess(); + mainProcess.setTargetId(id); + mainProcess.setUploadFiles(uploadFileList); + newWayData.put("formmain_1987",data); + mainProcess.setData(newWayData); + mainProcess.setTemplateCode(TbsSeeYonConst.CostApplyContractConf.Code()); + mainProcess.setSenderLoginName(sysUser.getAccount()); + flowIdResult = seeYonService.newCreateProcess(mainProcess); + }else { + //修改申请编码 + BaseCreateProcessBo createProcess = new BaseCreateProcessBo(); + createProcess.setTemplateCode(templateCode); + createProcess.setMemberLoginName(sysUser.getSyAccount()); + createProcess.setSubjectTitle(TbsSeeYonConst.PRE_TITLE_COST_APPLY + tbsCostApply.getChargeTheme()); + createProcess.setTargetId(tbsCostApply.getId()+""); + createProcess.setDataJson(JsonUtil.objectToJson(data)); + flowIdResult = seeYonService.baseCreateProcess(createProcess); + } + + if(flowIdResult==null||flowIdResult.getStatus()!=200){ + assert flowIdResult != null; + Assert.throwEx("远程服务调用失败:"+flowIdResult.getMsg()); + } + String flowId = flowIdResult.getData(); + if(flowId!=null&&flowId.length()>45){ + flowId = flowId.substring(0,40); + } + // 协议类发起 + if(tbsCostApply.getContractFlag().equals(1)){ + if(flowIdResult.getMsg()!=null && flowIdResult.getMsg().length()>45){ + log.error(flowIdResult.getMsg()); + JSONObject object = JSON.parseObject(flowIdResult.getMsg()); + if(!object.get("code").toString().equals("0")){ + Assert.throwEx("流程发起被拦截了"); + } + } + } + String formId = null; + R formIdResult = seeYonService.getFormId(templateCode,tbsCostApply.getId()); + if(formIdResult.getStatus()==200){ + formId = formIdResult.getData(); + } + TbsCostApply costApply = new TbsCostApply(); + costApply.setId(tbsCostApply.getId()); + costApply.setSyFlowId(flowId); + costApply.setSyFormId(formId); + costApply.setEditAmountFlag(0); + costApply.setChargeState(TbsCostApplyState.State_1_apply.getCode()); + costApply.setSubmitTime(LocalDateTime.now()); + this.updateById(costApply); + costApply = this.getById(costApply.getId()); + //移除历史记录 + budgetCostItemService.removeByCostApplyId(costApply.getId()); + //保存无命中条件的预算 + List budgetLogList = null; + if (matchType.equals(0)){ + if(CollectionUtil.isNotEmpty(result0.getBudgetUnMatchList())){ + List costUnItems = result0.getBudgetUnMatchList().stream() + .map(obj-> CopierUtil.copy(obj,new TbsCostUnItem())).collect(Collectors.toList()); + tbsCostUnItemService.saveBatch(costUnItems); + } + //重新保存 + List allBudgetItem = new ArrayList<>(); + allBudgetItem.addAll(result0.getBudgetMatchList()); + allBudgetItem.addAll(result0.getBudgetUnMatchList()); + budgetCostItemService.saveBatch(allBudgetItem); + //保存预算使用日志 + budgetLogList = saveBudgetLog(result0.getBudgetList(), sysUser, costApply, result0.getBudgetMatchList(),result0.getActivityList()); + }else if (matchType.equals(1)){ + // 未命中预算 + List costUnItems = new ArrayList<>(); + // 所有记录情况 + List allBudgetItem = new ArrayList<>(); + // 命中的预算 + budgetLogList = new ArrayList<>(); + + Map matchItemBudgetsMap = result1.getMatchItemBudgetsMap(); + for (TbsActivityCenterGoods centerGoods : result1.getActivityCenterGoodsList()) { + 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()); + + if(centerGoods.getScheduleItemBudgetId()==null){ + TbsCostUnItem costUnItem = new TbsCostUnItem(); + costUnItem.setCostApplyId(centerGoods.getCostApplyId()); + costUnItem.setActivityId(centerGoods.getActivityId()); + costUnItem.setActivityCode(centerGoods.getActivityCode()); + costUnItem.setSubjectId(centerGoods.getSubjectId()); + costUnItem.setSubjectCode(centerGoods.getSubjectCode()); + costUnItem.setSubjectName(centerGoods.getSubjectName()); + costUnItem.setCenterType(centerGoods.getCenterType()); + costUnItem.setCenterId(centerGoods.getCenterId()); + costUnItem.setCenterCode(centerGoods.getCenterCode()); + costUnItem.setCenterName(centerGoods.getCenterName()); + costUnItem.setAmount(centerGoods.getCenterGoodsAmount()); + costUnItem.setTargetType(centerGoods.getTargetType()); + costUnItem.setTargetId(centerGoods.getTargetId()); + costUnItem.setTargetCode(centerGoods.getTargetCode()); + costUnItem.setTargetName(centerGoods.getTargetName()); + costUnItem.setTargetLevelPathIds(centerGoods.getTargetLevelPathIds()); + costUnItem.setTargetLevelPathNames(centerGoods.getTargetLevelPathNames()); + costUnItem.setActStartDate(centerGoods.getActStartDate()); + costUnItem.setActEndDate(centerGoods.getActEndDate()); + costUnItem.setPreStartDate(centerGoods.getPreStartDate()); + costUnItem.setPreEndDate(centerGoods.getPreEndDate()); + costUnItem.setPreCheckDate(centerGoods.getPreCheckDate()); + costUnItem.setSupplierId(centerGoods.getSupplierId()); + costUnItem.setSupplierCode(centerGoods.getSupplierCode()); + costUnItem.setSupplierName(centerGoods.getSupplierName()); + costUnItems.add(costUnItem); + + costItem.setBudgetId(0L); + costItem.setScheduleId(0L); + costItem.setScheduleItemId(0L); + costItem.setScheduleItemAmount(BigDecimal.ZERO); + costItem.setScheduleItemAmountUsed(BigDecimal.ZERO); + costItem.setScheduleItemAmountApply(BigDecimal.ZERO); + costItem.setScheduleItemBudgetId(0L); + + }else { + TbsScheduleItemBudget itemBudget = matchItemBudgetsMap.get(centerGoods.getScheduleItemBudgetId()); + TbsActivity currActivity = null; + for (TbsActivity activity : activityList) { + if(centerGoods.getActivityId().equals(activity.getId())){ + currActivity = activity; + } + } + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.buildTbsBudgetLog(BudgetLogOptFlag.State_1,sysUser, costApply, itemBudget, centerGoods,centerGoods.getCenterGoodsAmount(),currActivity); + budgetLogList.add(budgetLog); + + costItem.setBudgetId(itemBudget.getBudgetId()); + costItem.setScheduleId(itemBudget.getScheduleId()); + costItem.setScheduleItemId(itemBudget.getScheduleItemId()); + costItem.setScheduleItemName(itemBudget.getItemName()); + costItem.setScheduleItemAmount(itemBudget.getFinalBudgetAmount()); + costItem.setScheduleItemAmountUsed(itemBudget.getUsedBudgetAmount()); + costItem.setScheduleItemAmountApply(itemBudget.getUnUsedBudgetAmount()); + costItem.setScheduleItemBudgetId(itemBudget.getId()); + } + allBudgetItem.add(costItem); + + } + + //保存 + if(costUnItems.size() > 0){ + tbsCostUnItemService.saveBatch(costUnItems); + } + budgetCostItemService.saveBatch(allBudgetItem); + } + + if(tbsCostApply.getChargeState().equals(TbsCostApplyState.State_0_unPublish.getCode())){ + if(CollectionUtil.isNotEmpty(budgetLogList)){ + budgetLogService.saveBatch(budgetLogList); + } + }else { + //排除历史记录 + LambdaQueryWrapper logLqw = new LambdaQueryWrapper<>(); + logLqw.eq(TbsBudgetLog::getCostApplyId,costApply.getId()); + logLqw.eq(TbsBudgetLog::getRollbackFlag, BudgetLogRollbackFlag.State_1); + List oldLogList = budgetLogService.list(logLqw); + List oldLogList4Upd = oldLogList.stream().map(a->{ + TbsBudgetLog budgetLog = new TbsBudgetLog(); + budgetLog.setId(a.getId()); + budgetLog.setRollbackFlag(BudgetLogRollbackFlag.State_2); + return budgetLog; + }).collect(Collectors.toList()); + budgetLogService.updateBatchById(oldLogList4Upd); + oldLogList = oldLogList.stream().filter(a-> + a.getOptType().equals(BudgetLogOptFlag.State_1.getCode()) || a.getOptType().equals(BudgetLogOptFlag.State_6.getCode()) + ).collect(Collectors.toList()); + for (TbsBudgetLog budgetLog : oldLogList) { + budgetLog.setCreateBy(null); + budgetLog.setCreateTime(null); + budgetLog.setUpdateBy(null); + budgetLog.setUpdateTime(null); + budgetLog.setId(null); + budgetLog.setAmount(budgetLog.getAmount().negate()); + BudgetLogOptFlag optFlag = BudgetLogOptFlag.State_5; + budgetLog.setAmount(TbsBudgetLogBuildUtil.buildAmount(budgetLog.getAmount(),optFlag)); + budgetLog.setOptType(optFlag.getCode()); + } + budgetLogService.saveBatch(oldLogList); + //将1改6 + budgetLogList.forEach(a->a.setOptType(BudgetLogOptFlag.State_6.getCode())); + budgetLogService.saveBatch(budgetLogList); + } + //创建流程后回调 + BaseCreateCallbackBo callbackBo = new BaseCreateCallbackBo(templateCode,costApply.getId()+""); + seeYonService.createCallbackStatus(callbackBo); + activitySlottingFeeMapper.updatePassFlagByCostApplyId(costApply.getId(),2); + + //请求校验是否成功 + AsyncManager.me().execute(AsyncFactory.submitCostApply(costApply)); + + } + + /** + * 拦截进场费的历史记录和规则 + * @param tbsCostApply + * @param activityList + * @param subjectList + * @param activityGoodsList + */ + private void vaildEnterTypeCostHistoryAndRule(TbsCostApply tbsCostApply, + List activityList, + List subjectList, + List activityGoodsList, + List activityChannelList, + List activityChannelPointList) { + if (activityList.size()>1){ + Assert.throwEx("进场费类型只能有一个活动"); + } + if(subjectList.stream().anyMatch(s->s.getSlottingFlag().equals(0))){ + Assert.throwEx("当前申请含非进场费类型科目"); + } + // 查找历史有效的进场费费用 + LambdaQueryWrapper costApplyLqw = new LambdaQueryWrapper<>(); + costApplyLqw.eq(TbsCostApply::getSupplierId, tbsCostApply.getSupplierId()); + costApplyLqw.eq(TbsCostApply::getContractFlag,2); + costApplyLqw.in(TbsCostApply::getChargeState,1,2,3,7); + costApplyLqw.select(TbsCostApply::getId); + List costApplyList = tbsCostApplyMapper.selectList(costApplyLqw); + List hisCostIds = costApplyList.stream().map(TbsCostApply::getId).collect(Collectors.toList()); + + // 当前的渠道和网点id + Set channelIds = activityChannelList.stream().map(TbsActivityChannel::getChannelId).collect(Collectors.toSet()); + Set pointIds = activityChannelPointList.stream().map(TbsActivityChannelPoint::getPointId).collect(Collectors.toSet()); + + // 通过历史记录查询有雷同网点和渠道的费用id + Set sameChannelCostIds = new HashSet<>(); + if(CollUtil.isNotEmpty(hisCostIds)){ + if (CollUtil.isNotEmpty(pointIds)){ + List selectHisPoint = tbsActivityChannelPointMapper.selectList( + new LambdaQueryWrapper() + .select(TbsActivityChannelPoint::getCostApplyId) + .in(TbsActivityChannelPoint::getCostApplyId,hisCostIds) + .in(TbsActivityChannelPoint::getPointId,pointIds) + ); + Set enterIds = selectHisPoint.stream().map(TbsActivityChannelPoint::getCostApplyId).collect(Collectors.toSet()); + for (Long enterId : enterIds) { + sameChannelCostIds.add(enterId); + } + } + if (CollUtil.isNotEmpty(channelIds)){ + List selectHisChannel = tbsActivityChannelMapper.selectList( + new LambdaQueryWrapper() + .select(TbsActivityChannel::getCostApplyId) + .in(TbsActivityChannel::getCostApplyId,hisCostIds) + .in(TbsActivityChannel::getChannelId,channelIds) + ); + Set enterIds = selectHisChannel.stream().map(TbsActivityChannel::getCostApplyId).collect(Collectors.toSet()); + for (Long enterId : enterIds) { + sameChannelCostIds.add(enterId); + } + } + } + + // 有雷同网点的费用ids判断商品是否雷同 + if (CollUtil.isNotEmpty(sameChannelCostIds)){ + Set goodsIds = activityGoodsList.stream().map(TbsActivityGoods::getTargetId).collect(Collectors.toSet()); + List selectHisGoods = tbsActivityGoodsService.list( + new LambdaQueryWrapper() + .select(TbsActivityGoods::getCostApplyId) + .in(TbsActivityGoods::getCostApplyId,sameChannelCostIds) + .in(TbsActivityGoods::getTargetId,goodsIds) + ); + for (TbsActivityGoods goods : activityGoodsList) { + for (TbsActivityGoods hisGoods : selectHisGoods) { + if (goods.getTargetId().equals(hisGoods.getTargetId()) + &&goods.getTargetType().equals(hisGoods.getTargetType())){ + Assert.throwEx("历史含相同渠道或网点的进场费活动商品:"+goods.getTargetName()); + } + } + } + } + } + + /** + * 校验活动商品的有效性 + * 此方法旨在确保参与活动的商品或类别处于有效状态,包括检查是否已下架和是否已启用费用 + * @param activityCenterGoodsList 活动商品列表,包含待校验的商品或类别信息 + */ + private void validActivityGoods(List activityCenterGoodsList) { + List spuGoods = activityCenterGoodsList.stream() + .filter(a->a.getTargetType().equals("spu")).collect(Collectors.toList()); + if(CollectionUtil.isNotEmpty(spuGoods)){ + List spuIds = spuGoods.stream().map(TbsActivityGoods::getTargetId).collect(Collectors.toList()); + List skuList = goodsSpuMapper.selectBatchIds(spuIds); + for (GoodsSpu spu : skuList) { + if(spu.getShelf().equals(0)){ + Assert.throwEx("【"+spu.getName()+"】已下架,请重新选择"); + } + if(spu.getCostFlag().equals(0)){ + Assert.throwEx("【"+spu.getName()+"】未启用费用,请重新选择"); + } + } + } + List cateGoods = activityCenterGoodsList.stream() + .filter(a->!a.getTargetType().equals("spu")).collect(Collectors.toList()); + if(CollectionUtil.isNotEmpty(cateGoods)){ + List cateIds = cateGoods.stream().map(TbsActivityGoods::getTargetId).collect(Collectors.toList()); + List cateList = goodsCategoryMapper.selectBatchIds(cateIds); + for (GoodsCategory cate : cateList) { + if(cate.getCostFlag().equals(0)){ + Assert.throwEx("【"+cate.getName()+"】未启用费用,请重新选择"); + } + if(cate.getEnable().equals(0)){ + Assert.throwEx("【"+cate.getName()+"】已下架,请重新选择"); + } + } + } + } + + /** + * 创建协议类的申请DATA + * @param id + * @param tbsCostApply + * @param activityList + * @param payConditions + * @param supplier + * @param sysUser + * @param data + */ + private void buildContractApplyData(String id, TbsCostApply tbsCostApply, List activityList, + List payConditions, BmsSupplier supplier, SysUser sysUser, + Map data,List contracts, + List costTodoList ,Map newWayData) { + /** + * 重要:exsp3 已用,在OA系统中标记是否释放拦截 + */ + data.put("title", tbsCostApply.getChargeTheme()); + data.put("orgId", tbsCostApply.getId().toString()); + data.put("costApplyCode", tbsCostApply.getCode()); + data.put("applyUserCode", sysUser.getCode()); + data.put("applyUserName", sysUser.getName()); + data.put("supplierName", tbsCostApply.getSupplierName()); + data.put("supplierCode", tbsCostApply.getSupplierCode()); + data.put("targetId", tbsCostApply.getId()+""); + data.put("targetCode", tbsCostApply.getCode()); + data.put("exsp1",TbsSeeYonConst.CostApplyContractConf.Code()); + data.put("templateId",tbsCostApply.getTemplateId()); + data.put("templateName",tbsCostApply.getTemplateTitle()); + data.put("supplierArea",supplier.getComRegion()); + //添加跳转地址业务 + String urlKey = "exsp5"; + String baseJumpUrl = JumpToUtil.getJumpUrl(projectProperties.getWebUrl(),TbsSeeYonConst.CostApplyConf.Code(),id); + data.put("exsp5",urlKey); + data.put("cmsLink",baseJumpUrl); + + data.put("rowDate",DateUtils.format(LocalDateTime.now(), DateFormatString.DATE_TIME)); + //初始化00 + data.put("rowState","00"); + + //拓展添加审批关联区域 + String saleRegionId = supplier.handleSaleRegionId(); + String bizRegionId = supplier.handleBizRegionId(); + BmsRegion saleRegion = regionMapper.selectById(saleRegionId); + BmsRegion2 bizRegion = region2Mapper.selectById(bizRegionId); + String saleRegionNames = saleRegion!=null?saleRegion.getPathNames():"null_申请时未录入"; + String bizRegionNames = bizRegion!=null?bizRegion.getPathNames():"null_申请时未录入"; + + //拓展添加审批关联 + data.put("biz_region",bizRegionNames); + data.put("exsp2",saleRegionNames); + data.put("dataState",TbsCostApplyState.State_1_apply.getCode()+""); + + //创建协议类data数据 + data.put("serialNumber", tbsCostApply.getCode()); + data.put("applySubject", tbsCostApply.getChargeTheme()); + data.put("supplierCode", tbsCostApply.getSupplierCode()); + data.put("supplierName", tbsCostApply.getSupplierName()); + data.put("totalSalesMoney", tbsCostApply.getTotalActivityPreAmount()); + if(tbsCostApply.getTotalActivityPreAmount()!=null&&tbsCostApply.getTotalActivityPreAmount().compareTo(BigDecimal.ZERO)!=0){ + data.put("totalExpenseRate", tbsCostApply.getTotalActivityAmount().divide(tbsCostApply.getTotalActivityPreAmount(),2,RoundingMode.DOWN)); + } + data.put("remark", tbsCostApply.getRemark()); + + //添加客户标签 + List tags = tagInfoMapper.lisTagsBySupplierCode(supplier.getCode()); + data.put("tags",tags); + + if(contracts.size()>0){ + //构建合同DATA + buildContractSeeyonData(id, data, contracts); + }else { + Assert.throwEx("请补充合同信息"); + } + + //创建子表数据 + List subList = new ArrayList<>(); + + //活动明细 + buildActivityCenterGoodsSeeyonData(id, tbsCostApply, activityList, subList,newWayData); + // 付款条件 + + List subPaymentList = new ArrayList<>(); + int countLimitTimes = 0; + for (TbsActivityPayCondition payCondition : payConditions) { + if(payCondition.getPayTimes()!=null){ + countLimitTimes += payCondition.getPayTimes(); + }else { + countLimitTimes ++; + } + TbsContractCostSubItem.Payment subPayment = new TbsContractCostSubItem.Payment(); + subPayment.setPayItem(payCondition.getTitle()); + subPayment.setPayCondition(payCondition.getConditionMsg()); + subPayment.setPayMoney(payCondition.getPaymentPrice()); + subPayment.setPayDate(payCondition.getPreNotifyTime()!=null?payCondition.getPreNotifyTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")):null); + subPayment.setActualPayDate(null); + String stateMsg = payCondition.getFinishedFlag().equals(1)?"已完成":"未处理"; + subPayment.setPayCompleteState(stateMsg); + subPayment.setPayRemark(payCondition.getRemark()); + subPayment.setPayCode(payCondition.getCode()); + subPaymentList.add(subPayment); + subList.add(subPayment); + } + data.put("limitTimes",countLimitTimes); + data.put("paidTimes",0); + data.put("paidMoney",0); + if(subPaymentList.size()>0){ + newWayData.put("formson_1988",subPaymentList); + } + + List toDoItemList = new ArrayList<>(); + for (TbsCostTodo costTodo : costTodoList) { + TbsContractCostSubItem.ToDoItem toDoItem = new TbsContractCostSubItem.ToDoItem(); + toDoItem.setServiceDescription(costTodo.getDescr()); + toDoItem.setDeliveryStandard(costTodo.getPayMsg()); + toDoItem.setDeliveryDate(costTodo.getPrePayDate()==null?null : costTodo.getPrePayDate().toString()); + toDoItem.setAgreeRemark(costTodo.getRemark()); + toDoItem.setAgreeCompleteState(costTodo.getFinishedFlag().equals(1)?"已完成":"未完成"); + toDoItemList.add(toDoItem); + subList.add(toDoItem); + } + newWayData.put("formson_1989",toDoItemList); + //构造客户维度的 年度、季度合计 +// try { +// List cusCenterRateList = buildCusRateMain(supplier); +// subList.addAll(cusCenterRateList); +// } catch (Exception e) { +// log.error("[构造客户维度的 年度、季度合计]异常:{}",e.getMessage()); +// } + //关联 + data.put("sub", subList); + } + + private void buildActivityCenterGoodsSeeyonData(String id, TbsCostApply tbsCostApply, List activityList, List subList,Map newWayData) { + LambdaQueryWrapper actCgLqw = new LambdaQueryWrapper<>(); + actCgLqw.eq(TbsActivityCenterGoods::getCostApplyId, id); + List activityCenterGoodsList = tbsActivityCenterGoodsMapper.selectList(actCgLqw); + List resultList = new ArrayList<>(); + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + TbsActivity currActivity = null; + for (TbsActivity activity : activityList) { + if(centerGoods.getActivityId().equals(activity.getId())){ + currActivity = activity; + break; + } + } + TbsContractCostSubItem.Activity dataActivity = new TbsContractCostSubItem.Activity(); + dataActivity.setActivityCode(currActivity.getActivityCode()); + dataActivity.setActivityPurpose(currActivity.getActTitle()); + dataActivity.setCostCode(tbsCostApply.getCode()); + dataActivity.setStartDate(currActivity.getActStartDate()==null?null:currActivity.getActStartDate().toString()); + dataActivity.setEndDate(currActivity.getActEndDate()==null?null:currActivity.getActEndDate().toString()); + dataActivity.setWriteOffDate(currActivity.getPreCheckDate()==null?null:currActivity.getPreCheckDate().toString()); + dataActivity.setProductType(GoodsType.getName(centerGoods.getTargetType())); + dataActivity.setProduct(centerGoods.getTargetName()); + dataActivity.setActivityAccountCode(centerGoods.getSubjectCode()); + dataActivity.setActivityAccountName(centerGoods.getSubjectName()); + dataActivity.setActivityCostCenterNo(centerGoods.getCenterCode()); + dataActivity.setActivityCostCenterName(centerGoods.getCenterName()+"("+centerGoods.getCenterType()+")"); + dataActivity.setMoney(centerGoods.getCenterGoodsAmount()); + subList.add(dataActivity); + resultList.add(dataActivity); + } + if(resultList.size()>0){ + newWayData.put("formson_1990",resultList); + } + } + + private void buildContractSeeyonData(String id, Map data, List contracts) { + //活动的科目和成本中心 + List tbsActivityCenters = tbsActivityCenterService.listByCostApplyId(Long.parseLong(id)); + String concatCenterCodes = tbsActivityCenters.stream().map(TbsActivityCenter::getCenterCode).collect(Collectors.joining(",")); + String concatCenterNames = tbsActivityCenters.stream().map(TbsActivityCenter::getCenterName).collect(Collectors.joining(",")); + List tbsActivitySubjects = tbsActivitySubjectService.listByCostApplyId(Long.parseLong(id)); + List subjectIds = tbsActivitySubjects.stream().map(a->a.getSubjectId()).collect(Collectors.toList()); + if(subjectIds.size()>0){ + List subjectList = subjectService.listByIds(subjectIds); + String concatSubjectCodes = subjectList.stream().map(BmsSubject::getThirdCode).collect(Collectors.joining(",")); + String concatSubjectNames = subjectList.stream().map(BmsSubject::getThirdName).collect(Collectors.joining(",")); + + data.put("financeAccountCode",concatSubjectCodes); + data.put("financeAccountName",concatSubjectNames); + data.put("accountCode",concatSubjectCodes); + data.put("accountName",concatSubjectNames); + } + + TbsCostContract contract = contracts.get(0); + data.put("payee",contract.getPayee()); + data.put("bankName",contract.getBankName()); + data.put("bankAccount",contract.getBankAccount()); + data.put("sealID",contract.getSealId()); + data.put("sealName",contract.getSealName()); + data.put("sealNum",contract.getSealNum()); + data.put("fileNum",contract.getFileNum()); + + data.put("costCenterNo",concatCenterCodes); + data.put("costCenterName",concatCenterNames); + + data.put("businessCompany",contract.getBusinessCompany()); + data.put("businessCompanyId",contract.getDutyNumber()); + + data.put("contractName",contract.getContractName()); + data.put("applyMoney",contract.getContractAmount()); + data.put("signDate",contract.getSignTime()==null?null:contract.getSignTime().toString()); + data.put("expireDate",contract.getExpireTime()==null?null:contract.getExpireTime().toString()); + data.put("contractContent",contract.getContractCondition()); + String urls = ""; + final String ossPrefix = "https://qsjslservice.oss-cn-guangzhou.aliyuncs.com/"; + if (CollectionUtil.isNotEmpty(contract.getAttachIds())){ + List attachIds = Arrays.asList(contract.getAttachIds()); + List attachList = sysAttachService.listByIds(attachIds); + urls = attachList.stream().map(a->{ + if(a.getPath()!=null){ + try { + String tmp = URLEncoder.encode(a.getPath(), "UTF8").replace("%2F","/"); + return ossPrefix+tmp; + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + return ""; + }).collect(Collectors.joining(" , ")); + } + data.put("contractFile",urls); + } + + @NotNull + private List buildCusRateMain(BmsSupplier supplier) { + List supplierTargetList = bmsSupplierTargetMapper.selectList( + new LambdaQueryWrapper() + .eq(BmsSupplierTarget::getSupplierId, supplier.getId()) + ); + List scheduleItemIds = supplierTargetList.stream().map(BmsSupplierTarget::getScheduleItemId).collect(Collectors.toList()); + List scheduleIds = supplierTargetList.stream().map(BmsSupplierTarget::getScheduleId).collect(Collectors.toList()); + List scheduleItems = null; + if(scheduleItemIds.size()>0&&scheduleIds.size()>0){ + LambdaQueryWrapper scheduleItemsLqw = new LambdaQueryWrapper<>(); + scheduleItemsLqw.in(TbsScheduleItem::getId,scheduleItemIds); + scheduleItemsLqw.in(TbsScheduleItem::getScheduleId,scheduleIds); + scheduleItems = tbsScheduleItemMapper.selectList(scheduleItemsLqw); + } + //最近12个月 + LocalDate currMonth = LocalDate.now(); + + int currMonthNum = currMonth.getYear()*100 + currMonth.getMonthValue(); + LocalDate startMonth = currMonth.plusMonths(-12); + int startMonthNum = startMonth.getYear()*100 + startMonth.getMonthValue(); + + //发货金额 + List dispatchSumVos = dispatchDataMapper.querySumCost(startMonthNum,currMonthNum,Arrays.asList(supplier.getCode())); + //客户核销金额 + BirRoiCostDTO costDTO = new BirRoiCostDTO(); + costDTO.setStartMonthNum(startMonthNum); + costDTO.setEndMonthNum(currMonthNum); + costDTO.setSupplierId(supplier.getId()); + List costItemVoList = birRoiRateMapper.queryRoiCostItems(costDTO); + //用户季度费率 + List cusCenterRateList = + this.buildCusCenterRate(supplierTargetList, scheduleItems, currMonth, startMonth, dispatchSumVos, costItemVoList); + //用户年费率 + this.buildCusCenterYearRate(supplierTargetList, dispatchSumVos, costItemVoList, cusCenterRateList); + return cusCenterRateList; + } + + /** + * 用户年费率 + * @param supplierTargetList + * @param dispatchSumVos + * @param costItemVoList + * @param cusCenterRateList + */ + private void buildCusCenterYearRate(List supplierTargetList, List dispatchSumVos, List costItemVoList, List cusCenterRateList) { + BigDecimal dispatchAmt = BigDecimal.ZERO; + BigDecimal totalCost = BigDecimal.ZERO; + BigDecimal cusDispatch = BigDecimal.ZERO; + BigDecimal cusCost = BigDecimal.ZERO; + for (ErpDispatchSumVo dispatchSumVo : dispatchSumVos) { + dispatchAmt = dispatchAmt.add(dispatchSumVo.getDispatchSumCost()); + } + for (BirRoiCostItemVo itemVo : costItemVoList) { + totalCost = totalCost.add(itemVo.getCostRealAmt()); + } + for (BmsSupplierTarget supplierTarget : supplierTargetList) { + cusDispatch = cusDispatch.add(supplierTarget.getTargetCostAmount()); + cusCost = cusCost.add(supplierTarget.getTargetCostAmount()); + } + for (TbsContractCostSubItem.CusCenterRate centerRate : cusCenterRateList) { + centerRate.setYtdCusCenterCost(totalCost.toString()); + centerRate.setYtdCusCenterSend(dispatchAmt.toString()); + centerRate.setYtdCusCenterExpenseRate(totalCost.divide(dispatchAmt, RoundingMode.DOWN).toString()); + if(cusCost.compareTo(BigDecimal.ZERO)!=0&&cusDispatch.compareTo(BigDecimal.ZERO)!=0){ + centerRate.setYtdCusCenterTargetExpenseRate(cusCost.divide(cusDispatch,RoundingMode.DOWN).toString()); + } + } + } + + /** + * 创建客户维度的季度费率 + * @param supplierTargetList + * @param scheduleItems + * @param currMonth + * @param startMonth + * @param dispatchSumVos + * @param costItemVoList + */ + private List buildCusCenterRate(List supplierTargetList, + List scheduleItems, + LocalDate currMonth, LocalDate startMonth, + List dispatchSumVos, + List costItemVoList) { + List cusCenterRateList = new ArrayList<>(); + int[] currQ = MonthValues.getQArr(startMonth.getMonthValue()); + if(currQ!=null){ + BigDecimal dispatchAmt = BigDecimal.ZERO; + BigDecimal totalCost = BigDecimal.ZERO; + BigDecimal cusDispatch = BigDecimal.ZERO; + BigDecimal cusCost = BigDecimal.ZERO; + for (int monthVal : currQ) { + int monthNum = currMonth.getYear()*100 + monthVal; + if(dispatchSumVos !=null){ + for (ErpDispatchSumVo dispatchSumVo : dispatchSumVos) { + if(dispatchSumVo.getYearMonth().equals(monthNum)){ + dispatchAmt = dispatchAmt.add(dispatchSumVo.getDispatchSumCost()); + break; + } + } + } + for (BirRoiCostItemVo itemVo : costItemVoList) { + if(itemVo.getYearMonth().equals(monthNum)){ + totalCost = totalCost.add(itemVo.getCostRealAmt()); + } + } + if(scheduleItems !=null){ + for (BmsSupplierTarget supplierTarget : supplierTargetList) { + for (TbsScheduleItem item : scheduleItems) { + //匹配条件 + if(supplierTarget.getScheduleItemId().equals(item.getId())){ + //匹配时间 + int itemMonth = item.getStartDate().getMonthValue(); + if(itemMonth==monthVal){ + cusDispatch = cusDispatch.add(supplierTarget.getTargetCostAmount()); + cusCost = cusCost.add(supplierTarget.getTargetCostAmount()); + break; + } + } + } + } + } + } + TbsContractCostSubItem.CusCenterRate centerRate = new TbsContractCostSubItem.CusCenterRate(); + centerRate.setQtdCusCenterCost(totalCost.toString()); + centerRate.setQtdCusCenterSend(dispatchAmt.toString()); + centerRate.setQtdCusCenterExpenseRate(totalCost.divide(dispatchAmt, RoundingMode.DOWN).toString()); + if(cusCost.compareTo(BigDecimal.ZERO)!=0&&cusDispatch.compareTo(BigDecimal.ZERO)!=0){ + centerRate.setQtdCusCenterTargetExpenseRate(cusCost.divide(cusDispatch,RoundingMode.DOWN).toString()); + } + cusCenterRateList.add(centerRate); + } + return cusCenterRateList; + } + + private void buildCommonApplyData(String id, TbsCostApply tbsCostApply, List activityList, BmsSupplier supplier ,SysUser sysUser, Map data) { + String actTitles = activityList.stream().map(TbsActivity::getActTitle).collect(Collectors.joining("; ")); + data.put("costApplyCode", tbsCostApply.getCode()); + data.put("applyUserCode", sysUser.getCode()); + data.put("applyUserName", sysUser.getName()); + data.put("supplierName", tbsCostApply.getSupplierName()); + data.put("supplierCode", tbsCostApply.getSupplierCode()); + data.put("title", tbsCostApply.getChargeTheme()); + data.put("rowDate",DateUtils.format(LocalDateTime.now(), DateFormatString.DATE_TIME)); + data.put("rowState","03"); + data.put("orgId", tbsCostApply.getId()+""); + data.put("targetId", tbsCostApply.getId()+""); + data.put("targetCode", tbsCostApply.getCode()); + data.put("exsp1",TbsSeeYonConst.CostApplyConf.Code()); + data.put("money", tbsCostApply.getTotalActivityAmount()); + data.put("templateId",tbsCostApply.getTemplateId()); + data.put("templateName",tbsCostApply.getTemplateTitle()); + data.put("supplierArea",supplier.getComRegion()); + + //记录主表费率参数 + try { + this.buildMainData4ROI(tbsCostApply, data); + } catch (Exception e) { + e.printStackTrace(); + } + + //拓展添加审批关联区域 + String saleRegionId = supplier.handleSaleRegionId(); + String bizRegionId = supplier.handleBizRegionId(); + BmsRegion saleRegion = regionMapper.selectById(saleRegionId); + BmsRegion2 bizRegion = region2Mapper.selectById(bizRegionId); + String saleRegionNames = saleRegion!=null?saleRegion.getPathNames():"null_申请时未录入"; + String bizRegionNames = bizRegion!=null?bizRegion.getPathNames():"null_申请时未录入"; + + //拓展添加审批关联 + data.put("biz_region",bizRegionNames); + data.put("exsp2",saleRegionNames); + data.put("data_state",TbsCostApplyState.State_1_apply.getCode()+""); + + //添加跳转地址业务 + String urlKey = "exsp5"; + String baseJumpUrl = JumpToUtil.getJumpUrl(projectProperties.getWebUrl(),TbsSeeYonConst.CostApplyConf.Code(),id); + data.put("exsp5",urlKey); + data.put("cmsLink",baseJumpUrl); + data.put("activitySummary",actTitles); + + //添加科目和成本中心 + List tbsActivityCenters = tbsActivityCenterService.listByCostApplyId(Long.parseLong(id)); + List tbsActivitySubjects = tbsActivitySubjectService.listByCostApplyId(Long.parseLong(id)); + List subjectNames = tbsActivitySubjects.stream().map(TbsActivitySubject::getSubjectName).distinct().collect(Collectors.toList()); + List subList = new ArrayList<>(); + //创建子表数据(任由异常 这里数据用来判断流程走向) + this.buildSubList(tbsActivityCenters, subjectNames, subList,supplier.getCode()); + + //创建商品抬头列表 + List tbsActivityGoods = tbsActivityGoodsService.listByCostApplyId(Long.parseLong(id)); + Set bands = new HashSet<>(); + for (TbsActivityGoods tbsActivityGood : tbsActivityGoods) { + String band = tbsActivityGood.getTargetLevelPathNames().split("_")[0]; + bands.add(band); + } + String goods = bands.stream().collect(Collectors.joining(",")); + data.put("chanPinPinLei",goods); + //添加客户标签 + List tags = tagInfoMapper.lisTagsBySupplierCode(supplier.getCode()); + data.put("tags",tags); + data.put("sub",subList); + } + + /** + * 记录主表费率参数 + * @param tbsCostApply + * @param data + */ + @Override + public void buildMainData4ROI(TbsCostApply tbsCostApply, Map data) { + YtdQtdToOAVo ytdQtdToOAVo = birRoiRateService.buildYtdAndQtdData(tbsCostApply); + String defaultNum = "-2"; + data.put("ytdCusExpenseRate",ytdQtdToOAVo.getYtdCustomerPercent()==null? + defaultNum:BigDecimal.valueOf(ytdQtdToOAVo.getYtdCustomerPercent()).setScale(2, RoundingMode.HALF_UP)+""); + data.put("ytdEmpExpenseRate",ytdQtdToOAVo.getYtdUserPercent()==null? + defaultNum:BigDecimal.valueOf(ytdQtdToOAVo.getYtdUserPercent()).setScale(2, RoundingMode.HALF_UP)+""); + data.put("ytdAdminiExpenseRate",ytdQtdToOAVo.getYtdRegionPercent()==null? + defaultNum:BigDecimal.valueOf(ytdQtdToOAVo.getYtdRegionPercent()).setScale(2, RoundingMode.HALF_UP)+""); + data.put("ytdSalesExpenseRate",ytdQtdToOAVo.getYtdRegion2Percent()==null? + defaultNum:BigDecimal.valueOf(ytdQtdToOAVo.getYtdRegion2Percent()).setScale(2, RoundingMode.HALF_UP)+""); + data.put("cusExpenseRate",ytdQtdToOAVo.getQtdCustomerPercent()==null? + defaultNum:BigDecimal.valueOf(ytdQtdToOAVo.getQtdCustomerPercent()).setScale(2, RoundingMode.HALF_UP)+""); + data.put("empExpenseRate",ytdQtdToOAVo.getQtdUserPercent()==null? + defaultNum:BigDecimal.valueOf(ytdQtdToOAVo.getQtdUserPercent()).setScale(2, RoundingMode.HALF_UP)+""); + data.put("salesExpenseRate",ytdQtdToOAVo.getQtdRegionPercent()==null? + defaultNum:BigDecimal.valueOf(ytdQtdToOAVo.getQtdRegionPercent()).setScale(2, RoundingMode.HALF_UP)+""); + data.put("adminiExpenseRate",ytdQtdToOAVo.getQtdRegion2Percent()==null? + defaultNum:BigDecimal.valueOf(ytdQtdToOAVo.getQtdRegion2Percent()).setScale(2, RoundingMode.HALF_UP)+""); + + } + + /** + * 创建子表数据 + * @param tbsActivityCenters + * @param subjectNames + * @param subList + */ + private void buildSubList(List tbsActivityCenters, List subjectNames, List subList,String supplierCode) { + for (String subjectName : subjectNames) { + subList.add(new TbsCostSubItem.Subject(subjectName)); + } + //成本中心去重 + Map> centerMapList = tbsActivityCenters.stream().collect(Collectors.groupingBy(a->a.getCenterType()+"-"+a.getCenterId())); + List centerList = centerMapList.values().stream().map(a->a.get(0)).collect(Collectors.toList()); + for(TbsActivityCenter center : centerList){ + TbsCostSubItem.CostCenterTranStr costCenter = BirHttpUtil.buildCostCenter(center.getCenterType(),center.getCenterId(),center.getCenterName(),supplierCode); + if(costCenter==null ){ + log.error("BIR 成本中心缺失:{},{},{},{}", + center.getCenterType(), + center.getCenterId(), + center.getCenterName(), + supplierCode); + Assert.throwEx("成本中心缺失,请联系工作人员"); + } + if(costCenter.getChengBenZhongXin()==null){ + costCenter.setChengBenZhongXin(center.getCenterName()); + costCenter.setChengBenZhongXinId(center.getCenterType()+"-"+center.getId()); + } + subList.add(costCenter); + } + } + + /** + * 保存预算使用日志 + * @param budgetList + * @param sysUser + * @param costApply + * @param allBudgetItem + */ + private List saveBudgetLog(List budgetList, SysUser sysUser, TbsCostApply costApply, List allBudgetItem, List activityList) { + List budgetLogList = new ArrayList<>(); + for (TbsBudgetCostItem item : allBudgetItem) { + //排除不匹配预算的项 + if(item.getBudgetId().equals(0L)){ + continue; + } + TbsBudget budget = null; + for (TbsBudget tbsBudget : budgetList) { + if(item.getBudgetId().equals(tbsBudget.getId())){ + budget = tbsBudget; + break; + } + } + if(budget==null){ + continue; + } + TbsActivity currActivity = null; + for (TbsActivity activity : activityList) { + if(item.getActivityId().equals(activity.getId())){ + currActivity = activity; + } + } + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.buildTbsBudgetLog(BudgetLogOptFlag.State_1,sysUser, costApply, item, budget,item.getCenterGoodsAmount(),currActivity); + budgetLogList.add(budgetLog); + } + return budgetLogList; + } + + + + @Override + public void releaseCost(Long costApplyId,Integer invalidFlag) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsBudgetCostItem::getCostApplyId,costApplyId); + TbsBudgetCostItem costItem = new TbsBudgetCostItem(); + costItem.setInvalidFlag(invalidFlag); + budgetCostItemService.update(costItem,lqw); + } + + @Override + public void flushCostApply(Long costApplyId) { + + } + + @Override + public void flushAmtByAct(Long costApplyId) { + //select sum(tbs_activity.total_amount) from tbs_activity where del_flag = 0 and cancel_flag = 0 + LambdaQueryWrapper actLqw = new LambdaQueryWrapper<>(); + actLqw.eq(TbsActivity::getCostApplyId,costApplyId); + actLqw.eq(TbsActivity::getCancelFlag,0); + List activityList = tbsActivityMapper.selectList(actLqw); + BigDecimal total = BigDecimal.ZERO; + for (TbsActivity activity : activityList) { + total = total.add(activity.getTotalAmount()); + } + TbsCostApply costApply = new TbsCostApply(); + costApply.setId(costApplyId); + costApply.setTotalActivity(activityList.size()); + costApply.setTotalActivityAmount(total); + this.updateById(costApply); + } + + @Override + public void flushCostStatus(Long costApplyId,boolean isContractFlag) { + LambdaQueryWrapper actLqw = new LambdaQueryWrapper<>(); + actLqw.eq(TbsActivity::getCostApplyId,costApplyId); + actLqw.eq(TbsActivity::getCancelFlag,0); + List activityList = tbsActivityMapper.selectList(actLqw); + if(isContractFlag){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsActivityPayCondition::getCostApplyId,costApplyId); + lqw.ne(TbsActivityPayCondition::getFinishedFlag,1); + Long count = tbsActivityPayConditionMapper.selectCount(lqw); + if (count>0){ + TbsCostApply costApply = new TbsCostApply(); + costApply.setId(costApplyId); + costApply.setCheckState(2); + this.updateById(costApply); + return; + } + }else { + for (TbsActivity activity : activityList) { + if(activity.getActivityState().equals(TbsActivityState.STATE_4_Release)){ + continue; + } + if(activity.getActivityState().equals(TbsActivityState.STATE_1_Finished)){ + continue; + } + TbsCostApply costApply = new TbsCostApply(); + costApply.setId(costApplyId); + costApply.setCheckState(2); + this.updateById(costApply); + return; + } + } + boolean isAllCancel = true; + boolean someActChecked = false; + boolean someActNotChecked = false; + for (TbsActivity activity : activityList) { + boolean itemCancel = activity.getReleaseFlag().equals(1) + && activity.getReleaseAmount()!=null + && activity.getReleaseAmount().compareTo(activity.getTotalAmount())==0; + if(!itemCancel){ + isAllCancel = false; + break; + } + if(activity.getActivityState().equals(TbsActivityState.STATE_1_Finished)){ + someActChecked = true; + } + if(!activity.getActivityState().equals(TbsActivityState.STATE_1_Finished)){ + someActNotChecked = true; + } + } + boolean isChecked = someActChecked&&someActNotChecked; + + TbsCostApply costApply = new TbsCostApply(); + costApply.setId(costApplyId); + + costApply.setChargeState(TbsCostApplyState.State_3_finished.getCode()); + if(isAllCancel){ + costApply.setCheckState(3); + }else if (isChecked){ + costApply.setCheckState(4); + }else { + costApply.setCheckState(1); + } + costApply.setPassTime(LocalDateTime.now()); + this.updateById(costApply); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostChangeInfoServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostChangeInfoServiceImpl.java new file mode 100644 index 0000000..bb46b07 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostChangeInfoServiceImpl.java @@ -0,0 +1,314 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierTargetMapper; +import com.qs.serve.modules.bms.service.BmsSubjectService; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.erp.mapper.ErpDispatchDataMapper; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.sys.service.SysAttachService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.mapper.*; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * 异动信息 服务实现类 + * @author YenHex + * @since 2023-12-18 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsCostChangeInfoServiceImpl extends ServiceImpl implements TbsCostChangeInfoService { + + private TbsCostApplyService costApplyService; + private TbsBudgetApplicationService budgetApplicationService; + private TbsBudgetCostItemService budgetCostItemService; + private TbsBudgetLogService budgetLogService; + private SysUserService sysUserService; + private SeeYonRequestService seeYonService; + private TbsActivityTemplateService tbsActivityTemplateService; + private TbsActivityCenterService tbsActivityCenterService; + private TbsActivitySubjectService tbsActivitySubjectService; + private TbsActivityGoodsService tbsActivityGoodsService; + private TbsCostUnItemService tbsCostUnItemService; + private BmsSupplierService bmsSupplierService; + private BmsRegionMapper regionMapper; + private BmsRegion2Mapper region2Mapper; + private BmsSubjectService subjectService; + private TbsCostTodoMapper tbsCostTodoMapper; + private TbsActivitySlottingFeeMapper activitySlottingFeeMapper; + private TbsActivityPayConditionMapper tbsActivityPayConditionMapper; + private TbsActivityService activityService; + private TbsActivitySubjectService activitySubjectService; + private TbsActivityCenterService activityCenterService; + private TbsActivityChannelService activityChannelService; + private TbsActivityChannelPointService activityChannelPointService; + + @Override + public List listByExtendCostApplyId(Long newId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostChangeInfo::getExtendId,newId); + return this.list(lqw); + } + + @Override + public void compareToBuildChangeInfo(Long orgId, Long newId) { + if (orgId==null||newId==null){ + return; + } + LambdaQueryWrapper checkBuild = new LambdaQueryWrapper<>(); + checkBuild.eq(TbsCostChangeInfo::getSourceId,orgId); + checkBuild.eq(TbsCostChangeInfo::getExtendId,newId); + Long count = this.count(checkBuild); + TbsCostApply newApply = costApplyService.getById(newId); + if(count>0){ + //未提交则进行删除 + if(newApply.getChargeState().equals(0)){ + this.remove(checkBuild); + }else { + return; + } + } + List changeInfoList = new ArrayList<>(); + TbsCostApply oldApply = costApplyService.getById(orgId); + if(!oldApply.getChargeTheme().equals(newApply.getChargeTheme())){ + changeInfoList.add(TbsCostChangeInfo.toNewObject("档案标题更变",newApply.getChargeTheme())); + } + List orgActivityList = activityService.listByCostApplyId(orgId); + List newActivityList = activityService.listByCostApplyId(newId); + + // 判断活动减少 && 活动内容变更 + for (TbsActivity orgAct : orgActivityList) { + boolean orgMatchNewAct = false; + for (TbsActivity newAct : newActivityList) { + if(orgAct.getActivityCode().equals(newAct.getActivityCode())){ + orgMatchNewAct = true; + if(!orgAct.getActTitle().equals(newAct.getActTitle())){ + changeInfoList.add(TbsCostChangeInfo.toNewObject("活动活动简述及目的更变",newAct.getActTitle())); + } + if(!orgAct.getActStartDate().equals(newAct.getActStartDate())||!orgAct.getActEndDate().equals(newAct.getActEndDate())){ + changeInfoList.add(TbsCostChangeInfo.toNewObject("活动["+newAct.getActivityCode()+"]时间更变", + "原:"+orgAct.getActStartDate().toString()+"-"+orgAct.getActEndDate()+" ;"+ + "异动后:" +newAct.getActStartDate().toString()+"-"+newAct.getActEndDate()) + ); + } + if(!orgAct.getPreStartDate().equals(newAct.getPreStartDate())|| + !orgAct.getPreEndDate().equals(newAct.getPreEndDate())){ + changeInfoList.add(TbsCostChangeInfo.toNewObject("活动["+newAct.getActivityCode()+"]预计核销日期更变", + "原:"+orgAct.getPreStartDate().toString()+"-"+orgAct.getPreEndDate()+" ;"+ + "异动后:" +newAct.getPreStartDate().toString()+"-"+newAct.getPreEndDate()) + ); + } + + List subjectNewList = activitySubjectService.listByActivityId(newAct.getId()); + List subjectOrgList = activitySubjectService.listByActivityId(orgAct.getId()); + //处理科目异动 + this.buildByActivitySubject(orgAct,subjectNewList, subjectOrgList,changeInfoList ); + //处理网点异动 + this.buildChannelByActs(orgAct, newAct,changeInfoList); + this.buildPointByActs(orgAct, newAct,changeInfoList); + break; + } + } + if(!orgMatchNewAct){ + changeInfoList.add(TbsCostChangeInfo.toNewObject("移除活动","["+orgAct.getActivityCode()+"]"+orgAct.getActTitle())); + } + } + + // 判断活动新增 + for (TbsActivity newAct : newActivityList) { + boolean matchNewAct = false; + for (TbsActivity orgAct : orgActivityList) { + if(orgAct.getActivityCode().equals(newAct.getActivityCode())){ + matchNewAct = true; + } + } + if(!matchNewAct){ + changeInfoList.add(TbsCostChangeInfo.toNewObject("新增活动","["+newAct.getActivityCode()+"]"+newAct.getActTitle())); + } + } + for (TbsCostChangeInfo changeInfo : changeInfoList) { + changeInfo.setSourceId(orgId); + changeInfo.setExtendId(newId); + } + this.saveBatch(changeInfoList); + } + + private void buildPointByActs(TbsActivity orgAct, TbsActivity newAct,List changeInfoList ) { + List orgPointList = activityChannelPointService.listByActivityId(orgAct.getId()); + List newPointList = activityChannelPointService.listByActivityId(newAct.getId()); + boolean hasChannel = orgPointList.size()>0||newPointList.size()>0; + if(hasChannel){ + for (TbsActivityChannelPoint oldChannel : orgPointList) { + boolean matchOld = false; + for (TbsActivityChannelPoint newChannel : newPointList) { + if(oldChannel.getPointId().equals(newChannel.getPointId())){ + matchOld = true; + if(oldChannel.getPointRate().compareTo(newChannel.getPointRate())!=0) { + changeInfoList.add(TbsCostChangeInfo.toNewObject("活动["+orgAct.getActivityCode()+"]网点更变", + "原费用占比:"+oldChannel.getPointRate()+"%" + +"; 异动后占比:"+newChannel.getPointRate()+"%")); + } + } + } + if(!matchOld){ + changeInfoList.add(TbsCostChangeInfo.toNewObject("活动["+orgAct.getActivityCode()+"]网点删除", + oldChannel.getPointCode()+"/"+oldChannel.getPointName())); + } + } + for (TbsActivityChannelPoint newChannel : newPointList) { + boolean matchNew = false; + for (TbsActivityChannelPoint oldChannel : orgPointList) { + if(oldChannel.getPointId().equals(newChannel.getPointId())){ + matchNew = true; + } + } + if(!matchNew){ + changeInfoList.add(TbsCostChangeInfo.toNewObject("活动["+orgAct.getActivityCode()+"]网点新增", + newChannel.getPointCode()+"/"+newChannel.getPointName())); + } + } + } + } + + private void buildChannelByActs(TbsActivity orgAct, TbsActivity newAct,List changeInfoList ) { + List oldChannelList = activityChannelService.listByActivityId(orgAct.getId()); + List newChannelList = activityChannelService.listByActivityId(newAct.getId()); + boolean hasChannel = oldChannelList.size()>0||newChannelList.size()>0; + if(hasChannel){ + for (TbsActivityChannel oldChannel : oldChannelList) { + boolean matchOld = false; + for (TbsActivityChannel newChannel : newChannelList) { + if(oldChannel.getChannelId().equals(newChannel.getChannelId())){ + matchOld = true; + if(oldChannel.getChannelRate().compareTo(newChannel.getChannelRate())!=0 || + !oldChannel.getPreCountPoint().equals(newChannel.getPreCountPoint()) + ){ + changeInfoList.add(TbsCostChangeInfo.toNewObject("活动["+orgAct.getActivityCode()+"]渠道更变", + "原费用占比:"+oldChannel.getChannelRate()+"% 投放网点数量: "+oldChannel.getPreCountPoint() + +"; 异动后占比:"+newChannel.getChannelRate()+"% 投放网点数量: "+newChannel.getPreCountPoint())); + } + } + } + if(!matchOld){ + changeInfoList.add(TbsCostChangeInfo.toNewObject("活动["+orgAct.getActivityCode()+"]渠道删除", + oldChannel.getChannelCode()+"/"+oldChannel.getChannelName()+",费用占比:"+ + oldChannel.getChannelRate()+"% 投放网点数量: "+oldChannel.getPreCountPoint())); + } + } + for (TbsActivityChannel newChannel : newChannelList) { + boolean matchNew = false; + for (TbsActivityChannel oldChannel : oldChannelList) { + if(oldChannel.getChannelId().equals(newChannel.getChannelId())){ + matchNew = true; + } + } + if(!matchNew){ + changeInfoList.add(TbsCostChangeInfo.toNewObject("活动["+orgAct.getActivityCode()+"]渠道新增", + newChannel.getChannelCode()+"/"+newChannel.getChannelName()+",费用占比:"+ + newChannel.getChannelRate()+"% 投放网点数量: "+newChannel.getPreCountPoint())); + } + } + } + + } + + private void buildByActivitySubject(TbsActivity activity,List subjectNewList, List subjectOrgList,List changeInfoList ) { + for (TbsActivitySubject oldSubject : subjectOrgList) { + boolean matchNew = false; + for (TbsActivitySubject newSubject : subjectNewList) { + if(newSubject.getSubjectId().equals(oldSubject.getSubjectId())){ + matchNew = true; + if(!newSubject.getAmount().equals(oldSubject.getAmount())){ + changeInfoList.add(TbsCostChangeInfo.toNewObject("活动["+activity.getActivityCode()+"]的科目["+newSubject.getSubjectName()+"]金额调整", + "原来金额:"+oldSubject.getAmount()+" 异动后金额:"+newSubject.getAmount())); + } + if(!newSubject.getCountSession().equals(oldSubject.getCountSession())){ + changeInfoList.add(TbsCostChangeInfo.toNewObject("活动["+activity.getActivityCode()+"]的科目["+newSubject.getSubjectName()+"]场次调整", + "原来场次:"+oldSubject.getCountSession()+" 异动后场次:"+newSubject.getCountSession())); + } + if(!newSubject.getCountPerson().equals(oldSubject.getCountPerson())){ + changeInfoList.add(TbsCostChangeInfo.toNewObject("活动["+activity.getActivityCode()+"]的科目["+newSubject.getSubjectName()+"]场次调整", + "原来人数:"+oldSubject.getCountPerson()+" 异动后人数:"+newSubject.getCountPerson())); + } + //异动的成本中心 + this.buildCenterChangeLog(activity, oldSubject, newSubject,changeInfoList ); + break; + } + } + if(!matchNew){ + changeInfoList.add(TbsCostChangeInfo.toNewObject("活动移除科目", + "活动["+activity.getActivityCode()+"]移除科目["+oldSubject.getSubjectCode()+"]"+oldSubject.getSubjectName())); + } + } + for (TbsActivitySubject newSubject : subjectNewList) { + boolean matchOld = false; + for (TbsActivitySubject oldSubject : subjectOrgList) { + if(newSubject.getSubjectId().equals(oldSubject.getSubjectId())){ + matchOld = true; + break; + } + } + if(!matchOld){ + changeInfoList.add(TbsCostChangeInfo.toNewObject("活动新增科目", + "活动["+activity.getActivityCode()+"]新科目["+newSubject.getSubjectCode()+"]"+newSubject.getSubjectName())); + } + } + } + + private void buildCenterChangeLog(TbsActivity activity, TbsActivitySubject oldSubject, TbsActivitySubject newSubject,List changeInfoList ) { + List newCenterList = activityCenterService.listByActivity(activity.getId(), newSubject.getId()); + List oldCenterList = activityCenterService.listByActivity(activity.getId(), oldSubject.getId()); + for (TbsActivityCenter newCenter : newCenterList) { + boolean matchOld = false; + for (TbsActivityCenter oldCenter : oldCenterList) { + if(newCenter.getCenterType().equals(oldCenter.getCenterType()) + &&newCenter.getCenterId().equals(oldCenter.getCenterId())){ + matchOld = true; + if(!newCenter.getCenterRate().equals(oldCenter.getCenterRate()) + ||!newCenter.getCenterAmount().equals(oldCenter.getCenterAmount())){ + changeInfoList.add(TbsCostChangeInfo.toNewObject("活动["+activity.getActivityCode()+"]科目["+newSubject.getSubjectCode()+"]成本中心调整", + "原来占比:"+oldCenter.getCenterRate()+"% 合计:"+oldCenter.getCenterAmount()+" ;" + + " 异动后: "+newCenter.getCenterRate()+"% 合计: "+newCenter.getCenterAmount() + ) + ); + } + + + } + } + if(!matchOld){ + changeInfoList.add(TbsCostChangeInfo.toNewObject("活动["+activity.getActivityCode()+"]科目["+newSubject.getSubjectCode()+"]新增成本中心",newCenter.getCenterName())); + } + } + + for (TbsActivityCenter oldCenter : oldCenterList) { + boolean matchNew = false; + for (TbsActivityCenter newCenter : newCenterList) { + if(newCenter.getCenterType().equals(oldCenter.getCenterType()) + &&newCenter.getCenterId().equals(oldCenter.getCenterId())){ + matchNew = true; + } + } + if(!matchNew){changeInfoList.add(TbsCostChangeInfo.toNewObject("活动["+activity.getActivityCode()+"]科目["+newSubject.getSubjectCode()+"]移除成本中心", + oldCenter.getCenterName())); + } + } + + } + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostContractServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostContractServiceImpl.java new file mode 100644 index 0000000..f9d465d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostContractServiceImpl.java @@ -0,0 +1,43 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.sys.entity.SysAttach; +import com.qs.serve.modules.sys.service.SysAttachService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsCostContract; +import com.qs.serve.modules.tbs.service.TbsCostContractService; +import com.qs.serve.modules.tbs.mapper.TbsCostContractMapper; + +import java.util.Arrays; +import java.util.List; + +/** + * 费用合同 服务实现类 + * @author YenHex + * @since 2023-03-14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsCostContractServiceImpl extends ServiceImpl implements TbsCostContractService { + + private SysAttachService attachService; + + @Override + public TbsCostContract getByCostApplyId(Long id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostContract::getCostApplyId,id); + TbsCostContract contract = this.getOne(lqw,false); + if(contract!=null&&CollectionUtil.isNotEmpty(contract.getAttachIds())){ + List attachIds = Arrays.asList(contract.getAttachIds()); + List attachList = attachService.listByIds(attachIds); + contract.setAttachInfoList(attachList); + } + return contract; + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostTodoOperationServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostTodoOperationServiceImpl.java new file mode 100644 index 0000000..6bb98c0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostTodoOperationServiceImpl.java @@ -0,0 +1,260 @@ +package com.qs.serve.modules.tbs.service.impl; + +import java.math.BigDecimal; +import java.util.List; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.config.properties.ProjectProperties; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.common.util.model.DateFormatString; +import com.qs.serve.modules.data.service.DataAffairCommitService; +import com.qs.serve.modules.seeyon.entity.BaseCreateCallbackBo; +import com.qs.serve.modules.seeyon.entity.BaseCreateProcessBo; +import com.qs.serve.modules.seeyon.service.SeeYonOperationService; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.tbs.common.TbsCommonCheckState; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.entity.TbsCostTodo; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.entity.bo.TbsSubmitToDoBo; +import com.qs.serve.modules.tbs.mapper.TbsActivityMapper; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper; +import com.qs.serve.modules.tbs.mapper.TbsCostTodoMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; + +/** + * 费用申请代办 服务实现类 + * @author YenHex + * @since 2023-02-17 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsCostTodoOperationServiceImpl implements SeeYonOperationService { + + private final TbsCostTodoMapper tbsCostTodoMapper; + private final TbsActivityMapper tbsActivityMapper; + private final TbsCostApplyMapper tbsCostApplyMapper; + private final SysUserMapper sysUserMapper; + private final ProjectProperties projectProperties; + private final SeeYonRequestService seeYonService; + private final SeeYonRequestBaseService seeYonRequestBaseService; + + /** + * 提交 + * @param param + */ + @Transactional(rollbackFor = Exception.class) + public void submit(TbsSubmitToDoBo param){ + TbsCostTodo costTodo = tbsCostTodoMapper.selectById(param.getId()); + + TbsCostApply tbsCostApply = tbsCostApplyMapper.selectById(param.getId()); + if( + !tbsCostApply.getChargeState().equals(TbsCostApplyState.State_2_actioning.getCode()) && + !tbsCostApply.getChargeState().equals(TbsCostApplyState.State_3_finished.getCode()) + ){ + Assert.throwEx("费用状态不支持"); + } + + String todoCode = costTodo.getTodoCode(); + String templateCode = this.getTemplateCode(); + SysUser sysUser = sysUserMapper.selectById(AuthContextUtils.getSysUserId()); + Map data = new HashMap<>(); + Long todoId = costTodo.getId(); + data.put("exsp5", todoCode); + data.put("orgId", todoId); + data.put("applyUserCode", sysUser.getCode()); + data.put("applyUserName", sysUser.getName()); + data.put("empId", sysUser.getSyUserId()); + data.put("targetId", todoId); + data.put("targetCode", todoCode); + data.put("exsp1", templateCode); + //添加跳转地址业务 + String baseJumpUrl = JumpToUtil.getJumpUrl(projectProperties.getWebUrl(),templateCode,todoId+""); + log.debug("baseJumpUrl=>{}",baseJumpUrl); + data.put("cmsLink",baseJumpUrl); + data.put("rowDate", DateUtils.format(LocalDateTime.now(), DateFormatString.DATE_TIME)); + data.put("rowState","03"); + List tbsActivities = tbsActivityMapper.selectList(new LambdaQueryWrapper() + .eq(TbsActivity::getCostApplyId,tbsCostApply.getId())); + BigDecimal totalSum = BigDecimal.ZERO; + for (TbsActivity activity : tbsActivities) { + totalSum = totalSum.add(activity.getTotalAmount()); + } + + data.put("jinE",totalSum); + + BaseCreateProcessBo createProcess = new BaseCreateProcessBo(); + createProcess.setTemplateCode(templateCode); + createProcess.setMemberLoginName(sysUser.getSyAccount()); + createProcess.setSubjectTitle("[协议条款]"+costTodo.getDescr()); + createProcess.setTargetId(todoId+""); + createProcess.setDataJson(JsonUtil.objectToJson(data)); + R flowIdResult = seeYonService.baseCreateProcess(createProcess); + if(flowIdResult.getStatus()!=200){ + Assert.throwEx("远程服务调用失败"); + } + String jsonBody = flowIdResult.getData(); + if(StringUtils.hasText(jsonBody)&&jsonBody.contains("code")){ + JSONObject jsonObject = JSONObject.parseObject(jsonBody); + Integer rs = jsonObject.getInteger("code"); + if (rs==null || !rs.equals(0)){ + Assert.throwEx("发起流程失败 "+jsonObject.getString("message")); + } + } + String formId = null; + R formIdResult = seeYonService.getFormId(templateCode,todoId); + if(formIdResult.getStatus()==200){ + formId = formIdResult.getData(); + } + + //创建流程后回调 + BaseCreateCallbackBo callbackBo = new BaseCreateCallbackBo(TbsSeeYonConst.CheckCostAgreeConf.Code(),param.getId()+""); + seeYonService.createCallbackStatus(callbackBo); + + //流水号 + R codeRs = seeYonRequestBaseService.getBase(TbsSeeYonConst.API_FLOW_CODE_TODO+todoId,"获取条款申请流水号"); + if(codeRs!=null && codeRs.getData()!=null){ + String flowCode = codeRs.getData().toString(); + costTodo.setSyFlowCode(flowCode); + } + + costTodo.setCheckStatus(TbsCommonCheckState.State_1_apply); + costTodo.setSubmitTime(LocalDateTime.now()); + costTodo.setSyFormId(formId); + costTodo.setAttachIds2(param.getAttachIds2()); + costTodo.setAttachDesc(param.getAttachDesc()); + tbsCostTodoMapper.updateById(costTodo); + + TbsCostApply costApply = new TbsCostApply(); + costApply.setId(costTodo.getCostApplyId()); + costApply.setAgreeCheckStatus(1); + tbsCostApplyMapper.updateById(costApply); + + } + + @Override + public String getTemplateCode() { + return TbsSeeYonConst.CheckCostAgreeConf.Code(); + } + + @Override + public String getSyFormIdByTargetInfo(TbsAffairCommitBo affairCommit) { + TbsCostTodo obj = tbsCostTodoMapper.selectById(affairCommit.getTargetId()); + if(!obj.getCheckStatus().equals(TbsCommonCheckState.State_1_apply)){ + Assert.throwEx("操作失败,条款处于非审批状态"); + } + return obj.getSyFormId(); + } + + @Override + public Object doBacked(TbsAffairCommitBo param) { + TbsCostTodo costTodo = new TbsCostTodo(); + costTodo.setId(Long.parseLong(param.getTargetId())); + costTodo.setCheckStatus(TbsCommonCheckState.State_3_setback); + tbsCostTodoMapper.updateById(costTodo); + this.updateAgreeStatus(param.getTargetId()); + return null; + } + + @Override + public Object doFinished(TbsAffairCommitBo param) { + TbsCostTodo costTodo = new TbsCostTodo(); + costTodo.setId(Long.parseLong(param.getTargetId())); + costTodo.setFinishedTime(LocalDateTime.now()); + costTodo.setFinishedFlag(1); + costTodo.setCheckStatus(TbsCommonCheckState.State_2_finished); + tbsCostTodoMapper.updateById(costTodo); + this.updateAgreeStatus(param.getTargetId()); + return null; + } + + @Override + public Object doRefuse(TbsAffairCommitBo param) { + TbsCostTodo costTodo = new TbsCostTodo(); + costTodo.setId(Long.parseLong(param.getTargetId())); + costTodo.setCheckStatus(TbsCommonCheckState.State_4_stop); + tbsCostTodoMapper.updateById(costTodo); + this.updateAgreeStatus(param.getTargetId()); + return null; + } + + /** + * 更新活动的验收状态 + * @param targetId + */ + private void updateAgreeStatus(String targetId) { + TbsCostTodo obj = tbsCostTodoMapper.selectById(targetId); + Long costId = obj.getCostApplyId(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostTodo::getCostApplyId,costId); + List costTodoList = tbsCostTodoMapper.selectList(lqw); + boolean unfinished = false; + boolean finished = false; + for (TbsCostTodo todo : costTodoList) { + if(!todo.getCheckStatus().equals(TbsCommonCheckState.State_2_finished)){ + unfinished = true; + }else { + finished = true; + } + } + TbsCostApply costApply = new TbsCostApply(); + costApply.setId(costId); + if(finished && !unfinished){ + costApply.setAgreeCheckStatus(3); + }else if(finished){ + costApply.setAgreeCheckStatus(2); + }else if (unfinished){ + costApply.setAgreeCheckStatus(0); + } + costApply.setAgreeCheckStatus(2); + tbsCostApplyMapper.updateById(costApply); + } + + @Override + public boolean checkSyFormIdIsNotNull(String targetId) { + TbsCostTodo obj = tbsCostTodoMapper.selectById(targetId); + return obj.getSyFormId()!=null; + } + + @Override + public void doCommitBacked(String targetId) { + String summeryResult = this.checkAffairSummery(targetId); + if(summeryResult.equals(TbsCostApplyOperationServiceImpl.SummeryState_Success)){ + DataAffairCommitService commitService = SpringUtils.getBean(DataAffairCommitService.class); + // TbsAffairCommitBo.state 0-否定,1-同意,2-退回 + Integer state = commitService.getState(this.getTemplateCode(),targetId+""); + //获取最后一条审批判断结果 + if(state==null){ + return; + } + TbsAffairCommitBo doParam = new TbsAffairCommitBo(); + doParam.setTargetId(targetId); + if (state == 1){ + this.doFinished(doParam); + }else if (state==2){ + this.doBacked(doParam); + }else if (state==0){ + this.doRefuse(doParam); + } + } + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostTodoServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostTodoServiceImpl.java new file mode 100644 index 0000000..bc6a064 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostTodoServiceImpl.java @@ -0,0 +1,38 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsCostTodo; +import com.qs.serve.modules.tbs.service.TbsCostTodoService; +import com.qs.serve.modules.tbs.mapper.TbsCostTodoMapper; + +import java.util.List; + +/** + * 费用申请代办 服务实现类 + * @author YenHex + * @since 2023-02-17 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsCostTodoServiceImpl extends ServiceImpl implements TbsCostTodoService { + + @Override + public List listByCostId(Long costId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostTodo::getCostApplyId,costId); + return baseMapper.selectList(lqw); + } + + @Override + public List selectTbsCostTodoList(TbsCostTodo query) { + return baseMapper.selectTbsCostTodoList(query); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostUnItemPolicyServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostUnItemPolicyServiceImpl.java new file mode 100644 index 0000000..2f93d8f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostUnItemPolicyServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsCostUnItemPolicy; +import com.qs.serve.modules.tbs.service.TbsCostUnItemPolicyService; +import com.qs.serve.modules.tbs.mapper.TbsCostUnItemPolicyMapper; + +/** + * 预算费用明细 服务实现类 + * @author YenHex + * @since 2023-02-24 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsCostUnItemPolicyServiceImpl extends ServiceImpl implements TbsCostUnItemPolicyService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostUnItemServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostUnItemServiceImpl.java new file mode 100644 index 0000000..2d1ac03 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsCostUnItemServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsCostUnItem; +import com.qs.serve.modules.tbs.service.TbsCostUnItemService; +import com.qs.serve.modules.tbs.mapper.TbsCostUnItemMapper; + +/** + * 无预算的费用明细 服务实现类 + * @author YenHex + * @since 2023-02-02 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsCostUnItemServiceImpl extends ServiceImpl implements TbsCostUnItemService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsDealErrorApplication.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsDealErrorApplication.java new file mode 100644 index 0000000..810eb63 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsDealErrorApplication.java @@ -0,0 +1,137 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qs.serve.common.util.JsonUtil; +import com.qs.serve.modules.sys.entity.SysSyncLog; +import com.qs.serve.modules.sys.mapper.SysSyncLogMapper; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.mapper.*; +import com.qs.serve.modules.third.entity.ProcessCreateCostApplyBo; +import com.qs.serve.modules.third.entity.ProcessGoodsItem; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 处理特殊错误的场景 + * @author YenHex + * @since 2023/12/6 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsDealErrorApplication { + + private final TbsBudgetLogMapper tbsBudgetLogMapper; + private final SysSyncLogMapper sysSyncLogMapper; + private final TbsActivityCenterGoodsMapper activityCenterGoodsMapper; + private final TbsActivityCenterMapper activityCenterMapper; + private final TbsActivitySubjectMapper activitySubjectMapper; + private final TbsActivityMapper activityMapper; + private final TbsBudgetCostItemMapper budgetCostItemMapper; + private final VtbVerificationMapper verificationMapper; + private final TbsCostApplyMapper costApplyMapper; + + + /** + * 处理第三方核销错误数据 + */ + public void dealThirtyBuildCost(){ + List costApplyList =tbsBudgetLogMapper.selectErrorThirtyCostId(); + for (TbsCostApply costApply : costApplyList) { + SysSyncLog syncLog = sysSyncLogMapper.selectThirtyLogByCostCode(costApply.getCode()); + if(syncLog==null){ + continue; + } + ProcessCreateCostApplyBo costApplyBo = JsonUtil.jsonToPojo(syncLog.getRequestJson(),ProcessCreateCostApplyBo.class); + List goodsList = costApplyBo.getGoodsList(); + Map goodsAmountMap = new HashMap<>(); + for (ProcessGoodsItem goodsItem : goodsList) { + BigDecimal amt = goodsAmountMap.get(goodsItem.getInventoryCode()); + if(amt==null){ + amt = BigDecimal.ZERO; + } + amt = amt.add(goodsItem.getAmount()); + goodsAmountMap.put(goodsItem.getInventoryCode(),amt); + } + //更新表 tbs_budget_log,tbs_act_center_goods,tbs_cost_item_budget + LambdaQueryWrapper budgetLogLqw = new LambdaQueryWrapper<>(); + budgetLogLqw.eq(TbsBudgetLog::getCostApplyId,costApply.getId()); + List budgetLogList = tbsBudgetLogMapper.selectList(budgetLogLqw); + for (TbsBudgetLog budgetLog : budgetLogList) { + String goodCode = budgetLog.getTargetCode(); + BigDecimal amt = goodsAmountMap.get(goodCode).negate(); + if(budgetLog.getAmount().compareTo(amt)!=0){ + budgetLog.setAmount(amt); + tbsBudgetLogMapper.updateById(budgetLog); + } + } + + LambdaQueryWrapper goodsLqw = new LambdaQueryWrapper<>(); + goodsLqw.eq(TbsActivityCenterGoods::getCostApplyId,costApply.getId()); + List activityCenterGoodsList = activityCenterGoodsMapper.selectList(goodsLqw); + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + String goodCode = centerGoods.getTargetCode(); + BigDecimal amt = goodsAmountMap.get(goodCode); + if(centerGoods.getUsedAmount().compareTo(amt)!=0){ + centerGoods.setCenterGoodsAmount(amt); + centerGoods.setUsedAmount(amt); + activityCenterGoodsMapper.updateById(centerGoods); + } + } + + LambdaQueryWrapper budgetCostItemLQW = new LambdaQueryWrapper<>(); + budgetCostItemLQW.eq(TbsBudgetCostItem::getCostApplyId,costApply.getId()); + List budgetCostItemList = budgetCostItemMapper.selectList(budgetCostItemLQW); + for (TbsBudgetCostItem costItem : budgetCostItemList) { + String goodCode = costItem.getTargetCode(); + BigDecimal amt = goodsAmountMap.get(goodCode); + if(costItem.getCenterGoodsAmount().compareTo(amt)!=0){ + costItem.setCenterGoodsAmount(amt); + budgetCostItemMapper.updateById(costItem); + } + } + + } + } + + @Transactional(rollbackFor = Exception.class) + public void releaseAll(Long costId){ + VtbVerification verification = new VtbVerification(); + LambdaQueryWrapper veriLqw = new LambdaQueryWrapper<>(); + veriLqw.in(VtbVerification::getVerificationState,0,1); + Long count = verificationMapper.selectCount(veriLqw); + if(count>0){ + log.warn("存在核销记录,释放中断!"); + return; + } + QueryWrapper qw = new QueryWrapper(); + qw.eq("cost_apply_id",costId); + tbsBudgetLogMapper.delete(qw); + budgetCostItemMapper.delete(qw); + TbsCostApply costApply = costApplyMapper.selectById(costId); + costApply.setCheckState(3); + costApply.setChargeState(6); + costApply.setTotalActivityUsedAmount(BigDecimal.ZERO); + costApplyMapper.updateById(costApply); + + List activityList = activityMapper.selectList(qw); + for (TbsActivity activity : activityList) { + activity.setReleaseFlag(1); + activity.setReleaseAmount(activity.getTotalAmount()); + activity.setReleaseUserId("0"); + activity.setReleaseUserName("系统释放"); + activityMapper.updateById(activity); + } + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsScheduleItemBudgetServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsScheduleItemBudgetServiceImpl.java new file mode 100644 index 0000000..921dfa6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsScheduleItemBudgetServiceImpl.java @@ -0,0 +1,407 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.entity.TbsBudgetCondition; +import com.qs.serve.modules.tbs.entity.TbsBudgetLog; +import com.qs.serve.modules.tbs.entity.dto.*; +import com.qs.serve.modules.tbs.entity.so.TbsScheduleItemSearch; +import com.qs.serve.modules.tbs.mapper.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; +import com.qs.serve.modules.tbs.service.TbsScheduleItemBudgetService; + +import java.time.LocalDate; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 预算考核期项 服务实现类 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsScheduleItemBudgetServiceImpl extends ServiceImpl implements TbsScheduleItemBudgetService { + + private final TbsBudgetMapper tbsBudgetMapper; + private final TbsScheduleItemBudget2Mapper scheduleItemBudget2Mapper; + private final TbsBudgetLog2Mapper tbsBudgetLog2Mapper; + private final TbsBudgetConditionMapper budgetConditionMapper; + + @Override + public List betweenDateList(LocalDate startDate, LocalDate endDate) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.le(TbsScheduleItemBudget::getStartDate,startDate); + lqw.ge(TbsScheduleItemBudget::getEndDate,endDate); + lqw.last("order by timediff(start_date,end_date) desc,end_date asc"); + //初始化金额 + List scheduleItemBudgetList = this.list(lqw); + List ids = scheduleItemBudgetList.stream().map(TbsScheduleItemBudget::getId).collect(Collectors.toList()); + ids.add(0L); + List amountList = this.baseMapper.getSumAmtInList(ids,Arrays.asList(0,2,3)); + for (TbsScheduleItemBudget itemBudget : scheduleItemBudgetList) { + for (TbsBudgetLogWithAmount withAmount : amountList) { + if(itemBudget.getId().equals(withAmount.getId())){ + itemBudget.setBudgetAmount(withAmount.getAmt()); + break; + } + } + } + return scheduleItemBudgetList; + } + + @Override + public Long findUnMatchScheduleItemBySourceBudgetIdAndTargetBudgetId(Long sourceId,Long targetId){ + return this.baseMapper.findUnMatchScheduleItemBySourceBudgetIdAndTargetBudgetId(sourceId,targetId); + } + + @Override + public List listScheduleAmountByIds(List scheduleItemBudgetIds) { + // 预算金额 + List finalList = baseMapper.getSumAmtInList(scheduleItemBudgetIds, BudgetLogOptFlag.getFinalBudgetOptFlag()); + // 被占用金额 + List usedList = baseMapper.getSumAmtNotInList(scheduleItemBudgetIds, BudgetLogOptFlag.getFinalBudgetOptFlag()); + // 费用使用金额 + List costUsedList = baseMapper.getSumAmtInList(scheduleItemBudgetIds, BudgetLogOptFlag.finalCostOptFlag); + // 政策使用金额 + List policyUsedList = baseMapper.getSumAmtInList(scheduleItemBudgetIds, BudgetLogOptFlag.finalPolicyOptFlag); + + List policyCheckingList = baseMapper.getPolicyCheckingList(scheduleItemBudgetIds, BudgetLogOptFlag.finalPolicyOptFlag); + + List costCheckingList = baseMapper.getCostCheckingList(scheduleItemBudgetIds, BudgetLogOptFlag.finalCostOptFlag); + + List result = new ArrayList<>(); + + for (Long scheduleItemBudgetId : scheduleItemBudgetIds) { + if(scheduleItemBudgetId.equals(0L)){continue;} + TbsBudgetScheduleWithAmount withAmount = new TbsBudgetScheduleWithAmount(); + withAmount.setScheduleItemBudgetId(scheduleItemBudgetId); + for (TbsBudgetLogWithAmount obj : finalList) { + if(scheduleItemBudgetId.equals(obj.getId())){ + withAmount.setFinalAmt(obj.getAmt()); + break; + } + } + for (TbsBudgetLogWithAmount obj : usedList) { + if(scheduleItemBudgetId.equals(obj.getId())){ + withAmount.setAllUsingAmt(obj.getAmt()); + break; + } + } + + for (TbsBudgetLogWithAmount obj : costUsedList) { + if(scheduleItemBudgetId.equals(obj.getId())){ + withAmount.setCostUsingAmt(obj.getAmt()); + break; + } + } + for (TbsBudgetLogWithAmount obj : policyUsedList) { + if(scheduleItemBudgetId.equals(obj.getId())){ + withAmount.setPolicyUsingAmt(obj.getAmt()); + break; + } + } + for (TbsBudgetLogWithAmount obj : costCheckingList) { + if(scheduleItemBudgetId.equals(obj.getId())){ + withAmount.setCostCheckingAmt(obj.getAmt()); + break; + } + } + for (TbsBudgetLogWithAmount obj : policyCheckingList) { + if(scheduleItemBudgetId.equals(obj.getId())){ + withAmount.setPolicyCheckingAmt(obj.getAmt()); + break; + } + } + //因为log统计为负数,需要把数值取正 + withAmount.setAllUsingAmt(withAmount.getAllUsingAmt().negate()); + withAmount.setCostUsingAmt(withAmount.getCostUsingAmt().negate()); + withAmount.setCostCheckingAmt(withAmount.getCostCheckingAmt().negate()); + withAmount.setPolicyUsingAmt(withAmount.getPolicyUsingAmt().negate()); + withAmount.setPolicyCheckingAmt(withAmount.getPolicyCheckingAmt().negate()); + //计算剩余及审批合计 + withAmount.setAllCheckingAmt(withAmount.getCostCheckingAmt().add(withAmount.getPolicyCheckingAmt())); + withAmount.setSurplusAmt(withAmount.getFinalAmt().subtract(withAmount.getAllUsingAmt())); + result.add(withAmount); + } + return result; + } + + @Override + public List listScheduleItemAmountByIds(List scheduleItemBudgetIdDtoList) { + + List scheduleItemBudgetIds = scheduleItemBudgetIdDtoList.stream().map(TbsScheduleItemBudgetIdDto::getScheduleItemBudgetId).collect(Collectors.toList()); + List scheduleItemIds = scheduleItemBudgetIdDtoList.stream().map(TbsScheduleItemBudgetIdDto::getScheduleItemId).distinct().collect(Collectors.toList()); + + // 预算金额 + List finalList = scheduleItemBudget2Mapper.getSumAmtInList(scheduleItemBudgetIds, BudgetLogOptFlag.getFinalBudgetOptFlag()); + // 被占用金额 + List usedList = scheduleItemBudget2Mapper.getSumAmtNotInList(scheduleItemBudgetIds, BudgetLogOptFlag.getFinalBudgetOptFlag()); + // 费用使用金额 + List costUsedList = scheduleItemBudget2Mapper.getSumAmtInList(scheduleItemBudgetIds, BudgetLogOptFlag.finalCostOptFlag); + // 政策使用金额 + List policyUsedList = scheduleItemBudget2Mapper.getSumAmtInList(scheduleItemBudgetIds, BudgetLogOptFlag.finalPolicyOptFlag); + + List policyCheckingList = scheduleItemBudget2Mapper.getPolicyCheckingList(scheduleItemBudgetIds, BudgetLogOptFlag.finalPolicyOptFlag); + + List costCheckingList = scheduleItemBudget2Mapper.getCostCheckingList(scheduleItemBudgetIds, BudgetLogOptFlag.finalCostOptFlag); + + List result = new ArrayList<>(); + + for (Long scheduleItemId : scheduleItemIds) { + TbsScheduleItemWithAmount withAmount = new TbsScheduleItemWithAmount(); + withAmount.setScheduleItemId(scheduleItemId); + for (TbsBudgetLogWithAmount obj : finalList) { + if(scheduleItemId.equals(obj.getId())){ + withAmount.setFinalAmt(obj.getAmt()); + break; + } + } + for (TbsBudgetLogWithAmount obj : usedList) { + if(scheduleItemId.equals(obj.getId())){ + withAmount.setAllUsingAmt(obj.getAmt()); + break; + } + } + + for (TbsBudgetLogWithAmount obj : costUsedList) { + if(scheduleItemId.equals(obj.getId())){ + withAmount.setCostUsingAmt(obj.getAmt()); + break; + } + } + for (TbsBudgetLogWithAmount obj : policyUsedList) { + if(scheduleItemId.equals(obj.getId())){ + withAmount.setPolicyUsingAmt(obj.getAmt()); + break; + } + } + for (TbsBudgetLogWithAmount obj : costCheckingList) { + if(scheduleItemId.equals(obj.getId())){ + withAmount.setCostCheckingAmt(obj.getAmt()); + break; + } + } + for (TbsBudgetLogWithAmount obj : policyCheckingList) { + if(scheduleItemId.equals(obj.getId())){ + withAmount.setPolicyCheckingAmt(obj.getAmt()); + break; + } + } + //因为log统计为负数,需要把数值取正 + withAmount.setAllUsingAmt(withAmount.getAllUsingAmt().negate()); + withAmount.setCostUsingAmt(withAmount.getCostUsingAmt().negate()); + withAmount.setCostCheckingAmt(withAmount.getCostCheckingAmt().negate()); + withAmount.setPolicyUsingAmt(withAmount.getPolicyUsingAmt().negate()); + withAmount.setPolicyCheckingAmt(withAmount.getPolicyCheckingAmt().negate()); + //计算剩余及审批合计 + withAmount.setAllCheckingAmt(withAmount.getCostCheckingAmt().add(withAmount.getPolicyCheckingAmt())); + withAmount.setSurplusAmt(withAmount.getFinalAmt().subtract(withAmount.getAllUsingAmt())); + result.add(withAmount); + } + return result; + } + + @Override + public List listBudgetAmountByIds(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); + + // 预算金额 + List finalList = tbsBudgetLog2Mapper.getSumFinalAmtInList(new ArrayList<>(budgetIds), BudgetLogOptFlag.getFinalBudgetOptFlag()); + + // 被占用金额 + List usedList = tbsBudgetLog2Mapper.getSumAmtNotInList(new ArrayList<>(budgetIds), BudgetLogOptFlag.getFinalBudgetOptFlag()); + + // 费用使用金额 + List costUsedList = tbsBudgetLog2Mapper.getSumAmtInList(new ArrayList<>(budgetIds), BudgetLogOptFlag.finalCostOptFlag); + + // 费用退回的金额 + List costBackList = tbsBudgetLog2Mapper.getSumBackAmtInList(new ArrayList<>(budgetIds)); + + // 政策使用金额 + List policyUsedList = tbsBudgetLog2Mapper.getSumAmtInList(new ArrayList<>(budgetIds), BudgetLogOptFlag.finalPolicyOptFlag); + + List policyCheckingList = tbsBudgetLog2Mapper.getPolicyCheckingList(new ArrayList<>(budgetIds), BudgetLogOptFlag.finalPolicyOptFlag); + + List costCheckingList = tbsBudgetLog2Mapper.getCostCheckingList(new ArrayList<>(budgetIds), BudgetLogOptFlag.finalCostOptFlag); + + List result = new ArrayList<>(); + + for (Long budgetId : budgetIds) { + if(budgetId.equals(0L)){ + continue; + } + + //拓展周期项 + List scheduleItemBudgetList = scheduleItemBudget2Mapper.selectList( + new LambdaQueryWrapper() + .eq(TbsScheduleItemBudget::getBudgetId,budgetId) + ); + + for (TbsScheduleItemBudget itemBudget : scheduleItemBudgetList) { + Long itemId = itemBudget.getId(); + TbsBudgetWithAmount withAmount = new TbsBudgetWithAmount(); + withAmount.setBudgetId(budgetId+""); + withAmount.setScheduleItemBudgetId(itemId+""); + withAmount.setScheduleItemBudgetName(itemBudget.getItemName()); + + for (TbsBudget budget : budgetList) { + if(budget.getId().equals(budgetId)){ + withAmount.setBudgetName(budget.getBudgetCode()); + withAmount.setCenterId(budget.getCenterId()); + withAmount.setCenterName(budget.getCenterName()); + withAmount.setCenterType(budget.getCenterType()); + withAmount.setScheduleName(budget.getScheduleName()); + } + } + + for (TbsBudgetLogWithAmount obj : finalList) { + if(budgetId.equals(obj.getId())&&itemId.equals(obj.getItemid())){ + withAmount.setFinalAmt(obj.getAmt()); + break; + } + } + for (TbsBudgetLogWithAmount obj : usedList) { + if(budgetId.equals(obj.getId())&&itemId.equals(obj.getItemid())){ + withAmount.setAllUsingAmt(obj.getAmt()); + break; + } + } + + for (TbsBudgetLogWithAmount obj : costUsedList) { + if(budgetId.equals(obj.getId())&&itemId.equals(obj.getItemid())){ + withAmount.setCostUsingAmt(obj.getAmt()); + break; + } + } + for (TbsBudgetLogWithAmount obj : costBackList) { + if(budgetId.equals(obj.getId())&&itemId.equals(obj.getItemid())){ + withAmount.setCostBackAmt(obj.getAmt().negate()); + break; + } + } + for (TbsBudgetLogWithAmount obj : policyUsedList) { + if(budgetId.equals(obj.getId())&&itemId.equals(obj.getItemid())){ + withAmount.setPolicyUsingAmt(obj.getAmt()); + break; + } + } + for (TbsBudgetLogWithAmount obj : costCheckingList) { + if(budgetId.equals(obj.getId())&&itemId.equals(obj.getItemid())){ + withAmount.setCostCheckingAmt(obj.getAmt()); + break; + } + } + for (TbsBudgetLogWithAmount obj : policyCheckingList) { + if(budgetId.equals(obj.getId())&&itemId.equals(obj.getItemid())){ + withAmount.setPolicyCheckingAmt(obj.getAmt()); + break; + } + } + + //因为log统计为负数,需要把数值取正 + withAmount.setAllUsingAmt(withAmount.getAllUsingAmt().negate()); + withAmount.setCostUsingAmt(withAmount.getCostUsingAmt().negate()); + withAmount.setCostCheckingAmt(withAmount.getCostCheckingAmt().negate()); + withAmount.setPolicyUsingAmt(withAmount.getPolicyUsingAmt().negate()); + withAmount.setPolicyCheckingAmt(withAmount.getPolicyCheckingAmt().negate()); + //计算剩余及审批合计 + withAmount.setAllCheckingAmt(withAmount.getCostCheckingAmt().add(withAmount.getPolicyCheckingAmt())); + withAmount.setSurplusAmt(withAmount.getFinalAmt().subtract(withAmount.getAllUsingAmt())); + result.add(withAmount); + } + + } +// result.sort( +// Comparator.comparing(TbsBudgetWithAmount::getCenterName) +// .thenComparing(TbsBudgetWithAmount::getScheduleName) +// .thenComparing(TbsBudgetWithAmount::getBudgetName) +// ); + + return result; + } + + @Override + public List 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/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsScheduleItemServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsScheduleItemServiceImpl.java new file mode 100644 index 0000000..3ef3d2c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsScheduleItemServiceImpl.java @@ -0,0 +1,32 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.bms.entity.BmsSubject; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsScheduleItem; +import com.qs.serve.modules.tbs.service.TbsScheduleItemService; +import com.qs.serve.modules.tbs.mapper.TbsScheduleItemMapper; + +import java.util.List; + +/** + * 考核时间项 服务实现类 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsScheduleItemServiceImpl extends ServiceImpl implements TbsScheduleItemService { + + @Override + public List listByScheduleId(Long id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsScheduleItem::getScheduleId,id); + return this.list(lqw); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsScheduleServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsScheduleServiceImpl.java new file mode 100644 index 0000000..2f85c98 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tbs/service/impl/TbsScheduleServiceImpl.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.tbs.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tbs.entity.TbsSchedule; +import com.qs.serve.modules.tbs.service.TbsScheduleService; +import com.qs.serve.modules.tbs.mapper.TbsScheduleMapper; + +/** + * 考核期 服务实现类 + * @author YenHex + * @since 2022-11-08 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TbsScheduleServiceImpl extends ServiceImpl implements TbsScheduleService { + + @Override + public TbsSchedule getByName(String name) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsSchedule::getName,name); + return this.getOne(lqw,false); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalBmsController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalBmsController.java new file mode 100644 index 0000000..972de8f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalBmsController.java @@ -0,0 +1,77 @@ +package com.qs.serve.modules.third; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.TreeUtil; +import com.qs.serve.modules.bms.entity.BmsCostCenter; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.vo.BmsCostCenterTreeVo; +import com.qs.serve.modules.bms.entity.vo.BmsCostCenterVo; +import com.qs.serve.modules.bms.entity.vo.BmsRegionTreeVo; +import com.qs.serve.modules.bms.service.BmsCostCenterService; +import com.qs.serve.modules.bms.service.BmsRegionService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 第三方接口 + * @author YenHex + * @since 2023/9/7 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("thirty/bms") +public class PortalBmsController { + + private BmsCostCenterService bmsCostCenterService; + private BmsRegionService bmsRegionService; + + /** + * 树查询 + * @return + */ + @GetMapping("/center") + public List getTree(){ + List list = bmsCostCenterService.list( + new LambdaQueryWrapper() + .eq(BmsCostCenter::getVisibleFlag,1) + .orderByDesc(BmsCostCenter::getId)); + List treeVoList = list.stream().map(obj-> + CopierUtil.copy(obj,new BmsCostCenterVo()) + ).collect(Collectors.toList()); + for (BmsCostCenterVo centerVo : treeVoList) { + centerVo.setCode("center_"+centerVo.getCode()); + centerVo.setName(centerVo.getName()+"(成本中心)"); + } + LambdaQueryWrapper regionWrapper = new LambdaQueryWrapper<>(); + regionWrapper.eq(BmsRegion::getStopFlag,0); + List bmsRegions = bmsRegionService.list(regionWrapper); + List saleRegionList = bmsRegions.stream().map(obj->{ + BmsCostCenterVo centerVo = new BmsCostCenterVo(); + centerVo.setName(obj.getName()+"(销售区域)"); + centerVo.setCode("saleRegion_"+obj.getCode()); + return centerVo; + }).collect(Collectors.toList()); + treeVoList.addAll(saleRegionList); + return treeVoList; + } + + /** + * 销售区域树 + * @return + */ + @GetMapping("/saleRegionTree") + public List saleRegionTree(){ + return bmsRegionService.getTree(false, 0); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalController.java new file mode 100644 index 0000000..31d2481 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalController.java @@ -0,0 +1,92 @@ +package com.qs.serve.modules.third; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonArray; +import com.qs.serve.common.model.annotation.LimitSubmit; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.enums.BizType; +import com.qs.serve.common.util.JsonUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.seeyon.service.XiaoLuTonService; +import com.qs.serve.modules.sys.service.SysUserLoginService; +import com.qs.serve.modules.third.entity.AptPolicyPayment; +import com.qs.serve.modules.third.entity.param.SSOLoginParam; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +/** + * 【第三方接口】门户接口 + * @author YenHex + * @since 2023/2/14 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("thirty/") +public class PortalController { + + private SysUserLoginService sysUserLoginService; + private VtbVerificationService vtbVerificationService; + + /** + * 单点登录 + * @apiNote headers+ => tenant-id = 001 \n headers+ => v-token = MD5.encrypt('jslApi-'+yyyy-MM-dd) + * @param ssoLoginParam + * @param request + * @return + */ + @LimitSubmit + @SysLog(title = "人员",desc = "单点登陆",biz = BizType.LOGIN) + @PostMapping("/ssoLogin") + public R ssoLogin(@RequestBody SSOLoginParam ssoLoginParam, HttpServletRequest request){ + //ThirdTokenUtil.checkToken(request); + String vToken = request.getHeader("v-token"); + if(!vToken.equals("jslcrm2282125")){ + return R.error("Invalid v-token"); + } + String host = "https://crm.gdjsl.com"; + if(StringUtils.hasText(ssoLoginParam.getRewriteHost())){ + host = ssoLoginParam.getRewriteHost(); + } + Map result = sysUserLoginService.login(ssoLoginParam.getEmpCode()); + String token = (String) result.get("token"); + String jumpTo = StringUtils.hasText(ssoLoginParam.getJumpTo())?ssoLoginParam.getJumpTo():""; + String url = host + "/#/jump?code=001&token="+token+"&jumpTo="+jumpTo; + return R.ok(url); + } + + /** + * 测试连通性 + * @apiNote headers+ => tenant-id = 001 \n headers+ => v-token = MD5.encrypt('jslApi-'+yyyy-MM-dd) + * @param request + * @return + */ + @RequestMapping("/test") + public R testConnect(HttpServletRequest request){ + ThirdTokenUtil.checkToken(request); + return R.ok("connect_success"); + } + + + /** + * 同步错误的支付 + * @apiNote headers+ => tenant-id = 001 \n headers+ => v-token = MD5.encrypt('jslApi-'+yyyy-MM-dd) + * @return + */ + @RequestMapping("/syncErrorPay") + public R sync(){ + vtbVerificationService.toPayRequest(); + return R.ok("sync_success"); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalFlowController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalFlowController.java new file mode 100644 index 0000000..16d265b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalFlowController.java @@ -0,0 +1,96 @@ +package com.qs.serve.modules.third; + +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.oms.service.OmsOrderOptionsService; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.sys.entity.SysSyncLog; +import com.qs.serve.modules.sys.service.SysSyncLogService; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.service.impl.*; +import com.qs.serve.modules.tzc.service.impl.TzcPolicyOperationServiceImpl; +import com.qs.serve.modules.vtb.service.VtbVerificationBatchOperationService; +import com.qs.serve.modules.vtb.service.impl.VtbVerificationOperationServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author YenHex + * @since 2024/5/20 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("thirty/flow") +public class PortalFlowController { + + private final TbsCostApplyOperationServiceImpl tbsCostApplyOperationService; + private final TbsCostTodoOperationServiceImpl tbsCostTodoOperationService; + private final VtbVerificationOperationServiceImpl verificationOperationService; + private final TzcPolicyOperationServiceImpl tzcPolicyOperationService; + private final TbsBudgetApplyOperationServiceImpl tbsBudgetApplyOperationService; + private final TbsBudgetChangeOperationServiceImpl tbsBudgetChangeOperationService; + private final TbsBudgetBatchOperationServiceImpl tbsBudgetBatchOperationService; + private final SysSyncLogService sysSyncLogService; + private final SeeYonRequestService seeYonRequestService; + private final VtbVerificationBatchOperationService vtbVerificationBatchOperationService; + private final OmsOrderOptionsService omsOrderOptionsService; + + @GetMapping("/compenstate/{flowCode}/{formId}") + public R compenstate(@PathVariable("flowCode")String flowCode, + @PathVariable("formId") String formId ){ + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("flow:"+flowCode); + syncLog.setUrl(formId); + //请求转换ID + String targetId = seeYonRequestService.getTargetIdByFormId(flowCode,formId).getData(); + if(targetId==null){ + syncLog.setFailReason("targetIdNull"); + } + syncLog.setRemark(targetId); + sysSyncLogService.save(syncLog); + + if(targetId==null){ + return R.error("formId无效"); + } + + if(TbsSeeYonConst.PolicyConf.Code().equals(flowCode)){ + //政策申请模板 + tzcPolicyOperationService.runCompensate(targetId); + }else if(TbsSeeYonConst.CostApplyConf.Code().equals(flowCode)){ + //费用申请 + tbsCostApplyOperationService.runCompensate(targetId); + }else if(TbsSeeYonConst.CostApplyContractConf.Code().equals(flowCode)){ + //费用申请2-协议类 + tbsCostApplyOperationService.runCompensate(targetId); + }else if(TbsSeeYonConst.CostCheckConf.Code().equals(flowCode)){ + //核销 + verificationOperationService.runCompensate(targetId); + }else if(TbsSeeYonConst.BudgetApplyConf.Code().equals(flowCode)){ + //预算申请 + tbsBudgetApplyOperationService.runCompensate(targetId); + }else if(TbsSeeYonConst.CheckCostAgreeConf.Code().equals(flowCode)){ + //协议条款申请 + tbsCostTodoOperationService.runCompensate(targetId); + }else if(TbsSeeYonConst.BudgetChangeConf.Code().equals(flowCode)){ + //预算 变更申请 + tbsBudgetChangeOperationService.runCompensate(targetId); + }else if(TbsSeeYonConst.BudgetBatchApplyConf.Code().equals(flowCode)){ + //预算 批量变更申请 + tbsBudgetBatchOperationService.runCompensate(targetId); + }else if(TbsSeeYonConst.BatchCostCheckConf.Code().equals(flowCode)){ + //核销 批量申请 + vtbVerificationBatchOperationService.runCompensate(targetId); + }else if(TbsSeeYonConst.ExpiredOrderConf.Code().equals(flowCode)){ + //核销 批量申请 + omsOrderOptionsService.runCompensate(targetId); + }else { + return R.error("业务["+flowCode+"]未被收录"); + } + return R.ok(flowCode); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalFormPushController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalFormPushController.java new file mode 100644 index 0000000..9be0295 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalFormPushController.java @@ -0,0 +1,120 @@ +package com.qs.serve.modules.third; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.wx.entity.WxFormPushType; +import com.qs.serve.modules.wx.entity.WxFormPushUser; +import com.qs.serve.modules.wx.entity.WxUser; +import com.qs.serve.modules.wx.entity.bo.WxFormPushThirdBo; +import com.qs.serve.modules.wx.entity.dto.sms.WxSmsNewForm; +import com.qs.serve.modules.wx.entity.vo.WxPushResultVo; +import com.qs.serve.modules.wx.service.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.wx.entity.WxFormPush; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 【第三方接口】 表单推送 + * @author YenHex + * @since 2023-04-19 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("thirty/formPush") +public class PortalFormPushController { + + private WxFormPushService wxFormPushService; + private WxFormPushUserService wxFormPushUserService; + private WxUserService wxUserService; + private WxPushService wxPushService; + private WxFormPushTypeService wxFormPushTypeService; + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/publish") + public R save(@RequestBody @Valid WxFormPushThirdBo param, HttpServletRequest request){ + //ThirdTokenUtil.checkToken(request); + WxFormPush entity = CopierUtil.copy(param,new WxFormPush()); + entity.setStatus("1"); + entity.setPublishTime(LocalDateTime.now()); + wxFormPushService.save(entity); + WxFormPushType pushType = null; + if(param.getTypeCode()!=null){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(WxFormPushType::getCode,param.getTypeCode()); + pushType = wxFormPushTypeService.getOne(lqw,false); + if(pushType==null){ + entity.setTypeId(pushType.getId()); + entity.setTypeName(pushType.getTitle()); + } + } + List userCodes = param.getUserCodes().stream().distinct().collect(Collectors.toList()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(WxUser::getAppId,param.getAppId()); + lqw.in(WxUser::getSysUserCode,userCodes); + List wxUserList = wxUserService.list(lqw); + List userCodes2 = wxUserList.stream().map(WxUser::getSysUserCode).distinct().collect(Collectors.toList()); + List pushUserList = new ArrayList<>(); + Set wxUserIdSet = new HashSet<>(); + for (WxUser wxUser : wxUserList) { + if (wxUser.getOpenId().equals("0")) { + continue; + } + boolean exist = wxUserIdSet.stream().anyMatch(a->a.equals(wxUser.getOpenId())); + if(exist){ + continue; + }else { + wxUserIdSet.add(wxUser.getOpenId()); + } + WxSmsNewForm wxSmsNewForm = new WxSmsNewForm(); + wxSmsNewForm.setTitle(param.getTitle()); + wxSmsNewForm.setUserName(wxUser.getEmpName()); + wxSmsNewForm.setBizType(param.getBusinessType()==null?"通知":param.getBusinessType()); + wxSmsNewForm.setBitTime(LocalDateTime.now().toString().replace("T"," ")); + wxSmsNewForm.setRemark(param.getRemark()); + wxPushService.sendWxMsg(wxUser,"表单通知",wxSmsNewForm,true,entity.getId()); + WxFormPushUser pushUser = new WxFormPushUser(); + pushUser.setFormPushId(entity.getId()); + pushUser.setFormTitle(entity.getTitle()); + pushUser.setUserId(wxUser.getSysUserId()); + pushUser.setUserCode(wxUser.getSysUserCode()); + pushUser.setUserName(wxUser.getEmpName()); + if(pushType!=null){ + pushUser.setTypeId(pushType.getId()); + pushUser.setTypeCode(pushType.getCode()); + pushUser.setTypeName(pushType.getTitle()); + } + pushUserList.add(pushUser); + } + wxFormPushUserService.saveBatch(pushUserList); + List userCodes3 = userCodes.stream().filter(a->!userCodes2.contains(a)).collect(Collectors.toList()); + WxPushResultVo resultVo = new WxPushResultVo(); + resultVo.setNotBindUserCodeList(userCodes3); + return R.ok(resultVo); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalGoodsController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalGoodsController.java new file mode 100644 index 0000000..371de2a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalGoodsController.java @@ -0,0 +1,186 @@ +package com.qs.serve.modules.third; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.oms.entity.dto.OmsSpuToSkuKey; +import com.qs.serve.modules.oms.entity.dto.OmsSpuToSkuKey2; +import com.qs.serve.modules.sys.entity.SysDictData; +import com.qs.serve.modules.sys.service.SysDictDataService; +import com.qs.serve.modules.third.entity.GoodsToSkuParam; +import com.qs.serve.modules.third.entity.param.SkuToGetSpuParam; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/10/16 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("thirty/goods") +public class PortalGoodsController { + + private GoodsSkuService goodsSkuService; + private GoodsSpuService goodsSpuService; + private SysDictDataService dictDataService; + + /** + * 通过invCode获取spuCode + * @param param + * @return + */ + @PostMapping("getSpuBySku") + public List getSpuBySku(@RequestBody SkuToGetSpuParam param){ +// LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); +// lqw.eq(SysDictData::getGroupKey,"book-code-to-belong"); +// List sysDictDataList = dictDataService.list(lqw); +// String placeName = null; +// for (SysDictData dictData : sysDictDataList) { +// if(dictData.getKeyVal().equals(param.getPlaceName())){ +// placeName = dictData.getLabel(); +// } +// } +// if(placeName==null){ +// log.warn("字典缺账套{}配置",param.getPlaceName()); +// Assert.throwEx("缺账套["+param.getPlaceName()+"]配置"); +// } + String placeName = param.getPlaceName(); + + List skuList = goodsSkuService.getByCodes(param.getInvCodes()); + List specialSkuKey = new ArrayList<>(); + List normalSkuKey = new ArrayList<>(); + List unMatchSkuKey = new ArrayList<>(); + + + List spuIds = skuList.stream().filter(a->a.getSpecialFlag()!=1) + .map(a->a.getSpuId()).collect(Collectors.toList()); + + if(CollUtil.isEmpty(spuIds)){ + return new ArrayList<>(); + } + LambdaQueryWrapper spuLqw = new LambdaQueryWrapper<>(); + spuLqw.eq(GoodsSpu::getOrderFlag,1); + spuLqw.eq(GoodsSpu::getShelf,1); + spuLqw.in(GoodsSpu::getId,spuIds); + List spuList = goodsSpuService.list(spuLqw); + spuIds = spuList.stream().map(a->a.getId()).collect(Collectors.toList()); + + if(spuIds.size()==0){ + spuIds.add(0L); + } + + LambdaQueryWrapper skuLqw = new LambdaQueryWrapper<>(); + skuLqw.eq(GoodsSku::getBelong,placeName); + skuLqw.eq(GoodsSku::getOrderFlag,1); + skuLqw.eq(GoodsSku::getEnable,1); + skuLqw.in(GoodsSku::getSpuId,spuIds); + List normalSkus = goodsSkuService.list(skuLqw); + + LambdaQueryWrapper skuLqw2 = new LambdaQueryWrapper<>(); + skuLqw2.eq(GoodsSku::getBelong,"开平"); + skuLqw2.eq(GoodsSku::getOrderFlag,1); + skuLqw2.eq(GoodsSku::getEnable,1); + skuLqw2.in(GoodsSku::getSpuId,spuIds); + List kpSkus = goodsSkuService.list(skuLqw2); + + for (GoodsSku sku : skuList) { + if(sku.getSpecialFlag()==1){ + //特殊品不转换 + OmsSpuToSkuKey skuKey = new OmsSpuToSkuKey(); + skuKey.setInvCode(sku.getSkuCode()); + skuKey.setWeight(sku.getWeight().toString()); + skuKey.setVolume(sku.getVolume().toString()); + skuKey.setSourceInvCode(sku.getSkuCode()); + specialSkuKey.add(skuKey); + }else{ + Boolean matchFlag = false; + for(GoodsSku normalsku:normalSkus){ + //相同SPUID,取值 + if(normalsku.getSpuId().equals(sku.getSpuId())){ + OmsSpuToSkuKey skuKey = new OmsSpuToSkuKey(); + skuKey.setInvCode(normalsku.getSkuCode()); + skuKey.setWeight(normalsku.getWeight().toString()); + skuKey.setVolume(normalsku.getVolume().toString()); + skuKey.setSourceInvCode(sku.getSkuCode()); + normalSkuKey.add(skuKey); + matchFlag = true; + break; + } + } + //没有匹配的SKU,换成KP + if(!matchFlag){ + for(GoodsSku kpSku:kpSkus) { + if(kpSku.getSpuId().equals(sku.getSpuId())){ + OmsSpuToSkuKey skuKey = new OmsSpuToSkuKey(); + skuKey.setInvCode(kpSku.getSkuCode()); + skuKey.setWeight(kpSku.getWeight().toString()); + skuKey.setVolume(kpSku.getVolume().toString()); + skuKey.setSourceInvCode(sku.getSkuCode()); + unMatchSkuKey.add(skuKey); + break; + } + } + } + } + } + + + + List skuKeys = new ArrayList<>(); + skuKeys.addAll(specialSkuKey); + skuKeys.addAll(normalSkuKey); + skuKeys.addAll(unMatchSkuKey); + + + return skuKeys; + } + + /** + * 通过invCode获取spuCode + * @param param + * @return + */ + @PostMapping("matchInvCode") + public List matchInvCode(@RequestBody GoodsToSkuParam param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SysDictData::getGroupKey,"book-code-to-belong"); + List sysDictDataList = dictDataService.list(lqw); + String placeName = null; + for (SysDictData dictData : sysDictDataList) { + if(dictData.getKeyVal().equals(param.getPlaceName())){ + placeName = dictData.getLabel(); + } + } + if(placeName==null){ + log.warn("字典缺账套{}配置",param.getPlaceName()); + placeName = "开平"; + } + return goodsSpuService.getSpuToSkuInfo(placeName, param.getSpuCodes()); + } + + /** + * 通过invCode获取spuCode + * @return + */ + @PostMapping("belongPlace") + public List getSpuBySku(){ + return goodsSkuService.getBelongPlace(); + } + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalOfCostController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalOfCostController.java new file mode 100644 index 0000000..08fbe90 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalOfCostController.java @@ -0,0 +1,340 @@ +package com.qs.serve.modules.third; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.JsonUtil; +import com.qs.serve.modules.bir.consts.BirActivityCenterGoodsUtil; +import com.qs.serve.modules.pay.entity.bo.PayPaymentBo; +import com.qs.serve.modules.sys.entity.SysSyncLog; +import com.qs.serve.modules.sys.service.SysDeleteLogService; +import com.qs.serve.modules.sys.service.SysSyncLogService; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper; +import com.qs.serve.modules.third.entity.*; +import com.qs.serve.modules.third.entity.param.DHXDelCostParam; +import com.qs.serve.modules.third.service.PortalOfCost2Application; +import com.qs.serve.modules.third.service.PortalOfCostApplication; +import com.qs.serve.modules.third.service.PortalOfCostPartApplication; +import com.qs.serve.modules.vtb.common.VtbVerificationState; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; +import com.qs.serve.modules.vtb.entity.dto.VtbVerificationCodesDTO; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import com.qs.serve.modules.vtb.service.VtbVerificationSubjectService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.*; + +/** + * 【第三方接口】核销系统 + * @author YenHex + * @since 2023/2/14 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("thirty/cost") +public class PortalOfCostController { + + private VtbVerificationMapper vtbVerificationMapper; + private VtbVerificationService vtbVerificationService; + private VtbVerificationSubjectService verificationSubjectService; + private PortalOfCostApplication portalOfCostApplication; + private PortalOfCost2Application portalOfCost2Application; + private SysSyncLogService sysSyncLogService; + private PortalOfCostPartApplication portalOfCostPartApplication; + private TbsCostApplyMapper tbsCostApplyMapper; + private SysDeleteLogService deleteLogService; + + /** + * 删除DHX费用(调度系统调用的) + * @param param + * @return + */ + @PostMapping("removeDhxCost") + @Transactional(rollbackFor = Exception.class) + public R removeDhxCost(@RequestBody DHXDelCostParam param){ + if(!param.getCode().contains("DHX")){ + return R.error("非DHX费用,不支持删除"); + } + //赠品按照新的流程,是不用删ERP的赠品费用的 + boolean skipPayFlag = true; + List costApplys = tbsCostApplyMapper.selectList(new LambdaQueryWrapper() + .eq(TbsCostApply::getCode,param.getCode())); + if(costApplys.size()>0){ + TbsCostApply costApply = costApplys.get(0); + Long costApplyId = costApply.getId(); + deleteLogService.deleteCostApply(costApplyId,param.getRemark(),skipPayFlag,param.getUserCode()); + try { + BirActivityCenterGoodsUtil.buildBir(costApplyId); + } catch (Exception e) { + e.printStackTrace(); + } + } + return R.ok(); + } + + /** + * 一站式创建费用(费用申请) + * 单成本中心 + * @param createBo + * @return + */ + @PostMapping("createByCostApply") + public R createCostProcess2(@Valid @RequestBody ProcessCreateCostApplyBo createBo,HttpServletRequest request){ + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("一站式费用"); + syncLog.setUrl(request.getRequestURI()); + syncLog.setRequestJson(JsonUtil.objectToJson(createBo)); + syncLog.setEntityClass(ProcessCreateCostApplyBo.class.getName()); + try { + ThirdTokenUtil.checkToken(request); + portalOfCostApplication.createCostProcess(createBo); + syncLog.setSuccessStatus(1); + } catch (Exception e) { + log.error("站式创建费用(费用申请)===>{}", JsonUtil.objectToJson(createBo)); + 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("支付异常"); + } + + /** + * 一站式创建费用(费用申请,赠品,赔付单) + * 支持多成本中心 + * @param createBo + * @return + */ + @PostMapping("createByCostApplyMulti") + public R createCostProcess(@RequestBody ProcessCreateCostApplyBo createBo,HttpServletRequest request){ + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("一站式费用"); + syncLog.setUrl(request.getRequestURI()); + syncLog.setRequestJson(JsonUtil.objectToJson(createBo)); + syncLog.setEntityClass(ProcessCreateCostApplyBo.class.getName()); + try { + ThirdTokenUtil.checkToken(request); + portalOfCost2Application.createCostProcess(createBo); + syncLog.setSuccessStatus(1); + } catch (Exception e) { + log.error("站式创建费用(费用申请)===>{}", JsonUtil.objectToJson(createBo)); + 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("支付异常"); + } + + + /** + * 协议类费用 核销支付记录 + * @param createBo + * @return + */ + @PostMapping("createByContractCheck") + public R createByContractCheck(@Valid @RequestBody ProcessCreateContractCheckBo createBo, HttpServletRequest request){ + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("协议类核销支付"); + syncLog.setUrl(request.getRequestURI()); + syncLog.setRequestJson(JsonUtil.objectToJson(createBo)); + syncLog.setEntityClass(ProcessCreateCostApplyBo.class.getName()); + try { + ThirdTokenUtil.checkToken(request); + portalOfCostApplication.createByContractCheck(createBo); + syncLog.setSuccessStatus(1); + } catch (Exception e) { + log.error("协议类核销支付(费用申请)===>{}", JsonUtil.objectToJson(createBo)); + 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("支付异常"); + } + + /** + * 回调补偿因事务导致数据错误的数据 + * @param costId + * @return + */ + @GetMapping("/checkContractCheck") + public R checkContractCheck(Long costId){ + portalOfCostApplication.updateCostUsedAmount(costId); + return R.ok(); + } + + /** + * 协议类费用 释放接口 + * @param contractBo + * @return + */ + @PostMapping("releaseContractCost") + public R releaseContractCost(@Valid @RequestBody ProcessReleaseContractBo contractBo, HttpServletRequest request){ + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("协议类释放"); + syncLog.setUrl(request.getRequestURI()); + syncLog.setRequestJson(JsonUtil.objectToJson(contractBo)); + syncLog.setEntityClass(ProcessCreateCostApplyBo.class.getName()); + try { + ThirdTokenUtil.checkToken(request); + portalOfCostApplication.releaseContractCost(contractBo); + syncLog.setSuccessStatus(1); + } catch (Exception e) { + log.error("协议类核销支付(费用申请)===>{}", JsonUtil.objectToJson(contractBo)); + 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("支付异常"); + } + + /** + * 协议类费用 释放接口 + * @param contractBo + * @return + */ + @PostMapping("releaseContractNoPay") + public R releaseContractNoPay(@Valid @RequestBody PayPaymentBo contractBo, HttpServletRequest request){ + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("协议类不再支付"); + syncLog.setUrl(request.getRequestURI()); + syncLog.setRequestJson(JsonUtil.objectToJson(contractBo)); + syncLog.setEntityClass(ProcessCreateCostApplyBo.class.getName()); + try { + ThirdTokenUtil.checkToken(request); + portalOfCostPartApplication.toContractNotPay(contractBo); + syncLog.setSuccessStatus(1); + } catch (Exception e) { + log.error("协议类不再支付===>{}", JsonUtil.objectToJson(contractBo)); + 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("不再支付异常"); + } + + /** + * 一站式创建费用(费用申请,根据东哥的数据关联政策生成) + * @param createBo + * @return + */ + @PostMapping("createCostApplyByPolicy") + public R createCostProcessByPolicy(@Valid @RequestBody ProcessCreatePolicyCostBo createBo,HttpServletRequest request){ + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("一站式费用ByDong"); + syncLog.setUrl(request.getRequestURI()); + syncLog.setRequestJson(JsonUtil.objectToJson(createBo)); + syncLog.setEntityClass(ProcessCreateCostApplyBo.class.getName()); + try { + ThirdTokenUtil.checkToken(request); + portalOfCostApplication.createCostProcessByPolicy(createBo); + syncLog.setSuccessStatus(1); + } catch (Exception e) { + log.error("站式创建费用(费用申请)===>{}", JsonUtil.objectToJson(createBo)); + e.printStackTrace(); + 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("创建异常"); + } + + /** + * 一站式删除政策费用(费用申请,根据东哥的数据关联政策生成) + * @param recId + * @return + */ + @GetMapping("deleteCostApplyByPolicy") + public R deleteCostApplyByPolicy(String recId,HttpServletRequest request){ + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("一站式删除费用ByDong"); + syncLog.setUrl(request.getRequestURI()); + syncLog.setRequestJson(JsonUtil.objectToJson(recId)); + syncLog.setEntityClass(ProcessCreateCostApplyBo.class.getName()); + try { + ThirdTokenUtil.checkToken(request); + portalOfCostApplication.deleteCostProcessByPolicy(recId); + syncLog.setSuccessStatus(1); + } catch (Exception e) { + log.error("一站式删除政策费用(费用申请)===>{}", JsonUtil.objectToJson(recId)); + e.printStackTrace(); + 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("删除异常"); + } + + /** + * 伟成那边调用,用于排查遗漏的核销 + * @param codesDTO + * @return + */ + @PostMapping("/updateCheckSyncPayFlag") + public R updateSyncPayFlag(@RequestBody VtbVerificationCodesDTO codesDTO){ + String verifyCode = codesDTO.getCode().trim(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(VtbVerification::getId,VtbVerification::getVerificationCode) + .eq(VtbVerification::getVerificationCode,verifyCode) + .eq(VtbVerification::getVerificationState, VtbVerificationState.Finished.getCode()); + VtbVerification verification = vtbVerificationService.getOne(lqw,false); + //需要做兼容,code返回有主表和item表的code + if(verification==null){ + VtbVerificationSubject verificationSubject = verificationSubjectService.getByVerificationSubjectCode(verifyCode); + if(verificationSubject==null){ + return R.error("code not found"); + } + verificationSubject.setSyncPayFlag(1); + verificationSubjectService.updateById(verificationSubject); + //更新到主表 + LambdaQueryWrapper countLqw = new LambdaQueryWrapper<>(); + countLqw.eq(VtbVerificationSubject::getVerificationId,verificationSubject.getVerificationId()); + countLqw.eq(VtbVerificationSubject::getSyncPayFlag,0); + long c = verificationSubjectService.count(countLqw); + if(c==0){ + VtbVerification verification1 = vtbVerificationMapper.selectById(verificationSubject.getVerificationId()); + vtbVerificationMapper.updateSyncPayStatus(Arrays.asList(verification1.getVerificationCode())); + } + }else { + vtbVerificationMapper.updateSyncPayStatus(Arrays.asList(verifyCode)); + } + return R.ok(); + } + + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalOfCostRmController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalOfCostRmController.java new file mode 100644 index 0000000..8726850 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalOfCostRmController.java @@ -0,0 +1,28 @@ +package com.qs.serve.modules.third; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author YenHex + * @since 2025/2/24 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("thirty/cost") +public class PortalOfCostRmController { + + /** + * 移除试吃品费用 + */ + @PostMapping("/rmSHXCost") + public void rmShxSpuCost(){ + + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalOfCostTestController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalOfCostTestController.java new file mode 100644 index 0000000..7e25b1a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalOfCostTestController.java @@ -0,0 +1,98 @@ +package com.qs.serve.modules.third; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.JsonUtil; +import com.qs.serve.modules.bms.entity.BmsSubject; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsSubjectService; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.pay.entity.bo.PayPaymentBo; +import com.qs.serve.modules.sys.entity.SysSyncLog; +import com.qs.serve.modules.sys.service.SysSyncLogService; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.service.TbsActivityService; +import com.qs.serve.modules.third.entity.ProcessCreateContractCheckBo; +import com.qs.serve.modules.third.entity.ProcessCreateCostApplyBo; +import com.qs.serve.modules.third.entity.ProcessCreatePolicyCostBo; +import com.qs.serve.modules.third.entity.ProcessReleaseContractBo; +import com.qs.serve.modules.third.service.PortalOfCostApplication; +import com.qs.serve.modules.third.service.PortalOfCostPartApplication; +import com.qs.serve.modules.third.util.ThirtyVerificationUtil; +import com.qs.serve.modules.vtb.common.VtbVerificationState; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; +import com.qs.serve.modules.vtb.entity.dto.VtbVerificationCodesDTO; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import com.qs.serve.modules.vtb.service.VtbVerificationSubjectService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.Arrays; +import java.util.List; + +/** + * 【第三方接口】核销系统 + * @author YenHex + * @since 2023/2/14 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("thirty/test") +public class PortalOfCostTestController { + + private VtbVerificationMapper vtbVerificationMapper; + private VtbVerificationService vtbVerificationService; + private VtbVerificationSubjectService verificationSubjectService; + private PortalOfCostApplication portalOfCostApplication; + private SysSyncLogService sysSyncLogService; + private PortalOfCostPartApplication portalOfCostPartApplication; + private TbsActivityService activityService; + private BmsSupplierService supplierService; + private BmsSubjectService subjectService; + private PortalOfCostController portalOfCostController; + + @PostMapping("/demo2") + public R demo2(HttpServletRequest request){ + //一站式费用 + Long[] as = new Long[]{ + 8701L,17980L,17982L,17984L + }; + List syncLogList = sysSyncLogService.listByIds(Arrays.asList(as)); + for (SysSyncLog syncLog : syncLogList) { + if(syncLog.getFromPlat().equals("一站式费用")){ + ProcessCreateCostApplyBo createBo = JsonUtil.jsonToPojo(syncLog.getRequestJson(),ProcessCreateCostApplyBo.class); + portalOfCostController.createCostProcess(createBo,request); + } + } + return R.ok(); + } + + //@PostMapping("/demo1") + public R demo1(){ + //Assert.throwEx("DEV"); + VtbVerification verification = vtbVerificationService.getById(10477174L); + String COST_TO_PAY_API = "http://192.168.10.18:9003/api/cms/api/add"; + TbsActivity activity = activityService.getById(verification.getActivityId()); + BmsSupplier supplier = supplierService.getById(activity.getSupplierId()); + BmsSubject subject = subjectService.getById(67); + + String json = ThirtyVerificationUtil.buildJson(supplier, subject, verification.getAmount() + , activity,activity.getActStartDate().atStartOfDay(),activity.getActEndDate().atTime(23,59,59), verification); + SysSyncLog syncLog = ThirtyVerificationUtil.requestToPayment("to支付请求",verification.getVerificationCode(), COST_TO_PAY_API, json); + syncLog.setTodoState(1); + sysSyncLogService.save(syncLog); + return R.ok(); + } + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalPolicyController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalPolicyController.java new file mode 100644 index 0000000..430b806 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalPolicyController.java @@ -0,0 +1,21 @@ +package com.qs.serve.modules.third; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author YenHex + * @since 2024/1/31 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("thirty/policy") +public class PortalPolicyController { + + + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalSupplierController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalSupplierController.java new file mode 100644 index 0000000..853a872 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/PortalSupplierController.java @@ -0,0 +1,144 @@ +package com.qs.serve.modules.third; + +import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.pagehelper.PageHelper; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.consts.RedisCacheKeys; +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.bms.controller.my.BmsSupplierMyController; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierComRegion; +import com.qs.serve.modules.bms.entity.bo.BmsSupplierBo; +import com.qs.serve.modules.bms.entity.bo.BmsSupplierExcelBo; +import com.qs.serve.modules.bms.entity.bo.BmsSupplierParentBo; +import com.qs.serve.modules.bms.entity.vo.BmsSupplierTreeVo; +import com.qs.serve.modules.bms.mapper.BmsSupplierComRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.*; +import com.qs.serve.modules.his.entity.HisUserSupplier; +import com.qs.serve.modules.his.service.HisUserSupplierService; +import com.qs.serve.modules.sys.entity.SysSyncLog; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.entity.bo.SysRelateSuppliersParam; +import com.qs.serve.modules.sys.entity.bo.SysRelateSuppliersParam2; +import com.qs.serve.modules.sys.entity.dto.SysUserSimpleVo; +import com.qs.serve.modules.sys.entity.dto.SysUserVo; +import com.qs.serve.modules.sys.service.SysAttachService; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.service.SysSyncLogService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsCenterType; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.service.TbsBudgetService; +import com.qs.serve.modules.third.entity.ProcessCreateCostApplyBo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 基础档案 客户 + * @author YenHex + * @since 2022-10-10 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("thirty/supplier") +public class PortalSupplierController { + + private BmsSupplierService bmsSupplierService; + + private SysSyncLogService sysSyncLogService; + + + + /** + * 根据ID更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @PreAuthorize("hasRole('bms:supplier:update')") + public R updateById(@RequestBody BmsSupplierBo param, HttpServletRequest request){ + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("更新客户"); + syncLog.setUrl(request.getRequestURI()); + syncLog.setRequestJson(JsonUtil.objectToJson(param)); + syncLog.setEntityClass(BmsSupplierBo.class.getName()); + try { + ThirdTokenUtil.checkToken(request); + + if(param.getId()==null){ + Assert.throwEx("id不能为空"); + } + BmsSupplier supplier = new BmsSupplier(); + CopierUtil.copy(param,supplier); + bmsSupplierService.updateById(supplier); + syncLog.setSuccessStatus(1); + } catch (Exception e) { + log.error("更新客户===>{}", JsonUtil.objectToJson(param)); + 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("更新客户异常"); + } + + + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @PreAuthorize("hasRole('bms:supplier:insert')") + public R save(@RequestBody @Valid BmsSupplierBo param, HttpServletRequest request){ + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("新建客户"); + syncLog.setUrl(request.getRequestURI()); + syncLog.setRequestJson(JsonUtil.objectToJson(param)); + syncLog.setEntityClass(BmsSupplierBo.class.getName()); + try { + ThirdTokenUtil.checkToken(request); + + BmsSupplier supplier = new BmsSupplier(); + CopierUtil.copy(param,supplier); + bmsSupplierService.save(supplier); + syncLog.setSuccessStatus(1); + } catch (Exception e) { + log.error("新建客户===>{}", JsonUtil.objectToJson(param)); + 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/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/ThirdTokenUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/ThirdTokenUtil.java new file mode 100644 index 0000000..8ccb22c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/ThirdTokenUtil.java @@ -0,0 +1,59 @@ +package com.qs.serve.modules.third; + +import cn.hutool.crypto.SecureUtil; +import com.qs.serve.common.config.DevEnvironmentConfig; +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.third.consts.ThirtyConst; +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.http.HttpServletRequest; +import java.time.LocalDate; + +/** + * @author YenHex + * @since 2023/3/11 + */ +@Slf4j +public class ThirdTokenUtil { + + public static void checkToken(HttpServletRequest request) { + String time = LocalDate.now().toString(); + String match = SecureUtil.md5(ThirtyConst.PREFIX_MD5_VALUE + time); + String token = request.getHeader(ThirtyConst.TOKEN_API_PARAM); + if(1==1){ + return; + } + if(token==null||!token.equalsIgnoreCase(match)){ + if(DevEnvironmentConfig.isDev()){ + log.debug("HttpServletRequest v-token==>{}",token); + log.error("v-token==>"+match); + Assert.throwEx("请求头 v-token 为空。或token无效"); + } + Assert.throwEx("err"); + } + } + + public static String makeToken() { + String time = LocalDate.now().toString(); + String token = SecureUtil.md5("jslApi-" + time); + return token; + } + + public static void main(String[] args) { + String token = makeToken(); + System.out.println(token); + + String time = LocalDate.now().toString(); + String match = cn.hutool.crypto.SecureUtil.md5( "jslApi-" + time); + + if(token==null||!token.equalsIgnoreCase(match)){ + if(DevEnvironmentConfig.isDev()){ + log.error("v-token==>"+match); + Assert.throwEx("请求头 v-token 为空。或token无效"); + } + Assert.throwEx("err"); + } + + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/consts/ThirtyConst.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/consts/ThirtyConst.java new file mode 100644 index 0000000..2930aa8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/consts/ThirtyConst.java @@ -0,0 +1,12 @@ +package com.qs.serve.modules.third.consts; + +/** + * @author YenHex + * @since 2023/2/27 + */ +public class ThirtyConst { + + public static final String TOKEN_API_PARAM = "v-token"; + public static final String PREFIX_MD5_VALUE = "jslApi-"; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/AptPolicyPayment.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/AptPolicyPayment.java new file mode 100644 index 0000000..fe9161b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/AptPolicyPayment.java @@ -0,0 +1,74 @@ +package com.qs.serve.modules.third.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +/** + * @author YenHex + * @since 2023/3/15 + */ +@Data +public class AptPolicyPayment { + + private Long id; + + @TableField(value = "aptifee_dingDanHao") + private String orderNo; + + @TableField(value = "aptifee_quDaoZheCeHao") + private String policyItemCode; + + @TableField(value = "aptifee_jingXiaoShangHao") + private String cusCode; + + @TableField(value = "aptifee_chanPinHao") + private String invCode; + + @TableField(value = "aptifee_kaiShiShiJian") + private Date startDate; + + @TableField(value = "aptifee_jieShuShiJian") + private Date endDate; + + @TableField(value = "aptifee_jinE") + private BigDecimal amount; + + @TableField(value = "aptifee_keMuHao") + private String subjectCode; + + @TableField(value = "aptifee_status") + private String status; + + /** 发票号 */ + @TableField(value = "aptifee_erpHao") + private String billCode; + + @TableField(value = "aptifee_erpZhuTi") + private String title; + + /** 核销编号 */ + @TableField(value = "apticlaimfb_recid") + private String checkCostCode; + + @TableField(value = "aptifee_isQuXiao") + private Integer cancelFlag; + + @TableField(value = "aptifee_create_date") + private Date createTime; + + @TableField(value = "aptifee_deal_date") + private Date dealTime; + + @TableField(value = "deleteId") + private String deleteId; + + @TableField(value = "aptifee_chengBenZhongXin") + private String centerCode; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/GoodsToSkuParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/GoodsToSkuParam.java new file mode 100644 index 0000000..0a5fcc4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/GoodsToSkuParam.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.third.entity; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/11/6 + */ +@Data +public class GoodsToSkuParam { + + String placeName; + List spuCodes; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessCenterItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessCenterItem.java new file mode 100644 index 0000000..b834e83 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessCenterItem.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.third.entity; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/2/14 + */ +@Data +public class ProcessCenterItem { + + private String centerType; + private String centerCode; + private BigDecimal centerRate; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessCreateContractCheckBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessCreateContractCheckBo.java new file mode 100644 index 0000000..586ff93 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessCreateContractCheckBo.java @@ -0,0 +1,32 @@ +package com.qs.serve.modules.third.entity; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/11/13 + */ +@Data +public class ProcessCreateContractCheckBo { + + /** 费用编码 */ + private String costCode; + + /** 核销与支付金额 */ + private BigDecimal amount; + + /** 发票号 */ + private String billNumber; + + /** 发货单号 */ + private String dispatchCode; + + /** 业务人员编码 */ + private String userCode; + + /** 核销与支付备注 */ + private String remark; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessCreateCostApplyBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessCreateCostApplyBo.java new file mode 100644 index 0000000..2a73b81 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessCreateCostApplyBo.java @@ -0,0 +1,79 @@ +package com.qs.serve.modules.third.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; + +/** + * @author YenHex + * @since 2023/2/14 + */ +@Data +public class ProcessCreateCostApplyBo { + + /** 员工编码(申请人/操作人) */ + @NotNull(message = "员工编码 不能为空") + private String userCode; + + /** 费用编码 */ + @NotNull(message = "费用编码 不能为空") + private String costCode; + + /** 费用主题 */ + @NotNull(message = "费用主题 不能为空") + private String costTheme; + + private String centerCode; + + private List centerList; + + /** 活动标题(可为空) */ + private String activityTitle; + + /** 客户编号 */ + @NotNull(message = "客户编码 不能为空") + private String customerCode; + + /** 发货单号 */ + private String erpCode; + + /** 发票号 */ + private String billNumber; + + /** 客户所属 */ + private String customerBelong; + + /** 统计金额 */ + @NotNull(message = "合计金额 不能为空") + private BigDecimal totalAmount; + + /** 科目编码 */ + @NotNull(message = "科目编码 不能为空") + private String subjectCode; + + @NotNull(message = "存货编码 不能为空") + private List goodsList; + + @NotNull(message = "开始时间 不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate startDate; + + @NotNull(message = "结束时间 不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate endDate; + + private String remark; + + /** + * 不进行支付,目前只支持赠品类费用 + */ + private Integer ignorePayFlag; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessCreatePolicyCostBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessCreatePolicyCostBo.java new file mode 100644 index 0000000..65d77b4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessCreatePolicyCostBo.java @@ -0,0 +1,72 @@ +package com.qs.serve.modules.third.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author YenHex + * @since 2023/2/14 + */ +@Data +public class ProcessCreatePolicyCostBo { + + /** 政策明细编码 */ + @NotNull(message = "政策明细编码 不能为空") + private String policyItemCode; + + /** 员工编码(申请人/操作人) */ + @NotNull(message = "员工编码 不能为空") + private String userCode; + + /** 暂无应用场景,记录在支付表(可为空) */ + private String erpCode; + + /** 费用编码 */ + @NotNull(message = "费用编码 不能为空") + private String costCode; + + /** 费用主题 */ + @NotNull(message = "费用主题 不能为空") + private String costTheme; + + /** 发票号 */ + @NotNull(message = "发票号 不能为空") + private String billNumber; + + /** 统计金额 */ + @NotNull(message = "合计金额 不能为空") + private BigDecimal totalAmount; + + @NotNull(message = "存货编码 不能为空") + private List goodsList; + + /** 拓展:是否保存核销到中间库 aptclaim,0->不保存(默认);1->保存 */ + private Integer toSaveCostCheckFlag; + + /** 拓展:是否保存支付到中间库 xlt,0->不保存(默认);1->保存 */ + private Integer toSavePaymentFlag; + + /** + * 唯一标识 + */ + private String recId; + + /** + * 忽略时间 + */ + private Integer ignoreTime; + + /** + * 初始化时间,当ignoreTime=1时必传 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate initTime; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessGoodsItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessGoodsItem.java new file mode 100644 index 0000000..51676a8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessGoodsItem.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.third.entity; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/2/14 + */ +@Data +public class ProcessGoodsItem { + + /** 存货档案编码(SKU_CODE) */ + private String inventoryCode; + + /** 数量 */ + private Integer number; + + /** 单价 */ + private BigDecimal price; + + /** 合计 = 单价 * 数量 */ + private BigDecimal amount; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessReleaseContractBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessReleaseContractBo.java new file mode 100644 index 0000000..60206b7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessReleaseContractBo.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.third.entity; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/11/13 + */ +@Data +public class ProcessReleaseContractBo { + + /** 费用编码 */ + private String costCode; + + /** 核销与支付备注 */ + private String remark; + + /** 业务操作人 */ + private String userCode; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessUnPayContractBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessUnPayContractBo.java new file mode 100644 index 0000000..3557949 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ProcessUnPayContractBo.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.third.entity; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/11/13 + */ +@Data +public class ProcessUnPayContractBo { + + /** 核销编码 */ + private String checkCode; + + /** 不再支付金额 */ + private BigDecimal noPayAmt; + + /** 核销与支付备注 */ + private String remark; + + /** 业务操作人 */ + private String userCode; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ThirtyVerification.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ThirtyVerification.java new file mode 100644 index 0000000..b0e8388 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/ThirtyVerification.java @@ -0,0 +1,198 @@ +package com.qs.serve.modules.third.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.*; +import java.math.BigDecimal; + +/** + * @version 1.0 + * @Author Ken Tam + * @Date 2023-09-07 9:01 + * @注释 CMS已经完成的核销单实体类 + */ +@Getter +@Setter +public class ThirtyVerification { + + private String cAcc; + + /** + * 原销路通中间表 apticlaimNum + */ + @NotNull(message = "核销编码不能为空") + @Size(max = 30,min = 1,message = "编码长度不符合要求") + private String verificationCode; + + + /** + * 活动主题 + * 原销路通中间表 apticlaim_zhuTi + */ + @NotNull(message = "活动主题不能为空") + private String activityTitle = ""; + + /** + * 费用申请编码 + */ + @Null(message = "不能传入活动编码") + private String activityCode; + + /** + * 核销创建日期不能为空 + * 原销路通中间表 apticlaim_create_datetime + * 时间格式应为:yyyy-MM-dd HH:mm:ss + */ + private String createDate; + + /** + * 原销路通中间表 apticlaim_effdate + * 应该成费用对应的活动开始日期 yyyy-MM-dd HH:mm:ss + */ + private String startDate; + + /** + * 原销路通中间表 apticlaim_effdate + * 应该成费用对应的活动结束日期 + * yyyy-MM-dd HH:mm:ss + */ + private String endDate; + + /** + * 中间表无该字段,用途不明确 + */ + private String kaCode = ""; + + /** + * 中间表无该字段,用途不明确 + */ + private Integer kaMdSl = 0; + + /** + * 对应 apticlaim_exp_acct 科目编码 + */ + @NotNull(message = "科目编码不能为空") + private String subjectCode; + + @NotNull(message = "科目名称不能为空") + private String subjectName; + + /** + * 原销路通 apticlaim_amt + apticlaim_amt_tax,含税核销金额 + */ + @DecimalMax(value = "100000000",message = "核销金额不能大于一亿,请检查数据") + @DecimalMin(value = "0",message = "核销金额不能小于0") + @NotNull(message = "核销金额不能为空") + private BigDecimal money; + + /** + * 中间表无该字段,用途不明确 + */ + private BigDecimal xsje = BigDecimal.ZERO; + + /** + * 中间表无该字段,用途不明确 + */ + private BigDecimal tmSl = BigDecimal.ZERO; + + /** + * cFyMemo 中间表无该字段 + */ + private String memo = ""; + + private String createUser = "demo - demo"; + + /** + * 对应 apticlaim_create_datetime + * 时间格式应为:yyyy-MM-dd HH:mm:ss + */ + @NotNull(message = "创建时间不能为空") + private String createTime; + + private String checkUser = "demo - demo"; + + /** + * 对应 apticlaim_create_datetime + * 时间格式应为:yyyy-MM-dd HH:mm:ss + */ + private String checkTime; + + /** + * 对应 apticlaim_addr + */ + @NotNull(message = "客户编码不能为空") + private String cusCode; + + @NotNull(message = "客户名称不能为空") + private String cusName; + + private String bookCode; + + /** + * 对应 apticlaim_recid + */ + @NotNull(message = "id不能为空") + private String recId; + + /** + * 对应apticlaim_id, + */ + @NotNull(message = "id不能为空") + private String id; + + /** + * 接口的账套转换逻辑 + * @param bookCode + * @param cusCode + */ + public void initBookCode(String bookCode,String cusCode){ + if(bookCode!=null){ + //SL也扔给锦泰 + if (bookCode.equals("020")){ + this.setBookCode("019"); + }else { + this.setBookCode(bookCode); + } + }else { + if(cusCode.contains("JF")){ + this.setBookCode("006"); + }else if(cusCode.contains("KL")){ + this.setBookCode("002"); + }else if(cusCode.contains("SL")||cusCode.contains("JT")){ + this.setBookCode("019"); + }else { + this.setBookCode("001"); + } + } + } + + /** + * 接口的账套转换逻辑 + * @param bookCode + * @param cusCode + */ + public static String getInitBookCode(String bookCode,String cusCode){ + if(bookCode!=null){ + //SL也扔给锦泰 + if (bookCode.equals("020")){ + return "019"; + }else { + return bookCode; + } + }else { + if(cusCode.contains("JF")){ + return "006"; + }else if(cusCode.contains("KL")){ + return "002"; + }else if(cusCode.contains("SL")||cusCode.contains("JT")){ + return "019"; + }else { + return "001"; + } + } + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/param/DHXDelCostParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/param/DHXDelCostParam.java new file mode 100644 index 0000000..e2d6432 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/param/DHXDelCostParam.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.third.entity.param; + +import lombok.Data; + +/** + * @author YenHex + * @since 2025/3/31 + */ +@Data +public class DHXDelCostParam { + + String userCode; + String code; + String remark; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/param/SSOLoginParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/param/SSOLoginParam.java new file mode 100644 index 0000000..f592ad5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/param/SSOLoginParam.java @@ -0,0 +1,28 @@ +package com.qs.serve.modules.third.entity.param; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/5/26 + */ +@Data +public class SSOLoginParam { + + /** + * 员工号 + */ + String empCode; + + /** + * 支持重写host + * 默认:rewriteHost = https://crm.gdjsl.com + */ + String rewriteHost; + + /** + * 跳转地址 + */ + String jumpTo; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/param/SkuToGetSpuParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/param/SkuToGetSpuParam.java new file mode 100644 index 0000000..5a12ea4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/entity/param/SkuToGetSpuParam.java @@ -0,0 +1,15 @@ +package com.qs.serve.modules.third.entity.param; + +import lombok.Data; +import java.util.List; + +/** + * @author YenHex + * @since 2023/10/16 + */ +@Data +public class SkuToGetSpuParam { + String placeName; + + List invCodes; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/service/PortalOfCost2Application.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/service/PortalOfCost2Application.java new file mode 100644 index 0000000..26855a4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/service/PortalOfCost2Application.java @@ -0,0 +1,663 @@ +package com.qs.serve.modules.third.service; + +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.properties.ProjectApisProperties; +import com.qs.serve.common.model.consts.ResultFlag; +import com.qs.serve.common.model.consts.SysConfigKey; +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.entity.*; +import com.qs.serve.modules.bms.service.*; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.entity.dto.TbsCenterDto; +import com.qs.serve.modules.goods.service.GoodsCategoryService; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.pay.common.PaymentType; +import com.qs.serve.modules.pay.entity.PayPayment; +import com.qs.serve.modules.pay.entity.PayPaymentItem; +import com.qs.serve.modules.pay.service.PayPaymentItemService; +import com.qs.serve.modules.pay.service.PayPaymentService; +import com.qs.serve.modules.seeyon.service.XiaoLuTonService; +import com.qs.serve.modules.sys.entity.SysConfig; +import com.qs.serve.modules.sys.entity.SysSyncLog; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysTableTempMapper; +import com.qs.serve.modules.sys.mapper.SysUserCodeMathMapper; +import com.qs.serve.modules.sys.service.SysConfigService; +import com.qs.serve.modules.sys.service.SysSyncLogService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsActivityState; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCostResult; +import com.qs.serve.modules.tbs.entity.so.TbsScheduleItemSearch; +import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.third.entity.*; +import com.qs.serve.modules.third.util.ThirtyVerificationUtil; +import com.qs.serve.modules.tzc.common.TzPolicyItemStatus; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; +import com.qs.serve.modules.tzc.entity.TzcPolicyItemLog; +import com.qs.serve.modules.tzc.mapper.TzcPolicyItemMapper; +import com.qs.serve.modules.tzc.service.TzcPolicyGoodsSyncService; +import com.qs.serve.modules.tzc.service.TzcPolicyItemLogService; +import com.qs.serve.modules.tzc.service.TzcPolicyItemService; +import com.qs.serve.modules.vtb.common.VtbVerificationState; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; +import com.qs.serve.modules.vtb.mapper.VtbVerificationSubjectMapper; +import com.qs.serve.modules.vtb.service.VtbFundFlowService; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import com.qs.serve.modules.vtb.service.VtbVerificationSubjectService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/2/14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class PortalOfCost2Application { + + private SysUserCodeMathMapper userCodeMathMapper; + private final SysSyncLogService sysSyncLogService; + private TbsActivityService activityService; + private TbsActivityCenterService activityCenterService; + private TbsActivitySubjectService activitySubjectService; + private TbsActivityGoodsService activityGoodsService; + private TbsActivityCenterGoodsService activityCenterGoodsService; + + private BmsSupplierService supplierService; + private BmsSubjectService subjectService; + private BmsCostCenterService costCenterService; + private BmsRegionService saleRegionService; + private BmsRegion2Service bizRegionService; + + private SysUserService userService; + + private TbsCostApplyService costApplyService; + private TbsBudgetCostItemService costItemService; + private TbsBudgetLogService budgetLogService; + private TbsBudgetApplicationService budgetApplicationService; + + + private GoodsSkuService goodsSkuService; + private GoodsSpuService goodsSpuService; + private GoodsCategoryService goodsCategoryService; + + private PayPaymentService paymentService; + + private VtbVerificationService verificationService; + private VtbVerificationSubjectService verificationSubjectService; + + + private ProjectApisProperties projectApisProperties; + + @Transactional(rollbackFor = Exception.class) + public void createCostProcess(ProcessCreateCostApplyBo createBo){ + SysUser user = userService.getByAccount(createBo.getUserCode()); + if(user==null){ + String newUcode = userCodeMathMapper.getNewCode(createBo.getUserCode()); + if(newUcode!=null){ + user = userService.getByAccount(newUcode); + } + } + if(user==null){Assert.throwEx("用户不存在,请重新编辑");} + BmsSupplier supplier = supplierService.getByCode(createBo.getCustomerCode(),createBo.getCustomerBelong()); + if(supplier==null){Assert.throwEx("客户不存在,请重新编辑");} + BmsSubject subject = subjectService.getByCode(createBo.getSubjectCode()); + if(subject==null){Assert.throwEx("科目不存在,请重新编辑");} + + final BigDecimal OneHundred = new BigDecimal("100"); + BigDecimal totalRate = BigDecimal.ZERO; + for (ProcessCenterItem item : createBo.getCenterList()) { + totalRate = totalRate.add(item.getCenterRate()); + if(item.getCenterRate().compareTo(BigDecimal.ZERO)<=0){ + Assert.throwEx("成本中心权重必须大于0"); + } + } + if(totalRate.compareTo(OneHundred)!=0){ + Assert.throwEx("成本中心权重合计必须为100"); + } + // 获取成本中心列表 + Map centerDtoMap = this.getTbsCenterDtoMap(createBo.getCenterList()); + //发票号 + String billNumber = createBo.getBillNumber(); + String disNumber = createBo.getErpCode(); + this.validBillNumAndDisNum(billNumber, disNumber); + //初始化sku列表 + List processGoodsItems = createBo.getGoodsList(); + List invCodeList = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(createBo.getGoodsList())){ + invCodeList = createBo.getGoodsList().stream() + .map(ProcessGoodsItem::getInventoryCode).distinct() + .filter(StringUtils::hasText).collect(Collectors.toList()); + } + if(invCodeList.size()<1){ + Assert.throwEx("请选择存货提交"); + } + String costCode = createBo.getCostCode(); + String costTheme = createBo.getCostTheme(); + List skuList = this.initSkuListOfProcess(invCodeList,!costCode.contains("YX06")); + //排除重复的sku + skuList = this.filterRepSku(invCodeList, skuList); + //常用参数 + final String GOODS_TYPE = "sku"; + LocalDateTime nowTime = LocalDateTime.now(); + LocalDate nowDate = LocalDate.now(); + LocalDate startDate = createBo.getStartDate(); + LocalDate endDate = createBo.getEndDate(); + String erpCode = createBo.getErpCode(); + Long supplierId = Long.parseLong(supplier.getId()); + BigDecimal totalAmount = createBo.getTotalAmount(); + + if(totalAmount.compareTo(BigDecimal.ZERO)==0){ + Assert.throwEx("统计金额不能为0"); + } + + String activityTitle = createBo.getActivityTitle(); + if(!StringUtils.hasText(activityTitle)){ + activityTitle = "由核销API生成的活动"; + } + //构建费用申请 + TbsCostApply costApply = new TbsCostApply(); + costApply.setDisCode(disNumber); + costApply.setBillNumber(billNumber); + costApply.setCode(costCode); + costApply.setMatchType(1); + costApply.setChargeTheme(costTheme); + costApply.setChargeState(TbsCostApplyState.State_3_finished.getCode()); + costApply.setSupplierId(supplierId); + costApply.setSupplierName(supplier.getName()); + costApply.setSupplierCode(supplier.getCode()); + costApply.setUserId(user.getId()); + costApply.setUserCode(user.getCode()); + costApply.setUserName(user.getName()); + costApply.setTotalActivity(1); + costApply.setTotalActivityAmount(totalAmount); + costApply.setTotalActivityUsedAmount(totalAmount); + costApply.setSubmitTime(LocalDateTime.now()); + costApply.setRemark(createBo.getRemark()); + //构建活动 + TbsActivity activity = new TbsActivity(); + activity.setActivityCode(costCode); + activity.setActivityState(TbsActivityState.STATE_1_Finished); + activity.setCostPassFlag(1); + activity.setCostPassTime(nowTime); + activity.setActTitle(activityTitle); + activity.setSupplierId(supplierId); + activity.setSupplierName(supplier.getName()); + activity.setSupplierCode(supplier.getCode()); + activity.setActStartDate(startDate); + activity.setActEndDate(endDate); + activity.setPreStartDate(startDate); + activity.setPreEndDate(endDate); + activity.setPreCheckDate(nowDate); + activity.setTotalAmount(totalAmount); + activity.setUsedAmount(totalAmount); + activity.setFinishedFlag(ResultFlag.OK); + activity.setFinishedTime(nowTime); + //活动-科目 + TbsActivitySubject activitySubject = new TbsActivitySubject(); + activitySubject.setSubjectId(subject.getId()); + activitySubject.setSubjectCode(subject.getSubjectCode()); + activitySubject.setSubjectName(subject.getSubjectName()); + activitySubject.setAmount(totalAmount); + activitySubject.setUsedAmount(totalAmount); + activitySubject.setCountSession(0); + activitySubject.setCountPerson(0); + + // 分配成本中心 + List activityCenterList = getTbsActivityCenters(subject, OneHundred, centerDtoMap, totalAmount); + + //活动-商品 + List activityGoodsList = new ArrayList<>(); + for (GoodsSku sku : skuList) { + GoodsSpu goodsSpu = goodsSpuService.getById(sku.getSpuId()); + GoodsCategory category1 = goodsCategoryService.getById(goodsSpu.getCategoryFirst()); + GoodsCategory category2 = goodsCategoryService.getById(goodsSpu.getCategorySecond()); + GoodsCategory category3 = goodsCategoryService.getById(goodsSpu.getCategoryThird()); + TbsActivityGoods activityGoods = new TbsActivityGoods(); + activityGoods.setTargetType(GOODS_TYPE); + activityGoods.setTargetId(sku.getId()); + activityGoods.setTargetCode(sku.getSkuCode()); + activityGoods.setTargetName(sku.getSkuName()); + activityGoods.setTargetLevelPathIds(category1.getId()+"_"+category2.getId()+"_"+category3.getId()+"_"+goodsSpu.getId()+"_"+sku.getId()); + activityGoods.setTargetLevelPathNames(category1.getName()+"_"+category2.getName()+"_"+category3.getName()+"_"+goodsSpu.getName()+"_"+sku.getSpecInfos()); + activityGoodsList.add(activityGoods); + } + //活动-商品与成本中心记录 + List activityCenterGoodsList = getTbsActivityCenterGoods(supplier, subject, OneHundred, + processGoodsItems, costCode, nowDate, startDate, endDate, supplierId, totalAmount, activity, + activityCenterList, activityGoodsList); + + //保存活动有关数据 + costApplyService.save(costApply); + activity.setCostApplyId(costApply.getId()); + activityService.save(activity); + activitySubject.setCostApplyId(costApply.getId()); + activitySubject.setActivityId(activity.getId()); + activitySubjectService.save(activitySubject); + activityCenterList.forEach(center->{ + center.setCostApplyId(costApply.getId()); + center.setActivityId(activity.getId()); + }); + activityCenterService.saveBatch(activityCenterList); + activityGoodsList.forEach(item->{ + item.setCostApplyId(costApply.getId()); + item.setActivityId(activity.getId()); + }); + activityGoodsService.saveBatch(activityGoodsList); + activityCenterGoodsList.forEach(item->{ + item.setCostApplyId(costApply.getId()); + item.setActivityId(activity.getId()); + }); + activityCenterGoodsService.saveBatch(activityCenterGoodsList); + + //获取匹配的预算结果 + TbsBudgetCostResult budgetCostResult = budgetApplicationService.buildBudgetCostResult( + costApply.getId(), + Arrays.asList(activity), + Arrays.asList(activitySubject), + activityCenterGoodsList, + activityCenterList,false,true,false); + + //不匹配的商品,保存到无预算表 + List unMatchBudgetItem = budgetCostResult.getBudgetUnMatchList(); + if(unMatchBudgetItem.size()>0){ + String codes = unMatchBudgetItem.stream().map(TbsBudgetCostItem::getTargetCode).collect(Collectors.joining(",")); + Assert.throwEx("未能匹配到预算:"+codes); + } + + //匹配的商品,生成预算日志 + List matchBudgetItem = budgetCostResult.getBudgetMatchList(); + List budgetLogList = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(matchBudgetItem)){ + for (TbsBudgetCostItem costItem : matchBudgetItem) { + TbsBudget currBudget = null; + for (TbsBudget budget : budgetCostResult.getBudgetList()) { + if(costItem.getBudgetId().equals(budget.getId())){ + currBudget = budget; + break; + } + } + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.buildTbsBudgetLog(BudgetLogOptFlag.State_1,user, costApply, costItem, currBudget,costItem.getCenterGoodsAmount(),activity); + budgetLogList.add(budgetLog); + } + } + costItemService.saveBatch(matchBudgetItem); + budgetLogService.saveBatch(budgetLogList); + + //保存核销申请 + VtbVerification verification = new VtbVerification(); + verification.setDisCode(disNumber); + verification.setBillNumber(billNumber); + verification.setVerificationCode(costCode); + verification.setVerificationMainCode(verification.getVerificationCode()); + verification.setCostApplyId(costApply.getId()); + verification.setFinishedTime(nowTime); + verification.setVerificationState(VtbVerificationState.Finished.getCode()); + verification.setActivityId(activity.getId()); + verification.setSupplierId(activity.getSupplierId()); + verification.setSupplierCode(activity.getSupplierCode()); + verification.setSupplierName(activity.getSupplierName()); + verification.setUserId(user.getId()); + verification.setUserCode(user.getCode()); + verification.setUserName(user.getName()); + verification.setAmount(totalAmount); + verification.setAmountRecord(totalAmount); + verification.setPaymentState(ResultFlag.OK); + verificationService.save(verification); + + //保存核销费用结果 + VtbVerificationSubject verificationSubject = new VtbVerificationSubject(); + verificationSubject.setVerificationId(verification.getId()); + verificationSubject.setVerificationSubCode(verification.getVerificationCode()+"_1"); + verificationSubject.setCostApplyId(costApply.getId()); + verificationSubject.setActivityId(activity.getId()); + verificationSubject.setSubjectId(subject.getId()); + verificationSubject.setSubjectCode(subject.getSubjectCode()); + verificationSubject.setSubjectName(subject.getSubjectName()); + verificationSubject.setSupplierId(Long.parseLong(supplier.getId())); + verificationSubject.setSupplierCode(supplier.getCode()); + verificationSubject.setSupplierName(supplier.getName()); + verificationSubject.setPayFinishedFlag(ResultFlag.OK); + verificationSubject.setUsedAmount(totalAmount); + verificationSubject.setUsedAmountRecord(totalAmount); + verificationSubject.setCountPerson(0); + verificationSubject.setCountSession(0); + verificationSubjectService.save(verificationSubject); + + //保存支付信息(DHX赠品) + if(costCode.indexOf("DHX")==0||costCode.contains("YX06")) { + // 赠品支持忽略参数 + boolean ignoreDhxPay = costCode.indexOf("DHX")==0&&createBo.getIgnorePayFlag()!=null&&createBo.getIgnorePayFlag()==1; + if(!ignoreDhxPay){ + this.payToErpAPI(supplier, subject, totalAmount, costApply, activity, activitySubject, + activityCenterList.get(0), activityGoodsList, activityCenterGoodsList, + budgetLogList, verification, verificationSubject); + } + } + + } + + @NotNull + private List getTbsActivityCenterGoods(BmsSupplier supplier, BmsSubject subject, BigDecimal OneHundred, List processGoodsItems, String costCode, LocalDate nowDate, LocalDate startDate, LocalDate endDate, Long supplierId, BigDecimal totalAmount, TbsActivity activity, List activityCenterList, List activityGoodsList) { + List activityCenterGoodsList = new ArrayList<>(); + + for (TbsActivityCenter activityCenter : activityCenterList) { + BigDecimal yx06Surplus = activityCenter.getCenterAmount(); + BigDecimal yx06SurplusRate = new BigDecimal("100"); + BigDecimal yx06ItemAmt = activityCenter.getCenterAmount() + .divide(new BigDecimal(activityGoodsList.size()), RoundingMode.DOWN); + BigDecimal yx06Rate = yx06ItemAmt.divide(activityCenter.getCenterAmount(), RoundingMode.DOWN); + for (int i = 0; i < activityGoodsList.size(); i++) { + TbsActivityGoods activityGoods = activityGoodsList.get(i); + TbsActivityCenterGoods centerGoods = new TbsActivityCenterGoods(); + centerGoods.setActivityCode(activity.getActivityCode()); + centerGoods.setCenterGoodsCode(activity.getActivityCode()+"_"+(i+1)); + centerGoods.setSupplierId(supplierId); + centerGoods.setSupplierCode(supplier.getCode()); + centerGoods.setSupplierName(supplier.getName()); + //设置成本中心 + centerGoods.setCenterType(activityCenter.getCenterType()); + centerGoods.setCenterId(activityCenter.getCenterId()); + centerGoods.setCenterName(activityCenter.getCenterName()); + centerGoods.setCenterCode(activityCenter.getCenterCode()); + centerGoods.setCenterRate(OneHundred); + centerGoods.setCenterAmount(totalAmount); + //设置科目 + centerGoods.setSubjectId(subject.getId()); + centerGoods.setSubjectCode(subject.getSubjectCode()); + centerGoods.setSubjectName(subject.getSubjectName()); + //设置活动时间 + centerGoods.setActEndDate(endDate); + centerGoods.setActStartDate(startDate); + centerGoods.setPreEndDate(endDate); + centerGoods.setPreStartDate(startDate); + centerGoods.setPreCheckDate(nowDate); + //设置目标 + centerGoods.setTargetId(activityGoods.getTargetId()); + centerGoods.setTargetType(activityGoods.getTargetType()); + centerGoods.setTargetCode(activityGoods.getTargetCode()); + centerGoods.setTargetName(activityGoods.getTargetName()); + centerGoods.setTargetLevelPathIds(activityGoods.getTargetLevelPathIds()); + centerGoods.setTargetLevelPathNames(activityGoods.getTargetLevelPathNames()); + // 分配金额 + if (costCode.contains("YX06")){ + if(i+1== activityGoodsList.size()){ + centerGoods.setCenterGoodsAmount(yx06Surplus); + centerGoods.setCenterGoodsRate(yx06SurplusRate); + centerGoods.setUsedAmount(yx06Surplus); + }else { + yx06SurplusRate = yx06SurplusRate.subtract(yx06Rate); + yx06Surplus = yx06Surplus.subtract(yx06ItemAmt); + centerGoods.setCenterGoodsAmount(yx06ItemAmt); + centerGoods.setCenterGoodsRate(yx06Rate); + centerGoods.setUsedAmount(yx06ItemAmt); + } + }else { + BigDecimal totalSkuAmt = BigDecimal.ZERO; + for (ProcessGoodsItem goodsItem : processGoodsItems) { + if(goodsItem.getInventoryCode().equals(activityGoods.getTargetCode())){ + totalSkuAmt = totalSkuAmt.add(goodsItem.getAmount()); + } + } + BigDecimal rate = totalSkuAmt.divide(totalAmount, RoundingMode.UP); + centerGoods.setCenterGoodsAmount(totalSkuAmt); + centerGoods.setCenterGoodsRate(rate); + centerGoods.setUsedAmount(totalSkuAmt); + } + activityCenterGoodsList.add(centerGoods); + } + } + return activityCenterGoodsList; + } + + @NotNull + private List getTbsActivityCenters(BmsSubject subject, BigDecimal OneHundred, Map centerDtoMap, BigDecimal totalAmount) { + List activityCenterList = new ArrayList<>(); + BigDecimal surplusAmount = totalAmount; + Set centerTypes = centerDtoMap.keySet(); + Iterator itr = centerTypes.iterator(); + while (itr.hasNext()){ + String centerCodeType = itr.next(); + TbsCenterDto center = centerDtoMap.get(centerCodeType); + BigDecimal rateAmt = null; + if(itr.hasNext()){ + rateAmt = center.getCenterRate() + .divide(OneHundred,2,BigDecimal.ROUND_HALF_UP) + .multiply(totalAmount); + surplusAmount = surplusAmount.subtract(rateAmt); + }else { + // 最后一项使用剩余 + rateAmt = surplusAmount; + } + //活动-成本中心 + TbsActivityCenter activityCenter = new TbsActivityCenter(); + activityCenter.setSubjectId(subject.getId()); + activityCenter.setCenterAmount(rateAmt); + activityCenter.setCenterRate(OneHundred); + activityCenter.setCenterType(center.getCenterType()); + activityCenter.setCenterId(center.getId()); + activityCenter.setCenterName(center.getCenterName()); + activityCenter.setCenterCode(center.getCenterCode()); + activityCenter.setUsedAmount(rateAmt); + activityCenterList.add(activityCenter); + } + return activityCenterList; + } + + private void validBillNumAndDisNum(String billNumber, String disNumber) { + //拦截是否已保存 + if(StringUtils.hasText(billNumber)){ + LambdaQueryWrapper payLqw = new LambdaQueryWrapper<>(); + payLqw.eq(PayPayment::getBillNumber, billNumber); + long countPay = paymentService.count(payLqw); + if(countPay>0){Assert.throwEx("发票号已存在,请勿重复提交");} + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostApply::getBillNumber, billNumber); + long countPay2 = costApplyService.count(lqw); + if(countPay2>0){Assert.throwEx("发票号已存在,请勿重复提交");} + + }else if (StringUtils.hasText(disNumber)){ + LambdaQueryWrapper payLqw = new LambdaQueryWrapper<>(); + payLqw.eq(PayPayment::getErpCode, disNumber); + long countPay = paymentService.count(payLqw); + if(countPay>0){Assert.throwEx("发货单已存在,请勿重复提交");} + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostApply::getDisCode, disNumber); + long countPay2 = costApplyService.count(lqw); + if(countPay2>0){Assert.throwEx("发货单已存在,请勿重复提交");} + + }else { + Assert.throwEx("发票号或发货单号不能为空"); + } + } + + @NotNull + private Map getTbsCenterDtoMap(List centerList) { + Map centerDtoMap = new HashMap<>(); + for (ProcessCenterItem item : centerList) { + String centerCode = item.getCenterCode(); + String centerType = item.getCenterType(); + if (centerType.equals("center")){ + BmsCostCenter costCenter = costCenterService.getByCode(centerCode); + if(costCenter==null){Assert.throwEx("自定义成本中心不存在,请重新编辑:"+centerCode);} + TbsCenterDto centerDto = new TbsCenterDto(costCenter); + centerDto.setCenterRate(item.getCenterRate()); + centerDtoMap.put(centerType+"_"+centerCode,centerDto); + }else if (centerType.equals("saleRegion")){ + BmsRegion region = saleRegionService.getByCode(centerCode); + if(region==null){Assert.throwEx("销售区域不存在,请重新编辑:"+centerCode);} + TbsCenterDto centerDto = new TbsCenterDto(region); + centerDto.setCenterRate(item.getCenterRate()); + centerDtoMap.put(centerType+"_"+centerCode,centerDto); + }else if (centerType.equals("bizRegion")){ + BmsRegion2 region = bizRegionService.getByCode(centerCode); + if(region==null){Assert.throwEx("行政区域不存在,请重新编辑:"+centerCode);} + TbsCenterDto centerDto = new TbsCenterDto(region); + centerDto.setCenterRate(item.getCenterRate()); + centerDtoMap.put(centerType+"_"+centerCode,centerDto); + }else if (centerType.equals("supplier")){ + BmsSupplier supplierCenter = supplierService.getByCode(centerCode,null); + if(supplierCenter==null){Assert.throwEx("供应商不存在,请重新编辑:"+centerCode);} + TbsCenterDto centerDto = new TbsCenterDto(supplierCenter); + centerDto.setCenterRate(item.getCenterRate()); + centerDtoMap.put(centerType+"_"+centerCode,centerDto); + }else { + Assert.throwEx("成本中心类型不存在,请重新编辑:"+centerType); + } + } + return centerDtoMap; + } + + private void payToErpAPI(BmsSupplier supplier, BmsSubject subject, BigDecimal totalAmount, TbsCostApply costApply, + TbsActivity activity, TbsActivitySubject activitySubject, TbsActivityCenter activityCenter, + List activityGoodsList, List activityCenterGoodsList, + List budgetLogList, VtbVerification verification, + VtbVerificationSubject verificationSubject) { + //发货单的 + String json = ThirtyVerificationUtil.buildJson(supplier, subject, totalAmount, activity, verification); + String COST_TO_PAY_API = projectApisProperties.getCostToPay(); + log.info("COST_TO_PAY_API 支付单信息:{} 数据:{}", verification.getVerificationCode(), json); + String rs = HttpUtil.doPost(COST_TO_PAY_API, json, null); + + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("to支付请求"); + syncLog.setUrl(COST_TO_PAY_API); + syncLog.setRequestJson(json); + if(rs==null||!rs.contains("200")){ + log.error("COST_TO_PAY_API \n 请求参数:{},\n 支付单信息:{},\n 结果:{}", json, verification.getVerificationCode(),rs); + syncLog.setEntityClass("ThirtyVerification"); + syncLog.setFailReason(rs); + syncLog.setRemark("支付失败:["+ verification.getVerificationCode()+"]"); + }else { + syncLog.setSuccessStatus(1); + syncLog.setRemark("支付完成:["+ verification.getVerificationCode()+"]"); + } + sysSyncLogService.save(syncLog); + + if (rs == null || !rs.contains("200")) { + log.error("COST_TO_PAY_API \n 请求参数:{},\n 支付单信息:{},\n 结果:{}", json, verification.getVerificationCode(), rs); + //核销调度接口事务补偿 + costApplyService.removeById(costApply.getId()); + activityService.removeById(activity.getId()); + activitySubjectService.removeById(activitySubject.getId()); + activityCenterService.removeById(activityCenter.getId()); + List goodIds = activityGoodsList.stream().map(TbsActivityGoods::getId).collect(Collectors.toList()); + if (goodIds.size() > 0) { + activityGoodsService.removeBatchByIds(goodIds); + } + List good2Ids = activityCenterGoodsList.stream().map(TbsActivityCenterGoods::getId).collect(Collectors.toList()); + if (good2Ids.size() > 0) { + activityCenterGoodsService.removeBatchByIds(good2Ids); + } + List logIds = budgetLogList.stream().map(TbsBudgetLog::getId).collect(Collectors.toList()); + if (logIds.size() > 0) { + budgetLogService.removeBatchByIds(logIds); + } + verificationService.removeById(verification.getId()); + verificationSubjectService.removeById(verificationSubject.getId()); + Assert.throwEx("请求支付失败"); + } + log.info("COST_TO_PAY_API 支付单信息:{},结果:{}", verification.getVerificationCode(), rs); + } + + @NotNull + private List filterRepSku(List invCodeList, List skuList) { + if (skuList.size() > invCodeList.size()){ + List skuList1 = new ArrayList<>(); + Set codes = new HashSet<>(); + for (String invCode : invCodeList) { + for (GoodsSku goodsSku : skuList) { + if(goodsSku.getSkuCode().equals(invCode)){ + if(codes.contains(invCode)){ + continue; + } + codes.add(invCode); + skuList1.add(goodsSku); + } + } + } + skuList = skuList1; + } + if(skuList.size() < invCodeList.size()){ + Set missCodes = new HashSet<>(); + for (String code : invCodeList) { + boolean anyMatch = skuList.stream().anyMatch(a->a.getSkuCode().equals(code)); + if(!anyMatch){ + missCodes.add(code); + } + } + Assert.throwEx("品类缺失("+ skuList.size()+"-"+ invCodeList.size()+"-"+missCodes.size()+"):"+missCodes.stream().collect(Collectors.joining(","))); + } + if(skuList.size()<1){ + Assert.throwEx("请选择品类再提交"); + } + return skuList; + } + + + /** + * 创建流程中,初始化SKU列表 + * @param invCodes + * @param filterEnable YX06赔款单,不需要过滤商品是否下架 + * @return + */ + private List initSkuListOfProcess(List invCodes,boolean filterEnable) { + List goodsSkus = null; + if(CollectionUtil.isNotEmpty(invCodes)){ + LambdaQueryWrapper skuLqw = new LambdaQueryWrapper<>(); + skuLqw.in(GoodsSku::getSkuCode,invCodes); + skuLqw.eq(filterEnable,GoodsSku::getEnable,1); + goodsSkus = goodsSkuService.list(skuLqw); + if(invCodes.size()!=goodsSkus.size()){ + List skuCodeNotExistList = new ArrayList<>(); + for (String invCode : invCodes) { + boolean notExist = true; + for (GoodsSku sku : goodsSkus) { + if(sku.getSkuCode().equals(invCode)){ + notExist = false; + break; + } + } + if(notExist){ + skuCodeNotExistList.add(invCode); + } + } + if(skuCodeNotExistList.size()>0){ + String invCodesString = skuCodeNotExistList.stream().collect(Collectors.joining(",")); + Assert.throwEx("存货编码["+invCodesString+"]不存在,请重新编辑"); + } + } + } + if(goodsSkus==null){ + Assert.throwEx("存货编码未设置,请重新编辑"); + } + return goodsSkus; + } + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/service/PortalOfCostApplication.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/service/PortalOfCostApplication.java new file mode 100644 index 0000000..ab1e96e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/service/PortalOfCostApplication.java @@ -0,0 +1,1378 @@ +package com.qs.serve.modules.third.service; + +import com.baomidou.dynamic.datasource.annotation.DSTransactional; +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.properties.ProjectApisProperties; +import com.qs.serve.common.model.consts.SysConfigKey; +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.common.model.consts.ResultFlag; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bir.consts.BirActivityCenterGoodsUtil; +import com.qs.serve.modules.bms.entity.*; +import com.qs.serve.modules.bms.service.*; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.service.GoodsCategoryService; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.pay.common.PaymentType; +import com.qs.serve.modules.pay.entity.PayPayment; +import com.qs.serve.modules.pay.entity.PayPaymentItem; +import com.qs.serve.modules.pay.service.PayPaymentItemService; +import com.qs.serve.modules.pay.service.PayPaymentService; +import com.qs.serve.modules.seeyon.entity.XltApticlaim; +import com.qs.serve.modules.seeyon.entity.XltPaymentRecord; +import com.qs.serve.modules.seeyon.service.XiaoLuTonService; +import com.qs.serve.modules.sys.entity.SysConfig; +import com.qs.serve.modules.sys.entity.SysSyncLog; +import com.qs.serve.modules.sys.entity.SysTableTemp; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysTableTempMapper; +import com.qs.serve.modules.sys.mapper.SysUserCodeMathMapper; +import com.qs.serve.modules.sys.service.SysConfigService; +import com.qs.serve.modules.sys.service.SysSyncLogService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsActivityState; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCostResult; +import com.qs.serve.modules.tbs.mapper.TbsActivitySubjectMapper; +import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.third.entity.*; +import com.qs.serve.modules.third.util.ThirtyVerificationUtil; +import com.qs.serve.modules.tzc.common.TzPolicyItemStatus; +import com.qs.serve.modules.tzc.entity.TzcPolicyGoodsSync; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; +import com.qs.serve.modules.tzc.entity.TzcPolicyItemLog; +import com.qs.serve.modules.tzc.mapper.TzcPolicyItemMapper; +import com.qs.serve.modules.tzc.service.TzcPolicyGoodsSyncService; +import com.qs.serve.modules.tzc.service.TzcPolicyItemLogService; +import com.qs.serve.modules.tzc.service.TzcPolicyItemService; +import com.qs.serve.modules.vtb.common.VtbFundFlowType; +import com.qs.serve.modules.vtb.common.VtbVerificationState; +import com.qs.serve.modules.vtb.entity.VtbFundFlow; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; +import com.qs.serve.modules.vtb.mapper.VtbVerificationSubjectMapper; +import com.qs.serve.modules.vtb.service.VtbFundFlowService; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import com.qs.serve.modules.vtb.service.VtbVerificationSubjectService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.RoundingMode; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/2/14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class PortalOfCostApplication { + + private TbsCostContractApplication costContractApplication; + private SysUserCodeMathMapper userCodeMathMapper; + private final SysSyncLogService sysSyncLogService; + private SysTableTempMapper sysTableTempMapper; + private TbsCostApplyMapper tbsCostApplyMapper; + private TbsCostTodoService tbsCostTodoService; + private final TbsActivityPayConditionService activityPayConditionService; + private final TbsBudgetService budgetService; + private final TbsBudgetCostItemService budgetCostItemService; + private final VtbFundFlowService fundFlowService; + private TbsActivityService activityService; + private TbsActivityCenterService activityCenterService; + private TbsActivitySubjectService activitySubjectService; + private TbsActivityGoodsService activityGoodsService; + private TbsActivityCenterGoodsService activityCenterGoodsService; + + private BmsSupplierService supplierService; + private BmsSubjectService subjectService; + private BmsCostCenterService costCenterService; + private BmsRegionService saleRegionService; + private BmsRegion2Service bizRegionService; + + private SysUserService userService; + + private TbsCostApplyService costApplyService; + private TbsCostUnItemService costUnItemService; + private TbsBudgetCostItemService costItemService; + private TbsBudgetLogService budgetLogService; + private TbsBudgetApplicationService budgetApplicationService; + private TbsBudgetMapper tbsBudgetMapper; + private TzcPolicyItemMapper tzcPolicyItemMapper; + + + private GoodsSkuService goodsSkuService; + private GoodsSpuService goodsSpuService; + private GoodsCategoryService goodsCategoryService; + + private PayPaymentService paymentService; + private PayPaymentItemService paymentItemService; + + private VtbVerificationService verificationService; + private VtbVerificationSubjectService verificationSubjectService; + + private TzcPolicyItemService policyItemServiceService; + private TzcPolicyItemLogService policyItemLogService; + private TzcPolicyGoodsSyncService tzcPolicyGoodsSyncService; + private SysUserService sysUserService; + private final XiaoLuTonService xiaoLuTonService; + + private ProjectApisProperties projectApisProperties; + private SysConfigService sysConfigService; + + /** + * + * @param recId + */ + @Transactional(rollbackFor = Exception.class) + public void deleteCostProcessByPolicy(String recId) { + List histCostApplyList = costApplyService.list(new LambdaQueryWrapper() + .eq(TbsCostApply::getRecId,recId)); + if(histCostApplyList.size()==0){ + Assert.throwEx("记录不存在,RecId:"+recId); + } + for (TbsCostApply costApply : histCostApplyList) { + costApplyService.removeById(costApply.getId()); + QueryWrapper costqw = new QueryWrapper(); + costqw.eq("cost_apply_id",costApply.getId()); + activityService.remove(costqw); + activitySubjectService.remove(costqw); + activityCenterService.remove(costqw); + activityGoodsService.remove(costqw); + activityCenterGoodsService.remove(costqw); + budgetLogService.remove(costqw); + costItemService.remove(costqw); + verificationService.remove(costqw); + verificationSubjectService.remove(costqw); + paymentService.remove(costqw); + paymentItemService.remove(costqw); + + + Long policyItemId = costApply.getPolicyItemId(); + TzcPolicyItem policyItem = policyItemServiceService.getById(policyItemId); + LambdaQueryWrapper budgetLogLambdaQueryWrapper = new LambdaQueryWrapper<>(); + budgetLogLambdaQueryWrapper.eq(TbsBudgetLog::getCreateCostId,costApply.getId()); + budgetLogLambdaQueryWrapper.eq(TbsBudgetLog::getCreatePolicyItemId,policyItemId); + budgetLogLambdaQueryWrapper.eq(TbsBudgetLog::getOptType,BudgetLogOptFlag.State_13.getCode()); + budgetLogService.remove(budgetLogLambdaQueryWrapper); + + //修改预算日志,记录政策使用情况 + TzcPolicyItemLog policyItemLog = TzcPolicyItemLog.toNewObject(policyItem,costApply.getTotalActivityAmount().negate()); + policyItemLogService.save(policyItemLog); + + BigDecimal policyItemUsedAmt = tzcPolicyItemMapper.sumPolicyItemTranAmt(policyItem.getId()); + + TzcPolicyItem policyItemParam = new TzcPolicyItem(); + policyItemParam.setId(policyItem.getId()); + policyItemParam.setUsedAmount(policyItemUsedAmt); + policyItemServiceService.updateById(policyItemParam); + } + } + /** + * + * @param createBo + */ + @Transactional(rollbackFor = Exception.class) + public void createCostProcessByPolicy(ProcessCreatePolicyCostBo createBo){ + if(createBo.getIgnoreTime()!=null&&createBo.getIgnoreTime()!=1&&createBo.getInitTime()==null){ + Assert.throwEx("忽略时间时,默认时间不可为空"); + } + LocalDateTime nowTime = LocalDateTime.now(); + LocalDate nowDate = LocalDate.now(); + if(createBo.getInitTime()!=null){ + nowTime = createBo.getInitTime().atStartOfDay(); + nowDate = createBo.getInitTime(); + } + SysUser user = userService.getByAccount(createBo.getUserCode()); + if(user==null){Assert.throwEx("用户不存在,请重新编辑");} + TzcPolicyItem policyItem = policyItemServiceService.getByPolicyItemCode(createBo.getPolicyItemCode()); + if(policyItem==null){ Assert.throwEx("政策项不存在,请重新编辑");} + if(!policyItem.getPolicyItemStatus().equals(TzPolicyItemStatus.Status_2_SyncSuccess)){ + Assert.throwEx("政策项状态异常或未完成同步"); + } + SysConfig sysConfig = sysConfigService.getByKey(SysConfigKey.PolicyDelayDays); + int delayDays = 7; + if(sysConfig!=null){ + try { + delayDays = Integer.parseInt(sysConfig.getConfigValue()); + } catch (NumberFormatException e) { + log.error("获取SysConfig政策延迟时间异常: PolicyDelayDays"); + } + } + if(createBo.getIgnoreTime()==null || createBo.getIgnoreTime()==0){ + if(nowTime.isBefore(policyItem.getPolicyStartDate().atStartOfDay())){ + Assert.throwEx("政策活动未开始"); + } + if(nowTime.isAfter(policyItem.getPolicyEndDate().plusDays(delayDays).atStartOfDay())){ + Assert.throwEx("政策活动已截止于"+policyItem.getPolicyEndDate()); + } + } + if(CollectionUtil.isEmpty(createBo.getGoodsList()) || createBo.getGoodsList().size()==0){ + Assert.throwEx("商品数据不能为空"); + } + if(policyItem.getReleaseFlag().equals(1)){ + Assert.throwEx("政策已释放,不能再创建"); + } + BmsSupplier supplier = supplierService.getById(policyItem.getSupplierId()); + BmsSubject subject = subjectService.getById(policyItem.getSubjectId()); + //发票号 + String billNumber = createBo.getBillNumber(); + //校验商品信息 + //List skuCodes = createBo.getGoodsList().stream().map(ProcessGoodsItem::getInventoryCode).collect(Collectors.toList()); + //初始化sku列表 + List processGoodsItems = createBo.getGoodsList(); + List invCodes = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(createBo.getGoodsList())){ + invCodes = createBo.getGoodsList().stream() + .map(ProcessGoodsItem::getInventoryCode).distinct().collect(Collectors.toList()); + } + List skuList = this.initSkuListOfProcess(invCodes,true); + skuList = this.filterRepSku(invCodes, skuList); + //常用参数 + final String GOODS_TYPE = "sku"; + final BigDecimal OneHundred = new BigDecimal("100"); + Long supplierId = Long.parseLong(supplier.getId()); + BigDecimal totalAmount = createBo.getTotalAmount(); + String costTheme = createBo.getCostTheme(); + String costApplyCode = "CA"+CodeGenUtil.generate(CodeGenUtil.SourceKey.CostApply); + String activityCode = costApplyCode + "_1"; + String activityTitle = "由政策"+policyItem.getPolicyItemCode()+"核销一站式API生成的活动"; + + LambdaQueryWrapper checkLqw = new LambdaQueryWrapper<>(); + checkLqw.eq(TbsCostApply::getBillNumber,billNumber); + checkLqw.eq(TbsCostApply::getPolicyItemId,policyItem.getId()); + if(costApplyService.count(checkLqw)>0L){ + Assert.throwEx("记录已存在,相同的发票和政策ID"); + } + + LambdaQueryWrapper tbsLogLqw = new LambdaQueryWrapper<>(); + tbsLogLqw.eq(TbsBudgetLog::getPolicyItemId,policyItem.getId()); + tbsLogLqw.eq(TbsBudgetLog::getOptType,BudgetLogOptFlag.State_11.getCode()); + TbsBudgetLog oriPolicyBudgetLog = budgetLogService.getOne(tbsLogLqw,false); + if(oriPolicyBudgetLog==null){ + Assert.throwEx("政策预算数据异常:"+policyItem.getPolicyItemCode()); + } + + + BigDecimal usedAmt = tzcPolicyItemMapper.sumPolicyItemTranAmt(policyItem.getId()); + BigDecimal resultItemAmt = usedAmt.add(totalAmount); + if(policyItem.getDiscountMax().compareTo(resultItemAmt)<0){ + BigDecimal surplusAmt = policyItem.getDiscountMax().subtract(usedAmt); + Assert.throwEx("政策预算不足,可用余额:"+surplusAmt); + } + + //历史记录 + List histCostApplyList = costApplyService.list(new LambdaQueryWrapper() + .eq(TbsCostApply::getRecId,createBo.getRecId())); + if(histCostApplyList.size()>0){ + Assert.throwEx("记录已存在,相同的RecId:"+createBo.getRecId()); + } +// for (TbsCostApply costApply : histCostApplyList) { +// costApplyService.removeById(costApply.getId()); +// QueryWrapper costqw = new QueryWrapper(); +// costqw.eq("cost_apply_id",costApply.getId()); +// activityService.remove(costqw); +// activitySubjectService.remove(costqw); +// activityCenterService.remove(costqw); +// activityGoodsService.remove(costqw); +// activityCenterGoodsService.remove(costqw); +// budgetLogService.remove(costqw); +// costItemService.remove(costqw); +// verificationService.remove(costqw); +// verificationSubjectService.remove(costqw); +// } + + //构建费用申请 + TbsCostApply costApply = new TbsCostApply(); + //标记唯一 + costApply.setRecId(createBo.getRecId()); + costApply.setBillNumber(billNumber); + costApply.setCode(costApplyCode); + costApply.setChargeTheme(costTheme); + costApply.setChargeState(TbsCostApplyState.State_3_finished.getCode()); + costApply.setSupplierId(supplierId); + costApply.setSupplierName(supplier.getName()); + costApply.setSupplierCode(supplier.getCode()); + costApply.setUserId(user.getId()); + costApply.setUserCode(user.getCode()); + costApply.setUserName(user.getName()); + costApply.setTotalActivity(1); + costApply.setTotalActivityAmount(totalAmount); + costApply.setTotalActivityUsedAmount(totalAmount); + costApply.setPolicyItemId(policyItem.getId()); + costApply.setPolicyItemCode(policyItem.getPolicyItemCode()); + costApply.setSubmitTime(LocalDateTime.now()); + costApply.setRemark(createBo.getErpCode()); + //构建活动 + TbsActivity activity = new TbsActivity(); + activity.setActivityCode(activityCode); + activity.setActivityState(TbsActivityState.STATE_1_Finished); + activity.setCostPassFlag(1); + activity.setCostPassTime(nowTime); + activity.setActTitle(activityTitle); + activity.setSupplierId(supplierId); + activity.setSupplierName(supplier.getName()); + activity.setSupplierCode(supplier.getCode()); + activity.setActStartDate(nowDate); + activity.setActEndDate(nowDate); + activity.setPreStartDate(nowDate); + activity.setPreEndDate(nowDate); + activity.setPreCheckDate(nowDate); + activity.setTotalAmount(totalAmount); + activity.setUsedAmount(totalAmount); + activity.setFinishedFlag(ResultFlag.OK); + activity.setFinishedTime(nowTime); + //活动-科目 + TbsActivitySubject activitySubject = new TbsActivitySubject(); + activitySubject.setSubjectId(subject.getId()); + activitySubject.setSubjectCode(subject.getSubjectCode()); + activitySubject.setSubjectName(subject.getSubjectName()); + activitySubject.setAmount(totalAmount); + activitySubject.setUsedAmount(totalAmount); + activitySubject.setCountSession(0); + activitySubject.setCountPerson(0); + + //活动-成本中心 + TbsActivityCenter activityCenter = new TbsActivityCenter(); + activityCenter.setSubjectId(subject.getId()); + activityCenter.setCenterAmount(totalAmount); + activityCenter.setCenterRate(OneHundred); + + activityCenter.setCenterType(policyItem.getCenterType()); + activityCenter.setCenterId(policyItem.getCenterId()); + activityCenter.setCenterName(policyItem.getCenterName()); + activityCenter.setCenterCode(policyItem.getCenterCode()); + activityCenter.setUsedAmount(totalAmount); + + //活动-商品 + List activityGoodsList = new ArrayList<>(); + for (GoodsSku sku : skuList) { + GoodsSpu goodsSpu = goodsSpuService.getById(sku.getSpuId()); + GoodsCategory category1 = goodsCategoryService.getById(goodsSpu.getCategoryFirst()); + GoodsCategory category2 = goodsCategoryService.getById(goodsSpu.getCategorySecond()); + GoodsCategory category3 = goodsCategoryService.getById(goodsSpu.getCategoryThird()); + TbsActivityGoods activityGoods = new TbsActivityGoods(); + activityGoods.setTargetType(GOODS_TYPE); + activityGoods.setTargetId(sku.getId()); + activityGoods.setTargetCode(sku.getSkuCode()); + activityGoods.setTargetName(sku.getSpecInfos()); + activityGoods.setTargetLevelPathIds(category1.getId()+"_"+category2.getId()+"_"+category3.getId()+"_"+goodsSpu.getId()+"_"+sku.getId()); + activityGoods.setTargetLevelPathNames(category1.getName()+"_"+category2.getName()+"_"+category3.getName()+"_"+goodsSpu.getName()+"_"+sku.getSpecInfos()); + activityGoodsList.add(activityGoods); + } + //活动-商品与成本中心记录 + List activityCenterGoodsList = new ArrayList<>(); + for (int i = 0; i < activityGoodsList.size(); i++) { + TbsActivityGoods activityGoods = activityGoodsList.get(i); + TbsActivityCenterGoods centerGoods = new TbsActivityCenterGoods(); + centerGoods.setActivityCode(activity.getActivityCode()); + centerGoods.setCenterGoodsCode(activity.getActivityCode()+"_"+(i+1)); + centerGoods.setSupplierId(supplierId); + centerGoods.setSupplierCode(supplier.getCode()); + centerGoods.setSupplierName(supplier.getName()); + //设置成本中心 + centerGoods.setCenterType(policyItem.getCenterType()); + centerGoods.setCenterId(policyItem.getCenterId()); + centerGoods.setCenterName(policyItem.getCenterName()); + centerGoods.setCenterCode(policyItem.getCenterCode()); + centerGoods.setCenterRate(OneHundred); + centerGoods.setCenterAmount(totalAmount); + //设置科目 + centerGoods.setSubjectId(subject.getId()); + centerGoods.setSubjectCode(subject.getSubjectCode()); + centerGoods.setSubjectName(subject.getSubjectName()); + //设置活动时间 + centerGoods.setActEndDate(nowDate); + centerGoods.setActStartDate(nowDate); + centerGoods.setPreEndDate(nowDate); + centerGoods.setPreStartDate(nowDate); + centerGoods.setPreCheckDate(nowDate); + //设置目标 + centerGoods.setTargetId(activityGoods.getTargetId()); + centerGoods.setTargetType(activityGoods.getTargetType()); + centerGoods.setTargetCode(activityGoods.getTargetCode()); + centerGoods.setTargetName(activityGoods.getTargetName()); + centerGoods.setTargetLevelPathIds(activityGoods.getTargetLevelPathIds()); + centerGoods.setTargetLevelPathNames(activityGoods.getTargetLevelPathNames()); + // 分配金额 + BigDecimal totalSkuAmt = BigDecimal.ZERO; + for (ProcessGoodsItem goodsItem : processGoodsItems) { + if(goodsItem.getInventoryCode().equals(activityGoods.getTargetCode())){ + totalSkuAmt = totalSkuAmt.add(goodsItem.getAmount()); + } + } + BigDecimal rate = totalSkuAmt.divide(totalAmount, RoundingMode.UP); + centerGoods.setCenterGoodsAmount(totalSkuAmt); + centerGoods.setCenterGoodsRate(rate); + centerGoods.setUsedAmount(totalSkuAmt); + activityCenterGoodsList.add(centerGoods); + } + + //保存活动有关数据 + costApplyService.save(costApply); + activity.setCostApplyId(costApply.getId()); + activityService.save(activity); + activitySubject.setCostApplyId(costApply.getId()); + activitySubject.setActivityId(activity.getId()); + activitySubjectService.save(activitySubject); + activityCenter.setCostApplyId(costApply.getId()); + activityCenter.setActivityId(activity.getId()); + activityCenterService.save(activityCenter); + activityGoodsList.forEach(item->{ + item.setCostApplyId(costApply.getId()); + item.setActivityId(activity.getId()); + }); + activityGoodsService.saveBatch(activityGoodsList); + activityCenterGoodsList.forEach(item->{ + item.setCostApplyId(costApply.getId()); + item.setActivityId(activity.getId()); + }); + activityCenterGoodsService.saveBatch(activityCenterGoodsList); + + + //活动申请扣除预算,这里需要进行保存 + TbsBudgetLog dropPolicyBudgetLog = new TbsBudgetLog(); + CopierUtil.copy(oriPolicyBudgetLog,dropPolicyBudgetLog); + dropPolicyBudgetLog.setId(null); + dropPolicyBudgetLog.setCreateTime(null); + dropPolicyBudgetLog.setUpdateTime(null); + dropPolicyBudgetLog.setCreateBy(null); + dropPolicyBudgetLog.setUpdateBy(null); + dropPolicyBudgetLog.setOptType(BudgetLogOptFlag.State_13.getCode()); + dropPolicyBudgetLog.setAmount(totalAmount); + //拓展关联 + dropPolicyBudgetLog.setCreateCostId(costApply.getId()); + dropPolicyBudgetLog.setCreatePolicyItemId(policyItem.getId()); + dropPolicyBudgetLog.setRemark("政策生成费用"); + + + List budgetLogList = new ArrayList<>(); + List costItemList = new ArrayList<>(); + + for (TbsActivityCenterGoods centerGoodItem : activityCenterGoodsList) { + TbsBudgetCostItem costItem = centerGoodItem.toBudgetCostItem(); + costItem.setBudgetId(dropPolicyBudgetLog.getBudgetId()); + costItem.setScheduleId(dropPolicyBudgetLog.getScheduleId()); + costItem.setScheduleItemId(dropPolicyBudgetLog.getScheduleItemId()); + costItem.setScheduleItemBudgetId(dropPolicyBudgetLog.getScheduleItemBudgetId()); + costItem.setScheduleItemName(dropPolicyBudgetLog.getItemName()); + TbsBudget currBudget = tbsBudgetMapper.selectById(dropPolicyBudgetLog.getBudgetId()); + + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.buildTbsBudgetLog(BudgetLogOptFlag.State_1,user, costApply, costItem, currBudget,centerGoodItem.getCenterGoodsAmount(),activity); + budgetLog.setCreateCostId(costApply.getId()); + budgetLog.setCreatePolicyItemId(policyItem.getId()); + budgetLog.setRemark("政策生成费用"); + budgetLogList.add(budgetLog); + costItemList.add(costItem); + } + + budgetLogService.save(dropPolicyBudgetLog); + budgetLogService.saveBatch(budgetLogList); + costItemService.saveBatch(costItemList); + + //修改预算日志,记录政策使用情况 + TzcPolicyItemLog policyItemLog = TzcPolicyItemLog.toNewObject(policyItem,totalAmount); + policyItemLogService.save(policyItemLog); + + TzcPolicyItem policyItemParam = new TzcPolicyItem(); + policyItemParam.setId(policyItem.getId()); + policyItemParam.setUsedAmount(resultItemAmt); + policyItemServiceService.updateById(policyItemParam); + + //保存核销申请 + VtbVerification verification = new VtbVerification(); + verification.setVerificationCode( billNumber); + verification.setVerificationMainCode(verification.getVerificationCode()); + verification.setFinishedTime(nowTime); + verification.setVerificationState(VtbVerificationState.Finished.getCode()); + verification.setCostApplyId(costApply.getId()); + verification.setActivityId(activity.getId()); + verification.setSupplierId(activity.getSupplierId()); + verification.setSupplierCode(activity.getSupplierCode()); + verification.setSupplierName(activity.getSupplierName()); + verification.setUserId(user.getId()); + verification.setUserCode(user.getCode()); + verification.setUserName(user.getName()); + verification.setAmount(totalAmount); + verification.setAmountRecord(totalAmount); + verification.setPaymentState(ResultFlag.NOT); + verification.setActivityCode(activity.getActivityCode()); + verification.setCostApplyCode(costApply.getCode()); + verificationService.save(verification); + + //保存核销费用结果 + VtbVerificationSubject verificationSubject = new VtbVerificationSubject(); + verificationSubject.setVerificationId(verification.getId()); + verificationSubject.setVerificationSubCode(verification.getVerificationCode()+"_1"); + verificationSubject.setCostApplyId(costApply.getId()); + verificationSubject.setActivityId(activity.getId()); + verificationSubject.setSubjectId(subject.getId()); + verificationSubject.setSubjectCode(subject.getSubjectCode()); + verificationSubject.setSubjectName(subject.getSubjectName()); + verificationSubject.setSupplierId(Long.parseLong(supplier.getId())); + verificationSubject.setSupplierCode(supplier.getCode()); + verificationSubject.setSupplierName(supplier.getName()); + verificationSubject.setPayFinishedFlag(ResultFlag.OK); + verificationSubject.setUsedAmount(totalAmount); + verificationSubject.setUsedAmountRecord(totalAmount); + verificationSubject.setCountPerson(0); + verificationSubject.setCountSession(0); + verificationSubjectService.save(verificationSubject); + + BirActivityCenterGoodsUtil.buildBir(costApply.getId()); + } + + @Transactional(rollbackFor = Exception.class) + public void createCostProcess(ProcessCreateCostApplyBo createBo){ + SysUser user = userService.getByAccount(createBo.getUserCode()); + if(user==null){ + String newUcode = userCodeMathMapper.getNewCode(createBo.getUserCode()); + if(newUcode!=null){ + user = userService.getByAccount(newUcode); + } + } + if(user==null){Assert.throwEx("用户不存在,请重新编辑");} + BmsSupplier supplier = supplierService.getByCode(createBo.getCustomerCode(),createBo.getCustomerBelong()); + if(supplier==null){Assert.throwEx("客户不存在,请重新编辑");} + BmsSubject subject = subjectService.getByCode(createBo.getSubjectCode()); + if(subject==null){Assert.throwEx("科目不存在,请重新编辑");} + String centerCode = createBo.getCenterCode(); + String centerType = null; + String centerName = null; + String centerId = null; + if(centerCode.contains("center_")){ + centerType = "center"; + centerCode = centerCode.replace("center_",""); + BmsCostCenter costCenter = costCenterService.getByCode(centerCode); + if(costCenter==null){Assert.throwEx("自定义成本中心不存在,请重新编辑");} + centerName = costCenter.getName(); + centerId = costCenter.getId()+""; + } else if (centerCode.contains("saleRegion_")) { + centerType = "saleRegion"; + centerCode = centerCode.replace("saleRegion_",""); + BmsRegion region = saleRegionService.getByCode(centerCode); + if(region==null){Assert.throwEx("销售区域不存在,请重新编辑");} + centerName = region.getName(); + centerId = region.getId(); + }else if (centerCode.contains("bizRegion_")) { + centerType = "bizRegion"; + centerCode = centerCode.replace("bizRegion_",""); + BmsRegion2 region = bizRegionService.getByCode(centerCode); + if(region==null){Assert.throwEx("行政区域不存在,请重新编辑");} + centerName = region.getName(); + centerId = region.getId(); + }else if (centerCode.contains("customer_")) { + centerType = "customer"; + centerCode = centerCode.replace("customer_",""); + BmsSupplier supperCenter = supplierService.getByCode(centerCode,null); + if(supperCenter==null){Assert.throwEx("成本中心的客户编码不存在,请重新编辑");} + centerName = supperCenter.getName(); + centerId = supperCenter.getId(); + }else { + Assert.throwEx("成本中心不存在,请重新编辑"); + } + //发票号 + String billNumber = createBo.getBillNumber(); + String disNumber = createBo.getErpCode(); + //拦截是否已保存 + if(StringUtils.hasText(billNumber)){ + LambdaQueryWrapper payLqw = new LambdaQueryWrapper<>(); + payLqw.eq(PayPayment::getBillNumber,billNumber); + long countPay = paymentService.count(payLqw); + if(countPay>0){Assert.throwEx("发票号已存在,请勿重复提交");} + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostApply::getBillNumber,billNumber); + long countPay2 = costApplyService.count(lqw); + if(countPay2>0){Assert.throwEx("发票号已存在,请勿重复提交");} + + }else if (StringUtils.hasText(disNumber)){ + LambdaQueryWrapper payLqw = new LambdaQueryWrapper<>(); + payLqw.eq(PayPayment::getErpCode,disNumber); + long countPay = paymentService.count(payLqw); + if(countPay>0){Assert.throwEx("发货单已存在,请勿重复提交");} + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsCostApply::getDisCode,disNumber); + long countPay2 = costApplyService.count(lqw); + if(countPay2>0){Assert.throwEx("发货单已存在,请勿重复提交");} + + }else { + Assert.throwEx("发票号或发货单号不能为空"); + } + //初始化sku列表 + List processGoodsItems = createBo.getGoodsList(); + List invCodeList = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(createBo.getGoodsList())){ + invCodeList = createBo.getGoodsList().stream() + .map(ProcessGoodsItem::getInventoryCode).distinct() + .filter(StringUtils::hasText).collect(Collectors.toList()); + } + if(invCodeList.size()<1){ + Assert.throwEx("请选择存货提交"); + } + String costCode = createBo.getCostCode(); + String costTheme = createBo.getCostTheme(); + List skuList = this.initSkuListOfProcess(invCodeList,!costCode.contains("YX06")); + //排除重复的sku + skuList = this.filterRepSku(invCodeList, skuList); + //常用参数 + final String GOODS_TYPE = "sku"; + final BigDecimal OneHundred = new BigDecimal("100"); + LocalDateTime nowTime = LocalDateTime.now(); + LocalDate nowDate = LocalDate.now(); + LocalDate startDate = createBo.getStartDate(); + LocalDate endDate = createBo.getEndDate(); + String erpCode = createBo.getErpCode(); + Long supplierId = Long.parseLong(supplier.getId()); + BigDecimal totalAmount = createBo.getTotalAmount(); + + if(totalAmount.compareTo(BigDecimal.ZERO)==0){ + Assert.throwEx("统计金额不能为0"); + } + + String activityTitle = createBo.getActivityTitle(); + if(!StringUtils.hasText(activityTitle)){ + activityTitle = "由核销API生成的活动"; + } + //构建费用申请 + TbsCostApply costApply = new TbsCostApply(); + costApply.setDisCode(disNumber); + costApply.setBillNumber(billNumber); + costApply.setCode(costCode); + costApply.setMatchType(1); + costApply.setChargeTheme(costTheme); + costApply.setChargeState(TbsCostApplyState.State_3_finished.getCode()); + costApply.setSupplierId(supplierId); + costApply.setSupplierName(supplier.getName()); + costApply.setSupplierCode(supplier.getCode()); + costApply.setUserId(user.getId()); + costApply.setUserCode(user.getCode()); + costApply.setUserName(user.getName()); + costApply.setTotalActivity(1); + costApply.setTotalActivityAmount(totalAmount); + costApply.setTotalActivityUsedAmount(totalAmount); + costApply.setSubmitTime(LocalDateTime.now()); + costApply.setRemark(createBo.getRemark()); + //构建活动 + TbsActivity activity = new TbsActivity(); + activity.setActivityCode(costCode); + activity.setActivityState(TbsActivityState.STATE_1_Finished); + activity.setCostPassFlag(1); + activity.setCostPassTime(nowTime); + activity.setActTitle(activityTitle); + activity.setSupplierId(supplierId); + activity.setSupplierName(supplier.getName()); + activity.setSupplierCode(supplier.getCode()); + activity.setActStartDate(startDate); + activity.setActEndDate(endDate); + activity.setPreStartDate(startDate); + activity.setPreEndDate(endDate); + activity.setPreCheckDate(nowDate); + activity.setTotalAmount(totalAmount); + activity.setUsedAmount(totalAmount); + activity.setFinishedFlag(ResultFlag.OK); + activity.setFinishedTime(nowTime); + //活动-科目 + TbsActivitySubject activitySubject = new TbsActivitySubject(); + activitySubject.setSubjectId(subject.getId()); + activitySubject.setSubjectCode(subject.getSubjectCode()); + activitySubject.setSubjectName(subject.getSubjectName()); + activitySubject.setAmount(totalAmount); + activitySubject.setUsedAmount(totalAmount); + activitySubject.setCountSession(0); + activitySubject.setCountPerson(0); + + //活动-成本中心 + TbsActivityCenter activityCenter = new TbsActivityCenter(); + activityCenter.setSubjectId(subject.getId()); + activityCenter.setCenterAmount(totalAmount); + activityCenter.setCenterRate(OneHundred); + activityCenter.setCenterType(centerType); + activityCenter.setCenterId(centerId); + activityCenter.setCenterName(centerName); + activityCenter.setCenterCode(centerCode); + activityCenter.setUsedAmount(totalAmount); + + //活动-商品 + List activityGoodsList = new ArrayList<>(); + + for (GoodsSku sku : skuList) { + GoodsSpu goodsSpu = goodsSpuService.getById(sku.getSpuId()); + GoodsCategory category1 = goodsCategoryService.getById(goodsSpu.getCategoryFirst()); + GoodsCategory category2 = goodsCategoryService.getById(goodsSpu.getCategorySecond()); + GoodsCategory category3 = goodsCategoryService.getById(goodsSpu.getCategoryThird()); + TbsActivityGoods activityGoods = new TbsActivityGoods(); + activityGoods.setTargetType(GOODS_TYPE); + activityGoods.setTargetId(sku.getId()); + activityGoods.setTargetCode(sku.getSkuCode()); + activityGoods.setTargetName(sku.getSkuName()); + activityGoods.setTargetLevelPathIds(category1.getId()+"_"+category2.getId()+"_"+category3.getId()+"_"+goodsSpu.getId()+"_"+sku.getId()); + activityGoods.setTargetLevelPathNames(category1.getName()+"_"+category2.getName()+"_"+category3.getName()+"_"+goodsSpu.getName()+"_"+sku.getSpecInfos()); + activityGoodsList.add(activityGoods); + } + //活动-商品与成本中心记录 + List activityCenterGoodsList = new ArrayList<>(); + BigDecimal yx06Surplus = totalAmount; + BigDecimal yx06SurplusRate = new BigDecimal("100"); + BigDecimal yx06ItemAmt = totalAmount.divide(new BigDecimal(activityGoodsList.size()), RoundingMode.DOWN); + BigDecimal yx06Rate = yx06ItemAmt.divide(totalAmount, RoundingMode.DOWN); + for (int i = 0; i < activityGoodsList.size(); i++) { + TbsActivityGoods activityGoods = activityGoodsList.get(i); + TbsActivityCenterGoods centerGoods = new TbsActivityCenterGoods(); + centerGoods.setActivityCode(activity.getActivityCode()); + centerGoods.setCenterGoodsCode(activity.getActivityCode()+"_"+(i+1)); + centerGoods.setSupplierId(supplierId); + centerGoods.setSupplierCode(supplier.getCode()); + centerGoods.setSupplierName(supplier.getName()); + //设置成本中心 + centerGoods.setCenterType(centerType); + centerGoods.setCenterId(centerId); + centerGoods.setCenterName(centerName); + centerGoods.setCenterCode(centerCode); + centerGoods.setCenterRate(OneHundred); + centerGoods.setCenterAmount(totalAmount); + //设置科目 + centerGoods.setSubjectId(subject.getId()); + centerGoods.setSubjectCode(subject.getSubjectCode()); + centerGoods.setSubjectName(subject.getSubjectName()); + //设置活动时间 + centerGoods.setActEndDate(endDate); + centerGoods.setActStartDate(startDate); + centerGoods.setPreEndDate(endDate); + centerGoods.setPreStartDate(startDate); + centerGoods.setPreCheckDate(nowDate); + //设置目标 + centerGoods.setTargetId(activityGoods.getTargetId()); + centerGoods.setTargetType(activityGoods.getTargetType()); + centerGoods.setTargetCode(activityGoods.getTargetCode()); + centerGoods.setTargetName(activityGoods.getTargetName()); + centerGoods.setTargetLevelPathIds(activityGoods.getTargetLevelPathIds()); + centerGoods.setTargetLevelPathNames(activityGoods.getTargetLevelPathNames()); + // 分配金额 + if (costCode.contains("YX06")){ + if(i+1==activityGoodsList.size()){ + centerGoods.setCenterGoodsAmount(yx06Surplus); + centerGoods.setCenterGoodsRate(yx06SurplusRate); + centerGoods.setUsedAmount(yx06Surplus); + }else { + yx06SurplusRate = yx06SurplusRate.subtract(yx06Rate); + yx06Surplus = yx06Surplus.subtract(yx06ItemAmt); + centerGoods.setCenterGoodsAmount(yx06ItemAmt); + centerGoods.setCenterGoodsRate(yx06Rate); + centerGoods.setUsedAmount(yx06ItemAmt); + } + }else { + BigDecimal totalSkuAmt = BigDecimal.ZERO; + for (ProcessGoodsItem goodsItem : processGoodsItems) { + if(goodsItem.getInventoryCode().equals(activityGoods.getTargetCode())){ + totalSkuAmt = totalSkuAmt.add(goodsItem.getAmount()); + } + } + BigDecimal rate = totalSkuAmt.divide(totalAmount, RoundingMode.UP); + centerGoods.setCenterGoodsAmount(totalSkuAmt); + centerGoods.setCenterGoodsRate(rate); + centerGoods.setUsedAmount(totalSkuAmt); + } + activityCenterGoodsList.add(centerGoods); + } + + //保存活动有关数据 + costApplyService.save(costApply); + activity.setCostApplyId(costApply.getId()); + activityService.save(activity); + activitySubject.setCostApplyId(costApply.getId()); + activitySubject.setActivityId(activity.getId()); + activitySubjectService.save(activitySubject); + activityCenter.setCostApplyId(costApply.getId()); + activityCenter.setActivityId(activity.getId()); + activityCenterService.save(activityCenter); + activityGoodsList.forEach(item->{ + item.setCostApplyId(costApply.getId()); + item.setActivityId(activity.getId()); + }); + activityGoodsService.saveBatch(activityGoodsList); + activityCenterGoodsList.forEach(item->{ + item.setCostApplyId(costApply.getId()); + item.setActivityId(activity.getId()); + }); + activityCenterGoodsService.saveBatch(activityCenterGoodsList); + + //获取匹配的预算结果 + TbsBudgetCostResult budgetCostResult = budgetApplicationService.buildBudgetCostResult( + costApply.getId(), + Arrays.asList(activity), + Arrays.asList(activitySubject), + activityCenterGoodsList, + Arrays.asList(activityCenter),false,true,false); + + //不匹配的商品,保存到无预算表 + List unMatchBudgetItem = budgetCostResult.getBudgetUnMatchList(); + if(unMatchBudgetItem.size()>0){ + String codes = unMatchBudgetItem.stream().map(a->a.getTargetCode()).collect(Collectors.joining(",")); + Assert.throwEx("未能匹配到预算:"+codes); + } +// List costUnItemList = new ArrayList<>(); +// if(CollectionUtil.isNotEmpty(unMatchBudgetItem)){ +// for (TbsBudgetCostItem budgetCostItem : unMatchBudgetItem) { +// TbsCostUnItem costUnItem = budgetCostItem.toTbsCostUnItem(activity); +// costUnItemList.add(costUnItem); +// } +// } +// costUnItemService.saveBatch(costUnItemList); + + //匹配的商品,生成预算日志 + List matchBudgetItem = budgetCostResult.getBudgetMatchList(); + List budgetLogList = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(matchBudgetItem)){ + for (TbsBudgetCostItem costItem : matchBudgetItem) { + TbsBudget currBudget = null; + for (TbsBudget budget : budgetCostResult.getBudgetList()) { + if(costItem.getBudgetId().equals(budget.getId())){ + currBudget = budget; + break; + } + } + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.buildTbsBudgetLog(BudgetLogOptFlag.State_1,user, costApply, costItem, currBudget,costItem.getCenterGoodsAmount(),activity); + budgetLogList.add(budgetLog); + } + } + costItemService.saveBatch(matchBudgetItem); + budgetLogService.saveBatch(budgetLogList); + + //保存核销申请 + VtbVerification verification = new VtbVerification(); + verification.setDisCode(disNumber); + verification.setBillNumber(billNumber); +// verification.setVerificationCode("MHX"+ CodeGenUtil.generate(CodeGenUtil.SourceKey.Verification)); + verification.setVerificationCode(costCode); + verification.setVerificationMainCode(verification.getVerificationCode()); + verification.setCostApplyId(costApply.getId()); + verification.setFinishedTime(nowTime); + verification.setVerificationState(VtbVerificationState.Finished.getCode()); + verification.setActivityId(activity.getId()); + verification.setSupplierId(activity.getSupplierId()); + verification.setSupplierCode(activity.getSupplierCode()); + verification.setSupplierName(activity.getSupplierName()); + verification.setUserId(user.getId()); + verification.setUserCode(user.getCode()); + verification.setUserName(user.getName()); + verification.setAmount(totalAmount); + verification.setAmountRecord(totalAmount); + verification.setPaymentState(ResultFlag.OK); + verificationService.save(verification); + + //保存核销费用结果 + VtbVerificationSubject verificationSubject = new VtbVerificationSubject(); + verificationSubject.setVerificationId(verification.getId()); + verificationSubject.setVerificationSubCode(verification.getVerificationCode()+"_1"); + verificationSubject.setCostApplyId(costApply.getId()); + verificationSubject.setActivityId(activity.getId()); + verificationSubject.setSubjectId(subject.getId()); + verificationSubject.setSubjectCode(subject.getSubjectCode()); + verificationSubject.setSubjectName(subject.getSubjectName()); + verificationSubject.setSupplierId(Long.parseLong(supplier.getId())); + verificationSubject.setSupplierCode(supplier.getCode()); + verificationSubject.setSupplierName(supplier.getName()); + verificationSubject.setPayFinishedFlag(ResultFlag.OK); + verificationSubject.setUsedAmount(totalAmount); + verificationSubject.setUsedAmountRecord(totalAmount); + verificationSubject.setCountPerson(0); + verificationSubject.setCountSession(0); + verificationSubjectService.save(verificationSubject); + + //保存支付信息(DHX赠品) + if(costCode.indexOf("DHX")==0||costCode.contains("YX06")) { + // 赠品支持忽略参数 + boolean ignoreDhxPay = costCode.indexOf("DHX")==0&&createBo.getIgnorePayFlag()!=null&&createBo.getIgnorePayFlag()==1; + if(!ignoreDhxPay){ + this.payToErpAPI(supplier, subject, totalAmount, costApply, activity, activitySubject, + activityCenter, activityGoodsList, activityCenterGoodsList, + budgetLogList, verification, verificationSubject); + } + } + //保存支付(SHX试吃品) +// if(costCode.indexOf("SHX")==0) { +// //发票的要直接支付 +// PayPayment payPayment = new PayPayment(); +// payPayment.setPayType(PaymentType.PAYMENT); +// payPayment.setPayCode("PM" + StringUtils.genShortId()); +// payPayment.setSupplierId(supplierId); +// payPayment.setSupplierCode(supplier.getCode()); +// payPayment.setSupplierName(supplier.getName()); +// payPayment.setPayAmount(totalAmount); +// payPayment.setCostApplyId(costApply.getId()); +// payPayment.setUserId(user.getId()); +// payPayment.setUserCode(user.getCode()); +// payPayment.setUserName(user.getName()); +// payPayment.setPayTime(nowTime); +// payPayment.setErpCode(erpCode); +// payPayment.setBillNumber(billNumber); +// payPayment.setCreateBy(user.getName()); +// payPayment.setCreateTime(LocalDateTime.now()); +// paymentService.save(payPayment); +// +// PayPaymentItem paymentItem = new PayPaymentItem(); +// paymentItem.setPaymentId(payPayment.getId()); +// paymentItem.setPayType(PaymentType.PAYMENT); +// paymentItem.setSupplierId(supplierId); +// paymentItem.setItemPayAmount(totalAmount); +// paymentItem.setVerificationId(verification.getId()); +// paymentItem.setVerificationCode(verification.getVerificationCode()); +// paymentItem.setVerificationMainCode(verification.getVerificationCode()); +// paymentItem.setVerificationSubjectId(verificationSubject.getId()); +// paymentItem.setCostApplyId(costApply.getId()); +// paymentItem.setActivityId(activity.getId()); +// paymentItem.setActivityCode(activity.getActivityCode()); +// paymentItem.setSubjectId(subject.getId()); +// paymentItem.setSubjectCode(subject.getSubjectCode()); +// paymentItem.setSubjectName(subject.getSubjectName()); +// paymentItem.setCreateBy(user.getName()); +// paymentItem.setCreateTime(LocalDateTime.now()); +// paymentItem.setPayTime(nowTime); +// +// paymentItemService.save(paymentItem); +// } + + } + + private void payToErpAPI(BmsSupplier supplier, BmsSubject subject, BigDecimal totalAmount, TbsCostApply costApply, TbsActivity activity, TbsActivitySubject activitySubject, TbsActivityCenter activityCenter, List activityGoodsList, List activityCenterGoodsList, List budgetLogList, VtbVerification verification, VtbVerificationSubject verificationSubject) { + //发货单的 + String json = ThirtyVerificationUtil.buildJson(supplier, subject, totalAmount, activity, verification); + String COST_TO_PAY_API = projectApisProperties.getCostToPay(); + log.info("COST_TO_PAY_API 支付单信息:{} 数据:{}", verification.getVerificationCode(), json); + String rs = HttpUtil.doPost(COST_TO_PAY_API, json, null); + + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("to支付请求"); + syncLog.setUrl(COST_TO_PAY_API); + syncLog.setRequestJson(json); + if(rs==null||!rs.contains("200")){ + log.error("COST_TO_PAY_API \n 请求参数:{},\n 支付单信息:{},\n 结果:{}", json, verification.getVerificationCode(),rs); + syncLog.setEntityClass("ThirtyVerification"); + syncLog.setFailReason(rs); + syncLog.setRemark("支付失败:["+ verification.getVerificationCode()+"]"); + }else { + syncLog.setSuccessStatus(1); + syncLog.setRemark("支付完成:["+ verification.getVerificationCode()+"]"); + } + sysSyncLogService.save(syncLog); + + if (rs == null || !rs.contains("200")) { + log.error("COST_TO_PAY_API \n 请求参数:{},\n 支付单信息:{},\n 结果:{}", json, verification.getVerificationCode(), rs); + //核销调度接口事务补偿 + costApplyService.removeById(costApply.getId()); + activityService.removeById(activity.getId()); + activitySubjectService.removeById(activitySubject.getId()); + activityCenterService.removeById(activityCenter.getId()); + List goodIds = activityGoodsList.stream().map(TbsActivityGoods::getId).collect(Collectors.toList()); + if (goodIds.size() > 0) { + activityGoodsService.removeBatchByIds(goodIds); + } + List good2Ids = activityCenterGoodsList.stream().map(TbsActivityCenterGoods::getId).collect(Collectors.toList()); + if (good2Ids.size() > 0) { + activityCenterGoodsService.removeBatchByIds(good2Ids); + } + List logIds = budgetLogList.stream().map(TbsBudgetLog::getId).collect(Collectors.toList()); + if (logIds.size() > 0) { + budgetLogService.removeBatchByIds(logIds); + } + verificationService.removeById(verification.getId()); + verificationSubjectService.removeById(verificationSubject.getId()); + Assert.throwEx("请求支付失败"); + } + log.info("COST_TO_PAY_API 支付单信息:{},结果:{}", verification.getVerificationCode(), rs); + } + + @NotNull + private List filterRepSku(List invCodeList, List skuList) { + if (skuList.size() > invCodeList.size()){ + List skuList1 = new ArrayList<>(); + Set codes = new HashSet<>(); + for (String invCode : invCodeList) { + for (GoodsSku goodsSku : skuList) { + if(goodsSku.getSkuCode().equals(invCode)){ + if(codes.contains(invCode)){ + continue; + } + codes.add(invCode); + skuList1.add(goodsSku); + } + } + } + skuList = skuList1; + } + if(skuList.size() < invCodeList.size()){ + Set missCodes = new HashSet<>(); + for (String code : invCodeList) { + boolean anyMatch = skuList.stream().anyMatch(a->a.getSkuCode().equals(code)); + if(!anyMatch){ + missCodes.add(code); + } + } + Assert.throwEx("品类缺失("+ skuList.size()+"-"+ invCodeList.size()+"-"+missCodes.size()+"):"+missCodes.stream().collect(Collectors.joining(","))); + } + if(skuList.size()<1){ + Assert.throwEx("请选择品类再提交"); + } + return skuList; + } + + /** + * 协议类费用 核销支付记录 + * @param createBo + */ + @Transactional + public void createByContractCheck(ProcessCreateContractCheckBo createBo){ + TbsCostApply costApply = costApplyService.getByCode(createBo.getCostCode()); + if(!costApply.getChargeState().equals(2)){ + Assert.throwEx("状态不支持调用"); + } + TbsActivity activity = activityService.listByCostApplyId(costApply.getId()).get(0); + List subjectList = activitySubjectService.listByActivityId(activity.getId()); + BmsSupplier supplier = supplierService.getById(costApply.getSupplierId()); + BigDecimal totalAmount = createBo.getAmount(); + SysUser user = userService.getByAccount(createBo.getUserCode()); + LocalDateTime nowTime = LocalDateTime.now(); + + //移除历史记录 + String payCode = createBo.getRemark(); + LambdaQueryWrapper hisVtbLqw = new LambdaQueryWrapper<>(); + hisVtbLqw.eq(VtbVerification::getRemark,payCode); + List oldDateList = verificationService.list(hisVtbLqw); + for (VtbVerification verification : oldDateList) { + Long verificationId = verification.getId(); + verificationService.removeById(verificationId); + verificationSubjectService.removeByVerificationId(verificationId); + } + LambdaQueryWrapper hisPaymentLqw = new LambdaQueryWrapper<>(); + hisPaymentLqw.eq(PayPayment::getRemark,payCode); + List payPayments = paymentService.list(hisPaymentLqw); + for (PayPayment payment : payPayments) { + Long payId = payment.getId(); + paymentService.removeById(payId); + paymentItemService.removeByPaymentId(payId); + } + + //保存核销申请 + VtbVerification verification = new VtbVerification(); + verification.setDisCode(createBo.getDispatchCode()); + verification.setBillNumber(createBo.getBillNumber()); + verification.setVerificationCode("HXC"+ CodeGenUtil.generate(CodeGenUtil.SourceKey.Verification)); + verification.setVerificationMainCode(verification.getVerificationCode()); + verification.setCostApplyId(costApply.getId()); + verification.setFinishedTime(nowTime); + verification.setVerificationState(VtbVerificationState.Finished.getCode()); + verification.setActivityId(activity.getId()); + verification.setSupplierId(activity.getSupplierId()); + verification.setSupplierCode(activity.getSupplierCode()); + verification.setSupplierName(activity.getSupplierName()); + verification.setUserId(user.getId()); + verification.setUserCode(user.getCode()); + verification.setUserName(user.getName()); + verification.setAmount(totalAmount); + verification.setAmountRecord(totalAmount); + verification.setPaymentState(ResultFlag.OK); + verification.setRemark(payCode); + verificationService.save(verification); + + //协议类的要直接支付 + PayPayment payPayment = new PayPayment(); + payPayment.setPayType(PaymentType.PAYMENT); + payPayment.setPayCode("PM" + StringUtils.genShortId()); + payPayment.setSupplierId(Long.parseLong(supplier.getId())); + payPayment.setSupplierCode(supplier.getCode()); + payPayment.setSupplierName(supplier.getName()); + payPayment.setPayAmount(totalAmount); + payPayment.setCostApplyId(costApply.getId()); + payPayment.setUserId(user.getId()); + payPayment.setUserCode(user.getCode()); + payPayment.setUserName(user.getName()); + payPayment.setPayTime(nowTime); + payPayment.setErpCode(createBo.getDispatchCode()); + payPayment.setBillNumber(createBo.getBillNumber()); + payPayment.setCreateBy(user.getName()); + payPayment.setCreateTime(LocalDateTime.now()); + payPayment.setRemark(payCode); + paymentService.save(payPayment); + + //保存核销费用结果 + BigDecimal subjectSurplus = createBo.getAmount(); + for (TbsActivitySubject subject : subjectList) { + VtbVerificationSubjectMapper activitySubjectMapper = (VtbVerificationSubjectMapper)verificationSubjectService.getBaseMapper(); + //科目已用 + BigDecimal usedSubjectAmt = activitySubjectMapper.selectSumSubjectAmt(subject.getActivityId(),subject.getSubjectId()); + if(usedSubjectAmt==null){ + usedSubjectAmt = BigDecimal.ZERO; + } + //科目还有多少金额未支付 + BigDecimal totalUnPay = subject.getAmount().subtract(usedSubjectAmt); + if(totalUnPay.compareTo(BigDecimal.ZERO)==0){ + //修正已支付数据 + if(subject.getUsedAmount()==null|| + subject.getUsedAmount().compareTo(usedSubjectAmt)!=0){ + TbsActivitySubject activitySubject = new TbsActivitySubject(); + activitySubject.setId(subject.getId()); + activitySubject.setUsedAmount(usedSubjectAmt); + activitySubjectService.updateById(subject); + } + continue; + } + //当前项支付多少 + BigDecimal currItemAmount; + //节点金额>科目的剩余金额 + if(totalUnPay.compareTo(subjectSurplus)>=0){ + currItemAmount = subjectSurplus; + subjectSurplus = BigDecimal.ZERO; + }else { + subjectSurplus = subjectSurplus.subtract(totalUnPay); + currItemAmount = totalUnPay; + } + //科目总支付 + BigDecimal totalPay = usedSubjectAmt.add(currItemAmount); + + VtbVerificationSubject verificationSubject = new VtbVerificationSubject(); + verificationSubject.setVerificationId(verification.getId()); + verificationSubject.setVerificationSubCode(verification.getVerificationCode()+"_1"); + verificationSubject.setCostApplyId(costApply.getId()); + verificationSubject.setActivityId(activity.getId()); + verificationSubject.setSubjectId(subject.getSubjectId()); + verificationSubject.setSubjectCode(subject.getSubjectCode()); + verificationSubject.setSubjectName(subject.getSubjectName()); + verificationSubject.setSupplierId(Long.parseLong(supplier.getId())); + verificationSubject.setSupplierCode(supplier.getCode()); + verificationSubject.setSupplierName(supplier.getName()); + verificationSubject.setPayFinishedFlag(ResultFlag.OK); + verificationSubject.setUsedAmount(currItemAmount); + verificationSubject.setUsedAmountRecord(currItemAmount); + verificationSubject.setCountPerson(0); + verificationSubject.setCountSession(0); + + PayPaymentItem paymentItem = new PayPaymentItem(); + paymentItem.setPaymentId(payPayment.getId()); + paymentItem.setPayType(PaymentType.PAYMENT); + paymentItem.setSupplierId(Long.parseLong(supplier.getId())); + paymentItem.setItemPayAmount(totalAmount); + paymentItem.setPayTime(nowTime); + paymentItem.setVerificationId(verification.getId()); + paymentItem.setVerificationCode(verification.getVerificationCode()); + paymentItem.setVerificationMainCode(verification.getVerificationCode()); + paymentItem.setVerificationSubjectId(verificationSubject.getId()); + paymentItem.setCostApplyId(costApply.getId()); + paymentItem.setActivityId(activity.getId()); + paymentItem.setActivityCode(activity.getActivityCode()); + paymentItem.setSubjectId(subject.getSubjectId()); + paymentItem.setSubjectCode(subject.getSubjectCode()); + paymentItem.setSubjectName(subject.getSubjectName()); + paymentItem.setCreateBy(user.getName()); + paymentItem.setCreateTime(LocalDateTime.now()); + + //保存和更新项 + TbsActivitySubject activitySubject = new TbsActivitySubject(); + activitySubject.setId(subject.getId()); + activitySubject.setUsedAmount(totalPay); + activitySubjectService.updateById(subject); + paymentItemService.save(paymentItem); + verificationSubjectService.save(verificationSubject); + } + + if(subjectSurplus.compareTo(BigDecimal.ZERO)>0){ + Assert.throwEx("余额不足"); + } + // 修复没有vtbFundFlow异常,并修复活动状态 + verificationService.successCommit(verification.getId(),false); + costContractApplication.resetState(); + } + + + public void updateCostUsedAmount(Long costId) { + TbsCostApply costApply = costApplyService.getById(costId); + List subjectNewList = verificationSubjectService.list( + new LambdaQueryWrapper() + .eq(VtbVerificationSubject::getCostApplyId,costId)); + Map> groupActSubject= subjectNewList.stream() + .collect(Collectors.groupingBy(VtbVerificationSubject::getActivityId)); + //更新科目 + + //统计费用申请 + BigDecimal totalCostAmt = BigDecimal.ZERO; + for (Long actId : groupActSubject.keySet()) { + TbsActivity tbsActivity = activityService.getById(actId); + List activitySubjects = groupActSubject.get(actId); + //统计活动 + BigDecimal totalActAmt = BigDecimal.ZERO; + for (VtbVerificationSubject actSubject : activitySubjects) { + if(actSubject.getUsedAmount()==null){ + continue; + } + totalActAmt = totalActAmt.add(actSubject.getUsedAmount()); + } + if(tbsActivity.getTotalAmount().compareTo(totalActAmt)<=0){ + tbsActivity.setActivityState(2); + } + tbsActivity.setUsedAmount(totalActAmt); + activityService.updateById(tbsActivity); + totalCostAmt.add(totalActAmt); + + //统计活动的科目金额 + Map> groupSubject= activitySubjects.stream() + .collect(Collectors.groupingBy(VtbVerificationSubject::getSubjectId)); + for (Long subjectId : groupSubject.keySet()) { + List subjectList = groupSubject.get(subjectId); + BigDecimal totalSub = BigDecimal.ZERO; + for (VtbVerificationSubject subject : subjectList) { + if(subject.getUsedAmount()==null){ + continue; + } + totalSub = totalSub.add(subject.getUsedAmount()); + } + if(totalSub.compareTo(BigDecimal.ZERO)!=0){ + //更新科目 + activitySubjectService.update(new LambdaUpdateWrapper() + .eq(TbsActivitySubject::getActivityId,actId) + .eq(TbsActivitySubject::getSubjectId,subjectId) + .set(TbsActivitySubject::getUsedAmount,totalSub) + ); + } + } + + + //将金额平分到centerGoods + List centerGoodsList = activityCenterGoodsService.listByActivityId(actId); + BigDecimal surplus = totalActAmt; + List centerGoods4Upd = new ArrayList<>(); + for (int i = 0; i < centerGoodsList.size(); i++) { + TbsActivityCenterGoods obj = centerGoodsList.get(i); + if(i+1==centerGoodsList.size()){ + TbsActivityCenterGoods centerGoods = new TbsActivityCenterGoods(); + centerGoods.setId(obj.getId()); + centerGoods.setUsedAmount(surplus); + centerGoods4Upd.add(centerGoods); + }else { + BigDecimal curUsed = totalActAmt.multiply( + obj.getCenterRate() + .multiply(obj.getCenterGoodsRate()) + .divide(new BigDecimal("10000"),RoundingMode.DOWN) + ); + TbsActivityCenterGoods centerGoods = new TbsActivityCenterGoods(); + centerGoods.setId(obj.getId()); + centerGoods.setUsedAmount(curUsed); + centerGoods4Upd.add(centerGoods); + surplus = surplus.subtract(curUsed); + } + } + if(centerGoodsList.size()==centerGoods4Upd.size()){ + activityCenterGoodsService.updateBatchById(centerGoods4Upd); + } + //将金额分到center + + List centerList = activityCenterService.listByActivity(actId); + BigDecimal surplusCenter = totalActAmt; + List center4Upd = new ArrayList<>(); + for (int i = 0; i < centerList.size(); i++) { + TbsActivityCenter obj = centerList.get(i); + if(i+1==centerGoodsList.size()){ + TbsActivityCenter center = new TbsActivityCenter(); + center.setId(obj.getId()); + center.setUsedAmount(surplusCenter); + center4Upd.add(center); + }else { + BigDecimal curUsed = totalActAmt.multiply( + obj.getCenterRate() + .divide(new BigDecimal("100"),RoundingMode.DOWN) + ); + TbsActivityCenter center = new TbsActivityCenter(); + center.setId(obj.getId()); + center.setUsedAmount(curUsed); + center4Upd.add(center); + surplusCenter = surplusCenter.subtract(curUsed); + } + } + if(centerList.size()==center4Upd.size()){ + activityCenterService.updateBatchById(center4Upd); + } + + } + costApply.setTotalActivityUsedAmount(totalCostAmt); + costApplyService.updateById(costApply); + + tbsCostApplyMapper.updateContractFinishedState(); + } + + /** + * 协议类费用 释放接口,释放合同不再支付的金额; + * @param contractBo + */ + public void releaseContractCost(ProcessReleaseContractBo contractBo){ + TbsCostApply costApply = costApplyService.getByCode(contractBo.getCostCode()); + TbsActivity activity = activityService.listByCostApplyId(costApply.getId()).get(0); + List costTodoList = tbsCostTodoService.listByCostId(costApply.getId()); + for (TbsCostTodo costTodo : costTodoList) { + if(costTodo.getCheckStatus().equals(1)){ + Assert.throwEx("协议条款审批中,不在支付失败"); + } + } + SysUser sysUser = sysUserService.getByAccount(contractBo.getCostCode()); + verificationService.release(activity.getId(),sysUser.getCode(),true); + } + + /** + * 创建流程中,初始化SKU列表 + * @param invCodes + * @param filterEnable YX06赔款单,不需要过滤商品是否下架 + * @return + */ + private List initSkuListOfProcess(List invCodes,boolean filterEnable) { + List goodsSkus = null; + if(CollectionUtil.isNotEmpty(invCodes)){ + LambdaQueryWrapper skuLqw = new LambdaQueryWrapper<>(); + skuLqw.in(GoodsSku::getSkuCode,invCodes); + skuLqw.eq(filterEnable,GoodsSku::getEnable,1); + goodsSkus = goodsSkuService.list(skuLqw); + if(invCodes.size()!=goodsSkus.size()){ + List skuCodeNotExistList = new ArrayList<>(); + for (String invCode : invCodes) { + boolean notExist = true; + for (GoodsSku sku : goodsSkus) { + if(sku.getSkuCode().equals(invCode)){ + notExist = false; + break; + } + } + if(notExist){ + skuCodeNotExistList.add(invCode); + } + } + if(skuCodeNotExistList.size()>0){ + String invCodesString = skuCodeNotExistList.stream().collect(Collectors.joining(",")); + Assert.throwEx("存货编码["+invCodesString+"]不存在,请重新编辑"); + } + } + } + if(goodsSkus==null){ + Assert.throwEx("存货编码未设置,请重新编辑"); + } + return goodsSkus; + } + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/service/PortalOfCostPartApplication.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/service/PortalOfCostPartApplication.java new file mode 100644 index 0000000..f086f32 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/service/PortalOfCostPartApplication.java @@ -0,0 +1,139 @@ +package com.qs.serve.modules.third.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qs.serve.common.config.properties.ProjectApisProperties; +import com.qs.serve.common.model.consts.ResultFlag; +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.entity.BmsCostCenter; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsSubject; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsCostCenterService; +import com.qs.serve.modules.bms.service.BmsRegionService; +import com.qs.serve.modules.bms.service.BmsSubjectService; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.goods.entity.GoodsCategory; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.entity.GoodsSpu; +import com.qs.serve.modules.goods.service.GoodsCategoryService; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.goods.service.GoodsSpuService; +import com.qs.serve.modules.pay.common.PaymentType; +import com.qs.serve.modules.pay.entity.PayPayment; +import com.qs.serve.modules.pay.entity.PayPaymentItem; +import com.qs.serve.modules.pay.entity.bo.PayPaymentBo; +import com.qs.serve.modules.pay.service.PayPaymentItemService; +import com.qs.serve.modules.pay.service.PayPaymentService; +import com.qs.serve.modules.seeyon.service.XiaoLuTonService; +import com.qs.serve.modules.sys.entity.SysSyncLog; +import com.qs.serve.modules.sys.entity.SysTableTemp; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysTableTempMapper; +import com.qs.serve.modules.sys.mapper.SysUserCodeMathMapper; +import com.qs.serve.modules.sys.service.SysSyncLogService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsActivityState; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCostResult; +import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.third.entity.*; +import com.qs.serve.modules.third.util.ThirtyVerificationUtil; +import com.qs.serve.modules.tzc.common.TzPolicyItemStatus; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; +import com.qs.serve.modules.tzc.entity.TzcPolicyItemLog; +import com.qs.serve.modules.tzc.mapper.TzcPolicyItemMapper; +import com.qs.serve.modules.tzc.service.TzcPolicyGoodsSyncService; +import com.qs.serve.modules.tzc.service.TzcPolicyItemLogService; +import com.qs.serve.modules.tzc.service.TzcPolicyItemService; +import com.qs.serve.modules.vtb.common.VtbVerificationState; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; +import com.qs.serve.modules.vtb.mapper.VtbVerificationSubjectMapper; +import com.qs.serve.modules.vtb.service.VtbFundFlowService; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import com.qs.serve.modules.vtb.service.VtbVerificationSubjectService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/2/14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class PortalOfCostPartApplication { + + private SysUserCodeMathMapper userCodeMathMapper; + private final SysSyncLogService sysSyncLogService; + private SysTableTempMapper sysTableTempMapper; + + private TbsCostTodoService tbsCostTodoService; + private final TbsActivityPayConditionService activityPayConditionService; + private final TbsBudgetService budgetService; + private final TbsBudgetCostItemService budgetCostItemService; + private final VtbFundFlowService fundFlowService; + private TbsActivityService activityService; + private TbsActivityCenterService activityCenterService; + private TbsActivitySubjectService activitySubjectService; + private TbsActivityGoodsService activityGoodsService; + private TbsActivityCenterGoodsService activityCenterGoodsService; + + private BmsSupplierService supplierService; + private BmsSubjectService subjectService; + private BmsCostCenterService costCenterService; + private BmsRegionService saleRegionService; + + private SysUserService userService; + + private TbsCostApplyService costApplyService; + private TbsCostUnItemService costUnItemService; + private TbsBudgetCostItemService costItemService; + private TbsBudgetLogService budgetLogService; + private TbsBudgetApplicationService budgetApplicationService; + private TbsBudgetMapper tbsBudgetMapper; + private TzcPolicyItemMapper tzcPolicyItemMapper; + + + private GoodsSkuService goodsSkuService; + private GoodsSpuService goodsSpuService; + private GoodsCategoryService goodsCategoryService; + + private PayPaymentService paymentService; + private PayPaymentItemService paymentItemService; + + private VtbVerificationService verificationService; + private VtbVerificationSubjectService verificationSubjectService; + + private TzcPolicyItemService policyItemServiceService; + private TzcPolicyItemLogService policyItemLogService; + private TzcPolicyGoodsSyncService tzcPolicyGoodsSyncService; + private SysUserService sysUserService; + private final XiaoLuTonService xiaoLuTonService; + private ProjectApisProperties projectApisProperties; + private PayPaymentService payPaymentService; + + /** + * 协议类费用 释放接口,释放合同不再支付的金额; + * @param paymentBo + */ + public void toContractNotPay(PayPaymentBo paymentBo){ + payPaymentService.unpayment(paymentBo); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/util/ThirdRequestLogUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/util/ThirdRequestLogUtil.java new file mode 100644 index 0000000..11c3ab8 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/util/ThirdRequestLogUtil.java @@ -0,0 +1,108 @@ +package com.qs.serve.modules.third.util; + +import lombok.Data; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +/** + * 日志平台工具类(Spring版本) + * @author YenHex + * @since 2023/12/21 + */ +public class ThirdRequestLogUtil { + + /* + public static void main(String[] args) { + ThirtyRequestLog requestLog = new ThirtyRequestLog(); + requestLog.setTitle("test"); + requestLog.setModule("test"); + requestLog.setRequestJson("{}"); + requestLog.setResponseJson("{}"); + requestLog.setKey1("A100"); + requestLog.setKey2("A100"); + requestLog.setKey3("A100"); + requestLog.setErrorMsg("A100"); + requestLog.setLogLevel("info"); + requestLog.setSuccessStatus(1); + requestLog.setRemark("A100"); + requestLog.setExtValue1("A100"); + requestLog.setExtValue2("A100"); + requestLog.setExtValue3("A100"); + requestLog.setExtValue4("A100"); + + String rs = ThirdRequestLogUtil.post(requestLog); + System.out.println(rs); + }*/ + + private static final String SAVE_LOG_URL = "http://192.168.0.9:7100/api/reqLog/saveLog"; + + private static RestTemplate restTemplate; + + private static RestTemplate getRestTemplate(){ + if(restTemplate==null){ + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setReadTimeout(5000); + factory.setConnectTimeout(15000); + restTemplate = new RestTemplate(factory); + } + return restTemplate; + } + + public static String post(ThirtyRequestLog requestLog) { + HttpHeaders headers = new HttpHeaders(); + HttpEntity formEntity = new HttpEntity<>(requestLog,headers); + return getRestTemplate().postForObject(SAVE_LOG_URL,formEntity, String.class); + } + + @Data + public static class ThirtyRequestLog{ + + /** 标题 长度255 */ + private String title; + + /** 业务模块 长度255 */ + private String module; + + /** 请求json 只接受json */ + private String requestJson; + + /** 返回json 只接受json */ + private String responseJson; + + /** 键id_1 长度255 */ + private String key1; + + /** 键id_2 长度255 */ + private String key2; + + /** 键id_3 长度255 */ + private String key3; + + /** 错误信息 长度不能超过1255字 */ + private String errorMsg; + + /** 严重程度:info,warning,error */ + private String logLevel; + + /** 状态:0-不成功,需要处理;1-成功 */ + private Integer successStatus; + + /** 备注 长度不能超过255字 */ + private String remark; + + /** 拓展1 长度不能超过255字 */ + private String extValue1; + + /** 拓展2 长度不能超过255字 */ + private String extValue2; + + /** 拓展3 长度不能超过255字 */ + private String extValue3; + + /** 拓展4 长度不能超过255字 */ + private String extValue4; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/util/ThirtyVerificationUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/util/ThirtyVerificationUtil.java new file mode 100644 index 0000000..c79f2f2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/third/util/ThirtyVerificationUtil.java @@ -0,0 +1,127 @@ +package com.qs.serve.modules.third.util; + +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.modules.bms.entity.BmsSubject; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.sys.entity.SysSyncLog; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.third.entity.ThirtyVerification; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * @author YenHex + * @since 2023/9/14 + */ +@Slf4j +public class ThirtyVerificationUtil { + + /** + * 用于全过程生成 + * @param supplier + * @param subject + * @param totalAmount + * @param activity + * @param verification + * @return + */ + @Nullable + public static String buildJson(BmsSupplier supplier, BmsSubject subject, BigDecimal totalAmount, TbsActivity activity, VtbVerification verification) { + LocalDateTime nowTime = LocalDateTime.now(); + String timeString = nowTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + ThirtyVerification tv = new ThirtyVerification(); + tv.setId(IdUtil.getSnowFlakeId()+""); + tv.setVerificationCode(verification.getVerificationCode()); + tv.setActivityTitle(activity.getActTitle()); + tv.setActivityCode(activity.getActivityCode()); + tv.setCreateDate(timeString); + tv.setStartDate(timeString); + tv.setEndDate(timeString); + tv.setSubjectCode(subject.getSubjectCode()); + tv.setSubjectName(subject.getSubjectName()); + tv.setMoney(totalAmount); + //tv.setCreateUser(); + tv.setCreateTime(timeString); + //tv.setCheckUser(user.getName()); + tv.setCheckTime(timeString); + tv.setCusCode(supplier.getCode()); + tv.setCusName(supplier.getName()); + tv.initBookCode(supplier.getBookCode(),supplier.getCode()); + tv.setCAcc(tv.getBookCode()); + tv.setRecId(verification.getVerificationCode()); + String json = JsonUtil.objectToJson(tv); + return json; + } + + /** + * 用于全过程生成 + * @param supplier + * @param subject + * @param totalAmount + * @param activity + * @param verification + * @return + */ + @Nullable + public static String buildJson(BmsSupplier supplier, BmsSubject subject, BigDecimal totalAmount, TbsActivity activity, + LocalDateTime startTime,LocalDateTime endTime, VtbVerification verification) { + LocalDateTime nowTime = LocalDateTime.now(); + String timeString = nowTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + String startTimeString = startTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + String endTimeString = endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + ThirtyVerification tv = new ThirtyVerification(); + tv.setId(IdUtil.getSnowFlakeId()+""); + tv.setVerificationCode(verification.getVerificationCode()); + tv.setActivityTitle(activity.getActTitle()); + tv.setActivityCode(activity.getActivityCode()); + tv.setCreateDate(timeString); + tv.setStartDate(startTimeString); + tv.setEndDate(endTimeString); + tv.setSubjectCode(subject.getSubjectCode()); + tv.setSubjectName(subject.getSubjectName()); + tv.setMoney(totalAmount); + //tv.setCreateUser(); + tv.setCreateTime(timeString); + //tv.setCheckUser(user.getName()); + tv.setCheckTime(timeString); + tv.setCusCode(supplier.getCode()); + tv.setCusName(supplier.getName()); + tv.initBookCode(supplier.getBookCode(),supplier.getCode()); + tv.setCAcc(tv.getBookCode()); + tv.setRecId(verification.getVerificationCode()); + return JsonUtil.objectToJson(tv); + } + + @NotNull + public static SysSyncLog requestToPayment(String title,String keyCode, String api, String json) { + log.info("COST_TO_PAY_API 支付单信息:{} 数据:{}", keyCode, json); + String rs = null; + try { + rs = HttpUtil.doPost(api, json,null); + } catch (Exception e) { + rs = e.getMessage(); + } + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat(title); + syncLog.setUrl(api); + syncLog.setRequestJson(json); + if(rs==null||!rs.contains("200")){ + log.error("COST_TO_PAY_API \n 请求参数:{},\n 支付单信息:{},\n 结果:{}", json, keyCode,rs); + syncLog.setEntityClass("ThirtyVerification"); + syncLog.setFailReason(rs); + syncLog.setRemark("支付失败:["+ keyCode+"]"); + }else { + syncLog.setSuccessStatus(1); + syncLog.setRemark("支付完成:["+ keyCode+"]"); + } + return syncLog; + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/common/TzPolicyItemStatus.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/common/TzPolicyItemStatus.java new file mode 100644 index 0000000..44beb0a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/common/TzPolicyItemStatus.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.common; + +/** + * @author YenHex + * @since 2023/2/27 + */ +public interface TzPolicyItemStatus { + + Integer Status_0_Default = 0; + Integer Status_1_PassSuccess = 1; + Integer Status_2_SyncSuccess = 2; + Integer Status_3_Finished = 3; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/common/TzcPolicyStatus.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/common/TzcPolicyStatus.java new file mode 100644 index 0000000..e85deb4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/common/TzcPolicyStatus.java @@ -0,0 +1,17 @@ +package com.qs.serve.modules.tzc.common; + +/** + * @author YenHex + * @since 2023/2/20 + */ +public interface TzcPolicyStatus { + + int Status_0_UnCommit = 0; + int Status_1_Checking = 1; + int Status_2_PassSuccess = 2; + int Status_3_Success = 3; + int Status_4_RollBack = 4; + int Status_5_Refuse = 5; + int Status_6_CANCEL = 6; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/common/dto/PolicySortWrapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/common/dto/PolicySortWrapper.java new file mode 100644 index 0000000..90bdf61 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/common/dto/PolicySortWrapper.java @@ -0,0 +1,92 @@ +package com.qs.serve.modules.tzc.common.dto; + +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.entity.TbsBudgetCondition; +import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; +import lombok.Data; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 用于排序 + * @author YenHex + * @since 2023/5/18 + */ +@Data +public class PolicySortWrapper { + + /** + * 有科目的预算id + */ + Set budgetSet4Subject = new HashSet<>(); + + + /** + * 有条件的预算id + */ + Set budgetSet4Condition = new HashSet<>(); + + /** + * 无条件的预算id + */ + Set budgetSet4NoCondition = new HashSet<>(); + + /** + * key->政策项id + * value->满足政策项的条件列表 + */ + Map> policyItemCostConditionsOfSort = new HashMap<>(); + + + Map> policyItemAllowBudgetId; + + /** + * sort of timeline,filter timeline + * key is policy_item_id, value is schedule list + */ + Map> policyItemScheduleItemMap = new HashMap<>(); + + + public void putPolicyItemCondition(Long policyItemId, List list){ + policyItemCostConditionsOfSort.put(policyItemId, list); +// List lastList = policyItemCostConditionsOfSort.get(policyItemId); +// if(lastList!=null&&lastList.size()>0){ +// for (TbsBudgetCondition condition : list) { +// boolean exist = false; +// for (TbsBudgetCondition budgetCondition : lastList) { +// if(budgetCondition.getId().equals(condition.getId())){ +// exist = true; +// break; +// } +// } +// if (!exist){ +// lastList.add(condition); +// } +// } +// policyItemCostConditionsOfSort.put(policyItemId, lastList); +// }else { +// policyItemCostConditionsOfSort.put(policyItemId, list); +// } + } + + /** + * 初始化科目排序因子 + * @param budgetList + */ + public void initializeBudget(List budgetList){ + if(CollectionUtil.isNotEmpty(budgetList)){ + for (TbsBudget budget : budgetList) { + budgetSet4Subject.add(budget.getId()); + if(budget.getConditionFlag()==null||budget.getConditionFlag().equals(0)){ + budgetSet4NoCondition.add(budget.getId()); + }else { + budgetSet4Condition.add(budget.getId()); + } + } + } + } + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/common/util/PolicySortWrapperUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/common/util/PolicySortWrapperUtil.java new file mode 100644 index 0000000..999beec --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/common/util/PolicySortWrapperUtil.java @@ -0,0 +1,132 @@ +package com.qs.serve.modules.tzc.common.util; + +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.tbs.entity.TbsBudgetCondition; +import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; +import com.qs.serve.modules.tzc.common.dto.PolicySortWrapper; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * 用于排序 + * @author YenHex + * @since 2023/5/18 + */ +@Slf4j +@Data +public class PolicySortWrapperUtil { + + public static List initializeSort(TzcPolicyItem policyItem, List list, PolicySortWrapper wrapper){ + List resultSortList = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(list)){ + //1.科目限制>品类之间>时间区间 + //2.相同品类,取纬度最小值 + //3.时间区间内,区间长度取最短 + //3.时间区间内,区间长度相同,取最近结束时间 + List tmpList4Subject = new ArrayList<>(); + for (TbsScheduleItemBudget scheduleItemBudget : list) { + Long budgetId = scheduleItemBudget.getBudgetId(); + if(wrapper.getBudgetSet4Subject().contains(budgetId)){ + tmpList4Subject.add(scheduleItemBudget); + } + } + log.debug("政策项【{}】匹配有科目预算数:{}",policyItem.getPolicyItemCode() ,tmpList4Subject.size() ); + if(CollectionUtil.isNotEmpty(tmpList4Subject)){ + PolicySortWrapperUtil.sort4Condition(policyItem,tmpList4Subject,resultSortList,wrapper); + } + } + if(resultSortList.size()!=list.size()){ + log.error("排序有误"); + Assert.throwEx("排序有误"); + } + return resultSortList; + } + + /** + * 按有无条件分割 + * @param policyItem + * @param list + * @param result + * @param wrapper + */ + private static void sort4Condition(TzcPolicyItem policyItem,List list,List result,PolicySortWrapper wrapper) { + List tmpList4Condition = new ArrayList<>(); + List tmpList4NoCondition = new ArrayList<>(); + for (TbsScheduleItemBudget scheduleItemBudget : list) { + Long budgetId = scheduleItemBudget.getBudgetId(); + if(wrapper.getBudgetSet4Condition().contains(budgetId)){ + tmpList4Condition.add(scheduleItemBudget); + }else{ + tmpList4NoCondition.add(scheduleItemBudget); + } + } + log.debug("活动【{}】匹配有条件预算数:{},无条件预算:{}",policyItem.getPolicyItemCode() ,tmpList4Condition.size() , tmpList4NoCondition.size()); + if(CollectionUtil.isNotEmpty(tmpList4Condition)){ + PolicySortWrapperUtil.sort4GoodsCondition(policyItem,tmpList4Condition,result,wrapper); + } + if(CollectionUtil.isNotEmpty(tmpList4NoCondition)){ + PolicySortWrapperUtil.sort4NotGoodsCondition(tmpList4NoCondition,result,wrapper); + } + } + + private static void sort4GoodsCondition(TzcPolicyItem policyItem,List list,List result,PolicySortWrapper wrapper){ + if(CollectionUtil.isNotEmpty(list)){ + List activityCostConditions = wrapper.getPolicyItemCostConditionsOfSort().get(policyItem.getId()); + Collections.sort(activityCostConditions, (o1, o2) -> { + int len1 = o1.getTargetLevelPathIds().split("_").length; + int len2 = o2.getTargetLevelPathIds().split("_").length; + if(len1==len2){ + List scheduleItemBudgets = list; + Long day1 = null; + Long day2 = null; + for (TbsScheduleItemBudget itemBudget : scheduleItemBudgets) { + if(itemBudget.getBudgetId().equals(o1.getBudgetId())){ + day1 = Duration.between(itemBudget.getStartDate(), itemBudget.getEndDate()).toDays(); + }else if (itemBudget.getBudgetId().equals(o2.getBudgetId())){ + day2 = Duration.between(itemBudget.getStartDate(), itemBudget.getEndDate()).toDays(); + } + } + log.debug("活动【{}】 时间区间相同,day1:{} , day2:{}",policyItem.getPolicyItemCode(),day1,day2); + if(day1!=null&&day2!=null){ + return (int) (day1-day2); + } + } + return len2 - len1; + }); + List newSortList = new ArrayList<>(); + for (TbsBudgetCondition costCondition : activityCostConditions) { + for (TbsScheduleItemBudget scheduleItemBudget : list) { + if(scheduleItemBudget.getBudgetId().equals(costCondition.getBudgetId())){ + newSortList.add(scheduleItemBudget); + break; + } + } + } + if(newSortList.size()!=list.size()){ + log.error("排序有误"); + Assert.throwEx("排序有误"); + } + result.addAll(newSortList); + } + } + + private static void sort4NotGoodsCondition(List list,List result,PolicySortWrapper wrapper){ + if(CollectionUtil.isNotEmpty(list)){ + Collections.sort(list, (o1, o2) -> { + Long day1 = Duration.between(o1.getStartDate(), o1.getEndDate()).toDays(); + Long day2 = Duration.between(o2.getStartDate(), o2.getEndDate()).toDays(); + log.debug("时间区间相同,day1:{} , day2:{}",day1,day2); + return (int) (day1-day2); + }); + result.addAll(list); + } + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyController.java new file mode 100644 index 0000000..fb7acdb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyController.java @@ -0,0 +1,513 @@ +package com.qs.serve.modules.tzc.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.annotation.LimitSubmit; +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.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.service.BmsRegion2Service; +import com.qs.serve.modules.seeyon.entity.CtpAffairQo; +import com.qs.serve.modules.seeyon.entity.bo.CtpAddNodeParam; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.tbs.entity.TbsBudgetLog; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCostResult; +import com.qs.serve.modules.tbs.entity.vo.CtpAffairVo; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetTableVo; +import com.qs.serve.modules.tbs.service.TbsBudgetLogService; +import com.qs.serve.modules.tzc.common.TzPolicyItemStatus; +import com.qs.serve.modules.tzc.common.TzcPolicyStatus; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; +import com.qs.serve.modules.tzc.service.TzcPolicyApplicationService; +import com.qs.serve.modules.tzc.service.TzcPolicyItemService; +import com.qs.serve.modules.tzc.service.impl.TzcPolicyOperationServiceImpl; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tzc.entity.bo.TzcPolicyBo; +import com.qs.serve.modules.tzc.entity.TzcPolicy; +import com.qs.serve.modules.tzc.service.TzcPolicyService; + +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 政策 政策 + * @author YenHex + * @since 2023-02-20 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tzc/policy") +public class TzcPolicyController { + + private TzcPolicyService tzcPolicyService; + private TzcPolicyItemService tzcPolicyItemService; + private TzcPolicyApplicationService policyApplicationService; + private TzcPolicyOperationServiceImpl tzcPolicyOperationService; + private SysPostUserService postUserService; + private VtbVerificationService verificationService; + private TbsBudgetLogService budgetLogService; + private BmsRegion2Service bmsRegion2Service; + + @GetMapping("succ") + public R succ(Long id,String all){ + if("all".equals(all)){ + LambdaQueryWrapper itemLqw = new LambdaQueryWrapper<>(); + itemLqw.select(TzcPolicyItem::getId); + itemLqw.eq(TzcPolicyItem::getPolicyItemStatus,TzPolicyItemStatus.Status_1_PassSuccess); + List policyItemList = tzcPolicyItemService.list(itemLqw); + for (TzcPolicyItem policyItem : policyItemList) { + policyApplicationService.syncPolicyItem(policyItem.getId()); + } + }else { + policyApplicationService.syncPolicyItem(id); + } + return R.ok(); + } + + /** + * 预览 + * @param id + * @return + */ + @GetMapping("preview") + public R preview(Long id){ + TbsBudgetCostResult result = policyApplicationService.buildBudgetCostResult(id,false,true); + return R.ok(result.getTableData()); + } + + /** + * 预览 + * @param id + * @return + */ + @GetMapping("preview2") + public R preview2(Long id){ + TbsBudgetTableVo result = policyApplicationService.buildResultTable(id); + return R.ok(result); + } + + /** + * 提交审批 + * @param policyId + * @return + */ + @LimitSubmit + @PostMapping("/commitPolicy/{policyId}") + public R commitPolicy(@PathVariable("policyId")Long policyId){ + policyApplicationService.commitPolicy(policyId); + return R.ok(); + } + + /** + * 翻页(我的) + * @param param + * @return + */ + @GetMapping("/pageMy") + public R> getPageMy(TzcPolicy param){ + String userId = AuthContextUtils.getSysUserId(); + List cateIds = this.getCateIds(param.getCusProvince(),param.getCusCity(),param.getCusArea()); + param.setCusCategoryIds(cateIds); + param.setUserId(userId); + PageUtil.startPage(); + List list = tzcPolicyService.selectPolicyList(param); + return R.byPageHelperList(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/pageMyAndChild") + public R> getPageMyAndChild(TzcPolicy param){ + String userId = AuthContextUtils.getSysUserId(); + List userIds = postUserService.listByChildIds(userId); + List cateIds = this.getCateIds(param.getCusProvince(),param.getCusCity(),param.getCusArea()); + param.setCusCategoryIds(cateIds); + userIds.add(userId); + param.setChildUserIds(userIds); + PageUtil.startPage(); + List list = tzcPolicyService.selectPolicyList(param); + return R.byPageHelperList(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('tzc:policy:query')") + public R> getPage(TzcPolicy param){ + List cateIds = this.getCateIds(param.getCusProvince(),param.getCusCity(),param.getCusArea()); + param.setCusCategoryIds(cateIds); + PageUtil.startPage(); + List list = tzcPolicyService.selectPolicyList(param); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Policy, title = "政策", biz = BizType.QUERY) + @PreAuthorize("hasRole('tzc:policy:query')") + 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); + } + return R.ok(tzcPolicy); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.Policy, title = "政策", biz = BizType.UPDATE) + @PreAuthorize("hasRole('tzc:policy:update')") + public R updateById(@RequestBody @Valid TzcPolicyBo param){ + if(param.getId()==null){ + return R.error(); + } + return tzcPolicyService.modify(param); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.Policy, title = "政策", biz = BizType.INSERT) + @PreAuthorize("hasRole('tzc:policy:insert')") + public R save(@RequestBody @Valid TzcPolicyBo param){ + param.setId(null); + return tzcPolicyService.modify(param); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.Policy, title = "政策", biz = BizType.DELETE) + @PreAuthorize("hasRole('tzc:policy:delete')") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(TzcPolicy::getId,idsLong); + lqw.eq(TzcPolicy::getPolicyStatus, TzcPolicyStatus.Status_0_UnCommit); + boolean result = tzcPolicyService.remove(lqw); + if(result){ + return R.ok(); + } + return R.error("当前状态不支持删除"); + } + + + + /** + * 审批列表(用于详情页) + * @param policyId + * @return + */ + @GetMapping("/ListAffairs") + public R> pageMemberAffair(String policyId){ + TzcPolicy policy = tzcPolicyService.getById(policyId); + return tzcPolicyOperationService.pageAffairV2(policyId,policy.getPolicyCode()); +// TzcPolicy tzcPolicy = tzcPolicyService.getById(policyId); +// if(tzcPolicy.getSyFormId()==null){ +// return R.ok(); +// } +// String templateCode = TbsSeeYonConst.PolicyConf.Code(); +// R> syResult = seeYonService.commonListAffairs(policyId+"",null,templateCode); +// List ctpAffairs = syResult.getData(); +// if(ctpAffairs.size()>0){ +// List oaUserIds = ctpAffairs.stream().map(CtpAffair::getMemberId).collect(Collectors.toList()); +// List userList = sysUserService.listByOaMemberIds(oaUserIds); +// List result = new ArrayList<>(); +// for (CtpAffair ctpAffair : ctpAffairs) { +// CtpAffairVo ctpAffairVo = new CtpAffairVo(); +// ctpAffairVo.setAffairInfo(ctpAffair); +// for (SysUser user : userList) { +// if(ctpAffair.getMemberId().equals(user.getSyUserId())){ +// ctpAffairVo.setUserInfo(user.toSysUserVo()); +// } +// } +// result.add(ctpAffairVo); +// } +// return R.ok(result); +// } +// return R.ok(); + } + + /** + * 审批列表(翻页) + * @param param + * @return + */ + @GetMapping("/pageMemberAffair") + public R> pageMemberAffair(CtpAffairQo param, + String policyCode){ + param.setRecordCode(policyCode); + return tzcPolicyOperationService.pageMemberAffair(param); +// param.setTitle(param.getChargeTheme()); +// param.setApplyUserName(param.getUserName()); +// SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); +// if(!StringUtils.hasText(sysUser.getSyUserId())||!StringUtils.hasText(sysUser.getSyAccount())){ +// return R.error("当前账号未绑定致远用户信息"); +// } +// param.setMemberId(sysUser.getSyUserId()); +// param.setTemplateCode(TbsSeeYonConst.PolicyConf.Code()); +// R> syResult = seeYonService.pageMemberAffair(param); +// PageVo pageVo = syResult.getData(); +// List ctpAffairs = pageVo.getList(); +// if(ctpAffairs.size()>0){ +// List oaUserIds = ctpAffairs.stream().map(CtpAffair::getMemberId).collect(Collectors.toList()); +// List userList = sysUserService.listByOaMemberIds(oaUserIds); +// List policyIds = ctpAffairs.stream().map(CtpAffair::getCostApplyId).collect(Collectors.toList()); +// List policyList = tzcPolicyService.listByIds(policyIds); +// List result = new ArrayList<>(); +// for (CtpAffair ctpAffair : ctpAffairs) { +// CtpAffairVo ctpAffairVo = new CtpAffairVo(); +// for (TzcPolicy policy : policyList) { +// if(policy.getId().toString().equals(ctpAffair.getCostApplyId())){ +// ctpAffairVo.setPolicyInfo(policy); +// break; +// } +// } +// for (SysUser user : userList) { +// if(ctpAffair.getMemberId().equals(user.getSyUserId())){ +// ctpAffairVo.setUserInfo(user.toSysUserVo()); +// } +// } +// ctpAffairVo.setAffairInfo(ctpAffair); +// result.add(ctpAffairVo); +// } +// PageVo costApplyPageVo = PageVo.initNewList(pageVo,result); +// return R.ok(costApplyPageVo); +// } +// return R.byEmptyList(); + } + + /** + * 提交审批节点 + * @return + */ + @PostMapping("/commitAffair") + @SysLog(module = SystemModule.Policy, title = "政策", biz = BizType.DELETE) + @PreAuthorize("hasRole('tbs:costApply:commit')") + public R commitAffair(@RequestBody @Valid TbsAffairCommitBo affairCommit){ + return tzcPolicyOperationService.commitAffair(affairCommit); +// seeYonService.testConnection(); +// Long policyId = affairCommit.getPolicyId(); +// TzcPolicy tzcPolicy = tzcPolicyService.getById(policyId); +// if(!tzcPolicy.getPolicyStatus().equals(TzcPolicyStatus.Status_1_Checking)){ +// return R.error("费用申请处于未非审批状态!"); +// } +// R result = seeYonService.commonCommit(affairCommit,TbsSeeYonConst.PolicyConf.Code(),tzcPolicy.getSyFormId()); +// boolean isBackCommit = affairCommit.getState()==2; +// if(result.getStatus()==200){ +// // 判断是否含有下个节点 +// String flag = result.getData(); +// //审批中(next)、完成(finish)、拒绝(refused) +// if("finish".equals(flag)){ +// TzcPolicy policy = new TzcPolicy(); +// policy.setId(tzcPolicy.getId()); +// policy.setPolicyStatus(TzcPolicyStatus.Status_2_PassSuccess); +// policy.setPassTime(LocalDateTime.now()); +// tzcPolicyService.updateById(policy); +// //更新活动通过时间 +// TzcPolicyItem policyItem = new TzcPolicyItem(); +// policyItem.setPolicyItemStatus(TzPolicyItemStatus.Status_1_PassSuccess); +// LambdaQueryWrapper itemLqw = new LambdaQueryWrapper<>(); +// itemLqw.eq(TzcPolicyItem::getPolicyId,tzcPolicy.getId()); +// tzcPolicyItemService.update(policyItem,itemLqw); +// return R.ok(); +// }else if ("stop".equals(flag)){ +// if(isBackCommit){ +// TzcPolicy policy = new TzcPolicy(); +// policy.setId(tzcPolicy.getId()); +// policy.setPolicyStatus(TzcPolicyStatus.Status_4_RollBack); +// tzcPolicyService.updateById(policy); +// LambdaQueryWrapper logLqw = new LambdaQueryWrapper<>(); +// logLqw.select(TbsBudgetLog::getId); +// logLqw.eq(TbsBudgetLog::getPolicyId,tzcPolicy.getId()); +// logLqw.eq(TbsBudgetLog::getRollbackFlag, BudgetLogRollbackFlag.State_0); +// List budgetLogList = tbsBudgetLogService.list(logLqw); +// budgetLogList.forEach(a->a.setRollbackFlag(BudgetLogRollbackFlag.State_1)); +// tbsBudgetLogService.updateBatchById(budgetLogList); +// return R.ok(); +// }else { +// TzcPolicy policy = new TzcPolicy(); +// policy.setId(tzcPolicy.getId()); +// policy.setPolicyStatus(TzcPolicyStatus.Status_3_Refuse); +// tzcPolicyService.updateById(policy); +// tzcPolicyService.releaseCost(policy.getId(), 1); +// //移除日志 +// LambdaQueryWrapper logLqw = new LambdaQueryWrapper<>(); +// logLqw.eq(TbsBudgetLog::getPolicyId,tzcPolicy.getId()); +// List oldLogList = tbsBudgetLogService.list(logLqw); +// List oldLogList4Upd = oldLogList.stream().map(a->{ +// TbsBudgetLog budgetLog = new TbsBudgetLog(); +// budgetLog.setId(a.getId()); +// budgetLog.setRollbackFlag(BudgetLogRollbackFlag.State_3); +// return budgetLog; +// }).collect(Collectors.toList()); +// tbsBudgetLogService.updateBatchById(oldLogList4Upd); +// for (TbsBudgetLog budgetLog : oldLogList) { +// budgetLog.setCreateBy(null); +// budgetLog.setCreateTime(null); +// budgetLog.setUpdateBy(null); +// budgetLog.setUpdateTime(null); +// budgetLog.setId(null); +// BudgetLogOptFlag optFlag = BudgetLogOptFlag.State_12; +// budgetLog.setAmount(TbsBudgetLogBuildUtil.buildAmount(budgetLog.getAmount(),optFlag)); +// budgetLog.setOptType(optFlag.getCode()); +// } +// tbsBudgetLogService.saveBatch(oldLogList); +// return R.ok(); +// } +// }else if ("next".equals(flag)){ +// return R.ok(); +// } +// }else if (result.getStatus()==500){ +// return result; +// } +// return R.error("远程调用失败"); + } + + + /** + * 加签 + * @param param + * @return + */ + @PostMapping("/addNode") + @SysLog(module = SystemModule.Budget, title = "政策", biz = BizType.DELETE) + public R addNode(@RequestBody CtpAddNodeParam param){ + return tzcPolicyOperationService.addNode(param); + } + + + /** + * 获取未完成审批统计(个人) + * @return + */ + @PostMapping("/getAffairUnfinished") + public R getUnfinished(){ + return tzcPolicyOperationService.getUnfinished(); + } + + /** + * 补偿按钮 + * @param id + * @return + */ + @PostMapping("/compensate/{id}") + public R compensate(@PathVariable("id") String id){ + return tzcPolicyOperationService.runCompensate(id); + } + + /** + * 作废 用于过审的政策 + * @param id + * @return + */ + @DeleteMapping("/cancellation/{id}") + public R cancellation(@PathVariable Long id){ + List tzcPolicyItemList = tzcPolicyItemService.listByPolicyId(id); + List itemIds = tzcPolicyItemList.stream().map(TzcPolicyItem::getId).collect(Collectors.toList()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(VtbVerification::getPolicyItemId,itemIds); + long count = verificationService.count(lqw); + if(count>0){ + return R.error("已核销的政策无法作废"); + } + //释放预算占用 + LambdaQueryWrapper logLqw = new LambdaQueryWrapper<>(); + logLqw.eq(TbsBudgetLog::getPolicyId,id); + budgetLogService.remove(logLqw); + //释放政策及关联数据 + for (TzcPolicyItem policyItem : tzcPolicyItemList) { + policyItem.setPolicyItemStatus(TzPolicyItemStatus.Status_0_Default); + tzcPolicyItemService.updateById(policyItem); + } + TzcPolicy policy = new TzcPolicy(); + policy.setId(id); + policy.setPolicyStatus(TzcPolicyStatus.Status_6_CANCEL); + policy.setPassTime(LocalDateTime.now()); + tzcPolicyService.updateById(policy); + // 远程修复OA的待审批列表 select * from tzc_policy where policy_status = 6 and `policy_code` in ( + return R.ok(); + } + + + private List getCateIds(String province,String city,String area){ + LambdaQueryWrapper region2Lqw = new LambdaQueryWrapper<>(); + boolean search = false; + if(StringUtils.hasText(province)){ + search = true; + region2Lqw.or(an->{ + an.like(BmsRegion2::getName,province) + .eq(BmsRegion2::getLevel,1); + }); + } + if(StringUtils.hasText(city)){ + search = true; + region2Lqw.or(an->{ + an.like(BmsRegion2::getName,city) + .eq(BmsRegion2::getLevel,2); + }); + } + if(StringUtils.hasText(area)){ + search = true; + region2Lqw.or(an->{ + an.like(BmsRegion2::getName,area) + .eq(BmsRegion2::getLevel,3); + }); + } + if(!search){ + return null; + } + region2Lqw.select(BmsRegion2::getId); + List bmsRegion2List = bmsRegion2Service.list(region2Lqw); + return bmsRegion2List.stream().map(BmsRegion2::getId).collect(Collectors.toList()); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyItemController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyItemController.java new file mode 100644 index 0000000..0c98ddb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyItemController.java @@ -0,0 +1,248 @@ +package com.qs.serve.modules.tzc.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.sys.common.AuthContextUtils; +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.TzcPolicyStatus; +import com.qs.serve.modules.tzc.entity.TzcPolicy; +import com.qs.serve.modules.tzc.entity.TzcPolicyGoods; +import com.qs.serve.modules.tzc.service.TzcPolicyApplicationService; +import com.qs.serve.modules.tzc.service.TzcPolicyGoodsService; +import com.qs.serve.modules.tzc.service.TzcPolicyService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.tzc.entity.bo.TzcPolicyItemBo; +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; + +/** + * 政策 政策项 + * @author YenHex + * @since 2023-02-20 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tzc/policyItem") +public class TzcPolicyItemController { + + private SysUserService sysUserService; + private TbsScheduleItemBudgetMapper tbsScheduleItemBudgetMapper; + private TzcPolicyItemService tzcPolicyItemService; + private TzcPolicyGoodsService tzcPolicyGoodsService; + private TzcPolicyService tzcPolicyService; + private SysAttachService attachService; + private TzcPolicyApplicationService policyApplicationService; + + /** + * 释放政策 + * @param policyItemId + * @return + */ + @GetMapping("/releaseDev") + public R releasePcy(Long policyItemId){ + policyApplicationService.syncExpireRelease(); + return R.ok(); + } + + /** + * 释放政策 + * @param policyItemId + * @return + */ + @GetMapping("/releasePolicyByItemId") + public R releasePolicy(Long 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(); + } + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(TzcPolicyItem param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + List list = tzcPolicyItemService.list(lqw); + + TzcPolicy policy = null; + if(param.getPolicyId()!=null){ + 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){ + List attachList = attachService.listByIds(Arrays.asList(policyItem.getAttachIds())); + policyItem.setAttachList(attachList); + } + + if(policy!=null){ + boolean pass1 = policy.getPolicyStatus().equals(TzcPolicyStatus.Status_1_Checking); + boolean pass2 = policy.getPolicyStatus().equals(TzcPolicyStatus.Status_2_PassSuccess); + boolean pass3 = policy.getPolicyStatus().equals(TzcPolicyStatus.Status_3_Success); + if(pass1||pass2||pass3){ + List budgetList =tbsScheduleItemBudgetMapper.listByPolicyItemId(policyItem.getId()+""); + policyItem.setMatchBudgetList(budgetList); + }else { + //FYMC05 随货折让 + String subjectId = "63"; + String centerType = policyItem.getCenterType(); + String centerId = policyItem.getCenterId(); + //可选的所有预算 + List budgetList = + tbsScheduleItemBudgetMapper.listBySubjectAndCenter(subjectId,centerType,centerId); + policyItem.setMatchBudgetList(budgetList); + } + } + + + + } + + return R.ok(list); + } + + + /** + * 政策项商品列表 + * @param itemId + * @return + */ + @GetMapping("/listItemGoods/{itemId}") + public R> getList(@PathVariable("itemId")Long itemId){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TzcPolicyGoods::getPolicyItemId,itemId); + List list = tzcPolicyGoodsService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + //@GetMapping("/page") + public R> getPage(TzcPolicyItem param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = tzcPolicyItemService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Policy, title = "政策项", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + TzcPolicyItem tzcPolicyItem = tzcPolicyItemService.getById(id); + List goodsList = tzcPolicyGoodsService.listByItemId(tzcPolicyItem.getId()); + for (TzcPolicyGoods policyGoods : goodsList) { + policyGoods.initSpuSkuName(); + policyGoods.setTargetName("("+policyGoods.getBrandName()+")"+policyGoods.getTargetName()); + } + tzcPolicyItem.setPolicyGoodsList(goodsList); + if(CollectionUtil.isNotEmpty(tzcPolicyItem.getAttachIds())){ + List attachIds = Arrays.asList(tzcPolicyItem.getAttachIds()); + List attachList = attachService.listByIds(attachIds); + tzcPolicyItem.setAttachList(attachList); + } + return R.ok(tzcPolicyItem); + } + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.Policy, title = "政策项", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid TzcPolicyItemBo param){ + if(param.getId()==null){ + return R.error(); + } + return tzcPolicyItemService.modify(param); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.Policy, title = "政策项", biz = BizType.INSERT) + public R save(@RequestBody @Valid TzcPolicyItemBo param){ + param.setId(null); + return tzcPolicyItemService.modify(param); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.Policy, title = "政策项", biz = BizType.DELETE) + @PreAuthorize("hasRole('tzc:policy:insert')") + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + List policyItemList = tzcPolicyItemService.listByIds(idsLong); + List policyIdsList = policyItemList.stream().map(TzcPolicyItem::getPolicyId).distinct().collect(Collectors.toList()); + List policyList = tzcPolicyService.listByIds(policyIdsList); + policyList.forEach(a->{ + if(!a.allowEditFlag()){ + Assert.throwEx("当前状态不支持编辑"); + } + }); + boolean result = tzcPolicyItemService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyTestController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyTestController.java new file mode 100644 index 0000000..0e20175 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/controller/TzcPolicyTestController.java @@ -0,0 +1,209 @@ +package com.qs.serve.modules.tzc.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.service.BmsRegion2Service; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysTableTemp; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysTableTempMapper; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; +import com.qs.serve.modules.tbs.entity.TbsBudget; +import com.qs.serve.modules.tbs.entity.TbsBudgetCostItemPolicy; +import com.qs.serve.modules.tbs.entity.TbsBudgetLog; +import com.qs.serve.modules.tbs.entity.dto.TbsBudgetCostResult; +import com.qs.serve.modules.tbs.service.TbsBudgetCostItemPolicyService; +import com.qs.serve.modules.tbs.service.TbsBudgetLogService; +import com.qs.serve.modules.tzc.common.TzPolicyItemStatus; +import com.qs.serve.modules.tzc.entity.TzcPolicy; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; +import com.qs.serve.modules.tzc.service.TzcPolicyApplicationService; +import com.qs.serve.modules.tzc.service.TzcPolicyItemService; +import com.qs.serve.modules.tzc.service.TzcPolicyService; +import com.qs.serve.modules.tzc.service.impl.TzcPolicyOperationServiceImpl; +import com.qs.serve.modules.vtb.service.VtbVerificationService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 政策 政策 + * @author YenHex + * @since 2023-02-20 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("tzc/policyTest") +public class TzcPolicyTestController { + + private TzcPolicyService tzcPolicyService; + private TzcPolicyItemService tzcPolicyItemService; + private TzcPolicyApplicationService policyApplicationService; + private TzcPolicyOperationServiceImpl tzcPolicyOperationService; + private SysPostUserService postUserService; + private VtbVerificationService verificationService; + private TbsBudgetLogService budgetLogService; + private BmsRegion2Service bmsRegion2Service; + private TbsBudgetCostItemPolicyService tbsBudgetCostItemPolicyService; + private SysUserService sysUserService; + private SysTableTempMapper sysTableTempMapper; + private TzcPolicyApplicationService tzcPolicyApplicationService; + private TzcPolicyItemService policyItemService; + + + @GetMapping("/testSyncPolicy") + public R syncPolicy(Long policyId){ + AuthContextUtils.setTenant("001"); + LambdaQueryWrapper itemLqw = new LambdaQueryWrapper<>(); + itemLqw.select(TzcPolicyItem::getId); + itemLqw.eq(TzcPolicyItem::getPolicyItemStatus,TzPolicyItemStatus.Status_1_PassSuccess); + List policyItemList = policyItemService.list(itemLqw); + for (TzcPolicyItem policyItem : policyItemList) { + policyApplicationService.syncPolicyItem(policyItem.getId()); + } + return R.ok(); + } + + + @GetMapping("/rebulidAllPolicy") + public R rebulidAllPolicy(){ + Long[] ids = new Long[]{ + //487L, + //555L, + //738L, + 775L + }; + for (Long id : ids) { + rebuildPolicy(id); + } + return R.ok(); + } + + public R rebuildPolicy(Long policyId){ + + TzcPolicy tzcPolicy = tzcPolicyService.getById(policyId); + SysUser sysUser = sysUserService.getById(tzcPolicy.getCreateBy()); + + SysTableTemp sysTableTemp = new SysTableTemp(); + sysTableTemp.setTableName("policyId"); + sysTableTemp.setTableId(""+policyId); + sysTableTemp.setOptionTitle("PreRebuildPolicy"); + TbsBudgetCostResult result = policyApplicationService.buildBudgetCostResult(policyId,false,false); + if(result.getBudgetUnMatchList()!=null&&result.getBudgetUnMatchList().size()>0){ + sysTableTemp.setResultMsg("政策匹配预算失败"); + //sysTableTempMapper.insert(sysTableTemp); + return R.error("政策匹配预算失败"); + } + LambdaQueryWrapper itemPolicyLqw = new LambdaQueryWrapper<>(); + itemPolicyLqw.eq(TbsBudgetCostItemPolicy::getPolicyId,policyId); + List orgBudgetItem = tbsBudgetCostItemPolicyService.list(itemPolicyLqw); + + List allBudgetItem = result.getPolicyBudgetMatchList(); + + boolean isMatchAll = true; + for (TbsBudgetCostItemPolicy item1 : allBudgetItem) { + boolean isMatch = false; + for (TbsBudgetCostItemPolicy item2 : orgBudgetItem) { + if(item1.getScheduleItemBudgetId().equals(item2.getScheduleItemBudgetId())&&item1.getPolicyItemId().equals(item2.getPolicyItemId())){ + isMatch = true; + } + } + if(!isMatch){ + isMatchAll = false; + break; + } + } + + //判断是否正常数据 + if(isMatchAll){ + sysTableTemp.setResultMsg("正常"); + //sysTableTempMapper.insert(sysTableTemp); + return R.ok("正常"); + }else { + //sysTableTemp.setResultMsg("预算占用错误"); + //sysTableTempMapper.insert(sysTableTemp); + //return R.ok("预算占用错误"); + } + + + //保存预算使用日志 + List budgetLogList = saveBudgetLog(result, sysUser, tzcPolicy, result.getPolicyBudgetMatchList(),result.getPolicyItemList()); + LambdaQueryWrapper citemLqw = new LambdaQueryWrapper<>(); + citemLqw.eq(TbsBudgetCostItemPolicy::getPolicyId,policyId); + List itemList = tbsBudgetCostItemPolicyService.list(citemLqw); + //Assert.throwEx("dev"); + // 设置remark标记防止误删,移除旧的记录 + for (TbsBudgetCostItemPolicy costItem : itemList) { + costItem.setRemark("toDel"); + } + tbsBudgetCostItemPolicyService.updateBatchById(itemList); + List itemIds = itemList.stream().map(TbsBudgetCostItemPolicy::getId).collect(Collectors.toList()); + tbsBudgetCostItemPolicyService.removeBatchByIds(itemIds); + tbsBudgetCostItemPolicyService.saveBatch(allBudgetItem); + + + // 设置remark标记防止误删,移除旧的记录 + LambdaQueryWrapper bLqw = new LambdaQueryWrapper<>(); + bLqw.eq(TbsBudgetLog::getPolicyId,policyId); + List dbbudgetLogs = budgetLogService.list(bLqw); + for (TbsBudgetLog budgetLog : dbbudgetLogs) { + budgetLog.setRemark("toDel"); + } + budgetLogService.updateBatchById(dbbudgetLogs); + List budIds = dbbudgetLogs.stream().map(TbsBudgetLog::getId).collect(Collectors.toList()); + budgetLogService.removeBatchByIds(budIds); + //重新保存 + if(CollectionUtil.isNotEmpty(budgetLogList)){ + budgetLogService.saveBatch(budgetLogList); + } + return R.ok(); + } + + /** + * 保存预算使用日志 + * @param result + * @param sysUser + * @param tzcPolicy + * @param allBudgetItem + */ + private List saveBudgetLog(TbsBudgetCostResult result, SysUser sysUser, TzcPolicy tzcPolicy, List allBudgetItem, List policyItemList) { + List budgetLogList = new ArrayList<>(); + List budgetList = result.getBudgetList(); + for (TbsBudgetCostItemPolicy item : allBudgetItem) { + //排除不匹配预算的项 + if(item.getBudgetId().equals(0L)){ + continue; + } + TbsBudget budget = null; + for (TbsBudget tbsBudget : budgetList) { + if(item.getBudgetId().equals(tbsBudget.getId())){ + budget = tbsBudget; + break; + } + } + if(budget==null){ + continue; + } + TzcPolicyItem currPolicyItem = null; + for (TzcPolicyItem policyItem : policyItemList) { + if(item.getPolicyItemId().equals(policyItem.getId())){ + currPolicyItem = policyItem; + } + } + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.buildTbsBudgetLog(BudgetLogOptFlag.State_11,sysUser, tzcPolicy, item, budget,item.getPolicyItemAmount().negate(),currPolicyItem); + budgetLogList.add(budgetLog); + } + return budgetLogList; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicy.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicy.java new file mode 100644 index 0000000..cbd6dcd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicy.java @@ -0,0 +1,196 @@ +package com.qs.serve.modules.tzc.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.tzc.common.TzcPolicyStatus; +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 2023-02-20 + */ +@Data +@TableName("tzc_policy") +public class TzcPolicy implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 主题 */ + @NotBlank(message = "主题不能为空") + @Length(max = 60,message = "主题长度不能超过60字") + @TableField(condition = SqlCondition.LIKE) + private String title; + + /** 政策编码 */ + @NotBlank(message = "政策编码不能为空") + @Length(max = 50,message = "政策编码长度不能超过50字") + @TableField(condition = SqlCondition.LIKE) + private String policyCode; + + /** 通过状态(0-未提交;1-审核中;2-已通过待执行;3-拒绝;4-被驳回;5-结束) */ + @NotNull(message = "通过状态不能为空") + private Integer policyStatus; + + /** 通过时间 */ + @Length(max = 0,message = "通过时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime passTime; + + /** 政策项数量 */ + private Integer totalItems; + + /** 政策项总金额 */ + private BigDecimal totalItemAmount; + + /** 政策项总使用金额 */ + private BigDecimal totalItemUsedAmount; + + /** 客户id */ + @NotNull(message = "客户id不能为空") + private Long supplierId; + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + @Length(max = 30,message = "客户编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String supplierCode; + + /** 客户名称 */ + @NotBlank(message = "客户名称不能为空") + @Length(max = 30,message = "客户名称长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String supplierName; + + /** 客户省市区 */ + @TableField(condition = SqlCondition.LIKE) + private String supplierRegion2; + + /** 客户省市区编码 */ + @TableField(condition = SqlCondition.LIKE) + private String supplierRegion2Code; + + /** 申请人 */ + @NotBlank(message = "申请人不能为空") + @Length(max = 32,message = "申请人长度不能超过32字") + private String userId; + + /** 申请人 */ + @NotBlank(message = "申请人不能为空") + @Length(max = 32,message = "申请人长度不能超过32字") + @TableField(condition = SqlCondition.LIKE) + private String userCode; + + /** 申请人 */ + @NotBlank(message = "申请人不能为空") + @Length(max = 32,message = "申请人长度不能超过32字") + @TableField(condition = SqlCondition.LIKE) + private String userName; + + private String syFormId; + + private String syFlowId; + + /** 提交时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime submitTime; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** + * 业务继承人 + */ + private String extUserId; + private String extUserCode; + private String extUserName; + + /** + * 客户省 + */ + @TableField(exist = false) + String cusProvince; + /** + * 客户市 + */ + @TableField(exist = false) + String cusCity; + /** + * 客户区 + */ + @TableField(exist = false) + String cusArea; + + /** + * 下属ID + */ + @TableField(exist = false) + List childUserIds; + + @TableField(exist = false) + List policyItemList; + + @TableField(exist = false) + private List cusCategoryIds; + + public boolean allowEditFlag(){ + if(!this.getPolicyStatus().equals(TzcPolicyStatus.Status_0_UnCommit) + && !this.getPolicyStatus().equals(TzcPolicyStatus.Status_4_RollBack)){ + return false; + } + return true; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyGoods.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyGoods.java new file mode 100644 index 0000000..4df50cc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyGoods.java @@ -0,0 +1,134 @@ +package com.qs.serve.modules.tzc.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 com.qs.serve.modules.tbs.common.TbsGoodsType; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +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 2023-02-20 + */ +@Slf4j +@Data +@TableName("tzc_policy_goods") +public class TzcPolicyGoods implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 政策id */ + @NotNull(message = "政策id不能为空") + private Long policyId; + + /** 政策项id */ + @NotNull(message = "政策项id不能为空") + private Long policyItemId; + + /** 政策编码 */ + @NotBlank(message = "政策编码不能为空") + @Length(max = 50,message = "政策编码长度不能超过50字") + private String policyItemCode; + + /** 目标类型(brand、category、series、spu、sku) */ + @NotBlank(message = "目标类型(brand、category、series、spu、sku)不能为空") + @Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字") + private String targetType; + + /** 目标id */ + @NotNull(message = "目标id不能为空") + private Long targetId; + + /** 目标编码 */ + @NotBlank(message = "目标编码不能为空") + @Length(max = 30,message = "目标编码长度不能超过30字") + private String targetCode; + + /** 目标名称 */ + @NotBlank(message = "目标名称不能为空") + @Length(max = 30,message = "目标名称长度不能超过30字") + private String targetName; + + /** 目标等级路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathIds; + + /** 目标等级路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathNames; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + @TableField(exist = false) + private String spuName; + + @TableField(exist = false) + private String skuName; + + @TableField(exist = false) + private String brandName; + + public void initSpuSkuName(){ + String[] names = this.getTargetLevelPathNames().split("_"); + this.setBrandName(names[0]); + if(this.getTargetType().equals(TbsGoodsType.sku.name())){ + try { + this.setSkuName(names[names.length-1]); + this.setSpuName(names[names.length-2]); + } catch (Exception e) { + log.error("格式错误:{}",this.getTargetLevelPathNames()); + } + } + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyGoodsSync.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyGoodsSync.java new file mode 100644 index 0000000..dbc89af --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyGoodsSync.java @@ -0,0 +1,90 @@ +package com.qs.serve.modules.tzc.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 2023-02-27 + */ +@Data +@TableName("tzc_policy_goods_sync") +public class TzcPolicyGoodsSync implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 政策id */ + @NotNull(message = "政策id不能为空") + private Long policyId; + + /** 政策项id */ + @NotNull(message = "政策项id不能为空") + private Long policyItemId; + + /** 政策编码 */ + @NotBlank(message = "政策编码不能为空") + @Length(max = 50,message = "政策编码长度不能超过50字") + private String policyItemCode; + + /** 规格id */ + @NotNull(message = "规格id不能为空") + private Long skuId; + + /** 规格编码 */ + @NotNull(message = "规格编码不能为空") + private Long skuCode; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyItem.java new file mode 100644 index 0000000..e439318 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyItem.java @@ -0,0 +1,254 @@ +package com.qs.serve.modules.tzc.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 com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import com.qs.serve.modules.tbs.entity.TbsBudgetCondition; +import com.qs.serve.modules.tbs.entity.TbsScheduleItemBudget; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * 政策项 实体类 + * @author YenHex + * @since 2023-02-20 + */ +@Data +@TableName(value = "tzc_policy_item",autoResultMap = true) +public class TzcPolicyItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 主题 */ + @NotBlank(message = "主题不能为空") + @Length(max = 60,message = "主题长度不能超过60字") + private String title; + + /** 政策id */ + @NotNull(message = "政策id不能为空") + private Long policyId; + + /** 政策编码 */ + @NotBlank(message = "政策编码不能为空") + @Length(max = 50,message = "政策编码长度不能超过50字") + private String policyItemCode; + + /** 开始时间 */ + @NotNull(message = "开始时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate policyStartDate; + + /** 结束时间 */ + @NotNull(message = "结束时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate policyEndDate; + + /** 状态:0-未使用;1-已通过;2-已同步;3-已用完 */ + @NotNull(message = "状态:0-未使用;1-已使用;2-已用完不能为空") + private Integer policyItemStatus; + + /** 满减金额 */ + @NotNull(message = "满减金额不能为空") + private BigDecimal discountAmount; + + /** 返点百分比 */ + @NotNull(message = "返点百分比不能为空") + private BigDecimal discountRate; + + /** 优惠上限 */ + private BigDecimal discountMax; + + /** 已用金额 */ + @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; + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + @Length(max = 30,message = "客户编码长度不能超过30字") + private String supplierCode; + + /** 客户名称 */ + @NotBlank(message = "客户名称不能为空") + @Length(max = 30,message = "客户名称长度不能超过30字") + private String supplierName; + + /** 申请人 */ + @NotBlank(message = "申请人不能为空") + @Length(max = 32,message = "申请人长度不能超过32字") + private String userId; + + /** 申请人 */ + @NotBlank(message = "申请人不能为空") + @Length(max = 32,message = "申请人长度不能超过32字") + private String userCode; + + /** 申请人 */ + @NotBlank(message = "申请人不能为空") + @Length(max = 32,message = "申请人长度不能超过32字") + private String userName; + + /** 成本中心类型 */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 50,message = "成本中心类型长度不能超过50字") + private String centerType; + + /** 成本中心id */ + @NotBlank(message = "成本中心id不能为空") + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 50,message = "成本中心编码长度不能超过50字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 50,message = "成本中心名称长度不能超过50字") + private String centerName; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** 同步状态 */ + private Integer syncStatus; + + /** + * 附件id + */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] attachIds; + + /** + * 预计销量 + */ + private Integer preActQuantity; + + /** + * 不做活动预计销量 + */ + private Integer preNotActQuantity; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + @TableField(exist = false) + private List policyGoodsList; + + /** 后端参数,预算考核期 */ + @TableField(exist = false) + List scheduleItemBudgetList; + + /** 后端参数,命中预算的条件 */ + @TableField(exist = false) + List usedConditionList; + + /** 附件列表 */ + @TableField(exist = false) + private List attachList; + + /** 附件列表 */ + @TableField(exist = false) + private List matchBudgetList; + + /** + * 是否过期 + */ + @TableField(exist = false) + private Integer expireFlag; + + public void initSetNull(){ + this.setId(null); + this.setCreateBy(null); + this.setCreateTime(null); + this.setUpdateBy(null); + this.setUpdateTime(null); + this.setDelFlag(null); + this.setRemark(null); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyItemLog.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyItemLog.java new file mode 100644 index 0000000..701cc47 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/TzcPolicyItemLog.java @@ -0,0 +1,199 @@ +package com.qs.serve.modules.tzc.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 2023-03-02 + */ +@Data +@TableName("tzc_policy_item_log") +public class TzcPolicyItemLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 主题 */ + @NotBlank(message = "主题不能为空") + @Length(max = 60,message = "主题长度不能超过60字") + private String title; + + /** 政策id */ + @NotNull(message = "政策id不能为空") + private Long policyId; + + /** 政策编码 */ + @NotBlank(message = "政策编码不能为空") + @Length(max = 50,message = "政策编码长度不能超过50字") + private String policyItemCode; + + /** 开始时间 */ + @NotNull(message = "开始时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate policyStartDate; + + /** 结束时间 */ + @NotNull(message = "结束时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate policyEndDate; + + /** 状态:0-未使用;1-已通过;2-已同步;3-已用完 */ + @NotNull(message = "状态:0-未使用;1-已通过;2-已同步;3-已用完不能为空") + private Integer policyItemStatus; + + /** 本次满减金额 */ + @NotNull(message = "本次满减金额不能为空") + private BigDecimal currentAmount; + + /** 客户id */ + @NotNull(message = "客户id不能为空") + private Long supplierId; + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + @Length(max = 30,message = "客户编码长度不能超过30字") + private String supplierCode; + + /** 客户名称 */ + @NotBlank(message = "客户名称不能为空") + @Length(max = 30,message = "客户名称长度不能超过30字") + private String supplierName; + + /** 申请人 */ + @NotBlank(message = "申请人不能为空") + @Length(max = 32,message = "申请人长度不能超过32字") + private String userId; + + /** 申请人 */ + @NotBlank(message = "申请人不能为空") + @Length(max = 32,message = "申请人长度不能超过32字") + private String userCode; + + /** 申请人 */ + @NotBlank(message = "申请人不能为空") + @Length(max = 32,message = "申请人长度不能超过32字") + private String userName; + + /** 成本中心类型 */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 50,message = "成本中心类型长度不能超过50字") + private String centerType; + + /** 成本中心id */ + @NotBlank(message = "成本中心id不能为空") + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 50,message = "成本中心编码长度不能超过50字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 50,message = "成本中心名称长度不能超过50字") + private String centerName; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + public static TzcPolicyItemLog toNewObject(TzcPolicyItem source,BigDecimal totalAmount){ + TzcPolicyItemLog policyItemLog = new TzcPolicyItemLog(); + policyItemLog.setTitle(source.getTitle()); + policyItemLog.setPolicyId(source.getPolicyId()); + policyItemLog.setPolicyItemCode(source.getPolicyItemCode()); + policyItemLog.setPolicyStartDate(source.getPolicyStartDate()); + policyItemLog.setPolicyEndDate(source.getPolicyEndDate()); + policyItemLog.setPolicyItemStatus(source.getPolicyItemStatus()); + policyItemLog.setCurrentAmount(totalAmount); + policyItemLog.setSupplierId(source.getSupplierId()); + policyItemLog.setSupplierCode(source.getSupplierCode()); + policyItemLog.setSupplierName(source.getSupplierName()); + policyItemLog.setUserId(source.getUserId()); + policyItemLog.setUserCode(source.getUserCode()); + policyItemLog.setUserName(source.getUserName()); + policyItemLog.setCenterType(source.getCenterType()); + policyItemLog.setCenterId(source.getCenterId()); + policyItemLog.setCenterCode(source.getCenterCode()); + policyItemLog.setCenterName(source.getCenterName()); + policyItemLog.setSubjectId(source.getSubjectId()); + policyItemLog.setSubjectCode(source.getSubjectCode()); + policyItemLog.setSubjectName(source.getSubjectName()); + policyItemLog.setRemark(source.getRemark()); + policyItemLog.setCreateTime(source.getCreateTime()); + policyItemLog.setUpdateTime(source.getUpdateTime()); + policyItemLog.setTenantId(source.getTenantId()); + policyItemLog.setCreateBy(source.getCreateBy()); + policyItemLog.setUpdateBy(source.getUpdateBy()); + policyItemLog.setDelFlag(source.getDelFlag()); + return policyItemLog; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyBo.java new file mode 100644 index 0000000..9f29f27 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyBo.java @@ -0,0 +1,46 @@ +package com.qs.serve.modules.tzc.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; +import java.util.List; + +/** + * 政策 Bo + * @author YenHex + * @since 2023-02-20 + */ +@Data +public class TzcPolicyBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 主题 */ + @NotBlank(message = "主题不能为空") + @Length(max = 60,message = "主题长度不能超过60字") + private String title; + + /** 客户id */ + private Long supplierId; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyGoodsBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyGoodsBo.java new file mode 100644 index 0000000..39ef5c5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyGoodsBo.java @@ -0,0 +1,40 @@ +package com.qs.serve.modules.tzc.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 政策商品 Bo + * @author YenHex + * @since 2023-02-20 + */ +@Data +public class TzcPolicyGoodsBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 目标类型(brand、category、series、spu、sku) */ + @NotBlank(message = "目标类型不能为空") + private String targetType; + + private Long targetId; + + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyItemBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyItemBo.java new file mode 100644 index 0000000..9f38333 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/bo/TzcPolicyItemBo.java @@ -0,0 +1,104 @@ +package com.qs.serve.modules.tzc.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.DecimalMax; +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; +import java.util.List; +/** + * 政策项 Bo + * @author YenHex + * @since 2023-02-20 + */ +@Data +public class TzcPolicyItemBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 政策id */ + @NotNull(message = "政策id不能为空") + private Long policyId; + + /** 成本中心类型 */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 50,message = "成本中心类型长度不能超过50字") + private String centerType; + + /** 成本中心id */ + @NotBlank(message = "成本中心id不能为空") + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 科目id */ + //@NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 开始时间 */ + @NotNull(message = "开始时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate policyStartDate; + + /** 结束时间 */ + @NotNull(message = "结束时间不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate policyEndDate; + + /** 满减金额 */ + @NotNull(message = "满减金额不能为空") + @DecimalMin(value = "1",message = "返点百分比参数错误") + private BigDecimal discountAmount; + + /** 优惠上限 */ + @DecimalMin(value = "1",message = "返点百分比参数错误") + private BigDecimal discountMax; + + /** 返点百分比 */ + @NotNull(message = "返点百分比不能为空") + @DecimalMax(value = "100",message = "返点百分比参数错误") + @DecimalMin(value = "0.01",message = "返点百分比参数错误") + private BigDecimal discountRate; + + + @NotNull(message = "商品列表参数不能为空") + List policyGoodsList; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** + * 附件 + */ + private String[] attachIds; + + /** + * 预计销量 + */ + private Integer preActQuantity; + + /** + * 不做活动预计销量 + */ + private Integer preNotActQuantity; + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/dto/PolicyItemDto.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/dto/PolicyItemDto.java new file mode 100644 index 0000000..f611b7e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/entity/dto/PolicyItemDto.java @@ -0,0 +1,68 @@ +package com.qs.serve.modules.tzc.entity.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Set; + +/** + * @author YenHex + * @since 2023/3/10 + */ +@Data +public class PolicyItemDto { + + /** 主题 */ + private String title; + + private String policyItemCode; + + private String cusCode; + + private String cusName; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date startDate; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date endDate; + + /** 满减金额 */ + private BigDecimal discountAmount; + + /** 返点百分比 */ + private BigDecimal discountRate; + + /** 优惠上限 */ + private BigDecimal discountMax; + + /** 旧参数 */ + private Set invCodeList; + + /** 新参数 */ + private List policyGoodsItemList; + + @Data + public static class PolicyGoodsItem{ + + /** 目标类型(brand、category、series、spu、sku) */ + private String targetType; + + /** 目标id */ + private Long targetId; + + /** 目标编码 */ + private String targetCode; + + /** 目标名称 */ + private String targetName; + + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyGoodsMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyGoodsMapper.java new file mode 100644 index 0000000..fba2058 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyGoodsMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tzc.entity.TzcPolicyGoods; + +/** + * 政策商品 Mapper + * @author YenHex + * @date 2023-02-20 + */ +public interface TzcPolicyGoodsMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyGoodsSyncMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyGoodsSyncMapper.java new file mode 100644 index 0000000..5e51bd9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyGoodsSyncMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tzc.entity.TzcPolicyGoodsSync; + +/** + * 政策商品 Mapper + * @author YenHex + * @date 2023-02-27 + */ +public interface TzcPolicyGoodsSyncMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyItemLogMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyItemLogMapper.java new file mode 100644 index 0000000..a4845f3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyItemLogMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tzc.entity.TzcPolicyItemLog; + +/** + * 政策项使用日志 Mapper + * @author YenHex + * @date 2023-03-02 + */ +public interface TzcPolicyItemLogMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyItemMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyItemMapper.java new file mode 100644 index 0000000..ce2241a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyItemMapper.java @@ -0,0 +1,28 @@ +package com.qs.serve.modules.tzc.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.math.BigDecimal; + +/** + * 政策项 Mapper + * @author YenHex + * @date 2023-02-20 + */ +public interface TzcPolicyItemMapper extends BaseMapper { + + /** + * 查询所有转化费用的合计 + * @param policyItemId + * @return + */ + @InterceptorIgnore(tenantLine = "true") + @Select("select COALESCE(sum(amount),0) from tbs_budget_log where create_policy_item_id = #{policyItemId} and opt_type = '13' and del_flag = 0") + BigDecimal sumPolicyItemTranAmt(@Param("policyItemId")Long policyItemId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyMapper.java new file mode 100644 index 0000000..6265d6d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/mapper/TzcPolicyMapper.java @@ -0,0 +1,63 @@ +package com.qs.serve.modules.tzc.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.tzc.entity.TzcPolicy; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +import java.time.LocalDate; +import java.util.List; + +/** + * 政策 Mapper + * @author YenHex + * @date 2023-02-20 + */ +public interface TzcPolicyMapper extends BaseMapper { + + /** + * 查询政策 + * @param param + * @return + */ + @InterceptorIgnore(tenantLine = "true") + List selectTzcPolicyList(@Param("query")TzcPolicy param); + + /** + * 设置数据的继承人 + * @param policyIds + * @param sysUser + * @return + */ + int updateCostExtUserByPolicyIds(@Param("policyIds") List policyIds, @Param("obj") SysUser sysUser); + + /** + * 设空继承人 + * @param policyIds + * @return + */ + int cancelCostExtUserByPolicyIds(@Param("policyIds") List policyIds); + + /** + * 获取需要释放的Item + * @return + */ + List listExpireItemIds(@Param("endDate") LocalDate endDate); + + /** + * 替换继承人 + * @param userId + * @param sysUser + * @return + */ + @Update( + "update tzc_policy " + + " set ext_user_id = #{obj.id},ext_user_id=#{obj.code},ext_user_name=#{obj.name}" + + " where policy_status!=0 and (user_id = #{userId} or ext_user_id = #{userId}) and del_flag=0" + ) + int updatePolicyExtUser(@Param("userId") String userId,@Param("obj") SysUser sysUser); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyApplicationService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyApplicationService.java new file mode 100644 index 0000000..9405c05 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyApplicationService.java @@ -0,0 +1,79 @@ +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; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/3/10 + */ +public interface TzcPolicyApplicationService { + + /** + * 政策项ID + * @param policyItemId + */ + void syncPolicyItem(Long policyItemId); + + void syncPolicy(Long policyId); + + /** + * 同步过期的政策释放 + */ + void syncExpireRelease(); + + /** + * 取消释放 + * @param policyItemId + */ + void cancelReleasePolicyItem(Long policyItemId); + + void releasePolicyItem(Long policyItemId, SysUser user); + + /** + * 创建费用占用结果 + * @param policyId + * @param throwEx + * @param buildTableFlag + * @return + */ + TbsBudgetCostResult buildBudgetCostResult(Long policyId, + Boolean throwEx, + Boolean buildTableFlag); + + /** + * 创建费用占用结果 + * @param policyId 用于加载历史预算时,排除当前费用占比 + * @param policyItemList 政策项列表 + * @param overspend 是否支持超出预算 + * @param throwEx 是否需要抛出异常 + * @param buildTableFlag 创建表VO + * @return + */ + TbsBudgetCostResult buildBudgetCostResult(Long policyId, + List policyItemList, + Boolean overspend, + Boolean throwEx, + Boolean buildTableFlag); + + + /** + * 提交申请 + * @param policyId + */ + void commitPolicy(Long policyId); + + + /** + * 构建预览2接口 + * @param policyId + * @return + */ + TbsBudgetTableVo buildResultTable(Long policyId); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyGoodsService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyGoodsService.java new file mode 100644 index 0000000..9e9f478 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyGoodsService.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.tzc.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tzc.entity.TzcPolicyGoods; +import com.qs.serve.modules.tzc.entity.bo.TzcPolicyGoodsBo; +import java.util.List; + +/** + * 政策商品 服务接口 + * @author YenHex + * @date 2023-02-20 + */ +public interface TzcPolicyGoodsService extends IService { + + List listByItemId(Long itemId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyGoodsSyncService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyGoodsSyncService.java new file mode 100644 index 0000000..05c674c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyGoodsSyncService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tzc.entity.TzcPolicyGoodsSync; + +/** + * 政策商品同步记录表 服务接口 + * @author YenHex + * @date 2023-02-27 + */ +public interface TzcPolicyGoodsSyncService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyItemLogService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyItemLogService.java new file mode 100644 index 0000000..c989d2f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyItemLogService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.tzc.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tzc.entity.TzcPolicyItemLog; + +/** + * 政策项使用日志 服务接口 + * @author YenHex + * @date 2023-03-02 + */ +public interface TzcPolicyItemLogService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyItemService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyItemService.java new file mode 100644 index 0000000..8764144 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyItemService.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.tzc.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; +import com.qs.serve.modules.tzc.entity.bo.TzcPolicyItemBo; + +import java.util.List; + +/** + * 政策项 服务接口 + * @author YenHex + * @date 2023-02-20 + */ +public interface TzcPolicyItemService extends IService { + + List listByPolicyId(Long id); + + void removeByPolicyId(Long id); + + TzcPolicyItem getByPolicyItemCode(String code); + + R modify(TzcPolicyItemBo param); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyService.java new file mode 100644 index 0000000..5e5962b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/TzcPolicyService.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.tzc.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.tzc.entity.TzcPolicy; +import com.qs.serve.modules.tzc.entity.bo.TzcPolicyBo; +import java.util.List; + +/** + * 政策 服务接口 + * @author YenHex + * @date 2023-02-20 + */ +public interface TzcPolicyService extends IService { + + List selectPolicyList(TzcPolicy tzcPolicy); + + R modify(TzcPolicyBo policyParam); + + + void releaseCost(Long policyId,Integer invalidFlag); + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyApplicationServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyApplicationServiceImpl.java new file mode 100644 index 0000000..1c55abb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyApplicationServiceImpl.java @@ -0,0 +1,1228 @@ +package com.qs.serve.modules.tzc.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.AsyncManager; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.consts.SysConfigKey; +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.common.util.model.DateFormatString; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.goods.entity.GoodsSku; +import com.qs.serve.modules.goods.service.GoodsSkuService; +import com.qs.serve.modules.seeyon.entity.BaseCreateCallbackBo; +import com.qs.serve.modules.seeyon.entity.BaseCreateProcessBo; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.seeyon.service.XiaoLuTonService; +import com.qs.serve.modules.sync.AsyncFactory; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysConfig; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysConfigService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.common.util.TbsBudgetCostUtil; +import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.dto.*; +import com.qs.serve.modules.tbs.entity.vo.TbsBudgetTableVo; +import com.qs.serve.modules.tbs.mapper.TbsBudgetMapper; +import com.qs.serve.modules.tbs.mapper.TbsScheduleItemBudgetMapper; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.tzc.common.TzPolicyItemStatus; +import com.qs.serve.modules.tzc.common.TzcPolicyStatus; +import com.qs.serve.modules.tzc.common.dto.PolicySortWrapper; +import com.qs.serve.modules.tzc.common.util.PolicySortWrapperUtil; +import com.qs.serve.modules.tzc.entity.TzcPolicy; +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.service.VtbFundFlowService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/2/20 + */ +@Service +@Slf4j +@AllArgsConstructor +public class TzcPolicyApplicationServiceImpl implements TzcPolicyApplicationService { + + private RedisService redisService; + private TzcPolicyMapper tzcPolicyMapper; + private TzcPolicyService tzcPolicyService; + private TzcPolicyItemService tzcPolicyItemService; + private TzcPolicyItemMapper tzcPolicyItemMapper; + private TzcPolicyGoodsService tzcPolicyGoodsService; + private TbsCostUnItemPolicyService tbsCostUnItemPolicyService; + private TbsBudgetCostItemPolicyService tbsBudgetCostItemPolicyService; + private TbsBudgetApplicationService budgetApplicationService; + private TbsScheduleItemBudgetService tbsScheduleItemBudgetService; + private TbsBudgetMapper tbsBudgetMapper; + private TbsScheduleItemBudgetMapper tbsScheduleItemBudgetMapper; + private TbsBudgetLogService budgetLogService; + private TbsBudgetConditionService tbsBudgetConditionService; + private TbsBudgetCostItemService tbsBudgetCostItemService; + private SysConfigService configService; + private SysUserService sysUserService; + private SeeYonRequestService seeYonService; + private BmsSupplierService bmsSupplierService; + private GoodsSkuService goodsSkuService; + private XiaoLuTonService xiaoLuTonService; + private ProjectProperties projectProperties; + private final BmsRegionMapper regionMapper; + private final BmsRegion2Mapper region2Mapper; + private ProjectApisProperties projectApisProperties; + private final VtbFundFlowService vtbFundFlowService; + private SysConfigService sysConfigService; + + + @Override + public void syncPolicy(Long policyId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TzcPolicyItem::getPolicyId,policyId); + wrapper.select(TzcPolicyItem::getId); + List list = tzcPolicyItemService.list(wrapper); + for (TzcPolicyItem policyItem : list) { + this.syncPolicyItem(policyItem.getId()); + } + } + + @Override + public void syncExpireRelease() { + SysUser sysUser = new SysUser(); + sysUser.setId("0"); + sysUser.setName("系统执行"); + sysUser.setCode(""); + LocalDate nowDate = LocalDate.now(); + int delayDays = 7; + SysConfig sysConfig = sysConfigService.getByKey(SysConfigKey.PolicyDelayDays); + if(sysConfig!=null){ + try { + delayDays = Integer.parseInt(sysConfig.getConfigValue()); + } catch (NumberFormatException e) { + log.error("获取SysConfig政策延迟时间异常: PolicyDelayDays"); + } + } + LocalDate endDate = nowDate.plusDays(- delayDays); + List ids = tzcPolicyMapper.listExpireItemIds(endDate); + 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_2_SyncSuccess)){ + Assert.throwEx("政策项的状态不支持"); + } + Long policyId = policyItem.getPolicyId(); + TzcPolicy policy = tzcPolicyService.getById(policyId); + 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<>(); + tbsLogLqw.eq(TbsBudgetLog::getPolicyItemId,policyItem.getId()); + tbsLogLqw.eq(TbsBudgetLog::getOptType,BudgetLogOptFlag.State_11.getCode()); + TbsBudgetLog budgetLog = budgetLogService.getOne(tbsLogLqw,false); + if(budgetLog==null){ + Assert.throwEx("政策预算数据异常:"+policyItem.getPolicyItemCode()); + } + //余额大于0则释放 + VtbFundFlow fundFlow = new VtbFundFlow(); + fundFlow.setFundType(VtbFundFlowType.Release); + fundFlow.setVerificationId(0L); + fundFlow.setCenterGoodsCode("0"); + fundFlow.setCostApplyId(0L); + fundFlow.setActivityId(0L); + fundFlow.setSupplierId(0L); + fundFlow.setSupplierCode(""); + fundFlow.setSupplierName(""); + fundFlow.setPolicyId(policyId); + fundFlow.setPolicyItemId(policyItem.getId()); + fundFlow.setUsedAmount(surplusAmt); + vtbFundFlowService.save(fundFlow); + + budgetLog.setCreateBy(null); + budgetLog.setCreateTime(null); + budgetLog.setUpdateBy(null); + budgetLog.setUpdateTime(null); + budgetLog.setId(null); + BudgetLogOptFlag optFlag = BudgetLogOptFlag.State_16; + //正数 + budgetLog.setAmount(surplusAmt); + budgetLog.setOptType(optFlag.getCode()); + budgetLogService.save(budgetLog); + + //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); + } + //标记政策已完成 + List listByPolicyId = tzcPolicyItemService.listByPolicyId(policyId); + boolean allFinished = true; + for (TzcPolicyItem item : listByPolicyId) { + if(!item.getPolicyItemStatus().equals(TzPolicyItemStatus.Status_3_Finished)){ + if (item.getDiscountMax().compareTo(item.getUsedAmount())==0||item.getReleaseFlag().equals(1)){ + item.setPolicyItemStatus(TzPolicyItemStatus.Status_3_Finished); + tzcPolicyItemService.updateById(item); + continue; + } + allFinished = false; + } + } + if(allFinished){ + policy.setPolicyStatus(TzcPolicyStatus.Status_3_Success); + tzcPolicyService.updateById(policy); + } + } + + + @Override + public void syncPolicyItem(Long policyItemId) { + TzcPolicyItem policyItem = tzcPolicyItemService.getById(policyItemId); + if(policyItem==null||!policyItem.getPolicyItemStatus().equals(TzPolicyItemStatus.Status_1_PassSuccess)){ + return; + } + PolicyItemDto policyItemDto = new PolicyItemDto(); + policyItemDto.setTitle(policyItem.getTitle()); + policyItemDto.setCusCode(policyItem.getSupplierCode()); + policyItemDto.setCusName(policyItem.getSupplierName()); + policyItemDto.setPolicyItemCode(policyItem.getPolicyItemCode()); + policyItemDto.setStartDate(DateUtils.localDateToDate(policyItem.getPolicyStartDate())); + policyItemDto.setEndDate(DateUtils.localDateToDate(policyItem.getPolicyEndDate())); + policyItemDto.setDiscountAmount(policyItem.getDiscountAmount()); + policyItemDto.setDiscountRate(policyItem.getDiscountRate().divide(new BigDecimal("100"),4, RoundingMode.DOWN)); + policyItemDto.setDiscountMax(policyItem.getDiscountMax()); + //加载InvCode + List policyGoods = tzcPolicyGoodsService.listByItemId(policyItemId); + Map> policyGoodsMap = policyGoods.stream().collect(Collectors.groupingBy(TzcPolicyGoods::getTargetType)); + Set invCodes = new HashSet<>(); + for (String goodType : policyGoodsMap.keySet()) { + List policyGoodsList = policyGoodsMap.get(goodType); + List targetIds = policyGoodsList.stream().map(TzcPolicyGoods::getTargetId).collect(Collectors.toList()); + if(CollectionUtil.isEmpty(policyGoodsList)){ + continue; + } + if(goodType.equals(TbsGoodsType.sku.name())){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(GoodsSku::getId,targetIds); + lqw.select(GoodsSku::getSkuCode); + lqw.eq(GoodsSku::getEnable,1); + List goodsSkus = goodsSkuService.list(lqw); + List skuCodes = goodsSkus.stream().map(GoodsSku::getSkuCode).filter(Objects::nonNull).collect(Collectors.toList()); + invCodes.addAll(skuCodes); + }else if(goodType.equals(TbsGoodsType.spu.name())){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(GoodsSku::getSpuId,targetIds); + lqw.select(GoodsSku::getSkuCode); + lqw.eq(GoodsSku::getEnable,1); + List goodsSkus = goodsSkuService.list(lqw); + List skuCodes = goodsSkus.stream().map(GoodsSku::getSkuCode).filter(Objects::nonNull).collect(Collectors.toList()); + invCodes.addAll(skuCodes); + }else { + List goodsSkus = goodsSkuService.selectSkuByCategoryIds(targetIds); + List invCodeList = goodsSkus.stream() + .map(GoodsSku::getSkuCode).filter(Objects::nonNull).distinct().collect(Collectors.toList()); + invCodes.addAll(invCodeList); + } + } + if(invCodes.size()<1){ + log.warn("[{}]政策同步失败,存货编码为空",policyItem.getPolicyItemCode()); + return; + } + List goodsItems = new ArrayList<>(); + Map tranCodeMap = new HashMap<>(); + tranCodeMap.put("sku","invCode"); + tranCodeMap.put("spu","invSkuCode"); + tranCodeMap.put("brand","invBrandCode"); + tranCodeMap.put("category","invCategoryCode"); + tranCodeMap.put("series","invSeriesCode"); + for (TzcPolicyGoods policyGood : policyGoods) { + PolicyItemDto.PolicyGoodsItem goodsItem = new PolicyItemDto.PolicyGoodsItem(); + String tmp = tranCodeMap.get(policyGood.getTargetType()); + goodsItem.setTargetType(tmp!=null?tmp:policyGood.getTargetType()); + goodsItem.setTargetId(policyGood.getTargetId()); + goodsItem.setTargetCode(policyGood.getTargetCode()); + goodsItem.setTargetName(policyGood.getTargetName()); + goodsItems.add(goodsItem); + } + + policyItemDto.setInvCodeList(invCodes); + policyItemDto.setPolicyGoodsItemList(goodsItems); + //测试环境不进入生成 + if(!DevEnvironmentConfig.isDev()){ + //String policySyncInvUrl = projectApisProperties.getPolicySyncInv(); + String policySyncCateUrl = projectApisProperties.getPolicySyncCate(); + String dataJson = JsonUtil.objectToJson(policyItemDto); +// +// String rs = HttpUtil.doPost(policySyncInvUrl, dataJson, null); +// log.debug("policySyncInvUrl:{}\n result:{}",policySyncInvUrl,rs); + String rs2 = HttpUtil.doPost(policySyncCateUrl, dataJson, null); + log.debug("policySyncCateUrl:{}\n result:{}",policySyncCateUrl,rs2); + if(rs2.contains("\"status\":200")){ + TzcPolicyItem updParam = new TzcPolicyItem(); + updParam.setId(policyItemId); + updParam.setPolicyItemStatus(TzPolicyItemStatus.Status_2_SyncSuccess); + tzcPolicyItemService.updateById(updParam); + } + //保存异步处理的 + //xiaoLuTonService.savePolicyItem(policyItemDto); + } + + } + + /** + * 提交申请 + * @param policyId + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void commitPolicy(Long policyId){ + TzcPolicy tzcPolicy = tzcPolicyService.getById(policyId); + + redisService.throwResLock(TzcPolicy.class.getSimpleName(),tzcPolicy.getId()+""); + seeYonService.testConnection(); + Integer tzcPolicyStatus = tzcPolicy.getPolicyStatus(); + if(!tzcPolicy.allowEditFlag()){ + Assert.throwEx("操作失败,政策状态不支持"); + } + BmsSupplier supplier = bmsSupplierService.getById(tzcPolicy.getSupplierId()); + if(supplier.getCostFlag().equals(0)){ + Assert.throwEx("["+supplier.getName()+"]无投放费用权限"); + } + TbsBudgetCostResult result = this.buildBudgetCostResult(policyId,true,false); + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + sysUser.checkSyAccount(); + Map data = new HashMap<>(10); + data.put("exsp3",tzcPolicy.getPolicyCode()); + data.put("applyUserCode",sysUser.getCode()); + data.put("applyUserName",sysUser.getName()); + data.put("supplierName",tzcPolicy.getSupplierName()); + data.put("supplierCode",tzcPolicy.getSupplierCode()); + data.put("title",tzcPolicy.getTitle()); + data.put("rowDate", DateUtils.format(LocalDateTime.now(), DateFormatString.DATE_TIME)); + data.put("rowState","03"); + data.put("orgId",tzcPolicy.getId()); + data.put("targetId",tzcPolicy.getId()); + data.put("targetCode",tzcPolicy.getPolicyCode()); + data.put("exsp1", TbsSeeYonConst.PolicyConf.Code()); + + //拓展添加审批关联区域 + String saleRegionId = supplier.handleSaleRegionId(); + String bizRegionId = supplier.handleBizRegionId(); + BmsRegion saleRegion = regionMapper.selectById(saleRegionId); + BmsRegion2 bizRegion = region2Mapper.selectById(bizRegionId); + String saleRegionNames = saleRegion!=null?saleRegion.getPathNames():"null_申请时未录入"; + String bizRegionNames = bizRegion!=null?bizRegion.getPathNames():"null_申请时未录入"; + data.put("biz_region",bizRegionNames); + data.put("exsp2",saleRegionNames); + data.put("data_state", TzcPolicyStatus.Status_1_Checking); + + //添加跳转地址业务 + String urlKey = "exsp5"; + String baseJumpUrl = JumpToUtil.getJumpUrl(projectProperties.getWebUrl(),TbsSeeYonConst.PolicyConf.Code(),policyId+""); + data.put("exsp5",urlKey); + data.put("cmsLink",baseJumpUrl); + + List subList = new ArrayList<>(); + List policyItemList = tzcPolicyItemService.listByPolicyId(policyId); + for (TzcPolicyItem policyItem : policyItemList) { + TbsCostSubItem.CostCenterTranStr costCenter = new TbsCostSubItem.CostCenterTranStr(); + costCenter.setChengBenZhongXin(policyItem.getCenterName()); + costCenter.setChengBenZhongXinId(policyItem.getCenterType()+"-"+policyItem.getId()); + subList.add(costCenter); + } + data.put("sub",subList); + + BaseCreateProcessBo createProcess = new BaseCreateProcessBo(); + createProcess.setTemplateCode(TbsSeeYonConst.PolicyConf.Code()); + createProcess.setMemberLoginName(sysUser.getSyAccount()); + createProcess.setSubjectTitle(TbsSeeYonConst.PRE_TITLE_COST_APPLY + tzcPolicy.getTitle()); + createProcess.setTargetId(tzcPolicy.getId()+""); + createProcess.setDataJson(JsonUtil.objectToJson(data)); + + R flowIdResult = seeYonService.baseCreateProcess(createProcess); + if(flowIdResult.getStatus()!=200){ + Assert.throwEx(flowIdResult.getMsg()); + } + String flowId = flowIdResult.getData(); + if(!StringUtils.hasText(flowId)){ + Assert.throwEx("获取不到流程ID:"+flowIdResult.getMsg()); + } + //这里错误时会抛出json数据 + if(flowId.length()>60){ + Assert.throwEx("远程调用异常:"+flowId); + } + String formId = null; + R formIdResult = seeYonService.getFormId(TbsSeeYonConst.PolicyConf.Code(),policyId); + if(formIdResult.getStatus()==200){ + formId = formIdResult.getData(); + } + TzcPolicy updPolicy = new TzcPolicy(); + updPolicy.setId(policyId); + updPolicy.setSyFlowId(flowId); + updPolicy.setSyFormId(formId); + updPolicy.setSubmitTime(LocalDateTime.now()); + updPolicy.setPolicyStatus(TzcPolicyStatus.Status_1_Checking); + tzcPolicyService.updateById(updPolicy); + tzcPolicy = tzcPolicyService.getById(policyId); + //移除历史记录 + //tzcPolicyItemService.removeByPolicyId(policyId); + //保存无命中条件的预算 + if(CollectionUtil.isNotEmpty(result.getBudgetUnMatchList())){ + List costUnItems = result.getBudgetUnMatchList().stream() + .map(obj-> { + TbsCostUnItemPolicy itemPolicy = CopierUtil.copy(obj,new TbsCostUnItemPolicy()); + itemPolicy.initSetNull(); + return itemPolicy; + }).collect(Collectors.toList()); + tbsCostUnItemPolicyService.saveBatch(costUnItems); + } + //重新保存 + List allBudgetItem = result.getPolicyBudgetMatchList(); + tbsBudgetCostItemPolicyService.saveBatch(allBudgetItem); + //保存预算使用日志 + List budgetLogList = saveBudgetLog(result, sysUser, tzcPolicy, result.getPolicyBudgetMatchList(),result.getPolicyItemList()); + if(tzcPolicyStatus.equals(TzcPolicyStatus.Status_0_UnCommit)){ + budgetLogService.saveBatch(budgetLogList); + }else { + //排除历史记录 + LambdaQueryWrapper logLqw = new LambdaQueryWrapper<>(); + logLqw.eq(TbsBudgetLog::getPolicyId,policyId); +// logLqw.eq(TbsBudgetLog::getRollbackFlag, BudgetLogRollbackFlag.State_1); + budgetLogService.remove(logLqw); + budgetLogService.saveBatch(budgetLogList); +// List oldLogList = budgetLogService.list(logLqw); +// List oldLogList4Upd = oldLogList.stream().map(a->{ +// TbsBudgetLog budgetLog = new TbsBudgetLog(); +// budgetLog.setId(a.getId()); +// budgetLog.setRollbackFlag(BudgetLogRollbackFlag.State_2); +// return budgetLog; +// }).collect(Collectors.toList()); +// budgetLogService.updateBatchById(oldLogList4Upd); +// for (TbsBudgetLog budgetLog : oldLogList) { +// budgetLog.setCreateBy(null); +// budgetLog.setCreateTime(null); +// budgetLog.setUpdateBy(null); +// budgetLog.setUpdateTime(null); +// budgetLog.setId(null); +// BudgetLogOptFlag optFlag = BudgetLogOptFlag.State_12; +// budgetLog.setAmount(TbsBudgetLogBuildUtil.buildAmount(budgetLog.getAmount(),optFlag)); +// budgetLog.setOptType(optFlag.getCode()); +// } +// budgetLogService.saveBatch(oldLogList); +// BudgetLogOptFlag optFlag = BudgetLogOptFlag.State_13; +// budgetLogList.forEach(a->{ +// a.setOptType(optFlag.getCode()); +// a.setAmount(TbsBudgetLogBuildUtil.buildAmount(a.getAmount(),optFlag)); +// }); +// budgetLogService.saveBatch(budgetLogList); + } + //创建流程后回调 + BaseCreateCallbackBo callbackBo = new BaseCreateCallbackBo(TbsSeeYonConst.PolicyConf.Code(),tzcPolicy.getId()+""); + seeYonService.createCallbackStatus(callbackBo); + + ////请求校验是否成功 + // TbsCostApplyOperationServiceImpl applyOperationService = SpringUtils.getBean(TbsCostApplyOperationServiceImpl.class); + // String summeryResult = applyOperationService.checkAffairSummery(costApply.getId().toString()); + // if(summeryResult.equals(TbsCostApplyOperationServiceImpl.SummeryState_Success)){ + // //调用成功回调方法 + // TbsAffairCommitBo finishedParam = new TbsAffairCommitBo(); + // finishedParam.setCostApplyId(costApply.getId()); + // applyOperationService.doFinished(finishedParam); + // } + AsyncManager.me().execute(AsyncFactory.submitPolicy(policyId)); + + } + + + + @Override + public TbsBudgetTableVo buildResultTable(Long policyId){ + LambdaQueryWrapper policyItemLqw = new LambdaQueryWrapper<>(); + policyItemLqw.eq(TzcPolicyItem::getPolicyId,policyId); + List policyItemList = tzcPolicyItemService.list(policyItemLqw); + + //费用占用 + LambdaQueryWrapper costItemLqw = new LambdaQueryWrapper<>(); + costItemLqw.eq(TbsBudgetCostItemPolicy::getPolicyId,policyId); + List budgetCostItems = tbsBudgetCostItemPolicyService.list(costItemLqw); + + //预算 + List budgetIds = budgetCostItems.stream().map(TbsBudgetCostItemPolicy::getBudgetId) + .distinct().collect(Collectors.toList()); + List budgetList; + if(CollectionUtil.isNotEmpty(budgetIds)){ + budgetList = tbsBudgetMapper.selectBatchIds(budgetIds); + }else { + budgetList = new ArrayList<>(); + } + TbsBudgetTableVo tableVo = new TbsBudgetTableVo(); + List topTheadHeaders = new ArrayList<>(); + Map> tmpMap = budgetCostItems.stream().collect(Collectors.groupingBy(TbsBudgetCostItemPolicy::getScheduleItemBudgetId)); + for (Long scheduleItemBudgetId : tmpMap.keySet()) { + if(scheduleItemBudgetId.equals(0L)){continue;} + TbsBudgetCostItemPolicy budgetCostItem = tmpMap.get(scheduleItemBudgetId).get(0); + String budgetCode = null; + for (TbsBudget budget : budgetList) { + if(budget.getId().equals(budgetCostItem.getBudgetId())){ + budgetCode = budget.getBudgetCode(); + break; + } + } + TbsBudgetTableVo.TopTheadHeader theadHeader = new TbsBudgetTableVo.TopTheadHeader(); + theadHeader.setId(scheduleItemBudgetId+""); + theadHeader.setLabel(budgetCode+"("+budgetCostItem.getScheduleItemName()+")"); + //设置为提交时的金额数据 + theadHeader.setBudgetAmount(budgetCostItem.getScheduleItemAmount() + .subtract(budgetCostItem.getScheduleItemAmountUsed())); + theadHeader.setTotalAmount(budgetCostItem.getScheduleItemAmount()); + BigDecimal applyAmount = budgetCostItem.getScheduleItemAmountApply()==null?BigDecimal.ZERO:budgetCostItem.getScheduleItemAmountApply(); + theadHeader.setCostApplyAmount(applyAmount); + theadHeader.setCostAppliedAmount(budgetCostItem.getScheduleItemAmountUsed().subtract(applyAmount)); + topTheadHeaders.add(theadHeader); + } + //自定义超额预算 + TbsBudgetTableVo.TopTheadHeader overTopHeader = new TbsBudgetTableVo.TopTheadHeader(); + overTopHeader.setId("0"); + overTopHeader.setLabel("其它预算"); + overTopHeader.setBudgetAmount(BigDecimal.ZERO); + topTheadHeaders.add(overTopHeader); + + List leftTheadHeaders = new ArrayList<>(); + + for (TzcPolicyItem policyItem : policyItemList) { + TbsBudgetTableVo.LeftTheadHeader theadHeader = new TbsBudgetTableVo.LeftTheadHeader(); + theadHeader.setActivityCode(policyItem.getPolicyItemCode()); + theadHeader.setId(policyItem.getId()+""); + theadHeader.setSubjectId(policyItem.getSubjectId()); + theadHeader.setSubjectName(policyItem.getSubjectName()); + theadHeader.setCenterId(policyItem.getCenterId()); + theadHeader.setCenterName(policyItem.getCenterName()); + theadHeader.setLabel(policyItem.getPolicyItemCode()); + theadHeader.setLabelCombo(policyItem.getPolicyItemCode()+"-" + +theadHeader.getSubjectName()+"-" + +theadHeader.getCenterName()+"-" + +theadHeader.getLabel()); + leftTheadHeaders.add(theadHeader); + } + + List tableValueList = new ArrayList<>(); + for (TbsBudgetCostItemPolicy costItem : budgetCostItems) { + TbsBudgetTableVo.TableValue tableValue = new TbsBudgetTableVo.TableValue(); + tableValue.setTopId(costItem.getScheduleItemBudgetId()+""); + tableValue.setLeftId(costItem.getPolicyItemId()+""); + tableValue.setValue(costItem.getPolicyItemAmount()); + tableValueList.add(tableValue); + } + tableVo.setTableValueList(tableValueList); + tableVo.setTopTheadHeaderList(topTheadHeaders); + tableVo.setLeftTheadHeaderList(leftTheadHeaders); + return tableVo; + } + + @Override + public TbsBudgetCostResult buildBudgetCostResult(Long policyId, + Boolean throwEx, + Boolean buildTableFlag){ + Boolean overspend = false; + List policyItemList = tzcPolicyItemService.listByPolicyId(policyId); + if(policyItemList.size()<1){ + Assert.throwEx("请政策项添加后再提交"); + } + return this.buildBudgetCostResult(policyId,policyItemList,overspend,throwEx,buildTableFlag); + } + + /** + * 创建费用占用结果 + * @param policyId 用于加载历史预算时,排除当前费用占比 + * @param policyItemList 政策项列表 + * @param overspend 是否支持超出预算 + * @param throwEx 是否需要抛出异常 + * @param buildTableFlag 创建表VO + * @return + */ + @Override + public TbsBudgetCostResult buildBudgetCostResult(Long policyId, + List policyItemList, + Boolean overspend, + Boolean throwEx, + Boolean buildTableFlag){ + PolicySortWrapper sortWrapper = new PolicySortWrapper(); + //考核期有关的预算id,判断逻辑为活动需要允许在 + List budgetIds = new ArrayList<>(); + //没有预算的活动 + Set noBudgetPolicyIds = new HashSet<>(); + //所有满足条件的考核期,用于加载历史核销费用,并设置不满足时间条件的预算 + List scheduleItemList = this.loadScheduleBudgetAndSetting(policyItemList, budgetIds, noBudgetPolicyIds,sortWrapper); + List centerIds = policyItemList.stream().map(TzcPolicyItem::getCenterId).collect(Collectors.toList()); + List budgetList; + if(budgetIds.size()>0){ + LambdaQueryWrapper budgetLqw = new LambdaQueryWrapper<>(); + budgetLqw.in(TbsBudget::getId,budgetIds); + //默认为随货折让(FYMC05) + budgetLqw.and( + qw->qw.in(TbsBudget::getSubjectCode,"FYMC05") + .or() + .eq(TbsBudget::getSubjectId,0) + ); + budgetLqw.in(TbsBudget::getCenterId,centerIds); + budgetLqw.eq(TbsBudget::getBudgetState,1); + budgetLqw.eq(TbsBudget::getStopFlag,0); + budgetLqw.eq(TbsBudget::getInactiveFlag,0); + budgetLqw.eq(TbsBudget::getTemplateFlag,0); + budgetList = tbsBudgetMapper.selectList(budgetLqw); + }else { + budgetList = new ArrayList<>(); + } + //初始化预算 + sortWrapper.initializeBudget(budgetList); + //预算移除多余的项 + List scheduleItemListTmp = new ArrayList<>(); + for (TbsScheduleItemBudget scheduleItemBudget : scheduleItemList) { + for (TbsBudget budget : budgetList) { + if(scheduleItemBudget.getBudgetId().equals(budget.getId())){ + scheduleItemListTmp.add(scheduleItemBudget); + break; + } + } + } + scheduleItemList = scheduleItemListTmp; + + //加载预算条件和关联预算匹配,返回是否由无条件预算 + List noConditionBudgetList = new ArrayList<>(); + boolean budgetNoCondition = budgetApplicationService.loadConditionByBudgetsAndMatch(budgetList, noConditionBudgetList); + //预算条件需包含活动条件, Map结构:政策id->满足的预算id列表 + Map> policyAllowBudgetIdMap = this.buildPolicyBudgetMap(policyItemList, budgetList, noConditionBudgetList,sortWrapper); + //活动拦截 + if(!budgetNoCondition){ + this.handleNoBudgetPolicy(throwEx, overspend, policyItemList,noBudgetPolicyIds,policyAllowBudgetIdMap); + } + //统计费用申请占用金额(录入时,考核期申请占用金额) + Map budgetItemApplyAmountMap = new HashMap<>(scheduleItemList.size()); + + List scheduleItemBudgetIds = scheduleItemList.stream().map(TbsScheduleItemBudget::getId).collect(Collectors.toList()); + if(scheduleItemBudgetIds.size()>0){ + List scheduleItemBudgetAmounts = tbsScheduleItemBudgetMapper.totalPolicyAmountList(scheduleItemBudgetIds,policyId); + for (TbsScheduleItemBudgetAmount budgetAmount : scheduleItemBudgetAmounts) { + Long scheduleItemBudgetId = null; + for (TbsScheduleItemBudget itemBudget : scheduleItemList) { + if(itemBudget.getScheduleItemId().equals(budgetAmount.getScheduleItemId())){ + scheduleItemBudgetId = itemBudget.getId(); + break; + } + } + if (budgetAmount.getTotalAmount()==null){ + budgetItemApplyAmountMap.put(scheduleItemBudgetId,BigDecimal.ZERO); + continue; + } + budgetItemApplyAmountMap.put(scheduleItemBudgetId,budgetAmount.getTotalAmount()); + } + } + + //统计所有占用预算金额 + Map budgetItemAmountMap = new HashMap<>(); + List budgetIdsFromScheduleItemList = scheduleItemList.stream().map(TbsScheduleItemBudget::getBudgetId).distinct().collect(Collectors.toList()); + List scheduleItemIdsFromScheduleItemList = scheduleItemList.stream().map(TbsScheduleItemBudget::getScheduleItemId).distinct().collect(Collectors.toList()); + if(scheduleItemIdsFromScheduleItemList.size()>0&&budgetIdsFromScheduleItemList.size()>0){ + List budgetLogPreAmounts = tbsScheduleItemBudgetMapper.listLogCostAmountWithPolicy(budgetIdsFromScheduleItemList,scheduleItemIdsFromScheduleItemList,policyId); + for (TbsScheduleItemBudget itemBudget : scheduleItemList) { + boolean isNotMatch = true; + for (TbsBudgetLogPreAmount logPreAmount : budgetLogPreAmounts) { + if(itemBudget.getBudgetId().equals(logPreAmount.getBudgetId()) + &&itemBudget.getScheduleItemId().equals(logPreAmount.getScheduleItemId())){ + BigDecimal budgetItemAmount = logPreAmount.getAmount(); + isNotMatch = false; + //因为已使用的预算费用为负数,需去相反数 + budgetItemAmount = budgetItemAmount==null?BigDecimal.ZERO:budgetItemAmount.negate(); + budgetItemAmountMap.put(itemBudget.getId(),budgetItemAmount); + } + } + if(isNotMatch){ + budgetItemAmountMap.put(itemBudget.getId(),BigDecimal.ZERO); + } + } + } + + /*for (TbsScheduleItemBudget itemBudget : scheduleItemList) { + BigDecimal budgetItemApplyAmount = tbsScheduleItemBudgetMapper.totalPolicyAmount(itemBudget.getId(), policyId); + budgetItemApplyAmountMap.put(itemBudget.getId(),budgetItemApplyAmount); + BigDecimal budgetItemAmount = tbsScheduleItemBudgetMapper.totalCostAmountByPolicyId(itemBudget.getBudgetId(),itemBudget.getScheduleItemId(),policyId); + //因为结果为负数,需去相反数 + budgetItemAmount = budgetItemAmount==null?BigDecimal.ZERO:budgetItemAmount.negate(); + //添加费用占用情况 + budgetItemAmountMap.put(itemBudget.getId(),budgetItemAmount); + }*/ + //统计当前活动前置项占用预算 + Map counterMap = new HashMap<>(); + //匹配预算主要方法 + final List actMatchList = new ArrayList<>(); + final List actUnMatchList = new ArrayList<>(); + for (TzcPolicyItem policyItem : policyItemList) { + this.matchPolicyMain(policyItem,throwEx,overspend,budgetItemAmountMap,budgetList, + noConditionBudgetList,counterMap,actMatchList, actUnMatchList, + policyAllowBudgetIdMap,budgetItemApplyAmountMap,sortWrapper); + } + List budgetMatchList = actMatchList.stream() + .map(TbsBudgetItemCostResult::toBudgetCostItem).collect(Collectors.toList()); + List budgetUnMatchList = actUnMatchList.stream() + .map(TbsBudgetItemCostResult::toBudgetCostItem).collect(Collectors.toList()); + TbsBudgetTableVo tableVo = null; + if(buildTableFlag){ + //构建tableDTO + tableVo = this.buildBudgetTableVo(budgetItemAmountMap, budgetList, budgetMatchList, budgetUnMatchList); + } + TbsBudgetCostResult result = new TbsBudgetCostResult(); + result.setPolicyBudgetMatchList(budgetMatchList); + result.setPolicyBudgetUnMatchList(budgetUnMatchList); + result.setTableData(tableVo); + result.setBudgetList(budgetList); + result.setPolicyItemList(policyItemList); + return result; + } + + /** + * 建立费用预算表 + * @param budgetItemAmountMap + * @param budgetList + * @param budgetMatchList + * @param budgetUnMatchList + * @return + */ + private TbsBudgetTableVo buildBudgetTableVo(Map budgetItemAmountMap, + List budgetList, + List budgetMatchList, + List budgetUnMatchList) { + List allBudgetItem = new ArrayList<>(); + allBudgetItem.addAll(budgetMatchList); + allBudgetItem.addAll(budgetUnMatchList); + TbsBudgetTableVo tableVo = new TbsBudgetTableVo(); + List topTheadHeaders = new ArrayList<>(); + Map> tmpMap = allBudgetItem.stream().collect(Collectors.groupingBy(TbsBudgetCostItemPolicy::getScheduleItemBudgetId)); + for (Long scheduleItemBudgetId : tmpMap.keySet()) { + if(scheduleItemBudgetId.equals(0L)){continue;} + TbsBudgetCostItemPolicy budgetCostItem = tmpMap.get(scheduleItemBudgetId).get(0); + String budgetCode = null; + for (TbsBudget budget : budgetList) { + if(budget.getId().equals(budgetCostItem.getBudgetId())){ + budgetCode = budget.getBudgetCode(); + break; + } + } + BigDecimal budgetAmount = budgetCostItem.getScheduleItemAmount(); + String scheduleItemName = budgetCostItem.getScheduleItemName(); + TbsBudgetTableVo.TopTheadHeader theadHeader = new TbsBudgetTableVo.TopTheadHeader(); + theadHeader.setId(scheduleItemBudgetId+""); + theadHeader.setLabel(budgetCode+"("+scheduleItemName+")"); + BigDecimal totalUsed = budgetItemAmountMap.get(scheduleItemBudgetId); + theadHeader.setBudgetAmount(budgetAmount.subtract(totalUsed)); + theadHeader.setTotalAmount(budgetAmount); + BigDecimal applyAmount = budgetCostItem.getScheduleItemAmountApply()==null?BigDecimal.ZERO:budgetCostItem.getScheduleItemAmountApply(); + theadHeader.setCostApplyAmount(applyAmount); + theadHeader.setCostAppliedAmount(totalUsed.subtract(applyAmount)); + topTheadHeaders.add(theadHeader); + } + //自定义超额预算 + TbsBudgetTableVo.TopTheadHeader overTopHeader = new TbsBudgetTableVo.TopTheadHeader(); + overTopHeader.setId("0"); + overTopHeader.setLabel("其它预算"); + overTopHeader.setBudgetAmount(BigDecimal.ZERO); + topTheadHeaders.add(overTopHeader); + + List leftTheadHeaders = new ArrayList<>(); + for (TbsBudgetCostItemPolicy costItemPolicy : allBudgetItem) { + String policyItemCode = costItemPolicy.getPolicyItemCode(); + Long policyItemId = costItemPolicy.getPolicyItemId(); + TbsBudgetTableVo.LeftTheadHeader theadHeader = new TbsBudgetTableVo.LeftTheadHeader(); + theadHeader.setActivityCode(policyItemCode); + theadHeader.setId(costItemPolicy.getPolicyItemId()+""); + theadHeader.setSubjectId(costItemPolicy.getSubjectId()); + theadHeader.setSubjectName(costItemPolicy.getSubjectName()); + theadHeader.setCenterId(costItemPolicy.getCenterId()); + theadHeader.setCenterName(costItemPolicy.getCenterName()); + theadHeader.setTargetType("policy_item"); + theadHeader.setTargetId(policyItemId); + theadHeader.setLabel(policyItemCode); + theadHeader.setLabelCombo(policyItemCode); + leftTheadHeaders.add(theadHeader); + } + List tableValueList = new ArrayList<>(); + for (TbsBudgetCostItemPolicy costItem : allBudgetItem) { + TbsBudgetTableVo.TableValue tableValue = new TbsBudgetTableVo.TableValue(); + tableValue.setTopId(costItem.getScheduleItemBudgetId()+""); + tableValue.setLeftId(costItem.getPolicyItemId()+""); + tableValue.setValue(costItem.getPolicyItemAmount()); + tableValueList.add(tableValue); + } + tableVo.setTableValueList(tableValueList); + tableVo.setTopTheadHeaderList(topTheadHeaders); + tableVo.setLeftTheadHeaderList(leftTheadHeaders); + return tableVo; + } + + /** + * 匹配的主要方法 + * @param policyItem 政策项 + * @param throwEx 预算不够时抛出异常 + * @param overspend 超值标识 + * @param budgetItemAmountMap 统计所有占用预算金额 + * @param allBudgetList 所有预算 + * @param noConditionBudgetList 没有条件的预算列表 + * @param counterMap 历史预算占用 + * @param actMatchList 匹配预算占用的费用(含超支预算) + * @param actUnMatchList 没有匹配预算的费用 + * @param allowBudgetIdMap 满足当前活动项的费用idMap + * @param budgetItemApplyAmountMap 统计费用申请占用金额 + */ + private void matchPolicyMain(TzcPolicyItem policyItem, + Boolean throwEx, + boolean overspend, + Map budgetItemAmountMap, + final List allBudgetList, + List noConditionBudgetList, + Map counterMap, + final List actMatchList, + final List actUnMatchList, + final Map> allowBudgetIdMap, + Map budgetItemApplyAmountMap, + PolicySortWrapper sortWrapper ) { + TbsBudgetItemCostResult budgetItemCostResult = new TbsBudgetItemCostResult(); + budgetItemCostResult.setPolicyItem(policyItem); + //过滤满全条件的预算 + List allowBudgetIds = allowBudgetIdMap.get(policyItem.getId()); + if(CollectionUtil.isEmpty(allowBudgetIds)){ + budgetItemCostResult.setBudgetId(0L); + budgetItemCostResult.setScheduleId(0L); + budgetItemCostResult.setScheduleItemId(0L); + budgetItemCostResult.setScheduleItemBudgetId(0L); + budgetItemCostResult.setScheduleItemName("无"); + actUnMatchList.add(budgetItemCostResult); + return; + } + //PS:排序规则:优先为时间条件,其次匹配品牌条件 + List budgetList = allBudgetList.stream().filter(obj->allowBudgetIds.contains(obj.getId())).collect(Collectors.toList()); + //按品类条件,提取可用预算(列表已按小维度到大维度排列) + List policyGoodsList = tzcPolicyGoodsService.listByItemId(policyItem.getId()); + List levelPathIdsList = policyGoodsList.stream().map(TzcPolicyGoods::getTargetLevelPathIds).collect(Collectors.toList()); + List currentItemBudgetList = this.filterMatchGoodsCondition(policyItem,budgetList, levelPathIdsList); + //关联无条件预算 + currentItemBudgetList.addAll(noConditionBudgetList); + //提取可用预算的考核期 + List currentScheduleItemBudgets = new ArrayList<>(); + //当前科目 + Long subjectId = policyItem.getSubjectId(); + //拦截非当前成本中心 + String centerId = policyItem.getCenterId(); + String centerType = policyItem.getCenterType(); + for (TbsBudget budget : currentItemBudgetList) { + if(!budget.getCenterId().equals(centerId) || + !budget.getCenterType().equals(centerType) ){ + continue; + } + //TODO dev +// if(!subjectId.equals(budget.getSubjectId())&&!budget.getSubjectId().equals(0L)){ +// continue; +// } + List scheduleItemBudgets = policyItem.getScheduleItemBudgetList(); + for (TbsScheduleItemBudget scheduleItemBudget : scheduleItemBudgets) { + if(scheduleItemBudget.getBudgetId().equals(budget.getId())){ + currentScheduleItemBudgets.add(scheduleItemBudget); + } + } + } + //进行排序 + currentScheduleItemBudgets = PolicySortWrapperUtil.initializeSort(policyItem,currentScheduleItemBudgets,sortWrapper); + //检测是否有是否足够预算 + BigDecimal goodsAmount = policyItem.getDiscountMax(); + if(CollectionUtil.isNotEmpty(currentScheduleItemBudgets)){ + boolean isMatch = false; + for (TbsScheduleItemBudget itemBudget : currentScheduleItemBudgets) { + //历史费用(含申请占用金额) + BigDecimal totalUsed = budgetItemAmountMap.get(itemBudget.getId()); + //当前项费用 + BigDecimal budgetAmount = itemBudget.getBudgetAmount(); + //前置费用 + BigDecimal lastAmount = counterMap.get(itemBudget.getId()); + if(lastAmount==null){ + lastAmount = BigDecimal.ZERO; + } + //判断是否够用 + if(budgetAmount.subtract(lastAmount).subtract(totalUsed).compareTo(goodsAmount)>=0){ + budgetItemCostResult.setBudgetId(itemBudget.getBudgetId()); + budgetItemCostResult.setScheduleId(itemBudget.getScheduleId()); + budgetItemCostResult.setScheduleItemId(itemBudget.getScheduleItemId()); + budgetItemCostResult.setScheduleItemBudgetId(itemBudget.getId()); + budgetItemCostResult.setScheduleItemName(itemBudget.getItemName()); + //绑定录入时可用预算 + budgetItemCostResult.setScheduleItemAmount(budgetAmount); + //剩余的可用预算 + budgetItemCostResult.setScheduleItemAmountUsed(totalUsed); + budgetItemCostResult.setScheduleItemAmountApply(budgetItemApplyAmountMap.get(itemBudget.getId())); + isMatch = true; + //记录当前费用使用考核期费用 + lastAmount = lastAmount.add(goodsAmount); + counterMap.put(itemBudget.getId(),lastAmount); + actMatchList.add(budgetItemCostResult); + break; + } + } + //无匹配的预算 + if(!isMatch){ + if (throwEx){ + Assert.throwEx("政策["+ policyItem.getPolicyItemCode()+"]预算不足"); + } + if(overspend){ + TbsScheduleItemBudget itemBudget = currentScheduleItemBudgets.get(0); + budgetItemCostResult.setBudgetId(itemBudget.getBudgetId()); + budgetItemCostResult.setScheduleId(itemBudget.getScheduleId()); + budgetItemCostResult.setScheduleItemId(itemBudget.getScheduleItemId()); + budgetItemCostResult.setScheduleItemBudgetId(itemBudget.getId()); + budgetItemCostResult.setScheduleItemName(itemBudget.getItemName()); + //记录当前费用使用考核期费用 + BigDecimal lastAmount = counterMap.get(itemBudget.getId()); + if(lastAmount==null){ + lastAmount = BigDecimal.ZERO; + } + lastAmount = lastAmount.add(goodsAmount); + counterMap.put(itemBudget.getId(),lastAmount); + actMatchList.add(budgetItemCostResult); + }else{ + budgetItemCostResult.setBudgetId(0L); + budgetItemCostResult.setScheduleId(0L); + budgetItemCostResult.setScheduleItemId(0L); + budgetItemCostResult.setScheduleItemBudgetId(0L); + budgetItemCostResult.setScheduleItemName("无"); + actUnMatchList.add(budgetItemCostResult); + } + } + }else { + if(throwEx){ + Assert.throwEx("政策["+ policyItem.getPolicyItemCode()+"]无可用预算"); + } + //添加到预算超支表 + budgetItemCostResult.setBudgetId(0L); + budgetItemCostResult.setScheduleId(0L); + budgetItemCostResult.setScheduleItemId(0L); + budgetItemCostResult.setScheduleItemBudgetId(0L); + budgetItemCostResult.setScheduleItemName("无"); + actUnMatchList.add(budgetItemCostResult); + } + } + + /** + * 按品类条件,提取可用预算 + * @param policyItem 用于绑定target信息保存到budeget_log + * @param budgetList 预算(已关联参数_条件列表) + * @param levelPathIdsList + * @return + */ + @NotNull + public List filterMatchGoodsCondition(TzcPolicyItem policyItem,List budgetList,List levelPathIdsList) { + List currentItemBudgetList = new ArrayList<>(); + for (String levelPath : levelPathIdsList) { + Set levelPathSet = new LinkedHashSet<>(); + levelPathSet.add(levelPath); + TbsBudgetCostUtil.buildPaths(levelPath,levelPathSet); + for (TbsBudget budget : budgetList) { + if(budget.getConditionFlag().equals(1)){ + boolean isMatch = false; + List budgetConditionListByBudget = budget.getBudgetConditionList(); + for (TbsBudgetCondition budgetCondition : budgetConditionListByBudget) { + if(isMatch){break;} + for (String conditionString : levelPathSet) { + if(budgetCondition.getTargetLevelPathIds().contains(conditionString)){ + isMatch = true; + currentItemBudgetList.add(budget); + List usedConditionList = policyItem.getUsedConditionList(); + if(usedConditionList==null){ + usedConditionList = new ArrayList<>(); + } + usedConditionList.add(budgetCondition); + policyItem.setUsedConditionList(usedConditionList); + break; + } + } + + } + } + } + } + return currentItemBudgetList; + } + + /** + * 拦截没有预算的活动 + * @param throwEx 抛出异常 + * @param overspend 超支 + * @param policyItemList 活动列表 + * @param noBudgetPolicyIds 没有预算的活动id + * @param activityAllowBudgetIdMap 预算条件需包含活动条件, Map结构:活动id->满足的预算id列表 + */ + private void handleNoBudgetPolicy(Boolean throwEx, boolean overspend, List policyItemList, + Set noBudgetPolicyIds, + Map> activityAllowBudgetIdMap) { + if(!overspend && throwEx && noBudgetPolicyIds.size()>0){ + for (TzcPolicyItem policyItem : policyItemList) { + for (Long policyId : noBudgetPolicyIds) { + if(policyItem.getId().equals(policyId)){ + Assert.throwEx("["+policyItem.getPolicyItemCode()+"]无可用预算"); + } + } + List budgetIds = activityAllowBudgetIdMap.get(policyItem.getId()); + if(CollectionUtil.isEmpty(budgetIds)){ + Assert.throwEx("["+policyItem.getPolicyItemCode()+"]无可用预算"); + } + } + Assert.throwEx("无可用预算"); + } + } + + /** + * 预算条件需包含活动条件, Map结构:活动id->满足的预算id列表 + * @param policyItemList + * @param budgetList + * @param noConditionBudgetList + * @return + */ + private Map> buildPolicyBudgetMap(List policyItemList, + List budgetList, + List noConditionBudgetList, + PolicySortWrapper sortWrapper) { + Map> activityAllowBudgetIdMap = new HashMap<>(); + for (TzcPolicyItem policyItem : policyItemList) { + Long policyItemId = policyItem.getId(); + List budgetIdsOfActivity = new ArrayList<>(); + if(CollectionUtil.isEmpty(noConditionBudgetList)){ + budgetIdsOfActivity.addAll(noConditionBudgetList.stream().map(TbsBudget::getId).collect(Collectors.toList())); + } + List policyGoodsList = tzcPolicyGoodsService.listByItemId(policyItemId); + List poItemMathConList = new ArrayList<>(); + for (TbsBudget budget : budgetList) { + if(budget.getConditionFlag().equals(1)){ + List budgetConditionList = budget.getBudgetConditionList(); + boolean hasNoMatch = false; + for (TzcPolicyGoods policyGoods : policyGoodsList) { + boolean matchGoods = false; + for (TbsBudgetCondition budgetCondition : budgetConditionList) { + if(policyGoods.getTargetLevelPathIds().contains(budgetCondition.getTargetLevelPathIds())){ + poItemMathConList.add(budgetCondition); + matchGoods = true; + break; + } + } + if(!matchGoods){ + hasNoMatch = true; + break; + } + } + //匹配的 + if(!hasNoMatch){ + List budgetIds = activityAllowBudgetIdMap.get(policyItemId); + if(budgetIds==null){ + budgetIds = new ArrayList<>(); + } + budgetIds.add(budget.getId()); + budgetIds.addAll(budgetIdsOfActivity); + activityAllowBudgetIdMap.put(policyItemId,budgetIds); + } + }else { + List budgetIds = activityAllowBudgetIdMap.get(policyItemId); + if(budgetIds==null){ + budgetIds = new ArrayList<>(); + } + budgetIds.add(budget.getId()); + budgetIds.addAll(budgetIdsOfActivity); + activityAllowBudgetIdMap.put(policyItemId,budgetIds); + } + } + sortWrapper.putPolicyItemCondition(policyItemId, poItemMathConList); + } + return activityAllowBudgetIdMap; + } + + /** + * 1.通过活动加载所有满足条件的考核期(用于加载历史核销费用), + * 2.设置没有可用预算的活动id + * 3.设置匹配的考核期列表到活动中 + * @param policyItemList -> item设置满足条件的考核期列表 + * @param budgetIds + * @param noBudgetPolicyItemIds 没有预算的政策项ID + * @return scheduleItemList 命中的考核期列表 + */ + public List loadScheduleBudgetAndSetting(List policyItemList, + List budgetIds, Set noBudgetPolicyItemIds,PolicySortWrapper sortWrapper) { + List scheduleItemList = new ArrayList<>(); + Set budgetIdsSet = new HashSet<>(); + Map allAllowScheduleItemTempMap = new HashMap<>(); + // of sort + Map> scheduleItemMapOfSort = new HashMap<>(); + for (TzcPolicyItem policyItem : policyItemList) { + List budgetItemList = tbsScheduleItemBudgetService + .betweenDateList(policyItem.getPolicyStartDate(),policyItem.getPolicyEndDate()); + //设置关联用于后面条件过滤 + policyItem.setScheduleItemBudgetList(budgetItemList); + if(CollectionUtil.isNotEmpty(budgetItemList)){ + for (TbsScheduleItemBudget item : budgetItemList) { + budgetIdsSet.add(item.getBudgetId()); + allAllowScheduleItemTempMap.put(item.getId(),item); + } + scheduleItemMapOfSort.put(policyItem.getId(),budgetItemList); + }else { + noBudgetPolicyItemIds.add(policyItem.getId()); + } + } + for (Long tmpId : allAllowScheduleItemTempMap.keySet()) { + scheduleItemList.add(allAllowScheduleItemTempMap.get(tmpId)); + } + sortWrapper.setPolicyItemScheduleItemMap(scheduleItemMapOfSort); + budgetIds.addAll(budgetIdsSet); + return scheduleItemList; + } + + /** + * 保存预算使用日志 + * @param result + * @param sysUser + * @param tzcPolicy + * @param allBudgetItem + */ + private List saveBudgetLog(TbsBudgetCostResult result, SysUser sysUser, TzcPolicy tzcPolicy, List allBudgetItem, List policyItemList) { + List budgetLogList = new ArrayList<>(); + List budgetList = result.getBudgetList(); + for (TbsBudgetCostItemPolicy item : allBudgetItem) { + //排除不匹配预算的项 + if(item.getBudgetId().equals(0L)){ + continue; + } + TbsBudget budget = null; + for (TbsBudget tbsBudget : budgetList) { + if(item.getBudgetId().equals(tbsBudget.getId())){ + budget = tbsBudget; + break; + } + } + if(budget==null){ + continue; + } + TzcPolicyItem currPolicyItem = null; + for (TzcPolicyItem policyItem : policyItemList) { + if(item.getPolicyItemId().equals(policyItem.getId())){ + currPolicyItem = policyItem; + } + } + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.buildTbsBudgetLog(BudgetLogOptFlag.State_11,sysUser, tzcPolicy, item, budget,item.getPolicyItemAmount().negate(),currPolicyItem); + budgetLogList.add(budgetLog); + } + return budgetLogList; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyGoodsServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyGoodsServiceImpl.java new file mode 100644 index 0000000..3a9da50 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyGoodsServiceImpl.java @@ -0,0 +1,40 @@ +package com.qs.serve.modules.tzc.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.modules.goods.service.GoodsApplicationService; +import com.qs.serve.modules.tzc.entity.TzcPolicy; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; +import com.qs.serve.modules.tzc.entity.bo.TzcPolicyGoodsBo; +import com.qs.serve.modules.tzc.mapper.TzcPolicyItemMapper; +import com.qs.serve.modules.tzc.mapper.TzcPolicyMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tzc.entity.TzcPolicyGoods; +import com.qs.serve.modules.tzc.service.TzcPolicyGoodsService; +import com.qs.serve.modules.tzc.mapper.TzcPolicyGoodsMapper; + +import java.util.List; + +/** + * 政策商品 服务实现类 + * @author YenHex + * @since 2023-02-20 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TzcPolicyGoodsServiceImpl extends ServiceImpl implements TzcPolicyGoodsService { + + @Override + public List listByItemId(Long itemId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TzcPolicyGoods::getPolicyItemId,itemId); + return this.list(lqw); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyGoodsSyncServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyGoodsSyncServiceImpl.java new file mode 100644 index 0000000..8fd7885 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyGoodsSyncServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tzc.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tzc.entity.TzcPolicyGoodsSync; +import com.qs.serve.modules.tzc.service.TzcPolicyGoodsSyncService; +import com.qs.serve.modules.tzc.mapper.TzcPolicyGoodsSyncMapper; + +/** + * 政策商品同步记录表 服务实现类 + * @author YenHex + * @since 2023-02-27 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TzcPolicyGoodsSyncServiceImpl extends ServiceImpl implements TzcPolicyGoodsSyncService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyItemLogServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyItemLogServiceImpl.java new file mode 100644 index 0000000..79865ca --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyItemLogServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.tzc.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tzc.entity.TzcPolicyItemLog; +import com.qs.serve.modules.tzc.service.TzcPolicyItemLogService; +import com.qs.serve.modules.tzc.mapper.TzcPolicyItemLogMapper; + +/** + * 政策项使用日志 服务实现类 + * @author YenHex + * @since 2023-03-02 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TzcPolicyItemLogServiceImpl extends ServiceImpl implements TzcPolicyItemLogService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyItemServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyItemServiceImpl.java new file mode 100644 index 0000000..e7f09ae --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyItemServiceImpl.java @@ -0,0 +1,182 @@ +package com.qs.serve.modules.tzc.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.modules.bms.entity.BmsSubject; +import com.qs.serve.modules.bms.service.BmsSubjectService; +import com.qs.serve.modules.goods.entity.dto.GoodsTargetInfo; +import com.qs.serve.modules.goods.entity.dto.TbsCenterDto; +import com.qs.serve.modules.goods.service.GoodsApplicationService; +import com.qs.serve.modules.tbs.service.TbsCenterDtoService; +import com.qs.serve.modules.tzc.common.TzcPolicyStatus; +import com.qs.serve.modules.tzc.entity.TzcPolicy; +import com.qs.serve.modules.tzc.entity.TzcPolicyGoods; +import com.qs.serve.modules.tzc.entity.bo.TzcPolicyGoodsBo; +import com.qs.serve.modules.tzc.entity.bo.TzcPolicyItemBo; +import com.qs.serve.modules.tzc.mapper.TzcPolicyMapper; +import com.qs.serve.modules.tzc.service.TzcPolicyGoodsService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tzc.entity.TzcPolicyItem; +import com.qs.serve.modules.tzc.service.TzcPolicyItemService; +import com.qs.serve.modules.tzc.mapper.TzcPolicyItemMapper; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 政策项 服务实现类 + * @author YenHex + * @since 2023-02-20 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TzcPolicyItemServiceImpl extends ServiceImpl implements TzcPolicyItemService { + + private TzcPolicyMapper tzcPolicyMapper; + private TbsCenterDtoService tbsCenterDtoService; + private BmsSubjectService bmsSubjectService; + private GoodsApplicationService goodsApplicationService; + private TzcPolicyGoodsService tzcPolicyGoodsService; + + @Override + public TzcPolicyItem getByPolicyItemCode(String code) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TzcPolicyItem::getPolicyItemCode,code); + return this.getOne(lqw,false); + } + + @Override + public List listByPolicyId(Long id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TzcPolicyItem::getPolicyId,id); + return this.list(lqw); + } + + @Override + public void removeByPolicyId(Long id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TzcPolicyItem::getPolicyId,id); + this.remove(lqw); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public R modify(TzcPolicyItemBo param) { + TzcPolicy tzcPolicy = tzcPolicyMapper.selectById(param.getPolicyId()); + if(!tzcPolicy.allowEditFlag()){ + return R.error("当前状态不支持编辑"); + } + TzcPolicyItem tzcPolicyItem = new TzcPolicyItem(); + if(param.getId()!=null){ + TzcPolicyItem item = this.getById(param.getId()); + if(!item.getPolicyId().equals(tzcPolicy.getId())){ + return R.error("数据错误"); + } + tzcPolicyItem.setId(param.getId()); + tzcPolicyItem.setPolicyItemCode(item.getPolicyItemCode()); + }else { + List policyItemList = this.listByPolicyId(tzcPolicy.getId()); + int max = 0; + for (TzcPolicyItem policyItem : policyItemList) { + try { + String[] tmls = policyItem.getPolicyItemCode().split("_"); + String tml = tmls.length>1?tmls[1]:"0"; + Integer i = Integer.parseInt(tml); + if(i>max){ + max = i; + } + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + tzcPolicyItem.setPolicyItemCode(tzcPolicy.getPolicyCode()+"_"+(max+1)); + } + BmsSubject bmsSubject = bmsSubjectService.getByCode("FYMC05"); + TbsCenterDto centerDto = tbsCenterDtoService.getCenterDto(param.getCenterType(),param.getCenterId()); + tzcPolicyItem.setPolicyId(param.getPolicyId()); + tzcPolicyItem.setPolicyStartDate(param.getPolicyStartDate()); + tzcPolicyItem.setPolicyEndDate(param.getPolicyEndDate()); + tzcPolicyItem.setDiscountAmount(param.getDiscountAmount()); + tzcPolicyItem.setDiscountRate(param.getDiscountRate()); + tzcPolicyItem.setDiscountMax(param.getDiscountMax()); + //tzcPolicyItem.setUsedAmount(param.getUsedAmount()); + tzcPolicyItem.setCenterType(centerDto.getCenterType()); + tzcPolicyItem.setCenterId(centerDto.getId()); + tzcPolicyItem.setCenterCode(centerDto.getCenterCode()); + tzcPolicyItem.setCenterName(centerDto.getCenterName()); + tzcPolicyItem.setSubjectId(bmsSubject.getId()); + tzcPolicyItem.setSubjectCode(bmsSubject.getSubjectCode()); + tzcPolicyItem.setSubjectName(bmsSubject.getSubjectName()); + tzcPolicyItem.setTitle(tzcPolicy.getTitle()); + tzcPolicyItem.setSupplierId(tzcPolicy.getSupplierId()); + tzcPolicyItem.setSupplierName(tzcPolicy.getSupplierName()); + tzcPolicyItem.setSupplierCode(tzcPolicy.getSupplierCode()); + tzcPolicyItem.setUserId(tzcPolicy.getUserId()); + tzcPolicyItem.setUserCode(tzcPolicy.getUserCode()); + tzcPolicyItem.setUserName(tzcPolicy.getUserName()); + tzcPolicyItem.setAttachIds(param.getAttachIds()); + tzcPolicyItem.setPreActQuantity(param.getPreActQuantity()); + tzcPolicyItem.setPreNotActQuantity(param.getPreNotActQuantity()); + tzcPolicyItem.setRemark(param.getRemark()); + //移除旧记录 + if(param.getId()!=null){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TzcPolicyGoods::getPolicyItemId,param.getId()); + tzcPolicyGoodsService.remove(lqw); + } + //加载商品 + List policyGoodsBoList = param.getPolicyGoodsList(); + Map> policyGoodsBoListMap = policyGoodsBoList.stream() + .collect(Collectors.groupingBy(TzcPolicyGoodsBo::getTargetType)); + List tzcPolicyGoodsList = new ArrayList<>(); + for (String goodsType : policyGoodsBoListMap.keySet()) { + List policyGoodsBos = policyGoodsBoListMap.get(goodsType); + List goodsIds = policyGoodsBos.stream().map(TzcPolicyGoodsBo::getTargetId).collect(Collectors.toList()); + List goodsTargetInfoList = goodsApplicationService.getGoodsTargetInfo(goodsType,goodsIds); + if(goodsTargetInfoList.size(){ + a.setPolicyItemId(itemId); + a.setPolicyItemCode(tzcPolicyItem.getPolicyItemCode()); + }); + tzcPolicyGoodsService.saveBatch(tzcPolicyGoodsList); + //更新政策数量 + List policyItemList = this.listByPolicyId(tzcPolicy.getId()); + BigDecimal totalAmount = BigDecimal.ZERO; + BigDecimal totalUsedAmount = BigDecimal.ZERO; + for (TzcPolicyItem policyItem : policyItemList) { + totalAmount = totalAmount.add(policyItem.getDiscountMax()); + totalUsedAmount = totalUsedAmount.add(policyItem.getUsedAmount()); + } + TzcPolicy policyParam = new TzcPolicy(); + policyParam.setTotalItemAmount(totalAmount); + policyParam.setTotalItemUsedAmount(totalUsedAmount); + policyParam.setTotalItems(policyItemList.size()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TzcPolicy::getId,param.getPolicyId()); + tzcPolicyMapper.update(policyParam,lqw); + return R.ok(tzcPolicyItem); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyOperationServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyOperationServiceImpl.java new file mode 100644 index 0000000..ed6835b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyOperationServiceImpl.java @@ -0,0 +1,194 @@ +package com.qs.serve.modules.tzc.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.framework.manager.AsyncManager; +import com.qs.serve.common.model.consts.BudgetLogRollbackFlag; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.enums.BudgetLogOptFlag; +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.seeyon.service.SeeYonOperationService; +import com.qs.serve.modules.sync.AsyncFactory; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; +import com.qs.serve.modules.tbs.entity.TbsBudgetLog; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.entity.vo.CtpAffairVo; +import com.qs.serve.modules.tbs.service.TbsBudgetLogService; +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.TzcPolicyItem; +import com.qs.serve.modules.tzc.service.TzcPolicyItemService; +import com.qs.serve.modules.tzc.service.TzcPolicyService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/5/25 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TzcPolicyOperationServiceImpl implements SeeYonOperationService { + + private final TzcPolicyService tzcPolicyService; + private final TzcPolicyItemService tzcPolicyItemService; + private final TbsBudgetLogService tbsBudgetLogService; + private final TzcPolicyApplicationServiceImpl tzcPolicyApplicationService; + + @Override + public String getTargetId(TbsAffairCommitBo affairCommit) { + return affairCommit.getPolicyId()+""; + } + + @Override + public boolean checkSyFormIdIsNotNull(String targetId) { + TzcPolicy policy = tzcPolicyService.getById(targetId); + if(policy!=null&&policy.getSyFormId()!=null){ + return true; + } + return false; + } + + @Override + public String getSyFormIdByTargetInfo(TbsAffairCommitBo affairCommit) { + TzcPolicy tzcPolicy = tzcPolicyService.getById(affairCommit.getPolicyId()); + if(!tzcPolicy.getPolicyStatus().equals(TzcPolicyStatus.Status_1_Checking)){ + Assert.throwEx("当前政策状态不可审批"); + } + return tzcPolicy.getSyFormId(); + } + + @Override + public Object doBacked(TbsAffairCommitBo param) { + Long policyId = param.getPolicyId(); + TzcPolicy policy = new TzcPolicy(); + policy.setId(policyId); + policy.setPolicyStatus(TzcPolicyStatus.Status_4_RollBack); + tzcPolicyService.updateById(policy); + LambdaQueryWrapper logLqw = new LambdaQueryWrapper<>(); + logLqw.select(TbsBudgetLog::getId); + logLqw.eq(TbsBudgetLog::getPolicyId,policyId); + logLqw.eq(TbsBudgetLog::getRollbackFlag, BudgetLogRollbackFlag.State_0); + List budgetLogList = tbsBudgetLogService.list(logLqw); + budgetLogList.forEach(a->a.setRollbackFlag(BudgetLogRollbackFlag.State_1)); + tbsBudgetLogService.updateBatchById(budgetLogList); + return R.ok(); + } + + @Override + public Object doFinished(TbsAffairCommitBo param) { + String policyId = this.getTargetId(param); + TzcPolicy tzcPolicy = tzcPolicyService.getById(policyId); + TzcPolicy policy = new TzcPolicy(); + policy.setId(tzcPolicy.getId()); + policy.setPolicyStatus(TzcPolicyStatus.Status_2_PassSuccess); + policy.setPassTime(LocalDateTime.now()); + tzcPolicyService.updateById(policy); + //更新活动通过时间 + TzcPolicyItem policyItem = new TzcPolicyItem(); + policyItem.setPolicyItemStatus(TzPolicyItemStatus.Status_1_PassSuccess); + LambdaQueryWrapper itemLqw = new LambdaQueryWrapper<>(); + itemLqw.eq(TzcPolicyItem::getPolicyId,tzcPolicy.getId()); + tzcPolicyItemService.update(policyItem,itemLqw); + //同步到销路通表 + try { + tzcPolicyApplicationService.syncPolicy(tzcPolicy.getId()); + } catch (Exception e) { + e.printStackTrace(); + } + return R.ok(); + } + + @Override + public Object doRefuse(TbsAffairCommitBo param) { + Long policyId = param.getPolicyId(); + TzcPolicy policy = new TzcPolicy(); + policy.setId(policyId); + policy.setPolicyStatus(TzcPolicyStatus.Status_5_Refuse); + tzcPolicyService.updateById(policy); + tzcPolicyService.releaseCost(policy.getId(), 1); + //移除日志 + LambdaQueryWrapper logLqw = new LambdaQueryWrapper<>(); + logLqw.eq(TbsBudgetLog::getPolicyId,policyId); + logLqw.eq(TbsBudgetLog::getRollbackFlag,BudgetLogRollbackFlag.State_0); + List oldLogList = tbsBudgetLogService.list(logLqw); + List oldLogList4Upd = oldLogList.stream().map(a->{ + TbsBudgetLog budgetLog = new TbsBudgetLog(); + budgetLog.setId(a.getId()); + budgetLog.setRollbackFlag(BudgetLogRollbackFlag.State_3); + return budgetLog; + }).collect(Collectors.toList()); + tbsBudgetLogService.updateBatchById(oldLogList4Upd); + for (TbsBudgetLog budgetLog : oldLogList) { + budgetLog.setCreateBy(null); + budgetLog.setCreateTime(null); + budgetLog.setUpdateBy(null); + budgetLog.setUpdateTime(null); + budgetLog.setId(null); + BudgetLogOptFlag optFlag = BudgetLogOptFlag.State_14; + budgetLog.setAmount(TbsBudgetLogBuildUtil.buildAmount(budgetLog.getAmount(),optFlag)); + budgetLog.setOptType(optFlag.getCode()); + } + tbsBudgetLogService.saveBatch(oldLogList); + return null; + } + + @Override + public void pageMemberAffair4packageVo(List ctpAffairs) { + for (CtpAffairVo ctpAffairVo : ctpAffairs) { + TzcPolicy tzcPolicy = tzcPolicyService.getById( + ctpAffairVo.getAffairInfo().getCostApplyId()); + ctpAffairVo.setPolicyInfo(tzcPolicy); + } + } + + @Override + public String getTemplateCode() { + return TbsSeeYonConst.PolicyConf.Code(); + } + + @Override + public void doCommitBacked(String targetId) { + AsyncManager.me().execute(AsyncFactory.submitPolicy(Long.parseLong(targetId))); + } + + @Override + public Object compensateBacked(String targetId) { + TzcPolicy tzcPolicy = tzcPolicyService.getById(targetId); + if(tzcPolicy.getPolicyStatus().equals(TzcPolicyStatus.Status_1_Checking)){ + TbsAffairCommitBo param = new TbsAffairCommitBo(); + param.setPolicyId(tzcPolicy.getId()); + this.doBacked(param); + } + return null; + } + + @Override + public Object compensateFinished(String targetId) { + TzcPolicy tzcPolicy = tzcPolicyService.getById(targetId); + if(tzcPolicy.getPolicyStatus().equals(TzcPolicyStatus.Status_1_Checking)){ + TbsAffairCommitBo param = new TbsAffairCommitBo(); + param.setPolicyId(tzcPolicy.getId()); + this.doFinished(param); + } + return null; + } + + @Override + public Object compensateRefuse(String targetId) { + TzcPolicy tzcPolicy = tzcPolicyService.getById(targetId); + if(tzcPolicy.getPolicyStatus().equals(TzcPolicyStatus.Status_1_Checking)){ + TbsAffairCommitBo param = new TbsAffairCommitBo(); + param.setPolicyId(tzcPolicy.getId()); + this.doRefuse(param); + } + return null; + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyServiceImpl.java new file mode 100644 index 0000000..527d361 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/tzc/service/impl/TzcPolicyServiceImpl.java @@ -0,0 +1,86 @@ +package com.qs.serve.modules.tzc.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.entity.TbsBudgetCostItemPolicy; +import com.qs.serve.modules.tbs.service.TbsBudgetCostItemPolicyService; +import com.qs.serve.modules.tzc.common.TzcPolicyStatus; +import com.qs.serve.modules.tzc.entity.bo.TzcPolicyBo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.tzc.entity.TzcPolicy; +import com.qs.serve.modules.tzc.service.TzcPolicyService; +import com.qs.serve.modules.tzc.mapper.TzcPolicyMapper; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 政策 服务实现类 + * @author YenHex + * @since 2023-02-20 + */ +@Slf4j +@Service +@AllArgsConstructor +public class TzcPolicyServiceImpl extends ServiceImpl implements TzcPolicyService { + + private BmsSupplierService bmsSupplierService; + private SysUserService sysUserService; + private TbsBudgetCostItemPolicyService tbsBudgetCostItemPolicyService; + + @Override + public List selectPolicyList(TzcPolicy tzcPolicy) { + return baseMapper.selectTzcPolicyList(tzcPolicy); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public R modify(TzcPolicyBo policyParam) { + Long policyId = policyParam.getId(); + TzcPolicy tzcPolicy; + if(policyId!=null){ + tzcPolicy = this.getById(policyId); + if(tzcPolicy.getPolicyStatus().equals(TzcPolicyStatus.Status_0_UnCommit) + && tzcPolicy.getPolicyStatus().equals(TzcPolicyStatus.Status_4_RollBack)){ + return R.error("当前状态不支持编辑"); + } + }else { + tzcPolicy = new TzcPolicy(); + tzcPolicy.setPolicyCode("P"+CodeGenUtil.generate(CodeGenUtil.SourceKey.Policy)); + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + tzcPolicy.setUserId(sysUser.getId()); + tzcPolicy.setUserCode(sysUser.getCode()); + tzcPolicy.setUserName(sysUser.getName()); + BmsSupplier supplier = bmsSupplierService.getById(policyParam.getSupplierId()); + tzcPolicy.setSupplierId(policyParam.getSupplierId()); + tzcPolicy.setSupplierCode(supplier.getCode()); + tzcPolicy.setSupplierName(supplier.getName()); + } + tzcPolicy.setTitle(policyParam.getTitle()); + tzcPolicy.setRemark(policyParam.getRemark()); + this.saveOrUpdate(tzcPolicy); + return R.ok(tzcPolicy); + } + + + @Override + public void releaseCost(Long policyId, Integer invalidFlag) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(TbsBudgetCostItemPolicy::getPolicyId,policyId); + TbsBudgetCostItemPolicy param = new TbsBudgetCostItemPolicy(); + param.setInvalidFlag(invalidFlag); + tbsBudgetCostItemPolicyService.update(param,lqw); + } + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/common/VerificationUtil.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/common/VerificationUtil.java new file mode 100644 index 0000000..9c51026 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/common/VerificationUtil.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.vtb.common; + +import com.qs.serve.common.util.Assert; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.entity.TbsCostApply; + +/** + * @author YenHex + * @since 2024/6/21 + */ +public class VerificationUtil { + + public static void verifyCostState(TbsCostApply costApply) { + if(costApply.getContractFlag().equals(1)){ + Assert.throwEx("协议类申请不支持CRM核销"); + } + if(costApply.getCancelFlag().equals(1)){ + Assert.throwEx("异动的费用申请不可核销!!"); + } + if(!costApply.getChargeState().equals(TbsCostApplyState.State_2_actioning.getCode())){ + Assert.throwEx("当前费用状态不支持"); + } + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/common/VtbFundFlowType.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/common/VtbFundFlowType.java new file mode 100644 index 0000000..5594ad7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/common/VtbFundFlowType.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.vtb.common; + +/** + * @author YenHex + * @since 2022/11/25 + */ +public interface VtbFundFlowType { + + /** + * 核销 + */ + String Verification = "verification"; + + /** + * 释放费用 + */ + String Release = "release"; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/common/VtbVerificationState.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/common/VtbVerificationState.java new file mode 100644 index 0000000..1c0e49d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/common/VtbVerificationState.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.vtb.common; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author YenHex + * @since 2022/11/24 + */ +@Getter +@AllArgsConstructor +public enum VtbVerificationState { + + //状态:0=审批中;1=完成;2-中止;3-回滚;4-作废;5-关闭 + Commiting(0), + Finished(1), + Stop(2), + Rollback(3), + Cancel(4), + Close(5); + + private Integer code; + + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationBatchController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationBatchController.java new file mode 100644 index 0000000..4286716 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationBatchController.java @@ -0,0 +1,222 @@ +package com.qs.serve.modules.vtb.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.annotation.LimitSubmit; +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.seeyon.entity.bo.CtpAddNodeParam; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.entity.so.VtbVerificationBatchQuery; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.entity.VtbVerificationYard; +import com.qs.serve.modules.vtb.entity.bo.VtbVerificationBatchBo; +import com.qs.serve.modules.vtb.entity.vo.VtbVerificationBatchVo; +import com.qs.serve.modules.vtb.service.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.vtb.entity.VtbVerificationBatch; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 批量核销 + * @author YenHex + * @since 2024-06-14 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("vtb/verificationBatch") +public class VtbVerificationBatchController { + + private SysPostUserService postUserService; + private SeeYonRequestService seeYonService; + private VtbVerificationBatchService vtbVerificationBatchService; + private VtbVerificationService vtbVerificationService; + private VtbVerificationApplication2 vtbVerificationApplication2; + private VtbVerificationBatchOperationService vtbVerificationBatchOperationService; + private VtbVerificationYardService verificationYardService; + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(VtbVerificationBatch param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + List list = vtbVerificationBatchService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * 翻页2(连表查询-left join tbs_cost_apply) + * @param query + * @return + */ + @GetMapping("/page2") + public R> getPage2(VtbVerificationBatchQuery query){ + PageUtil.startPage(); + List list = vtbVerificationBatchService.list2(query); + return R.byPageHelperList(list); + } + @PostMapping("/page2") + public R> getPage2Post(@RequestBody VtbVerificationBatchQuery query){ + PageUtil.setPageNum(query.getPageNum()); + PageUtil.setPageSize(query.getPageSize()); + return this.getPage2(query); + } + + /** + * 翻页2(连表查询-left join tbs_cost_apply) + * @param query + * @return + */ + @GetMapping("/pageMy") + public R> getPageMy(VtbVerificationBatchQuery query){ + String userId = AuthContextUtils.getSysUserId(); + List userIds = new ArrayList<>(); + if(query.getLoadChild()!=null&&query.getLoadChild().equals(1)){ + userIds = postUserService.listByChildIds(userId); + query.setUserIds(userIds); + } + userIds.add(userId); + PageUtil.startPage(); + List list = vtbVerificationBatchService.list2(query); + return R.byPageHelperList(list); + } + @PostMapping("/pageMy") + public R> getPageMy4Post(@RequestBody VtbVerificationBatchQuery query){ + PageUtil.setPageNum(query.getPageNum()); + PageUtil.setPageSize(query.getPageSize()); + return this.getPageMy(query); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + VtbVerificationBatch batch = vtbVerificationBatchService.getById(id); + + List verificationList = vtbVerificationService + .list(new LambdaQueryWrapper() + .eq(VtbVerification::getBatchId,batch.getId())); + for (VtbVerification verification : verificationList) { + vtbVerificationApplication2.buildRelateInfo(verification); + } + batch.setVerificationList(verificationList); + return R.ok(batch); + } + + + /** + * 提交批量 + * @param param + * @return + */ + @PostMapping("/submit") + @SysLog(module = SystemModule.Verification, title = "批量核销", biz = BizType.INSERT) + public R save(@RequestBody @Valid VtbVerificationBatchBo param){ + seeYonService.testConnection(); + vtbVerificationBatchService.submit(param); + return R.ok(); + } + + /** + * 加签 + * @param param + * @return + */ + @LimitSubmit + @PostMapping("/addNode") + @SysLog(module = SystemModule.Verification, title = "核销加签", biz = BizType.OTHER) + public R addNode(@RequestBody CtpAddNodeParam param){ + return vtbVerificationBatchOperationService.addNode(param); + } + + /** + * 补偿按钮 + * @param id + * @return + */ + @LimitSubmit + @PostMapping("/compensate/{id}") + public R compensate(@PathVariable("id") String id){ + vtbVerificationBatchOperationService.runCompensate(id); + return R.ok(); + } + + /** + * 提交审批节点 + * @return + */ + @LimitSubmit + @PostMapping("/commitAffair") + @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.DELETE) + public R commitAffair(@RequestBody @Valid TbsAffairCommitBo affairCommit){ + seeYonService.testConnection(); + R r = vtbVerificationBatchOperationService.commitAffair(affairCommit); + if(affairCommit.getState().equals(2)){ + Runnable runnable = () -> { + AuthContextUtils.setTenant("001"); + vtbVerificationBatchOperationService.runCompensate(affairCommit.getCostApplyId()+""); + }; + new Thread(runnable).start(); + } + return r; + } + + + /** + * 审批结果(用于详情页) + * @param targetId + * @return + */ + @GetMapping("/ListAffairs") + public Object pageMemberAffair(String targetId){ + VtbVerificationBatch batch = vtbVerificationBatchService.getById(targetId); + return vtbVerificationBatchOperationService.pageAffairV2(targetId,batch.getVtbBatchCode()); + } + + /** + * 审批调整记录 + * @param batchId + * @return + */ + @GetMapping("/listCommitChanges") + public R> getList(Long batchId){ + List verifications = vtbVerificationService.list(new LambdaQueryWrapper() + .eq(VtbVerification::getBatchId,batchId)); + if(CollectionUtil.isEmpty(verifications)){ + return R.error("批次参数异常"); + } + List rsList = new ArrayList(); + for (VtbVerification verification : verifications) { + LambdaQueryWrapper yardLqw = new LambdaQueryWrapper<>(); + yardLqw.eq(VtbVerificationYard::getVerificationId,verification.getId()); + yardLqw.orderByDesc(VtbVerificationYard::getId); + List yardList = verificationYardService.list(yardLqw); + Map itemRs = vtbVerificationApplication2.buildCommentChangeList(verification, yardList); + rsList.add(itemRs); + } + return R.ok(rsList); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java new file mode 100644 index 0000000..f68c5ec --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationController.java @@ -0,0 +1,510 @@ +package com.qs.serve.modules.vtb.controller; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.qs.serve.common.config.properties.ProjectApisProperties; +import com.qs.serve.common.model.annotation.LimitSubmit; +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.seeyon.entity.CtpAffair; +import com.qs.serve.modules.seeyon.entity.CtpAffairQo; +import com.qs.serve.modules.seeyon.entity.bo.CtpAddNodeParam; +import com.qs.serve.modules.seeyon.entity.dto.CtpAffairPageSo; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.entity.vo.CtpAffairVo; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.vtb.common.VtbVerificationState; +import com.qs.serve.modules.vtb.entity.*; +import com.qs.serve.modules.vtb.entity.bo.VtbVerificationCenterCommitBo; +import com.qs.serve.modules.vtb.entity.bo.VtbVerificationContactBo; +import com.qs.serve.modules.vtb.entity.bo.VtbVerificationSubjectCommitBo; +import com.qs.serve.modules.vtb.entity.dto.XltDelVerificationDto; +import com.qs.serve.modules.vtb.entity.vo.VtbCostInfo; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import com.qs.serve.modules.vtb.service.*; +import com.qs.serve.modules.vtb.service.impl.VtbVerificationOperationServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.vtb.entity.so.VtbVerificationSo; +import com.qs.serve.modules.vtb.entity.bo.VtbVerificationBo; + +import javax.validation.Valid; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 核销 核销 + * @author YenHex + * @since 2022-11-24 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("vtb/verification") +public class VtbVerificationController { + + private ProjectApisProperties projectApisProperties; + private VtbVerificationService vtbVerificationService; + private VtbVerificationMapper vtbVerificationMapper; + private VtbVerificationYardCenterItemService vtbVerificationYardCenterItemService; + private TbsCostApplyService tbsCostApplyService; + private TbsActivityService tbsActivityService; + private SysUserService sysUserService; + private SysPostUserService sysPostUserService; + private SeeYonRequestService seeYonService; + private VtbVerificationApplication verificationApplication; + private VtbVerificationYardService verificationYardService; + private VtbVerificationYardItemService vtbVerificationYardItemService; + private VtbVerificationOperationServiceImpl vtbVerificationOperationService; + private VtbVerificationApplication2 vtbVerificationApplication2; + + + /** + * 创建协议类核销记录 + * @param param + * @return + */ + @LimitSubmit + @PostMapping("/createContactRecord") + public R createContactRecord(@RequestBody VtbVerificationContactBo param){ + vtbVerificationService.createContactRecord(param); + return R.ok(); + } + + /** + * 作废核销 + * @param id + * @return + */ + @DeleteMapping("/removeCheckById/{id}") + public R removeVtbById(@PathVariable("id") Long id){ + boolean v = vtbVerificationService.removeCheck(id); + return R.isTrue(v); + } + + /** + * 管理员 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('vtb:verification:query')") + public R> getPage(VtbVerificationSo param){ + Integer loadMy = param.getLoadMy(); + Integer loadChild = param.getLoadChild(); + VtbVerification query = CopierUtil.copy(param,new VtbVerification()); + if(loadChild!=null&&loadChild.equals(1)){ + List userIds = sysPostUserService.listByChildIds(AuthContextUtils.getSysUserId()); + userIds.add(AuthContextUtils.getSysUserId()); + query.setSelectUserIds(userIds); + }else if(loadMy!=null&&loadMy.equals(1)){ + query.setSelectUserIds(Arrays.asList(AuthContextUtils.getSysUserId())); + } + IPage pageResult = vtbVerificationService.selectVerificationList(query); + if(pageResult.getRecords().size()<1){ + return R.byMbpList(pageResult); + } + List actIds = pageResult.getRecords().stream().map(VtbVerification::getActivityId).distinct().collect(Collectors.toList()); + List activityList = tbsActivityService.listByIds(actIds); + List costIds = activityList.stream().map(TbsActivity::getCostApplyId).distinct().collect(Collectors.toList()); + if(CollUtil.isNotEmpty(costIds)){ + List costList = tbsCostApplyService.listByIds(costIds); + for (VtbVerification verification : pageResult.getRecords()) { + for (TbsActivity activity : activityList) { + if(activity.getId().equals(verification.getActivityId())){ + verification.setActivityInfo(activity); + for (TbsCostApply costApply : costList) { + if(costApply.getId().equals(activity.getCostApplyId())){ + verification.setCostApplyInfo(costApply); + } + } + } + } + } + } + return R.byMbpList(pageResult); + } + + /** + * 管理员 + * @param param + * @return + */ + @PostMapping("/page") + @PreAuthorize("hasRole('vtb:verification:query')") + public R> getPage4Post(@RequestBody VtbVerificationSo param){ + PageUtil.setPageNum(param.getPageNum()); + PageUtil.setPageSize(param.getPageSize()); + return getPage(param); + } + + /** + * 翻页(个人) + * @param param + * @return + */ + @GetMapping("/pageMy") + @PreAuthorize("hasRole('vtb:verification:query')") + public R> pageMy(VtbVerificationSo param){ + param.setLoadMy(1); + return getPage(param); + } + + /** + * 翻页(个人) + * @param param + * @return + */ + @PostMapping("/pageMy") + @PreAuthorize("hasRole('vtb:verification:query')") + public R> pageMy4Post(@RequestBody VtbVerificationSo param){ + param.setLoadMy(1); + PageUtil.setPageNum(param.getPageNum()); + PageUtil.setPageSize(param.getPageSize()); + return getPage(param); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @PreAuthorize("hasRole('vtb:verification:query')") + public R getById(@PathVariable("id") String id){ + VtbVerification vtbVerification = vtbVerificationService.getById(id); + boolean notBatch = vtbVerification.getBatchId()==null; + if(vtbVerification.getVerificationState().equals(VtbVerificationState.Commiting.getCode()) && notBatch){ + try { + vtbVerificationOperationService.runCompensate(id); + vtbVerification = vtbVerificationService.getById(id); + } catch (Exception e) { + e.printStackTrace(); + } + } + vtbVerificationApplication2.buildRelateInfo(vtbVerification); + return R.ok(vtbVerification); + } + + /** + * 查找 + * @param id + * @return + */ + @GetMapping("/getForCommentList/{id}") + public R getForCommentList(@PathVariable("id") String id){ + VtbVerification verification = vtbVerificationService.getById(id); + LambdaQueryWrapper yardLqw = new LambdaQueryWrapper<>(); + yardLqw.eq(VtbVerificationYard::getVerificationId,id); + yardLqw.orderByDesc(VtbVerificationYard::getId); + List yardList = verificationYardService.list(yardLqw); + Map result = vtbVerificationApplication2.buildCommentChangeList(verification, yardList); + return R.ok(result); + } + + + /** + * 提交核销 + * @param commitBo + * @return + */ + @LimitSubmit(interval = 30000) + @PostMapping("/commit") + @SysLog(module = SystemModule.Verification, title = "核销", biz = BizType.UPDATE) + @PreAuthorize("hasRole('vtb:verification:commit')") + public R commit(@RequestBody @Valid VtbVerificationSubjectCommitBo commitBo){ + seeYonService.testConnection(); + VtbVerificationBo param = CopierUtil.copy(commitBo,new VtbVerificationBo()); + vtbVerificationService.commit(param); + return R.ok(); + } + + /** + * 提交核销2 + * @param commitBo + * @return + */ + @LimitSubmit(interval = 3000) + @PostMapping("/commitWithChange") + @SysLog(module = SystemModule.Verification, title = "核销", biz = BizType.UPDATE) + public R commit(@RequestBody @Valid VtbVerificationCenterCommitBo commitBo){ + //seeYonService.testConnection(); + VtbVerificationBo param = CopierUtil.copy(commitBo,new VtbVerificationBo()); + vtbVerificationService.commit(param); + return R.ok(); + } + + /** + * 审批列表(用于详情页) + * @param verificationId + * @return + */ + @GetMapping("/ListAffairs") + public R> pageMemberAffair(Long verificationId){ + VtbVerification verificationDB = vtbVerificationService.getById(verificationId); + String syFormId = verificationDB.getSyFormId(); + //批量核销 + if(verificationDB.getBatchId()!=null){ + String templateCode = TbsSeeYonConst.BatchCostCheckConf.Code(); + R> result = seeYonService.commonListAffairs(verificationDB.getBatchId()+"",null,templateCode); + List result2 = verificationApplication.buildCtpAffairVoList(result.getData()); + return R.ok(result2); + } + //单个核销 + if(syFormId==null){ + return R.ok(); + } + String templateCode = TbsSeeYonConst.CostCheckConf.Code(); + R> result = seeYonService.commonListAffairs(verificationId+"",null,templateCode); + List result2 = verificationApplication.buildCtpAffairVoList(result.getData()); + return R.ok(result2); + } + + /** + * 审批列表(翻页) + * @param pageSo + * @return + */ + @GetMapping("/pageMemberAffair") + public R> pageMemberAffair(CtpAffairPageSo pageSo,TbsCostApply costApply){ + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + if(!StringUtils.hasText(sysUser.getSyUserId())||!StringUtils.hasText(sysUser.getSyAccount())){ + return R.error("当前账号未绑定致远用户信息"); + } + CtpAffairQo param = new CtpAffairQo(); + param.setMemberId(sysUser.getSyUserId()); + param.setState(pageSo.getState()); + param.setPageNum(pageSo.getPageNum()); + param.setPageSize(pageSo.getPageSize()); + param.setQueryBizRegion(pageSo.getQueryBizRegion()); + param.setQuerySaleRegion(pageSo.getQuerySaleRegion()); + param.setTitle(costApply.getChargeTheme()); + param.setSupplierName(costApply.getSupplierName()); + param.setSupplierCode(costApply.getSupplierCode()); + param.setApplyUserName(costApply.getUserName()); + param.setTemplateCode(TbsSeeYonConst.CostCheckConf.Code()); + R> syResult = seeYonService.pageMemberAffair(param); + PageVo pageVo = syResult.getData(); + List ctpAffairs = pageVo.getList(); + if(ctpAffairs.size()>0){ + List result = verificationApplication.buildCtpAffairVoList(ctpAffairs); + PageVo costApplyPageVo = PageVo.initNewList(pageVo,result); + return R.ok(costApplyPageVo); + } + return R.byEmptyList(); + } + + /** + * 提交审批节点 + * @return + */ + @LimitSubmit + @PostMapping("/commitAffair") + @SysLog(module = SystemModule.Budget, title = "费用申请", biz = BizType.DELETE) + @PreAuthorize("hasRole('tbs:costApply:commit')") + public R commitAffair(@RequestBody @Valid TbsAffairCommitBo affairCommit){ + seeYonService.testConnection(); + R r = verificationApplication.commitAffair(affairCommit); + if(affairCommit.getState().equals(2)){ + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + vtbVerificationOperationService.runCompensate(affairCommit.getCostApplyId()+""); + } + return r; + } + + /** + * 加签 + * @param param + * @return + */ + @LimitSubmit + @PostMapping("/addNode") + @SysLog(module = SystemModule.Verification, title = "核销加签", biz = BizType.OTHER) + public R addNode(@RequestBody CtpAddNodeParam param){ + return vtbVerificationOperationService.addNode(param); + } + + /** + * 获取未完成统计 + * @return + */ + @PostMapping("/getAffairUnfinished") + public R getUnfinished(){ + return vtbVerificationOperationService.getUnfinished(); + } + + /** + * 补偿按钮 + * @param id + * @return + */ + @LimitSubmit + @PostMapping("/compensate/{id}") + public R compensate(@PathVariable("id") String id){ + vtbVerificationOperationService.runCompensate(id); + return R.ok(); + } + + @LimitSubmit + @GetMapping("/compensate123") + public R cer(){ + String[] ids = new String[]{""}; + for (String id : ids) { + vtbVerificationOperationService.compensateNext(id); + } + return R.ok(); + } + + /** + * 获取费用相关信息 + * @param verificationId + * @return + */ + @GetMapping("/getCostInfo") + public R getCostInfo(Long verificationId){ + //申请费用金额:600,已使用金额:0,可使用金额:600,本次核销金额:600,释放金额:0 + VtbVerification verification = vtbVerificationService.getById(verificationId); + TbsCostApply costApply = tbsCostApplyService.getById(verification.getCostApplyId()); + TbsActivity activity = tbsActivityService.getById(verification.getActivityId()); + + BigDecimal costAmt = costApply.getTotalActivityAmount(); + BigDecimal costUsedAmt = costApply.getTotalActivityUsedAmount(); + BigDecimal activityAmt = activity.getTotalAmount(); + BigDecimal activityUsedAmt = activity.getUsedAmount(); + BigDecimal activityReleaseAmt = activity.getReleaseAmount(); + BigDecimal verificationAmt = verification.getAmount(); + + VtbCostInfo costInfo = new VtbCostInfo(); + costInfo.setCostAmt(costAmt); + costInfo.setCostUsedAmt(costUsedAmt); + costInfo.setActivityAmt(activityAmt); + costInfo.setActivityUsedAmt(activityUsedAmt); + costInfo.setActivityReleaseAmt(activityReleaseAmt); + costInfo.setVerificationAmt(verificationAmt); + costInfo.setActivityNotUsedAmt(activityAmt.subtract(activityUsedAmt)); + return R.ok(costInfo); + } + + /** + * 去支付 + * @param verificationId + * @return + */ + @GetMapping("/toPayRequest") + public R toPayRequest(Long verificationId,Integer fullState,String verCode){ + //预先调用伟成同步状态接口,减少查询记录数 + String url = projectApisProperties.getCheckPayStatus(); + HttpUtil.doGet(url,null); + //不在维护true + if(fullState!=null&&fullState.equals(1)&&false){ + List vids = vtbVerificationMapper.listNotPayVerifyIds(); + for (Long vid : vids) { + vtbVerificationService.toPayRequest(vid); + } + }else { + VtbVerification verification = vtbVerificationMapper.selectById(verificationId); + if(verification.getVerificationCode().equals(verCode)){ + vtbVerificationService.toPayRequest(verificationId); + return R.ok(); + } + return R.error("missCode"); + } + return R.ok(); + } + + + @GetMapping("/toPayDev") + public R toPayDev(String code){ + VtbVerification verification = vtbVerificationService.getOne(new LambdaQueryWrapper().eq(VtbVerification::getVerificationCode,code)); + //vtbVerificationService.toPayRequest(verification.getId()); + return R.ok(); + } + +// @GetMapping("delCaPay") +// public R delCaPay(){ +// String url = "http://59.37.164.96:2506/action/cms/cost/deletion"; +// Set codes = new HashSet<>(vtbVerificationMapper.listCaVerificationCode()); +// for (String code : codes) { +// CostDeletion costDeletion = new CostDeletion(); +// costDeletion.setEmpNo("yuangong"); +// costDeletion.setVerificationCode(code); +// HttpUtil.doPost(url, JsonUtil.objectToJson(costDeletion),null); +// log.debug("del :{} ",code); +// } +// return R.ok(); +// } + + /** + * 用于根据核销id修复活动数据 + * @param verificationId + * @return + */ + //@GetMapping("successCommit") + public R successCommit(Long verificationId){ + vtbVerificationService.successCommit(verificationId,false); + return R.ok(); + } + + /** + * 成功提交回调 + * @return + */ + //@GetMapping("successCommit2") + public R successCommit2(){ + //错误的 + Long[] costIds = new Long[]{ + 22010L, + 264884L, + 266434L + }; + List costIds2 = Arrays.asList(costIds); + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(VtbVerification::getCostApplyId,costIds2); + lqw.select(VtbVerification::getId); + List vtbVerificationList = vtbVerificationService.list(lqw); + for (VtbVerification verification : vtbVerificationList) { + vtbVerificationService.successCommit(verification.getId(),false); + } + return R.ok(); + } + + @GetMapping("delErp") + public R a(String checkCode){ + VtbVerification verification = vtbVerificationService.getOne(new LambdaQueryWrapper() + .eq(VtbVerification::getVerificationCode,checkCode)); + String host = "http://59.37.164.96:2506/action/cms/cost/deletion"; + //TODO 请求伟成接口,删除 XLT_BIFyDbf + XltDelVerificationDto delVerificationDto = new XltDelVerificationDto( + verification.getUserCode(), + null, + verification.getVerificationCode() + ); + String requestBody = JsonUtil.objectToJson(delVerificationDto); + String response = HttpUtil.doPost(host,requestBody,null); + log.info("请求伟成接口,删除 XLT_BIFyDbf:{}",response); + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationDataController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationDataController.java new file mode 100644 index 0000000..b7196cd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/controller/VtbVerificationDataController.java @@ -0,0 +1,191 @@ +package com.qs.serve.modules.vtb.controller; + +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.bus.QueryFilterUtil; +import com.qs.serve.modules.vtb.entity.dto.VtbActivityCheckDTO; +import com.qs.serve.modules.vtb.entity.dto.VtbVerificationDTO; +import com.qs.serve.modules.vtb.entity.so.VtbActivityCheckSo; +import com.qs.serve.modules.vtb.entity.so.VtbVerificationCheckSo; +import com.qs.serve.modules.vtb.mapper.VtbVerForPayReportMapper; +import com.qs.serve.modules.vtb.mapper.VtbVerReportMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.math.BigDecimal; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 核销数据 + * @author YenHex + * @since 2023/9/4 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("vtb/data") +public class VtbVerificationDataController { + + private final VtbVerReportMapper verReportMapper; + + private final VtbVerForPayReportMapper verPayReportMapper; + + + /** + * 获取活动的核销情况 + * @param query + * @return + */ + @GetMapping("pageActivityCheck") + public R> getActivityData(VtbActivityCheckSo query){ + Long count = verReportMapper.countActiveAndVtbDataAmount(query); + if(count>0){ + query.setOpenPage(1); + query.setStartRow(PageUtil.getStartRow()); + List activityIds = verReportMapper.getActiveIdsForDataAmount(query); + if(activityIds.size()==0){ + activityIds.add(0L); + } + query.setActivityIds(activityIds); + query.setOpenPage(1); + List list = verReportMapper.pageActiveAndVtbDataAmount(query); + PageVo page = new PageVo<>(); + page.initPageByTotal(count); + page.setList(list); + return R.ok(page); + } + return R.byEmptyList(); + } + + /** + * 获取活动的核销情况合计 + * @param query + * @return + */ + @GetMapping("pageActivityCheckSum") + public R getActivityDataSum(VtbActivityCheckSo query){ + VtbActivityCheckDTO dto = new VtbActivityCheckDTO(); + List list = new ArrayList<>(); + QueryFilterUtil.filterSubmitDate(query.getQueryStartSubmitTime(),query.getQueryEndSubmitTime(),120); + Long count = verReportMapper.countActiveAndVtbDataAmount(query); + if(count>0) { + List activityIds = verReportMapper.getActiveIdsForDataAmount(query); + query.setActivityIds(activityIds); + list = verReportMapper.pageActiveAndVtbDataAmount(query); + dto.setActivityAmount(list.stream().map(a->a.getActivityAmount()).reduce(BigDecimal.ZERO,BigDecimal::add)); + dto.setCheckedAmount(list.stream().map(a->a.getCheckedAmount()).reduce(BigDecimal.ZERO,BigDecimal::add)); + dto.setCheckingAmount(list.stream().map(a->a.getCheckingAmount()).reduce(BigDecimal.ZERO,BigDecimal::add)); + dto.setNotCheckAmount(list.stream().map(a->a.getNotCheckAmount()).reduce(BigDecimal.ZERO,BigDecimal::add)); + dto.setReleaseAmount(list.stream().map(a->a.getReleaseAmount()).reduce(BigDecimal.ZERO,BigDecimal::add)); + } + return R.ok(dto); + } + + /** + * 获取活动的核销情况(导出) + * @param query + * @return + */ + @GetMapping("exportActivityCheck") + public R> exportActivityData(VtbActivityCheckSo query){ + QueryFilterUtil.filterSubmitDate(query.getQueryStartSubmitTime(),query.getQueryEndSubmitTime(),120); + List list = new ArrayList<>(); + Long count = verReportMapper.countActiveAndVtbDataAmount(query); + if(count>0) { + List activityIds = verReportMapper.getActiveIdsForDataAmount(query); + query.setActivityIds(activityIds); + list = verReportMapper.pageActiveAndVtbDataAmount(query); + } + return R.ok(list); + } + + + + /** + * 获取核销的支付信息 + * @param query + * @return + */ + @GetMapping("pageVerificationCheck") + public R> getVerificationData(VtbVerificationCheckSo query){ + Long count = verPayReportMapper.countVerificationCheck(query); + if(count>0){ + query.setOpenPage(1); + query.setStartRow(PageUtil.getStartRow()); + + List ids = verPayReportMapper.getVerificationIdsForPay(query); + if(ids.size()==0){ + ids.add(0L); + } + query.setVtbIds(ids); + query.setOpenPage(0); + + List list = verPayReportMapper.pageVerificationCheck(query); + PageVo page = new PageVo<>(); + page.initPageByTotal(count); + page.setList(list); + return R.ok(page); + } + return R.byEmptyList(); + } + + /** + * 获取核销的支付信息合计 + * @param query + * @return + */ + @GetMapping("pageVerificationCheckSum") + public R getVerificationDataSum(VtbVerificationCheckSo query){ + VtbVerificationDTO dto = new VtbVerificationDTO(); + List list = new ArrayList<>(); + QueryFilterUtil.filterDate(query.getQueryStartFinishCheckTime(), + query.getQueryEndFinishCheckTime(),90,"核销完成时间段"); + Long count = verPayReportMapper.countVerificationCheck(query); + if(count>0) { + List ids = verPayReportMapper.getVerificationIdsForPay(query); + if(ids.size()==0){ + ids.add(0L); + } + query.setVtbIds(ids); + + list = verPayReportMapper.pageVerificationCheck(query); + dto.setAmount(list.stream().map(a->a.getAmount()).reduce(BigDecimal.ZERO,BigDecimal::add)); + dto.setPayAmount(list.stream().map(a->a.getPayAmount()).reduce(BigDecimal.ZERO,BigDecimal::add)); + dto.setNotPayAmount(list.stream().map(a->a.getNotPayAmount()).reduce(BigDecimal.ZERO,BigDecimal::add)); + dto.setUnpayAmount(list.stream().map(a->a.getUnpayAmount()).reduce(BigDecimal.ZERO,BigDecimal::add)); + } + return R.ok(dto); + } + + /** + * 获取核销的支付信息(导出) + * @param query + * @return + */ + @GetMapping("exportVerificationCheck") + public R> exportVerificationCheck(VtbVerificationCheckSo query){ + List list = new ArrayList<>(); + QueryFilterUtil.filterDate(query.getQueryStartFinishCheckTime(), + query.getQueryEndFinishCheckTime(),90,"核销完成时间段"); + Long count = verPayReportMapper.countVerificationCheck(query); + if(count>0) { + List ids = verPayReportMapper.getVerificationIdsForPay(query); + if(ids.size()==0){ + ids.add(0L); + } + query.setVtbIds(ids); + + list = verPayReportMapper.pageVerificationCheck(query); + } + return R.ok(list); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbFundFlow.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbFundFlow.java new file mode 100644 index 0000000..e7e85a4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbFundFlow.java @@ -0,0 +1,167 @@ +package com.qs.serve.modules.vtb.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; +import java.util.List; +/** + * 核销流水 实体类 + * @author YenHex + * @since 2022-11-25 + */ +@Data +@TableName("vtb_fund_flow") +public class VtbFundFlow implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 核销类型 */ + private String fundType; + + /** 核销id */ + @NotNull(message = "核销id不能为空") + private Long verificationId; + + /** 成本明细编码 */ + @NotBlank(message = "成本明细编码不能为空") + @Length(max = 30,message = "成本明细编码长度不能超过30字") + private String centerGoodsCode; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 科目id */ + private Long subjectId; + + /** 政策id */ + private Long policyId; + + /** 政策项id */ + private Long policyItemId; + + /** 科目编码 */ + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** 成本中心类型 */ + @Length(max = 50,message = "成本中心类型长度不能超过50字") + private String centerType; + + /** 成本中心id */ + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @Length(max = 50,message = "成本中心编码长度不能超过50字") + private String centerCode; + + /** 成本中心名称 */ + @Length(max = 50,message = "成本中心名称长度不能超过50字") + private String centerName; + + /** 已用费用 */ + private BigDecimal usedAmount; + + /** 目标类型(brand、category、series、spu、sku) */ + @Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字") + private String targetType; + + /** 目标id */ + private Long targetId; + + /** 目标编码 */ + @Length(max = 30,message = "目标编码长度不能超过30字") + private String targetCode; + + /** 目标名称 */ + @Length(max = 30,message = "目标名称长度不能超过30字") + private String targetName; + + /** 目标等级路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathIds; + + /** 目标等级路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathNames; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** TbsActivityCenterGoods的id */ + private Long centerGoodItemId; + + /** 临时金额,统计该项可传入金额 */ + @TableField(exist = false) + private BigDecimal tempBalance; + + /** 客户id */ + private Long supplierId; + + /** 客户编码 */ + private String supplierCode; + + /** 客户名称 */ + private String supplierName; + + @TableField(exist = false) + private List selectActivityIds; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerification.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerification.java new file mode 100644 index 0000000..59f7072 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerification.java @@ -0,0 +1,249 @@ +package com.qs.serve.modules.vtb.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import com.qs.serve.modules.sys.entity.SysAttach; +import com.qs.serve.modules.tag.entity.so.TagQuery; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +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 2022-11-24 + */ +@Data +@TableName(value = "vtb_verification",autoResultMap = true) +public class VtbVerification implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + private String batchId; + + @TableField(condition = SqlCondition.LIKE) + private String verificationMainCode; + + /** 核销编码 */ + @TableField(condition = SqlCondition.LIKE) + private String verificationCode; + + /** 申请id */ + private Long costApplyId; + + @TableField(condition = SqlCondition.LIKE) + private String costApplyCode; + + /** 活动id */ + private Long activityId; + + @TableField(condition = SqlCondition.LIKE) + private String activityCode; + + /** 政策项id */ + private Long policyItemId; + + /** 政策项编码 */ + private String policyItemCode; + + /** 附件id */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] attachIds; + + /** 核销状态 */ + private Integer verificationState; + + /** 核销通过时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime finishedTime; + + /** 支付状态:0-未支付;1-已支付 */ + private Integer paymentState; + + private Integer payReleaseFlag; + + /** 记录释放标识 */ + private Integer regReleaseFlag; + + /** 记录释放人员id */ + private String regReleaseUserId; + + /** 输入的释放标识 */ + private Integer inputReleaseFlag; + + /** 金额 */ + private BigDecimal amount; + + /** 申请时金额记录 */ + private BigDecimal amountRecord; + + private String syFormId; + + private String syFlowId; + + /** 客户id */ + @NotNull(message = "客户id不能为空") + private Long supplierId; + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + @Length(max = 30,message = "客户编码长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String supplierCode; + + /** 客户名称 */ + @NotBlank(message = "客户名称不能为空") + @Length(max = 30,message = "客户名称长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String supplierName; + + @TableField(condition = SqlCondition.LIKE) + private String supplierBizRegionFirstName; + + @TableField(condition = SqlCondition.LIKE) + private String supplierBizRegionSecondName; + + @TableField(condition = SqlCondition.LIKE) + private String supplierBizRegionThirdName; + + /** 支付方式id */ + private Long wayId; + + /** 支付方式 */ + private String wayTitle; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 支付条件id */ + private Long payConditionId; + + /** 发货单号 */ + private String disCode; + + /** 发票号 */ + private String billNumber; + + /** 申请人 */ + @NotBlank(message = "申请人不能为空") + @Length(max = 32,message = "申请人长度不能超过32字") + private String userId; + + /** 用户编码 */ + @TableField(condition = SqlCondition.LIKE) + @Length(max = 32,message = "长度不能超过32字") + private String userCode; + + /** 用户名称 */ + @Length(max = 32,message = "长度不能超过32字") + @TableField(condition = SqlCondition.LIKE) + private String userName; + + @TableField(condition = SqlCondition.LIKE) + private String templateTitle; + + /** + * 业务继承人 + */ + private String extUserId; + private String extUserCode; + private String extUserName; + + @TableField(exist = false) + private List attachList; + + @TableField(exist = false) + List channelList; + + @TableField(exist = false) + List pointList; + + @TableField(exist = false) + List subjectList; + + /** + * 批次ID信息 + */ + @TableField(exist = false) + private Object batchInfo; + + /** + * 活动信息 + */ + @TableField(exist = false) + private Object activityInfo; + + @TableField(exist = false) + private List selectUserIds; + + /** + * 费用申请 + */ + @TableField(exist = false) + private Object costApplyInfo; + + /** 开始时间 */ + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime queryStartTime; + + /** 结束时间 */ + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime queryEndTime; + + + @TableField(exist = false) + List tagQueryList; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationBatch.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationBatch.java new file mode 100644 index 0000000..e97f47b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationBatch.java @@ -0,0 +1,175 @@ +package com.qs.serve.modules.vtb.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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-14 + */ +@Data +@TableName("vtb_verification_batch") +public class VtbVerificationBatch implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 批次编码 */ + @NotBlank(message = "批次编码不能为空") + @Length(max = 255,message = "批次编码长度不能超过255字") + private String vtbBatchCode; + + /** 状态:0-审批中;1-通过;2-拒绝;3-回退 */ + @NotNull(message = "状态不能为空") + private Integer vtbBatchStatus; + + /** 核销通过时间 */ + @Length(max = 0,message = "核销通过时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime finishedTime; + + /** 回退时间 */ + @Length(max = 0,message = "核销通过时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime backedTime; + + /** 拒绝时间 */ + @Length(max = 0,message = "核销通过时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime refuseTime; + + /** 费用id */ + private Long costApplyId; + + /** 备注 */ + @Length(max = 600,message = "备注长度不能超过600字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 致远表单ID */ + @Length(max = 32,message = "致远表单ID长度不能超过32字") + private String syFormId; + + /** 致远流程id */ + @Length(max = 32,message = "致远流程id长度不能超过32字") + private String syFlowId; + + /** 申请时的金额合计 */ + private BigDecimal applyCheckAmount; + + /** 申请时的金额合计 */ + private BigDecimal resultCheckAmount; + + /** 客户id */ + @NotNull(message = "客户id不能为空") + private String supplierId; + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + @Length(max = 30,message = "客户编码长度不能超过30字") + private String supplierCode; + + /** 客户名称 */ + @NotBlank(message = "客户名称不能为空") + @Length(max = 200,message = "客户名称长度不能超过200字") + private String supplierName; + + /** 申请人 */ + @NotBlank(message = "申请人不能为空") + @Length(max = 32,message = "申请人长度不能超过32字") + private String userId; + + /** 申请人 */ + @NotBlank(message = "申请人不能为空") + @Length(max = 32,message = "申请人长度不能超过32字") + private String userCode; + + /** 申请人 */ + @NotBlank(message = "申请人不能为空") + @Length(max = 32,message = "申请人长度不能超过32字") + private String userName; + + /** 业务继承人ID */ + @Length(max = 255,message = "业务继承人ID长度不能超过255字") + private String extUserId; + + /** 业务继承人编码 */ + @Length(max = 255,message = "业务继承人编码长度不能超过255字") + private String extUserCode; + + /** 业务继承人 */ + @Length(max = 255,message = "业务继承人长度不能超过255字") + private String extUserName; + + private String wayId; + + private String wayTitle; + + + /** 核销明细列表 */ + @TableField(exist = false) + private List verificationList; + + /** + * 审批状态 + */ + public interface BatchState{ + //0-审批中;1-通过;2-拒绝;3-回退 + int CHECKING = 0; + int CHECK_OK = 1; + int CHECK_REFUSE = 2; + int CHECK_BACK = 3; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationChannel.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationChannel.java new file mode 100644 index 0000000..8afa62b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationChannel.java @@ -0,0 +1,103 @@ +package com.qs.serve.modules.vtb.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 2022-11-24 + */ +@Data +@TableName("vtb_verification_channel") +public class VtbVerificationChannel implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 核算id */ + @NotNull(message = "核算id不能为空") + private Long verificationId; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 渠道id */ + @NotNull(message = "渠道id不能为空") + private Long channelId; + + /** 渠道编码 */ + @NotBlank(message = "渠道编码不能为空") + @Length(max = 50,message = "渠道编码长度不能超过50字") + private String channelCode; + + /** 渠道名称 */ + @NotBlank(message = "渠道名称不能为空") + @Length(max = 50,message = "渠道名称长度不能超过50字") + private String channelName; + + /** 渠道费用占比 */ + @NotNull(message = "渠道费用占比不能为空") + private BigDecimal channelRate; + + /** 预计头发网点数量 */ + @NotNull(message = "预计头发网点数量不能为空") + private Integer preCountPoint; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationChannelPoint.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationChannelPoint.java new file mode 100644 index 0000000..ea89154 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationChannelPoint.java @@ -0,0 +1,113 @@ +package com.qs.serve.modules.vtb.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 2022-11-24 + */ +@Data +@TableName("vtb_verification_channel_point") +public class VtbVerificationChannelPoint implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 核算id */ + @NotNull(message = "核算id不能为空") + private Long verificationId; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 渠道id */ + @NotNull(message = "渠道id不能为空") + private Long channelId; + + /** 渠道编码 */ + @NotBlank(message = "渠道编码不能为空") + @Length(max = 50,message = "渠道编码长度不能超过50字") + private String channelCode; + + /** 渠道名称 */ + @NotBlank(message = "渠道名称不能为空") + @Length(max = 50,message = "渠道名称长度不能超过50字") + private String channelName; + + /** 网点id */ + @NotNull(message = "网点id不能为空") + private Long pointId; + + /** 网点编码 */ + @NotBlank(message = "网点编码不能为空") + @Length(max = 50,message = "网点编码长度不能超过50字") + private String pointCode; + + /** 网点名称 */ + @NotBlank(message = "网点名称不能为空") + @Length(max = 50,message = "网点名称长度不能超过50字") + private String pointName; + + /** 网点费用占比 */ + @NotNull(message = "网点费用占比不能为空") + private BigDecimal pointRate; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationSubject.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationSubject.java new file mode 100644 index 0000000..2c07b56 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationSubject.java @@ -0,0 +1,171 @@ +package com.qs.serve.modules.vtb.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; + +import java.util.ArrayList; +import java.util.List; + +/** + * 核销科目费用 实体类 + * @author YenHex + * @since 2022-11-24 + */ +@Data +@TableName("vtb_verification_subject") +public class VtbVerificationSubject implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 科目核销编码 */ + private String verificationSubCode; + + /** 核算id */ + @NotNull(message = "核算id不能为空") + private Long verificationId; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 政策项id */ + private Long policyItemId; + + /** 政策项编码 */ + private String policyItemCode; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** 客户id */ + private Long supplierId; + + /** 客户编码 */ + private String supplierCode; + + /** 客户名称 */ + private String supplierName; + + /** 本次核销额 */ + @NotNull(message = "本次核销额不能为空") + private BigDecimal usedAmount; + + /** 申请时本次核销额 */ + private BigDecimal usedAmountRecord; + + /** 总金额 */ + private BigDecimal totalSubjectAmount; + + /** 上次总核销额 */ + private BigDecimal lastUsedAmount; + + /** 已支付核销费用 */ + private BigDecimal payAmount; + + /** 支付完成标识 */ + private Integer payFinishedFlag; + + private Integer payReleaseFlag; + + /** 场次 */ + @NotNull(message = "场次不能为空") + private Integer countSession; + + /** 人数 */ + @NotNull(message = "人数不能为空") + private Integer countPerson; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 是否有效(0:否;1:是) */ + private Integer effectiveFlag; + + /** 表单id */ + private Long formId; + + /** 表单标题 */ + private String formTitle; + + /** 表单版本 */ + private Integer formVersion; + + /** 表单内容 */ + private String formContext; + + /** 表单内容值 */ + private String formContextValue; + + private Integer syncPayFlag; + + /** 可更变的最大金额 */ + @TableField(exist = false) + private BigDecimal maxChangeAmount; + + @TableField(exist = false) + private List subjectCenterList = new ArrayList<>(); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationSubjectCenter.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationSubjectCenter.java new file mode 100644 index 0000000..8c7c8e3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationSubjectCenter.java @@ -0,0 +1,168 @@ +package com.qs.serve.modules.vtb.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 2023-11-28 + */ +@Data +@TableName("vtb_verification_subject_center") +public class VtbVerificationSubjectCenter implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 核算id */ + @NotNull(message = "核算id不能为空") + private Long verificationId; + + /** 科目核销编码 */ + @NotBlank(message = "科目核销编码不能为空") + @Length(max = 32,message = "科目核销编码长度不能超过32字") + private String verificationSubCode; + + /** 费用申请id */ + private Long costApplyId; + + /** 活动id */ + private Long activityId; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** 客户id */ + @NotNull(message = "客户id不能为空") + private Long supplierId; + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + @Length(max = 30,message = "客户编码长度不能超过30字") + private String supplierCode; + + /** 客户名称 */ + @NotBlank(message = "客户名称不能为空") + @Length(max = 200,message = "客户名称长度不能超过200字") + private String supplierName; + + /** 本次核销额 */ + @NotNull(message = "本次核销额不能为空") + private BigDecimal usedAmount; + + /** 申请时本次核销额 */ + @NotNull(message = "申请时本次核销额不能为空") + private BigDecimal usedAmountRecord; + + /** 总金额 */ + private BigDecimal totalCenterAmount; + + /** 上次总核销额 */ + private BigDecimal lastUsedAmount; + + /** 已支付核销费用 */ + @NotNull(message = "已支付核销费用不能为空") + private BigDecimal payAmount; + + /** 支付完成 */ + @NotNull(message = "支付完成不能为空") + private Integer payFinishedFlag; + + /** 备注 */ + @Length(max = 600,message = "备注长度不能超过600字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 是否无效 */ + @NotNull(message = "是否无效不能为空") + private Integer effectiveFlag; + + /** 支付是否标识 */ + private Integer payReleaseFlag; + + /** 成本中心类型 */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 255,message = "成本中心类型长度不能超过255字") + private String centerType; + + /** 成本中心id */ + @NotBlank(message = "成本中心id不能为空") + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 50,message = "成本中心编码长度不能超过50字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 200,message = "成本中心名称长度不能超过200字") + private String centerName; + + /** 活动成本中心ID */ + private Long activityCenterId; + + /** 可更变的最大金额 */ + @TableField(exist = false) + private BigDecimal maxChangeAmount; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationYard.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationYard.java new file mode 100644 index 0000000..cc0d08f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationYard.java @@ -0,0 +1,108 @@ +package com.qs.serve.modules.vtb.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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 2023-02-14 + */ +@Data +@TableName("vtb_verification_yard") +public class VtbVerificationYard implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 批量核销ID */ + private Long batchId; + + /** 核算id */ + @NotNull(message = "核算id不能为空") + private Long verificationId; + + /** 科目核销编码 */ + @NotBlank(message = "科目核销编码不能为空") + @Length(max = 32,message = "科目核销编码长度不能超过32字") + private String verificationSubCode; + + /** 状态:0-否定,1-同意,2-退回 */ + @NotNull(message = "状态:0-否定,1-同意,2-退回不能为空") + private Integer state; + + /** OA节点id */ + @NotBlank(message = "OA节点id不能为空") + @Length(max = 40,message = "OA节点id长度不能超过40字") + private String affairId; + + /** 评论 */ + @NotBlank(message = "评论不能为空") + @Length(max = 255,message = "评论长度不能超过255字") + private String comment; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + private String caseRemark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 是否无效 */ + @NotNull(message = "是否无效不能为空") + private Integer effectiveFlag; + + @TableField(exist = false) + private List yardItemList; + + @TableField(exist = false) + private Object userInfo; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationYardCenterItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationYardCenterItem.java new file mode 100644 index 0000000..2fba295 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationYardCenterItem.java @@ -0,0 +1,186 @@ +package com.qs.serve.modules.vtb.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 2023-11-28 + */ +@Data +@TableName("vtb_verification_yard_center_item") +public class VtbVerificationYardCenterItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 核销线id */ + @NotNull(message = "核销线id不能为空") + private Long yardId; + + /** 核算id */ + @NotNull(message = "核算id不能为空") + private Long verificationId; + + /** 科目核销编码 */ + @NotBlank(message = "科目核销编码不能为空") + @Length(max = 32,message = "科目核销编码长度不能超过32字") + private String verificationSubCode; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** 客户id */ + @NotNull(message = "客户id不能为空") + private Long supplierId; + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + @Length(max = 30,message = "客户编码长度不能超过30字") + private String supplierCode; + + /** 客户名称 */ + @NotBlank(message = "客户名称不能为空") + @Length(max = 30,message = "客户名称长度不能超过30字") + private String supplierName; + + /** 上次审批金额 */ + @NotNull(message = "上次审批金额不能为空") + private BigDecimal lastAmount; + + /** 本次审批金额 */ + @NotNull(message = "本次审批金额不能为空") + private BigDecimal currAmount; + + /** 备注1 */ + @Length(max = 255,message = "备注1长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 是否无效 */ + @NotNull(message = "是否无效不能为空") + private Integer effectiveFlag; + + /** 成本中心类型 */ + @NotBlank(message = "成本中心类型不能为空") + @Length(max = 255,message = "成本中心类型长度不能超过255字") + private String centerType; + + /** 成本中心id */ + @NotBlank(message = "成本中心id不能为空") + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @NotBlank(message = "成本中心编码不能为空") + @Length(max = 50,message = "成本中心编码长度不能超过50字") + private String centerCode; + + /** 成本中心名称 */ + @NotBlank(message = "成本中心名称不能为空") + @Length(max = 200,message = "成本中心名称长度不能超过200字") + private String centerName; + + /** 活动成本中心ID */ + private Long activityCenterId; + + + public static VtbVerificationYardCenterItem toNewObject(VtbVerificationYardItem source){ + VtbVerificationYardCenterItem verificationYardCenterItem = new VtbVerificationYardCenterItem(); + //verificationYardCenterItem.setId(source.getId()); + verificationYardCenterItem.setYardId(source.getYardId()); + verificationYardCenterItem.setVerificationId(source.getVerificationId()); + verificationYardCenterItem.setVerificationSubCode(source.getVerificationSubCode()); + verificationYardCenterItem.setCostApplyId(source.getCostApplyId()); + verificationYardCenterItem.setActivityId(source.getActivityId()); + verificationYardCenterItem.setSubjectId(source.getSubjectId()); + verificationYardCenterItem.setSubjectCode(source.getSubjectCode()); + verificationYardCenterItem.setSubjectName(source.getSubjectName()); + verificationYardCenterItem.setSupplierId(source.getSupplierId()); + verificationYardCenterItem.setSupplierCode(source.getSupplierCode()); + verificationYardCenterItem.setSupplierName(source.getSupplierName()); +// verificationYardCenterItem.setLastAmount(source.getLastAmount()); +// verificationYardCenterItem.setCurrAmount(source.getCurrAmount()); +// verificationYardCenterItem.setRemark(source.getRemark()); + verificationYardCenterItem.setCreateTime(source.getCreateTime()); + verificationYardCenterItem.setUpdateTime(source.getUpdateTime()); + verificationYardCenterItem.setTenantId(source.getTenantId()); + verificationYardCenterItem.setCreateBy(source.getCreateBy()); + verificationYardCenterItem.setUpdateBy(source.getUpdateBy()); + verificationYardCenterItem.setDelFlag(source.getDelFlag()); + verificationYardCenterItem.setEffectiveFlag(source.getEffectiveFlag()); +// verificationYardCenterItem.setCenterType(source.getCenterType()); +// verificationYardCenterItem.setCenterId(source.getCenterId()); +// verificationYardCenterItem.setCenterCode(source.getCenterCode()); +// verificationYardCenterItem.setCenterName(source.getCenterName()); +// verificationYardCenterItem.setActivityCenterId(source.getActivityCenterId()); + return verificationYardCenterItem; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationYardItem.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationYardItem.java new file mode 100644 index 0000000..459b17e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/VtbVerificationYardItem.java @@ -0,0 +1,160 @@ +package com.qs.serve.modules.vtb.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +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 2023-02-14 + */ +@Data +@TableName("vtb_verification_yard_item") +public class VtbVerificationYardItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 核销线id */ + @NotNull(message = "核销线id不能为空") + private Long yardId; + + /** 核算id */ + @NotNull(message = "核算id不能为空") + private Long verificationId; + + /** 科目核销编码 */ + @NotBlank(message = "科目核销编码不能为空") + @Length(max = 32,message = "科目核销编码长度不能超过32字") + private String verificationSubCode; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** 客户id */ + @NotNull(message = "客户id不能为空") + private Long supplierId; + + /** 客户编码 */ + @NotBlank(message = "客户编码不能为空") + @Length(max = 30,message = "客户编码长度不能超过30字") + private String supplierCode; + + /** 客户名称 */ + @NotBlank(message = "客户名称不能为空") + @Length(max = 30,message = "客户名称长度不能超过30字") + private String supplierName; + + /** 上次审批金额 */ + @NotNull(message = "上次审批金额不能为空") + private BigDecimal lastAmount; + + /** 本次审批金额 */ + @NotNull(message = "本次审批金额不能为空") + private BigDecimal currAmount; + + /** 历史场次 */ + @NotNull(message = "场次不能为空") + private Integer lastSession; + + /** 本次场次 */ + @NotNull(message = "场次不能为空") + private Integer currSession; + + /** 历史人数 */ + @NotNull(message = "人数不能为空") + private Integer lastPerson; + + /** 当前人数 */ + @NotNull(message = "人数不能为空") + private Integer currPerson; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + private String remark2; + private String remark3; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 是否无效 */ + @NotNull(message = "是否无效不能为空") + private Integer effectiveFlag; + + @TableField(exist = false) + private List centerItemList; + + public void initSetNull(){ + this.setId(null); + this.setCreateBy(null); + this.setCreateTime(null); + this.setUpdateBy(null); + this.setUpdateTime(null); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbFundFlowBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbFundFlowBo.java new file mode 100644 index 0000000..48f1d19 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbFundFlowBo.java @@ -0,0 +1,134 @@ +package com.qs.serve.modules.vtb.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 核销流水 Bo + * @author YenHex + * @since 2022-11-25 + */ +@Data +public class VtbFundFlowBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 核销id */ + @NotNull(message = "核销id不能为空") + private Long verificationId; + + /** 核销状态 */ + @NotNull(message = "核销状态不能为空") + private Integer verificationState; + + /** 成本明细编码 */ + @NotBlank(message = "成本明细编码不能为空") + @Length(max = 30,message = "成本明细编码长度不能超过30字") + private String centerGoodsCode; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 科目id */ + private Long subjectId; + + /** 科目编码 */ + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** 成本中心类型 */ + @Length(max = 50,message = "成本中心类型长度不能超过50字") + private String centerType; + + /** 成本中心id */ + @Length(max = 32,message = "成本中心id长度不能超过32字") + private String centerId; + + /** 成本中心编码 */ + @Length(max = 50,message = "成本中心编码长度不能超过50字") + private String centerCode; + + /** 成本中心名称 */ + @Length(max = 50,message = "成本中心名称长度不能超过50字") + private String centerName; + + /** 已用费用 */ + private BigDecimal usedAmount; + + /** 目标类型(brand、category、series、spu、sku) */ + @Length(max = 30,message = "目标类型(brand、category、series、spu、sku)长度不能超过30字") + private String targetType; + + /** 目标id */ + private Long targetId; + + /** 目标编码 */ + @Length(max = 30,message = "目标编码长度不能超过30字") + private String targetCode; + + /** 目标名称 */ + @Length(max = 30,message = "目标名称长度不能超过30字") + private String targetName; + + /** 目标等级路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathIds; + + /** 目标等级路径 */ + @Length(max = 600,message = "目标等级路径长度不能超过600字") + private String targetLevelPathNames; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationBatchBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationBatchBo.java new file mode 100644 index 0000000..ed73307 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationBatchBo.java @@ -0,0 +1,33 @@ +package com.qs.serve.modules.vtb.entity.bo; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author YenHex + * @since 2024/6/19 + */ +@Data +public class VtbVerificationBatchBo { + + /** 退回重新核销时传 */ + private Long batchId; + + /** 核销列表 */ + List verificationList; + + /** 备注 */ + private String remark; + + /** 支付方式 */ + private Long payWayId; + + /** 费用申请ID */ + private Long costApplyId; + + /** 申请时的合计金额 */ + private BigDecimal totalAmount; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationBo.java new file mode 100644 index 0000000..9c98ba6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationBo.java @@ -0,0 +1,67 @@ +package com.qs.serve.modules.vtb.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +import java.util.List; + +/** + * 核销 Bo + * @author YenHex + * @since 2022-11-24 + */ +@Data +public class VtbVerificationBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id(退回的核销要传) */ + private Long id; + + /** 活动id */ + private Long activityId; + + /** 附件id */ + private String[] attachIds; + + /** 备注 */ + private String remark; + + /** 渠道 */ + private List channelList; + + /** 网点 */ + private List pointList; + + /** 科目(科目维度核销) */ + private List subjectList; + + /** 成本中心(科目成本中心维度核销) */ + private List subjectCenterList; + + /** 支付条件id */ + private Long payConditionId; + + /** 支付方式 */ + private Long payWayId; + + /** 原来的审批id */ + private Long orgVerificationId; + + /** 是否释放(这个值取反 0-表示释放;1-表示不释放) */ + private Integer inputReleaseFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationCenterCommitBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationCenterCommitBo.java new file mode 100644 index 0000000..f7b94cb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationCenterCommitBo.java @@ -0,0 +1,49 @@ +package com.qs.serve.modules.vtb.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author YenHex + * @since 2023/11/27 + */ +@Data +public class VtbVerificationCenterCommitBo { + + /** id(退回的核销要传) */ + private Long id; + + /** 活动id */ + private Long activityId; + + /** 附件id */ + private String[] attachIds; + + /** 备注 */ + private String remark; + + /** 渠道 */ + private List channelList; + + /** 网点 */ + private List pointList; + + /** 科目 */ + @NotNull(message = "subject center list is null") + private List subjectCenterList; + + /** 支付条件id */ + private Long payConditionId; + + /** 支付方式 */ + private Long payWayId; + + /** 原来的审批id */ + private Long orgVerificationId; + + /** 是否释放 */ + private Integer inputReleaseFlag; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationChannelBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationChannelBo.java new file mode 100644 index 0000000..f5f0399 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationChannelBo.java @@ -0,0 +1,45 @@ +package com.qs.serve.modules.vtb.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 核销渠道项 Bo + * @author YenHex + * @since 2022-11-24 + */ +@Data +public class VtbVerificationChannelBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 渠道id */ + @NotNull(message = "渠道id不能为空") + private Long channelId; + + /** 渠道费用占比 */ + @NotNull(message = "渠道费用占比不能为空") + private BigDecimal channelRate; + + /** 预计投放网点数量 */ + @NotNull(message = "预计投放网点数量不能为空") + private Integer preCountPoint; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationChannelPointBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationChannelPointBo.java new file mode 100644 index 0000000..c396b5d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationChannelPointBo.java @@ -0,0 +1,39 @@ +package com.qs.serve.modules.vtb.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 核销网点项 Bo + * @author YenHex + * @since 2022-11-24 + */ +@Data +public class VtbVerificationChannelPointBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 网点id */ + @NotNull(message = "网点id不能为空") + private Long pointId; + + /** 网点费用占比 */ + @NotNull(message = "网点费用占比不能为空") + private BigDecimal pointRate; + + private String remark; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationContactBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationContactBo.java new file mode 100644 index 0000000..60b2ede --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationContactBo.java @@ -0,0 +1,42 @@ +package com.qs.serve.modules.vtb.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/8/1 + */ +@Data +public class VtbVerificationContactBo { + + /** 费用申请编码 */ + @NotNull + private String costApplyCode; + + /** 核销金额合计 */ + @NotNull + private BigDecimal totalCheckAmount; + + /** 核销人员工号 */ + @NotNull + private String userCode; + + /** 条款编码 */ + private String contactCode; + + /** 场次 */ + private Integer countSession; + + /** 人数 */ + private Integer countPerson; + + /** 支付方式 */ + private String payWay; + + /** 备注 */ + private String remark; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationSubjectBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationSubjectBo.java new file mode 100644 index 0000000..5e6afa1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationSubjectBo.java @@ -0,0 +1,63 @@ +package com.qs.serve.modules.vtb.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 核销科目费用 Bo + * @author YenHex + * @since 2022-11-24 + */ +@Data +public class VtbVerificationSubjectBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 科目id */ + private Long subjectId; + + /** 场次 */ + @NotNull(message = "场次不能为空") + private Integer countSession; + + /** 人数 */ + @NotNull(message = "人数不能为空") + private Integer countPerson; + + /** 费用额 */ + @NotNull(message = "费用额不能为空") + private BigDecimal amount; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 表单id */ + private Long formId; + + /** 表单标题 */ + private String formTitle; + + /** 表单版本 */ + private Integer formVersion; + + /** 表单内容 */ + private String formContext; + + /** 表单内容值 */ + private String formContextValue; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationSubjectCenterBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationSubjectCenterBo.java new file mode 100644 index 0000000..96fdbab --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationSubjectCenterBo.java @@ -0,0 +1,66 @@ +package com.qs.serve.modules.vtb.entity.bo; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 核销科目费用 Bo + * @author YenHex + * @since 2022-11-24 + */ +@Data +public class VtbVerificationSubjectCenterBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 科目id */ + private Long subjectId; + + /** 场次 */ + @NotNull(message = "场次不能为空") + private Integer countSession; + + /** 人数 */ + @NotNull(message = "人数不能为空") + private Integer countPerson; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 表单id */ + private Long formId; + + /** 表单标题 */ + private String formTitle; + + /** 表单版本 */ + private Integer formVersion; + + /** 表单内容 */ + private String formContext; + + /** 表单内容值 */ + private String formContextValue; + + private List centerAmount; + + @Data + public static class ChangeSubjectCenter{ + + @NotNull(message = "subjectCenterId不能为空") + private Long subjectCenterId; + + /** 费用额 */ + @NotNull(message = "费用额不能为空") + private BigDecimal amount; + + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationSubjectCommitBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationSubjectCommitBo.java new file mode 100644 index 0000000..7bac2bd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/bo/VtbVerificationSubjectCommitBo.java @@ -0,0 +1,51 @@ +package com.qs.serve.modules.vtb.entity.bo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 核销 Bo + * @author YenHex + * @since 2022-11-24 + */ +@Data +public class VtbVerificationSubjectCommitBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id(退回的核销要传) */ + private Long id; + + /** 活动id */ + private Long activityId; + + /** 附件id */ + private String[] attachIds; + + /** 备注 */ + private String remark; + + /** 渠道 */ + private List channelList; + + /** 网点 */ + private List pointList; + + /** 科目*/ + private List subjectList; + + /** 支付条件id */ + private Long payConditionId; + + /** 支付方式 */ + private Long payWayId; + + /** 原来的审批id */ + private Long orgVerificationId; + + /** 是否释放 */ + private Integer inputReleaseFlag; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/PayPaymentItemExtend.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/PayPaymentItemExtend.java new file mode 100644 index 0000000..55d41a5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/PayPaymentItemExtend.java @@ -0,0 +1,143 @@ +package com.qs.serve.modules.vtb.entity.dto; + +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.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author YenHex + * @since 2023/11/15 + */ +@Data +public class PayPaymentItemExtend { + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 支付类型 + * pay - 支付 + * unPay - 不再支付 + **/ + private String payType; + + /** + * 支付编码 + */ + private String payCode; + + /** 支付id */ + @NotNull(message = "支付id不能为空") + private Long paymentId; + + /** 供应商id */ + @NotNull(message = "供应商id不能为空") + private Long supplierId; + + private String supplierCode; + + private String supplierName; + + private String userCode; + + private String userName; + + /** 支付金额 */ + @NotNull(message = "支付金额不能为空") + private BigDecimal itemPayAmount; + + /** 核销id */ + @NotNull(message = "核销id不能为空") + private Long verificationId; + + private String verificationMainCode; + + private String verificationCode; + + /** 核销科目项id */ + @NotNull(message = "核销科目项id不能为空") + private Long verificationSubjectId; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + + private String costApplyCode; + + private String costApplyTitle; + + /** 活动编码 */ + @NotBlank(message = "活动编码不能为空") + @Length(max = 30,message = "活动编码长度不能超过30字") + private String activityCode; + + private String activityTitle; + + /** 政策项id */ + private Long policyItemId; + + /** 政策项编码 */ + private String policyItemCode; + + /** 科目id */ + @NotNull(message = "科目id不能为空") + private Long subjectId; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + + @TableField(condition = SqlCondition.LIKE) + private String erpId; + + @TableField(condition = SqlCondition.LIKE) + private String billNumber; + + + /** 支付时间 */ + @NotNull(message = "支付时间不能为空") + @Length(max = 0,message = "支付时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime payTime; + + /** 支付时间 */ + @NotNull(message = "支付日期不能为空") + @Length(max = 0,message = "支付时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime payDate; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/VtbActivityCheckDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/VtbActivityCheckDTO.java new file mode 100644 index 0000000..a7edb58 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/VtbActivityCheckDTO.java @@ -0,0 +1,78 @@ +package com.qs.serve.modules.vtb.entity.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 活动的核销情况 + * @author YenHex + * @since 2023/9/4 + */ +@Data +public class VtbActivityCheckDTO { + + private String costApplyId; + + /** 费用编码 */ + private String costApplyCode; + + private String costTitle; + + /** 客户id */ + private String supplierId; + + private String supplierCode; + + private String supplierName; + + private String userCode; + + private String userName; + + private Integer chargeState; + + /** 提交实际 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime submitTime; + + /** 提交实际 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime passTime; + + private Long activityId; + /** 活动编码 */ + private String activityCode; + + private String activityTitle; + + /** 提交实际 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime actStartDate; + + /** 提交实际 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime actEndDate; + + + private BigDecimal activityAmount; + + /** 核销金额 */ + private BigDecimal checkedAmount; + + /** 核销金额 */ + private BigDecimal checkingAmount; + + private BigDecimal notCheckAmount; + + /** 释放金额 */ + private BigDecimal releaseAmount; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/VtbFundFlowSumAmtDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/VtbFundFlowSumAmtDTO.java new file mode 100644 index 0000000..392e3e6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/VtbFundFlowSumAmtDTO.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.vtb.entity.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/7/13 + */ +@Data +public class VtbFundFlowSumAmtDTO { + + private BigDecimal totalAmt; + + private Long activityId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/VtbSubjectDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/VtbSubjectDTO.java new file mode 100644 index 0000000..94cf59a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/VtbSubjectDTO.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.vtb.entity.dto; + +import lombok.Data; + +/** + * @author YenHex + * @since 2024/1/12 + */ +@Data +public class VtbSubjectDTO { + + private String keMuName; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/VtbVerificationCodesDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/VtbVerificationCodesDTO.java new file mode 100644 index 0000000..cfadbca --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/VtbVerificationCodesDTO.java @@ -0,0 +1,16 @@ +package com.qs.serve.modules.vtb.entity.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/1/29 + */ +@Data +public class VtbVerificationCodesDTO { + + private String code; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/VtbVerificationDTO.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/VtbVerificationDTO.java new file mode 100644 index 0000000..33d5d6c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/VtbVerificationDTO.java @@ -0,0 +1,71 @@ +package com.qs.serve.modules.vtb.entity.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 活动的核销情况 + * @author YenHex + * @since 2023/9/4 + */ +@Data +public class VtbVerificationDTO { + + /** 核销编码 */ + private String verificationCode; + + private Long verificationId; + + /** 提交实际 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime createTime; + + /** 提交实际 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime finishedTime; + + /** 供应商编码 */ + private String userCode; + /** 供应商 */ + private String userName; + + /** 供应商编码 */ + private String supplierCode; + /** 供应商 */ + private String supplierName; + /** 支付方式 */ + private String wayTitle; + /** 核销金额 */ + private BigDecimal amount; + /** 支付金额 */ + private BigDecimal payAmount; + /** 不再支付金额 */ + private BigDecimal notPayAmount; + + private BigDecimal unpayAmount; + + /** 费用编码 */ + private String costApplyCode; + /** 费用主题 */ + private String chargeTheme; + /** 费用申请时间 */ + private String submitTime; + + /** 提交实际 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime costPassTime; + + /** 活动编码 */ + private String activityCode; + /** 活动内容 */ + private String actTitle; + + private Long activityId; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/XltDelVerificationDto.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/XltDelVerificationDto.java new file mode 100644 index 0000000..bb18afa --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/dto/XltDelVerificationDto.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.vtb.entity.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * @author YenHex + * @since 2023/12/21 + */ +@Data +@AllArgsConstructor +public class XltDelVerificationDto { + + private String empNo; + + private String requestDeleteTime; + + private String verificationCode; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/PayPaymentItemExtendSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/PayPaymentItemExtendSo.java new file mode 100644 index 0000000..ecbd411 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/PayPaymentItemExtendSo.java @@ -0,0 +1,107 @@ +package com.qs.serve.modules.vtb.entity.so; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.SqlCondition; +import com.baomidou.mybatisplus.annotation.TableField; +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.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author YenHex + * @since 2023/11/16 + */ +@Data +public class PayPaymentItemExtendSo { + + /** + * 支付类型 + * pay - 支付 + * unPay - 不再支付 + **/ + private String payType; + + /** + * 支付编码 + */ + private String payCode; + + /** 支付id */ + @NotNull(message = "支付id不能为空") + private Long paymentId; + + /** 供应商id */ + @NotNull(message = "供应商id不能为空") + private Long supplierId; + + /** 供应商 */ + private String supplierCode; + + private String supplierName; + + private String userCode; + + private String userName; + + /** 核销Code */ + private String verificationMainCode; + + /** 核销Code */ + private String verificationCode; + + /** 核销科目项id */ + @NotNull(message = "核销科目项id不能为空") + private Long verificationSubjectId; + + /** 费用申请id */ + @NotNull(message = "费用申请id不能为空") + private Long costApplyId; + + /** 活动id */ + @NotNull(message = "活动id不能为空") + private Long activityId; + + /** 活动编码 */ + @NotBlank(message = "活动编码不能为空") + @Length(max = 30,message = "活动编码长度不能超过30字") + private String activityCode; + + private String activityTitle; + + private String costApplyCode; + + private String costApplyTitle; + + /** 政策项编码 */ + private String policyItemCode; + + /** 科目编码 */ + @NotBlank(message = "科目编码不能为空") + @Length(max = 50,message = "科目编码长度不能超过50字") + private String subjectCode; + + /** 科目名称 */ + @NotBlank(message = "科目名称不能为空") + @Length(max = 50,message = "科目名称长度不能超过50字") + private String subjectName; + + + @TableField(condition = SqlCondition.LIKE) + private String erpId; + + @TableField(condition = SqlCondition.LIKE) + private String billNumber; + + @TableField(exist = false) + private List costApplyIds; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbActivityCheckSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbActivityCheckSo.java new file mode 100644 index 0000000..30a22ea --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbActivityCheckSo.java @@ -0,0 +1,101 @@ +package com.qs.serve.modules.vtb.entity.so; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 活动的核销情况 + * @author YenHex + * @since 2023/9/4 + */ +@Data +public class VtbActivityCheckSo { + + /** 费用编码 */ + private String costApplyCode; + + private String costTitle; + + /** 客户 */ + private String supplierCode; + + private String supplierName; + + /** 活动编码 */ + private String activityCode; + + private String activityTitle; + + private String userCode; + + private String userName; + + private Integer costApplyState; + /** 核销状态 */ + private Integer verificationState; + + /** 提交开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryStartSubmitTime; + + /** 提交结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryEndSubmitTime; + + /** 过审开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryStartFinishTime; + + /** 过审结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryEndFinishTime; + + /** 核销开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryStartCheckTime; + + /** 核销开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryEndCheckTime; + + /** 核销完成时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryStartFinishCheckTime; + + /** 核销完成时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryEndFinishCheckTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryStartActivityEndTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryEndActivityEndTime; + + private Integer pageSize; + + private Integer startRow; + + /** + * 当openPage=1时,进行翻页(后台维护) + */ + private Integer openPage; + + + private List activityIds; +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbFundFlowSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbFundFlowSo.java new file mode 100644 index 0000000..928a010 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbFundFlowSo.java @@ -0,0 +1,116 @@ +package com.qs.serve.modules.vtb.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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 2022-11-25 + */ +@Data +public class VtbFundFlowSo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 核销id */ + private Long verificationId; + + /** 核销状态 */ + private Integer verificationState; + + /** 成本明细编码 */ + private String centerGoodsCode; + + /** 费用申请id */ + private Long costApplyId; + + /** 活动id */ + private Long activityId; + + /** 科目id */ + private Long subjectId; + + /** 科目编码 */ + private String subjectCode; + + /** 科目名称 */ + private String subjectName; + + /** 成本中心类型 */ + private String centerType; + + /** 成本中心id */ + private String centerId; + + /** 成本中心编码 */ + private String centerCode; + + /** 成本中心名称 */ + private String centerName; + + /** 已用费用 */ + private BigDecimal usedAmount; + + /** 目标类型(brand、category、series、spu、sku) */ + private String targetType; + + /** 目标id */ + private Long targetId; + + /** 目标编码 */ + private String targetCode; + + /** 目标名称 */ + private String targetName; + + /** 目标等级路径 */ + private String targetLevelPathIds; + + /** 目标等级路径 */ + private String targetLevelPathNames; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbVerificationChannelPointSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbVerificationChannelPointSo.java new file mode 100644 index 0000000..b104a6c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbVerificationChannelPointSo.java @@ -0,0 +1,86 @@ +package com.qs.serve.modules.vtb.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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 2022-11-24 + */ +@Data +public class VtbVerificationChannelPointSo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 费用申请id */ + private Long costApplyId; + + /** 活动id */ + private Long activityId; + + /** 渠道id */ + private Long channelId; + + /** 渠道编码 */ + private String channelCode; + + /** 渠道名称 */ + private String channelName; + + /** 网点id */ + private Long pointId; + + /** 网点编码 */ + private String pointCode; + + /** 网点名称 */ + private String pointName; + + /** 网点费用占比 */ + private BigDecimal pointRate; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbVerificationChannelSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbVerificationChannelSo.java new file mode 100644 index 0000000..28ef902 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbVerificationChannelSo.java @@ -0,0 +1,80 @@ +package com.qs.serve.modules.vtb.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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 2022-11-24 + */ +@Data +public class VtbVerificationChannelSo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 费用申请id */ + private Long costApplyId; + + /** 活动id */ + private Long activityId; + + /** 渠道id */ + private Long channelId; + + /** 渠道编码 */ + private String channelCode; + + /** 渠道名称 */ + private String channelName; + + /** 渠道费用占比 */ + private BigDecimal channelRate; + + /** 预计头发网点数量 */ + private Integer preCountPoint; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbVerificationCheckSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbVerificationCheckSo.java new file mode 100644 index 0000000..92472e3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbVerificationCheckSo.java @@ -0,0 +1,86 @@ +package com.qs.serve.modules.vtb.entity.so; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author YenHex + * @since 2023/9/4 + */ +@Data +public class VtbVerificationCheckSo { + /** 核销编码 */ + private String verificationCode; + + /** 供应商编码 */ + private String supplierCode; + /** 供应商 */ + private String supplierName; + + private Integer stopSupplierFlag; + + private String userCode; + + private String userName; + /** 费用编码 */ + private String costApplyCode; + /** 费用主题 */ + private String chargeTheme; + /** 活动编码 */ + private String activityCode; + /** 活动内容 */ + private String actTitle; + + private String wayTitle; + + private String centerType; + + private String centerCode; + + private String centerName; + + /** 核销开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryStartCheckTime; + + /** 核销开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryEndCheckTime; + + /** 核销完成时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryStartFinishCheckTime; + + /** 核销完成时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime queryEndFinishCheckTime; + + /** 开始支付时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime startPayTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime endPayTime; + + private Integer pageSize; + + private Integer startRow; + + /** + * 当openPage=1时,进行翻页(后台维护) + */ + private Integer openPage; + + private List vtbIds; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbVerificationSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbVerificationSo.java new file mode 100644 index 0000000..076bb8a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbVerificationSo.java @@ -0,0 +1,93 @@ +package com.qs.serve.modules.vtb.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.SqlCondition; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.modules.tag.entity.so.TagQuery; +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 2022-11-24 + */ +@Data +public class VtbVerificationSo implements Serializable { + + /** id */ + private Long id; + + /** 活动id */ + private Long activityId; + + private String activityCode; + + /** 核销编码 */ + private String verificationCode; + + /** 核销状态 0=审批中;1=完成;2-中止;3-回滚 */ + private Integer verificationState; + + /** 客户id */ + private Long supplierId; + + /** 客户编码 */ + private String supplierCode; + + /** 客户名称 */ + private String supplierName; + + /** 用户编码 */ + private String userCode; + + /** 用户名称 */ + private String userName; + + /** 开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime queryStartTime; + + /** 结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime queryEndTime; + + @TableField(condition = SqlCondition.LIKE) + private String supplierBizRegionFirstName; + + @TableField(condition = SqlCondition.LIKE) + private String supplierBizRegionSecondName; + + @TableField(condition = SqlCondition.LIKE) + private String supplierBizRegionThirdName; + + /** 模板名称 */ + private String templateTitle; + + Integer loadMy; + + /** + * loadChild=1 分页查询所属活动核销 + */ + Integer loadChild; + + String pageNum; + + String pageSize; + + @TableField(exist = false) + List tagQueryList; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbVerificationSubjectSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbVerificationSubjectSo.java new file mode 100644 index 0000000..6aa716a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/so/VtbVerificationSubjectSo.java @@ -0,0 +1,89 @@ +package com.qs.serve.modules.vtb.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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 2022-11-24 + */ +@Data +public class VtbVerificationSubjectSo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 核算id */ + private Long verificationId; + + /** 费用申请id */ + private Long costApplyId; + + /** 活动id */ + private Long activityId; + + /** 科目id */ + private Long subjectId; + + /** 科目编码 */ + private String subjectCode; + + /** 科目名称 */ + private String subjectName; + + /** 费用额度 */ + private BigDecimal amount; + + /** 本次核销额 */ + private BigDecimal usedAmount; + + /** 场次 */ + private Integer countSession; + + /** 人数 */ + private Integer countPerson; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/vo/VtbCostInfo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/vo/VtbCostInfo.java new file mode 100644 index 0000000..a4e20fb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/vo/VtbCostInfo.java @@ -0,0 +1,35 @@ +package com.qs.serve.modules.vtb.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2023/12/30 + */ +@Data +public class VtbCostInfo { + + /** 费用申请金额 */ + BigDecimal costAmt; + + /** 费用已核销金额 */ + BigDecimal costUsedAmt; + + /** 活动申请金额 */ + BigDecimal activityAmt; + + /** 活动已核销金额 */ + BigDecimal activityUsedAmt; + + /** 活动释放金额 */ + BigDecimal activityReleaseAmt; + + /** 本次核销金额 */ + BigDecimal verificationAmt; + + /** 拓展:活动未核销金额(activityAmt-activityUsedAmt) */ + BigDecimal activityNotUsedAmt; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/vo/VtbVerificationActReleaseVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/vo/VtbVerificationActReleaseVo.java new file mode 100644 index 0000000..61e32bc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/vo/VtbVerificationActReleaseVo.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.vtb.entity.vo; + +import com.qs.serve.modules.vtb.entity.VtbVerification; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author YenHex + * @since 2024/7/1 + */ +@Data +@NoArgsConstructor +public class VtbVerificationActReleaseVo { + + private Long activityId; + private String activityCode; + private Integer releaseFlag; + + + public VtbVerificationActReleaseVo(VtbVerification verification){ + this.activityId = verification.getActivityId(); + this.activityCode = verification.getActivityCode(); + this.releaseFlag = 1; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/vo/VtbVerificationBatchVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/vo/VtbVerificationBatchVo.java new file mode 100644 index 0000000..b74d242 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/entity/vo/VtbVerificationBatchVo.java @@ -0,0 +1,51 @@ +package com.qs.serve.modules.vtb.entity.vo; + +import com.baomidou.mybatisplus.annotation.SqlCondition; +import com.baomidou.mybatisplus.annotation.TableField; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.entity.VtbVerificationBatch; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * @author YenHex + * @since 2024/7/3 + */ +@Data +public class VtbVerificationBatchVo extends VtbVerificationBatch { + + private String costCode; + + /** 主题 */ + private String chargeTheme; + + /** 状态:0=未发布;1=审批中;2=待执行;3=完成;4-被驳回;5-中止;6-作废;7-异动 @{link TbsCostApplyState} */ + private Integer chargeState; + + private String supplierBizRegionFirstName; + + private String supplierBizRegionSecondName; + + private String supplierBizRegionThirdName; + + /** 统计活动数量 */ + private Integer totalActivity; + + /** 统计所有活动申请的金额 */ + private BigDecimal totalActivityAmount; + + /** 统计所有活动预估发货的金额 */ + private BigDecimal totalActivityPreAmount; + + /** 统计所有活动预估不发货的金额 */ + private BigDecimal totalActivityPreNotAmount; + + /** 统计所有活动使用的金额 */ + private BigDecimal totalActivityUsedAmount; + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbFundFlowMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbFundFlowMapper.java new file mode 100644 index 0000000..ae1347f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbFundFlowMapper.java @@ -0,0 +1,31 @@ +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; +import com.qs.serve.modules.vtb.entity.dto.VtbFundFlowSumAmtDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +/** + * 核销流水 Mapper + * @author YenHex + * @date 2022-11-25 + */ +public interface VtbFundFlowMapper extends BaseMapper { + + @InterceptorIgnore(tenantLine = "1") + List listMissReleaseActivityId(); + + /** + * 统计金额 + * @param flow + * @return + */ + List listSumAmount(@Param("query") VtbFundFlow flow); + + List listActivityCenterGoodsUsed(@Param("ids")List ids); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerForPayReportMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerForPayReportMapper.java new file mode 100644 index 0000000..c771829 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerForPayReportMapper.java @@ -0,0 +1,61 @@ +package com.qs.serve.modules.vtb.mapper; + +import com.qs.serve.common.model.dto.RowParam; +import com.qs.serve.modules.vtb.entity.dto.PayPaymentItemExtend; +import com.qs.serve.modules.vtb.entity.dto.VtbActivityCheckDTO; +import com.qs.serve.modules.vtb.entity.dto.VtbVerificationDTO; +import com.qs.serve.modules.vtb.entity.so.PayPaymentItemExtendSo; +import com.qs.serve.modules.vtb.entity.so.VtbActivityCheckSo; +import com.qs.serve.modules.vtb.entity.so.VtbVerificationCheckSo; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author YenHex + * @since 2023/9/4 + */ +public interface VtbVerForPayReportMapper { + +// List pageActivityCheck(@Param("query") VtbActivityCheckSo query); +// Long countActivityCheck(@Param("query") VtbActivityCheckSo query); + + List pageVerificationCheck(@Param("query") VtbVerificationCheckSo query); + + Long countVerificationCheck(@Param("query") VtbVerificationCheckSo query); + + List getVerificationIdsForPay(@Param("query") VtbVerificationCheckSo query); + + +// List pageActiveAndVtbDataAmount(@Param("query") VtbActivityCheckSo query); +// +// Long countActiveAndVtbDataAmount(@Param("query") VtbActivityCheckSo query); +// + + /** + * TODO 活动 left 核销 left 支付 + * @param param + * @return + */ + Long countActJoinCheckJoinPay(@Param("query") Object param); + + + Long countPayItemList(@Param("query")Object param); + + + /** + * 统计支付金额 + * @param param + * @return + */ + BigDecimal sumPayItemListAmt(@Param("query")Object param); + + /** + * 查询支付 left 核销 left 活动 + * @param param + * @return + */ + List selectPayItemList(@Param("query") PayPaymentItemExtendSo param, @Param("pageInfo")RowParam rowParam); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerReportMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerReportMapper.java new file mode 100644 index 0000000..557a48b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerReportMapper.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.vtb.mapper; + +import com.qs.serve.modules.vtb.entity.dto.VtbActivityCheckDTO; +import com.qs.serve.modules.vtb.entity.dto.VtbVerificationDTO; +import com.qs.serve.modules.vtb.entity.so.VtbActivityCheckSo; +import com.qs.serve.modules.vtb.entity.so.VtbVerificationCheckSo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/9/4 + */ +public interface VtbVerReportMapper { + +// List pageActivityCheck(@Param("query") VtbActivityCheckSo query); +// Long countActivityCheck(@Param("query") VtbActivityCheckSo query); + +// List pageVerificationCheck(@Param("query") VtbVerificationCheckSo query); +// +// Long countVerificationCheck(@Param("query") VtbVerificationCheckSo query); + + List pageActiveAndVtbDataAmount(@Param("query") VtbActivityCheckSo query); + + Long countActiveAndVtbDataAmount(@Param("query") VtbActivityCheckSo query); + + List getActiveIdsForDataAmount(@Param("query") VtbActivityCheckSo query); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationBatchMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationBatchMapper.java new file mode 100644 index 0000000..a714888 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationBatchMapper.java @@ -0,0 +1,36 @@ +package com.qs.serve.modules.vtb.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.tbs.entity.so.VtbVerificationBatchQuery; +import com.qs.serve.modules.vtb.entity.VtbVerificationBatch; +import com.qs.serve.modules.vtb.entity.vo.VtbVerificationBatchVo; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +/** + * Mapper + * @author YenHex + * @date 2024-06-14 + */ +public interface VtbVerificationBatchMapper extends BaseMapper { + + /** + * 将批次的退回核销修正为关闭状态 + * @param batchId 批次id + */ + @Update("update vtb_verification" + + //设置关闭 + " set verification_state = 5 where " + + " batch_id = #{batchId}" + + " and del_flag = 0 " + + //核销中 + " and verification_state = 3 ") + void updateBackedItemToClose(@Param("batchId") Long batchId); + + + List selectList2(@Param("query") VtbVerificationBatchQuery query); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationChannelMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationChannelMapper.java new file mode 100644 index 0000000..770d25c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationChannelMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.vtb.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.vtb.entity.VtbVerificationChannel; + +/** + * 核销渠道项 Mapper + * @author YenHex + * @date 2022-11-24 + */ +public interface VtbVerificationChannelMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationChannelPointMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationChannelPointMapper.java new file mode 100644 index 0000000..3da6622 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationChannelPointMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.vtb.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.vtb.entity.VtbVerificationChannelPoint; + +/** + * 核销网点项 Mapper + * @author YenHex + * @date 2022-11-24 + */ +public interface VtbVerificationChannelPointMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationMapper.java new file mode 100644 index 0000000..1ccf8eb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationMapper.java @@ -0,0 +1,108 @@ +package com.qs.serve.modules.vtb.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 核销 Mapper + * @author YenHex + * @date 2022-11-24 + */ +public interface VtbVerificationMapper extends BaseMapper { + + + /** + * 查询列表 + * @param page + * @param param + * @return + */ + IPage selectVerificationList(IPage page, @Param("query")VtbVerification param); + + @Select("select COALESCE(sum(amount),0) from vtb_verification where del_flag = 0 and batch_id = #{batchId} ") + BigDecimal totalVtbAmtByBatchId(@Param("batchId")Long batchId); + + @Select("select COALESCE(sum(amount),0) from vtb_verification where del_flag = 0 and activity_id = #{activityId} and verification_state = 1") + BigDecimal totalActivityVerification(@Param("activityId")String activityId); + + @InterceptorIgnore(tenantLine = "true") + @Select("SELECT verification_code FROM `vtb_verification`" + + " where verification_code like 'HX%'" + + " and LENGTH(verification_code)>12 ") + List listCaVerificationCode(); + + @InterceptorIgnore(tenantLine = "true") + @Select("select v.id from vtb_verification v " + + "left join tbs_cost_apply t " + + "on t.id = v.cost_apply_id " + + "where " + + //协议类不需要支付,设置忽略 + "t.contract_flag != 1 " + + "and v.del_flag = 0 " + + "and t.del_flag = 0 " + + "and v.sync_pay_flag = 0 " + + "and verification_state = 1 " + + "and t.charge_state in (2,3) " + + "and (verification_code like 'HX%' or verification_code like 'DHX%') " + + //不维护CMS上线前导入的核销 + "and v.user_id <> '0' " + + //排除CA的单子 + "and length(v.verification_code)<18 "+ + //部分金额为0忽略 + " and v.amount != 0 "+ + "ORDER BY v.id asc") + List listNotPayVerifyIds(); + + /** + * 替换继承人 + * @param userId + * @param sysUser + * @return + */ + @Update( + "update vtb_verification " + + " set ext_user_id = #{obj.id},ext_user_id=#{obj.code},ext_user_name=#{obj.name}" + + " where verification_state!=0 and (user_id = #{userId} or ext_user_id = #{userId}) and del_flag=0" + ) + int updateCostExtUser(@Param("userId") String userId, @Param("obj") SysUser sysUser); + + /** + * 设置同步支付状态 + * @param codes + * @return + */ + int updateSyncPayStatus(@Param("codes") List codes); + + /** + * 设空继承人 + * @param costIds + * @return + */ + int cancelCostExtUserByCostIds(@Param("costIds") List costIds); + + /** + * 设置数据的继承人 + * @param costIds + * @param sysUser + * @return + */ + int updateCostExtUserByCostIds(@Param("costIds") List costIds, @Param("obj") SysUser sysUser); + + /** + * 获取活动核销金额 + * @param actId + * @return + */ + BigDecimal getActivityVerificationAmt(@Param("actId")Long actId); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationSubjectCenterMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationSubjectCenterMapper.java new file mode 100644 index 0000000..45785c3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationSubjectCenterMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.vtb.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubjectCenter; + +/** + * 核销成本中心费用 Mapper + * @author YenHex + * @date 2023-11-28 + */ +public interface VtbVerificationSubjectCenterMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationSubjectMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationSubjectMapper.java new file mode 100644 index 0000000..d42b088 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationSubjectMapper.java @@ -0,0 +1,25 @@ +package com.qs.serve.modules.vtb.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.math.BigDecimal; + +/** + * 核销科目费用 Mapper + * @author YenHex + * @date 2022-11-24 + */ +public interface VtbVerificationSubjectMapper extends BaseMapper { + + @Select("select sum(used_amount) " + + " from vtb_verification_subject " + + " where del_flag = 0 " + + " and activity_id = #{activityId} " + + " and subject_id = #{subjectId}") + BigDecimal selectSumSubjectAmt(@Param("activityId") Long activityId,@Param("subjectId") Long subjectId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationYardCenterItemMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationYardCenterItemMapper.java new file mode 100644 index 0000000..70830d1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationYardCenterItemMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.vtb.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.vtb.entity.VtbVerificationYardCenterItem; + +/** + * 核销审批线明细 Mapper + * @author YenHex + * @date 2023-11-28 + */ +public interface VtbVerificationYardCenterItemMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationYardItemMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationYardItemMapper.java new file mode 100644 index 0000000..71fbffd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationYardItemMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.vtb.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.vtb.entity.VtbVerificationYardItem; + +/** + * 核销审批线明细 Mapper + * @author YenHex + * @date 2023-02-14 + */ +public interface VtbVerificationYardItemMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationYardMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationYardMapper.java new file mode 100644 index 0000000..375b0fe --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/mapper/VtbVerificationYardMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.vtb.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.vtb.entity.VtbVerificationYard; + +/** + * 核销审批线 Mapper + * @author YenHex + * @date 2023-02-14 + */ +public interface VtbVerificationYardMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbFundFlowService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbFundFlowService.java new file mode 100644 index 0000000..140d97a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbFundFlowService.java @@ -0,0 +1,49 @@ +package com.qs.serve.modules.vtb.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.vtb.entity.VtbFundFlow; + +import java.util.List; + +/** + * 核销流水 服务接口 + * @author YenHex + * @date 2022-11-25 + */ +public interface VtbFundFlowService extends IService { + + void removeByVerificationId(Long id); + + /** + * 获取相关活动列表 + * @param activityId 不能空 + * @param fundTypes 可空 + * @return + */ + List listByActivity(Long activityId,String... fundTypes); + + /** + * 获取相关活动列表 + * @param notInVerificationIds 不包含当前核销的id + * @param activityId 不能空 + * @param fundTypes 可空 + * @return + */ + List listByActivity(List notInVerificationIds ,Long activityId,String... fundTypes); + + /** + * 判断释放 + * @param activityId + * @return + */ + boolean hasRelease(Long activityId); + + /** + * 刷新活动金额 + * @param activityId + */ + void flushActivityAmount(Long activityId); + + void flushActivityAmount(Long activityId,Integer releaseFlag); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationApplication.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationApplication.java new file mode 100644 index 0000000..4ac255f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationApplication.java @@ -0,0 +1,613 @@ +package com.qs.serve.modules.vtb.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.data.entity.DataAffairCommit; +import com.qs.serve.modules.data.mapper.DataAffairCommitMapper; +import com.qs.serve.modules.seeyon.entity.CtpAffair; +import com.qs.serve.modules.seeyon.entity.SyAffairStateResult; +import com.qs.serve.modules.seeyon.enums.SyAffairState; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysPostUser; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysAttachMapper; +import com.qs.serve.modules.sys.service.SysPostUserService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsActivityState; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +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.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.entity.vo.CtpAffairVo; +import com.qs.serve.modules.tbs.service.TbsActivityPayConditionService; +import com.qs.serve.modules.tbs.service.TbsActivityService; +import com.qs.serve.modules.tbs.service.TbsCostApplyService; +import com.qs.serve.modules.vtb.common.VtbVerificationState; +import com.qs.serve.modules.vtb.entity.*; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import com.qs.serve.modules.vtb.service.impl.VtbVerificationOperationServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.BeansException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; + +import javax.validation.Valid; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2023/2/14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class VtbVerificationApplication { + + private VtbVerificationService vtbVerificationService; + private VtbVerificationMapper verificationMapper; + private VtbVerificationSubjectService vtbVerificationSubjectService; + private VtbVerificationSubjectCenterService vtbVerificationSubjectCenterService; + private VtbVerificationYardService yardService; + private VtbVerificationYardItemService yardItemService; + private final VtbVerificationYardCenterItemService yardCenterItemService; + private final TbsActivityPayConditionService activityPayConditionService; + private SysPostUserService sysPostUserService; + private DataAffairCommitMapper dataAffairCommitMapper; + private TbsActivityService tbsActivityService; + private TbsCostApplyService tbsCostApplyService; + private SysUserService sysUserService; + private SeeYonRequestService seeYonService; + private VtbFundFlowService vtbFundFlowService; + private VtbVerificationOperationServiceImpl verificationOperationService; + + public R commitAffair(@RequestBody @Valid TbsAffairCommitBo affairCommit){ + //临时测试 + boolean devFlag = false; + VtbVerification verification = vtbVerificationService.getById(affairCommit.getCostApplyId()); + //更新释放标识 + if(affairCommit.getReleaseFlag()!=null){ + VtbVerification vtbVer = new VtbVerification(); + vtbVer.setId(verification.getId()); + vtbVer.setRegReleaseFlag(affairCommit.getReleaseFlag()); + vtbVer.setRegReleaseUserId(AuthContextUtils.getSysUserId()); + vtbVerificationService.updateById(vtbVer); + //完成时会调用更新 + verification.setRegReleaseFlag(affairCommit.getReleaseFlag()); + } + if(!verification.getVerificationState().equals(VtbVerificationState.Commiting.getCode())){ + VtbVerificationOperationServiceImpl optSvc = SpringUtils.getBean(VtbVerificationOperationServiceImpl.class); + optSvc.runCompensate(verification.getId()+""); + verification = vtbVerificationService.getById(affairCommit.getCostApplyId()); + if(!verification.getVerificationState().equals(VtbVerificationState.Commiting.getCode())){ + Assert.throwEx("费用申请处于未非审批状态!"); + } + } + List verificationSubjectCenterList = vtbVerificationSubjectCenterService.listByVerificationId(verification.getId()); + List verificationSubjects = vtbVerificationSubjectService.listByVerificationId(verification.getId()); + //检测参数的金额 + log.debug("checkParamAmount 检测参数的核销金额"); + this.checkParamAmount(affairCommit, verificationSubjectCenterList, verificationSubjects); + boolean isBackCommit = affairCommit.getState()==2; + R result; + if(!devFlag){ + result = seeYonService.commonCommit(affairCommit, TbsSeeYonConst.CostCheckConf.Code(),verification.getSyFormId()); + }else { + result = R.ok(); + } + //提交审批 + log.warn("提交审批到致远,{}",JsonUtil.objectToJson(result)); + + + if(result.getStatus()==200 ){ + + + String templateCode = verificationOperationService.getTemplateCode(); + SyAffairStateResult stateResult = verificationOperationService.checkAffairState(verification.getId()+"",templateCode); + SyAffairState affairState = stateResult.getState(); + String summeryResult = affairState.toString(); + if(affairState.equals(SyAffairState.backed)||affairState.equals(SyAffairState.refuse)){ + summeryResult = "refuse"; + } + //提交审批 + log.warn("提交审批到致远,检查单据[{}]状态:{}",verification.getVerificationCode(),affairState); + + //要确保所有不为next才支持回调 + if(result.getData().equals("next")){ + summeryResult = "next"; + } + + // 判断是否含有下个节点 + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + R r = commitAffairSuccess(affairCommit, verification, isBackCommit, summeryResult); + + //解决同步冻结时有过期的活动 + tbsActivityService.initReopenState(); + LambdaQueryWrapper lqwApply = new LambdaQueryWrapper<>(); + lqwApply.select(TbsCostApply::getId); + lqwApply.eq(TbsCostApply::getChargeState, TbsCostApplyState.State_2_actioning.getCode()); + List costApplyList = tbsCostApplyService.list(lqwApply); + List costApplyIds = costApplyList.stream().map(TbsCostApply::getId).collect(Collectors.toList()); + // 更新费用申请的活动的冻结状态 + tbsActivityService.flushBandingState(costApplyIds); + return r; + }else if (result.getStatus()==500){ + return result; + } + return R.ok(); + } + + /** + * 检查参数的金额 + * @param affairCommit + * @param verificationSubjectCenterList + * @param verificationSubjects + */ + private void checkParamAmount(TbsAffairCommitBo affairCommit, List verificationSubjectCenterList, List verificationSubjects) { + boolean isChangeCommit = verificationSubjectCenterList.size()>0; + if(CollectionUtil.isNotEmpty(affairCommit.getAffairSubjectLines())){ + if(isChangeCommit){ + Assert.throwEx("当前核销不支持科目维度修改金额"); + } + for (VtbVerificationSubject verificationSubject : verificationSubjects) { + for (TbsAffairCommitBo.AffairSubjectLine subjectLine : affairCommit.getAffairSubjectLines()) { + if(subjectLine.getSubjectId()==null||subjectLine.getAmount()==null){ + Assert.throwEx("AffairSubjectLines参数错误"); + } + if(subjectLine.getSubjectId().equals(verificationSubject.getSubjectId())){ + if(subjectLine.getAmount().compareTo(verificationSubject.getUsedAmountRecord())>0){ + Assert.throwEx("科目["+verificationSubject.getSubjectName()+"]额度不足"); + } + } + } + } + } + if(CollectionUtil.isNotEmpty(affairCommit.getAffairSubjectCenterLines())){ + for (TbsAffairCommitBo.AffairSubjectCenterLine subjectCenterLine : affairCommit.getAffairSubjectCenterLines()) { + VtbVerificationSubjectCenter currSubjectCenter = null; + BigDecimal changeAmt = null; + for (VtbVerificationSubjectCenter subjectCenter : verificationSubjectCenterList) { + if(subjectCenterLine.getSubjectId().equals(subjectCenter.getSubjectId())){ + currSubjectCenter = subjectCenter; + for (TbsAffairCommitBo.AffairSubjectCenterItemLine itemLine : subjectCenterLine.getCenterItemLines()) { + if(subjectCenter.getActivityCenterId().equals(itemLine.getActivityCenterId())){ + changeAmt = itemLine.getAmount(); + break; + } + } + break; + } + } +// if(currSubjectCenter==null){ +// Assert.throwEx("当前核销不支持成本中心维度修改金额"); +// } + if(changeAmt!=null && changeAmt.compareTo(currSubjectCenter.getUsedAmountRecord())>0){ + Assert.throwEx("["+currSubjectCenter.getSubjectName()+"-"+currSubjectCenter.getCenterName()+"]额度不足"); + } + } + } + } + + @NotNull + @Transactional(rollbackFor = Exception.class) + public R commitAffairSuccess(TbsAffairCommitBo affairCommit, VtbVerification verification, boolean isBackCommit, String flag) { + log.warn("单据[{}]状态:{},",verification.getVerificationCode(),flag); + + String userId = AuthContextUtils.getSysUserId(); + SysUser sysUser = sysUserService.getById(userId); + + try { + //保存记录 + // 判断是否含有下个节点 + DataAffairCommit dataAffairCommit = new DataAffairCommit(); + dataAffairCommit.setTargetCode(TbsSeeYonConst.CostCheckConf.Code()); + dataAffairCommit.setTargetId(verification.getId()+""); + dataAffairCommit.setId(affairCommit.getAffairId()); + dataAffairCommit.setCommentVal(affairCommit.getComment()); + dataAffairCommit.setReleaseFlag(affairCommit.getReleaseFlag()); + dataAffairCommit.setState(affairCommit.getState()); + dataAffairCommit.setUserId(sysUser.getId()); + dataAffairCommit.setUserCode(sysUser.getCode()); + dataAffairCommit.setUserName(sysUser.getName()); + dataAffairCommit.setResultData(flag); + dataAffairCommit.setAttachIds(affairCommit.getAttachIds()); + dataAffairCommitMapper.insert(dataAffairCommit); + } catch (Exception e) { + e.printStackTrace(); + } + + //更新释放标识 + if(affairCommit.getReleaseFlag()!=null){ + VtbVerification vtbVer = new VtbVerification(); + vtbVer.setId(verification.getId()); + vtbVer.setRegReleaseFlag(affairCommit.getReleaseFlag()); + vtbVerificationService.updateById(vtbVer); + } + //保存审批线结果 + VtbVerificationYard yard = new VtbVerificationYard(); + yard.setVerificationId(verification.getId()); + yard.setVerificationSubCode(verification.getVerificationCode()); + yard.setState(affairCommit.getState()); + yard.setAffairId(affairCommit.getAffairId()); + yard.setComment(affairCommit.getComment()); + yard.setCaseRemark(affairCommit.getCaseRemark()); + //审批中(next)、完成(finish)、拒绝(refused) + boolean isFinish = "finished".equals(flag); + boolean isNext = "next".equals(flag); + boolean isStop = "backed".equals(flag)||"refuse".equals(flag); + //释放费用 + boolean isRelease = affairCommit.getReleaseFlag()!=null&&affairCommit.getReleaseFlag().equals(1); + if (isStop){ + log.warn("单据[{}]状态:{},中止审批",verification.getVerificationCode(),flag); + backCommitAndStop(verification, isBackCommit); + if(isRelease){ + log.warn("单据[{}]状态:{},中止审批并释放费用",verification.getVerificationCode(),flag); + vtbVerificationService.release(verification.getActivityId(),sysUser.getCode(),false); + } + }else if (!isFinish && !isNext){ + return R.error("远程调用返回,非指定状态"); + } + yardService.save(yard); + //非终止或者驳回,保存审批线金额明细 + BigDecimal totalAmount = BigDecimal.ZERO; + if(!isStop){ + List subjectCenters = vtbVerificationSubjectCenterService.listByVerificationId(verification.getId()); + //isCenterCommit 代表自定义成本中心维度递交 + boolean isCenterCommit = subjectCenters.size()>0; + List verificationSubjects = vtbVerificationSubjectService.listByVerificationId(verification.getId()); + List yardItemList = new ArrayList<>(); + List verSubject4Update = new ArrayList<>(); + List yarnCenterList = new ArrayList<>(); + //拓展成本中心维度调整记录 + List subjectCenterUpdateList = new ArrayList<>(); + for (VtbVerificationSubject currVs : verificationSubjects) { + BigDecimal changeAmount = null; + Integer countSession = null; + Integer countPerson = null; + List centerItemLineList = null; +// if(isCenterCommit){ + if(CollectionUtil.isNotEmpty(affairCommit.getAffairSubjectCenterLines())){ + for (TbsAffairCommitBo.AffairSubjectCenterLine centerLine : affairCommit.getAffairSubjectCenterLines()) { + if(currVs.getSubjectId().equals(centerLine.getSubjectId())){ + changeAmount = BigDecimal.ZERO; + if(centerLine.getCenterItemLines()!=null){ + for (TbsAffairCommitBo.AffairSubjectCenterItemLine itemLine : centerLine.getCenterItemLines()) { + changeAmount = changeAmount.add(itemLine.getAmount()); + } + } + centerItemLineList = centerLine.getCenterItemLines(); + countSession = centerLine.getCountSession(); + countPerson = centerLine.getCountPerson(); + break; + } + } + } +// }else { +// if(CollectionUtil.isNotEmpty(affairCommit.getAffairSubjectLines())){ +// for (TbsAffairCommitBo.AffairSubjectLine affairSubjectLine : affairCommit.getAffairSubjectLines()) { +// if(currVs.getSubjectId().equals(affairSubjectLine.getSubjectId())){ +// changeAmount = affairSubjectLine.getAmount(); +// countSession = affairSubjectLine.getCountSession(); +// countPerson = affairSubjectLine.getCountPerson(); +// break; +// } +// } +// } +// } + //保存明细判断是否更变金额 + VtbVerificationYardItem yardItem = CopierUtil.copy(currVs,new VtbVerificationYardItem()); + yardItem.setYardId(yard.getId()); + yardItem.initSetNull(); + BigDecimal lastAmount = currVs.getUsedAmount(); + yardItem.setLastAmount(lastAmount); + + Integer lastSession = currVs.getCountSession(); + yardItem.setLastSession(lastSession); + yardItem.setCurrSession(lastSession); + if(countSession != null){ + yardItem.setCurrSession(countSession); + if(!countSession.equals(lastSession)){ + VtbVerificationSubject verSub4Upd = new VtbVerificationSubject(); + verSub4Upd.setId(currVs.getId()); + verSub4Upd.setCountSession(countSession); + verSubject4Update.add(verSub4Upd); + if(lastSession!=null){ + if(lastSession > countSession){ + yardItem.setRemark2("减少场次:"+ (lastSession - countSession)); + }else { + yardItem.setRemark2("增加场次:"+ (countSession - lastSession)); + } + } + } + } + + Integer lastPerson = currVs.getCountPerson(); + yardItem.setLastPerson(lastPerson); + yardItem.setCurrPerson(lastPerson); + if( countPerson != null ){ + yardItem.setCurrPerson(countPerson); + if(!countPerson.equals(lastPerson)){ + VtbVerificationSubject verSub4Upd = new VtbVerificationSubject(); + verSub4Upd.setId(currVs.getId()); + verSub4Upd.setCountPerson(countPerson); + verSubject4Update.add(verSub4Upd); + if(lastPerson!=null){ + if(lastPerson>countPerson){ + yardItem.setRemark3("减少人数:"+ (lastPerson - countPerson)); + }else { + yardItem.setRemark3("增加人数:"+ (countPerson - lastPerson)); + } + } + } + } + //金额有更变 + if(changeAmount!=null&&changeAmount.compareTo(lastAmount)!=0){ + yardItem.setCurrAmount(changeAmount); + BigDecimal diff = changeAmount.subtract(lastAmount); + if(diff.compareTo(BigDecimal.ZERO)>0){ + yardItem.setRemark("增加费用:"+diff); + }else { + yardItem.setRemark("减少费用:"+diff.negate()); + } + VtbVerificationSubject verSub4Upd = new VtbVerificationSubject(); + verSub4Upd.setId(currVs.getId()); + verSub4Upd.setUsedAmount(changeAmount); + verSubject4Update.add(verSub4Upd); + }else { + yardItem.setCurrAmount(lastAmount); + } + totalAmount = totalAmount.add(yardItem.getCurrAmount()); + if(centerItemLineList!=null&&subjectCenters.size()>0){ + for (TbsAffairCommitBo.AffairSubjectCenterItemLine centerItemLine : centerItemLineList) { + VtbVerificationYardCenterItem centerItem = VtbVerificationYardCenterItem.toNewObject(yardItem); + for (VtbVerificationSubjectCenter subjectCenter : subjectCenters) { + if(centerItemLine.getActivityCenterId().equals(subjectCenter.getActivityCenterId())){ + centerItem.setCenterId(subjectCenter.getCenterId()); + centerItem.setCenterCode(subjectCenter.getCenterCode()); + centerItem.setCenterName(subjectCenter.getCenterName()); + centerItem.setCenterType(subjectCenter.getCenterType()); + centerItem.setActivityCenterId(subjectCenter.getActivityCenterId()); + centerItem.setLastAmount(subjectCenter.getUsedAmount()==null?BigDecimal.ZERO:subjectCenter.getUsedAmount()); + centerItem.setCurrAmount(centerItemLine.getAmount()); + BigDecimal diff = centerItem.getCurrAmount().subtract(centerItem.getLastAmount()); + //修改center的记录金额 + VtbVerificationSubjectCenter scParam = new VtbVerificationSubjectCenter(); + scParam.setId(subjectCenter.getId()); + scParam.setUsedAmount(centerItemLine.getAmount()); + subjectCenterUpdateList.add(scParam); + if(diff.compareTo(BigDecimal.ZERO)>0){ + centerItem.setRemark("增加费用:"+diff); + }else { + centerItem.setRemark("减少费用:"+diff.negate()); + } + } + } + yarnCenterList.add(centerItem); + } + } + + yardItemList.add(yardItem); + } + yardItemService.saveBatch(yardItemList); + if(yarnCenterList.size()>0){ + yardCenterItemService.saveBatch(yarnCenterList); + } + vtbVerificationSubjectService.updateBatchById(verSubject4Update); + if(subjectCenterUpdateList.size()>0){ + vtbVerificationSubjectCenterService.updateBatchById(subjectCenterUpdateList); + } + //重新计算合计 + if(isFinish){ + finishCallBack(verification, totalAmount); + if(isRelease){ + vtbVerificationService.release(verification.getActivityId(),sysUser.getCode(),false); + } + }else { + //更新金额 + VtbVerification vtbVer = new VtbVerification(); + vtbVer.setId(verification.getId()); + vtbVer.setAmount(totalAmount); + vtbVerificationService.updateById(vtbVer); + } + } + return R.ok(); + } + + /** + * 审批后完成回调 + * @param verification + * @param totalAmount + */ + public void finishCallBack(VtbVerification verification, BigDecimal totalAmount) { + Long costId = null; + if(verification.getPayConditionId()!=null){ + //支付条件完成 + TbsActivityPayCondition payCondition = activityPayConditionService.getById(verification.getPayConditionId()); + payCondition.setFinishedFlag(1); + activityPayConditionService.updateById(payCondition); + } + //刷新活动金额 + TbsActivity activity = tbsActivityService.getById(verification.getActivityId()); + BigDecimal totalUsed = activity.getUsedAmount().add(totalAmount); + TbsActivity activity4Upd = new TbsActivity(); + activity4Upd.setId(activity.getId()); + activity4Upd.setUsedAmount(totalUsed); + if(totalUsed.compareTo(activity.getTotalAmount())>=0){ + activity4Upd.setActivityState(TbsActivityState.STATE_1_Finished); + }else if (verification.getRegReleaseFlag().equals(1)){ + activity4Upd.setActivityState(TbsActivityState.STATE_4_Release); + }else { + activity4Upd.setActivityState(TbsActivityState.STATE_0_Todo); + } + tbsActivityService.updateById(activity4Upd); + + //更新金额,已完成 + VtbVerification vtbVer = new VtbVerification(); + vtbVer.setId(verification.getId()); + vtbVer.setVerificationState(VtbVerificationState.Finished.getCode()); + vtbVer.setAmount(totalAmount); + vtbVer.setFinishedTime(LocalDateTime.now()); + vtbVer.setRegReleaseFlag(verification.getRegReleaseFlag()); + vtbVer.setRegReleaseUserId(AuthContextUtils.getSysUserId(false)); + vtbVerificationService.updateById(vtbVer); + //刷新本次核销数据 + vtbVerificationService.successCommit(verification.getId()); + + LambdaQueryWrapper countOLqw = new LambdaQueryWrapper<>(); + countOLqw.eq(TbsActivity::getCostApplyId,costId); + countOLqw.eq(TbsActivity::getActivityState,TbsActivityState.STATE_0_Todo); + countOLqw.eq(TbsActivity::getReleaseFlag,0); + Long count = tbsActivityService.count(countOLqw); + if(count==0){ + TbsCostApply costApply = new TbsCostApply(); + costApply.setId(costId); + costApply.setChargeState(TbsCostApplyState.State_3_finished.getCode()); + tbsCostApplyService.updateById(costApply); + } + } + + /** + * 回滚或中止 + * @param verification + * @param isBackCommit + */ + public void backCommitAndStop(VtbVerification verification, boolean isBackCommit) { + if(isBackCommit){ + VtbVerification vtbVer = new VtbVerification(); + vtbVer.setId(verification.getId()); + vtbVer.setVerificationState(VtbVerificationState.Rollback.getCode()); + vtbVer.setSyFormId(""); + vtbVer.setSyFlowId(""); + vtbVerificationService.updateById(vtbVer); + vtbFundFlowService.removeByVerificationId(verification.getId()); + }else { + VtbVerification vtbVer = new VtbVerification(); + vtbVer.setId(verification.getId()); + vtbVer.setVerificationState(VtbVerificationState.Stop.getCode()); + vtbVerificationService.updateById(vtbVer); + vtbFundFlowService.removeByVerificationId(verification.getId()); + } + //还原支付条件 + if(verification.getPayConditionId()!=null){ + TbsActivityPayCondition payCondition = activityPayConditionService.getById(verification.getPayConditionId()); + payCondition.setFinishedFlag(0); + activityPayConditionService.updateById(payCondition); + } + //还原活动为待核销状态 + + TbsActivity tbsActivity = tbsActivityService.getById(verification.getActivityId()); + + TbsActivity activity = new TbsActivity(); + activity.setId(verification.getActivityId()); + activity.setActivityState(TbsActivityState.STATE_0_Todo); + LocalDate dongDate = LocalDate.now().plusDays(3); + if(tbsActivity.getPreCheckDate().isBefore(dongDate)){ + activity.setPreEndDateBack(dongDate); + } + tbsActivityService.updateById(activity); + } + + public List buildCtpAffairVoList(List ctpAffairs){ + return this.buildCtpAffairVoList(ctpAffairs,false); + } + + @NotNull + public List buildCtpAffairVoList(List ctpAffairs,boolean loadCommit) { + if(CollectionUtil.isEmpty(ctpAffairs)){ + return new ArrayList<>(); + } + List oaUserIds = ctpAffairs.stream().map(CtpAffair::getMemberId).collect(Collectors.toList()); + List userList = sysUserService.listByOaMemberIds(oaUserIds); + List verificationIds = ctpAffairs.stream().map(CtpAffair::getCostApplyId).collect(Collectors.toList()); + List vtbVerificationList = new ArrayList<>(); + List activityList = new ArrayList<>(); + List costApplyList = new ArrayList<>(); + if(verificationIds.size()>0){ + vtbVerificationList = vtbVerificationService.listByIds(verificationIds); + List actIds = vtbVerificationList.stream().map(VtbVerification::getActivityId).collect(Collectors.toList()); + if(actIds.size()>0){ + activityList = tbsActivityService.listByIds(actIds); + List costIds = activityList.stream().map(TbsActivity::getCostApplyId).distinct().collect(Collectors.toList()); + costApplyList = tbsCostApplyService.listByIds(costIds); + } + } + + + List userIds = userList.stream().map(SysUser::getId).collect(Collectors.toList()); + List postUserList = sysPostUserService.listByUserIds(userIds); + Map> postMap = postUserList.stream().collect(Collectors.groupingBy(SysPostUser::getUserId)); + + List result = new ArrayList<>(); + DataAffairCommitMapper dataAffairCommitMapper = SpringUtils.getBean(DataAffairCommitMapper.class); + SysAttachMapper sysAttachMapper = SpringUtils.getBean(SysAttachMapper.class); + List affairCommits = dataAffairCommitMapper.selectBatchIds(ctpAffairs.stream() + .map(CtpAffair::getAffairId).collect(Collectors.toList())); + for (CtpAffair ctpAffair : ctpAffairs) { + CtpAffairVo ctpAffairVo = new CtpAffairVo(); + for (VtbVerification verification : vtbVerificationList) { + if(verification.getId().toString().equals(ctpAffair.getCostApplyId())){ + ctpAffairVo.setVerification(verification); + for (TbsActivity activity : activityList) { + if(verification.getActivityId().equals(activity.getId())){ + ctpAffairVo.setActivityInfo(activity); + for (TbsCostApply costApply : costApplyList) { + if(activity.getCostApplyId().equals(costApply.getId())){ + ctpAffairVo.setCostApply(costApply); + break; + } + } + break; + } + } + break; + } + } + for (SysUser user : userList) { + if(ctpAffair.getMemberId().equals(user.getSyUserId())){ + ctpAffairVo.setUserInfo(user.toSysUserVo()); + } + } + + ctpAffairVo.setAffairInfo(ctpAffair); + for (SysUser user : userList) { + if(ctpAffair.getMemberId().equals(user.getSyUserId())){ + ctpAffairVo.setUserInfo(user.toSysUserVo()); + List postUsers = postMap.get(user.getId()); + ctpAffairVo.setUserPostList(postUsers); + } + } + for (DataAffairCommit affairCommit : affairCommits) { + if(affairCommit.getId().equals(ctpAffair.getAffairId())){ + ctpAffairVo.setCommitInfo(affairCommit); + if(affairCommit.getAttachIds()!=null&&affairCommit.getAttachIds().length>0){ + ctpAffairVo.setAttachments( + sysAttachMapper.selectBatchIds( + Arrays.asList(affairCommit.getAttachIds()))); + } + } + } + ctpAffairVo.setAffairInfo(ctpAffair); + result.add(ctpAffairVo); + } + return result; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationApplication2.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationApplication2.java new file mode 100644 index 0000000..6d45053 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationApplication2.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.vtb.service; + +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.entity.VtbVerificationYard; + +import java.util.List; +import java.util.Map; + +/** + * @author YenHex + * @since 2024/6/25 + */ +public interface VtbVerificationApplication2 { + + /** + * 构建核销详情 + * @param verification + */ + void buildRelateInfo(VtbVerification verification); + + Map buildCommentChangeList(VtbVerification verification, List yardList); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationBatchOperationService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationBatchOperationService.java new file mode 100644 index 0000000..5406cef --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationBatchOperationService.java @@ -0,0 +1,13 @@ +package com.qs.serve.modules.vtb.service; + +import com.qs.serve.modules.seeyon.service.SeeYonOperationService; + +/** + * @author YenHex + * @since 2024/6/25 + */ +public interface VtbVerificationBatchOperationService extends SeeYonOperationService { + + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationBatchService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationBatchService.java new file mode 100644 index 0000000..0c66722 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationBatchService.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.vtb.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.tbs.entity.so.VtbVerificationBatchQuery; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.entity.VtbVerificationBatch; +import com.qs.serve.modules.vtb.entity.bo.VtbVerificationBatchBo; +import com.qs.serve.modules.vtb.entity.vo.VtbVerificationBatchVo; + +import java.util.List; + +/** + * 服务接口 + * @author YenHex + * @date 2024-06-14 + */ +public interface VtbVerificationBatchService extends IService { + + /** + * 提交批量核销 + * @param submitBo + */ + void submit(VtbVerificationBatchBo submitBo); + + List listVerifications(Long batchId); + + List list2(VtbVerificationBatchQuery query); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationChannelPointService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationChannelPointService.java new file mode 100644 index 0000000..b74ed20 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationChannelPointService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.vtb.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.vtb.entity.VtbVerificationChannelPoint; + +/** + * 核销网点项 服务接口 + * @author YenHex + * @date 2022-11-24 + */ +public interface VtbVerificationChannelPointService extends IService { + void removeByVerificationId(Long verificationId); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationChannelService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationChannelService.java new file mode 100644 index 0000000..bb02d83 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationChannelService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.vtb.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.vtb.entity.VtbVerificationChannel; + +/** + * 核销渠道项 服务接口 + * @author YenHex + * @date 2022-11-24 + */ +public interface VtbVerificationChannelService extends IService { + void removeByVerificationId(Long verificationId); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationExtService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationExtService.java new file mode 100644 index 0000000..6984666 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationExtService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.vtb.service; + +import com.qs.serve.modules.vtb.entity.bo.VtbVerificationCenterCommitBo; + +/** + * 核销 服务接口 + * @author YenHex + * @date 2023-11-24 + */ +public interface VtbVerificationExtService { + + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationService.java new file mode 100644 index 0000000..7f000ca --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationService.java @@ -0,0 +1,152 @@ +package com.qs.serve.modules.vtb.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.entity.bo.TbsActivityReopenBo; +import com.qs.serve.modules.vtb.entity.VtbVerification; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubjectCenter; +import com.qs.serve.modules.vtb.entity.bo.VtbVerificationBo; +import com.qs.serve.modules.vtb.entity.bo.VtbVerificationContactBo; +import com.qs.serve.modules.vtb.entity.bo.VtbVerificationSubjectCenterBo; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + * 核销 服务接口 + * @author YenHex + * @date 2022-11-24 + */ +public interface VtbVerificationService extends IService { + + IPage selectVerificationList(VtbVerification query) ; + + /** + * 创建协议类核销记录 + * @param param + */ + void createContactRecord(VtbVerificationContactBo param); + + /** + * 作废核销 + * @param id + * @return + */ + boolean removeCheck(Long id); + /** + * 释放活动费用 + * @param activityId + */ + void release(Long activityId,String userCode,Boolean throwEx,boolean checkState); + /** + * 释放活动费用 + * @param activityId + */ + void release(Long activityId,String userCode,Boolean throwEx); + + void mainRelease(Long activityId, SysUser sysUser, TbsActivity activity, TbsCostApply costApply, BigDecimal releaseAmount); + + /** + * 取消释放 + * @param activityId + */ + void cancelRelease(Long activityId); + + /** + * 冻结 + * @param param + * @return + */ + R freeze(TbsActivityReopenBo param); + + /** + * 提交审批 + * @param vtbVerificationBo + */ + void commit(VtbVerificationBo vtbVerificationBo); + + + /** + * 提交到致远审批流程的DATA + * @param activityId + * @return + */ + Map buildSeeYonVerificationData(String activityId); + + /** + * 提交到致远审批流程 + * @param activity + * @param sysUser + * @param verification + * @param saleRegionNames + * @param bizRegionNames + * @return + */ + Map buildSeeYonVerificationData(TbsActivity activity, SysUser sysUser, + VtbVerification verification, String saleRegionNames, + String bizRegionNames,BmsSupplier supplier); + + /** + * 审核通过回调 + * @param verificationId + */ + void successCommit(Long verificationId); + + void successCommit(Long verificationId,boolean toPay); + + /** + * 检测释放正在核销 + * @param activityId + * @return + */ + boolean checkCommitting(Long activityId); + + /** + * 支付请求 + */ + void toPayRequest(); + + void toPayRequest(Long verificationId); + + /** + * 释放前,校验活动,返回释放金额 + * @param activity + * @param filterActTime 拦截活动结束 + * @param isCurrentCommit 是否当前活动占用提交 + * @return + */ + BigDecimal validActivity(boolean cotractFlag, TbsActivity activity, boolean filterActTime, boolean isCurrentCommit); + + /** + * 校验科目和成本中心 + * @param activity + * @param subjectCenterBoList + * @param costApply + * @param supplier + * @param verificationSubjects + * @param verificationCenters + * @param verificationCode + */ + void validCreateVeriSubjectAndCenter(TbsActivity activity, List subjectCenterBoList, + TbsCostApply costApply, BmsSupplier supplier, + List verificationSubjects, + List verificationCenters, String verificationCode); + + /** + * 校验和生成核销费用 + * @param verificationBo + * @param activity + * @param costApply + * @return + */ + List validCreateVeriSubject(String verificationCode,VtbVerificationBo verificationBo, + TbsActivity activity, TbsCostApply costApply,BmsSupplier supplier); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationSubjectCenterService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationSubjectCenterService.java new file mode 100644 index 0000000..2375f67 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationSubjectCenterService.java @@ -0,0 +1,28 @@ +package com.qs.serve.modules.vtb.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubjectCenter; +import java.util.List; + +/** + * 核销成本中心费用 服务接口 + * @author YenHex + * @date 2023-11-28 + */ +public interface VtbVerificationSubjectCenterService extends IService { + + void removeByVerificationId(Long verificationId); + + List listByVerificationId(Long id); + + List listByActivityId(Long id); + + /** + * 获取生效的 + * @param id + * @return + */ + List listEffectiveByActivityId(Long id); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationSubjectService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationSubjectService.java new file mode 100644 index 0000000..b2979da --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationSubjectService.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.vtb.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; + +import java.util.List; + +/** + * 核销科目费用 服务接口 + * @author YenHex + * @date 2022-11-24 + */ +public interface VtbVerificationSubjectService extends IService { + + List listByVerificationId(Long verificationId); + + void removeByVerificationId(Long verificationId); + + VtbVerificationSubject getByVerificationSubjectCode(String verificationSubjectCode); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationYardCenterItemService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationYardCenterItemService.java new file mode 100644 index 0000000..edf9003 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationYardCenterItemService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.vtb.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.vtb.entity.VtbVerificationYardCenterItem; + +/** + * 核销审批线明细 服务接口 + * @author YenHex + * @date 2023-11-28 + */ +public interface VtbVerificationYardCenterItemService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationYardItemService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationYardItemService.java new file mode 100644 index 0000000..c8c11ac --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationYardItemService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.vtb.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.vtb.entity.VtbVerificationYardItem; + +/** + * 核销审批线明细 服务接口 + * @author YenHex + * @date 2023-02-14 + */ +public interface VtbVerificationYardItemService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationYardService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationYardService.java new file mode 100644 index 0000000..65fd08d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/VtbVerificationYardService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.vtb.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.vtb.entity.VtbVerificationYard; + +/** + * 核销审批线 服务接口 + * @author YenHex + * @date 2023-02-14 + */ +public interface VtbVerificationYardService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbFundFlowServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbFundFlowServiceImpl.java new file mode 100644 index 0000000..1fbb947 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbFundFlowServiceImpl.java @@ -0,0 +1,308 @@ +package com.qs.serve.modules.vtb.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.common.util.JsonUtil; +import com.qs.serve.modules.bir.consts.BirActivityCenterGoodsUtil; +import com.qs.serve.modules.tbs.common.TbsActivityState; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.mapper.TbsActivityPayConditionMapper; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.vtb.common.VtbFundFlowType; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubjectCenter; +import com.qs.serve.modules.vtb.service.VtbVerificationSubjectCenterService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.vtb.entity.VtbFundFlow; +import com.qs.serve.modules.vtb.service.VtbFundFlowService; +import com.qs.serve.modules.vtb.mapper.VtbFundFlowMapper; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 核销流水 服务实现类 + * @author YenHex + * @since 2022-11-25 + */ +@Slf4j +@Service +@AllArgsConstructor +public class VtbFundFlowServiceImpl extends ServiceImpl implements VtbFundFlowService { + + private final TbsCostApplyMapper costApplyMapper; + private final TbsActivityPayConditionMapper activityPayConditionMapper; + private final TbsActivityService activityService; + private final TbsActivitySubjectService activitySubjectService; + private final TbsActivityCenterService activityCenterService; + private final TbsActivityCenterGoodsService activityCenterGoodsService; + private final VtbVerificationSubjectCenterService verificationSubjectCenterService; + + @Override + public void removeByVerificationId(Long id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(VtbFundFlow::getVerificationId,id); + this.remove(lqw); + } + + @Override + public List listByActivity(Long activityId,String... fundTypes) { + return this.listByActivity(null,activityId,fundTypes); + } + + @Override + public List listByActivity(List notInVerificationIds, Long activityId, String... fundTypes) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(VtbFundFlow::getActivityId,activityId); + if(CollectionUtil.isNotEmpty(fundTypes)){ + lqw.in(VtbFundFlow::getFundType, Arrays.asList(fundTypes)); + } + if(notInVerificationIds!=null){ + //防止空in查询 + notInVerificationIds.add(0L); + lqw.notIn(VtbFundFlow::getVerificationId,notInVerificationIds); + } + return this.list(lqw); + } + + @Override + public boolean hasRelease(Long activityId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(VtbFundFlow::getActivityId,activityId); + lqw.eq(VtbFundFlow::getFundType, VtbFundFlowType.Release); + return this.count(lqw)>0L; + } + + @Override + public void flushActivityAmount(Long activityId) { + this.flushActivityAmount(activityId,null); + } + + @Override + public void flushActivityAmount(Long activityId,Integer releaseFlag){ + //活动自定义提交记录 + List subjectCenterList = verificationSubjectCenterService.listEffectiveByActivityId(activityId); + boolean centerCommitFlag = subjectCenterList.size()>0; + //旧流程按比例分配,新流程按比例分配后,进行再分配 + log.info("刷新活动金额,ActId:{}",activityId); + TbsActivity orgActivity = activityService.getById(activityId); + List allFunFlow = this.listByActivity(activityId,VtbFundFlowType.Verification); + List notCenterCommitFunFlow = allFunFlow; + if(centerCommitFlag){ + List verificationIds = subjectCenterList.stream().map(VtbVerificationSubjectCenter::getVerificationId).collect(Collectors.toList()); + notCenterCommitFunFlow = this.listByActivity(verificationIds,activityId,VtbFundFlowType.Verification); + } + //总使用额 + BigDecimal activityUsedAmount = BigDecimal.ZERO; + for (VtbFundFlow fundFlow : allFunFlow) { + activityUsedAmount = activityUsedAmount.add(fundFlow.getUsedAmount()); + } + //构建更新列表 + List activitySubject4Update = new ArrayList<>(); + List centerParam4Update = new ArrayList<>(); + List allUpdateCenterGoodsList = new ArrayList<>(); + this.buildActivityResUpdateList(activityId,notCenterCommitFunFlow, activitySubject4Update, centerParam4Update, allUpdateCenterGoodsList); + //二次分配 + if(centerCommitFlag){ + for (VtbVerificationSubjectCenter verCenter : subjectCenterList) { + //成本中心提交金额 + BigDecimal centerAmount = verCenter.getUsedAmount(); + if(centerAmount.compareTo(BigDecimal.ZERO)<=0){ + continue; + } + //统计科目的金额 + for (TbsActivitySubject activitySubject : activitySubject4Update) { + if(activitySubject.getSubjectId().equals(verCenter.getSubjectId())){ + BigDecimal activitySubjectAmt = activitySubject.getUsedAmount().add(centerAmount); + activitySubject.setUsedAmount(activitySubjectAmt); + } + } + //统计成本中心的金额 + for (TbsActivityCenter activityCenter : centerParam4Update) { + if(activityCenter.getId().equals(verCenter.getActivityCenterId())){ + BigDecimal activityCenterAmt = activityCenter.getUsedAmount().add(centerAmount); + activityCenter.setUsedAmount(activityCenterAmt); + //分配到商品明细 + String subjectCenterKey = verCenter.getSubjectId()+":"+verCenter.getCenterType()+"_"+verCenter.getCenterId(); + for (TbsActivityCenterGoods centerGoods : allUpdateCenterGoodsList) { + if(centerGoods.getSubjectCenterKey().equals(subjectCenterKey)){ + BigDecimal goodAmt = activityCenterAmt + .multiply(centerGoods.getCenterGoodsRate()) + .divide(new BigDecimal("100"),2,BigDecimal.ROUND_DOWN); + BigDecimal totalGoodAmt = centerGoods.getUsedAmount().add(goodAmt); + centerGoods.setUsedAmount(totalGoodAmt); + } + } + } + } + } + } + + //更新活动相关数据 + this.activitySubjectService.updateBatchById(activitySubject4Update); + this.activityCenterService.updateBatchById(centerParam4Update); + this.activityCenterGoodsService.updateBatchById(allUpdateCenterGoodsList); + //更新活动 + TbsActivity activity = new TbsActivity(); + activity.setId(activityId); + activity.setUsedAmount(activityUsedAmount); + boolean finished = orgActivity.getTotalAmount().compareTo(activityUsedAmount)==0; + log.info("活动信息:{},ActId:{}",finished?"已完成":"未完成",activityId); + activity.setFinishedFlag(finished?1:0); + if(finished){ + activity.setActivityState(TbsActivityState.STATE_1_Finished); + activity.setFinishedTime(LocalDateTime.now()); + }else { + //判断是否协议类 + activity.setActivityState(TbsActivityState.STATE_0_Todo); + if(releaseFlag!=null&&releaseFlag.equals(1)){ + activity.setActivityState(TbsActivityState.STATE_4_Release); + } + TbsCostApply costApply = costApplyMapper.selectById(orgActivity.getCostApplyId()); + if(costApply!=null){ + if(costApply.getContractFlag()!=null&&costApply.getContractFlag().equals(1)){ + //判断是否满足所有协议 + Long countPayTimes = activityPayConditionMapper.sumActivityPayTimes(activity.getId()); + Long countCheckItems = activityPayConditionMapper.sumFinishedCheck(activity.getId()); + if(countCheckItems==null){ + countCheckItems = 0L; + } + if(countPayTimes==null){ + log.warn("错误数据,支付条件统计异常 actId:{}",activity.getId()); + countPayTimes = 0L; + } + if(countPayTimes>1L && countPayTimes <= countCheckItems){ + activity.setActivityState(TbsActivityState.STATE_1_Finished); + } + } + } + } + activityService.updateById(activity); + BirActivityCenterGoodsUtil.buildBir(orgActivity.getCostApplyId()); + } + + /** + * 构建活动更新列表 + * @param activityId + * @param allFunFlow + * @param activitySubject4Update + * @param centerParam4Update + * @param allUpdateCenterGoodsList + */ + private void buildActivityResUpdateList(Long activityId,List allFunFlow, List activitySubject4Update, List centerParam4Update, List allUpdateCenterGoodsList) { + List activitySubjectList = activitySubjectService.listByActivityId(activityId); + List activityCenterList = activityCenterService.listByActivity(activityId); + List activityCenterGoodsList = activityCenterGoodsService.listByActivityId(activityId); + //更新其它明细 + Map> fundFlowMapBySubject = allFunFlow.stream().collect(Collectors.groupingBy(VtbFundFlow::getSubjectId)); + if(fundFlowMapBySubject.size()==0){ + for (TbsActivitySubject currActivitySubject : activitySubjectList) { + TbsActivitySubject activitySubject = new TbsActivitySubject(); + activitySubject.setId(currActivitySubject.getId()); + activitySubject.setSubjectId(currActivitySubject.getSubjectId()); + activitySubject.setUsedAmount(BigDecimal.ZERO); + activitySubject4Update.add(activitySubject); + } + for (TbsActivityCenter center : activityCenterList) { + TbsActivityCenter centerParam = new TbsActivityCenter(); + centerParam.setId(center.getId()); + centerParam.setUsedAmount(BigDecimal.ZERO); + centerParam4Update.add(centerParam); + } + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + TbsActivityCenterGoods centerGoodsParam = new TbsActivityCenterGoods(); + centerGoodsParam.setId(centerGoods.getId()); + centerGoodsParam.setUsedAmount(BigDecimal.ZERO); + centerGoodsParam.setCenterGoodsRate(centerGoods.getCenterGoodsRate()); + String subjectCenterKey = centerGoods.getSubjectId()+":"+centerGoods.getCenterType()+"_"+centerGoods.getCenterId(); + centerGoodsParam.setSubjectCenterKey(subjectCenterKey); + allUpdateCenterGoodsList.add(centerGoodsParam); + } + return; + } + for (Long subjectId : fundFlowMapBySubject.keySet()) { + List fundFlowList = fundFlowMapBySubject.get(subjectId); + if(fundFlowList != null){ + //更新科目 + BigDecimal subjectTotal = BigDecimal.ZERO; + for (VtbFundFlow fundFlow : fundFlowList) { + subjectTotal = subjectTotal.add(fundFlow.getUsedAmount()); + } + TbsActivitySubject currActivitySubject = null; + //兼容历史数据start + if(activitySubjectList.size()==1 && fundFlowMapBySubject.keySet().size()==1){ + currActivitySubject = activitySubjectList.get(0); + } + //默认的匹配方式 + else { + for (TbsActivitySubject activitySubject : activitySubjectList) { + if(activitySubject.getSubjectId().equals(subjectId)){ + currActivitySubject = activitySubject; + } + } + } + + TbsActivitySubject activitySubject = new TbsActivitySubject(); + activitySubject.setId(currActivitySubject.getId()); + activitySubject.setSubjectId(currActivitySubject.getSubjectId()); + activitySubject.setUsedAmount(subjectTotal); + activitySubject4Update.add(activitySubject); + //更新成本中心 + Map> fundFlowMapByCenter = fundFlowList.stream().collect(Collectors.groupingBy(obj->obj.getCenterType()+":"+obj.getCenterId())); + for (String centerKey : fundFlowMapByCenter.keySet()) { + List centerFundFlowList = fundFlowMapByCenter.get(centerKey); + if(centerFundFlowList==null){ + continue; + } + BigDecimal totalCenterAmount = BigDecimal.ZERO; + for (VtbFundFlow fundFlow : centerFundFlowList) { + totalCenterAmount = totalCenterAmount.add(fundFlow.getUsedAmount()); + } + for (TbsActivityCenter activityCenter : activityCenterList) { + String currCenterKey = activityCenter.getCenterType()+":"+activityCenter.getCenterId(); + if(activityCenter.getSubjectId().equals(subjectId)&&currCenterKey.equals(centerKey)){ + TbsActivityCenter centerParam = new TbsActivityCenter(); + centerParam.setId(activityCenter.getId()); + centerParam.setUsedAmount(totalCenterAmount); + centerParam4Update.add(centerParam); + } + } + //更新成本中心的商品项 + List updateCenterGoodsList = new ArrayList<>(); + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + BigDecimal goodsAmount = BigDecimal.ZERO; + for (VtbFundFlow fundFlow : centerFundFlowList) { + String currCenterKey = centerGoods.getCenterType()+":"+centerGoods.getCenterId(); + if(currCenterKey.equals(centerKey) + &&fundFlow.getSubjectId().equals(centerGoods.getSubjectId()) + &&fundFlow.getTargetType().equals(centerGoods.getTargetType()) + &&fundFlow.getTargetId().equals(centerGoods.getTargetId())){ + goodsAmount = goodsAmount.add(fundFlow.getUsedAmount()); + } + } + if(goodsAmount.compareTo(BigDecimal.ZERO)>0){ + TbsActivityCenterGoods centerGoodsParam = new TbsActivityCenterGoods(); + centerGoodsParam.setId(centerGoods.getId()); + centerGoodsParam.setUsedAmount(goodsAmount); + centerGoodsParam.setCenterGoodsRate(centerGoods.getCenterGoodsRate()); + String subjectCenterKey = centerGoods.getSubjectId()+":"+centerGoods.getCenterType()+"_"+centerGoods.getCenterId(); + centerGoodsParam.setSubjectCenterKey(subjectCenterKey); + updateCenterGoodsList.add(centerGoodsParam); + } + } + allUpdateCenterGoodsList.addAll(updateCenterGoodsList); + } + } + } + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationApplication2Impl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationApplication2Impl.java new file mode 100644 index 0000000..f0bc807 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationApplication2Impl.java @@ -0,0 +1,183 @@ +package com.qs.serve.modules.vtb.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.config.properties.ProjectApisProperties; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +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.SysPostUserService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.entity.TbsActivityCenter; +import com.qs.serve.modules.tbs.entity.TbsActivitySubject; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.vtb.entity.*; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import com.qs.serve.modules.vtb.service.*; +import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2024/6/25 + */ +@Service +@AllArgsConstructor +public class VtbVerificationApplication2Impl implements VtbVerificationApplication2 { + + private ProjectApisProperties projectApisProperties; + private VtbVerificationService vtbVerificationService; + private VtbVerificationMapper vtbVerificationMapper; + private VtbVerificationChannelService vtbVerificationChannelService; + private VtbVerificationChannelPointService vtbVerificationChannelPointService; + private VtbVerificationYardCenterItemService vtbVerificationYardCenterItemService; + private VtbVerificationSubjectService vtbVerificationSubjectService; + private VtbVerificationSubjectCenterService vtbVerificationSubjectCenterService; + private TbsActivitySubjectService activitySubjectService; + private TbsActivityCenterService activityCenterService; + private TbsActivityCenterGoodsService activityCenterGoodsService; + private TbsCostApplyService tbsCostApplyService; + private TbsActivityService tbsActivityService; + private TbsActivityPayConditionService tbsActivityPayConditionService; + private SysAttachService attachService; + private SysUserService sysUserService; + private SysPostUserService sysPostUserService; + private SeeYonRequestService seeYonService; + private VtbVerificationApplication verificationApplication; + private VtbVerificationYardService verificationYardService; + private VtbVerificationYardItemService vtbVerificationYardItemService; + private VtbVerificationOperationServiceImpl vtbVerificationOperationService; + private VtbVerificationExtService vtbVerificationExtService; + + + @Override + @NotNull + public Map buildCommentChangeList(VtbVerification verification, List yardList) { + for (VtbVerificationYard yard : yardList) { + LambdaQueryWrapper itemLqw = new LambdaQueryWrapper<>(); + itemLqw.eq(VtbVerificationYardItem::getYardId,yard.getId()); + itemLqw.apply("(last_amount!=curr_amount or last_session!=curr_session or last_person!=curr_person)"); + List yardItemList = vtbVerificationYardItemService.list(itemLqw); + + //拓展成本中心维度调整 + LambdaQueryWrapper centerItemLqw = new LambdaQueryWrapper<>(); + centerItemLqw.eq(VtbVerificationYardCenterItem::getYardId,yard.getId()); + centerItemLqw.apply("last_amount != curr_amount"); + List centerItems = vtbVerificationYardCenterItemService.list(centerItemLqw); + Map> subjectGetCenterYardMap = centerItems.stream() + .collect(Collectors.groupingBy(VtbVerificationYardCenterItem::getSubjectId)); + + for (VtbVerificationYardItem yardItem : yardItemList) { + List centerItemList = subjectGetCenterYardMap.get(yardItem.getSubjectId()); + yardItem.setCenterItemList(centerItemList); + } + + yard.setYardItemList(yardItemList); + SysUser sysUser = sysUserService.getById(yard.getCreateBy()); + if(sysUser!=null){ + yard.setUserInfo(sysUser.toSysUserVo()); + } + } + Map result = new HashMap<>(2); + result.put("verification", verification); + result.put("commentLines", yardList); + return result; + } + + @Override + public void buildRelateInfo(VtbVerification vtbVerification) { + Long id = vtbVerification.getId(); + if(CollectionUtil.isNotEmpty(vtbVerification.getAttachIds())){ + List attachIds = Arrays.asList(vtbVerification.getAttachIds()); + List attachList = attachService.listByIds(attachIds); + vtbVerification.setAttachList(attachList); + } + LambdaQueryWrapper channelLqw = new LambdaQueryWrapper<>(); + channelLqw.eq(VtbVerificationChannel::getVerificationId,id); + List verificationChannelList = vtbVerificationChannelService.list(channelLqw); + vtbVerification.setChannelList(verificationChannelList); + LambdaQueryWrapper channelPointLqw = new LambdaQueryWrapper<>(); + channelPointLqw.eq(VtbVerificationChannelPoint::getVerificationId,id); + List verificationChannelPointList = vtbVerificationChannelPointService.list(channelPointLqw); + vtbVerification.setPointList(verificationChannelPointList); + LambdaQueryWrapper subjectLqw = new LambdaQueryWrapper<>(); + subjectLqw.eq(VtbVerificationSubject::getVerificationId,id); + List subjectList = vtbVerificationSubjectService.list(subjectLqw); + List subjectCenterList = vtbVerificationSubjectCenterService.listByVerificationId(id); + List activitySubjects = activitySubjectService.listByActivityId(vtbVerification.getActivityId()); + List activityCenters = activityCenterService.listByActivity(vtbVerification.getActivityId()); + for (VtbVerificationSubject verificationSubject : subjectList) { + for (TbsActivitySubject activitySubject : activitySubjects) { + if(verificationSubject.getSubjectId().equals(activitySubject.getSubjectId())){ + BigDecimal used = activitySubject.getUsedAmount()==null?BigDecimal.ZERO:activitySubject.getUsedAmount(); + BigDecimal diff = activitySubject.getAmount().subtract(used); + verificationSubject.setMaxChangeAmount(diff); + } + } + } + + if(subjectCenterList.size()<1){ + //subjectCenterList为空,代表是旧的审批,需要兼容 + for (VtbVerificationSubject verificationSubject : subjectList) { + for (TbsActivityCenter activityCenter : activityCenters) { + BigDecimal userAmountRecord = verificationSubject.getUsedAmountRecord(); + BigDecimal useAmount = verificationSubject.getUsedAmount(); + VtbVerificationSubjectCenter verCenter = new VtbVerificationSubjectCenter(); + verCenter.setCostApplyId(verificationSubject.getCostApplyId()); + verCenter.setActivityId(verificationSubject.getActivityId()); + verCenter.setSubjectId(verificationSubject.getSubjectId()); + verCenter.setSubjectCode(verificationSubject.getSubjectCode()); + verCenter.setSubjectName(verificationSubject.getSubjectName()); + verCenter.setSupplierId(verificationSubject.getSupplierId()); + verCenter.setSupplierCode(verificationSubject.getSupplierCode()); + verCenter.setSupplierName(verificationSubject.getSupplierName()); + BigDecimal usedItemRecord = userAmountRecord + .multiply(activityCenter.getCenterRate()) + .divide(new BigDecimal("100"),2, RoundingMode.DOWN); + BigDecimal usedItem = useAmount + .multiply(activityCenter.getCenterRate()) + .divide(new BigDecimal("100"),2, RoundingMode.DOWN); + verCenter.setUsedAmount(usedItem); + verCenter.setUsedAmountRecord(usedItemRecord); + verCenter.setCenterType(activityCenter.getCenterType()); + verCenter.setCenterId(activityCenter.getCenterId()); + verCenter.setCenterCode(activityCenter.getCenterCode()); + verCenter.setCenterName(activityCenter.getCenterName()); + verCenter.setActivityCenterId(activityCenter.getId()); + subjectCenterList.add(verCenter); + } + } + } + + for (VtbVerificationSubjectCenter verCenter : subjectCenterList) { + for (TbsActivityCenter actCenter : activityCenters) { + if(verCenter.getActivityCenterId().equals(actCenter.getId())){ + BigDecimal used = actCenter.getUsedAmount()==null?BigDecimal.ZERO:actCenter.getUsedAmount(); + BigDecimal diff = actCenter.getCenterAmount().subtract(used); + verCenter.setMaxChangeAmount(diff); + } + } + for (VtbVerificationSubject subject : subjectList) { + if(verCenter.getSubjectId().equals(subject.getSubjectId())){ + subject.getSubjectCenterList().add(verCenter); + break; + } + } + } + + vtbVerification.setActivityInfo(tbsActivityService.getById(vtbVerification.getActivityId())); + vtbVerification.setSubjectList(subjectList); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationBatchOperationServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationBatchOperationServiceImpl.java new file mode 100644 index 0000000..af05c26 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationBatchOperationServiceImpl.java @@ -0,0 +1,526 @@ +package com.qs.serve.modules.vtb.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.data.entity.DataAffairCommit; +import com.qs.serve.modules.data.mapper.DataAffairCommitMapper; +import com.qs.serve.modules.seeyon.entity.CtpAffair; +import com.qs.serve.modules.seeyon.entity.bo.CtpAddNodeParam; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsActivityState; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.entity.vo.CtpAffairVo; +import com.qs.serve.modules.tbs.mapper.TbsActivityMapper; +import com.qs.serve.modules.tbs.service.TbsActivityService; +import com.qs.serve.modules.vtb.common.VtbVerificationState; +import com.qs.serve.modules.vtb.entity.*; +import com.qs.serve.modules.vtb.entity.vo.VtbVerificationActReleaseVo; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import com.qs.serve.modules.vtb.service.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2024/6/14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class VtbVerificationBatchOperationServiceImpl implements VtbVerificationBatchOperationService { + + private final VtbVerificationBatchService vtbVerificationBatchService; + private final VtbVerificationService vtbVerificationService; + private final VtbVerificationMapper vtbVerificationMapper; + private final SysUserService sysUserService; + private final VtbVerificationApplication verificationApplication; + private final VtbVerificationSubjectCenterService vtbVerificationSubjectCenterService; + private final VtbVerificationYardService yardService; + private final VtbVerificationYardItemService yardItemService; + private final VtbVerificationYardCenterItemService yardCenterItemService; + private final VtbVerificationSubjectService vtbVerificationSubjectService; + private final TbsActivityMapper tbsActivityMapper; + private final TbsActivityService activityService; + + @Override + public String getTemplateCode() { + return TbsSeeYonConst.BatchCostCheckConf.Code(); + } + + @Override + public String getSyFormIdByTargetInfo(TbsAffairCommitBo affairCommit) { + VtbVerificationBatch batch = vtbVerificationBatchService.getById(affairCommit.getTargetId()); + return batch.getSyFormId(); + } + + @Override + @Async + public Object doBacked(TbsAffairCommitBo param) { + //退回 + VtbVerificationBatch batch = vtbVerificationBatchService.getById(param.getTargetId()); + List verificationList = vtbVerificationBatchService.listVerifications(batch.getId()); + batch.setVtbBatchStatus(VtbVerificationBatch.BatchState.CHECK_BACK); + batch.setBackedTime(LocalDateTime.now()); + vtbVerificationBatchService.updateById(batch); + for (VtbVerification verification : verificationList) { + verification.setVerificationState(VtbVerificationState.Rollback.getCode()); + vtbVerificationService.updateById(verification); + } + Set actIdList = verificationList.stream().map(VtbVerification::getActivityId).collect(Collectors.toSet()); + List activityList = tbsActivityMapper.selectList(new LambdaQueryWrapper() + .in(TbsActivity::getId,actIdList)); + for (TbsActivity activity : activityList) { + TbsActivity activity1 = new TbsActivity(); + activity1.setId(activity.getId()); + activity1.setActivityState(TbsActivityState.STATE_0_Todo); + // 延期3天 + if(activity.getPreCheckDate().isBefore(LocalDate.now())){ + activity1.setReopenFlag(1); + activity1.setPreEndDateBack(LocalDate.now().plusDays(3)); + } + tbsActivityMapper.updateById(activity1); + } + return null; + } + + @Override + @Async + public Object doFinished(TbsAffairCommitBo param) { + //完成 + VtbVerificationBatch batch = vtbVerificationBatchService.getById(param.getTargetId()); + List verificationList = vtbVerificationBatchService.listVerifications(batch.getId()); + batch.setVtbBatchStatus(VtbVerificationBatch.BatchState.CHECK_OK); + batch.setBackedTime(LocalDateTime.now()); + for (VtbVerification verification : verificationList) { + //循环调用每个核销 + vtbVerificationService.successCommit(verification.getId()); + //更新核销状态 + VtbVerification updateVerification = new VtbVerification(); + updateVerification.setId(verification.getId()); + updateVerification.setFinishedTime(LocalDateTime.now()); + updateVerification.setVerificationState(VtbVerificationState.Finished.getCode()); + vtbVerificationService.updateById(updateVerification); + } + BigDecimal totalAmt = vtbVerificationMapper.totalVtbAmtByBatchId(batch.getId()); + batch.setResultCheckAmount(totalAmt); + vtbVerificationBatchService.updateById(batch); + //更新活动状态为冻结 + activityService.initReopenState(); + activityService.flushBandingState(Arrays.asList(batch.getCostApplyId())); + return null; + } + + @Override + @Async + public Object doRefuse(TbsAffairCommitBo param) { + VtbVerificationBatch batch = vtbVerificationBatchService.getById(param.getTargetId()); + List verificationList = vtbVerificationBatchService.listVerifications(batch.getId()); + batch.setVtbBatchStatus(VtbVerificationBatch.BatchState.CHECK_REFUSE); + batch.setRefuseTime(LocalDateTime.now()); + vtbVerificationBatchService.updateById(batch); + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + for (VtbVerification verification : verificationList) { + verification.setVerificationState(VtbVerificationState.Stop.getCode()); + vtbVerificationService.updateById(verification); + vtbVerificationService.release(verification.getActivityId(),sysUser.getCode(),true,false); + } + return null; + } + + @Override + @Async + public void insertAddNodeLog(CtpAddNodeParam param, String affairId, SysUser sysUser) { + //给加签添加审批日志 + DataAffairCommitMapper dataAffairCommitMapper = SpringUtils.getBean(DataAffairCommitMapper.class); + DataAffairCommit dataAffairCommit = new DataAffairCommit(); + dataAffairCommit.setTargetCode(getTemplateCode()); + dataAffairCommit.setTargetId(param.getTargetId()); + dataAffairCommit.setId(affairId); + dataAffairCommit.setCommentVal("加签:"+ param.getComment()); + dataAffairCommit.setReleaseFlag(0); + dataAffairCommit.setState(3); + dataAffairCommit.setUserId(sysUser.getId()); + dataAffairCommit.setUserCode(sysUser.getCode()); + dataAffairCommit.setUserName(sysUser.getName()); + dataAffairCommit.setResultData("addNode"); + dataAffairCommit.setAttachIds(param.getAttachIds()); + dataAffairCommitMapper.insert(dataAffairCommit); + + VtbVerificationBatch batch = vtbVerificationBatchService.getById(param.getTargetId()); + List verificationList = vtbVerificationBatchService.listVerifications(batch.getId()); + + //保存到每个核销 + for (VtbVerification verification : verificationList) { + DataAffairCommit affairCommit = CopierUtil.copy(dataAffairCommit,new DataAffairCommit()); + affairCommit.setId(IdUtil.nanoId()); + affairCommit.setTargetId(verification.getId()+""); + affairCommit.setTargetCode(verification.getVerificationCode()); + dataAffairCommitMapper.insert(affairCommit); + } + + } + + @Override + public boolean preCheckCommitAffair(TbsAffairCommitBo affairCommit) { + /* + * 校验前端的参数金额,如果金额异常 + */ + for (TbsAffairCommitBo commitBo : affairCommit.getChildList()) { + Long verificationId = Long.parseLong(commitBo.getTargetId()); + List verificationSubjects = vtbVerificationSubjectService.listByVerificationId(verificationId); + Map> subjectCenterLinesMap = commitBo.getAffairSubjectCenterLines() + .stream().collect(Collectors.groupingBy(TbsAffairCommitBo.AffairSubjectCenterLine::getSubjectId)); + for (Long subjectId : subjectCenterLinesMap.keySet()) { + List list = subjectCenterLinesMap.get(subjectId); + BigDecimal totalSubjectAmt = BigDecimal.ZERO; + for (TbsAffairCommitBo.AffairSubjectCenterLine itemLine : list) { + if(CollUtil.isEmpty(itemLine.getCenterItemLines())){ + continue; + } + for (TbsAffairCommitBo.AffairSubjectCenterItemLine centerItemLine : itemLine.getCenterItemLines()) { + if(centerItemLine.getAmount().compareTo(BigDecimal.ZERO)<0){ + Assert.throwEx("ActivityCenterId["+centerItemLine.getActivityCenterId()+"]金额错误,不支持超过"+centerItemLine.getAmount()); + } + totalSubjectAmt = totalSubjectAmt.add(centerItemLine.getAmount()); + } + } + //与上一次提交金额作对比 + for (VtbVerificationSubject vtbSubject : verificationSubjects) { + if(vtbSubject.getSubjectId().equals(subjectId)){ + if(vtbSubject.getUsedAmount()!=null&&vtbSubject.getUsedAmount().compareTo(BigDecimal.ZERO)>0){ + if(vtbSubject.getUsedAmount().compareTo(totalSubjectAmt)<0){ + Assert.throwEx("["+vtbSubject.getSubjectName()+"]金额错误,不支持超过"+vtbSubject.getUsedAmount()); + } + } + } + } + } + } + + return true; + } + + @Override + @Async + public void buildAffairCommitData(TbsAffairCommitBo commitParam, String flag) { + //常规的提交审批日志 + String userId = AuthContextUtils.getSysUserId(); + SysUser sysUser = sysUserService.getById(userId); + VtbVerificationBatch batch = vtbVerificationBatchService.getById(commitParam.getTargetId()); + List verificationList = vtbVerificationBatchService.listVerifications(batch.getId()); + //保存记录 + try { + // 判断是否含有下个节点 + DataAffairCommitMapper dataAffairCommitMapper = SpringUtils.getBean(DataAffairCommitMapper.class); + DataAffairCommit dataAffairCommit = new DataAffairCommit(); + dataAffairCommit.setTargetCode(getTemplateCode()); + dataAffairCommit.setTargetId(getTargetId(commitParam)); + dataAffairCommit.setId(commitParam.getAffairId()); + dataAffairCommit.setCommentVal(commitParam.getComment()); + dataAffairCommit.setReleaseFlag(commitParam.getReleaseFlag()); + dataAffairCommit.setState(commitParam.getState()); + dataAffairCommit.setUserId(sysUser.getId()); + dataAffairCommit.setUserCode(sysUser.getCode()); + dataAffairCommit.setUserName(sysUser.getName()); + dataAffairCommit.setResultData(flag); + dataAffairCommit.setAttachIds(commitParam.getAttachIds()); + List verificationReleaseIds = commitParam.getChildList().stream() + .filter(a->a.getReleaseFlag()!=null&&a.getReleaseFlag()==1) + .map(TbsAffairCommitBo::getTargetId).collect(Collectors.toList()); + dataAffairCommit.setVerificationIdsRelease(verificationReleaseIds.toArray(new String[verificationReleaseIds.size()])); + dataAffairCommitMapper.insert(dataAffairCommit); + + //保存到每个核销 + for (VtbVerification verification : verificationList) { + DataAffairCommit obj = CopierUtil.copy(dataAffairCommit,new DataAffairCommit()); + obj.setId(commitParam.getAffairId()+"_"+verification.getId()); + obj.setTargetId(verification.getId()+""); + obj.setTargetCode(verification.getVerificationCode()); + dataAffairCommitMapper.insert(obj); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + for (TbsAffairCommitBo itemCommit : commitParam.getChildList()) { + VtbVerification verification = null; + for (VtbVerification item : verificationList) { + if(item.getId().toString().equals(itemCommit.getTargetId())){ + verification = item; + break; + } + } + if(verification==null){ + log.error("对接参数异常:{}",JsonUtil.objectToJson(commitParam)); + continue; + } + //更新释放标识 + if(itemCommit.getReleaseFlag()!=null){ + VtbVerification vtbVer = new VtbVerification(); + vtbVer.setId(verification.getId()); + vtbVer.setRegReleaseFlag(itemCommit.getReleaseFlag()); + vtbVer.setRegReleaseUserId(AuthContextUtils.getSysUserId()); + vtbVerificationService.updateById(vtbVer); + //完成时会调用更新 + verification.setRegReleaseFlag(itemCommit.getReleaseFlag()); + } + + //保存审批线结果 + VtbVerificationYard yard = new VtbVerificationYard(); + yard.setBatchId(Long.parseLong(commitParam.getTargetId())); + yard.setVerificationId(verification.getId()); + yard.setVerificationSubCode(verification.getVerificationCode()); + yard.setState(commitParam.getState()); + yard.setAffairId(commitParam.getAffairId()); + yard.setComment(commitParam.getComment()); + yard.setCaseRemark(commitParam.getCaseRemark()); + //审批中(next)、完成(finish)、拒绝(refused) + boolean isFinish = "finished".equals(flag); + boolean isNext = "next".equals(flag); + boolean isStop = "backed".equals(flag)||"refuse".equals(flag); + //释放费用 + boolean isRelease = itemCommit.getReleaseFlag()!=null&&itemCommit.getReleaseFlag().equals(1); +// if (isStop){ +// log.warn("单据[{}]状态:{},中止审批",verification.getVerificationCode(),flag); +// verificationApplication.backCommitAndStop(verification, "backed".equals(flag)); +// if(isRelease){ +// log.warn("单据[{}]状态:{},中止审批并释放费用",verification.getVerificationCode(),flag); +// vtbVerificationService.release(verification.getActivityId(),sysUser.getCode(),false); +// } +// }else + if (!isFinish && !isNext){ + log.error("远程调用返回,非指定状态:{}",JsonUtil.objectToJson(commitParam)); + continue; + } + yardService.save(yard); + //非终止或者驳回,保存审批线金额明细 + BigDecimal totalAmount = BigDecimal.ZERO; + if(!isStop){ + List subjectCenters = vtbVerificationSubjectCenterService.listByVerificationId(verification.getId()); + //isCenterCommit 代表自定义成本中心维度递交 + boolean isCenterCommit = subjectCenters.size()>0; + List verificationSubjects = vtbVerificationSubjectService.listByVerificationId(verification.getId()); + List yardItemList = new ArrayList<>(); + List verSubject4Update = new ArrayList<>(); + List yarnCenterList = new ArrayList<>(); + //拓展成本中心维度调整记录 + List subjectCenterUpdateList = new ArrayList<>(); + for (VtbVerificationSubject currVs : verificationSubjects) { + BigDecimal changeAmount = null; + Integer countSession = null; + Integer countPerson = null; + List centerItemLineList = null; +// if(isCenterCommit){ + if(CollectionUtil.isNotEmpty(itemCommit.getAffairSubjectCenterLines())){ + for (TbsAffairCommitBo.AffairSubjectCenterLine centerLine : itemCommit.getAffairSubjectCenterLines()) { + if(currVs.getSubjectId().equals(centerLine.getSubjectId())){ + changeAmount = BigDecimal.ZERO; + if(centerLine.getCenterItemLines()!=null){ + for (TbsAffairCommitBo.AffairSubjectCenterItemLine itemLine : centerLine.getCenterItemLines()) { + changeAmount = changeAmount.add(itemLine.getAmount()); + } + } + centerItemLineList = centerLine.getCenterItemLines(); + countSession = centerLine.getCountSession(); + countPerson = centerLine.getCountPerson(); + break; + } + } + } + //保存明细判断是否更变金额 + VtbVerificationYardItem yardItem = CopierUtil.copy(currVs,new VtbVerificationYardItem()); + yardItem.setYardId(yard.getId()); + yardItem.initSetNull(); + BigDecimal lastAmount = currVs.getUsedAmount(); + yardItem.setLastAmount(lastAmount); + + Integer lastSession = currVs.getCountSession(); + yardItem.setLastSession(lastSession); + yardItem.setCurrSession(lastSession); + if(countSession != null){ + yardItem.setCurrSession(countSession); + if(!countSession.equals(lastSession)){ + VtbVerificationSubject verSub4Upd = new VtbVerificationSubject(); + verSub4Upd.setId(currVs.getId()); + verSub4Upd.setCountSession(countSession); + verSubject4Update.add(verSub4Upd); + if(lastSession!=null){ + if(lastSession > countSession){ + yardItem.setRemark2("减少场次:"+ (lastSession - countSession)); + }else { + yardItem.setRemark2("增加场次:"+ (countSession - lastSession)); + } + } + } + } + + Integer lastPerson = currVs.getCountPerson(); + yardItem.setLastPerson(lastPerson); + yardItem.setCurrPerson(lastPerson); + if( countPerson != null ){ + yardItem.setCurrPerson(countPerson); + if(!countPerson.equals(lastPerson)){ + VtbVerificationSubject verSub4Upd = new VtbVerificationSubject(); + verSub4Upd.setId(currVs.getId()); + verSub4Upd.setCountPerson(countPerson); + verSubject4Update.add(verSub4Upd); + if(lastPerson!=null){ + if(lastPerson>countPerson){ + yardItem.setRemark3("减少人数:"+ (lastPerson - countPerson)); + }else { + yardItem.setRemark3("增加人数:"+ (countPerson - lastPerson)); + } + } + } + } + //金额有更变 + if(changeAmount!=null&&changeAmount.compareTo(lastAmount)!=0){ + yardItem.setCurrAmount(changeAmount); + BigDecimal diff = changeAmount.subtract(lastAmount); + if(diff.compareTo(BigDecimal.ZERO)>0){ + yardItem.setRemark("增加费用:"+diff); + }else { + yardItem.setRemark("减少费用:"+diff.negate()); + } + VtbVerificationSubject verSub4Upd = new VtbVerificationSubject(); + verSub4Upd.setId(currVs.getId()); + verSub4Upd.setUsedAmount(changeAmount); + verSubject4Update.add(verSub4Upd); + }else { + yardItem.setCurrAmount(lastAmount); + } + totalAmount = totalAmount.add(yardItem.getCurrAmount()); + if(centerItemLineList!=null&&subjectCenters.size()>0){ + for (TbsAffairCommitBo.AffairSubjectCenterItemLine centerItemLine : centerItemLineList) { + VtbVerificationYardCenterItem centerItem = VtbVerificationYardCenterItem.toNewObject(yardItem); + for (VtbVerificationSubjectCenter subjectCenter : subjectCenters) { + if(centerItemLine.getActivityCenterId().equals(subjectCenter.getActivityCenterId())){ + centerItem.setCenterId(subjectCenter.getCenterId()); + centerItem.setCenterCode(subjectCenter.getCenterCode()); + centerItem.setCenterName(subjectCenter.getCenterName()); + centerItem.setCenterType(subjectCenter.getCenterType()); + centerItem.setActivityCenterId(subjectCenter.getActivityCenterId()); + centerItem.setLastAmount(subjectCenter.getUsedAmount()==null?BigDecimal.ZERO:subjectCenter.getUsedAmount()); + centerItem.setCurrAmount(centerItemLine.getAmount()); + BigDecimal diff = centerItem.getCurrAmount().subtract(centerItem.getLastAmount()); + //修改center的记录金额 + VtbVerificationSubjectCenter scParam = new VtbVerificationSubjectCenter(); + scParam.setId(subjectCenter.getId()); + scParam.setUsedAmount(centerItemLine.getAmount()); + subjectCenterUpdateList.add(scParam); + if(diff.compareTo(BigDecimal.ZERO)>0){ + centerItem.setRemark("增加费用:"+diff); + }else { + centerItem.setRemark("减少费用:"+diff.negate()); + } + } + } + yarnCenterList.add(centerItem); + } + } + + yardItemList.add(yardItem); + } + yardItemService.saveBatch(yardItemList); + if(yarnCenterList.size()>0){ + yardCenterItemService.saveBatch(yarnCenterList); + } + vtbVerificationSubjectService.updateBatchById(verSubject4Update); + if(subjectCenterUpdateList.size()>0){ + vtbVerificationSubjectCenterService.updateBatchById(subjectCenterUpdateList); + } +// //重新计算合计 +// if(isFinish){ +// verificationApplication.finishCallBack(verification, totalAmount); +// if(isRelease){ +// log.warn("核销"+verification.getVerificationCode()+"释放金额"); +// vtbVerificationService.release(verification.getActivityId(),sysUser.getCode(),false); +// } +// }else { +// //更新金额 +// VtbVerification vtbVer = new VtbVerification(); +// vtbVer.setId(verification.getId()); +// vtbVer.setAmount(totalAmount); +// vtbVerificationService.updateById(vtbVer); +// } + + //更新金额 + VtbVerification vtbVer = new VtbVerification(); + vtbVer.setId(verification.getId()); + vtbVer.setAmount(totalAmount); + vtbVerificationService.updateById(vtbVer); + } + } + } + + @Override + public boolean checkSyFormIdIsNotNull(String targetId) { + VtbVerificationBatch batch = vtbVerificationBatchService.getById(targetId); + return batch.getSyFormId()!=null; + } + + @Override + public R> pageAffairV2(String targetId, String targetCode){ + boolean existFormId = checkSyFormIdIsNotNull(targetId); + if (!existFormId){ + return R.ok(new ArrayList<>()); + } + + List verifications = vtbVerificationService.list( + new LambdaQueryWrapper() + .eq(VtbVerification::getBatchId,targetId)); + + String templateCode = getTemplateCode(); + R> syResult = getRequestService().commonListAffairsV2(targetId,targetCode,null,templateCode); + List ctpAffairs = syResult.getData(); + if(ctpAffairs.size()>0){ + List result = getCtpAffairVos(ctpAffairs); + for (CtpAffairVo affairVo : result) { + DataAffairCommit commit = (DataAffairCommit)affairVo.getCommitInfo(); + if(commit==null){ + continue; + } + String[] vids = commit.getVerificationIdsRelease(); + if(vids!=null&&vids.length>0){ + List voList = new ArrayList<>(); + for (VtbVerification verification : verifications) { + for (String vid : vids) { + if(verification.getId().toString().equals(vid)){ + voList.add(new VtbVerificationActReleaseVo(verification)); + } + } + } + commit.setReleaseList(voList); + } + } + return R.ok(result); + } + return R.ok(new ArrayList<>()); + } + + @Override + public void doCommitBacked(String targetId) { + //审批完成后调用 + } + + @Override + public R commitAffair(TbsAffairCommitBo affairCommit) { + return VtbVerificationBatchOperationService.super.commitAffair(affairCommit); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationBatchServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationBatchServiceImpl.java new file mode 100644 index 0000000..e0d6ffa --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationBatchServiceImpl.java @@ -0,0 +1,600 @@ +package com.qs.serve.modules.vtb.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.config.properties.ProjectProperties; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.oa.OaFormMainProcess; +import com.qs.serve.common.model.oa.OaUploadFile; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.tag.util.TagFiledUtil; +import com.qs.serve.common.util.*; +import com.qs.serve.common.util.model.DateFormatString; +import com.qs.serve.modules.bms.entity.*; +import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.service.BmsChannelPointService; +import com.qs.serve.modules.bms.service.BmsChannelService; +import com.qs.serve.modules.bms.service.BmsSubjectService; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.pay.entity.PayWay; +import com.qs.serve.modules.pay.mapper.PayWayMapper; +import com.qs.serve.modules.seeyon.entity.BaseCreateCallbackBo; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +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.tag.mapper.TagInfoMapper; +import com.qs.serve.modules.tbs.common.TbsActivityState; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.entity.TbsActivity; +import com.qs.serve.modules.tbs.entity.TbsActivityCenter; +import com.qs.serve.modules.tbs.entity.TbsActivitySubject; +import com.qs.serve.modules.tbs.entity.TbsCostApply; +import com.qs.serve.modules.tbs.entity.dto.TbsCostSubItem; +import com.qs.serve.modules.tbs.entity.so.VtbVerificationBatchQuery; +import com.qs.serve.modules.tbs.service.TbsActivityCenterService; +import com.qs.serve.modules.tbs.service.TbsActivityService; +import com.qs.serve.modules.tbs.service.TbsActivitySubjectService; +import com.qs.serve.modules.tbs.service.TbsCostApplyService; +import com.qs.serve.modules.vtb.common.VerificationUtil; +import com.qs.serve.modules.vtb.common.VtbVerificationState; +import com.qs.serve.modules.vtb.entity.*; +import com.qs.serve.modules.vtb.entity.bo.*; +import com.qs.serve.modules.vtb.entity.dto.VtbSubjectDTO; +import com.qs.serve.modules.vtb.entity.vo.VtbVerificationBatchVo; +import com.qs.serve.modules.vtb.service.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.vtb.mapper.VtbVerificationBatchMapper; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * @author YenHex + * @since 2024-06-14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class VtbVerificationBatchServiceImpl extends ServiceImpl implements VtbVerificationBatchService { + + private final BmsRegionMapper regionMapper; + private final BmsRegion2Mapper region2Mapper; + private final RedisService redisService; + private final BmsSupplierService bmsSupplierService; + private final TbsActivityService tbsActivityService; + private final TbsCostApplyService tbsCostApplyService; + private final TbsActivitySubjectService tbsActivitySubjectService; + private final TbsActivityCenterService tbsActivityCenterService; + private final SysUserService sysUserService; + private final VtbVerificationService vtbVerificationService; + private final PayWayMapper payWayMapper; + private final BmsSubjectService subjectService; + private final BmsChannelService channelService; + private final BmsChannelPointService channelPointService; + private final VtbVerificationChannelService verificationChannelService; + private final VtbVerificationChannelPointService verificationChannelPointService; + private final VtbVerificationSubjectService verificationSubjectService; + private final VtbVerificationSubjectCenterService vtbVerificationSubjectCenterService; + private final VtbFundFlowService vtbFundFlowService; + private final ProjectProperties projectProperties; + private final TagInfoMapper tagInfoMapper; + private SysAttachService sysAttachService; + private SeeYonRequestService seeYonService; + + @Override + @Transactional(rollbackFor = Exception.class) + public void submit(VtbVerificationBatchBo submitBo) { + String templateCode = TbsSeeYonConst.BatchCostCheckConf.Code(); + TbsCostApply costApply = tbsCostApplyService.getById(submitBo.getCostApplyId()); + BmsSupplier supplier = bmsSupplierService.getById(costApply.getSupplierId()); + List activityList = tbsActivityService.listByCostApplyId(costApply.getId()); + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + sysUser.checkSyAccount(); + redisService.throwResLock(VtbVerificationBatch.class.getSimpleName(),submitBo.getCostApplyId()+""); + // 校验核销状态 + VerificationUtil.verifyCostState(costApply); + if(!costApply.getCreateBy().equals(sysUser.getId()) + &&costApply.getExtUserId()!=null + &&!costApply.getExtUserId().equals(sysUser.getId())){ + Assert.throwEx("越权提交被拦截了"); + } + boolean contractFlag = costApply.getContractFlag()!=null&&costApply.getContractFlag().equals(1); + if(contractFlag){ + Assert.throwEx("协议类申请请移至OA核销"); + } + + if(submitBo.getBatchId()!=null){ + //如果是退回,进行关闭上次批次的核销 + baseMapper.updateBackedItemToClose(submitBo.getBatchId()); + } + + List actIds = submitBo.getVerificationList().stream().map(VtbVerificationBo::getActivityId).collect(Collectors.toList()); + LambdaQueryWrapper vtbVerificationLQW = new LambdaQueryWrapper<>(); + vtbVerificationLQW.eq(VtbVerification::getCostApplyId,costApply.getId()); + vtbVerificationLQW.eq(VtbVerification::getVerificationState, VtbVerificationState.Commiting); + vtbVerificationLQW.in(VtbVerification::getActivityId,actIds); + long count = vtbVerificationService.count(vtbVerificationLQW); + if(count>0){ + Assert.throwEx("部分活动正在核销中"); + } + + //协议类申请 + PayWay payWay = new PayWay(); + if(submitBo.getPayWayId()!=null){ + payWay = payWayMapper.selectById(submitBo.getPayWayId()); + } + + //加载大区信息 + String saleRegionId = supplier.handleSaleRegionId(); + BmsRegion saleRegion = regionMapper.selectById(saleRegionId); + String saleBizNames = saleRegion!=null?saleRegion.getPathNames():"null_申请时未录入"; + + String bizRegionId = supplier.handleBizRegionId(); + BmsRegion2 bizRegion = region2Mapper.selectById(bizRegionId); + String bizBizNames = bizRegion!=null?bizRegion.getPathNames():"null_申请时未录入"; + + //退回的核销 重新申请后标记为关闭 + List orgVerificationIds = new ArrayList<>(); + + //新的核销列表 + List newVerificationList = new ArrayList<>(); + + List allVerificationChannelList = new ArrayList<>(); + List allVerificationChannelPointList = new ArrayList<>(); + + List allVerificationSubjects = new ArrayList<>(); + List allVerificationCenters = new ArrayList<>(); + + //主创建方法,校验BO参数和创建数据 + this.mainCheckAndCreateBatchItemData(submitBo, costApply, supplier, activityList, sysUser, payWay, + orgVerificationIds, newVerificationList, allVerificationChannelList, allVerificationChannelPointList, + allVerificationSubjects, allVerificationCenters); + + BigDecimal totalAmt = BigDecimal.ZERO; + for (VtbVerificationSubject verificationSubject : allVerificationSubjects) { + totalAmt = totalAmt.add(verificationSubject.getUsedAmount()); + } + + VtbVerificationBatch verificationBatch = new VtbVerificationBatch(); + verificationBatch.setVtbBatchCode("BHX"+ CodeGenUtil.generate(CodeGenUtil.SourceKey.VerificationBatch)); + verificationBatch.setVtbBatchStatus(0); + verificationBatch.setCostApplyId(costApply.getId()); + verificationBatch.setRemark(submitBo.getRemark()); + verificationBatch.setSupplierId(supplier.getId()); + verificationBatch.setApplyCheckAmount(totalAmt); + verificationBatch.setResultCheckAmount(totalAmt); + verificationBatch.setSupplierCode(supplier.getCode()); + verificationBatch.setSupplierName(supplier.getName()); + verificationBatch.setUserId(sysUser.getId()); + verificationBatch.setUserCode(sysUser.getCode()); + verificationBatch.setUserName(sysUser.getName()); + verificationBatch.setWayId(payWay.getId()+""); + verificationBatch.setWayTitle(payWay.getTitle()); + this.save(verificationBatch); + + String batchId = verificationBatch.getId()+""; + Map newWayData = new HashMap<>(); + Map data = new HashMap<>(); + List uploadFileList = new ArrayList<>(); + + //创建OA参数data + this.buildBatchOAData(submitBo, templateCode, costApply, supplier, sysUser, saleBizNames, bizBizNames, + verificationBatch, batchId, newWayData, data, uploadFileList); + + OaFormMainProcess mainProcess = new OaFormMainProcess(); + mainProcess.setTargetId(batchId); + mainProcess.setUploadFiles(uploadFileList); + + //补充判断流程条件 + data.put("templateId", costApply.getTemplateId()); + data.put("templateName", costApply.getTemplateTitle()); + data.put("jinE",totalAmt); + + newWayData.put("formmain_2178",data); + mainProcess.setTableName("formmain_2178"); + mainProcess.setData(newWayData); + mainProcess.setTemplateCode(templateCode); + mainProcess.setUserId(sysUser.getId()); + mainProcess.setSenderLoginName(sysUser.getAccount()); + R flowIdResult = seeYonService.newCreateProcess(mainProcess); + + if(flowIdResult==null||flowIdResult.getStatus()!=200){ + assert flowIdResult != null; + Assert.throwEx("远程服务调用失败:"+flowIdResult.getMsg()); + } + if(flowIdResult.getMsg()!=null && flowIdResult.getMsg().length()>45){ + log.error(flowIdResult.getMsg()); + JSONObject object = JSON.parseObject(flowIdResult.getMsg()); + if(!object.get("code").toString().equals("0")){ + Assert.throwEx("流程发起被拦截了"); + } + } + + String formId = null; + R formIdResult = seeYonService.getFormId(templateCode,verificationBatch.getId()); + if(formIdResult.getStatus()==200){ + formId = formIdResult.getData(); + } + verificationBatch.setSyFormId(formId); + this.updateById(verificationBatch); + + //移除历史提交记录 + for (Long orgVerificationId : orgVerificationIds) { + verificationChannelService.removeByVerificationId(orgVerificationId); + verificationChannelPointService.removeByVerificationId(orgVerificationId); + verificationSubjectService.removeByVerificationId(orgVerificationId); + vtbVerificationSubjectCenterService.removeByVerificationId(orgVerificationId); + vtbFundFlowService.removeByVerificationId(orgVerificationId); + } + + Map> allVerificationChannelListMap = allVerificationChannelList.stream() + .collect(Collectors.groupingBy(VtbVerificationChannel::getVerificationId)); + Map> allVerificationChannelPointListMap = allVerificationChannelPointList.stream() + .collect(Collectors.groupingBy(VtbVerificationChannelPoint::getVerificationId)); + + Map> allVerificationSubjectsMap = allVerificationSubjects.stream() + .collect(Collectors.groupingBy(VtbVerificationSubject::getVerificationId)); + Map> allVerificationCentersMap = allVerificationCenters.stream() + .collect(Collectors.groupingBy(VtbVerificationSubjectCenter::getVerificationId)); + + + for (VtbVerification verification : newVerificationList) { + //临时ID,实际是活动ID + Long tmpId = verification.getId(); + + verification.setId(null); + //关联批量ID + verification.setBatchId(batchId); + vtbVerificationService.save(verification); + Long verificationId = verification.getId(); + + this.saveVerificationRelateData(allVerificationChannelListMap, allVerificationChannelPointListMap, allVerificationSubjectsMap, allVerificationCentersMap, tmpId, verificationId); + + //更新活动状态 + TbsActivity activityParam = new TbsActivity(); + activityParam.setId(verification.getActivityId()); + activityParam.setActivityState(TbsActivityState.STATE_1_Checking); + activityParam.setCurrVerificationId(verification.getId()+""); + tbsActivityService.updateById(activityParam); + + } + + //更变费用申请的活动状态 + TbsCostApply costApplyParam = new TbsCostApply(); + costApplyParam.setId(costApply.getId()); + costApplyParam.setCheckState(1); + tbsCostApplyService.updateById(costApplyParam); + + BaseCreateCallbackBo callbackBo = new BaseCreateCallbackBo(templateCode,batchId); + seeYonService.createCallbackStatus(callbackBo); + + } + + /** + * 创建OA参数data + * @param submitBo + * @param templateCode + * @param costApply + * @param supplier + * @param sysUser + * @param saleBizNames + * @param bizBizNames + * @param verificationBatch + * @param batchId + * @param newWayData + * @param data + * @param uploadFileList + */ + private void buildBatchOAData(VtbVerificationBatchBo submitBo, String templateCode, TbsCostApply costApply, + BmsSupplier supplier, SysUser sysUser, String saleBizNames, String bizBizNames, + VtbVerificationBatch verificationBatch, String batchId, Map newWayData, + Map data, List uploadFileList) { + data.put("title", verificationBatch.getVtbBatchCode()); + data.put("orgId", batchId); + data.put("targetId", batchId); + data.put("targetCode", verificationBatch.getVtbBatchCode()); + data.put("applyUserCode", sysUser.getCode()); + data.put("applyUserName", sysUser.getName()); + data.put("supplierName", supplier.getName()); + data.put("supplierCode", supplier.getCode()); + data.put("exsp1", templateCode); + data.put("exsp2", saleBizNames); + data.put("biz_region", bizBizNames); + //添加跳转地址业务 + String urlKey = "exsp5"; + String baseJumpUrl = JumpToUtil.getJumpUrl(projectProperties.getWebUrl(),TbsSeeYonConst.BatchCostCheckConf.Code(), batchId); + data.put("exsp5",urlKey); + data.put("cmsLink",baseJumpUrl); + data.put("rowDate",DateUtils.format(LocalDateTime.now(), DateFormatString.DATE_TIME)); + data.put("rowState","00"); + + data.put("templateId", costApply.getTemplateId()); + data.put("templateName", costApply.getTemplateTitle()); + data.put("supplierArea",supplier.getComRegion()); + //添加客户标签 + List tags = tagInfoMapper.lisTagsBySupplierCode(supplier.getCode()); + data.put("tags",tags); + + List oaAttachmentsIdList = new ArrayList<>(); + submitBo.getVerificationList().forEach(obj->{ + if(obj.getAttachIds()!=null && obj.getAttachIds().length>0){ + oaAttachmentsIdList.addAll(Arrays.asList(obj.getAttachIds())); + } + }); + + //科目 + List subjectList = tbsActivitySubjectService.listByCostApplyId(costApply.getId()); + List subjectDTOList = new ArrayList<>(); + for (TbsActivitySubject activitySubject : subjectList) { + VtbSubjectDTO subjectDTO = new VtbSubjectDTO(); + subjectDTO.setKeMuName(activitySubject.getSubjectName()); + subjectDTOList.add(subjectDTO); + } + newWayData.put("formson_2180",subjectDTOList); + + //成本中心 + List centerDataList = new ArrayList<>(); + List activityCenter = tbsActivityCenterService.listByCostApplyId(costApply.getId()); + for(TbsActivityCenter center : activityCenter){ + TbsCostSubItem.CostCenterTranStr costCenter = new TbsCostSubItem.CostCenterTranStr(); + if(costCenter.getChengBenZhongXin()==null){ + costCenter.setChengBenZhongXin(center.getCenterName()); + costCenter.setChengBenZhongXinId(center.getCenterType()+"-"+center.getId()); + } + centerDataList.add(costCenter); + } + newWayData.put("formson_2179",centerDataList); + + //加载附件 + if(CollectionUtil.isNotEmpty(oaAttachmentsIdList)){ + List attachList = sysAttachService.listByIds(oaAttachmentsIdList); + for (SysAttach sysAttach : attachList) { + OaUploadFile uploadFile = new OaUploadFile(); + uploadFile.setField("file"); + uploadFile.setName("核销附件"+sysAttach.getName()); + uploadFile.setUrl("https://qsjslservice.oss-cn-guangzhou.aliyuncs.com/"+sysAttach.getRelativePath()); + uploadFileList.add(uploadFile); + } + } + } + + /** + * 主创建方法,校验BO参数和创建数据 + * @param submitBo + * @param costApply + * @param supplier + * @param activityList + * @param sysUser + * @param payWay + * @param orgVerificationIds + * @param newVerificationList + * @param allVerificationChannelList + * @param allVerificationChannelPointList + * @param allVerificationSubjects + * @param allVerificationCenters + */ + private void mainCheckAndCreateBatchItemData(VtbVerificationBatchBo submitBo, TbsCostApply costApply, BmsSupplier supplier, + List activityList, SysUser sysUser, PayWay payWay, + List orgVerificationIds, List newVerificationList, + List allVerificationChannelList, + List allVerificationChannelPointList, + List allVerificationSubjects, + List allVerificationCenters) { + for (VtbVerificationBo verificationBo : submitBo.getVerificationList()) { + for (TbsActivity activity : activityList) { + if(verificationBo.getActivityId().equals(activity.getId())){ + //自定义成本中心核销 + List subjectCenterBoList = verificationBo.getSubjectCenterList(); + boolean isCenterCheck = CollectionUtil.isNotEmpty(subjectCenterBoList); + if(activity.getVtbMatchTypeFlag().equals(1) && !isCenterCheck){ + Assert.throwEx("页面参数异常,请刷新页面重试"); + } + VtbVerification orgData = null; + if(verificationBo.getOrgVerificationId()!=null){ + orgData = vtbVerificationService.getById(verificationBo.getOrgVerificationId()); + if(!orgData.getVerificationState().equals(VtbVerificationState.Rollback.getCode())){ + Assert.throwEx("原来的核销数据非回退状态"); + } + orgVerificationIds.add(orgData.getId()); + } + + boolean isCurrentCommit = verificationBo.getId()!=null; + vtbVerificationService.validActivity(false,activity,true,isCurrentCommit); + + //创建 verification + VtbVerification verification = new VtbVerification(); + //临时ID 使用活动ID + verification.setId(activity.getId()); + // 给核销赋值 + this.verificationSetAssign(costApply, sysUser, payWay, verificationBo, activity, verification); + verification.setRemark(submitBo.getRemark()); + + //创建核销相关数据(未存入数据库) + this.buildVerificationRelateData(costApply, allVerificationChannelList, allVerificationChannelPointList, + verificationBo, activity, verification); + + List verificationSubjects = new ArrayList<>(); + List verificationCenters = new ArrayList<>(); + String verificationCode = verification.getVerificationCode(); + if(isCenterCheck){ + //建立核销 VtbVerificationSubjectCenter + vtbVerificationService.validCreateVeriSubjectAndCenter(activity, subjectCenterBoList, costApply, supplier, verificationSubjects, verificationCenters, verificationCode); + }else { + //建立核销 VtbVerificationSubject + verificationSubjects = vtbVerificationService.validCreateVeriSubject(verificationCode,verificationBo, activity, costApply, supplier); + } + //设置总金额 + BigDecimal totalAmount = BigDecimal.ZERO; + for (VtbVerificationSubject verificationSubject : verificationSubjects) { + totalAmount = totalAmount.add(verificationSubject.getUsedAmount()); + } + verification.setAmount(totalAmount); + verification.setAmountRecord(totalAmount); + + //保存 + newVerificationList.add(verification); + + //保存科目费用 + verificationSubjects.forEach(obj->obj.setVerificationId(verification.getId())); + verificationCenters.forEach(obj->obj.setVerificationId(verification.getId())); + + allVerificationSubjects.addAll(verificationSubjects); + allVerificationCenters.addAll(verificationCenters); + + } + } + } + } + + /** + * 给核销赋值 + * @param costApply + * @param sysUser + * @param payWay + * @param verificationBo + * @param activity + * @param verification + */ + private void verificationSetAssign(TbsCostApply costApply, SysUser sysUser, PayWay payWay, + VtbVerificationBo verificationBo, TbsActivity activity, + VtbVerification verification) { + verification.setCostApplyCode(costApply.getCode()); + verification.setActivityCode(activity.getActivityCode()); + verification.setPayConditionId(verificationBo.getPayConditionId()); + verification.setVerificationCode("HX"+ CodeGenUtil.generate(CodeGenUtil.SourceKey.Verification)); + verification.setVerificationMainCode(verification.getVerificationCode()); + verification.setVerificationState(VtbVerificationState.Commiting.getCode()); + verification.setCostApplyId(costApply.getId()); + verification.setActivityId(verificationBo.getActivityId()); + verification.setAttachIds(verificationBo.getAttachIds()); + //这里的值取反(仅记录用于前端显示) + verification.setInputReleaseFlag(verificationBo.getInputReleaseFlag()); + if(verificationBo.getInputReleaseFlag()!=null&& verificationBo.getInputReleaseFlag().equals(0)){ + //初始化是否要释放金额(InputReleaseFlag=0时代表是否) + verification.setRegReleaseFlag(1); + } + verification.setSupplierId(activity.getSupplierId()); + verification.setSupplierCode(activity.getSupplierCode()); + verification.setSupplierName(activity.getSupplierName()); + verification.setUserId(sysUser.getId()); + verification.setUserCode(sysUser.getCode()); + verification.setUserName(sysUser.getName()); + verification.setRemark(verificationBo.getRemark()); + verification.setWayId(payWay.getId()); + verification.setWayTitle(payWay.getTitle()); + verification.setSupplierBizRegionFirstName(costApply.getSupplierBizRegionFirstName()); + verification.setSupplierBizRegionSecondName(costApply.getSupplierBizRegionSecondName()); + verification.setSupplierBizRegionThirdName(costApply.getSupplierBizRegionThirdName()); + verification.setRemark(verificationBo.getRemark()); + verification.setWayId(verificationBo.getPayWayId()); + } + + /** + * 创建核销相关数据(未存入数据库) + * @param costApply + * @param allVerificationChannelList + * @param allVerificationChannelPointList + * @param verificationBo + * @param activity + * @param verification + */ + private void buildVerificationRelateData(TbsCostApply costApply, List allVerificationChannelList, List allVerificationChannelPointList, VtbVerificationBo verificationBo, TbsActivity activity, VtbVerification verification) { + List channelBoList = verificationBo.getChannelList(); + List pointBoList = verificationBo.getPointList(); + if(CollectionUtil.isNotEmpty(channelBoList)){ + for (VtbVerificationChannelBo channelBo : channelBoList) { + BmsChannel channel = channelService.getById(channelBo.getChannelId()); + VtbVerificationChannel verificationChannel = new VtbVerificationChannel(); + verificationChannel.setActivityId(activity.getId()); + verificationChannel.setCostApplyId(costApply.getId()); + verificationChannel.setVerificationId(verification.getId()); + verificationChannel.setChannelId(channel.getId()); + verificationChannel.setChannelCode(channel.getChannelCode()); + verificationChannel.setChannelName(channel.getChannelName()); + verificationChannel.setChannelRate(channelBo.getChannelRate()); + verificationChannel.setPreCountPoint(channelBo.getPreCountPoint()); + verificationChannel.setRemark(channelBo.getRemark()); + allVerificationChannelList.add(verificationChannel); + } + }else if (CollectionUtil.isNotEmpty(pointBoList)){ + for (VtbVerificationChannelPointBo channelPointBo : pointBoList) { + BmsChannelPoint channelPoint = channelPointService.getById(channelPointBo.getPointId()); + BmsChannel channel = channelService.getById(channelPoint.getChannelId()); + VtbVerificationChannelPoint channelPoint1 = new VtbVerificationChannelPoint(); + channelPoint1.setCostApplyId(costApply.getId()); + channelPoint1.setActivityId(activity.getId()); + channelPoint1.setChannelId(channel.getId()); + channelPoint1.setVerificationId(verification.getId()); + channelPoint1.setChannelCode(channel.getChannelCode()); + channelPoint1.setChannelName(channel.getChannelName()); + channelPoint1.setPointId(channelPoint.getId()); + channelPoint1.setPointCode(channelPoint.getPointCode()); + channelPoint1.setPointName(channelPoint.getPointName()); + channelPoint1.setPointRate(channelPointBo.getPointRate()); + channelPoint1.setRemark(channelPointBo.getRemark()); + allVerificationChannelPointList.add(channelPoint1); + } + } + } + + /** + * 保存核销相关数据 + * @param allVerificationChannelListMap + * @param allVerificationChannelPointListMap + * @param allVerificationSubjectsMap + * @param allVerificationCentersMap + * @param tmpId + * @param verificationId + */ + private void saveVerificationRelateData(Map> allVerificationChannelListMap, Map> allVerificationChannelPointListMap, Map> allVerificationSubjectsMap, Map> allVerificationCentersMap, Long tmpId, Long verificationId) { + List vtbVerificationChannels = allVerificationChannelListMap.get(tmpId); + if(vtbVerificationChannels!=null){ + vtbVerificationChannels.forEach(a->a.setVerificationId(verificationId)); + verificationChannelService.saveBatch(vtbVerificationChannels); + } + + List verificationChannelPointList = allVerificationChannelPointListMap.get(tmpId); + if(verificationChannelPointList!=null){ + verificationChannelPointList.forEach(a->a.setVerificationId(verificationId)); + verificationChannelPointService.saveBatch(verificationChannelPointList); + } + + List verificationSubjects = allVerificationSubjectsMap.get(tmpId); + if(verificationSubjects!=null){ + verificationSubjects.forEach(a->a.setVerificationId(verificationId)); + verificationSubjectService.saveBatch(verificationSubjects); + } + + List vtbVerificationSubjectCenterList = allVerificationCentersMap.get(tmpId); + if(vtbVerificationSubjectCenterList!=null){ + vtbVerificationSubjectCenterList.forEach(a->a.setVerificationId(verificationId)); + vtbVerificationSubjectCenterService.saveBatch(vtbVerificationSubjectCenterList); + } + } + + @Override + public List listVerifications(Long batchId) { + return vtbVerificationService + .list(new LambdaQueryWrapper() + .eq(VtbVerification::getBatchId,batchId)); + } + + @Override + public List list2(VtbVerificationBatchQuery query) { + TagFiledUtil.VtbVerificationBatchPage(query); + return baseMapper.selectList2(query); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationChannelPointServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationChannelPointServiceImpl.java new file mode 100644 index 0000000..7d1329d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationChannelPointServiceImpl.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.vtb.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.vtb.entity.VtbVerificationChannel; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.vtb.entity.VtbVerificationChannelPoint; +import com.qs.serve.modules.vtb.service.VtbVerificationChannelPointService; +import com.qs.serve.modules.vtb.mapper.VtbVerificationChannelPointMapper; + +/** + * 核销网点项 服务实现类 + * @author YenHex + * @since 2022-11-24 + */ +@Slf4j +@Service +@AllArgsConstructor +public class VtbVerificationChannelPointServiceImpl extends ServiceImpl implements VtbVerificationChannelPointService { + @Override + public void removeByVerificationId(Long verificationId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(VtbVerificationChannelPoint::getVerificationId,verificationId); + this.remove(lqw); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationChannelServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationChannelServiceImpl.java new file mode 100644 index 0000000..59d0efe --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationChannelServiceImpl.java @@ -0,0 +1,30 @@ +package com.qs.serve.modules.vtb.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.vtb.entity.VtbVerificationChannel; +import com.qs.serve.modules.vtb.service.VtbVerificationChannelService; +import com.qs.serve.modules.vtb.mapper.VtbVerificationChannelMapper; + +/** + * 核销渠道项 服务实现类 + * @author YenHex + * @since 2022-11-24 + */ +@Slf4j +@Service +@AllArgsConstructor +public class VtbVerificationChannelServiceImpl extends ServiceImpl implements VtbVerificationChannelService { + + @Override + public void removeByVerificationId(Long verificationId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(VtbVerificationChannel::getVerificationId,verificationId); + this.remove(lqw); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationExtServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationExtServiceImpl.java new file mode 100644 index 0000000..f45d43b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationExtServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.vtb.service.impl; + +import com.qs.serve.modules.vtb.service.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.stereotype.Service; + +/** + * 核销 服务实现类 + * @author YenHex + * @since 2022-11-27 + */ +@EnableAsync +@Slf4j +@Service +@AllArgsConstructor +public class VtbVerificationExtServiceImpl implements VtbVerificationExtService { + + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationOperationServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationOperationServiceImpl.java new file mode 100644 index 0000000..be59622 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationOperationServiceImpl.java @@ -0,0 +1,243 @@ +package com.qs.serve.modules.vtb.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.seeyon.service.SeeYonOperationService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.tbs.common.TbsActivityState; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +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.entity.bo.TbsAffairCommitBo; +import com.qs.serve.modules.tbs.mapper.TbsCostApplyMapper; +import com.qs.serve.modules.tbs.service.TbsActivityPayConditionService; +import com.qs.serve.modules.tbs.service.TbsActivityService; +import com.qs.serve.modules.vtb.common.VtbVerificationState; +import com.qs.serve.modules.vtb.entity.*; +import com.qs.serve.modules.vtb.entity.dto.XltDelVerificationDto; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import com.qs.serve.modules.vtb.service.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author YenHex + * @since 2023/5/26 + */ +@Slf4j +@Service +@AllArgsConstructor +public class VtbVerificationOperationServiceImpl implements SeeYonOperationService { + + private VtbVerificationMapper vtbVerificationMapper; + private VtbVerificationSubjectCenterService vtbVerificationSubjectCenterService; + private VtbFundFlowService vtbFundFlowService; + private TbsActivityPayConditionService activityPayConditionService; + private TbsActivityService tbsActivityService; + private TbsCostApplyMapper tbsCostApplyMapper; + + @Override + public boolean checkSyFormIdIsNotNull(String targetId) { + VtbVerification verification = vtbVerificationMapper.selectById(targetId); + return verification.getSyFormId()!=null; + } + + @Override + public String getTemplateCode() { + return TbsSeeYonConst.CostCheckConf.Code(); + } + + @Override + public String getTargetId(TbsAffairCommitBo affairCommit) { + return affairCommit.getCostApplyId()+""; + } + + @Override + public String getSyFormIdByTargetInfo(TbsAffairCommitBo affairCommit) { + Assert.throwEx("方法未定义"); + return null; + } + + @Override + public Object doBacked(TbsAffairCommitBo affairCommit) { + return null; + } + + @Override + public Object doFinished(TbsAffairCommitBo param) { + return null; + } + + @Override + public Object doRefuse(TbsAffairCommitBo affairCommit) { + return null; + } + + @Override + public void doCommitBacked(String targetId) { + + } + + @Override + public Object compensateNext(String targetId) { + VtbVerification verification = vtbVerificationMapper.selectById(targetId); + if(verification!=null&&!verification.getVerificationState().equals(VtbVerificationState.Commiting.getCode())){ + VtbVerification vtbVer = new VtbVerification(); + vtbVer.setId(verification.getId()); + vtbVer.setVerificationState(VtbVerificationState.Commiting.getCode()); + vtbVerificationMapper.updateById(vtbVer); + + TbsActivity tbsActivity = tbsActivityService.getById(verification.getActivityId()); + if(tbsActivity.getActivityState().equals(TbsActivityState.STATE_4_Release)){ + VtbVerificationService service = SpringUtils.getBean(VtbVerificationService.class); + service.cancelRelease(tbsActivity.getId()); + } + + TbsCostApply costApply = tbsCostApplyMapper.selectById(tbsActivity.getCostApplyId()); + if(!costApply.getChargeState().equals(TbsCostApplyState.State_2_actioning.getCode())){ + costApply.setChargeState(TbsCostApplyState.State_2_actioning.getCode()); + tbsCostApplyMapper.updateById(costApply); + } + //移除错误的数据 + vtbFundFlowService.remove(new LambdaQueryWrapper().eq(VtbFundFlow::getVerificationId,targetId)); + vtbFundFlowService.flushActivityAmount(verification.getActivityId()); + + //设置无效的,预算多次统计 + vtbVerificationSubjectCenterService.update(new LambdaUpdateWrapper() + .eq(VtbVerificationSubjectCenter::getVerificationId,verification.getId()) + .eq(VtbVerificationSubjectCenter::getEffectiveFlag,1) + .set(VtbVerificationSubjectCenter::getEffectiveFlag,0) + .set(VtbVerificationSubjectCenter::getRemark,"需要确认是否有核销写入ERP") + ); + + String host = "http://59.37.164.96:2506/action/cms/cost/deletion"; + //TODO 请求伟成接口,删除 XLT_BIFyDbf + XltDelVerificationDto delVerificationDto = new XltDelVerificationDto( + verification.getUserCode(), + null, + verification.getVerificationCode() + ); + String requestBody = JsonUtil.objectToJson(delVerificationDto); + String response = HttpUtil.doPost(host,requestBody,null); + log.info("补偿核销触发,删除 XLT_BIFyDbf:{}",response); + + } + return null; + } + + + @Override + public Object compensateBacked(String targetId) { + VtbVerification verification = vtbVerificationMapper.selectById(targetId); + if(verification.getVerificationState().equals(VtbVerificationState.Commiting.getCode())){ + //设置回退 + VtbVerification vtbVer = new VtbVerification(); + vtbVer.setId(verification.getId()); + vtbVer.setVerificationState(VtbVerificationState.Rollback.getCode()); + vtbVer.setSyFormId(""); + vtbVer.setSyFlowId(""); + vtbVerificationMapper.updateById(vtbVer); + //还原支付条件 + if(verification.getPayConditionId()!=null){ + TbsActivityPayCondition payCondition = activityPayConditionService.getById(verification.getPayConditionId()); + payCondition.setFinishedFlag(0); + activityPayConditionService.updateById(payCondition); + } + //还原活动为待核销状态 + TbsActivity activity = new TbsActivity(); + activity.setId(verification.getActivityId()); + activity.setActivityState(TbsActivityState.STATE_0_Todo); + tbsActivityService.updateById(activity); + } + TbsActivity tbsActivity = tbsActivityService.getById(verification.getActivityId()); + if(tbsActivity.getCurrVerificationId()!=null && tbsActivity.getCurrVerificationId().equals(verification.getId().toString())&& + //if( + tbsActivity.getActivityState().equals(TbsActivityState.STATE_1_Checking)){ + //还原活动为待核销状态 + TbsActivity activity = new TbsActivity(); + activity.setId(verification.getActivityId()); + activity.setActivityState(TbsActivityState.STATE_0_Todo); + if(tbsActivity.getPreCheckDate().isBefore(LocalDate.now())){ + activity.setReopenFlag(1); + activity.setPreEndDateBack(LocalDate.now().plusDays(3)); + } + tbsActivityService.updateById(activity); + } + return null; + } + + @Override + public Object compensateFinished(String targetId) { + VtbVerification verification = vtbVerificationMapper.selectById(targetId); + if(verification.getVerificationState().equals(VtbVerificationState.Commiting.getCode())){ + if(verification.getPayConditionId()!=null){ + //支付条件完成 + TbsActivityPayCondition payCondition = activityPayConditionService.getById(verification.getPayConditionId()); + payCondition.setFinishedFlag(1); + activityPayConditionService.updateById(payCondition); + }else { + //刷新活动金额 + TbsActivity activity = tbsActivityService.getById(verification.getActivityId()); + BigDecimal lastUsedAmt = vtbVerificationMapper.totalActivityVerification(verification.getActivityId()+""); + BigDecimal totalUsed = lastUsedAmt.add(verification.getAmount()); + TbsActivity activity4Upd = new TbsActivity(); + activity4Upd.setId(activity.getId()); + activity4Upd.setUsedAmount(totalUsed); + if(totalUsed.compareTo(activity.getTotalAmount())>=0){ + activity4Upd.setActivityState(TbsActivityState.STATE_1_Finished); + }else { + activity4Upd.setActivityState(TbsActivityState.STATE_0_Todo); + } + if(activity.getPreCheckDate().isBefore(LocalDate.now())){ + activity4Upd.setReopenFlag(1); + activity4Upd.setPreEndDateBack(LocalDate.now().plusDays(3)); + } + tbsActivityService.updateById(activity4Upd); + } + //更新金额,已完成 + VtbVerification vtbVer = new VtbVerification(); + vtbVer.setId(verification.getId()); + vtbVer.setVerificationState(VtbVerificationState.Finished.getCode()); + vtbVer.setFinishedTime(LocalDateTime.now()); + vtbVerificationMapper.updateById(vtbVer); + VtbVerificationService vtbVerificationService = SpringUtils.getBean(VtbVerificationService.class); + vtbVerificationService.successCommit(verification.getId()); + } + return null; + } + + @Override + public Object compensateRefuse(String targetId) { + VtbVerification verification = vtbVerificationMapper.selectById(targetId); + if(verification.getVerificationState().equals(VtbVerificationState.Commiting.getCode())){ + //设置拒绝 + VtbVerification vtbVer = new VtbVerification(); + vtbVer.setId(verification.getId()); + vtbVer.setVerificationState(VtbVerificationState.Stop.getCode()); + vtbVerificationMapper.updateById(vtbVer); + vtbFundFlowService.removeByVerificationId(verification.getId()); + //还原支付条件 + if(verification.getPayConditionId()!=null){ + TbsActivityPayCondition payCondition = activityPayConditionService.getById(verification.getPayConditionId()); + payCondition.setFinishedFlag(0); + activityPayConditionService.updateById(payCondition); + } + //还原活动为待核销状态 + TbsActivity activity = new TbsActivity(); + activity.setId(verification.getActivityId()); + activity.setActivityState(TbsActivityState.STATE_0_Todo); + tbsActivityService.updateById(activity); + } + return null; + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java new file mode 100644 index 0000000..c924fbc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationServiceImpl.java @@ -0,0 +1,1722 @@ +package com.qs.serve.modules.vtb.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.config.properties.ProjectApisProperties; +import com.qs.serve.common.config.properties.ProjectProperties; +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; +import com.qs.serve.modules.sync.AsyncFactory; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.tag.util.TagFiledUtil; +import com.qs.serve.common.util.*; +import com.qs.serve.common.util.model.DateFormatString; +import com.qs.serve.modules.bir.consts.BirActivityCenterGoodsUtil; +import com.qs.serve.modules.bir.service.BirCenterRateService; +import com.qs.serve.modules.bms.entity.*; +import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.service.BmsChannelPointService; +import com.qs.serve.modules.bms.service.BmsChannelService; +import com.qs.serve.modules.bms.service.BmsSubjectService; +import com.qs.serve.modules.bms.service.BmsSupplierService; +import com.qs.serve.modules.pay.entity.PayWay; +import com.qs.serve.modules.pay.mapper.PayWayMapper; +import com.qs.serve.modules.seeyon.entity.BaseCreateCallbackBo; +import com.qs.serve.modules.seeyon.entity.BaseCreateProcessBo; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.seeyon.service.XiaoLuTonService; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.entity.SysSyncLog; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysSyncLogService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tag.mapper.TagInfoMapper; +import com.qs.serve.modules.tbs.common.TbsActivityState; +import com.qs.serve.modules.tbs.common.TbsCostApplyState; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.common.consts.ReleaseConst; +import com.qs.serve.modules.tbs.common.util.BirHttpUtil; +import com.qs.serve.modules.tbs.common.util.QuarterUtil; +import com.qs.serve.modules.tbs.common.util.TbsBudgetLogBuildUtil; +import com.qs.serve.modules.tbs.entity.*; +import com.qs.serve.modules.tbs.entity.bo.TbsActivityReopenBo; +import com.qs.serve.modules.tbs.entity.dto.TbsCostSubItem; +import com.qs.serve.modules.tbs.mapper.TbsActivityPayConditionMapper; +import com.qs.serve.modules.tbs.mapper.TbsCostPercentMapper; +import com.qs.serve.modules.tbs.service.*; +import com.qs.serve.modules.third.util.ThirtyVerificationUtil; +import com.qs.serve.modules.vtb.common.VerificationUtil; +import com.qs.serve.modules.vtb.common.VtbFundFlowType; +import com.qs.serve.modules.vtb.common.VtbVerificationState; +import com.qs.serve.modules.vtb.entity.*; +import com.qs.serve.modules.vtb.entity.bo.*; +import com.qs.serve.modules.vtb.entity.dto.VtbSubjectDTO; +import com.qs.serve.modules.vtb.entity.dto.XltDelVerificationDto; +import com.qs.serve.modules.vtb.mapper.VtbFundFlowMapper; +import com.qs.serve.modules.vtb.mapper.VtbVerificationMapper; +import com.qs.serve.modules.vtb.mapper.VtbVerificationYardItemMapper; +import com.qs.serve.modules.vtb.mapper.VtbVerificationYardMapper; +import com.qs.serve.modules.vtb.service.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 核销 服务实现类 + * @author YenHex + * @since 2022-11-24 + */ +@EnableAsync +@Slf4j +@Service +@AllArgsConstructor +public class VtbVerificationServiceImpl extends ServiceImpl implements VtbVerificationService { + + private final TbsCostApplyService costApplyService; + private final TbsActivityService activityService; + private final TbsActivitySubjectService activitySubjectService; + private final TbsActivityCenterGoodsService activityCenterGoodsService; + private final TbsActivityCenterService activityCenterService; + private final TbsActivityPayConditionService activityPayConditionService; + private final TbsActivityPayConditionMapper activityPayConditionMapper; + private final VtbVerificationSubjectCenterService vtbVerificationSubjectCenterService; + private final VtbFundFlowService vtbFundFlowService; + private final TbsBudgetCostItemService budgetCostItemService; + private final TbsBudgetLogService budgetLogService; + private final TbsBudgetService budgetService; + private final BmsSubjectService subjectService; + private final BmsChannelService channelService; + private final BmsChannelPointService channelPointService; + private final BmsSupplierService bmsSupplierService; + private final BirCenterRateService centerRateService; + private final SysSyncLogService sysSyncLogService; + + private final SeeYonRequestBaseService seeYonRequestBaseService; + private final ProjectApisProperties projectApisProperties; + private final RedisService redisService; + + private final VtbVerificationChannelService verificationChannelService; + private final VtbVerificationChannelPointService verificationChannelPointService; + private final VtbVerificationSubjectService verificationSubjectService; + private final VtbFundFlowService fundFlowService; + private final VtbFundFlowMapper vtbFundFlowMapper; + private final VtbVerificationYardMapper verificationYardMapper; + private final VtbVerificationYardItemMapper verificationYardItemMapper; + + private final SeeYonRequestService seeYonService; + private final XiaoLuTonService xiaoLuTonService; + + private final SysUserService sysUserService; + + private TagInfoMapper tagInfoMapper; + private final PayWayMapper payWayMapper; + private final ProjectProperties projectProperties; + + private final BmsRegionMapper regionMapper; + private final BmsRegion2Mapper region2Mapper; + private final TbsCostPercentMapper costPercentMapper; + + @Override + public IPage selectVerificationList(VtbVerification query) { + //初始化标签 + TagFiledUtil.VtbVerificationPage(query); + IPage iPage = PageUtil.getMbpPage(); + IPage result = baseMapper.selectVerificationList(iPage,query); + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void createContactRecord(VtbVerificationContactBo param) { + SysUser sysUser = sysUserService.getByAccount(param.getUserCode()); + if(sysUser==null){ + Assert.throwEx("工号["+param.getUserCode()+"]在CRM不存在"); + } + TbsActivityPayCondition condition = null; + if(StringUtils.hasText(param.getContactCode())){ + LambdaQueryWrapper conditionLqw = new LambdaQueryWrapper<>(); + conditionLqw.eq(TbsActivityPayCondition::getCode,param.getContactCode()); + condition = activityPayConditionService.getOne(conditionLqw,false); + if(condition==null){ + Assert.throwEx("协议编码有误"); + } + } + TbsCostApply costApply = costApplyService.getByCode(param.getCostApplyCode()); + if(!costApply.getContractFlag().equals(1)){ + Assert.throwEx("非协议类费用,访问拦截"); + } + if(!costApply.getChargeState().equals(TbsCostApplyState.State_2_actioning.getCode())){ + Assert.throwEx("费用状态不支持"); + } + + TbsActivity activity = activityService.listByCostApplyId(costApply.getId()).get(0); + BigDecimal surplus = activity.getTotalAmount().subtract(activity.getUsedAmount()); + if(surplus.compareTo(param.getTotalCheckAmount())<0){ + Assert.throwEx("金额溢出"); + } + //添加核销记录 + VtbVerification verification = new VtbVerification(); + if(condition!=null){ + verification.setPayConditionId(condition.getId()); + } + verification.setActivityCode(activity.getActivityCode()); + verification.setCostApplyCode(costApply.getCode()); + verification.setAmountRecord(param.getTotalCheckAmount()); + verification.setAmount(param.getTotalCheckAmount()); + verification.setVerificationCode("HX"+CodeGenUtil.generate(CodeGenUtil.SourceKey.Verification)); + verification.setVerificationMainCode(verification.getVerificationCode()); + verification.setVerificationState(VtbVerificationState.Finished.getCode()); + verification.setCostApplyId(costApply.getId()); + verification.setActivityId(activity.getId()); + verification.setSupplierId(activity.getSupplierId()); + verification.setSupplierCode(activity.getSupplierCode()); + verification.setSupplierName(activity.getSupplierName()); + verification.setUserId(sysUser.getId()); + verification.setUserCode(sysUser.getCode()); + verification.setUserName(sysUser.getName()); + verification.setWayId(0L); + verification.setWayTitle(param.getPayWay()); + this.save(verification); + + Date nowDate_ = new Date(); + + //更新费用 + BigDecimal lastUsedAmt = baseMapper.totalActivityVerification(verification.getActivityId()+""); + BigDecimal finalAmt = lastUsedAmt.add(param.getTotalCheckAmount()); + activity.setUsedAmount(finalAmt); + if(finalAmt.compareTo(activity.getTotalAmount())==0) { + activity.setActivityState(TbsActivityState.STATE_1_Finished); + activity.setFinishedFlag(1); + activity.setFinishedTime(LocalDateTime.now()); + } + activityService.updateById(activity); + + //更新活动相关费用 + List activitySubjectList = activitySubjectService.listByActivityId(activity.getId()); + List activityCenterList = activityCenterService.listByActivity(activity.getId()); + List activityCenterGoodsList = activityCenterGoodsService.listByActivityId(activity.getId()); + BigDecimal tempTotal = param.getTotalCheckAmount(); + BigDecimal n100 = new BigDecimal("100"); + BigDecimal n10000 = new BigDecimal("10000"); + List activityCenters4Update = new ArrayList<>(); + List activitySubject4Update = new ArrayList<>(); + int countCode = 1; + //记录只支付一次 + boolean saveOneTimes = false; + for (TbsActivitySubject activitySubject : activitySubjectList) { + if(tempTotal.compareTo(BigDecimal.ZERO)<1){ + break; + } + BigDecimal totalCenterUsedAmt = BigDecimal.ZERO; + BigDecimal totalCenterAmt = BigDecimal.ZERO; + for (TbsActivityCenter activityCenter : activityCenterList) { + totalCenterAmt = totalCenterAmt.add(activityCenter.getCenterAmount()); + totalCenterUsedAmt = totalCenterUsedAmt.add(activityCenter.getUsedAmount()); + } + BigDecimal surplusAmt = totalCenterAmt.subtract(totalCenterUsedAmt); + if(surplusAmt.compareTo(BigDecimal.ZERO)<=0){ + continue; + } + List activityCenterGoods4Update = new ArrayList<>(); + //当前科目支付金额 + BigDecimal currentSubjectAmt = null; + if(tempTotal.compareTo(surplusAmt)<0){ + //余额大于核销金额 + currentSubjectAmt = tempTotal; + tempTotal = BigDecimal.ZERO; + if(activitySubject.getUsedAmount()==null){ + activitySubject.setUsedAmount(BigDecimal.ZERO); + } + activitySubject.setUsedAmount(activitySubject.getUsedAmount().add(tempTotal)); + //最后一项 + for (TbsActivityCenter activityCenter : activityCenterList) { + if(activityCenter.getSubjectId().equals(activitySubject.getSubjectId())){ + BigDecimal used = tempTotal.multiply(activityCenter.getCenterRate()).divide(n100,2,RoundingMode.HALF_DOWN); + activityCenter.setUsedAmount(activityCenter.getUsedAmount().add(used)); + activityCenters4Update.add(activityCenter); + } + } + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + if(centerGoods.getSubjectId().equals(activitySubject.getSubjectId())){ + BigDecimal used = tempTotal.multiply(centerGoods.getCenterRate()) + .multiply(centerGoods.getCenterGoodsRate()) + .divide(n10000,2,RoundingMode.HALF_DOWN); + centerGoods.setUsedAmount(centerGoods.getUsedAmount().add(used)); + activityCenterGoods4Update.add(centerGoods); + } + } + activitySubject4Update.add(activitySubject); + }else { + //余额小于于核销金额 + currentSubjectAmt = tempTotal; + tempTotal = tempTotal.subtract(surplusAmt); + //设置全部完成 + for (TbsActivityCenter activityCenter : activityCenterList) { + if(activityCenter.getSubjectId().equals(activitySubject.getSubjectId())){ + activityCenter.setUsedAmount(activityCenter.getCenterAmount()); + activityCenters4Update.add(activityCenter); + } + } + for (TbsActivityCenterGoods centerGoods : activityCenterGoodsList) { + if(centerGoods.getSubjectId().equals(activitySubject.getSubjectId())){ + centerGoods.setUsedAmount(centerGoods.getCenterGoodsAmount()); + activityCenterGoods4Update.add(centerGoods); + } + } + activitySubject.setUsedAmount(activitySubject.getAmount()); + activitySubject4Update.add(activitySubject); + } + //跟随活动科目同级 + if(CollectionUtil.isNotEmpty(activityCenterGoods4Update)){ + activityCenterGoodsService.updateBatchById(activityCenterGoods4Update); + List addFundFlowList = new ArrayList<>(); + //协议类支持自动分配 + buildFundFlows(verification.getId(), addFundFlowList, activityCenterGoods4Update,currentSubjectAmt); + if(CollectionUtil.isNotEmpty(addFundFlowList)){ + fundFlowService.saveBatch(addFundFlowList); + } + } + //保存费用结果 + VtbVerificationSubject verificationSubject = new VtbVerificationSubject(); + String vtbSubCode = verification.getVerificationCode()+"_"+countCode; + verificationSubject.setVerificationSubCode(vtbSubCode); + verificationSubject.setVerificationId(verification.getId()); + countCode++; + verificationSubject.setCostApplyId(costApply.getId()); + verificationSubject.setActivityId(activity.getId()); + verificationSubject.setSubjectId(activitySubject.getSubjectId()); + verificationSubject.setSubjectCode(activitySubject.getSubjectCode()); + verificationSubject.setSubjectName(activitySubject.getSubjectName()); + verificationSubject.setSupplierId(activity.getSupplierId()); + verificationSubject.setSupplierCode(activity.getSupplierCode()); + verificationSubject.setSupplierName(activity.getSupplierName()); + verificationSubject.setUsedAmount(currentSubjectAmt); + verificationSubject.setUsedAmountRecord(currentSubjectAmt); + verificationSubject.setCountPerson(param.getCountPerson()); + verificationSubject.setCountSession(param.getCountSession()); + verificationSubject.setRemark(param.getRemark()); + verificationSubjectService.save(verificationSubject); + + //保存支付信息 + BmsSubject subject = new BmsSubject(); + subject.setSubjectCode(activitySubject.getSubjectCode()); + subject.setSubjectName(activitySubject.getSubjectName()); + BmsSupplier supplier = new BmsSupplier(); + supplier.setCode(activity.getSupplierCode()); + supplier.setName(activity.getSupplierName()); + //saveOneTimes,因为多个科目,单支付保存是总额,只保存一次支付 + if(!saveOneTimes){ + String COST_TO_PAY_API = projectApisProperties.getCostToPay(); + String json = ThirtyVerificationUtil.buildJson(supplier, subject, verification.getAmount() + , activity,activity.getActStartDate().atStartOfDay(),activity.getActEndDate().atTime(23,59,59), verification); + SysSyncLog syncLog = ThirtyVerificationUtil.requestToPayment("to支付请求",verification.getVerificationCode(), COST_TO_PAY_API, json); + syncLog.setTodoState(1); + saveOneTimes = true; + sysSyncLogService.save(syncLog); + } + } + if(CollectionUtil.isNotEmpty(activitySubject4Update)){ + activitySubjectService.updateBatchById(activitySubject4Update); + } + if(CollectionUtil.isNotEmpty(activityCenters4Update)){ + activityCenterService.updateBatchById(activityCenters4Update); + } + + //判断是否其它费用也完成 + if(finalAmt.compareTo(activity.getTotalAmount())==0){ + LambdaQueryWrapper activityLqw = new LambdaQueryWrapper<>(); + activityLqw.ne(TbsActivity::getActivityState,TbsActivityState.STATE_1_Finished); + activityLqw.ne(TbsActivity::getReleaseFlag,1); + activityLqw.eq(TbsActivity::getCostApplyId,costApply.getId()); + Long count = activityService.count(activityLqw); + if(count<1){ + costApply.setChargeState(TbsCostApplyState.State_3_finished.getCode()); + costApplyService.updateById(costApply); + } + } + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean removeCheck(Long id) { + VtbVerification verification = this.getById(id); + if(verification.getVerificationState().equals(VtbVerificationState.Cancel.getCode())){ + Assert.throwEx("已作废,请勿重复提交"); + } + if (!verification.getVerificationState().equals(VtbVerificationState.Finished.getCode())){ + Assert.throwEx("当前核销不可作废"); + } + TbsActivity activity = activityService.getById(verification.getActivityId()); + if(activity.getReleaseFlag()!=null&&activity.getReleaseFlag().equals(1)){ + Assert.throwEx("当前活动已释放不可作废"); + } + boolean canCancel = activity.getActivityState().equals(TbsActivityState.STATE_0_Todo)|| + activity.getActivityState().equals(TbsActivityState.STATE_1_Finished)|| + activity.getActivityState().equals(TbsActivityState.STATE_1_Baning); + if(!canCancel){ + Assert.throwEx("当前活动状态不可作废"); + } + + if(!verification.getVerificationCode().contains("TEST")){ + String host = "http://59.37.164.96:2506/action/cms/cost/deletion"; + + //TODO 请求伟成接口,删除 XLT_BIFyDbf + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + XltDelVerificationDto delVerificationDto = new XltDelVerificationDto( + sysUser.getAccount(), + null, + verification.getVerificationCode() + ); + String requestBody = JsonUtil.objectToJson(delVerificationDto); + String response = HttpUtil.doPost(host,requestBody,null); + String errorMsg = null; + if(!response.contains("200")){ + errorMsg = response; + } + SysSyncLog syncLog = new SysSyncLog(); + syncLog.setFromPlat("移除核销记录"); + syncLog.setUrl(host); + syncLog.setEntityClass(XltDelVerificationDto.class.getName()); + syncLog.setRequestJson(requestBody); + syncLog.setFailReason(errorMsg); + syncLog.setSuccessStatus(errorMsg==null?0:1); + syncLog.setTodoState(0); + syncLog.setTryTimes(0); + sysSyncLogService.save(syncLog); + if(errorMsg!=null){ + Assert.throwEx(errorMsg); + } + } + + + verification.setVerificationState(VtbVerificationState.Cancel.getCode()); + vtbFundFlowService.removeByVerificationId(verification.getId()); + this.updateById(verification); + //判断费用申请类型 + TbsCostApply costApply = costApplyService.getById(verification.getCostApplyId()); + if(costApply.getContractFlag().equals(1)){ + LambdaQueryWrapper contractLambdaQueryWrapper = new LambdaQueryWrapper<>(); + contractLambdaQueryWrapper.eq(TbsActivityPayCondition::getActivityId,verification.getActivityId()); + TbsActivityPayCondition payCondition = activityPayConditionService.getOne(contractLambdaQueryWrapper,false); + payCondition.setFinishedFlag(0); + activityPayConditionService.updateById(payCondition); + } + //移除核销相关记录 + this.removeWithVerification(id); + //更新活动统计金额 + LambdaQueryWrapper vtbVerificationLqw = new LambdaQueryWrapper<>(); + vtbVerificationLqw.eq(VtbVerification::getActivityId,activity.getId()); + vtbVerificationLqw.ne(VtbVerification::getId,id); + vtbVerificationLqw.lt(VtbVerification::getVerificationState,VtbVerificationState.Stop.getCode()); + List vtbVerificationList = this.list(vtbVerificationLqw); + BigDecimal totalVtbAmt = BigDecimal.ZERO; + for (VtbVerification vtbVerification : vtbVerificationList) { + totalVtbAmt = totalVtbAmt.add(vtbVerification.getAmount()); + } + //刷新活动状态 + VtbFundFlowService vtbFundFlowService = SpringUtils.getBean(VtbFundFlowService.class); + vtbFundFlowService.flushActivityAmount(verification.getActivityId()); + + //如果为最后的活动,更变费用申请状态 + if(costApply.getChargeState().equals(TbsCostApplyState.State_3_finished.getCode())){ + TbsCostApply costApplyUpdate = new TbsCostApply(); + costApplyUpdate.setId(activity.getCostApplyId()); + costApplyUpdate.setChargeState(TbsCostApplyState.State_2_actioning.getCode()); + costApplyService.updateById(costApplyUpdate); + } + return true; + } + + private void removeWithVerification(Long verificationId){ + QueryWrapper rmqw = new QueryWrapper(); + rmqw.eq("verification_id",verificationId); + + fundFlowService.remove(rmqw); + verificationYardMapper.delete(rmqw); + verificationYardItemMapper.delete(rmqw); + + VtbVerificationSubject verificationSubject = new VtbVerificationSubject(); + verificationSubject.setEffectiveFlag(0); + verificationSubjectService.update(verificationSubject,rmqw); + + VtbVerificationSubjectCenter verificationSubjectCenter = new VtbVerificationSubjectCenter(); + verificationSubjectCenter.setEffectiveFlag(0); + vtbVerificationSubjectCenterService.update(verificationSubjectCenter,rmqw); +// verificationSubjectService.remove(rmqw); +// verificationChannelService.remove(rmqw); +// verificationChannelPointService.remove(rmqw); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void release(Long activityId,String userCode,Boolean throwEx,boolean checkState) { + + log.warn("费用释放 activityId:{}",activityId); + SysUser sysUser = sysUserService.getByAccount(userCode); + if(userCode.equals("0")){ + sysUser = new SysUser(); + sysUser.setCode("0"); + sysUser.setName("系统执行"); + sysUser.setId("0"); + } + if(sysUser==null){ + Assert.throwEx("用户编码不存在:"+userCode); + } + TbsActivity activity = activityService.getById(activityId); + BirActivityCenterGoodsUtil.buildBir(activity.getCostApplyId()); + //一般 checkState=true 普通核销 false是合并核销或者修复数据时使用 + if(checkState){ + if(ReleaseConst.UseFilter){ + if(!activity.getActivityState().equals(TbsActivityState.STATE_0_Todo)){ + if(!throwEx){ + return; + } + Assert.throwEx("活动状态非待核销状态,操作失败"); + } + } + } + if(activity.getCancelFlag().equals(1)){ + Assert.throwEx("异动的活动,无法操作"); + } + TbsCostApply costApply = costApplyService.getById(activity.getCostApplyId()); + + if(ReleaseConst.UseFilter){ + if(!costApply.getChargeState().equals(TbsCostApplyState.State_2_actioning.getCode())){ + Assert.throwEx("状态不支持释放活动费用"); + } + } + BigDecimal releaseAmount = BigDecimal.ZERO; + String errorMsg = null; + //一般 checkState=true 普通核销 false是合并核销或者修复数据时使用 + if(checkState){ + try { + releaseAmount = this.validActivity(costApply.getContractFlag()!=null + &&costApply.getContractFlag().equals(1),activity,false,false); + } catch (Exception e) { + errorMsg = e.getMessage(); + } + }else { + releaseAmount = this.getActivityReleaseAmt(activity); + } + if(StringUtils.hasText(errorMsg)){ + if(throwEx){ + Assert.throwEx(errorMsg); + } + return; + } + mainRelease(activityId, sysUser, activity, costApply, releaseAmount); + } + + @Override + public void mainRelease(Long activityId, SysUser sysUser, TbsActivity activity, TbsCostApply costApply, BigDecimal releaseAmount) { + TbsActivity param = new TbsActivity(); + param.setId(activityId); + param.setActivityState(TbsActivityState.STATE_4_Release); + param.setReleaseUserId(sysUser.getId()); + param.setReleaseUserName(sysUser.getName()); + param.setReleaseFlag(1); + param.setReleaseTime(LocalDateTime.now()); + param.setReleaseAmount(releaseAmount); + param.setFinishedFlag(1); + activityService.updateById(param); + + //移除历史记录 + 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(releaseAmount); + fundFlow.setSupplierId(activity.getSupplierId()); + fundFlow.setSupplierCode(activity.getSupplierCode()); + fundFlow.setSupplierName(activity.getSupplierName()); + fundFlowService.save(fundFlow); + + //保存预算日志 + 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()); + 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()); + TbsBudgetLog budgetLog = TbsBudgetLogBuildUtil.buildTbsBudgetLog(BudgetLogOptFlag.State_4, sysUser, costApply,currCostItem,currentBudget,amount, activity); + if(budgetLog.getOptUserId()==null){ + budgetLog.setOptUserId(sysUser.getId()); + budgetLog.setOptUserCode(sysUser.getCode()); + budgetLog.setOptUserName(sysUser.getName()); + } + budgetLogList.add(budgetLog); + } + //移除历史记录 + budgetLogService.remove(new LambdaQueryWrapper() + .eq(TbsBudgetLog::getCostApplyId, activity.getCostApplyId()) + .eq(TbsBudgetLog::getOptType,BudgetLogOptFlag.State_4.getCode()) + .eq(TbsBudgetLog::getActivityId, activity.getId()) + ); + //重新保存 + if(CollectionUtil.isNotEmpty(budgetLogList)){ + budgetLogService.saveBatch(budgetLogList); + } + //更新付款条件状态 + LambdaQueryWrapper updLqw = new LambdaQueryWrapper<>(); + updLqw.eq(TbsActivityPayCondition::getActivityId, activityId); + TbsActivityPayCondition payCondition = new TbsActivityPayCondition(); + payCondition.setFinishedFlag(1); + activityPayConditionService.update(payCondition,updLqw); + //如果为最后的活动,更变费用申请状态 + costApplyService.flushCostStatus(costApply.getId(), costApply.getContractFlag()!=null&& costApply.getContractFlag().equals(1)); + // 协议类申请请求OA取消释放拦截 + if(costApply.getContractFlag().equals(1)){ + R result = seeYonRequestBaseService.postBase(TbsSeeYonConst.API_CONTRACT_RELEASE + +"?id="+ costApply.getId() + +"&code="+ costApply.getCode(),null,"协议类申请取消释放"); + if(result==null||result.getStatus()==null||result.getStatus()!=200){ + Assert.throwEx("协议类取消释放时,调用OA失败"); + } + } + BirActivityCenterGoodsUtil.buildBir(costApply.getId()); + } + + + @Override + public void release(Long activityId,String userCode,Boolean throwEx) { + this.release(activityId,userCode,throwEx,true); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelRelease(Long activityId) { + TbsActivity activity = activityService.getById(activityId); + if(activity.getCancelFlag().equals(1)){ + Assert.throwEx("异动的活动,无法操作"); + } + TbsCostApply costApply = costApplyService.getById(activity.getCostApplyId()); + // 协议类申请请求OA取消释放拦截 + if(costApply.getContractFlag().equals(1)){ + R result = seeYonRequestBaseService.postBase(TbsSeeYonConst.API_CONTRACT_RELEASE_CANCEL + + "?id="+costApply.getId() + + "&code="+costApply.getCode() + ,null,"协议类申请取消释放"); + if(result==null||result.getStatus()==null||result.getStatus()!=200){ + Assert.throwEx("协议类取消释放时,调用OA失败"); + } + } + if(activity.getReleaseFlag().equals(1)){ + //还原活动状态 + TbsActivity param = new TbsActivity(); + param.setId(activityId); + param.setActivityState(TbsActivityState.STATE_0_Todo); + param.setReleaseUserId(""); + param.setReleaseUserName(""); + param.setReleaseFlag(0); + param.setReleaseTime(LocalDateTime.now()); + param.setReleaseAmount(BigDecimal.ZERO); + param.setFinishedFlag(0); + activityService.updateById(param); + + //还原费用申请状态 + costApply.setId(activity.getCostApplyId()); + costApply.setChargeState(TbsCostApplyState.State_2_actioning.getCode()); + costApplyService.updateById(costApply); + + //移除流水 + LambdaQueryWrapper flowLqw = new LambdaQueryWrapper<>(); + flowLqw.eq(VtbFundFlow::getFundType,VtbFundFlowType.Release); + flowLqw.eq(VtbFundFlow::getVerificationId,0); + flowLqw.eq(VtbFundFlow::getActivityId,activityId); + fundFlowService.remove(flowLqw); + //还原预算占用,移除释放的budgetLog + LambdaQueryWrapper logLqw = new LambdaQueryWrapper<>(); + logLqw.eq(TbsBudgetLog::getOptType,BudgetLogOptFlag.State_4.getCode()); + logLqw.eq(TbsBudgetLog::getActivityId,activityId); + budgetLogService.remove(logLqw); + + //更新付款条件状态 + LambdaQueryWrapper updLqw = new LambdaQueryWrapper<>(); + updLqw.eq(TbsActivityPayCondition::getActivityId,activityId); + TbsActivityPayCondition payCondition = new TbsActivityPayCondition(); + payCondition.setFinishedFlag(0); + activityPayConditionService.update(payCondition,updLqw); + BirActivityCenterGoodsUtil.buildBir(activity.getCostApplyId()); + }else { + Assert.throwEx("非释放的活动,无法操作"); + } + BirActivityCenterGoodsUtil.buildBir(activity.getCostApplyId()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public R freeze(TbsActivityReopenBo param) { + TbsActivity dbAct = activityService.getById(param.getActivityId()); + TbsCostApply costApply = costApplyService.getById(dbAct.getCostApplyId()); + if(!costApply.getChargeState().equals(TbsCostApplyState.State_2_actioning.getCode())){ + return R.error("因费用状态不支持编辑!!"); + } + if(!dbAct.getActivityState().equals(TbsActivityState.STATE_0_Todo) + &&!dbAct.getActivityState().equals(TbsActivityState.STATE_1_Baning)){ + return R.error("因活动状态不支持操作"); + } + if(dbAct.getCancelFlag().equals(1)){ + return R.error("异动的费用无法操作"); + } + BirActivityCenterGoodsUtil.buildBir(costApply.getId()); + TbsActivity activity = new TbsActivity(); + activity.setId(param.getActivityId()); + if(param.getState().equals(1)){ + //冻结 + activity.setActivityState(TbsActivityState.STATE_1_Baning); + }else { + //解冻 + activity.setReopenFlag(1); + activity.setReopenTime(LocalDateTime.now()); + if(this.checkCommitting(dbAct.getId())){ + activity.setActivityState(TbsActivityState.STATE_1_Checking); + }else { + activity.setActivityState(TbsActivityState.STATE_0_Todo); + } + } + activityService.updateById(activity); + return R.ok(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void commit(VtbVerificationBo verificationBo) { + TbsActivity activity = activityService.getById(verificationBo.getActivityId()); + TbsCostApply costApply = costApplyService.getById(activity.getCostApplyId()); + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + BmsSupplier supplier = bmsSupplierService.getById(activity.getSupplierId()); + if(!costApply.getCreateBy().equals(sysUser.getId()) + &&costApply.getExtUserId()!=null + &&!costApply.getExtUserId().equals(sysUser.getId())){ + Assert.throwEx("越权提交被拦截了"); + } + sysUser.checkSyAccount(); + redisService.throwResLock(VtbVerification.class.getSimpleName(),activity.getId()+""); + //自定义成本中心核销 + List subjectCenterBoList = verificationBo.getSubjectCenterList(); + boolean isCenterCheck = CollectionUtil.isNotEmpty(subjectCenterBoList); + if(activity.getVtbMatchTypeFlag().equals(1) && !isCenterCheck){ + Assert.throwEx("页面参数异常,请刷新页面重试"); + } + //校验费用申请的状态 + VerificationUtil.verifyCostState(costApply); + + LambdaQueryWrapper vtbVerificationLQW = new LambdaQueryWrapper<>(); + vtbVerificationLQW.eq(VtbVerification::getActivityId,verificationBo.getActivityId()); + vtbVerificationLQW.eq(VtbVerification::getVerificationState,VtbVerificationState.Commiting); + Long count = this.count(vtbVerificationLQW); + if(count>0){ + Assert.throwEx("该活动正在核销中"); + } + + VtbVerification orgData = null; + if(verificationBo.getOrgVerificationId()!=null){ + orgData = this.getById(verificationBo.getOrgVerificationId()); + if(!orgData.getVerificationState().equals(VtbVerificationState.Rollback.getCode())){ + Assert.throwEx("原来的核销数据非回退状态"); + } + } + String saleRegionId = supplier.handleSaleRegionId(); + BmsRegion saleRegion = regionMapper.selectById(saleRegionId); + String saleBizNames = saleRegion!=null?saleRegion.getPathNames():"null_申请时未录入"; + + String bizRegionId = supplier.handleBizRegionId(); + BmsRegion2 bizRegion = region2Mapper.selectById(bizRegionId); + String bizBizNames = bizRegion!=null?bizRegion.getPathNames():"null_申请时未录入"; + + //协议类申请 + PayWay payWay = null; + if(verificationBo.getPayWayId()!=null){ + payWay = payWayMapper.selectById(verificationBo.getPayWayId()); + } + if(payWay==null){ + Assert.throwEx("请选择支付方式"); + } + boolean cotractFlag = costApply.getContractFlag()!=null&&costApply.getContractFlag().equals(1); + if(cotractFlag){ + Assert.throwEx("协议类申请请移至OA核销"); + if(verificationBo.getPayConditionId()==null){ + Assert.throwEx("请选择支付条件"); + } + BigDecimal totalSubjectAmt = BigDecimal.ZERO; + if(isCenterCheck){ + List subjectCenterList = verificationBo.getSubjectCenterList(); + for (VtbVerificationSubjectCenterBo subjectCenterBo : subjectCenterList) { + for (VtbVerificationSubjectCenterBo.ChangeSubjectCenter subjectCenter : subjectCenterBo.getCenterAmount()) { + totalSubjectAmt = totalSubjectAmt.add(subjectCenter.getAmount()); + } + } + }else { + List subjectBoList = verificationBo.getSubjectList(); + for (VtbVerificationSubjectBo subjectBo : subjectBoList) { + totalSubjectAmt = totalSubjectAmt.add(subjectBo.getAmount()); + } + } + TbsActivityPayCondition payCondition = activityPayConditionService.getById(verificationBo.getPayConditionId()); + if(payCondition.getPaymentPrice().compareTo(totalSubjectAmt)>1){ + Assert.throwEx("核销金额超过支付条件金额"); + } + LambdaQueryWrapper vtbVerificationLqw = new LambdaQueryWrapper<>(); + vtbVerificationLqw.eq(VtbVerification::getPayConditionId,verificationBo.getPayConditionId()); + vtbVerificationLqw.eq(VtbVerification::getVerificationState,VtbVerificationState.Finished.getCode()); + List vtbVerificationList = this.list(vtbVerificationLqw); + if(vtbVerificationList.size()>0){ + Assert.throwEx("支付条件已核销"); + } + payCondition.setFinishedFlag(2); + activityPayConditionService.updateById(payCondition); + } + + //更变费用申请的活动状态 + TbsCostApply costApplyParam = new TbsCostApply(); + costApplyParam.setId(costApply.getId()); + costApplyParam.setCheckState(1); + costApplyService.updateById(costApplyParam); + + //退回的审批跳过校验 + boolean isCurrentCommit = verificationBo.getId()!=null; + validActivity(cotractFlag,activity,true,isCurrentCommit); + VtbVerification verification = new VtbVerification(); + verification.setId(verificationBo.getId()); + verification.setCostApplyCode(costApply.getCode()); + verification.setActivityCode(activity.getActivityCode()); + verification.setPayConditionId(verificationBo.getPayConditionId()); + verification.setVerificationCode("HX"+CodeGenUtil.generate(CodeGenUtil.SourceKey.Verification)); + verification.setVerificationMainCode(verification.getVerificationCode()); + verification.setVerificationState(VtbVerificationState.Commiting.getCode()); + verification.setCostApplyId(costApply.getId()); + verification.setActivityId(verificationBo.getActivityId()); + verification.setAttachIds(verificationBo.getAttachIds()); + verification.setInputReleaseFlag(verificationBo.getInputReleaseFlag()); + if(verificationBo.getInputReleaseFlag()!=null&&verificationBo.getInputReleaseFlag().equals(0)){ + verification.setRegReleaseFlag(1); + } + verification.setSupplierId(activity.getSupplierId()); + verification.setSupplierCode(activity.getSupplierCode()); + verification.setSupplierName(activity.getSupplierName()); + verification.setUserId(sysUser.getId()); + verification.setUserCode(sysUser.getCode()); + verification.setUserName(sysUser.getName()); + verification.setRemark(verificationBo.getRemark()); + verification.setWayId(payWay.getId()); + verification.setWayTitle(payWay.getTitle()); + verification.setSupplierBizRegionFirstName(costApply.getSupplierBizRegionFirstName()); + verification.setSupplierBizRegionSecondName(costApply.getSupplierBizRegionSecondName()); + verification.setSupplierBizRegionThirdName(costApply.getSupplierBizRegionThirdName()); + List channelBoList = verificationBo.getChannelList(); + List pointBoList = verificationBo.getPointList(); + List vtbVerificationChannelList = new ArrayList<>(); + List verificationChannelPointList = new ArrayList<>(); + if(CollectionUtil.isNotEmpty(channelBoList)){ + for (VtbVerificationChannelBo channelBo : channelBoList) { + BmsChannel channel = channelService.getById(channelBo.getChannelId()); + VtbVerificationChannel verificationChannel = new VtbVerificationChannel(); + verificationChannel.setActivityId(activity.getId()); + verificationChannel.setCostApplyId(costApply.getId()); + verificationChannel.setChannelId(channel.getId()); + verificationChannel.setChannelCode(channel.getChannelCode()); + verificationChannel.setChannelName(channel.getChannelName()); + verificationChannel.setChannelRate(channelBo.getChannelRate()); + verificationChannel.setPreCountPoint(channelBo.getPreCountPoint()); + verificationChannel.setRemark(channelBo.getRemark()); + vtbVerificationChannelList.add(verificationChannel); + } + }else if (CollectionUtil.isNotEmpty(pointBoList)){ + for (VtbVerificationChannelPointBo channelPointBo : pointBoList) { + BmsChannelPoint channelPoint = channelPointService.getById(channelPointBo.getPointId()); + if (channelPoint==null){ + Assert.throwEx("网点不存在"); + } + BmsChannel channel = channelService.getById(channelPoint.getChannelId()); + if (channel==null){ + Assert.throwEx("渠道不存在"); + } + VtbVerificationChannelPoint channelPoint1 = new VtbVerificationChannelPoint(); + channelPoint1.setCostApplyId(costApply.getId()); + channelPoint1.setActivityId(activity.getId()); + channelPoint1.setChannelId(channel.getId()); + channelPoint1.setChannelCode(channel.getChannelCode()); + channelPoint1.setChannelName(channel.getChannelName()); + channelPoint1.setPointId(channelPoint.getId()); + channelPoint1.setPointCode(channelPoint.getPointCode()); + channelPoint1.setPointName(channelPoint.getPointName()); + channelPoint1.setPointRate(channelPointBo.getPointRate()); + channelPoint1.setRemark(channelPointBo.getRemark()); + verificationChannelPointList.add(channelPoint1); + } + } + List verificationSubjects = new ArrayList<>(); + List verificationCenters = new ArrayList<>(); + String verificationCode = verification.getVerificationCode(); + if(isCenterCheck){ + //建立核销 VtbVerificationSubjectCenter + this.validCreateVeriSubjectAndCenter(activity, subjectCenterBoList, costApply, supplier, verificationSubjects, verificationCenters, verificationCode); + }else { + //建立核销 VtbVerificationSubject + verificationSubjects = this.validCreateVeriSubject(verificationCode,verificationBo, activity, costApply, supplier); + } + //设置总金额 + BigDecimal totalAmount = BigDecimal.ZERO; + for (VtbVerificationSubject verificationSubject : verificationSubjects) { + totalAmount = totalAmount.add(verificationSubject.getUsedAmount()); + } + verification.setAmount(totalAmount); + verification.setAmountRecord(totalAmount); + + //保存 + this.saveOrUpdate(verification); + this.commitSy(activity,sysUser,verification,saleBizNames,bizBizNames,supplier); + this.updateById(verification); + if(!StringUtils.hasText(verification.getSyFormId())||!StringUtils.hasText(verification.getSyFlowId())){ + Assert.throwEx("远程调用失败"); + } + //移除历史提交记录 + if(verificationBo.getId()!=null){ + verificationChannelService.removeByVerificationId(verificationBo.getId()); + verificationChannelPointService.removeByVerificationId(verificationBo.getId()); + verificationSubjectService.removeByVerificationId(verificationBo.getId()); + vtbVerificationSubjectCenterService.removeByVerificationId(verificationBo.getId()); + } + if(CollectionUtil.isNotEmpty(vtbVerificationChannelList)){ + vtbVerificationChannelList.forEach(obj->obj.setVerificationId(verification.getId())); + verificationChannelService.saveBatch(vtbVerificationChannelList); + } + if(CollectionUtil.isNotEmpty(verificationChannelPointList)){ + verificationChannelPointList.forEach(obj->obj.setVerificationId(verification.getId())); + verificationChannelPointService.saveBatch(verificationChannelPointList); + } + //保存科目费用 + verificationSubjects.forEach(obj->obj.setVerificationId(verification.getId())); + verificationCenters.forEach(obj->obj.setVerificationId(verification.getId())); + if(CollectionUtil.isNotEmpty(verificationCenters)){ + vtbVerificationSubjectCenterService.saveBatch(verificationCenters); + } + verificationSubjectService.saveBatch(verificationSubjects); + TbsActivity activityParam = new TbsActivity(); + activityParam.setId(activity.getId()); + activityParam.setActivityState(TbsActivityState.STATE_1_Checking); + activityParam.setCurrVerificationId(verification.getId()+""); + activityService.updateById(activityParam); + + //更新原来的核销为关闭 + if(orgData!=null){ + orgData.setVerificationState(VtbVerificationState.Close.getCode()); + vtbFundFlowService.removeByVerificationId(verification.getId()); + this.updateById(orgData); + } +// //记录核销状态到费用申请 +// costApply.setLogCheckState(costApply.getCheckState()); +// costApplyService.updateById(costApply); + //判断是否直接跳过审批的申请 + AsyncFactory.saveVtbSubmit( sysUser.getCode(),verification.getId(), totalAmount,false); + BirActivityCenterGoodsUtil.buildBir(costApply.getId()); + } + + + @Override + public void validCreateVeriSubjectAndCenter(TbsActivity activity, List subjectCenterBoList, + TbsCostApply costApply, BmsSupplier supplier, + List verificationSubjects, + List verificationCenters, String verificationCode) { + List activitySubjects = activitySubjectService.listByActivityId(activity.getId()); + List activityCenters = activityCenterService.listByActivity(activity.getId()); + List existFundFlowList = fundFlowService.listByActivity(activity.getId(), VtbFundFlowType.Verification); + Map> funFlowListMap = existFundFlowList.stream().collect(Collectors.groupingBy(VtbFundFlow::getSubjectId)); + //校验余额 + int countCode = 1; + for (VtbVerificationSubjectCenterBo subjectCenterBo : subjectCenterBoList) { + //科目总金额 + BmsSubject subject = subjectService.getById(subjectCenterBo.getSubjectId()); + BigDecimal totalSubjectAmt = BigDecimal.ZERO; + for (VtbVerificationSubjectCenterBo.ChangeSubjectCenter centerBo : subjectCenterBo.getCenterAmount()) { + BigDecimal centerAmt = centerBo.getAmount(); + if(centerAmt==null){ + Assert.throwEx("SubjectCenterId: "+centerBo.getSubjectCenterId()+" amount is null"); + } +// if (centerAmt.compareTo(BigDecimal.ZERO)==0){ +// //0核销,成本中心维度不进行保存 +// //continue; +// } + totalSubjectAmt = totalSubjectAmt.add(centerAmt); + //当前活动成本中心进行校验,再构建 + TbsActivityCenter currActivityCenter = null; + for (TbsActivityCenter activityCenter : activityCenters) { + if(activityCenter.getSubjectId().equals(subjectCenterBo.getSubjectId())&&activityCenter.getId().equals(centerBo.getSubjectCenterId())){ + currActivityCenter = activityCenter; + break; + } + } + if(currActivityCenter==null){ + Assert.throwEx("SubjectCenterId: "+centerBo.getSubjectCenterId()+" 不匹配"); + } + + //判断是否够核销 + BigDecimal surplus = currActivityCenter.getCenterAmount() + .subtract(currActivityCenter.getUsedAmount()) + .subtract(centerAmt); + if(surplus.compareTo(BigDecimal.ZERO)<0){ + log.warn("SubjectCenterId:{} 当前输入金额:{}",centerBo.getSubjectCenterId(),centerAmt); + Assert.throwEx("SubjectCenterId: "+centerBo.getSubjectCenterId()+" 金额不足"); + } + VtbVerificationSubjectCenter subjectCenter = new VtbVerificationSubjectCenter(); + subjectCenter.setVerificationSubCode(verificationCode +"_"+countCode); + subjectCenter.setCostApplyId(costApply.getId()); + subjectCenter.setActivityId(activity.getId()); + subjectCenter.setSubjectId(subject.getId()); + subjectCenter.setSubjectCode(subject.getSubjectCode()); + subjectCenter.setSubjectName(subject.getSubjectName()); + subjectCenter.setSupplierId(Long.parseLong(supplier.getId())); + subjectCenter.setSupplierCode(supplier.getCode()); + subjectCenter.setSupplierName(supplier.getName()); + subjectCenter.setUsedAmount(centerAmt); + subjectCenter.setUsedAmountRecord(centerAmt); + subjectCenter.setTotalCenterAmount(currActivityCenter.getCenterAmount()); + subjectCenter.setLastUsedAmount(currActivityCenter.getUsedAmount()); + subjectCenter.setCenterType(currActivityCenter.getCenterType()); + subjectCenter.setCenterId(currActivityCenter.getCenterId()); + subjectCenter.setCenterCode(currActivityCenter.getCenterCode()); + subjectCenter.setCenterName(currActivityCenter.getCenterName()); + subjectCenter.setActivityCenterId(currActivityCenter.getId()); + verificationCenters.add(subjectCenter); + } + boolean isCheckZero = totalSubjectAmt.compareTo(BigDecimal.ZERO)==0; + //忽略金额为0的数据 + if (!isCheckZero && totalSubjectAmt.compareTo(BigDecimal.ZERO) < 1) { + continue; + } + //判断是否超额 + TbsActivitySubject currentActivitySubject = null; + for (TbsActivitySubject activitySubject : activitySubjects) { + if (activitySubject.getSubjectId().equals(subject.getId())) { + currentActivitySubject = activitySubject; + break; + } + } + //兼容支持非0元核销 + if(!isCheckZero){ + List subjectFundFlowItems = funFlowListMap.get(subject.getId()); + BigDecimal totalSubjectUsedAmount = BigDecimal.ZERO; + if (CollectionUtil.isNotEmpty(subjectFundFlowItems)) { + for (VtbFundFlow subjectFundFlowItem : subjectFundFlowItems) { + totalSubjectUsedAmount = totalSubjectUsedAmount.add(subjectFundFlowItem.getUsedAmount()); + } + } + totalSubjectUsedAmount = totalSubjectUsedAmount.add(totalSubjectAmt); + if (totalSubjectUsedAmount.compareTo(currentActivitySubject.getAmount()) > 0) { + Assert.throwEx("费用类型[" + subject.getSubjectName() + "]超额"); + } + } + //保存费用结果 + VtbVerificationSubject verificationSubject = new VtbVerificationSubject(); + verificationSubject.setVerificationSubCode(verificationCode +"_"+countCode); + countCode++; + verificationSubject.setCostApplyId(costApply.getId()); + verificationSubject.setActivityId(activity.getId()); + verificationSubject.setSubjectId(subject.getId()); + verificationSubject.setSubjectCode(subject.getSubjectCode()); + verificationSubject.setSubjectName(subject.getSubjectName()); + verificationSubject.setSupplierId(Long.parseLong(supplier.getId())); + verificationSubject.setSupplierCode(supplier.getCode()); + verificationSubject.setSupplierName(supplier.getName()); + verificationSubject.setUsedAmount(totalSubjectAmt); + verificationSubject.setUsedAmountRecord(totalSubjectAmt); + verificationSubject.setTotalSubjectAmount(currentActivitySubject.getAmount()); + verificationSubject.setLastUsedAmount(currentActivitySubject.getUsedAmount()); + verificationSubject.setCountPerson(subjectCenterBo.getCountPerson()); + verificationSubject.setCountSession(subjectCenterBo.getCountSession()); + verificationSubject.setRemark(subjectCenterBo.getRemark()); + verificationSubject.setFormId(subjectCenterBo.getFormId()); + verificationSubject.setFormTitle(subjectCenterBo.getFormTitle()); + verificationSubject.setFormVersion(subjectCenterBo.getFormVersion()); + verificationSubject.setFormContext(subjectCenterBo.getFormContext()); + verificationSubject.setFormContextValue(subjectCenterBo.getFormContextValue()); + verificationSubjects.add(verificationSubject); + } + } + + + /** + * 提交到致远审批流程 + * @param activity + * @param sysUser + * @param verification + * @param saleRegionNames + * @param bizRegionNames + */ + private void commitSy(TbsActivity activity,SysUser sysUser,VtbVerification verification,String saleRegionNames,String bizRegionNames,BmsSupplier supplier){ + Map data = buildSeeYonVerificationData(activity, sysUser, verification, saleRegionNames, bizRegionNames,supplier); + String dataJson = JsonUtil.objectToJson(data); + log.warn("核销请求JSON,核销号:{}:{}",verification.getVerificationCode(),dataJson); + BaseCreateProcessBo createProcess = new BaseCreateProcessBo(); + createProcess.setTemplateCode(TbsSeeYonConst.CostCheckConf.Code()); + createProcess.setMemberLoginName(sysUser.getSyAccount()); + createProcess.setSubjectTitle(TbsSeeYonConst.PRE_TITLE_VERIFICATION + verification.getRemark()); + createProcess.setTargetId(verification.getId()+""); + createProcess.setDataJson(dataJson); + R flowIdResult = seeYonService.baseCreateProcess(createProcess); + if(flowIdResult.getStatus()!=200){ + Assert.throwEx("远程服务调用失败"); + } + String flowId = flowIdResult.getData(); + String formId = null; + R formIdResult = seeYonService.getFormId(TbsSeeYonConst.CostCheckConf.Code(),verification.getId()); + if(formIdResult.getStatus()==200){ + formId = formIdResult.getData(); + } + verification.setSyFlowId(flowId); + verification.setSyFormId(formId); + //创建流程后回调 + BaseCreateCallbackBo callbackBo = new BaseCreateCallbackBo(TbsSeeYonConst.CostCheckConf.Code(),verification.getId()+""); + seeYonService.createCallbackStatus(callbackBo); + } + + @Override + public Map buildSeeYonVerificationData(String activityId) { + SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); + + TbsActivity activity = activityService.getById(activityId); + BmsSupplier supplier = bmsSupplierService.getById(activity.getSupplierId()); + + String saleRegionId = supplier.handleSaleRegionId(); + BmsRegion saleRegion = regionMapper.selectById(saleRegionId); + String saleBizNames = saleRegion!=null?saleRegion.getPathNames():"null_申请时未录入"; + + String bizRegionId = supplier.handleBizRegionId(); + BmsRegion2 bizRegion = region2Mapper.selectById(bizRegionId); + String bizBizNames = bizRegion!=null?bizRegion.getPathNames():"null_申请时未录入"; + + VtbVerification temp = new VtbVerification(); + temp.setActivityId(activity.getId()); + temp.setSupplierName(supplier.getSupplierName()); + temp.setSupplierCode(supplier.getSupplierCode()); + temp.setAmount(activity.getTotalAmount().subtract(activity.getUsedAmount())); + return buildSeeYonVerificationData(activity,sysUser,temp,saleBizNames,bizBizNames,supplier); + } + + @NotNull + @Override + public Map buildSeeYonVerificationData(TbsActivity activity, SysUser sysUser, VtbVerification verification, String saleRegionNames, String bizRegionNames,BmsSupplier supplier) { + Map data = new HashMap<>(20); + data.put("costApplyCode", verification.getVerificationCode()); + data.put("applyUserCode", sysUser.getCode()); + data.put("applyUserName", sysUser.getName()); + data.put("supplierName", verification.getSupplierName()); + data.put("supplierCode", verification.getSupplierCode()); + data.put("title", activity.getActTitle()); + data.put("rowDate",DateUtils.format(LocalDateTime.now(), DateFormatString.DATE_TIME)); + data.put("rowState","03"); + data.put("orgId", verification.getId()); + data.put("targetId", verification.getId()); + data.put("targetCode", verification.getVerificationCode()); + data.put("exsp1",TbsSeeYonConst.CostCheckConf.Code()); + data.put("jinE", verification.getAmount().toString()); + data.put("money", verification.getAmount().toString()); + + TbsCostApply costApply = costApplyService.getById(activity.getCostApplyId()); + data.put("templateId", costApply.getTemplateId()); + data.put("templateName", costApply.getTemplateTitle()); + data.put("supplierArea",supplier.getComRegion()); + + //核销拓展时间信息 + //activityQuarter 活动期间所属季度 + //activityMonth 活动期间所属月份 + //activityYear 活动期间所属年份 + try { + data.put("activityQuarter", QuarterUtil.getQuarterNumber(activity.getActStartDate().getMonthValue())); + data.put("activityMonth",activity.getActStartDate().getMonthValue()); + data.put("activityYear", activity.getActStartDate().getYear()); + } catch (Exception e) { + log.warn("核销时设置时间信息失败,活动:{}",JsonUtil.objectToJson(activity)); + } + + //读取费用申请时的费率 +// LambdaQueryWrapper costPercentLambdaQueryWrapper = new LambdaQueryWrapper<>(); +// costPercentLambdaQueryWrapper.eq(TbsCostPercent::getCostApplyId, activity.getCostApplyId()); +// List costPercentList = costPercentMapper.selectList(costPercentLambdaQueryWrapper); +// if(costPercentList.size()>0){ +// TbsCostPercent costPercent = costPercentList.get(0); +// data.put("ytdCusExpenseRate",costPercent.getYtdCustomerPercent()); +// data.put("ytdEmpExpenseRate",costPercent.getYtdUserPercent()); +// data.put("ytdAdminiExpenseRate",costPercent.getYtdRegionPercent()); +// data.put("ytdSalesExpenseRate",costPercent.getYtdRegion2Percent()); +// data.put("cusExpenseRate",costPercent.getQtdCustomerPercent()); +// data.put("empExpenseRate",costPercent.getQtdUserPercent()); +// data.put("salesExpenseRate",costPercent.getQtdRegionPercent()); +// data.put("adminiExpenseRate",costPercent.getQtdRegion2Percent()); +// data.put("budgetExpenseRate",costPercent.getQtdBudgetPercent()); +// data.put("ytdBudgetExpenseRate",costPercent.getYtdBudgetPercent()); +// } + //读取费费率 + TbsCostApply tbsCostApply = costApplyService.getById(activity.getCostApplyId()); + costApplyService.buildMainData4ROI(tbsCostApply,data); + + //拓展添加审批关联 + data.put("biz_region", bizRegionNames); + data.put("exsp2", saleRegionNames); + data.put("data_state",TbsActivityState.STATE_1_Checking); + + //添加跳转地址业务 + String urlKey = "exsp5"; + String baseJumpUrl = JumpToUtil.getJumpUrl(projectProperties.getWebUrl(),TbsSeeYonConst.CostCheckConf.Code(), verification.getId()+""); + data.put("exsp5",urlKey); + data.put("cmsLink",baseJumpUrl); + + //添加客户标签 + List tags = tagInfoMapper.lisTagsBySupplierCode(activity.getSupplierCode()); + data.put("tags",tags); + + List subjectList = activitySubjectService.listByActivityId(activity.getId()); + List subjectDTOList = new ArrayList<>(); + for (TbsActivitySubject activitySubject : subjectList) { + VtbSubjectDTO subjectDTO = new VtbSubjectDTO(); + subjectDTO.setKeMuName(activitySubject.getSubjectName()); + subjectDTOList.add(subjectDTO); + } + + List subList = new ArrayList<>(); + boolean hasCenter = false; + try { + List activityCenter = activityCenterService.listByActivity(verification.getActivityId()); + for(TbsActivityCenter center : activityCenter){ + TbsCostSubItem.CostCenterTranStr costCenter = BirHttpUtil.buildCostCenter(center.getCenterType(),center.getCenterId(),center.getCenterName(),activity.getSupplierCode()); + if(costCenter==null ){ + log.error("BIR 成本中心缺失(核销):{},{},{},{}", + center.getCenterType(), + center.getCenterId(), + center.getCenterName(), + activity.getSupplierCode()); + } + if(costCenter==null){ + costCenter.setChengBenZhongXin(center.getCenterName()); + costCenter.setChengBenZhongXinId(center.getCenterType()+"-"+center.getId()); + } + subList.add(costCenter); + hasCenter = true; + } + } catch (Exception e) { + e.printStackTrace(); + } + if (!hasCenter){ + Assert.throwEx("成本中心获取异常,请联系IT负责人"); + } + subList.addAll(subjectDTOList); + data.put("sub",subList); + return data; + } + + + /** + * 校验活动 + * @param activity + * @param filterActTime 拦截活动结束 + * @param isCurrentCommit 是否当前活动占用提交 + * @return 可用费用 + */ + @Override + public BigDecimal validActivity(boolean cotractFlag,TbsActivity activity,boolean filterActTime,boolean isCurrentCommit){ + LocalDate nowDate = LocalDate.now(); + boolean isOverTime = + (activity.getPreCheckDate()!=null&&nowDate.isAfter(activity.getPreCheckDate())&&activity.getPreEndDateBack()==null) + ||(activity.getPreEndDateBack()!=null&&nowDate.isAfter(activity.getPreEndDateBack())); + if(ReleaseConst.UseFilter){ + if(!cotractFlag && activity.getReopenFlag().equals(0) + && filterActTime + && isOverTime){ + Assert.throwEx("活动["+activity.getActivityCode()+"]已结束"); + } + if(activity.getActivityState().equals(TbsActivityState.STATE_1_Baning)){ + Assert.throwEx("活动["+activity.getActivityCode()+"]冻结中"); + } + if((activity.getReleaseFlag()!=null&&activity.getReleaseFlag().equals(1))||activity.getActivityState().equals(TbsActivityState.STATE_4_Release)){ + Assert.throwEx("费用["+activity.getActivityCode()+"]已释放"); + } + if(activity.getFinishedFlag().equals(1)){ + Assert.throwEx("活动["+activity.getActivityCode()+"]已完成"); + } + if(!isCurrentCommit){ + boolean isCommitting = this.checkCommitting(activity.getId()); + if(isCommitting){ + Assert.throwEx("活动["+activity.getActivityCode()+"]核销中,操作失败"); + } + } + } + return getActivityReleaseAmt(activity); + } + + @NotNull + private BigDecimal getActivityReleaseAmt(TbsActivity activity) { + List fundFlowList = fundFlowService.listByActivity(activity.getId(),VtbFundFlowType.Verification); + BigDecimal totalFunFlow = BigDecimal.ZERO; + for (VtbFundFlow fundFlow : fundFlowList) { + totalFunFlow = totalFunFlow.add(fundFlow.getUsedAmount()); + } + BigDecimal allowAmount = activity.getTotalAmount().subtract(totalFunFlow); + if(allowAmount.compareTo(BigDecimal.ZERO)<0){ + log.error("无可用费用 activity id:{} code:{}", activity.getId(), activity.getActivityCode()); + Assert.throwEx("无可用费用"); + } + return allowAmount; + } + + /** + * 校验和生成核销费用 + * @param verificationBo + * @param activity + * @param costApply + * @return + */ + @Override + public List validCreateVeriSubject(String verificationCode,VtbVerificationBo verificationBo, + TbsActivity activity, TbsCostApply costApply,BmsSupplier supplier) { + List verificationSubjects = new ArrayList<>(); + List activitySubjects = activitySubjectService.listByActivityId(activity.getId()); + List existFundFlowList = fundFlowService.listByActivity(activity.getId(), VtbFundFlowType.Verification); + //校验余额 + Map> funFlowListMap = existFundFlowList.stream().collect(Collectors.groupingBy(VtbFundFlow::getSubjectId)); + List subjectBoList = verificationBo.getSubjectList(); + int countCode = 1; + for (VtbVerificationSubjectBo subjectBo : subjectBoList) { + boolean isCheckZero = subjectBo.getAmount().compareTo(BigDecimal.ZERO)==0; + //忽略金额为0的数据 + if ( !isCheckZero && subjectBo.getAmount() != null && subjectBo.getAmount().compareTo(BigDecimal.ZERO) < 1) { + continue; + } + BmsSubject subject = subjectService.getById(subjectBo.getSubjectId()); + //判断是否超额 + TbsActivitySubject currentActivitySubject = null; + for (TbsActivitySubject activitySubject : activitySubjects) { + if (activitySubject.getSubjectId().equals(subject.getId())) { + currentActivitySubject = activitySubject; + break; + } + } + //兼容支持非0元核销 + if(!isCheckZero){ + List subjectFundFlowItems = funFlowListMap.get(subject.getId()); + BigDecimal totalSubjectUsedAmount = BigDecimal.ZERO; + if (CollectionUtil.isNotEmpty(subjectFundFlowItems)) { + for (VtbFundFlow subjectFundFlowItem : subjectFundFlowItems) { + totalSubjectUsedAmount = totalSubjectUsedAmount.add(subjectFundFlowItem.getUsedAmount()); + } + } + totalSubjectUsedAmount = totalSubjectUsedAmount.add(subjectBo.getAmount()); + if (totalSubjectUsedAmount.compareTo(currentActivitySubject.getAmount()) > 0) { + Assert.throwEx("费用类型[" + subject.getSubjectName() + "]超额"); + } + } + + //保存费用结果 + VtbVerificationSubject verificationSubject = new VtbVerificationSubject(); + verificationSubject.setVerificationSubCode(verificationCode+"_"+countCode); + countCode++; + verificationSubject.setCostApplyId(costApply.getId()); + verificationSubject.setActivityId(activity.getId()); + verificationSubject.setSubjectId(subject.getId()); + verificationSubject.setSubjectCode(subject.getSubjectCode()); + verificationSubject.setSubjectName(subject.getSubjectName()); + verificationSubject.setSupplierId(Long.parseLong(supplier.getId())); + verificationSubject.setSupplierCode(supplier.getCode()); + verificationSubject.setSupplierName(supplier.getName()); + verificationSubject.setUsedAmount(subjectBo.getAmount()); + verificationSubject.setUsedAmountRecord(subjectBo.getAmount()); + verificationSubject.setCountPerson(subjectBo.getCountPerson()); + verificationSubject.setCountSession(subjectBo.getCountSession()); + verificationSubject.setRemark(subjectBo.getRemark()); + verificationSubject.setFormId(subjectBo.getFormId()); + verificationSubject.setFormTitle(subjectBo.getFormTitle()); + verificationSubject.setFormVersion(subjectBo.getFormVersion()); + verificationSubject.setFormContext(subjectBo.getFormContext()); + verificationSubject.setFormContextValue(subjectBo.getFormContextValue()); + verificationSubjects.add(verificationSubject); + } + return verificationSubjects; + } + + @Override + public void successCommit(Long verificationId, boolean toPay) { + log.info("活动核销提交成功。verificationId:{}",verificationId); + VtbVerification verification = this.getById(verificationId); + if(verification.getVerificationState()>1){ + log.warn("活动核销已提交成功,请勿重复提交。verificationId:{}",verificationId); + return; + } + boolean checkZero = verification.getAmount().compareTo(BigDecimal.ZERO)==0; + + List subjectCenterList = vtbVerificationSubjectCenterService.listByVerificationId(verificationId); + boolean isCenterCommit = subjectCenterList.size()>0; + //0元核销只改变状态 + if(checkZero){ + //自动分配刷新金额(旧流程按比例分配,新流程按比例分配后,进行再分配) + fundFlowService.flushActivityAmount(verification.getActivityId()); + verification = new VtbVerification(); + verification.setId(verificationId); + verification.setVerificationState(VtbVerificationState.Finished.getCode()); + verification.setFinishedTime(LocalDateTime.now()); + super.updateById(verification); + + //更新释放的核销(单个核销外层有释放,批量没有在这里补充) + if(verification.getBatchId()!=null + &&verification.getRegReleaseFlag()!=null + &&verification.getRegReleaseFlag().equals(1)){ + //更新活动状态 + SysUser sysUser = sysUserService.getById(verification.getRegReleaseUserId()); + if(sysUser==null){ + sysUser = new SysUser(); + sysUser.setCode("0"); + sysUser.setName("系统执行"); + } + this.release(verification.getActivityId(),sysUser.getCode(),true,false); + } + + return; + } + TbsActivity activity = activityService.getById(verification.getActivityId()); + TbsCostApply costApply = costApplyService.getById(activity.getCostApplyId()); + //移除历史数据 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(VtbFundFlow::getVerificationId,verificationId); + fundFlowService.remove(lqw); + List verificationSubjects = verificationSubjectService.listByVerificationId(verification.getId()); + List activityCenterGoodsAllList = activityCenterGoodsService.listByActivityId(verification.getActivityId()); + List activityCenterList = activityCenterService.listByActivity(verification.getActivityId()); + //生成费用流水记录 + Map> centerGoodsMapBySubject = activityCenterGoodsAllList.stream() + .collect(Collectors.groupingBy(TbsActivityCenterGoods::getSubjectId)); + Map> centerMapBySubject = activityCenterList.stream() + .collect(Collectors.groupingBy(TbsActivityCenter::getSubjectId)); + List addFundFlowList = new ArrayList<>(); + + boolean hasPayOneTimes = false; + + for (VtbVerificationSubject verificationSubject : verificationSubjects) { + Long subjectId = verificationSubject.getSubjectId(); + BigDecimal usedAmount = verificationSubject.getUsedAmount(); + List activityCenterGoodsOfSubject = centerGoodsMapBySubject.get(subjectId); + if(!toPay&&activityCenterGoodsOfSubject==null){ + log.warn("活动核销档案有异常。verificationId:{}",verificationId); + return; + } + Map> activityGoodsOfSubjectCenter = activityCenterGoodsOfSubject.stream() + .collect(Collectors.groupingBy(obj->obj.getCenterType()+":"+obj.getCenterId())); + + List activityCenters = centerMapBySubject.get(subjectId); + //统计最后一项为减法 + BigDecimal preCenterAmount = BigDecimal.ZERO; + for (int i = 0; i < activityCenters.size(); i++) { + TbsActivityCenter activityCenter = activityCenters.get(i); + String subjectCenterKey = activityCenter.getCenterType()+":"+activityCenter.getCenterId(); + List activityGoodsListOfSubjectCenter = activityGoodsOfSubjectCenter.get(subjectCenterKey); + //当前成本中心分配金额 + BigDecimal currentCenterAmount = BigDecimal.ZERO; + if(isCenterCommit){ + //刷洗自定义成本中心金额 + for (VtbVerificationSubjectCenter subjectCenter : subjectCenterList) { + if(subjectCenter.getActivityCenterId().equals(activityCenter.getId())){ + currentCenterAmount = subjectCenter.getUsedAmount(); + } + } + }else { + //按比例分配 + if(i == activityCenters.size()-1){ + currentCenterAmount = usedAmount.subtract(preCenterAmount); + }else { + currentCenterAmount = usedAmount.multiply(activityCenter.getCenterRate()) + .divide(new BigDecimal("100"), RoundingMode.HALF_DOWN) + .setScale(2, RoundingMode.DOWN); + preCenterAmount = preCenterAmount.add(currentCenterAmount); + } + } + buildFundFlows(verificationId, addFundFlowList, activityGoodsListOfSubjectCenter,currentCenterAmount); + } + + //调用支付接口 + BmsSubject subject = new BmsSubject(); + subject.setSubjectCode(verificationSubject.getSubjectCode()); + subject.setSubjectName(verificationSubject.getSubjectName()); + BmsSupplier supplier = new BmsSupplier(); + supplier.setCode(activity.getSupplierCode()); + supplier.setName(activity.getSupplierName()); + //测试单号 + boolean isDevData = verification.getVerificationCode().contains("TEST"); + + //协议类的核销,不需要调用支付接口 + if(!costApply.getContractFlag().equals(1) + && toPay + && !isDevData){ + //hasPayOneTimes 标记只保存一次支付 + if(!hasPayOneTimes){ + hasPayOneTimes = true; + log.warn("核销去支付:{}",verification.getVerificationCode()); + String COST_TO_PAY_API = projectApisProperties.getCostToPay(); + String json = ThirtyVerificationUtil.buildJson(supplier, subject, verification.getAmount() + , activity,activity.getActStartDate().atStartOfDay(),activity.getActEndDate().atTime(23,59,59), verification); + SysSyncLog syncLog = ThirtyVerificationUtil.requestToPayment("to支付请求",verification.getVerificationCode(), COST_TO_PAY_API, json); + syncLog.setTodoState(1); + sysSyncLogService.save(syncLog); + } + } + } + + fundFlowService.saveBatch(addFundFlowList); + //fundFlow绑定考核期项,用于合计预算使用情况 + LambdaQueryWrapper subjectLqw = new LambdaQueryWrapper<>(); + subjectLqw.eq(VtbVerificationSubject::getVerificationId,verificationId); + VtbVerificationSubject subjectParam = new VtbVerificationSubject(); + subjectParam.setEffectiveFlag(1); + //fundFlowService.flushActivityAmount() 必须把FundFlow操作前置 + //更新已用费用记录,并更新活动状态是否完成(旧流程按比例分配,新流程按比例分配后,进行再分配) + fundFlowService.flushActivityAmount(verification.getActivityId(),verification.getRegReleaseFlag()); + verificationSubjectService.update(subjectParam,subjectLqw); + //更新成本中心维度 + if(isCenterCommit){ + LambdaQueryWrapper subjectCenterLqw = new LambdaQueryWrapper<>(); + subjectCenterLqw.eq(VtbVerificationSubjectCenter::getVerificationId,verificationId); + VtbVerificationSubjectCenter centerUpdParam = new VtbVerificationSubjectCenter(); + centerUpdParam.setVerificationId(verificationId); + centerUpdParam.setEffectiveFlag(1); + vtbVerificationSubjectCenterService.update(centerUpdParam,subjectCenterLqw); + //更新活动状态 + TbsActivity activityUpdate = new TbsActivity(); + activityUpdate.setVtbMatchTypeFlag(1); + activityUpdate.setId(verification.getActivityId()); + activityService.updateById(activityUpdate); + } + //更新释放的核销 + if(verification.getRegReleaseFlag()!=null + &&verification.getRegReleaseFlag().equals(1)){ + //更新活动状态 + SysUser sysUser = sysUserService.getById(verification.getRegReleaseUserId()); + if(sysUser==null){ + sysUser = new SysUser(); + sysUser.setCode("0"); + sysUser.setName("系统执行"); + } + this.release(verification.getActivityId(),sysUser.getCode(),true,false); + } + + BigDecimal totalCostApplyUsed = costApplyService.totalCostUsed(activity.getCostApplyId()); + TbsCostApply updCost = new TbsCostApply(); + updCost.setId(costApply.getId()); + updCost.setChargeState(TbsCostApplyState.State_2_actioning.getCode()); + updCost.setTotalActivityUsedAmount(totalCostApplyUsed); + if(costApply.getTotalActivityAmount().compareTo(totalCostApplyUsed)<=0){ + //金额是否用完 + log.info("费用申请完成:{} , 金额用完",costApply.getCode()); + updCost.setChargeState(TbsCostApplyState.State_3_finished.getCode()); + updCost.setPassTime(LocalDateTime.now()); + }else if (costApply.getContractFlag()!=null&&costApply.getContractFlag().equals(1)){ + //判断是否满足所有协议 + Long countPayTimes = activityPayConditionMapper.sumActivityPayTimes(activity.getId()); + Long countCheckItems = activityPayConditionMapper.sumFinishedCheck(activity.getId()); + if(countCheckItems==null){ + countCheckItems = 0L; + } + if(countPayTimes==null){ + log.warn("错误数据,支付条件统计异常 actId:{}",activity.getId()); + countPayTimes = 0L; + } + if(countPayTimes>1L && countPayTimes <= countCheckItems){ + log.info("费用申请完成:{} , 所有协议类完成",costApply.getCode()); + updCost.setChargeState(TbsCostApplyState.State_3_finished.getCode()); + updCost.setPassTime(LocalDateTime.now()); + } + }else { + //所有活动完成 + List activityList = activityService.listByCostApplyId(costApply.getId()); + boolean updateChargeState = true; + for (TbsActivity tbsActivity : activityList) { + if(!tbsActivity.getActivityState().equals(TbsActivityState.STATE_4_Release) + &&!tbsActivity.getActivityState().equals(TbsActivityState.STATE_1_Finished)){ + updateChargeState = false; + break; + } + } + if(updateChargeState){ + log.info("费用申请完成:{} , 所有活动完成",costApply.getCode()); + updCost.setChargeState(TbsCostApplyState.State_3_finished.getCode()); + updCost.setPassTime(LocalDateTime.now()); + } + } + costApplyService.updateById(updCost); + BirActivityCenterGoodsUtil.buildBir(updCost.getId()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void successCommit(Long verificationId) { + this.successCommit(verificationId,true); + + } + + /** + * 建立流水列表 + * @param verificationId + * @param addFundFlowList + * @param activityCenterGoodsOfSubject + * @param usedAmount 成本中心维度 + */ + private void buildFundFlows(Long verificationId, + List addFundFlowList, + List activityCenterGoodsOfSubject, + BigDecimal usedAmount) { + List addFundFlowListOfSubject = new ArrayList<>(); + List centerGoodsIds = activityCenterGoodsOfSubject.stream().map(TbsActivityCenterGoods::getId).collect(Collectors.toList()); + List lastUsedList = vtbFundFlowMapper.listActivityCenterGoodsUsed(centerGoodsIds); + //统计不匹配金额 + for (int i = 0; i < activityCenterGoodsOfSubject.size(); i++) { + TbsActivityCenterGoods centerGoods = activityCenterGoodsOfSubject.get(i); + BigDecimal currentTimeAmount; + if(i==activityCenterGoodsOfSubject.size()-1){ + BigDecimal totalPrefixAmount = BigDecimal.ZERO; + for (VtbFundFlow fundFlow : addFundFlowListOfSubject) { + totalPrefixAmount = totalPrefixAmount.add(fundFlow.getUsedAmount()); + } + currentTimeAmount = usedAmount.subtract(totalPrefixAmount); + }else { + currentTimeAmount = usedAmount.multiply(centerGoods.getCenterGoodsRate()) + //.multiply(centerGoods.getCenterRate()) + //四舍五入保留两位小数 + .divide(new BigDecimal("100"), RoundingMode.HALF_DOWN) + .setScale(2, RoundingMode.DOWN);; + } + BigDecimal lastUsed = BigDecimal.ZERO; + for (AmountDTO amountDTO : lastUsedList) { + if(amountDTO.getId().equals(centerGoods.getId()+"")){ + lastUsed = amountDTO.getAmount(); + break; + } + } + centerGoods.setUsedAmount(currentTimeAmount.add(lastUsed)); + activityCenterGoodsService.updateById(centerGoods); + VtbFundFlow fundFlow = CopierUtil.copy(centerGoods,new VtbFundFlow()); + fundFlow.setId(null); + fundFlow.setUsedAmount(currentTimeAmount); + fundFlow.setFundType(VtbFundFlowType.Verification); + fundFlow.setVerificationId(verificationId); + fundFlow.setCenterGoodItemId(centerGoods.getId()); + addFundFlowListOfSubject.add(fundFlow); + } + addFundFlowList.addAll(addFundFlowListOfSubject); + } + + + @Override + public boolean checkCommitting(Long activityId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(VtbVerification::getActivityId,activityId); + lqw.eq(VtbVerification::getVerificationState, VtbVerificationState.Commiting.getCode()); + return this.count(lqw)>0; + } + + @Override + public void toPayRequest() { + String COST_TO_PAY_API = projectApisProperties.getCostToPay(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SysSyncLog::getFromPlat,"to支付请求") + .eq(SysSyncLog::getSuccessStatus,0) + .eq(SysSyncLog::getTodoState,1) + .notLike(SysSyncLog::getFailReason,"已存在支付") + //重试两次 + .lt(SysSyncLog::getTryTimes,3); + List sysSyncLogs = sysSyncLogService.list(lqw); + for (SysSyncLog syncLog : sysSyncLogs) { + SysSyncLog syncLogBack = ThirtyVerificationUtil.requestToPayment("to支付请求",syncLog.getRemark(), COST_TO_PAY_API, syncLog.getRequestJson()); + if(syncLogBack.getSuccessStatus()!=null&&syncLogBack.getSuccessStatus().equals(1)){ + syncLog.setSuccessStatus(1); + sysSyncLogService.updateById(syncLog); + }else { + syncLog.setFailReason(syncLogBack.getFailReason()+""); + syncLog.setTryTimes(syncLog.getTryTimes()+1); + syncLog.setUpdateTime(null); + sysSyncLogService.updateById(syncLog); + } + } + } + + @Override + public void toPayRequest(Long verificationId) { + + List verificationSubjects = verificationSubjectService.listByVerificationId(verificationId); + + VtbVerification verification = this.getById(verificationId); + TbsActivity activity = activityService.getById(verification.getActivityId()); + //调用支付接口 + BmsSubject subject = new BmsSubject(); + BmsSupplier supplier = new BmsSupplier(); + supplier.setCode(activity.getSupplierCode()); + supplier.setName(activity.getSupplierName()); + + //无可用金额 + if(verification.getAmount().compareTo(BigDecimal.ZERO)<=0){ + return; + } + + LambdaQueryWrapper logLqw = new LambdaQueryWrapper<>(); + logLqw.eq(SysSyncLog::getFailReason,"{\"status\":500,\"message\":\"已存在支付信息,不能修改\",\"data\":null}"); + logLqw.like(SysSyncLog::getRemark,"["+verification.getVerificationCode()+"]"); + long count = sysSyncLogService.count(logLqw); + if (count>0){ + return; + } + for (VtbVerificationSubject verificationSubject : verificationSubjects) { + subject.setSubjectCode(verificationSubject.getSubjectCode()); + subject.setSubjectName(verificationSubject.getSubjectName()); + String COST_TO_PAY_API = projectApisProperties.getCostToPay(); + String json = ThirtyVerificationUtil.buildJson(supplier, subject, verification.getAmount() + , activity,activity.getActStartDate().atStartOfDay(),activity.getActEndDate().atTime(23,59,59), verification); + SysSyncLog syncLog = ThirtyVerificationUtil.requestToPayment("to支付请求",verification.getVerificationCode(), COST_TO_PAY_API, json); + syncLog.setTodoState(1); + sysSyncLogService.save(syncLog); + //因为保存是总金额,只保存一次支付即可 + break; + } + + + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationSubjectCenterServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationSubjectCenterServiceImpl.java new file mode 100644 index 0000000..44d7e7f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationSubjectCenterServiceImpl.java @@ -0,0 +1,54 @@ +package com.qs.serve.modules.vtb.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubjectCenter; +import com.qs.serve.modules.vtb.service.VtbVerificationSubjectCenterService; +import com.qs.serve.modules.vtb.mapper.VtbVerificationSubjectCenterMapper; + +import java.util.List; + +/** + * 核销成本中心费用 服务实现类 + * @author YenHex + * @since 2023-11-28 + */ +@Slf4j +@Service +@AllArgsConstructor +public class VtbVerificationSubjectCenterServiceImpl extends ServiceImpl implements VtbVerificationSubjectCenterService { + + @Override + public void removeByVerificationId(Long verificationId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(VtbVerificationSubjectCenter::getVerificationId,verificationId); + this.remove(lqw); + } + + @Override + public List listByVerificationId(Long id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(VtbVerificationSubjectCenter::getVerificationId,id); + return this.list(lqw); + } + + @Override + public List listByActivityId(Long id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(VtbVerificationSubjectCenter::getActivityId,id); + return this.list(lqw); + } + + @Override + public List listEffectiveByActivityId(Long id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(VtbVerificationSubjectCenter::getActivityId,id); + lqw.eq(VtbVerificationSubjectCenter::getEffectiveFlag,1); + return this.list(lqw); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationSubjectServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationSubjectServiceImpl.java new file mode 100644 index 0000000..2ffbf4e --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationSubjectServiceImpl.java @@ -0,0 +1,45 @@ +package com.qs.serve.modules.vtb.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; +import com.qs.serve.modules.vtb.service.VtbVerificationSubjectService; +import com.qs.serve.modules.vtb.mapper.VtbVerificationSubjectMapper; + +import java.util.List; + +/** + * 核销科目费用 服务实现类 + * @author YenHex + * @since 2022-11-24 + */ +@Slf4j +@Service +@AllArgsConstructor +public class VtbVerificationSubjectServiceImpl extends ServiceImpl implements VtbVerificationSubjectService { + + @Override + public List listByVerificationId(Long verificationId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(VtbVerificationSubject::getVerificationId,verificationId); + return this.list(lqw); + } + + @Override + public void removeByVerificationId(Long verificationId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(VtbVerificationSubject::getVerificationId,verificationId); + this.remove(lqw); + } + + @Override + public VtbVerificationSubject getByVerificationSubjectCode(String verificationSubjectCode) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(VtbVerificationSubject::getVerificationSubCode,verificationSubjectCode); + return this.getOne(lqw); + } +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationYardCenterItemServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationYardCenterItemServiceImpl.java new file mode 100644 index 0000000..ecf8656 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationYardCenterItemServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.vtb.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.vtb.entity.VtbVerificationYardCenterItem; +import com.qs.serve.modules.vtb.service.VtbVerificationYardCenterItemService; +import com.qs.serve.modules.vtb.mapper.VtbVerificationYardCenterItemMapper; + +/** + * 核销审批线明细 服务实现类 + * @author YenHex + * @since 2023-11-28 + */ +@Slf4j +@Service +@AllArgsConstructor +public class VtbVerificationYardCenterItemServiceImpl extends ServiceImpl implements VtbVerificationYardCenterItemService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationYardItemServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationYardItemServiceImpl.java new file mode 100644 index 0000000..a2d5f3a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationYardItemServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.vtb.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.vtb.entity.VtbVerificationYardItem; +import com.qs.serve.modules.vtb.service.VtbVerificationYardItemService; +import com.qs.serve.modules.vtb.mapper.VtbVerificationYardItemMapper; + +/** + * 核销审批线明细 服务实现类 + * @author YenHex + * @since 2023-02-14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class VtbVerificationYardItemServiceImpl extends ServiceImpl implements VtbVerificationYardItemService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationYardServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationYardServiceImpl.java new file mode 100644 index 0000000..cf7429c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/vtb/service/impl/VtbVerificationYardServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.vtb.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.vtb.entity.VtbVerificationYard; +import com.qs.serve.modules.vtb.service.VtbVerificationYardService; +import com.qs.serve.modules.vtb.mapper.VtbVerificationYardMapper; + +/** + * 核销审批线 服务实现类 + * @author YenHex + * @since 2023-02-14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class VtbVerificationYardServiceImpl extends ServiceImpl implements VtbVerificationYardService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/api/WxMpJsapiApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/api/WxMpJsapiApi.java new file mode 100644 index 0000000..98969ea --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/api/WxMpJsapiApi.java @@ -0,0 +1,38 @@ +package com.qs.serve.modules.wx.api; + +import com.qs.serve.modules.wx.common.conf.WxMpConfig; +import lombok.AllArgsConstructor; +import me.chanjar.weixin.common.bean.WxJsapiSignature; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + + +/** + * API 微信公众号JSAPI + * @author YenHex + * @since 2022-03-07 + */ +@AllArgsConstructor +//@RestController +//@RequestMapping("/api/mp/jsapi/{appid}") +public class WxMpJsapiApi { + @Autowired(required = false) + private WxMpConfig wxMpConfig; + + /** + * 获取票据 + * @param appid + * @return + * @throws WxErrorException + */ + @GetMapping("/getJsapiTicket") + public String getJsapiTicket(@PathVariable String appid) throws WxErrorException { + final WxJsapiSignature jsapiSignature = wxMpConfig.wxMpService().switchoverTo(appid).createJsapiSignature("111"); + System.out.println(jsapiSignature); + return wxMpConfig.wxMpService().getJsapiTicket(true); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/api/WxMpMenuApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/api/WxMpMenuApi.java new file mode 100644 index 0000000..58b6449 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/api/WxMpMenuApi.java @@ -0,0 +1,190 @@ +package com.qs.serve.modules.wx.api; + +import com.qs.serve.modules.wx.common.conf.WxMpConfig; +import lombok.AllArgsConstructor; +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.bean.menu.WxMenu; +import me.chanjar.weixin.common.bean.menu.WxMenuButton; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.menu.WxMpGetSelfMenuInfoResult; +import me.chanjar.weixin.mp.bean.menu.WxMpMenu; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.net.MalformedURLException; +import java.net.URL; + +import static me.chanjar.weixin.common.api.WxConsts.MenuButtonType; + +/** + * API 微信公众号菜单 后台接口 + * @author YenHex + * @since 2022-03-07 + */ +@AllArgsConstructor +//@RestController +//@RequestMapping("/api/mp/menu/{appid}") +public class WxMpMenuApi { + @Autowired(required = false) + private WxMpConfig wxMpConfig; + + /** + * 自定义菜单创建接口 + * @apiNote
+     * 详情请见:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013&token=&lang=zh_CN
+     * 如果要创建个性化菜单,请设置matchrule属性
+     * 详情请见:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455782296&token=&lang=zh_CN
+     * 
+ * @return 如果是个性化菜单,则返回menuid,否则返回null + */ + @PostMapping("/create") + public String menuCreate(@PathVariable String appid, @RequestBody WxMenu menu) throws WxErrorException { + return wxMpConfig.wxMpService().switchoverTo(appid).getMenuService().menuCreate(menu); + } + + //@GetMapping("/createByData") + public String menuCreateSample(@PathVariable String appid) throws WxErrorException, MalformedURLException { + WxMenu menu = new WxMenu(); + WxMenuButton button1 = new WxMenuButton(); + button1.setType(MenuButtonType.CLICK); + button1.setName("今日歌曲"); + button1.setKey("V1001_TODAY_MUSIC"); + +// WxMenuButton button2 = new WxMenuButton(); +// button2.setType(WxConsts.BUTTON_MINIPROGRAM); +// button2.setName("小程序"); +// button2.setAppId("wx286b93c14bbf93aa"); +// button2.setPagePath("pages/lunar/index.html"); +// button2.setUrl("http://mp.weixin.qq.com"); + + WxMenuButton button3 = new WxMenuButton(); + button3.setName("菜单"); + + menu.getButtons().add(button1); +// menu.getButtons().add(button2); + menu.getButtons().add(button3); + + WxMenuButton button31 = new WxMenuButton(); + button31.setType(MenuButtonType.VIEW); + button31.setName("搜索"); + button31.setUrl("http://www.soso.com/"); + + WxMenuButton button32 = new WxMenuButton(); + button32.setType(MenuButtonType.VIEW); + button32.setName("视频"); + button32.setUrl("http://v.qq.com/"); + + WxMenuButton button33 = new WxMenuButton(); + button33.setType(MenuButtonType.CLICK); + button33.setName("赞一下我们"); + button33.setKey("V1001_GOOD"); + + WxMenuButton button34 = new WxMenuButton(); + button34.setType(MenuButtonType.VIEW); + button34.setName("获取用户信息"); + + ServletRequestAttributes servletRequestAttributes = + (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (servletRequestAttributes != null) { + HttpServletRequest request = servletRequestAttributes.getRequest(); + URL requestURL = new URL(request.getRequestURL().toString()); + String url = wxMpConfig.wxMpService().switchoverTo(appid).getOAuth2Service().buildAuthorizationUrl( + String.format("%s://%s/wx/redirect/%s/greet", requestURL.getProtocol(), requestURL.getHost(), appid), + WxConsts.OAuth2Scope.SNSAPI_USERINFO, null); + button34.setUrl(url); + } + + button3.getSubButtons().add(button31); + button3.getSubButtons().add(button32); + button3.getSubButtons().add(button33); + button3.getSubButtons().add(button34); + + wxMpConfig.wxMpService().switchover(appid); + return wxMpConfig.wxMpService().getMenuService().menuCreate(menu); + } + + /** + * + * 自定义菜单创建接口 + * @apiNote
详情请见: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013&token=&lang=zh_CN
+     * 如果要创建个性化菜单,请设置matchrule属性
+     * 详情请见:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455782296&token=&lang=zh_CN
+     * 
+ * @return 如果是个性化菜单,则返回menuid,否则返回null + */ + @PostMapping("/createByJson") + public String menuCreate(@PathVariable String appid, @RequestBody String json) throws WxErrorException { + return wxMpConfig.wxMpService().switchoverTo(appid).getMenuService().menuCreate(json); + } + + /** + * 自定义菜单删除接口 + * @apiNote
+     * 详情请见: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141015&token=&lang=zh_CN
+     * 
+ */ + @GetMapping("/delete") + public void menuDelete(@PathVariable String appid) throws WxErrorException { + wxMpConfig.wxMpService().switchoverTo(appid).getMenuService().menuDelete(); + } + + /** + * 删除个性化菜单接口 + * @apiNote
+     * 详情请见: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455782296&token=&lang=zh_CN
+     * 
+ * @param menuId 个性化菜单的menuid + */ + @GetMapping("/delete/{menuId}") + public void menuDelete(@PathVariable String appid, @PathVariable String menuId) throws WxErrorException { + wxMpConfig.wxMpService().switchoverTo(appid).getMenuService().menuDelete(menuId); + } + + /** + * 自定义菜单查询接口 + * @apiNote
+     * 详情请见: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141014&token=&lang=zh_CN
+     * 
+ */ + @GetMapping("/get") + public WxMpMenu menuGet(@PathVariable String appid) throws WxErrorException { + return wxMpConfig.wxMpService().switchoverTo(appid).getMenuService().menuGet(); + } + + /** + * 测试个性化菜单匹配结果 + * @apiNote
+     * 详情请见: http://mp.weixin.qq.com/wiki/0/c48ccd12b69ae023159b4bfaa7c39c20.html
+     * 
+ * + * @param userid 可以是粉丝的OpenID,也可以是粉丝的微信号。 + */ + @GetMapping("/menuTryMatch/{userid}") + public WxMenu menuTryMatch(@PathVariable String appid, @PathVariable String userid) throws WxErrorException { + return wxMpConfig.wxMpService().switchoverTo(appid).getMenuService().menuTryMatch(userid); + } + + /** + * 获取自定义菜单配置接口 + * @apiNote
+     * 本接口将会提供公众号当前使用的自定义菜单的配置,如果公众号是通过API调用设置的菜单,则返回菜单的开发配置,而如果公众号是在公众平台官网通过网站功能发布菜单,则本接口返回运营者设置的菜单配置。
+     * 请注意:
+     * 1、第三方平台开发者可以通过本接口,在旗下公众号将业务授权给你后,立即通过本接口检测公众号的自定义菜单配置,并通过接口再次给公众号设置好自动回复规则,以提升公众号运营者的业务体验。
+     * 2、本接口与自定义菜单查询接口的不同之处在于,本接口无论公众号的接口是如何设置的,都能查询到接口,而自定义菜单查询接口则仅能查询到使用API设置的菜单配置。
+     * 3、认证/未认证的服务号/订阅号,以及接口测试号,均拥有该接口权限。
+     * 4、从第三方平台的公众号登录授权机制上来说,该接口从属于消息与菜单权限集。
+     * 5、本接口中返回的图片/语音/视频为临时素材(临时素材每次获取都不同,3天内有效,通过素材管理-获取临时素材接口来获取这些素材),本接口返回的图文消息为永久素材素材(通过素材管理-获取永久素材接口来获取这些素材)。
+     *  接口调用请求说明:
+     * http请求方式: GET(请使用https协议)
+     * https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token=ACCESS_TOKEN
+     * 
+ */ + @GetMapping("/getSelfMenuInfo") + public WxMpGetSelfMenuInfoResult getSelfMenuInfo(@PathVariable String appid) throws WxErrorException { + return wxMpConfig.wxMpService().switchoverTo(appid).getMenuService().getSelfMenuInfo(); + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/api/WxMpRedirectApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/api/WxMpRedirectApi.java new file mode 100644 index 0000000..1587819 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/api/WxMpRedirectApi.java @@ -0,0 +1,39 @@ +package com.qs.serve.modules.wx.api; + +import lombok.AllArgsConstructor; +import me.chanjar.weixin.common.bean.WxOAuth2UserInfo; +import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpService; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * 微信公众号重定向 后台接口 + * @author YenHex + * @since 2022-03-07 + */ +@AllArgsConstructor +//@Controller +//@RequestMapping("/api/mp/redirect/{appid}") +public class WxMpRedirectApi { + private final WxMpService wxService; + + @RequestMapping("/greet") + public String greetUser(@PathVariable String appid, @RequestParam String code, ModelMap map) { + if (!this.wxService.switchover(appid)) { + throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid)); + } + + try { + WxOAuth2AccessToken accessToken = wxService.getOAuth2Service().getAccessToken(code); + WxOAuth2UserInfo user = wxService.getOAuth2Service().getUserInfo(accessToken, null); + map.put("user", user); + } catch (WxErrorException e) { + e.printStackTrace(); + } + return "greet_user"; + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/api/WxSvcUserApi.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/api/WxSvcUserApi.java new file mode 100644 index 0000000..cf5baa7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/api/WxSvcUserApi.java @@ -0,0 +1,167 @@ +package com.qs.serve.modules.wx.api; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.framework.security.model.LoginUser; +import com.qs.serve.common.model.annotation.LimitSubmit; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.consts.RedisCacheKeys; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.enums.BizType; +import com.qs.serve.common.model.enums.InterType; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.base.TencentYunSmsService; +import com.qs.serve.modules.base.TianYiYunSmsService; +import com.qs.serve.modules.sys.entity.SysRole; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.entity.dto.SysUserVo; +import com.qs.serve.modules.sys.mapper.SysMenuMapper; +import com.qs.serve.modules.sys.service.SysRoleService; +import com.qs.serve.modules.sys.service.SysUserSalesService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.sys.service.impl.SysUserDetailsServiceImpl; +import com.qs.serve.modules.wx.entity.WxUser; +import com.qs.serve.modules.wx.entity.dto.WxPhoneBindParam; +import com.qs.serve.modules.wx.service.WxUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * 微信:API 微信用户 + * @author YenHex + * @since 2022/3/8 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("/api/wx/user") +public class WxSvcUserApi { + + private WxUserService wxUserService; + private RedisService redisService; + private SysUserService sysUserService; + private TencentYunSmsService tencentYunSmsService; + private TianYiYunSmsService tianYiYunSmsService; + private SysUserDetailsServiceImpl userDetailsService; + private SysRoleService sysRoleService; + private SysUserSalesService sysUserSalesService; + private final SysMenuMapper sysMenuMapper; + + /** + * 用户信息 + * @param noChange 不做转化CRM系统公众号用户绑定信息 + * @return + */ + @GetMapping("/info") + public R info(String noChange){ + boolean notChangeCms = noChange!=null&&noChange.equals("true"); + log.debug("notChangeCms{}, nochage:{}",notChangeCms,noChange); + WxUser wxUser = wxUserService.getCurrentWxUser(true, !notChangeCms); + SysUserVo sysUserVo = null; + if(StringUtils.hasText(wxUser.getSysUserId())){ + SysUser sysUser = sysUserService.getById(wxUser.getSysUserId()); + if(sysUser!=null){ + // 解决H5页面权限不刷新 + List defaultRole = sysRoleService.getDefaultRole(); + List defaultRoleIds = defaultRole.stream().map(SysRole::getId).collect(Collectors.toList()); + List menuIds = sysMenuMapper.searchUserMenuIds(sysUser.getId()); + List defaultRoleMenuIds = sysMenuMapper.searchDefaultMenuIds(defaultRoleIds); + menuIds.addAll(defaultRoleMenuIds); + + LoginUser userDetails = sysUserService.buildLoginUser(sysUser); + sysUser.setAuthorIds(menuIds); + sysUser.setAuthorList(userDetails.getAuthorList()); + sysUserVo = sysUser.toSysUserVo(false); + } + } + + if(wxUser.getAppType()!=null && wxUser.getAppType().equals(3) && !notChangeCms){ + //企业微信转化为公众号用户 + WxUser wxUser1 = wxUserService.getOne(new LambdaQueryWrapper() + .eq(WxUser::getSysUserId,wxUser.getSysUserId()) + .eq(WxUser::getAppType,2),false); + if(wxUser1==null){ + wxUser.setSysUserInfo(sysUserVo); + return R.ok(wxUser); + //Assert.throwEx("请前往CMS公众号绑定信息"); + } + wxUser1.setSysUserInfo(sysUserVo); + return R.ok(wxUser1); + }else { + wxUser.setSysUserInfo(sysUserVo); + } + return R.ok(wxUser); + } + + /** + * 获取手机绑定验证码 + */ + @LimitSubmit(interval = 10000) + @SysLog(title = "手机绑定验证码",inter = InterType.API) + @GetMapping("/phoneCode/{phone}") + public R phoneCode(@PathVariable("phone") String phone){ + //拦截未注册的手机号 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SysUser::getMobile,phone); + Long count = sysUserService.count(lqw); + if(count<1L){ + return R.error("手机号未被收录"); + } + String key = RedisCacheKeys.PHONE_KEY+phone; + String code = redisService.getString(key); + if(code==null){ + code = IdUtil.genCode(6); + } + tianYiYunSmsService.send(phone,code); + //tencentYunSmsService.send(phone,code); + log.debug("手机'{}'验证码:{}",phone,code); + redisService.set(key,code,10, TimeUnit.MINUTES); + return R.ok(); + } + + /** + * 手机号绑定 + * @param param + * @return + */ + @SysLog(title = "手机绑定",biz = BizType.UPDATE, inter = InterType.API) + @PostMapping("/bindPhone") + public R phoneCode(@RequestBody @Valid WxPhoneBindParam param){ + String key = RedisCacheKeys.PHONE_KEY+param.getPhone(); + String code = redisService.getString(key); + if(!param.getCode().equals(code)){ + return R.error("验证码无效或过期"); + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SysUser::getMobile,param.getPhone()); + SysUser sysUser = sysUserService.getOne(lqw,false); + + WxUser wxUser = wxUserService.getCurrentWxUser(); + wxUser.setPhone(param.getPhone()); + wxUser.setEmpName(sysUser.getName()); + wxUser.setSysUserId(sysUser.getId()); + wxUser.setSysUserCode(sysUser.getCode()); + wxUserService.updateById(wxUser); + //便于多设备登陆 + redisService.remove(key); + + //返回登陆信息 +// String client = "wx_app"; +// String redisKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client,wxUser.getSysUserId()); +// String pctoken = JwtUtils.generateToken(wxUser.getSysUserId(), LoginUserType.APP_USER,client); +// redisService.set(redisKey,pctoken); +// Map tokenMap = new HashMap<>(10); +// tokenMap.put("token", pctoken); +// tokenMap.put("userId", wxUser.getSysUserId()); +// tokenMap.put("loginType",client); +// tokenMap.put("client",client); + return R.ok(); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/builder/mp/ImageBuilder.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/builder/mp/ImageBuilder.java new file mode 100644 index 0000000..e74f58c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/builder/mp/ImageBuilder.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.wx.common.builder.mp; + +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutImageMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; + +/** + * @author YenHex + * @since 2022-03-07 + */ +public class ImageBuilder implements MpXmlMessageBuilder { + + @Override + public WxMpXmlOutMessage build(String content, WxMpXmlMessage wxMessage, + WxMpService service) { + WxMpXmlOutImageMessage m = WxMpXmlOutMessage.IMAGE().mediaId(content) + .fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) + .build(); + return m; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/builder/mp/MpXmlMessageBuilder.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/builder/mp/MpXmlMessageBuilder.java new file mode 100644 index 0000000..efbece0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/builder/mp/MpXmlMessageBuilder.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.wx.common.builder.mp; + +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; + +/** + * @author YenHex + * @since 2022-03-07 + */ +public interface MpXmlMessageBuilder { + + WxMpXmlOutMessage build(String content, WxMpXmlMessage wxMessage, WxMpService service); +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/builder/mp/TextBuilder.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/builder/mp/TextBuilder.java new file mode 100644 index 0000000..2e5f9f1 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/builder/mp/TextBuilder.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.wx.common.builder.mp; + +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTextMessage; + +/** + * @author YenHex + * @since 2022-03-07 + */ +public class TextBuilder implements MpXmlMessageBuilder { + + @Override + public WxMpXmlOutMessage build(String content, WxMpXmlMessage wxMessage, + WxMpService service) { + WxMpXmlOutTextMessage m = WxMpXmlOutMessage.TEXT().content(content) + .fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) + .build(); + return m; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/conf/WxCpConfig.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/conf/WxCpConfig.java new file mode 100644 index 0000000..0494eac --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/conf/WxCpConfig.java @@ -0,0 +1,48 @@ +package com.qs.serve.modules.wx.common.conf; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.cp.api.WxCpOAuth2Service; +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.api.WxCpUserService; +import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl; +import me.chanjar.weixin.cp.bean.WxCpOauth2UserInfo; +import me.chanjar.weixin.cp.bean.WxCpUser; +import me.chanjar.weixin.cp.config.WxCpConfigStorage; +import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl; +import org.springframework.context.annotation.Configuration; + +import java.util.HashMap; +import java.util.Map; + +/** + * 企业微信配置 + * @author YenHex + * @since 2024/8/12 + */ +@Slf4j +public class WxCpConfig { + + private static Map secretMap = new HashMap<>(); + + static { + //测试环境 + //CRM + secretMap.put(1000008,"tC2ENr_hs0on-OMfWMQ6ch3TL2ndcUDz1b34K-M7VGg"); + //订单 + secretMap.put(1000009,"uyyatorEYuaT_1Qm45sFQ-UAIVIViR095KI_SV94yrU"); + + //正式环境 + //CRM + secretMap.put(1000015,"ylgxFjYWogNXAdVGRrWiCBN2lx6Ys7PgYMG8GkQatrY"); + //订单 + secretMap.put(1000016,"0lYdQJXaYrJ_1WUeXDHpHGcYnOQva6Ve6S-6gxQpfdY"); + //行事历 + secretMap.put(1000022,"fgCIlShP7NuGa4v_M3vy642aop-ZGnnabC3_YQiCS_M"); + } + + public static String getSecret(Integer agentId){ + return secretMap.get(agentId); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/conf/WxMpConfig.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/conf/WxMpConfig.java new file mode 100644 index 0000000..55825d9 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/conf/WxMpConfig.java @@ -0,0 +1,129 @@ +package com.qs.serve.modules.wx.common.conf; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.config.properties.RedisProperties; +import com.qs.serve.modules.wx.common.consts.WxStatusConst; +import com.qs.serve.modules.wx.common.handler.mp.*; +import com.qs.serve.modules.wx.entity.WxApp; +import com.qs.serve.modules.wx.service.WxAppService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.redis.RedisTemplateWxRedisOps; +import me.chanjar.weixin.mp.api.WxMpMessageRouter; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; +import me.chanjar.weixin.mp.api.impl.WxMpServiceOkHttpImpl; +import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +import java.util.List; +import java.util.stream.Collectors; + +import static me.chanjar.weixin.common.api.WxConsts.EventType; +import static me.chanjar.weixin.common.api.WxConsts.EventType.SUBSCRIBE; +import static me.chanjar.weixin.common.api.WxConsts.EventType.UNSUBSCRIBE; +import static me.chanjar.weixin.common.api.WxConsts.XmlMsgType; +import static me.chanjar.weixin.common.api.WxConsts.XmlMsgType.EVENT; +import static me.chanjar.weixin.mp.constant.WxMpEventConstants.CustomerService.*; +import static me.chanjar.weixin.mp.constant.WxMpEventConstants.POI_CHECK_NOTIFY; +/** + * 微信公众号配置 + * @author YenHex + * @since 2022/3/7 + */ +@Slf4j +@AllArgsConstructor +@Configuration(proxyBeanMethods = false) +public class WxMpConfig { + + private final LogHandler logHandler; + private final NullHandler nullHandler; + private final KfSessionHandler kfSessionHandler; + private final StoreCheckNotifyHandler storeCheckNotifyHandler; + private final LocationHandler locationHandler; + private final MenuHandler menuHandler; + private final MsgHandler msgHandler; + private final UnsubscribeHandler unsubscribeHandler; + private final SubscribeHandler subscribeHandler; + private final ScanHandler scanHandler; + private final WxAppService wxAppService; + private final RedisProperties redisProperties; + private static WxMpService wxMpService = null; + + @Bean + public WxMpService wxMpService() { + if(wxMpService!=null){ + return wxMpService; + } + //超时时间 + LambdaQueryWrapper appWrapper = new LambdaQueryWrapper<>(); + appWrapper.eq(WxApp::getAppType, WxStatusConst.WxApp_AppType_2); + List wxAppList = wxAppService.list(appWrapper); + if (CollectionUtil.isEmpty(wxAppList)) { + log.warn("公众号配置为空"); + } + WxMpService service = new WxMpServiceOkHttpImpl(); + service.setMultiConfigStorages(wxAppList + .stream().map(app -> { + WxMpDefaultConfigImpl configStorage; + log.warn("进行公众号配置:{}",app.getId()); + configStorage = new WxMpDefaultConfigImpl(); + configStorage.setAppId(app.getId()); + configStorage.setSecret(app.getSecret()); + configStorage.setToken(app.getToken()); + configStorage.setAesKey(app.getAesKey()); + return configStorage; + }).collect(Collectors.toMap(WxMpDefaultConfigImpl::getAppId, a -> a, (o, n) -> o))); + WxMpConfig.wxMpService = service; + return service; + } + + @Bean + public WxMpMessageRouter messageRouter(WxMpService wxMpService) { + final WxMpMessageRouter newRouter = new WxMpMessageRouter(wxMpService); + + // 记录所有事件的日志 (异步执行) + newRouter.rule().handler(this.logHandler).next(); + + // 接收客服会话管理事件 + newRouter.rule().async(false).msgType(EVENT).event(KF_CREATE_SESSION) + .handler(this.kfSessionHandler).end(); + newRouter.rule().async(false).msgType(EVENT).event(KF_CLOSE_SESSION) + .handler(this.kfSessionHandler).end(); + newRouter.rule().async(false).msgType(EVENT).event(KF_SWITCH_SESSION) + .handler(this.kfSessionHandler).end(); + + // 门店审核事件 + newRouter.rule().async(false).msgType(EVENT).event(POI_CHECK_NOTIFY).handler(this.storeCheckNotifyHandler).end(); + + // 自定义菜单事件 + newRouter.rule().async(false).msgType(EVENT).event(EventType.CLICK).handler(this.menuHandler).end(); + + // 点击菜单连接事件 + newRouter.rule().async(false).msgType(EVENT).event(EventType.VIEW).handler(this.nullHandler).end(); + + // 关注事件 + newRouter.rule().async(false).msgType(EVENT).event(SUBSCRIBE).handler(this.subscribeHandler).end(); + + // 取消关注事件 + newRouter.rule().async(false).msgType(EVENT).event(UNSUBSCRIBE).handler(this.unsubscribeHandler).end(); + + // 上报地理位置事件 + newRouter.rule().async(false).msgType(EVENT).event(EventType.LOCATION).handler(this.locationHandler).end(); + + // 接收地理位置消息 + newRouter.rule().async(false).msgType(XmlMsgType.LOCATION).handler(this.locationHandler).end(); + + // 扫码事件 + newRouter.rule().async(false).msgType(EVENT).event(EventType.SCAN).handler(this.scanHandler).end(); + + // 默认 + newRouter.rule().async(false).handler(this.msgHandler).end(); + + return newRouter; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/consts/WxStatusConst.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/consts/WxStatusConst.java new file mode 100644 index 0000000..5d222da --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/consts/WxStatusConst.java @@ -0,0 +1,35 @@ +package com.qs.serve.modules.wx.common.consts; + +/** + * 微信字段 + * @author YenHex + * @since 2022/3/7 + */ +public class WxStatusConst { + + /** wx */ + /** 应用类型【1->小程序;2->公众号】 */ + public static final int WxUser_AppType_1 = 1; + public static final int WxUser_AppType_2 = 2; + + /** 是否订阅【1->是;0->否;2->网页授权用户】 */ + public static final int WxUser_Subscribe_1 = 1; + public static final int WxUser_Subscribe_0 = 0; + public static final int WxUser_Subscribe_2 = 2; + + /** 应用类型【1->小程序;2->公众号 ;企业微信】 */ + public static final int WxApp_AppType_1 = 1; + public static final int WxApp_AppType_2 = 2; + public static final int WxApp_AppType_3 = 3; + + /** 是否第三方平台应用【1->是;0->否】 */ + public static final int WxApp_IsComponent_1 = 1; + public static final int WxApp_IsComponent_0 = 0; + + /** 【0->订阅号;1->由历史老帐号升级后的订阅号;2->服务号】 */ + public static final int WxApp_WeixinType_0 = 0; + public static final int WxApp_WeixinType_1 = 1; + public static final int WxApp_WeixinType_2 = 2; + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/KfSessionHandler.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/KfSessionHandler.java new file mode 100644 index 0000000..b2f32ad --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/KfSessionHandler.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.wx.common.handler.mp; + +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * @author YenHex + * @since 2022-03-07 + */ +@Component +public class KfSessionHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, + Map context, WxMpService wxMpService, + WxSessionManager sessionManager) { + //TODO 对会话做处理 + return null; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/LocationHandler.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/LocationHandler.java new file mode 100644 index 0000000..c1c9520 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/LocationHandler.java @@ -0,0 +1,47 @@ +package com.qs.serve.modules.wx.common.handler.mp; + +import com.qs.serve.modules.wx.common.builder.mp.TextBuilder; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; + +import static me.chanjar.weixin.common.api.WxConsts.XmlMsgType; + +/** + * @author YenHex + * @since 2022-03-07 + */ +@Slf4j +@Component +public class LocationHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, + Map context, WxMpService wxMpService, + WxSessionManager sessionManager) { + if (wxMessage.getMsgType().equals(XmlMsgType.LOCATION)) { + //TODO 接收处理用户发送的地理位置消息 + try { + String content = "感谢反馈,您的的地理位置已收到!"; + return new TextBuilder().build(content, wxMessage, null); + } catch (Exception e) { + log.error("位置消息接收处理失败", e); + return null; + } + } + + //上报地理位置事件 + log.info("上报地理位置,纬度 : {},经度 : {},精度 : {}",wxMessage.getLatitude(), wxMessage.getLongitude(), wxMessage.getPrecision()); + + //TODO 可以将用户地理位置信息保存到本地数据库,以便以后使用 + + return null; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/LogHandler.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/LogHandler.java new file mode 100644 index 0000000..c433c05 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/LogHandler.java @@ -0,0 +1,32 @@ +package com.qs.serve.modules.wx.common.handler.mp; + +import com.qs.serve.common.util.JsonUtil; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * @author YenHex + * @since 2022-03-07 + */ +@Slf4j +@Component +public class LogHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, + Map context, WxMpService wxMpService, + WxSessionManager sessionManager) { + log.info("\n接收到请求消息,内容:{}", JsonUtil.objectToJson(wxMessage)); + return null; + } + + + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/MenuHandler.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/MenuHandler.java new file mode 100644 index 0000000..a4070fe --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/MenuHandler.java @@ -0,0 +1,37 @@ +package com.qs.serve.modules.wx.common.handler.mp; + +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; + +import static me.chanjar.weixin.common.api.WxConsts.EventType; + +/** + * @author YenHex + * @since 2022-03-07 + */ +@Component +public class MenuHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, + Map context, WxMpService weixinService, + WxSessionManager sessionManager) { + String msg = String.format("type:%s, event:%s, key:%s", + wxMessage.getMsgType(), wxMessage.getEvent(), + wxMessage.getEventKey()); + if (EventType.VIEW.equals(wxMessage.getEvent())) { + return null; + } + + return WxMpXmlOutMessage.TEXT().content(msg) + .fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) + .build(); + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/MsgHandler.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/MsgHandler.java new file mode 100644 index 0000000..9ed90cd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/MsgHandler.java @@ -0,0 +1,54 @@ +package com.qs.serve.modules.wx.common.handler.mp; + +import com.qs.serve.common.util.JsonUtil; +import com.qs.serve.modules.wx.common.builder.mp.TextBuilder; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import java.util.Map; + +import static me.chanjar.weixin.common.api.WxConsts.XmlMsgType; + +/** + * @author YenHex + * @since 2022-03-07 + */ +@Component +public class MsgHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, + Map context, WxMpService weixinService, + WxSessionManager sessionManager) { + + if (!wxMessage.getMsgType().equals(XmlMsgType.EVENT)) { + //TODO 可以选择将消息保存到本地 + } + + //当用户输入关键词如“你好”,“客服”等,并且有客服在线时,把消息转发给在线客服 + try { + if (StringUtils.startsWithAny(wxMessage.getContent(), "你好", "客服") + && weixinService.getKefuService().kfOnlineList() + .getKfOnlineList().size() > 0) { + return WxMpXmlOutMessage.TRANSFER_CUSTOMER_SERVICE() + .fromUser(wxMessage.getToUser()) + .toUser(wxMessage.getFromUser()).build(); + } + } catch (WxErrorException e) { + e.printStackTrace(); + } + + //TODO 组装回复消息 + String content = "收到信息内容:" + JsonUtil.objectToJson(wxMessage); + + return new TextBuilder().build(content, wxMessage, weixinService); + + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/NullHandler.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/NullHandler.java new file mode 100644 index 0000000..fe76188 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/NullHandler.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.wx.common.handler.mp; + +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * @author YenHex + * @since 2022-03-07 + */ +@Component +public class NullHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, + Map context, WxMpService wxMpService, + WxSessionManager sessionManager) { + return null; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/ScanHandler.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/ScanHandler.java new file mode 100644 index 0000000..0015686 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/ScanHandler.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.wx.common.handler.mp; + +import java.util.Map; + +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import org.springframework.stereotype.Component; + +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; + +/** + * @author YenHex + * @since 2022-03-07 + */ +@Component +public class ScanHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMpXmlMessage, Map map, + WxMpService wxMpService, WxSessionManager wxSessionManager) throws WxErrorException { + // 扫码事件处理 + return null; + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/StoreCheckNotifyHandler.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/StoreCheckNotifyHandler.java new file mode 100644 index 0000000..d6f5d7a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/StoreCheckNotifyHandler.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.wx.common.handler.mp; + +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; + + + /** + * 门店审核事件处理 + * @author YenHex + * @since 2022-03-07 +*/ +@Component +public class StoreCheckNotifyHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, + Map context, WxMpService wxMpService, + WxSessionManager sessionManager) { + // TODO 处理门店审核事件 + return null; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/SubscribeHandler.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/SubscribeHandler.java new file mode 100644 index 0000000..4d0dc13 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/SubscribeHandler.java @@ -0,0 +1,72 @@ +package com.qs.serve.modules.wx.common.handler.mp; + +import java.util.Map; + +import com.qs.serve.modules.wx.common.builder.mp.TextBuilder; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import org.springframework.stereotype.Component; + +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import me.chanjar.weixin.mp.bean.result.WxMpUser; + +/** + * @author YenHex + * @since 2022-03-07 + */ +@Slf4j +@Component +public class SubscribeHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, + Map context, WxMpService weixinService, + WxSessionManager sessionManager) throws WxErrorException { + + log.info("新关注用户 OPENID: " + wxMessage.getFromUser()); + // 获取微信用户基本信息 + try { + WxMpUser userWxInfo = weixinService.getUserService() + .userInfo(wxMessage.getFromUser(), null); + if (userWxInfo != null) { + // TODO 可以添加关注用户到本地数据库 + } + } catch (WxErrorException e) { + if (e.getError().getErrorCode() == 48001) { + log.info("该公众号没有获取用户信息权限!"); + } + } + WxMpXmlOutMessage responseResult = null; + try { + responseResult = this.handleSpecial(wxMessage); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + if (responseResult != null) { + return responseResult; + } + + try { + return new TextBuilder().build("感谢关注", wxMessage, weixinService); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + return null; + } + + /** + * 处理特殊请求,比如如果是扫码进来的,可以做相应处理 + */ + private WxMpXmlOutMessage handleSpecial(WxMpXmlMessage wxMessage) + throws Exception { + //TODO + return null; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/UnsubscribeHandler.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/UnsubscribeHandler.java new file mode 100644 index 0000000..5ae0c72 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/common/handler/mp/UnsubscribeHandler.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.wx.common.handler.mp; + +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * @author YenHex + * @since 2022-03-07 + */ +@Slf4j +@Component +public class UnsubscribeHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, + Map context, WxMpService wxMpService, + WxSessionManager sessionManager) { + String openId = wxMessage.getFromUser(); + log.info("取消关注用户 OPENID: " + openId); + // TODO 可以更新本地数据库为取消关注状态 + return null; + } + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/WxAppController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/WxAppController.java new file mode 100644 index 0000000..143e9d2 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/WxAppController.java @@ -0,0 +1,93 @@ +package com.qs.serve.modules.wx.controller; + +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.PageUtil; +import com.qs.serve.modules.wx.entity.WxApp; +import com.qs.serve.modules.wx.service.WxAppService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * 微信应用 后台接口 + * @author YenHex + * @since 2022-03-07 + */ +@Slf4j +//@AllArgsConstructor +//@RestController +//@RequestMapping("wx/app") +public class WxAppController { + + private WxAppService wxAppService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('wx:app:query')") + public R> getList(WxApp param){ + PageUtil.startPage(); + List list = wxAppService.list(new QueryWrapper<>(param)); + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @PreAuthorize("hasRole('wx:app:query')") + public R getById(@PathVariable("id") String id){ + WxApp wxApp = wxAppService.getById(id); + return R.ok(wxApp); + } + + + + /** + * 根据ID更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @PreAuthorize("hasRole('wx:app:update')") + public R updateById(@RequestBody @Valid WxApp param){ + boolean result = wxAppService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增微信应用 + * @param param + * @return + */ + @PostMapping("/save") + @PreAuthorize("hasRole('wx:app:insert')") + public R save(@RequestBody @Valid WxApp param){ + boolean result = wxAppService.save(param); + return R.isTrue(result); + } + + /** + * 删除微信应用 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @PreAuthorize("hasRole('wx:app:delete')") + public R deleteById(@PathVariable("id") String id){ + boolean result = wxAppService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/WxFormPushController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/WxFormPushController.java new file mode 100644 index 0000000..29523d3 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/WxFormPushController.java @@ -0,0 +1,343 @@ +package com.qs.serve.modules.wx.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.CollectionUtil; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +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.wx.entity.*; +import com.qs.serve.modules.wx.entity.dto.sms.WxSmsNewForm; +import com.qs.serve.modules.wx.entity.vo.WxPushResultVo; +import com.qs.serve.modules.wx.mapper.WxFormPushMapper; +import com.qs.serve.modules.wx.service.*; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.mp.api.WxMpService; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.wx.entity.bo.WxFormPushBo; + +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 微信 表单推送 + * @author YenHex + * @since 2023-04-19 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("wx/formPush") +public class WxFormPushController { + + private WxFormPushMapper wxFormPushMapper; + private WxFormPushService wxFormPushService; + private WxFormPushUserService wxFormPushUserService; + private WxFormPushTypeService wxFormPushTypeService; + private WxUserService wxUserService; + private WxPushService wxPushService; + private WxAppService wxAppService; + private SysAttachService attachService; + private SysUserService sysUserService; + + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(WxFormPush param){ + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + PageUtil.startPage(); + lqw.orderByDesc(WxFormPush::getCreateTime); + List list = wxFormPushService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Verification, title = "表单推送", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + WxFormPush wxFormPush = wxFormPushService.getById(id); + LambdaQueryWrapper userlqw = new LambdaQueryWrapper<>(); + userlqw.eq(WxFormPushUser::getFormPushId,wxFormPush.getId()); + List list = wxFormPushUserService.list(userlqw); + wxFormPush.setShowCompensateButton(0); + for (WxFormPushUser pushUser : list) { + if(pushUser.getPushStatus().equals(0)){ + wxFormPush.setShowCompensateButton(1); + break; + } + } + wxFormPush.setWxFormPushUserList(list); + if(CollectionUtil.isNotEmpty(wxFormPush.getAttachIds())){ + List attachIds = Arrays.asList(wxFormPush.getAttachIds()); + List attachList = attachService.listByIds(attachIds); + wxFormPush.setAttachList(attachList); + } + return R.ok(wxFormPush); + } + + + + /** + * 发布 + * @param param + * @return + */ + @PostMapping("/publishById") + @SysLog(module = SystemModule.Verification, title = "表单推送发布", biz = BizType.UPDATE) + public R publishById(@RequestBody WxFormPushBo param){ + String id = param.getId(); + WxFormPush entity = wxFormPushService.getById(id); + if(entity.getId().equals("1")){ + return R.error("已发布的消息不能再次发布"); + } + entity.setStatus("1"); + entity.setPublishTime(LocalDateTime.now()); + boolean result = wxFormPushService.updateById(entity); + LambdaQueryWrapper userlqw = new LambdaQueryWrapper<>(); + userlqw.eq(WxFormPushUser::getFormPushId,entity.getId()); + userlqw.eq(WxFormPushUser::getPushStatus,0); + List list = wxFormPushUserService.list(userlqw); + List userCodes = list.stream().map(WxFormPushUser::getUserCode).collect(Collectors.toList()); + if(userCodes.size()<1){ + return R.ok(); + } + WxApp app = wxAppService.getOne(new LambdaQueryWrapper<>(),false); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(WxUser::getAppId,app.getId()); + lqw.in(WxUser::getSysUserCode,userCodes); + List wxUserList = wxUserService.list(lqw); + Set wxUserIdSet = new HashSet<>(); + for (WxUser wxUser : wxUserList) { + if (wxUser.getOpenId().equals("0")) { + continue; + } + boolean exist = wxUserIdSet.stream().anyMatch(a->a.equals(wxUser.getOpenId())); + if(exist){ + continue; + }else { + wxUserIdSet.add(wxUser.getOpenId()); + } + WxSmsNewForm wxSmsNewForm = new WxSmsNewForm(); + wxSmsNewForm.setTitle(entity.getTitle()); + wxSmsNewForm.setUserName(wxUser.getEmpName()); + wxSmsNewForm.setBizType(entity.getBusinessType() == null ? "通知" : entity.getBusinessType()); + wxSmsNewForm.setBitTime(LocalDateTime.now().toString().replace("T", " ")); + wxSmsNewForm.setRemark(entity.getRemark()); + wxPushService.sendWxMsg(wxUser, "表单通知", wxSmsNewForm, true, entity.getId()); + } + return R.isTrue(result); + } + + /** + * 补偿通知 + * @param param + * @return + */ + @PostMapping("/compensate") + @SysLog(module = SystemModule.Verification, title = "表单推送补偿通知", biz = BizType.UPDATE) + public R compensate(@RequestBody WxFormPushBo param){ + String id = param.getId(); + List userIds = param.getUserIds(); + WxFormPush entity = wxFormPushService.getById(id); + if(entity.getId().equals("0")){ + return R.error("未发布"); + } + LambdaQueryWrapper userlqw = new LambdaQueryWrapper<>(); + userlqw.eq(WxFormPushUser::getFormPushId,entity.getId()); + if(CollectionUtil.isNotEmpty(userIds)) { + userlqw.in(WxFormPushUser::getUserId,userIds); + } + userlqw.eq(WxFormPushUser::getPushStatus,0); + List list = wxFormPushUserService.list(userlqw); + userIds = list.stream().map(WxFormPushUser::getUserId).collect(Collectors.toList()); + if(userIds.size()<1){ + return R.ok(); + } + WxApp app = wxAppService.getOne(new LambdaQueryWrapper<>(),false); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(WxUser::getAppId,app.getId()); + lqw.in(WxUser::getSysUserId,userIds); + List wxUserList = wxUserService.list(lqw); + Set wxUserIdSet = new HashSet<>(); + int successCount = 0; + for (WxFormPushUser pushUser : list) { + boolean pushOk = false; + for (WxUser wxUser : wxUserList) { + if (wxUser.getOpenId().equals("0")) { + continue; + } + boolean exist = wxUserIdSet.stream().anyMatch(a->a.equals(wxUser.getOpenId())); + if(exist){ + continue; + }else { + wxUserIdSet.add(wxUser.getOpenId()); + } + pushOk = true; + WxSmsNewForm wxSmsNewForm = new WxSmsNewForm(); + wxSmsNewForm.setTitle(entity.getTitle()); + wxSmsNewForm.setUserName(wxUser.getEmpName()); + wxSmsNewForm.setBizType(entity.getBusinessType() == null ? "通知" : entity.getBusinessType()); + wxSmsNewForm.setBitTime(LocalDateTime.now().toString().replace("T", " ")); + wxSmsNewForm.setRemark(entity.getRemark()); + wxPushService.sendWxMsg(wxUser, "表单通知", wxSmsNewForm, true, entity.getId()); + } + if(pushOk){ + successCount++; + WxFormPushUser upd_param = new WxFormPushUser(); + upd_param.setId(pushUser.getId()); + upd_param.setPushStatus(1); + wxFormPushUserService.updateById(upd_param); + } + } + return R.ok("成功通知数:"+successCount); + } + + /** + * 撤消 + * @param param + * @return + */ + @PostMapping("/unPublishById") + @SysLog(module = SystemModule.Verification, title = "撤消表单推送", biz = BizType.UPDATE) + public R unPublishById(@RequestBody WxFormPushBo param){ + String id = param.getId(); + WxFormPush entity = wxFormPushService.getById(id); + entity.setStatus("0"); + boolean result = wxFormPushService.updateById(entity); + return R.isTrue(result); + } + + /** + * 新增或保存 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.Verification, title = "表单推送", biz = BizType.INSERT) + public R saveOrUpdate(@RequestBody @Valid WxFormPushBo param){ + WxFormPush entity = CopierUtil.copy(param,new WxFormPush()); + entity.setPreNotifyStatus(param.getPreNotifyTime()==null?0:1); + WxFormPushType pushType = null; + if(param.getTypeId()!=null){ + pushType = wxFormPushTypeService.getById(param.getTypeId()); + entity.setTypeCode(pushType.getCode()); + entity.setTypeName(pushType.getTitle()); + }else{ + entity.setTypeId("0"); + entity.setTypeCode("默认"); + entity.setTypeName("默认分类"); + } + entity.setPreNotifyStatus(entity.getPreNotifyTime()==null?0:1); + if(null==entity.getId()) { + entity.setPublishTime(LocalDateTime.now()); + wxFormPushService.save(entity); + }else{ + WxFormPush ori_entity = wxFormPushService.getById(entity.getId()); + if(ori_entity.getStatus().equals("1")){ + return R.error("已发布的消息不能更新"); + } + if(entity.getPreNotifyTime()==null){ + wxFormPushMapper.updateSetNotifyTimeNull(entity.getId()); + } + wxFormPushService.updateById(entity); + } + //保存推送人员 + List userIds = param.getUserIds().stream().distinct().collect(Collectors.toList()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + WxApp app = wxAppService.getOne(new LambdaQueryWrapper<>(),false); + lqw.eq(WxUser::getAppId,app.getId()); + lqw.in(WxUser::getSysUserId,userIds); + List wxUserList = wxUserService.list(lqw); + List pushUserList = new ArrayList<>(); + Set wxUserIdSet = new HashSet<>(); + List sysUserList = sysUserService.listByIds(userIds); + for (SysUser sysUser : sysUserList) { + int pushOk = 0; + for (WxUser wxUser : wxUserList) { + if(wxUser.getSysUserId().equals(sysUser.getId())){ + if (wxUser.getOpenId().equals("0")) { + continue; + } + boolean exist = wxUserIdSet.stream().anyMatch(a->a.equals(wxUser.getOpenId())); + if(exist){ + continue; + }else { + wxUserIdSet.add(wxUser.getOpenId()); + } + pushOk = 1; + WxSmsNewForm wxSmsNewForm = new WxSmsNewForm(); + wxSmsNewForm.setTitle(param.getTitle()); + wxSmsNewForm.setUserName(wxUser.getEmpName()); + wxSmsNewForm.setBizType(param.getBusinessType()==null?"通知":param.getBusinessType()); + wxSmsNewForm.setBitTime(LocalDateTime.now().toString().replace("T"," ")); + wxSmsNewForm.setRemark(param.getRemark()); + if(param.getStatus().equals("1")) { + wxPushService.sendWxMsg(wxUser, "表单通知", wxSmsNewForm, true, entity.getId()); + } + } + } + WxFormPushUser pushUser = new WxFormPushUser(); + pushUser.setFormPushId(entity.getId()); + pushUser.setFormTitle(entity.getTitle()); + pushUser.setPushStatus(pushOk); + pushUser.setUserId(sysUser.getId()); + pushUser.setUserCode(sysUser.getCode()); + pushUser.setUserName(sysUser.getName()); + pushUser.setTypeId(pushType.getId()); + pushUser.setTypeCode(pushType.getCode()); + pushUser.setTypeName(pushType.getTitle()); + pushUserList.add(pushUser); + } + if(null==entity.getId()) { + wxFormPushUserService.saveBatch(pushUserList); + }else{ + LambdaQueryWrapper dellqw = new LambdaQueryWrapper<>(); + dellqw.eq(WxFormPushUser::getFormPushId,entity.getId()); + wxFormPushUserService.remove(dellqw); + wxFormPushUserService.saveBatch(pushUserList); + } + return R.ok(entity); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.Verification, title = "表单推送", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdString(ids); + List list = wxFormPushService.listByIds(idsLong); + for(WxFormPush formPush:list){ + if(formPush.getStatus().equals("1")){ + return R.error("已发布的消息不能删除"); + } + } + boolean result = wxFormPushService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/WxFormPushTypeController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/WxFormPushTypeController.java new file mode 100644 index 0000000..46aacb6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/WxFormPushTypeController.java @@ -0,0 +1,131 @@ +package com.qs.serve.modules.wx.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.wx.entity.WxFormPush; +import com.qs.serve.modules.wx.service.WxFormPushService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.wx.entity.so.WxFormPushTypeSo; +import com.qs.serve.modules.wx.entity.bo.WxFormPushTypeBo; +import com.qs.serve.modules.wx.entity.WxFormPushType; +import com.qs.serve.modules.wx.service.WxFormPushTypeService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 微信 表单类型 + * @author YenHex + * @since 2023-04-24 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("wx/formPushType") +public class WxFormPushTypeController { + + private WxFormPushTypeService wxFormPushTypeService; + private WxFormPushService wxFormPushService; + + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(WxFormPushTypeSo param){ + WxFormPushType entity = CopierUtil.copy(param,new WxFormPushType()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + List list = wxFormPushTypeService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(WxFormPushTypeSo param){ + WxFormPushType entity = CopierUtil.copy(param,new WxFormPushType()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + PageUtil.startPage(); + List list = wxFormPushTypeService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Verification, title = "表单类型", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + WxFormPushType wxFormPushType = wxFormPushTypeService.getById(id); + return R.ok(wxFormPushType); + } + + + + /** + * 更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @SysLog(module = SystemModule.Verification, title = "表单类型", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid WxFormPushTypeBo param){ + if(param.getId().equals("0")){ + return R.error("默认分类无法删除"); + } + WxFormPushType entity = CopierUtil.copy(param,new WxFormPushType()); + boolean result = wxFormPushTypeService.updateById(entity); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + @PostMapping("/save") + @SysLog(module = SystemModule.Verification, title = "表单类型", biz = BizType.INSERT) + public R save(@RequestBody @Valid WxFormPushTypeBo param){ + WxFormPushType entity = CopierUtil.copy(param,new WxFormPushType()); + boolean result = wxFormPushTypeService.save(entity); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.Verification, title = "表单类型", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsString = StringUtils.splitIdString(ids); + for (String id : idsString) { + if(id.equals("0")){ + return R.error("默认分类无法删除"); + } + } + boolean result = wxFormPushTypeService.removeByIds(idsString); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/WxFormPushUserController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/WxFormPushUserController.java new file mode 100644 index 0000000..bc6d5e4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/WxFormPushUserController.java @@ -0,0 +1,119 @@ +package com.qs.serve.modules.wx.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.PageUtil; +import com.qs.serve.common.util.CopierUtil; +import com.qs.serve.common.util.StringUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import com.qs.serve.modules.wx.entity.so.WxFormPushUserSo; +import com.qs.serve.modules.wx.entity.bo.WxFormPushUserBo; +import com.qs.serve.modules.wx.entity.WxFormPushUser; +import com.qs.serve.modules.wx.service.WxFormPushUserService; + +import javax.validation.Valid; +import java.util.List; + +/** + * 微信 表单推送用户 + * @author YenHex + * @since 2023-04-24 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("wx/formPushUser") +public class WxFormPushUserController { + + private WxFormPushUserService wxFormPushUserService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/list") + public R> getList(WxFormPushUserSo param){ + WxFormPushUser entity = CopierUtil.copy(param,new WxFormPushUser()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + List list = wxFormPushUserService.list(lqw); + return R.ok(list); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(WxFormPushUserSo param){ + WxFormPushUser entity = CopierUtil.copy(param,new WxFormPushUser()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(entity); + PageUtil.startPage(); + List list = wxFormPushUserService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + //@GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Verification, title = "表单推送用户", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + WxFormPushUser wxFormPushUser = wxFormPushUserService.getById(id); + return R.ok(wxFormPushUser); + } + + + + /** + * 更新 + * @param param + * @return + */ + //@PostMapping("/updateById") + @SysLog(module = SystemModule.Verification, title = "表单推送用户", biz = BizType.UPDATE) + public R updateById(@RequestBody @Valid WxFormPushUserBo param){ + WxFormPushUser entity = CopierUtil.copy(param,new WxFormPushUser()); + boolean result = wxFormPushUserService.updateById(entity); + return R.isTrue(result); + } + + /** + * 新增 + * @param param + * @return + */ + //@PostMapping("/save") + @SysLog(module = SystemModule.Verification, title = "表单推送用户", biz = BizType.INSERT) + public R save(@RequestBody @Valid WxFormPushUserBo param){ + WxFormPushUser entity = CopierUtil.copy(param,new WxFormPushUser()); + boolean result = wxFormPushUserService.save(entity); + return R.isTrue(result); + } + + /** + * 删除 + * @param ids + * @return + */ + @DeleteMapping("/deleteById/{ids}") + @SysLog(module = SystemModule.Verification, title = "表单推送用户", biz = BizType.DELETE) + public R deleteById(@PathVariable("ids") String ids){ + List idsLong = StringUtils.splitIdLong(ids); + boolean result = wxFormPushUserService.removeByIds(idsLong); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/WxTemplateMsgController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/WxTemplateMsgController.java new file mode 100644 index 0000000..68316df --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/WxTemplateMsgController.java @@ -0,0 +1,93 @@ +package com.qs.serve.modules.wx.controller; + +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.PageUtil; +import com.qs.serve.modules.wx.entity.WxTemplateMsg; +import com.qs.serve.modules.wx.service.WxTemplateMsgService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * 微信模板/订阅消息 后台接口 + * @author YenHex + * @since 2022-03-23 + */ +@Slf4j +//@AllArgsConstructor +//@RestController +//@RequestMapping("wx/templateMsg") +public class WxTemplateMsgController { + + private WxTemplateMsgService wxTemplateMsgService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + @PreAuthorize("hasRole('wx:templateMsg:query')") + public R> getPage(WxTemplateMsg param){ + PageUtil.startPage(); + List list = wxTemplateMsgService.list(new QueryWrapper<>(param)); + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @PreAuthorize("hasRole('wx:templateMsg:query')") + public R getById(@PathVariable("id") String id){ + WxTemplateMsg wxTemplateMsg = wxTemplateMsgService.getById(id); + return R.ok(wxTemplateMsg); + } + + + + /** + * 根据ID更新 + * @param param + * @return + */ + @PostMapping("/updateById") + @PreAuthorize("hasRole('wx:templateMsg:update')") + public R updateById(@RequestBody @Valid WxTemplateMsg param){ + boolean result = wxTemplateMsgService.updateById(param); + return R.isTrue(result); + } + + /** + * 新增微信模板/订阅消息 + * @param param + * @return + */ + @PostMapping("/save") + @PreAuthorize("hasRole('wx:templateMsg:insert')") + public R save(@RequestBody @Valid WxTemplateMsg param){ + boolean result = wxTemplateMsgService.save(param); + return R.isTrue(result); + } + + /** + * 删除微信模板/订阅消息 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @PreAuthorize("hasRole('wx:templateMsg:delete')") + public R deleteById(@PathVariable("id") String id){ + boolean result = wxTemplateMsgService.removeById(id); + return R.isTrue(result); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/WxUserController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/WxUserController.java new file mode 100644 index 0000000..9f997ab --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/WxUserController.java @@ -0,0 +1,155 @@ +package com.qs.serve.modules.wx.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.consts.RedisCacheKeys; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.wx.entity.WxUser; +import com.qs.serve.modules.wx.entity.dto.WxUserBindBo; +import com.qs.serve.modules.wx.entity.dto.WxUserRmBindBo; +import com.qs.serve.modules.wx.service.WxUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * 微信用户 后台接口 + * @author YenHex + * @since 2022-03-07 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("wx/user") +public class WxUserController { + + private WxUserService wxUserService; + private SysUserService sysUserService; + private RedisService redisService; + + /** + * 翻页查询 + * @param param + * @return + */ + @GetMapping("/page") + public R> getList(WxUser param){ + PageUtil.startPage(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(param); + //lqw.eq(WxUser::getFirstFlag,1); + if(param.getNotBindFlag()!=null&¶m.getNotBindFlag().equals(1)){ + lqw.isNull(WxUser::getPhone).or().eq(WxUser::getPhone,""); + }else if (param.getNotBindFlag()!=null&¶m.getNotBindFlag().equals(0)){ + lqw.isNotNull(WxUser::getPhone); + lqw.ne(WxUser::getPhone,""); + } + List list = wxUserService.list(lqw); + return R.byPageHelperList(list); + } + + /** + * 根据ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + public R getById(@PathVariable("id") String id){ + WxUser wxUser = wxUserService.getById(id); + return R.ok(wxUser); + } + + /** + * 绑定用户 + * @param param + * @return + */ + @PostMapping("/bind") + public R bind(@RequestBody @Valid WxUserBindBo param){ + WxUser wxUser = wxUserService.getById(param.getWxUserId()); + if(StringUtils.hasText(wxUser.getSysUserId())&&!wxUser.getSysUserId().equals("0")){ + return R.error("该微信用户已被绑定"); + } + SysUser sysUser = sysUserService.getById(param.getSysUserId()); + if(sysUser.getMobile()==null||sysUser.getMobile().length()<4){ + return R.error("用户未绑定手机号"); + } + if(!StringUtils.hasText(wxUser.getUnionId())){ + WxUser updVo = new WxUser(); + updVo.setId(wxUser.getId()); + updVo.setSysUserId(sysUser.getId()); + updVo.setSysUserCode(sysUser.getCode()); + updVo.setEmpName(sysUser.getName()); + updVo.setPhone(sysUser.getMobile()); + wxUserService.updateById(updVo); + }else { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(WxUser::getUnionId,wxUser.getUnionId()); + WxUser updVo = new WxUser(); + updVo.setSysUserId(sysUser.getId()); + updVo.setSysUserCode(sysUser.getCode()); + updVo.setEmpName(sysUser.getName()); + updVo.setPhone(sysUser.getMobile()); + wxUserService.update(updVo,lqw); + } + return R.ok(); + } + + /** + * 移除绑定 + * @param param + * @return + */ + @PostMapping("/rmBind") + public R rmBind(@RequestBody @Valid WxUserRmBindBo param){ + String sysUserId = null; + String wxUserId = null; + if(StringUtils.hasText(param.getWxUserId())){ + WxUser wxUser = wxUserService.getById(param.getWxUserId()); + sysUserId = wxUser.getSysUserId(); + wxUserId = wxUser.getId(); + if(!StringUtils.hasText(wxUser.getUnionId())){ + wxUser.setSysUserId("0"); + wxUser.setSysUserCode(""); + wxUser.setEmpName(wxUser.getNickName()); + wxUser.setPhone(""); + wxUserService.updateById(wxUser); + }else { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(WxUser::getUnionId,wxUser.getUnionId()); + WxUser updVo = new WxUser(); + updVo.setSysUserId("0"); + wxUser.setSysUserCode(""); + updVo.setEmpName(wxUser.getNickName()); + updVo.setPhone(""); + wxUserService.update(updVo,lqw); + } + }else if (StringUtils.hasText(param.getSysUserId())){ + sysUserId = param.getSysUserId(); + SysUser sysUser = sysUserService.getById(param.getSysUserId()); + List wxUserList = wxUserService.getBySysUserId(sysUser.getId()); + for (WxUser wxUser : wxUserList) { + wxUser.setSysUserId("0"); + wxUser.setSysUserCode(""); + wxUser.setEmpName(wxUser.getNickName()); + wxUser.setPhone(""); + wxUserService.updateById(wxUser); + } + } + String client = "wx_app"; + String redisKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client,sysUserId); + redisService.remove(redisKey); + return R.ok(); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/my/WxFormPushMyController.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/my/WxFormPushMyController.java new file mode 100644 index 0000000..06d0c1a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/controller/my/WxFormPushMyController.java @@ -0,0 +1,117 @@ +package com.qs.serve.modules.wx.controller.my; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysAttach; +import com.qs.serve.modules.sys.service.SysAttachService; +import com.qs.serve.modules.wx.entity.WxFormPush; +import com.qs.serve.modules.wx.entity.WxFormPushUser; +import com.qs.serve.modules.wx.mapper.WxFormPushMapper; +import com.qs.serve.modules.wx.service.WxFormPushService; +import com.qs.serve.modules.wx.service.WxFormPushUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +/** + * 微信 表单推送(我的) + * @author YenHex + * @since 2023-04-19 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("my/formPush") +public class WxFormPushMyController { + + private WxFormPushService wxFormPushService; + private WxFormPushMapper wxFormPushMapper; + private SysAttachService attachService; + private WxFormPushUserService wxFormPushUserService; + + /** + * 列表 + * @param param + * @return + */ + @GetMapping("/page") + public R> getList(WxFormPush param){ +// lqw.eq(WxFormPushUser::getUserId,AuthContextUtils.getSysUserId()); +// List list = wxFormPushUserService.list(lqw); +// List result = new ArrayList<>(); +// for (WxFormPushUser pushUser : list) { +// WxFormPush formPush = wxFormPushService.getById(pushUser.getFormPushId()); +// formPush.setReadFlag(pushUser.getReadFlag()); +// result.add(formPush); +// } + PageUtil.startPage(); + param.setQueryUserId(AuthContextUtils.getSysUserId()); + param.setStatus("1"); + List formPushUsers = wxFormPushMapper.selectUserFormPushList(param); + return R.byPageHelperList(formPushUsers); + } + + /** + * 小红点统计(未读数量) + * @return + */ + @GetMapping("/getCounter") + public R getPage(){ + WxFormPush param = new WxFormPush(); + param.setQueryUserId(AuthContextUtils.getSysUserId()); + param.setStatus("1"); + param.setReadFlag(0); + List formPushUsers = wxFormPushMapper.selectUserFormPushList(param); + Map map = new HashMap<>(); + map.put("unFinished",formPushUsers.size()); + return R.ok(map,"ok"); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.Verification, title = "表单推送", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(); + lqw2.eq(WxFormPushUser::getFormPushId,id); + lqw2.eq(WxFormPushUser::getUserId, AuthContextUtils.getSysUserId()); + if(wxFormPushUserService.count(lqw2)<1){ + return R.error("表单已撤销"); + } + WxFormPush wxFormPush = wxFormPushService.getById(id); + if(wxFormPush.getStatus().equals("0")){ + //未发布不能查询 + wxFormPush.setId(null); + wxFormPush.setTitle(null); + wxFormPush.setFormContext(null); + wxFormPush.setFormContextValue(null); + return R.ok(wxFormPush); + } + if(CollectionUtil.isNotEmpty(wxFormPush.getAttachIds())){ + List attachIds = Arrays.asList(wxFormPush.getAttachIds()); + List attachList = attachService.listByIds(attachIds); + wxFormPush.setAttachList(attachList); + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(WxFormPushUser::getFormPushId,id); + lqw.eq(WxFormPushUser::getUserId, AuthContextUtils.getSysUserId()); + lqw.ne(WxFormPushUser::getReadFlag,1); + WxFormPushUser pushUser = new WxFormPushUser(); + pushUser.setReadFlag(1); + wxFormPushUserService.update(pushUser,lqw); + return R.ok(wxFormPush); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/WxApp.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/WxApp.java new file mode 100644 index 0000000..978c310 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/WxApp.java @@ -0,0 +1,115 @@ +package com.qs.serve.modules.wx.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; + +/** + * 微信应用 实体类 + * @author YenHex + * @since 2022-03-07 + */ +@Data +@TableName("wx_app") +public class WxApp implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 应用ID */ + @TableId(type = IdType.INPUT) + private String id; + + /** 机构ID */ + @NotNull(message = "机构ID不能为空") + private String organId; + + /** 微信原始标识 */ + @NotNull(message = "微信原始标识不能为空") + private String weixinSign; + + /** 应用类型【1->小程序;2->公众号;3->企业公众号】 */ + private Integer appType; + + /** 应用密钥 */ + private String secret; + + /** token */ + private String token; + + /** EncodingAESKey */ + private String aesKey; + + /** 微信号名称 */ + private String name; + + /** 是否第三方平台应用【1->是;0->否】 */ + private Integer isComponent; + + /** 【0->订阅号;1->由历史老帐号升级后的订阅号;2->服务号】 */ + private Integer weixinType; + + /** 公众号微信号 */ + private String weixinHao; + + /** 认证类型 */ + private Integer verifyType; + + /** logo */ + private String logo; + + /** 二维码 */ + private String qrCode; + + /** 主体名称 */ + private String principalName; + + /** 微社区URL */ + private String community; + + /** 备注信息 */ + private String remarks; + + /** 绑定的会员卡ID */ + private String vipCardId; + + /** 微信支付商户号 */ + private String mchId; + + /** 微信支付商户密钥 */ + private String mchKey; + + /** p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头) */ + private String keyPath; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 删除标识 */ + @JsonIgnore + private Boolean delFlag; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/WxFormPush.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/WxFormPush.java new file mode 100644 index 0000000..32e7619 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/WxFormPush.java @@ -0,0 +1,182 @@ +package com.qs.serve.modules.wx.entity; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; +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 2023-04-24 + */ +@Data +@TableName(value = "wx_form_push",autoResultMap = true) +public class WxFormPush implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 分类id */ + @Length(max = 36,message = "分类id长度不能超过36字") + private String typeId; + + /** 分类编码 */ + @Length(max = 255,message = "分类编码长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String typeCode; + + /** 分类 */ + @Length(max = 255,message = "分类长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String typeName; + + /** 业务类型,默认:通知 */ + @TableField(condition = SqlCondition.LIKE) + private String businessType; + /** 标题 */ + @Length(max = 255,message = "标题长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String title; + +// @Length(message = "是否发布,保存并发布->1,保存草稿->0") + private String status; + + /** 表单内容 */ + private String formContext; + + /** 表单值 */ + private String formContextValue; + + /** 备注 */ + @Length(max = 600,message = "备注长度不能超过600字") + private String remark; + + /** 预通知标识:0->无通知;1->未通知;2->已通知 */ + private Integer preNotifyStatus; + + /** 生效开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime effectiveStartTime; + + /** 生效结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime effectiveEndTime; + + /** 预通知时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime preNotifyTime; + + /** 发布时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime publishTime; + + /** 附件ids */ + @TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR) + private String[] attachIds; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 是否已读 */ + @TableField(exist = false) + private Integer readFlag; + + /** 查询的用户id */ + @TableField(exist = false) + private String queryUserId; + + @TableField(exist = false) + private String formTitle; + + /** 查询的用户id */ + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate queryStartTime; + + /** 查询的用户id */ + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate queryEndTime; + + + @TableField(exist = false) + private List wxFormPushUserList; + + /** 附件 */ + @TableField(exist = false) + private List attachList; + + /** 显示补偿按钮 */ + @TableField(exist = false) + private Integer showCompensateButton; + + public static WxFormPush toNewObject(WxFormPush source){ + WxFormPush formPush = new WxFormPush(); + formPush.setId(source.getId()); + formPush.setTypeId(source.getTypeId()); + formPush.setTypeCode(source.getTypeCode()); + formPush.setTypeName(source.getTypeName()); + formPush.setTitle(source.getTitle()); + formPush.setFormContext(source.getFormContext()); + formPush.setFormContextValue(source.getFormContextValue()); + formPush.setRemark(source.getRemark()); + formPush.setCreateTime(source.getCreateTime()); + formPush.setUpdateTime(source.getUpdateTime()); + formPush.setTenantId(source.getTenantId()); + formPush.setCreateBy(source.getCreateBy()); + formPush.setUpdateBy(source.getUpdateBy()); + formPush.setDelFlag(source.getDelFlag()); + return formPush; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/WxFormPushType.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/WxFormPushType.java new file mode 100644 index 0000000..208ecaa --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/WxFormPushType.java @@ -0,0 +1,95 @@ +package com.qs.serve.modules.wx.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 2023-04-24 + */ +@Data +@TableName("wx_form_push_type") +public class WxFormPushType implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 编码 */ + @Length(max = 255,message = "编码长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String code; + + /** 标题 */ + @Length(max = 255,message = "标题长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String title; + + /** 备注 */ + @Length(max = 600,message = "备注长度不能超过600字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + + public static WxFormPushType toNewObject(WxFormPushType source){ + WxFormPushType formPushType = new WxFormPushType(); + formPushType.setId(source.getId()); + formPushType.setCode(source.getCode()); + formPushType.setTitle(source.getTitle()); + formPushType.setRemark(source.getRemark()); + formPushType.setCreateTime(source.getCreateTime()); + formPushType.setUpdateTime(source.getUpdateTime()); + formPushType.setTenantId(source.getTenantId()); + formPushType.setCreateBy(source.getCreateBy()); + formPushType.setUpdateBy(source.getUpdateBy()); + formPushType.setDelFlag(source.getDelFlag()); + return formPushType; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/WxFormPushUser.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/WxFormPushUser.java new file mode 100644 index 0000000..bb022cb --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/WxFormPushUser.java @@ -0,0 +1,132 @@ +package com.qs.serve.modules.wx.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 2023-04-24 + */ +@Data +@TableName("wx_form_push_user") +public class WxFormPushUser implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 推送id */ + @Length(max = 36,message = "推送id长度不能超过36字") + private String formPushId; + + @TableField(condition = SqlCondition.LIKE) + private String formTitle; + + /** 推送状态 0-N,1-Y */ + private Integer pushStatus; + + /** 用户id */ + @Length(max = 64,message = "用户id长度不能超过64字") + private String userId; + + /** 用户编码 */ + @Length(max = 255,message = "用户编码长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String userCode; + + /** 用户名称 */ + @Length(max = 255,message = "用户名称长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String userName; + + /** 是否已读 */ + private Integer readFlag; + + /** 备注 */ + @Length(max = 600,message = "备注长度不能超过600字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 分类id */ + @Length(max = 36,message = "分类id长度不能超过36字") + private String typeId; + + /** 分类编码 */ + @Length(max = 255,message = "分类编码长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String typeCode; + + /** 分类 */ + @Length(max = 255,message = "分类长度不能超过255字") + @TableField(condition = SqlCondition.LIKE) + private String typeName; + + + public static WxFormPushUser toNewObject(WxFormPushUser source){ + WxFormPushUser formPushUser = new WxFormPushUser(); + formPushUser.setId(source.getId()); + formPushUser.setFormPushId(source.getFormPushId()); + formPushUser.setUserId(source.getUserId()); + formPushUser.setUserCode(source.getUserCode()); + formPushUser.setUserName(source.getUserName()); + formPushUser.setReadFlag(source.getReadFlag()); + formPushUser.setRemark(source.getRemark()); + formPushUser.setCreateTime(source.getCreateTime()); + formPushUser.setUpdateTime(source.getUpdateTime()); + formPushUser.setTenantId(source.getTenantId()); + formPushUser.setCreateBy(source.getCreateBy()); + formPushUser.setUpdateBy(source.getUpdateBy()); + formPushUser.setDelFlag(source.getDelFlag()); + formPushUser.setTypeId(source.getTypeId()); + formPushUser.setTypeCode(source.getTypeCode()); + formPushUser.setTypeName(source.getTypeName()); + return formPushUser; + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/WxTemplateMsg.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/WxTemplateMsg.java new file mode 100644 index 0000000..83df80b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/WxTemplateMsg.java @@ -0,0 +1,73 @@ +package com.qs.serve.modules.wx.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; + +/** + * 微信模板/订阅消息 实体类 + * @author YenHex + * @since 2022-03-23 + */ +@Data +@TableName("wx_template_msg") +public class WxTemplateMsg implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 微信应用id */ + @NotNull(message = "微信应用id不能为空") + private String appId; + + /** 模板ID */ + @NotNull(message = "模板ID不能为空") + private String templateId; + + /** 模版标题 */ + @NotNull(message = "模版标题不能为空") + private String title; + + /** 跳转地址 */ + private String jumpUrl; + + /** 是否启用 */ + private Integer enable; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + private String tenantId; + + /** 删除标识 */ + private Boolean delFlag; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/WxUser.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/WxUser.java new file mode 100644 index 0000000..d97e775 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/WxUser.java @@ -0,0 +1,153 @@ +package com.qs.serve.modules.wx.entity; + +import java.time.LocalDateTime; +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; + +/** + * 微信用户 实体类 + * @author YenHex + * @since 2022-03-07 + */ +@Data +@TableName("wx_user") +public class WxUser implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 公众号配置ID、小程序AppID */ + @NotNull(message = "公众号配置ID、小程序AppID不能为空") + private String appId; + + private String sysUserId; + private String sysUserCode; + + /** 应用类型【1->小程序;2->公众号】 */ + private Integer appType; + + /** 是否订阅【1->是;0->否;2->网页授权用户】 */ + private Integer subscribe; + + /** 返回用户关注的渠道来源,ADD_SCENE_SEARCH 公众号搜索,ADD_SCENE_ACCOUNT_MIGRATION 公众号迁移,ADD_SCENE_PROFILE_CARD 名片分享,ADD_SCENE_QR_CODE 扫描二维码,ADD_SCENEPROFILE LINK 图文页内名称点击,ADD_SCENE_PROFILE_ITEM 图文页右上角菜单,ADD_SCENE_PAID 支付后关注,ADD_SCENE_OTHERS 其他 */ + private String subscribeScene; + + /** 关注时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime subscribeTime; + + /** 关注次数 */ + private Integer subscribeNum; + + /** 取消关注时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime cancelSubscribeTime; + + /** 用户标识 */ + @NotNull(message = "用户标识不能为空") + private String openId; + + /** wx昵称 */ + @TableField(condition = SqlCondition.LIKE) + private String nickName; + + /** 员工昵称 */ + @TableField(condition = SqlCondition.LIKE) + private String empName; + + /** 性别(1:男,2:女,0:未知) */ + private String sex; + + /** 所在城市 */ + private String city; + + /** 所在国家 */ + private String country; + + /** 所在省份 */ + private String province; + + /** 手机号码 */ + @TableField(condition = SqlCondition.LIKE) + private String phone; + + /** 用户语言 */ + private String language; + + /** 头像 */ + private String headimgUrl; + + /** union_id */ + private String unionId; + + /** 用户组 */ + private String groupId; + + /** 标签列表 */ + private String tagidList; + + /** 二维码扫码场景 */ + private String qrSceneStr; + + /** 地理位置纬度 */ + private Double latitude; + + /** 地理位置经度 */ + private Double longitude; + + /** 地理位置精度 */ + private Double precisionVal; + + /** 会话密钥 */ + private String sessionKey; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 删除标识 */ + @JsonIgnore + private Boolean delFlag; + + @JsonIgnore + private Integer firstFlag; + + /** + * 为绑定标识,当值=1表未绑定用户 + */ + @TableField(exist = false) + private Integer notBindFlag; + + @TableField(exist = false) + private Object sysUserInfo; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/bo/WxFormPushBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/bo/WxFormPushBo.java new file mode 100644 index 0000000..66e53a0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/bo/WxFormPushBo.java @@ -0,0 +1,72 @@ +package com.qs.serve.modules.wx.entity.bo; + +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 java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; +/** + * 表单推送 实体类 + * @author YenHex + * @since 2023-04-19 + */ +@Data +public class WxFormPushBo implements Serializable { + + private String id; + + @NotNull(message = "分类Id不能为空") + private String typeId; + /** 推送分类编码 */ + + /** 标题 */ + @NotNull(message = "标题不能为空") + private String title; + + /** 表单内容 */ + @NotNull(message = "表单内容不能为空") + private String formContext; + + /** 业务类型,默认:通知 */ + private String businessType; + + /** 表单值 */ + private String formContextValue; + + /** 备注 */ + private String remark; + + /** 工号列表 */ + @NotNull(message = "人员ID不能为空") + private List userIds; + + /** 是否发布,保存并发布->1,保存草稿->0 */ + @NotNull(message = "状态不能为空") + private String status; + + /** 附件ids */ + private String[] attachIds; + + /** 预通知时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime preNotifyTime; + + /** 生效开始时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime effectiveStartTime; + + /** 生效结束时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime effectiveEndTime; +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/bo/WxFormPushThirdBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/bo/WxFormPushThirdBo.java new file mode 100644 index 0000000..8040401 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/bo/WxFormPushThirdBo.java @@ -0,0 +1,51 @@ +package com.qs.serve.modules.wx.entity.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * 表单推送 实体类 + * @author YenHex + * @since 2023-04-19 + */ +@Data +public class WxFormPushThirdBo implements Serializable { + + private String id; + /** APPID */ + @NotNull(message = "appId不能为空") + private String appId; + + private String typeId; + /** 推送分类编码 */ + private String typeCode; + + /** 标题 */ + @NotNull(message = "标题不能为空") + private String title; + + /** 表单内容 */ + @NotNull(message = "表单内容不能为空") + private String formContext; + + /** 业务类型,默认:通知 */ + private String businessType; + + /** 表单值 */ + private String formContextValue; + + /** 备注 */ + private String remark; + + /** 工号列表 */ + @NotNull(message = "工号列表不能为空") + private List userCodes; + + @NotNull(message = "是否发布,保存并发布->1,保存草稿->0") + private String status; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/bo/WxFormPushTypeBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/bo/WxFormPushTypeBo.java new file mode 100644 index 0000000..19696c0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/bo/WxFormPushTypeBo.java @@ -0,0 +1,44 @@ +package com.qs.serve.modules.wx.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 表单类型 Bo + * @author YenHex + * @since 2023-04-24 + */ +@Data +public class WxFormPushTypeBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private String id; + + /** 编码 */ + @Length(max = 255,message = "编码长度不能超过255字") + private String code; + + /** 标题 */ + @Length(max = 255,message = "标题长度不能超过255字") + private String title; + + /** 备注 */ + @Length(max = 600,message = "备注长度不能超过600字") + private String remark; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/bo/WxFormPushUserBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/bo/WxFormPushUserBo.java new file mode 100644 index 0000000..dd73c24 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/bo/WxFormPushUserBo.java @@ -0,0 +1,91 @@ +package com.qs.serve.modules.wx.entity.bo; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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; + +/** + * 表单推送用户 Bo + * @author YenHex + * @since 2023-04-24 + */ +@Data +public class WxFormPushUserBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 推送id */ + @Length(max = 36,message = "推送id长度不能超过36字") + private String formPushId; + + /** 用户id */ + @Length(max = 64,message = "用户id长度不能超过64字") + private String userId; + + /** 用户编码 */ + @Length(max = 255,message = "用户编码长度不能超过255字") + private String userCode; + + /** 用户名称 */ + @Length(max = 255,message = "用户名称长度不能超过255字") + private String userName; + + /** 是否已读 */ + private Integer readFlag; + + /** 备注 */ + @Length(max = 600,message = "备注长度不能超过600字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 分类id */ + @Length(max = 36,message = "分类id长度不能超过36字") + private String typeId; + + /** 分类编码 */ + @Length(max = 255,message = "分类编码长度不能超过255字") + private String typeCode; + + /** 分类 */ + @Length(max = 255,message = "分类长度不能超过255字") + private String typeName; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/dto/WxLoginUser.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/dto/WxLoginUser.java new file mode 100644 index 0000000..8cdc7a5 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/dto/WxLoginUser.java @@ -0,0 +1,23 @@ +package com.qs.serve.modules.wx.entity.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/3/7 + */ +@Data +public class WxLoginUser { + + @NotNull + private String code; + + /** + * 默认空或0,默认页面授权 + * 1,页面扫码登录 + */ + private Integer codeType; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/dto/WxPhoneBindParam.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/dto/WxPhoneBindParam.java new file mode 100644 index 0000000..b3b3c05 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/dto/WxPhoneBindParam.java @@ -0,0 +1,20 @@ +package com.qs.serve.modules.wx.entity.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/3/11 + */ +@Data +public class WxPhoneBindParam { + + @NotNull + private String phone; + + @NotNull + private String code; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/dto/WxUserBindBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/dto/WxUserBindBo.java new file mode 100644 index 0000000..9a511ed --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/dto/WxUserBindBo.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.wx.entity.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/9/26 + */ +@Data +public class WxUserBindBo { + + /** + * 微信用户ID + */ + @NotNull + private String wxUserId; + + /** + * 人员用户ID + */ + @NotNull + private String sysUserId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/dto/WxUserRmBindBo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/dto/WxUserRmBindBo.java new file mode 100644 index 0000000..fe12d92 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/dto/WxUserRmBindBo.java @@ -0,0 +1,24 @@ +package com.qs.serve.modules.wx.entity.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author YenHex + * @since 2022/9/26 + */ +@Data +public class WxUserRmBindBo { + + /** + * 微信用户ID(其一不能为空) + */ + private String wxUserId; + + /** + * 人员用户ID(其一不能为空) + */ + private String sysUserId; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/dto/sms/WxSmsNewForm.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/dto/sms/WxSmsNewForm.java new file mode 100644 index 0000000..d080631 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/dto/sms/WxSmsNewForm.java @@ -0,0 +1,42 @@ +package com.qs.serve.modules.wx.entity.dto.sms; + +import com.qs.serve.common.util.model.wx.WxSmsProp; +import com.qs.serve.common.util.model.wx.SmsBaseDto; +import lombok.Getter; +import lombok.Setter; + +/** + * @author YenHex + * @since 2022/9/21 + */ +@Getter +public class WxSmsNewForm extends SmsBaseDto { + + @Setter + @WxSmsProp(keyword = "first") + private String title; + + @Setter + @WxSmsProp(keyword = "keyword1") + private String userName; + + @Setter + @WxSmsProp(keyword = "keyword2") + private String bizType; + + @Setter + @WxSmsProp(keyword = "keyword3") + private String bitTime; + + @Setter + @WxSmsProp(keyword = "remark") + private String remark; + + public void setRemark(String remark) { + if(remark==null){ + this.remark = title; + }else { + this.remark = title + "(" +remark+")"; + } + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/so/WxFormPushTypeSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/so/WxFormPushTypeSo.java new file mode 100644 index 0000000..1b27d83 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/so/WxFormPushTypeSo.java @@ -0,0 +1,36 @@ +package com.qs.serve.modules.wx.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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 2023-04-24 + */ +@Data +public class WxFormPushTypeSo implements Serializable { + + private static final long serialVersionUID = 1L; + + + /** 编码 */ + private String code; + + /** 标题 */ + private String title; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/so/WxFormPushUserSo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/so/WxFormPushUserSo.java new file mode 100644 index 0000000..7e232cc --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/so/WxFormPushUserSo.java @@ -0,0 +1,86 @@ +package com.qs.serve.modules.wx.entity.so; + +import java.time.LocalDate; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +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 2023-04-24 + */ +@Data +public class WxFormPushUserSo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 推送id */ + private String formPushId; + + /** 用户id */ + private String userId; + + /** 推送状态 0-N,1-Y */ + private Integer pushStatus; + + /** 用户编码 */ + private String userCode; + + /** 用户名称 */ + private String userName; + + /** 是否已读 */ + private Integer readFlag; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 创建人 */ + private String createBy; + + /** 更新人 */ + private String updateBy; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 分类id */ + private String typeId; + + /** 分类编码 */ + private String typeCode; + + /** 分类 */ + private String typeName; + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/vo/WxPushResultVo.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/vo/WxPushResultVo.java new file mode 100644 index 0000000..defec29 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/entity/vo/WxPushResultVo.java @@ -0,0 +1,19 @@ +package com.qs.serve.modules.wx.entity.vo; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/4/19 + */ +@Data +public class WxPushResultVo { + + /** + * 未绑定的用户列表 + */ + List notBindUserCodeList; + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/mapper/WxAppMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/mapper/WxAppMapper.java new file mode 100644 index 0000000..2833bff --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/mapper/WxAppMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.wx.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.wx.entity.WxApp; + +/** + * 微信应用 Mapper + * @author YenHex + * @date 2022-03-07 + */ +public interface WxAppMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/mapper/WxFormPushMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/mapper/WxFormPushMapper.java new file mode 100644 index 0000000..a03f17c --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/mapper/WxFormPushMapper.java @@ -0,0 +1,21 @@ +package com.qs.serve.modules.wx.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.wx.entity.WxFormPush; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +import java.util.List; +/** + * 表单推送 Mapper + * @author YenHex + * @date 2023-04-19 + */ +public interface WxFormPushMapper extends BaseMapper { + + List selectUserFormPushList(@Param("query") WxFormPush param); + + @Update("update `wx_form_push` set pre_notify_time = null where id = #{id}") + void updateSetNotifyTimeNull(@Param("id")String id); +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/mapper/WxFormPushTypeMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/mapper/WxFormPushTypeMapper.java new file mode 100644 index 0000000..db2e12a --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/mapper/WxFormPushTypeMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.wx.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.wx.entity.WxFormPushType; + +/** + * 表单类型 Mapper + * @author YenHex + * @date 2023-04-24 + */ +public interface WxFormPushTypeMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/mapper/WxFormPushUserMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/mapper/WxFormPushUserMapper.java new file mode 100644 index 0000000..8dc81a6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/mapper/WxFormPushUserMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.wx.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.wx.entity.WxFormPushUser; + +/** + * 表单推送用户 Mapper + * @author YenHex + * @date 2023-04-19 + */ +public interface WxFormPushUserMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/mapper/WxTemplateMsgMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/mapper/WxTemplateMsgMapper.java new file mode 100644 index 0000000..e9ca153 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/mapper/WxTemplateMsgMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.wx.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.wx.entity.WxTemplateMsg; + +/** + * 微信模板/订阅消息 Mapper + * @author YenHex + * @date 2022-03-23 + */ +public interface WxTemplateMsgMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/mapper/WxUserMapper.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/mapper/WxUserMapper.java new file mode 100644 index 0000000..51599d4 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/mapper/WxUserMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.wx.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.wx.entity.WxUser; + +/** + * 微信用户 Mapper + * @author YenHex + * @date 2022-03-07 + */ +public interface WxUserMapper extends BaseMapper { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxAppService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxAppService.java new file mode 100644 index 0000000..134ab14 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxAppService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.wx.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.wx.entity.WxApp; + +/** + * 微信应用 服务接口 + * @author YenHex + * @date 2022-03-07 + */ +public interface WxAppService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxFormPushService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxFormPushService.java new file mode 100644 index 0000000..58445c0 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxFormPushService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.wx.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.wx.entity.WxFormPush; + +/** + * 表单推送 服务接口 + * @author YenHex + * @date 2023-04-19 + */ +public interface WxFormPushService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxFormPushTypeService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxFormPushTypeService.java new file mode 100644 index 0000000..f8a31d6 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxFormPushTypeService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.wx.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.wx.entity.WxFormPushType; + +/** + * 表单类型 服务接口 + * @author YenHex + * @date 2023-04-24 + */ +public interface WxFormPushTypeService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxFormPushUserService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxFormPushUserService.java new file mode 100644 index 0000000..246aafd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxFormPushUserService.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.wx.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.wx.entity.WxFormPushUser; + +/** + * 表单推送用户 服务接口 + * @author YenHex + * @date 2023-04-19 + */ +public interface WxFormPushUserService extends IService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxPushService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxPushService.java new file mode 100644 index 0000000..b2f2986 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxPushService.java @@ -0,0 +1,36 @@ +package com.qs.serve.modules.wx.service; + +import com.qs.serve.modules.wx.entity.WxUser; +import com.qs.serve.common.util.model.wx.SmsBaseDto; +import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; + +/** + * @author YenHex + * @since 2022/3/16 + */ +public interface WxPushService { + + /** + * 发送微信模板信息 + * @param appId + * @param message + * @return 是否推送成功 + */ + void sendWxMsg(String appId,WxMpTemplateMessage message); + + void sendWxMsg(WxUser wxUser, String title, SmsBaseDto body); + + void sendWxMsg(WxUser wxUser,String title,SmsBaseDto body,Boolean jumpUrl); + + /** + * 通用方法 + * @param wxUser + * @param title + * @param body + * @param jumpUrl + * @param key + * @return + */ + void sendWxMsg(WxUser wxUser,String title,SmsBaseDto body,Boolean jumpUrl,String key); + +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxTemplateMsgService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxTemplateMsgService.java new file mode 100644 index 0000000..74ef16d --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxTemplateMsgService.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.wx.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.wx.entity.WxTemplateMsg; + +/** + * 微信模板/订阅消息 服务接口 + * @author YenHex + * @date 2022-03-23 + */ +public interface WxTemplateMsgService extends IService { + + /** + * 标题查询 + * @param appId + * @param title + * @return + */ + WxTemplateMsg getByTitle(String appId,String title); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxUserService.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxUserService.java new file mode 100644 index 0000000..b0aaeb7 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/WxUserService.java @@ -0,0 +1,53 @@ +package com.qs.serve.modules.wx.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.wx.entity.WxUser; +import com.qs.serve.modules.wx.entity.dto.WxLoginUser; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * 微信用户 服务接口 + * @author YenHex + * @date 2022-03-07 + */ +public interface WxUserService extends IService { + + WxUser getCurrentWxUser(); + /** + * 获取当前微信用 + * @param updateSub + * @return + */ + WxUser getCurrentWxUser(boolean updateSub); + + WxUser getCurrentWxUser(boolean updateSub,boolean changePubUser); + + void syncSubscribe(); + + List getByUnionId(String unionId); + List getBySysUserId(String userId); + WxUser getByCurrSysUserId(String userId); + List getBySysUserIds(List userIds); + + /** + * 用户登录 + * @param wxLoginUser + * @return + * @throws Exception + */ + WxUser login(WxLoginUser wxLoginUser, HttpServletRequest request) throws Exception; + + /** + * openId查询 + * @param openId + * @return + */ + @Deprecated + WxUser getByOpenId(String openId); + + WxUser getByOpenId(String appId,String openId); + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxAppServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxAppServiceImpl.java new file mode 100644 index 0000000..4083858 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxAppServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.wx.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.wx.entity.WxApp; +import com.qs.serve.modules.wx.mapper.WxAppMapper; +import com.qs.serve.modules.wx.service.WxAppService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 微信应用 服务实现类 + * @author YenHex + * @since 2022-03-07 + */ +@Slf4j +@Service +@AllArgsConstructor +public class WxAppServiceImpl extends ServiceImpl implements WxAppService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxFormPushServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxFormPushServiceImpl.java new file mode 100644 index 0000000..2d000fd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxFormPushServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.wx.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.wx.entity.WxFormPush; +import com.qs.serve.modules.wx.service.WxFormPushService; +import com.qs.serve.modules.wx.mapper.WxFormPushMapper; + +/** + * 表单推送 服务实现类 + * @author YenHex + * @since 2023-04-19 + */ +@Slf4j +@Service +@AllArgsConstructor +public class WxFormPushServiceImpl extends ServiceImpl implements WxFormPushService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxFormPushTypeServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxFormPushTypeServiceImpl.java new file mode 100644 index 0000000..d4f8ebd --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxFormPushTypeServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.wx.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.wx.entity.WxFormPushType; +import com.qs.serve.modules.wx.service.WxFormPushTypeService; +import com.qs.serve.modules.wx.mapper.WxFormPushTypeMapper; + +/** + * 表单类型 服务实现类 + * @author YenHex + * @since 2023-04-24 + */ +@Slf4j +@Service +@AllArgsConstructor +public class WxFormPushTypeServiceImpl extends ServiceImpl implements WxFormPushTypeService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxFormPushUserServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxFormPushUserServiceImpl.java new file mode 100644 index 0000000..6080e4f --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxFormPushUserServiceImpl.java @@ -0,0 +1,22 @@ +package com.qs.serve.modules.wx.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import com.qs.serve.modules.wx.entity.WxFormPushUser; +import com.qs.serve.modules.wx.service.WxFormPushUserService; +import com.qs.serve.modules.wx.mapper.WxFormPushUserMapper; + +/** + * 表单推送用户 服务实现类 + * @author YenHex + * @since 2023-04-19 + */ +@Slf4j +@Service +@AllArgsConstructor +public class WxFormPushUserServiceImpl extends ServiceImpl implements WxFormPushUserService { + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxPushServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxPushServiceImpl.java new file mode 100644 index 0000000..c4ac93b --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxPushServiceImpl.java @@ -0,0 +1,80 @@ +package com.qs.serve.modules.wx.service.impl; + +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.common.util.JsonUtil; +import com.qs.serve.common.util.SmsReflectUtil; +import com.qs.serve.modules.wx.common.conf.WxMpConfig; +import com.qs.serve.modules.wx.entity.WxTemplateMsg; +import com.qs.serve.modules.wx.entity.WxUser; +import com.qs.serve.common.util.model.wx.SmsBaseDto; +import com.qs.serve.modules.wx.service.WxPushService; +import com.qs.serve.modules.wx.service.WxTemplateMsgService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +/** + * 微信推送 + * @author YenHex + * @since 2022/3/16 + */ +@Slf4j +@Service +@AllArgsConstructor +public class WxPushServiceImpl implements WxPushService { + + @Autowired(required = false) + private WxMpConfig wxMpConfig; + + private final WxTemplateMsgService wxTemplateMsgService; + + @Async + @Override + public void sendWxMsg(String appId,WxMpTemplateMessage message) { + String msgId = null; + try { + // 发送模板消息 + msgId = wxMpConfig.wxMpService().switchoverTo(appId).getTemplateMsgService().sendTemplateMsg(message); + } catch (WxErrorException e) { + log.warn("推送微信模板失败,{}",e.getMessage()); + } + log.info("推送微信模板信息:{}\n{}", msgId != null ? "成功" : "失败", JsonUtil.objectToJson(message)); + } + + @Override + public void sendWxMsg(WxUser wxUser, String title, SmsBaseDto body) { + sendWxMsg(wxUser, title, body,false); + } + + @Override + public void sendWxMsg(WxUser wxUser, String title, SmsBaseDto body, Boolean jumpUrl) { + sendWxMsg(wxUser, title, body, jumpUrl,null); + } + + @Async + @Override + public void sendWxMsg(WxUser wxUser, String title, SmsBaseDto body, Boolean jumpUrl, String key) { + AuthContextUtils.setTenant("001"); + try { + WxTemplateMsg wxTemplateMsg = wxTemplateMsgService.getByTitle(wxUser.getAppId(),title); + if(wxTemplateMsg!=null){ + WxMpTemplateMessage wxMpTemplateMessage = + WxMpTemplateMessage.builder().templateId(wxTemplateMsg.getTemplateId()) + .toUser(wxUser.getOpenId()) + .data(SmsReflectUtil.getTemplateDataList(body)).build(); + if(jumpUrl){ + wxMpTemplateMessage.setUrl(key==null?wxTemplateMsg.getJumpUrl():wxTemplateMsg.getJumpUrl()+key); + } + sendWxMsg(wxUser.getAppId(),wxMpTemplateMessage); + }else { + log.warn("AppId:{},无可用的微信通知模板:[{}]",wxUser.getAppId(),title); + } + } catch (Exception e) { + log.warn(e.getMessage()); + } + } +} diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxTemplateMsgServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxTemplateMsgServiceImpl.java new file mode 100644 index 0000000..42eac09 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxTemplateMsgServiceImpl.java @@ -0,0 +1,32 @@ +package com.qs.serve.modules.wx.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.wx.entity.WxTemplateMsg; +import com.qs.serve.modules.wx.mapper.WxTemplateMsgMapper; +import com.qs.serve.modules.wx.service.WxTemplateMsgService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 微信模板/订阅消息 服务实现类 + * @author YenHex + * @since 2022-03-23 + */ +@Slf4j +@Service +@AllArgsConstructor +public class WxTemplateMsgServiceImpl extends ServiceImpl implements WxTemplateMsgService { + + @Override + public WxTemplateMsg getByTitle(String appId,String title) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(WxTemplateMsg::getTitle,title); + wrapper.eq(WxTemplateMsg::getAppId,appId); + wrapper.eq(WxTemplateMsg::getEnable,1); + return getOne(wrapper,false); + } + +} + diff --git a/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxUserServiceImpl.java b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxUserServiceImpl.java new file mode 100644 index 0000000..c8c2025 --- /dev/null +++ b/cms-modules/cms-system/src/main/java/com/qs/serve/modules/wx/service/impl/WxUserServiceImpl.java @@ -0,0 +1,323 @@ +package com.qs.serve.modules.wx.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.consts.GySysConst; +import com.qs.serve.common.model.consts.RedisCacheKeys; +import com.qs.serve.common.model.enums.HttpCode; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.sys.common.AuthContextUtils; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.mapper.SysUserMapper; +import com.qs.serve.modules.wx.common.conf.WxCpConfig; +import com.qs.serve.modules.wx.common.conf.WxMpConfig; +import com.qs.serve.modules.wx.common.consts.WxStatusConst; +import com.qs.serve.modules.wx.entity.WxApp; +import com.qs.serve.modules.wx.entity.WxUser; +import com.qs.serve.modules.wx.entity.dto.WxLoginUser; +import com.qs.serve.modules.wx.mapper.WxUserMapper; +import com.qs.serve.modules.wx.service.WxAppService; +import com.qs.serve.modules.wx.service.WxUserService; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.bean.WxOAuth2UserInfo; +import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.service.WxOAuth2Service; +import me.chanjar.weixin.cp.api.WxCpOAuth2Service; +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.api.WxCpUserService; +import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl; +import me.chanjar.weixin.cp.bean.WxCpOauth2UserInfo; +import me.chanjar.weixin.cp.bean.WxCpUser; +import me.chanjar.weixin.cp.bean.WxCpUserDetail; +import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.WxMpUserService; +import me.chanjar.weixin.mp.bean.result.WxMpUser; +import me.chanjar.weixin.mp.bean.result.WxMpUserList; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; + +/** + * 微信用户 服务实现类 + * @author YenHex + * @since 2022-03-07 + */ +@Slf4j +@Service +public class WxUserServiceImpl extends ServiceImpl implements WxUserService { + + @Autowired(required = false) + private WxMpConfig wxMpConfig; + + @Autowired(required = false) + private WxAppService wxAppService; + + @Autowired + private RedisService redisService; + + @Autowired + private SysUserMapper sysUserMapper; + + private List getOpenIds(WxMpUserService wxMpUserService,String nextOpenId){ + WxMpUserList wxMpUserList = null; + List openIds = new ArrayList<>(); + try { + wxMpUserList = wxMpUserService.userList(nextOpenId); + openIds = wxMpUserList.getOpenids(); + String currNextOpenId = wxMpUserList.getNextOpenid(); + if(openIds.size() == 10000) { + openIds.addAll(getOpenIds(wxMpUserService,currNextOpenId)); + } + } catch (WxErrorException e) { + e.printStackTrace(); + } + return openIds; + } + + @Override + public void syncSubscribe(){ + log.warn("**同步订阅用户流程-开始**"); + WxMpUserService wxMpUserService = wxMpConfig.wxMpService().getUserService(); + List allOpenIds = this.getOpenIds(wxMpUserService,null); + if(CollectionUtil.isEmpty(allOpenIds)){ + List> tmpList = CollectionUtil.createList(allOpenIds,800); + for (List openIdList : tmpList) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(WxUser::getSubscribe,0); + lqw.in(WxUser::getOpenId,openIdList); + WxUser wxUser = new WxUser(); + wxUser.setSubscribe(1); + this.update(wxUser,lqw); + } + } + log.warn("**同步订阅用户流程-结束**"); + } + + + @Override + public WxUser getCurrentWxUser() { + return this.getCurrentWxUser(false); + } + + + @Override + public WxUser getCurrentWxUser( boolean updateSub) { + return getCurrentWxUser(updateSub,true); + } + + @Override + public WxUser getCurrentWxUser(boolean updateSub, boolean changePubUser) { + String token = ServletUtils.getHeader(GySysConst.APP_TOKEN_PROP); + String wxUserKey = StringUtils.format(RedisCacheKeys.WX_KEY_USER,token); + String wxUserId = redisService.getString(wxUserKey); + String appId = AuthContextUtils.getAppId(); + WxUser wxUser = this.getById(wxUserId); + if(updateSub&&!wxUser.getId().equals("1") + &&(wxUser.getAppType().equals(1)||wxUser.getAppType().equals(2)) + &&changePubUser + ){ + try { + WxMpService wxMpService = wxMpConfig.wxMpService().switchoverTo(appId); + WxMpUser wxMpUser = wxMpService.getUserService().userInfo(wxUser.getOpenId(), GySysConst.LANG_ZH_CN); + wxUser.setSubscribe(wxMpUser.getSubscribe()?1:0); + wxUser.setSubscribeScene(wxMpUser.getSubscribeScene()); + wxUser.setTagidList(JsonUtil.objectToJson(wxMpUser.getTagIds())); + wxUser.setUnionId(wxMpUser.getUnionId()); + } catch (WxErrorException e) { + e.printStackTrace(); + } + } + return wxUser; + } + + @Override + public List getByUnionId(String unionId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(WxUser::getUnionId,unionId); + return this.list(lqw); + } + + @Override + public List getBySysUserId(String userId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(WxUser::getSysUserId,userId); + return this.list(lqw); + } + + @Override + public WxUser getByCurrSysUserId(String userId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(WxUser::getSysUserId,userId); + lqw.eq(WxUser::getAppId,AuthContextUtils.getAppId(false)); + return this.getOne(lqw,false); + } + + @Override + public List getBySysUserIds(List userIds) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(WxUser::getSysUserId,userIds); + return this.list(lqw); + } + + @Override + public WxUser login(WxLoginUser wxLoginUser, HttpServletRequest request){ + String code = wxLoginUser.getCode(); + String appId = AuthContextUtils.getAppId(); + String agentIdStr = request.getHeader("agentId"); + WxApp wxApp = wxAppService.getById(appId); + WxUser wxUser = null; + if(wxApp.getAppType().equals(WxStatusConst.WxApp_AppType_3)){ + Integer agentId = Integer.parseInt(agentIdStr); + // 企业微信登录 + WxCpService wxCpService = new WxCpServiceImpl(); + WxCpDefaultConfigImpl config =new WxCpDefaultConfigImpl(); + config.setAgentId(agentId); + config.setCorpSecret(WxCpConfig.getSecret(agentId)); + config.setOauth2redirectUri(""); + config.setCorpId(wxApp.getId()); + wxCpService.setWxCpConfigStorage(config); + log.debug("企业微信登录:appid:{} agId:{} code:{}",appId,agentId,code); + // 授权方式登录 + WxCpOAuth2Service oauth2Service = wxCpService.getOauth2Service(); + WxCpOauth2UserInfo cpOauth2UserInfo = null; + + // 获取敏感信息 + WxCpUserDetail wxCpUserDetail = null; + WxCpUser wxCpUser = null; + String userId = null; + try { + cpOauth2UserInfo = oauth2Service.getUserInfo(agentId,code); + log.debug("cpOauth2UserInfo=>{}", JsonUtil.objectToJson(cpOauth2UserInfo)); + if(wxLoginUser.getCodeType()!=null && wxLoginUser.getCodeType().equals(1)){ + // web扫码登录方式 + userId = cpOauth2UserInfo.getUserId(); + WxCpUserService cpUserService = wxCpService.getUserService(); + if(cpUserService==null){ + Assert.throwEx("cpUserService is null"); + } + wxCpUser = cpUserService.getById(userId); + if(wxCpUser==null){ + Assert.throwEx("wxCpUser is null"); + } + }else { + // 默认授权方式 + // 基础用户信息 + WxCpUserService wxCpUserService = wxCpService.getUserService(); + wxCpUser = wxCpUserService.getById(cpOauth2UserInfo.getUserId()); + // 获取敏感信息 + wxCpUserDetail = oauth2Service.getUserDetail(cpOauth2UserInfo.getUserTicket()); + if(wxCpUser==null){ + Assert.throwEx("企业微信登录失败 002 :wxCpUser is null"); + } + userId = wxCpUserDetail.getUserId(); + } + } catch (WxErrorException e) { + log.error("企业微信登录失败:{}",e.getMessage()); + } + if (userId==null){ + Assert.throwEx("企业微信登录失败 001 :userId is null"); + } + + wxUser = this.getByOpenId(appId,userId); + if(wxUser == null){ + wxUser = new WxUser(); + wxUser.setAppId(wxApp.getId()); + wxUser.setAppType(wxApp.getAppType()); + wxUser.setNickName(wxCpUser.getName()); + wxUser.setEmpName(wxCpUser.getName()); + wxUser.setUnionId(userId); + wxUser.setOpenId(userId); + //wxUser.setHeadimgUrl(wxCpUserDetail.getAvatar()); + } + //通过手机号绑定员工号 + //if(StringUtils.hasText(wxCpUser.getMobile())){ + //List sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper() + // .eq(SysUser::getMobile,wxCpUser.getMobile())); + List sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper().eq(SysUser::getCode,userId)); + if(sysUsers.size()>0){ + if(sysUsers.size()>1){ + //log.error("企业微信登录,一个号码被多人使用:{}",wxCpUser.getMobile()); + log.error("企业微信登录,员工号出现重复:{}",userId); + } + SysUser sysUser = sysUsers.get(0); + wxUser.setSysUserId(sysUser.getId()); + wxUser.setSysUserCode(sysUser.getCode()); + wxUser.setEmpName(sysUser.getName()); + wxUser.setPhone(sysUser.getMobile()); + }else { + //Assert.throwEx("CMS未收录该手机号["+wxCpUser.getMobile()+"]"); + Assert.throwEx("CMS未收录该员工号["+userId+"]"); + } + if(wxUser.getId()==null){ + save(wxUser); + }else { + updateById(wxUser); + } + }else if(wxApp.getAppType().equals(WxStatusConst.WxApp_AppType_1)){ + Assert.throwEx(HttpCode.DEV_ERR); + }else if(wxApp.getAppType().equals(WxStatusConst.WxApp_AppType_2)){ + WxMpService wxMpService = wxMpConfig.wxMpService().switchoverTo(appId); + WxOAuth2Service auth2Service = wxMpService.getOAuth2Service(); + try { + WxOAuth2AccessToken auth2AccessToken = auth2Service.getAccessToken(code); + log.debug("auth2AccessToken:{}",auth2AccessToken.getAccessToken()); + WxOAuth2UserInfo auth2UserInfo = auth2Service.getUserInfo(auth2AccessToken, GySysConst.LANG_ZH_CN); + WxMpUser wxMpUser = wxMpService.getUserService().userInfo(auth2UserInfo.getOpenid(), GySysConst.LANG_ZH_CN); + wxUser = this.getByOpenId(appId,auth2UserInfo.getOpenid()); + if(wxUser == null){ + wxUser = new WxUser(); + wxUser.setAppId(wxApp.getId()); + wxUser.setAppType(wxApp.getAppType()); + wxUser.setNickName(auth2UserInfo.getNickname()); + wxUser.setEmpName(auth2UserInfo.getNickname()); + wxUser.setUnionId(auth2UserInfo.getUnionId()); + wxUser.setHeadimgUrl(auth2UserInfo.getHeadImgUrl()); + wxUser.setOpenId(auth2UserInfo.getOpenid()); + } + if(StringUtils.hasText(auth2UserInfo.getUnionId())){ + wxUser.setUnionId(auth2UserInfo.getUnionId()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(WxUser::getUnionId,auth2UserInfo.getUnionId()); + Long count = this.count(lqw); + if(count<1){ + wxUser.setFirstFlag(1); + } + } + wxUser.setSubscribe(wxMpUser.getSubscribe()?1:0); + wxUser.setSubscribeScene(wxMpUser.getSubscribeScene()); + wxUser.setTagidList(JsonUtil.objectToJson(wxMpUser.getTagIds())); + if(wxUser.getId()==null){ + save(wxUser); + }else { + updateById(wxUser); + } + } catch (WxErrorException e) { + log.debug("微信登录失败:{}",e.getMessage()); + } + } + //TODO 登录日志 + return wxUser; + } + + @Override + public WxUser getByOpenId(String openId) { + LambdaQueryWrapper wxUserLambdaQueryWrapper = new LambdaQueryWrapper<>(); + wxUserLambdaQueryWrapper.eq(WxUser::getOpenId,openId); + return getOne(wxUserLambdaQueryWrapper,false); + } + + @Override + public WxUser getByOpenId(String appId, String openId) { + LambdaQueryWrapper wxUserLambdaQueryWrapper = new LambdaQueryWrapper<>(); + wxUserLambdaQueryWrapper.eq(WxUser::getOpenId,openId); + wxUserLambdaQueryWrapper.eq(WxUser::getAppId,appId); + return getOne(wxUserLambdaQueryWrapper,false); + } +} + diff --git a/cms-modules/cms-system/src/main/resources/mapper/baz/BazVisitInstanceMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/baz/BazVisitInstanceMapper.xml new file mode 100644 index 0000000..885444b --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/baz/BazVisitInstanceMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + baz_visit_instance.`id`, + baz_visit_instance.`title`, + baz_visit_instance.`visit_id`, + baz_visit_instance.`target_type`, + baz_visit_instance.`visit_state`, + baz_visit_instance.`visitor_id`, + baz_visit_instance.`visitor_code`, + baz_visit_instance.`visitor_name`, + baz_visit_instance.`target_id`, + baz_visit_instance.`target_code`, + baz_visit_instance.`target_name`, + baz_visit_instance.`target_local_x`, + baz_visit_instance.`target_local_y`, + baz_visit_instance.`target_address`, + baz_visit_instance.`target_map_address`, + baz_visit_instance.`finished_time`, + baz_visit_instance.`miss_local_flag`, + baz_visit_instance.`remark`, + baz_visit_instance.`position_status_content`, + baz_visit_instance.`position_status`, + baz_visit_instance.`create_time`, + baz_visit_instance.`update_time`, + baz_visit_instance.`tenant_id`, + baz_visit_instance.`del_flag`, + baz_visit_instance.`create_by`, + baz_visit_instance.`update_by` + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/bir/BirActivityCenterGoodsMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/bir/BirActivityCenterGoodsMapper.xml new file mode 100644 index 0000000..ad6b886 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/bir/BirActivityCenterGoodsMapper.xml @@ -0,0 +1,356 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tbs_activity_center_goods.`id`, + tbs_activity_center_goods.`center_goods_code`, + tbs_activity_center_goods.`cost_apply_id`, + tbs_activity_center_goods.`activity_id`, + tbs_activity_center_goods.`activity_code`, + tbs_activity_center_goods.`subject_id`, + tbs_activity_center_goods.`subject_code`, + tbs_activity_center_goods.`subject_name`, + tbs_activity_center_goods.`center_type`, + tbs_activity_center_goods.`center_id`, + tbs_activity_center_goods.`center_code`, + tbs_activity_center_goods.`center_name`, + tbs_activity_center_goods.`center_amount`, + tbs_activity_center_goods.`center_rate`, + tbs_activity_center_goods.`center_goods_amount`, + tbs_activity_center_goods.`center_goods_rate`, + tbs_activity_center_goods.`used_amount`, + tbs_activity_center_goods.`target_type`, + tbs_activity_center_goods.`target_id`, + tbs_activity_center_goods.`target_code`, + tbs_activity_center_goods.`target_name`, + tbs_activity_center_goods.`target_level_path_ids`, + tbs_activity_center_goods.`target_level_path_names`, + tbs_activity_center_goods.`remark`, + tbs_activity_center_goods.`create_time`, + tbs_activity_center_goods.`update_time`, + tbs_activity_center_goods.`tenant_id`, + tbs_activity_center_goods.`create_by`, + tbs_activity_center_goods.`update_by`, + tbs_activity_center_goods.`del_flag`, + tbs_activity_center_goods.`act_start_date`, + tbs_activity_center_goods.`act_end_date`, + tbs_activity_center_goods.`pre_start_date`, + tbs_activity_center_goods.`pre_end_date`, + tbs_activity_center_goods.`pre_check_date`, + tbs_activity_center_goods.`tmp_uk`, + tbs_activity_center_goods.`supplier_id`, + tbs_activity_center_goods.`supplier_code`, + tbs_activity_center_goods.`supplier_name` + + + + + + + + + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/bir/BirBaseActivityMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/bir/BirBaseActivityMapper.xml new file mode 100644 index 0000000..fd26a9e --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/bir/BirBaseActivityMapper.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tbs_activity.`id`, + tbs_activity.`activity_code`, + tbs_activity.`activity_state`, + tbs_activity.`cost_apply_id`, + tbs_activity.`cost_pass_time`, + tbs_activity.`cost_pass_flag`, + tbs_activity.`act_title`, + tbs_activity.`supplier_id`, + tbs_activity.`supplier_code`, + tbs_activity.`supplier_name`, + tbs_activity.`act_start_date`, + tbs_activity.`act_end_date`, + tbs_activity.`pre_start_date`, + tbs_activity.`pre_end_date`, + tbs_activity.`pre_check_date`, + tbs_activity.`pre_act_flag`, + tbs_activity.`pre_act_quantity`, + tbs_activity.`pre_not_act_quantity`, + tbs_activity.`pre_roi_rate`, + tbs_activity.`remark`, + tbs_activity.`total_amount`, + tbs_activity.`used_amount`, + tbs_activity.`reopen_flag`, + tbs_activity.`finished_flag`, + tbs_activity.`finished_time`, + tbs_activity.`release_flag`, + tbs_activity.`release_amount`, + tbs_activity.`release_time`, + tbs_activity.`release_user_id`, + tbs_activity.`release_user_name`, + tbs_activity.`create_time`, + tbs_activity.`update_time` + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/bir/BirBudgetTargetMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/bir/BirBudgetTargetMapper.xml new file mode 100644 index 0000000..bff9a10 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/bir/BirBudgetTargetMapper.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/cms-modules/cms-system/src/main/resources/mapper/bir/BirRoiRateMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/bir/BirRoiRateMapper.xml new file mode 100644 index 0000000..d06c82b --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/bir/BirRoiRateMapper.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + bir_roi_rate.id, + bir_roi_rate.key_num, + bir_roi_rate.activity_amt, + bir_roi_rate.verification_amt, + bir_roi_rate.shipment_qty, + bir_roi_rate.shipment_amt, + bir_roi_rate.supplier_id, + bir_roi_rate.supplier_code, + bir_roi_rate.supplier_name, + bir_roi_rate.user_id, + bir_roi_rate.user_code, + bir_roi_rate.user_name, + bir_roi_rate.create_time, + bir_roi_rate.update_time, + bir_roi_rate.tenant_id, + bir_roi_rate.del_flag + + + + + + + + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/bir/BirTbsVtbPayJoinMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/bir/BirTbsVtbPayJoinMapper.xml new file mode 100644 index 0000000..6689aec --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/bir/BirTbsVtbPayJoinMapper.xml @@ -0,0 +1,227 @@ + + + + + + update tbs_activity + left join ( + select activity_id, + GROUP_CONCAT(DISTINCT center_name SEPARATOR ', ') AS center_name + from tbs_activity_center where del_flag = 0 and cost_apply_id > #{maxCostId} + GROUP BY activity_id + ) tmp on tmp.activity_id = tbs_activity.id + set all_center_names = tmp.center_name + where cost_apply_id > #{maxCostId} + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/bir/TbsActivityTemplateMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/bir/TbsActivityTemplateMapper.xml new file mode 100644 index 0000000..c7d77db --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/bir/TbsActivityTemplateMapper.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + tbs_activity_template.`id`, + tbs_activity_template.`template_name`, + tbs_activity_template.`template_state`, + tbs_activity_template.`template_value`, + tbs_activity_template.`sale_region_flag`, + tbs_activity_template.`biz_region_flag`, + tbs_activity_template.`contract_flag`, + tbs_activity_template.`cost_theme`, + tbs_activity_template.`cost_theme_edit_flag`, + tbs_activity_template.`pre_remark`, + tbs_activity_template.`remark`, + tbs_activity_template.`start_time`, + tbs_activity_template.`end_time`, + tbs_activity_template.`create_time`, + tbs_activity_template.`create_by`, + tbs_activity_template.`update_time`, + tbs_activity_template.`update_by`, + tbs_activity_template.`tenant_id`, + tbs_activity_template.`del_flag` + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/biz/BizSignTypeMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/biz/BizSignTypeMapper.xml new file mode 100644 index 0000000..01b8641 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/biz/BizSignTypeMapper.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + biz_sign_type.`id`, + biz_sign_type.`type_name`, + biz_sign_type.`template_id`, + biz_sign_type.`remark`, + biz_sign_type.`create_time`, + biz_sign_type.`update_time`, + biz_sign_type.`tenant_id`, + biz_sign_type.`del_flag`, + biz_sign_type.`create_by`, + biz_sign_type.`update_by` + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/biz/BizUserGroupItemMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/biz/BizUserGroupItemMapper.xml new file mode 100644 index 0000000..feb56fb --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/biz/BizUserGroupItemMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + biz_user_group_item.`id`, + biz_user_group_item.`group_id`, + biz_user_group_item.`target_type`, + biz_user_group_item.`target_id`, + biz_user_group_item.`target_name`, + biz_user_group_item.`target_code`, + biz_user_group_item.`remark`, + biz_user_group_item.`create_time`, + biz_user_group_item.`create_by`, + biz_user_group_item.`update_time`, + biz_user_group_item.`update_by`, + biz_user_group_item.`del_flag`, + biz_user_group_item.`tenant_id` + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/bms/BmsChannelMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/bms/BmsChannelMapper.xml new file mode 100644 index 0000000..b9dcaae --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/bms/BmsChannelMapper.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + bms_channel.`id`, + bms_channel.`channel_code`, + bms_channel.`channel_name`, + bms_channel.`channel_type`, + bms_channel.`head_channel`, + bms_channel.`head_channel_code`, + bms_channel.`head_channel_id`, + bms_channel.`remark`, + bms_channel.`create_time`, + bms_channel.`update_time`, + bms_channel.`tenant_id`, + bms_channel.`del_flag`, + bms_channel.`create_by`, + bms_channel.`update_by`, + bms_channel.`cost_flag` + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/bms/BmsChannelPointMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/bms/BmsChannelPointMapper.xml new file mode 100644 index 0000000..0b1b219 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/bms/BmsChannelPointMapper.xml @@ -0,0 +1,377 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bms_channel_point.`id`, + bms_channel_point.`channel_id`, + bms_channel_point.`channel_code`, + bms_channel_point.`channel_name`, + bms_channel_point.`point_code`, + bms_channel_point.`point_name`, + bms_channel_point.`shop_area`, + bms_channel_point.`count_checkstand`, + bms_channel_point.`point_level`, + bms_channel_point.`point_type`, + bms_channel_point.`address`, + bms_channel_point.`sale_region_id`, + bms_channel_point.`sale_region_path`, + bms_channel_point.`sale_region_path_ids`, + bms_channel_point.`biz_region_id`, + bms_channel_point.`biz_region_path`, + bms_channel_point.`biz_region_path_ids`, + bms_channel_point.`remark`, + bms_channel_point.`create_time`, + bms_channel_point.`update_time`, + bms_channel_point.`tenant_id`, + bms_channel_point.`local_x`, + bms_channel_point.`local_y`, + bms_channel_point.`map_address`, + bms_channel_point.`del_flag`, + bms_channel_point.`cost_flag`, + bms_channel_point.`create_by`, + bms_channel_point.`update_by` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/bms/BmsMasterUserMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/bms/BmsMasterUserMapper.xml new file mode 100644 index 0000000..9c7b66c --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/bms/BmsMasterUserMapper.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bms_master_user.`id`, + bms_master_user.`type`, + bms_master_user.`target_id`, + bms_master_user.`user_id`, + bms_master_user.`master_flag`, + bms_master_user.`remark`, + bms_master_user.`create_time`, + bms_master_user.`create_by`, + bms_master_user.`update_time`, + bms_master_user.`update_by`, + bms_master_user.`tenant_id`, + bms_master_user.`del_flag` + + + and `bms_master_user`.`id` = #{query.id} + and `bms_master_user`.`type` = #{query.type} + and `bms_master_user`.`target_id` = #{query.targetId} + and `bms_master_user`.`user_id` = #{query.userId} + and `bms_master_user`.`master_flag` = #{query.masterFlag} + + + + and `bms_master_user`.`remark` = #{query.remark} + and `bms_master_user`.`create_time` = #{query.createTime} + and `bms_master_user`.`create_by` = #{query.createBy} + and `bms_master_user`.`update_time` = #{query.updateTime} + and `bms_master_user`.`update_by` = #{query.updateBy} + and `bms_master_user`.`tenant_id` = #{query.tenantId} + and `bms_master_user`.`del_flag` = #{query.delFlag} + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/bms/BmsRuleSkuMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/bms/BmsRuleSkuMapper.xml new file mode 100644 index 0000000..5a28e79 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/bms/BmsRuleSkuMapper.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + bms_rule_sku.`id`, + bms_rule_sku.`rule_id`, + bms_rule_sku.`sku_id`, + bms_rule_sku.`spu_id`, + bms_rule_sku.`remark`, + bms_rule_sku.`create_time`, + bms_rule_sku.`create_by`, + bms_rule_sku.`update_time`, + bms_rule_sku.`update_by`, + bms_rule_sku.`tenant_id`, + bms_rule_sku.`del_flag` + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/bms/BmsSkuSupplierMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/bms/BmsSkuSupplierMapper.xml new file mode 100644 index 0000000..1f0a87c --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/bms/BmsSkuSupplierMapper.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + bms_sku_supplier.`id`, + bms_sku_supplier.`spu_id`, + bms_sku_supplier.`sku_id`, + bms_sku_supplier.`supplier_id`, + bms_sku_supplier.`ban_status`, + bms_sku_supplier.`create_time`, + bms_sku_supplier.`create_by`, + bms_sku_supplier.`update_time`, + bms_sku_supplier.`update_by`, + bms_sku_supplier.`tenant_id`, + bms_sku_supplier.`del_flag` + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/bms/BmsSupplierAddressMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/bms/BmsSupplierAddressMapper.xml new file mode 100644 index 0000000..1f01466 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/bms/BmsSupplierAddressMapper.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bms_supplier.name as supplier_name, + bms_supplier.code as supplier_code, + bms_supplier_address.`id`, + bms_supplier_address.`supplier_id`, + bms_supplier_address.`default_flag`, + bms_supplier_address.`province_code`, + bms_supplier_address.`province`, + bms_supplier_address.`city_code`, + bms_supplier_address.`city`, + bms_supplier_address.`area_code`, + bms_supplier_address.`area`, + bms_supplier_address.`detail`, + bms_supplier_address.`phone`, + bms_supplier_address.`receiver`, + bms_supplier_address.`remark`, + bms_supplier_address.`create_time`, + bms_supplier_address.`update_time`, + bms_supplier_address.`tenant_id`, + bms_supplier_address.`del_flag`, + bms_supplier_address.`create_by`, + bms_supplier_address.`update_by` + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/bms/BmsSupplierChannelMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/bms/BmsSupplierChannelMapper.xml new file mode 100644 index 0000000..a06d867 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/bms/BmsSupplierChannelMapper.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + bms_supplier_channel.`id`, + bms_supplier_channel.`channel_id`, + bms_supplier_channel.`supplier_id`, + bms_supplier_channel.`create_time`, + bms_supplier_channel.`update_time`, + bms_supplier_channel.`tenant_id`, + bms_supplier_channel.`del_flag`, + bms_supplier_channel.`create_by`, + bms_supplier_channel.`update_by` + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/bms/BmsSupplierMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/bms/BmsSupplierMapper.xml new file mode 100644 index 0000000..777829e --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/bms/BmsSupplierMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bms_supplier.`id`, + bms_supplier.`region_first`, + bms_supplier.`region_second`, + bms_supplier.`region_third`, + bms_supplier.`region_last`, + bms_supplier.`region2_first`, + bms_supplier.`region2_second`, + bms_supplier.`region2_third`, + bms_supplier.`region2_last`, + bms_supplier.`address`, + bms_supplier.`name`, + bms_supplier.`code`, + bms_supplier.`pid`, + bms_supplier.`open_time`, + bms_supplier.`stop_flag_date`, + bms_supplier.`cooperate_pause_flag_date`, + bms_supplier.`parent_code`, + bms_supplier.`user_id`, + bms_supplier.`user_code`, + bms_supplier.`user_name`, + bms_supplier.`other_user_ids`, + bms_supplier.`other_user_names`, + bms_supplier.`other_user_codes`, + bms_supplier.`belong`, + bms_supplier.`create_time`, + bms_supplier.`create_by`, + bms_supplier.`update_time`, + bms_supplier.`update_by`, + bms_supplier.`tenant_id`, + bms_supplier.`cost_flag`, + bms_supplier.`supplier_flag`, + bms_supplier.`supplier_info_flag`, + bms_supplier.`supplier_tax_number`, + bms_supplier.`supplier_license_img`, + bms_supplier.`supplier_user`, + bms_supplier.`com_region`, + bms_supplier.`com_region_code`, + bms_supplier.`stop_flag`, + bms_supplier.`cooperate_pause_flag`, + bms_supplier.`stop_flag_date`, + bms_supplier.`cooperate_pause_flag_date`, + bms_supplier.`transport_visible`, + bms_supplier.`cd_order_flag`, + bms_supplier.`del_flag` + + + + + + UPDATE bms_supplier + SET user_id = NULL,user_code = null, user_name = null + WHERE id IN + + #{item} + + + + + UPDATE bms_supplier + SET other_user_ids = NULL,other_user_codes = null, other_user_names = null + WHERE id IN + + #{item} + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/erp/ErpDispatchDataMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/erp/ErpDispatchDataMapper.xml new file mode 100644 index 0000000..fc1dbde --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/erp/ErpDispatchDataMapper.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + erp_dispatch_data.`id`, + erp_dispatch_data.`place`, + erp_dispatch_data.`dl_code`, + erp_dispatch_data.`date`, + erp_dispatch_data.`cus_code`, + erp_dispatch_data.`cus_name`, + erp_dispatch_data.`inv_code`, + erp_dispatch_data.`inv_name`, + erp_dispatch_data.`inv_batch`, + erp_dispatch_data.`sales_dep_code`, + erp_dispatch_data.`dep_name`, + erp_dispatch_data.`qty`, + erp_dispatch_data.`sum_money`, + erp_dispatch_data.`volume`, + erp_dispatch_data.`net_weight`, + erp_dispatch_data.`dispatch_cost`, + erp_dispatch_data.`inv_dispatch_cost`, + erp_dispatch_data.`inv_trans_fee`, + erp_dispatch_data.`inv_produce_cost`, + erp_dispatch_data.`create_time` + + + + + + + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/exl/ExlTableConfMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/exl/ExlTableConfMapper.xml new file mode 100644 index 0000000..dfe1de5 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/exl/ExlTableConfMapper.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + exl_table_conf.`id`, + exl_table_conf.`table_name`, + exl_table_conf.`excel_title`, + exl_table_conf.`enable_flag`, + exl_table_conf.`enable_time`, + exl_table_conf.`remark`, + exl_table_conf.`create_time`, + exl_table_conf.`update_time`, + exl_table_conf.`tenant_id`, + exl_table_conf.`create_by`, + exl_table_conf.`update_by`, + exl_table_conf.`del_flag` + + + + + + and + + ${item.column} <= #{item.value} + + + + and + + ${item.column} >= #{item.value} + + + + and + + ${item.column} = #{item.value} + + + + and + + + ${item.column} like concat('%', #{item.value} ,'%') + + + 1=1 + + + + + and + + ${inItem.column} in ( + + #{item} + + ) + + + + + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/goods/GoodsAccreditMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/goods/GoodsAccreditMapper.xml new file mode 100644 index 0000000..10a4d7c --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/goods/GoodsAccreditMapper.xml @@ -0,0 +1,132 @@ + + + + + + + select + 'accredit' as unionType, + goods_accredit.`sku_id`, + goods_accredit.`spu_id`, + goods_accredit.`category_id`, + + goods_accredit_item.`acc_type`, + goods_accredit_item.`target_id`, + + goods_accredit.`code`, + goods_accredit.`name`, + + '0' as biz_region_id, + '0' as sale_region_id, + '0' as supplier_id, + '0' as user_id, + + goods_accredit_item.id+'_goods' as id, + goods_accredit_item.`target_type`, + goods_accredit_item.`target_code`, + goods_accredit_item.`target_name`, + + goods_accredit_item.create_time, + sys_user.name as `create_user`, + sys_user.code as `create_user_code` + + from goods_accredit + left join goods_accredit_item + on goods_accredit.id = goods_accredit_item.acc_id + left join sys_user on sys_user.id = goods_accredit_item.create_by + + and `goods_accredit`.`del_flag` = 0 + and `goods_accredit_item`.`del_flag` = 0 + and `goods_accredit`.`empty_flag` = 0 + + + and ( sys_user.`code` like concat('%',#{query.userKeywords},'%') + or sys_user.`name` like concat('%',#{query.userKeywords},'%') ) + + + and goods_accredit.`code` in + + #{codeitem} + + + + and goods_accredit_item.`target_code` in + + #{codeitem} + + + + + + + + + select + 'rule' as unionType, + '0' as sku_id, + '0' as `spu_id`, + '0' as `category_id`, + + '0' as `acc_type`, + '0' as target_id, + + goods_rule_item.target_code as `code`, + goods_rule_item.target_name as `name`, + + goods_rule.biz_region_id, + goods_rule.sale_region_id, + goods_rule.supplier_id, + goods_rule.user_id, + + goods_rule_item.id + '_rul' as id, + goods_rule_item.target_type, + goods_rule.code as target_code, + goods_rule.name as target_name, + + goods_rule_item.create_time, + sys_user.name as `create_user`, + sys_user.code as `create_user_code` + + from goods_rule + left join goods_rule_item + on goods_rule.id = goods_rule_item.rule_id + left join sys_user on sys_user.id = goods_rule_item.create_by + where 1=1 + AND`goods_rule`.`del_flag` = 0 + AND `goods_rule_item`.`del_flag` = 0 + AND goods_rule.empty_flag = 0 + + + and ( sys_user.`code` like concat('%',#{query.userKeywords},'%') + or sys_user.`name` like concat('%',#{query.userKeywords},'%') ) + + + and goods_rule_item.`target_code` in + + #{codeitem} + + + + and goods_rule.`code` in + + #{codeitem} + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/goods/GoodsCustomerPriceMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/goods/GoodsCustomerPriceMapper.xml new file mode 100644 index 0000000..2278400 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/goods/GoodsCustomerPriceMapper.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + goods_customer_price.`id`, + goods_customer_price.`supplier_id`, + goods_customer_price.`supplier_code`, + goods_customer_price.`supplier_name`, + goods_customer_price.`sku_code`, + goods_customer_price.`sku_id`, + goods_customer_price.`sku_name`, + goods_customer_price.`sku_unit`, + goods_customer_price.`init_price`, + goods_customer_price.`real_price`, + goods_customer_price.`maker`, + goods_customer_price.`maker_code`, + goods_customer_price.`mark_time` + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/goods/GoodsFeedbackMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/goods/GoodsFeedbackMapper.xml new file mode 100644 index 0000000..1a3cf74 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/goods/GoodsFeedbackMapper.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + goods_feedback.`id`, + goods_feedback.`spu_ids`, + goods_feedback.`sku_ids`, + goods_feedback.`img_urls`, + goods_feedback.`feedback_type_id`, + goods_feedback.`feedback_type_names`, + goods_feedback.`feedback_text`, + goods_feedback.`user_id`, + goods_feedback.`user_code`, + goods_feedback.`user_name`, + goods_feedback.`goods_checker_id`, + goods_feedback.`goods_checker`, + goods_feedback.`goods_check_remark`, + goods_feedback.`goods_check_time`, + goods_feedback.`remark`, + goods_feedback.`create_time`, + goods_feedback.`update_time`, + goods_feedback.`tenant_id`, + goods_feedback.`del_flag`, + goods_feedback.`create_by`, + goods_feedback.`update_by`, + goods_feedback.`ext_province`, + goods_feedback.`ext_city`, + goods_feedback.`ext_region_area`, + goods_feedback.`ext_township`, + goods_feedback.`ext_street`, + goods_feedback.`ext_street_number`, + goods_feedback.`local_x`, + goods_feedback.`local_y`, + goods_feedback.`address` + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/goods/GoodsImminentBatchMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/goods/GoodsImminentBatchMapper.xml new file mode 100644 index 0000000..4f9d411 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/goods/GoodsImminentBatchMapper.xml @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + + + + + + + + + + goods_imminent_batch.`id`, + goods_imminent_batch.`batch_code`, + goods_imminent_batch.`quantity`, + goods_imminent_batch.`order_quantity`, + goods_imminent_batch.`end_date`, + goods_imminent_batch.`remark` + + + + + + + + goods_sku.`sku_name`, + goods_sku.`sku_code`, + goods_sku.`pic_url`, + goods_sku.`sales_price`, + goods_sku.`market_price`, + goods_sku.`cost_price`, + goods_sku.`spec_infos`, + goods_sku.`stock`, + goods_sku.`unit_id`, + goods_sku.`unit_name`, + goods_sku.`weight`, + goods_sku.`volume`, + goods_sku.`inv_unit_weight`, + goods_sku.`min_purchase`, + goods_sku.`cost_flag`, + goods_sku.`belong`, + goods_sku.`belong_sort`, + goods_sku.`wrap_val`, + goods_sku.`taste_val`, + goods_sku.`order_flag`, + goods_sku.`special_flag`, + goods_sku.`abct`, + goods_sku.`order_online_flag`, + goods_sku.`order_offline_flag`, + goods_sku.`book_belong`, + goods_sku.`book_name` + + + + goods_spu.`spu_code`, + goods_spu.`name` as `spu_name`, + goods_spu.`category_first`, + goods_spu.`category_second`, + goods_spu.`category_third`, + goods_spu.`category_last`, + goods_spu.`pic_urls`, + goods_spu.`shelf`, + goods_spu.`sort`, + goods_spu.`sale_num`, + goods_spu.`spec_type`, + goods_spu.`taste_value`, + goods_spu.`create_time`, + goods_spu.`update_time`, + goods_spu.`create_by`, + goods_spu.`update_by`, + goods_spu.`tenant_id`, + goods_spu.`cost_flag`, + goods_spu.`order_flag`, + goods_spu.`book_belong`, + goods_spu.`book_name`, + goods_spu.`special_sku_id`, + goods_spu.`spu_cunhuo_flag`, + goods_spu.`sku_num_val` + + + + + and `goods_spu`.`name` like concat('%',#{query.spuName},'%') + + and (`goods_spu`.`name` like concat('%',#{query.spuCodeOrName},'%') or `goods_spu`.`spu_code` like concat('%',#{query.spuCodeOrName},'%')) + + and `goods_spu`.`spu_code` like concat('%',#{query.spuCode},'%') + + and `goods_spu`.`book_belong` in + + #{selectId} + + + + + and `goods_spu`.`id` in + + #{selectId} + + + + and `goods_spu`.`id` not in + + #{selectId} + + + + and (`goods_spu`.`category_first` in + + #{selectId} + + or `goods_spu`.`category_second` in + + #{selectId} + + or `goods_spu`.`category_third` in + + #{selectId} + ) + + + and (`goods_spu`.`category_first` not in + + #{selectId} + + and `goods_spu`.`category_second` not in + + #{selectId} + + and `goods_spu`.`category_third` not in + + #{selectId} + ) + + + + + and (`goods_sku`.`belong` = #{query.belong} or goods_sku.special_flag=1) + + + and `goods_sku`.`special_flag` = #{query.selectSpecialFlag} + + + and `goods_sku`.`sku_add_code` like concat('%', #{query.skuAddCode},'%') + + + and (`goods_sku`.`order_flag` = #{query.orderFlag} or `goods_sku`.`special_flag` = 1) + + + + and `goods_sku`.`sku_name` like concat('%', #{query.skuName},'%') + + + and `goods_sku`.`sku_code` like concat('%', #{query.skuCode},'%') + + + and `goods_sku`.`id` not in + + #{selectId} + + + + and `goods_sku`.`id` not in( + select sku.id FROM goods_sku sku + left join goods_spu spu on sku.spu_id = spu.id + left join goods_category cate1 on cate1.id = spu.category_first + left join goods_category cate2 on cate2.id = spu.category_second + left join goods_category cate3 on cate3.id = spu.category_third + where + ( + sku.id in + + #{selectId} + + or spu.id in + + #{selectId} + + or cate1.id in + + #{selectId} + + or cate2.id in + + #{selectId} + + or cate3.id in + + #{selectId} + + ) and + sku.id not in + + #{selectId} + + and + spu.id not in + + #{selectId} + + and + cate1.id not in + + #{selectId} + + and + cate2.id not in + + #{selectId} + + and + cate3.id not in + + #{selectId} + + ) + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/goods/GoodsSkuMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/goods/GoodsSkuMapper.xml new file mode 100644 index 0000000..d6abc02 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/goods/GoodsSkuMapper.xml @@ -0,0 +1,309 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + goods_sku.`id`, + goods_sku.`sku_code`, + goods_sku.`sku_add_code`, + goods_sku.`sku_name`, + goods_sku.`spu_id`, + goods_sku.`pic_url`, + goods_sku.`sales_price`, + goods_sku.`market_price`, + goods_sku.`cost_price`, + goods_sku.`inv_unit_weight`, + goods_sku.`spec_infos`, + goods_sku.`stock`, + goods_sku.`unit_id`, + goods_sku.`unit_name`, + goods_sku.`weight`, + goods_sku.`volume`, + `goods_sku`.`order_online_flag`, + `goods_sku`.`order_offline_flag`, + goods_sku.`wrap_val`, + goods_sku.`taste_val`, + goods_sku.`min_purchase`, + goods_sku.`enable`, + goods_sku.`version`, + goods_sku.`remark`, + goods_sku.`update_time`, + goods_sku.`create_time`, + goods_sku.`tenant_id`, + goods_sku.`del_flag`, + goods_sku.`create_by`, + goods_sku.`cost_flag`, + goods_sku.`update_by`, + goods_sku.`special_flag`, + goods_sku.`order_flag`, + goods_sku.`belong`, + goods_sku.`book_belong`, + goods_sku.`book_name` + + + + update `goods_sku` + LEFT JOIN `goods_spu` + ON goods_sku.spu_id = goods_spu.id + set goods_sku.book_belong = #{bookCode},goods_sku.book_name = #{bookName} + WHERE + 1=1 + and goods_sku.del_flag = 0 + and goods_sku.enable = 1 + and goods_spu.shelf = 1 + and ( + goods_spu.category_third in + + #{selectId} + + or + goods_spu.category_second in + + #{selectId} + + or + goods_spu.category_first in + + #{selectId} + + ) + + + + + + + + + + + + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/goods/GoodsSpuMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/goods/GoodsSpuMapper.xml new file mode 100644 index 0000000..0541a2d --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/goods/GoodsSpuMapper.xml @@ -0,0 +1,440 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + goods_sku.volume, + goods_sku.weight, + goods_sku.sales_price as sku_price, + goods_sku.sku_name as sku_name, + goods_sku.id as sku_id, + goods_sku.sku_code as sku_code, + goods_sku.special_flag as sku_special_flag, + goods_sku.belong as sku_belong + + + + + goods_spu.`id`, + goods_spu.`spu_code`, + goods_spu.`name`, + goods_spu.`category_first`, + goods_spu.`category_second`, + goods_spu.`category_third`, + goods_spu.`category_last`, + goods_spu.`pic_urls`, + goods_spu.`shelf`, + goods_spu.`sort`, + goods_spu.`sale_num`, + goods_spu.`spec_type`, + goods_spu.`taste_value`, + goods_spu.`create_time`, + goods_spu.`update_time`, + goods_spu.`create_by`, + goods_spu.`update_by`, + goods_spu.`tenant_id`, + goods_spu.`cost_flag`, + goods_spu.`order_flag`, + goods_spu.`book_belong`, + goods_spu.`book_name`, + goods_spu.`del_flag`, + goods_spu.`special_sku_id`, + goods_spu.`spu_cunhuo_flag`, + goods_spu.`sku_num_val` + + + + and (`goods_sku`.`belong` = #{query.belong} or goods_sku.special_flag=1) + + + and `goods_sku`.`special_flag` = #{query.selectSpecialFlag} + + + and `goods_sku`.`sku_add_code` like concat('%', #{query.skuAddCode},'%') + + + and (`goods_sku`.`order_flag` = #{query.orderFlag} or `goods_sku`.`special_flag` = 1) + + + + and ( + `goods_spu`.`name` like concat('%', #{query.keyword},'%') or + `goods_spu`.`spu_code` like concat('%', #{query.keyword},'%') or + `goods_sku`.`sku_code` like concat('%', #{query.keyword},'%') or + `goods_sku`.`sku_name` like concat('%', #{query.keyword},'%') + ) + + + and `goods_sku`.`id` not in + + #{selectId} + + + + and `goods_sku`.`id` not in( + select sku.id FROM goods_sku sku + left join goods_spu spu on sku.spu_id = spu.id + left join goods_category cate1 on cate1.id = spu.category_first + left join goods_category cate2 on cate2.id = spu.category_second + left join goods_category cate3 on cate3.id = spu.category_third + where + ( + sku.id in + + #{selectId} + + or spu.id in + + #{selectId} + + or cate1.id in + + #{selectId} + + or cate2.id in + + #{selectId} + + or cate3.id in + + #{selectId} + + ) and + sku.id not in + + #{selectId} + + and + spu.id not in + + #{selectId} + + and + cate1.id not in + + #{selectId} + + and + cate2.id not in + + #{selectId} + + and + cate3.id not in + + #{selectId} + + ) + + + + + and `goods_spu`.`del_flag` = 0 + and `goods_spu`.`id` = #{query.id} + and `goods_spu`.`spu_code` like concat('%', #{query.spuCode},'%') + + and (`goods_spu`.`spu_code` like concat('%', #{query.spuCodeOrName},'%') or `goods_spu`.`name` like concat('%', #{query.spuCodeOrName},'%') ) + + and `goods_spu`.`name` like concat('%', #{query.name},'%') + and `goods_spu`.`category_first` = #{query.categoryFirst} + and `goods_spu`.`category_second` = #{query.categorySecond} + and `goods_spu`.`category_third` = #{query.categoryThird} + and `cate1`.`name` like concat('%',#{query.cateFirstLabel},'%') + and `cate2`.`name` like concat('%',#{query.cateSecondLabel},'%') + and `cate3`.`name` like concat('%',#{query.cateThirdLabel},'%') + and `goods_spu`.`category_last` = #{query.categoryLast} + and `goods_spu`.`shelf` = #{query.shelf} + and `goods_spu`.`cost_flag` = #{query.costFlag} + and `goods_spu`.`order_online_flag` = #{query.orderOnlineFlag} + and `goods_spu`.`order_offline_flag` = #{query.orderOfflineFlag} + and `goods_spu`.`spu_cunhuo_flag` = #{query.spuCunhuoFlag} + and `goods_spu`.`order_flag` = #{query.orderFlag} + and `goods_spu`.`sort` = #{query.sort} + and `goods_spu`.`book_belong` = #{query.bookBelong} + and `goods_spu`.`sale_num` = #{query.saleNum} + and `goods_spu`.`taste_value` like concat('%',#{query.tasteValue},'%') + and `goods_spu`.`create_time` = #{query.createTime} + and `goods_spu`.`update_time` = #{query.updateTime} + and `goods_spu`.`create_by` = #{query.createBy} + and `goods_spu`.`update_by` = #{query.updateBy} + and `goods_spu`.`tenant_id` = #{query.tenantId} + and `goods_spu`.`del_flag` = #{query.delFlag} + + + and (`goods_spu`.`name` like concat('%',#{query.searchValue},'%') or `goods_spu`.`goods_spu` like concat('%',#{query.searchValue},'%')) + + + and `goods_spu`.`book_belong` in + + #{selectId} + + + + + and `goods_spu`.`id` in + + #{selectId} + + + + and `goods_spu`.`id` not in + + #{selectId} + + + + and (`goods_spu`.`category_first` in + + #{selectId} + + or `goods_spu`.`category_second` in + + #{selectId} + + or `goods_spu`.`category_third` in + + #{selectId} + ) + + + and (`goods_spu`.`category_first` not in + + #{selectId} + + and `goods_spu`.`category_second` not in + + #{selectId} + + and `goods_spu`.`category_third` not in + + #{selectId} + ) + + + + + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/his/HisUserChannelPointMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/his/HisUserChannelPointMapper.xml new file mode 100644 index 0000000..e9f352b --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/his/HisUserChannelPointMapper.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + his_user_channel_point.`id`, + his_user_channel_point.`user_id`, + his_user_channel_point.`point_id`, + his_user_channel_point.`source_type`, + his_user_channel_point.`source_ids`, + his_user_channel_point.`remark`, + his_user_channel_point.`create_time`, + his_user_channel_point.`update_time`, + his_user_channel_point.`tenant_id`, + his_user_channel_point.`del_flag`, + his_user_channel_point.`create_by`, + his_user_channel_point.`update_by`, + his_user_channel_point.`cost_flag` + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/his/HisUserSupplierMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/his/HisUserSupplierMapper.xml new file mode 100644 index 0000000..e7f3f21 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/his/HisUserSupplierMapper.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/other/ZbiUserReportMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/other/ZbiUserReportMapper.xml new file mode 100644 index 0000000..09f49d0 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/other/ZbiUserReportMapper.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/pay/PayPaymentItemMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/pay/PayPaymentItemMapper.xml new file mode 100644 index 0000000..9273760 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/pay/PayPaymentItemMapper.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pay_payment_item.`id`, + pay_payment_item.`pay_type`, + pay_payment_item.`payment_id`, + pay_payment_item.`supplier_id`, + pay_payment_item.`item_pay_amount`, + pay_payment_item.`verification_id`, + pay_payment_item.`verification_subject_id`, + pay_payment_item.`cost_apply_id`, + pay_payment_item.`activity_id`, + pay_payment_item.`activity_code`, + pay_payment_item.`subject_id`, + pay_payment_item.`subject_code`, + pay_payment_item.`subject_name`, + pay_payment_item.`remark`, + pay_payment_item.`create_time`, + pay_payment_item.`update_time`, + pay_payment_item.`tenant_id`, + pay_payment_item.`create_by`, + pay_payment_item.`update_by`, + pay_payment_item.`del_flag`, + pay_payment_item.`policy_item_id`, + pay_payment_item.`policy_item_code` + + + + + + + + + + + + + update pay_payment_item set sync_act_flag = 1 + where activity_id in + + #{selectId} + + + + + update pay_payment set sync_cost_state = 1 + where cost_apply_id in + + #{selectId} + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/pay/PaySupplierMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/pay/PaySupplierMapper.xml new file mode 100644 index 0000000..f5723cf --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/pay/PaySupplierMapper.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/qms/QmsGroupMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/qms/QmsGroupMapper.xml new file mode 100644 index 0000000..c407230 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/qms/QmsGroupMapper.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + qms_group.`id`, + qms_group.`name`, + qms_group.`descr`, + qms_group.`form_id`, + qms_group.`form_context`, + qms_group.`publish_state`, + qms_group.`version`, + qms_group.`remark`, + qms_group.`create_time`, + qms_group.`create_by`, + qms_group.`update_time`, + qms_group.`update_by`, + qms_group.`tenant_id`, + qms_group.`del_flag` + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/qms/QmsGroupScopeMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/qms/QmsGroupScopeMapper.xml new file mode 100644 index 0000000..9e55091 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/qms/QmsGroupScopeMapper.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + qms_group_scope.`id`, + qms_group_scope.`group_id`, + qms_group_scope.`scope_type`, + qms_group_scope.`scope_value`, + qms_group_scope.`finished`, + qms_group_scope.`del_flag`, + qms_group_scope.`tenant_id`, + qms_group_scope.`create_time`, + qms_group_scope.`create_by`, + qms_group_scope.`update_time`, + qms_group_scope.`update_by` + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/seeyon/CommonCheckMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/seeyon/CommonCheckMapper.xml new file mode 100644 index 0000000..5cf0b77 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/seeyon/CommonCheckMapper.xml @@ -0,0 +1,508 @@ + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/sys/SysDeptMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/sys/SysDeptMapper.xml new file mode 100644 index 0000000..c534fa8 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/sys/SysDeptMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + sys_dept.id, + sys_dept.name, + sys_dept.code, + sys_dept.parent_id, + sys_dept.mgr_user_id, + sys_dept.level_path, + sys_dept.create_time, + sys_dept.create_by, + sys_dept.update_time, + sys_dept.update_by + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/sys/SysMenuMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/sys/SysMenuMapper.xml new file mode 100644 index 0000000..3e866a8 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/sys/SysMenuMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + sys_menu.`id`, + sys_menu.`name`, + sys_menu.`sort`, + sys_menu.`pid`, + sys_menu.`type`, + sys_menu.`client_type`, + sys_menu.`hide_flag`, + sys_menu.`del_flag` + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/sys/SysNoticeUsermapper.xml b/cms-modules/cms-system/src/main/resources/mapper/sys/SysNoticeUsermapper.xml new file mode 100644 index 0000000..ea94e95 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/sys/SysNoticeUsermapper.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + `sys_notice_user`.`id`, + `sys_notice_user`.`notice_id`, + `sys_notice_user`.`user_id`, + `sys_notice_user`.`read_flag`, + `sys_notice_user`.`read_time`, + `sys_notice_user`.`read_count`, + `sys_notice_user`.`create_time`, + `sys_notice_user`.`create_by`, + `sys_notice_user`.`update_time`, + `sys_notice_user`.`update_by`, + `sys_notice_user`.`tenant_id`, + `sys_notice_user`.`del_flag` + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/sys/SysOperationLogMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/sys/SysOperationLogMapper.xml new file mode 100644 index 0000000..34494d6 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/sys/SysOperationLogMapper.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sys_operation_log.id, + sys_operation_log.title, + sys_operation_log.biz_type, + sys_operation_log.inter_type, + sys_operation_log.code_method, + sys_operation_log.req_method, + sys_operation_log.req_url, + sys_operation_log.req_param, + sys_operation_log.req_ip, + sys_operation_log.user_type, + sys_operation_log.user_id, + sys_operation_log.err_msg, + sys_operation_log.json_result, + sys_operation_log.elapsed_time, + sys_operation_log.user_agent, + sys_operation_log.create_time, + sys_operation_log.create_by, + sys_operation_log.update_time, + sys_operation_log.update_by + + + + INSERT INTO sys_operation_log + (module,title, biz_type, inter_type, code_method, req_method, req_url, req_param, req_ip, user_type, user_id, + err_msg, json_result, elapsed_time, user_agent, create_time, create_by, tenant_id,creator_name) + VALUES + ( #{module},#{title}, #{bizType}, #{interType}, #{codeMethod}, #{reqMethod}, #{reqUrl}, #{reqParam}, #{reqIp}, #{userType}, #{userId}, + #{errMsg}, #{jsonResult}, #{elapsedTime}, #{userAgent}, now(), #{userId}, #{tenantId},#{creatorName}); + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/sys/SysUserMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/sys/SysUserMapper.xml new file mode 100644 index 0000000..c7a09f3 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/sys/SysUserMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sys_user.id, + sys_user.mobile, + sys_user.account, + sys_user.name, + sys_user.code, + sys_user.password, + sys_user.icon, + sys_user.dept_id, + sys_user.super_flag, + sys_user.login_enable, + sys_user.serving_state, + sys_user.sales_flag, + sys_user.identity_no, + sys_user.remark, + sys_user.app_client, + sys_user.app_token, + sys_user.create_time, + sys_user.create_by, + sys_user.update_time, + sys_user.update_by, + sys_user.del_flag, + sys_user.sy_account, + sys_user.sy_user_id, + sys_user.tenant_id + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/sys/SysUserSalesMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/sys/SysUserSalesMapper.xml new file mode 100644 index 0000000..f568802 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/sys/SysUserSalesMapper.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + sys_user.id, + sys_user.mobile, + sys_user.account, + sys_user.name, + sys_user.code, + sys_user.icon, + sys_user.dept_id, + sys_user.position_id, + sys_user.super_flag, + sys_user.login_enable, + sys_user.serving_state, + sys_user.sales_flag, + sys_user.identity_no, + sys_user.remark, + sys_user_sales.`user_id`, + sys_user_sales.`pid` + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/tag/TagDataMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/tag/TagDataMapper.xml new file mode 100644 index 0000000..a675220 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/tag/TagDataMapper.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + tag_data.`id`, + tag_data.`tag_name`, + tag_data.`tag_id`, + tag_data.`target_type`, + tag_data.`target_id`, + tag_data.`target_code`, + tag_data.`target_name`, + tag_data.`remark`, + tag_data.`create_time`, + tag_data.`start_date`, + tag_data.`end_date`, + tag_data.`update_time`, + tag_data.`create_by`, + tag_data.`update_by`, + tag_data.`tenant_id`, + tag_data.`del_flag` + + + + + + + and ${tagQuery.sqlColumn} in + ( + select target_id from tag_data + left join tag_info on tag_data.tag_id = tag_info.id and tag_info.del_flag=0 + where tag_data.del_flag = 0 + and (tag_data.start_date is null or tag_data.start_date >= now() ) + and (tag_data.end_date is null or tag_data.end_date <= now() ) + + and tag_id in + + #{selectId} + + + + and tag_info.tag_name like concat('%',#{tagQuery.tagName},'%') + + and tag_data.target_type = #{tagQuery.targetType} + group by tag_data.target_id + ) + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsBudget2Mapper.xml b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsBudget2Mapper.xml new file mode 100644 index 0000000..af48d51 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsBudget2Mapper.xml @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsBudgetChangeMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsBudgetChangeMapper.xml new file mode 100644 index 0000000..f61522b --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsBudgetChangeMapper.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsBudgetConditionMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsBudgetConditionMapper.xml new file mode 100644 index 0000000..84668a4 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsBudgetConditionMapper.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + tbs_budget_condition.`id`, + tbs_budget_condition.`budgt_id`, + tbs_budget_condition.`target_type`, + tbs_budget_condition.`target_id`, + tbs_budget_condition.`target_code`, + tbs_budget_condition.`target_name`, + tbs_budget_condition.`target_level_path_ids`, + tbs_budget_condition.`target_level_path_names`, + tbs_budget_condition.`remark`, + tbs_budget_condition.`create_time`, + tbs_budget_condition.`update_time`, + tbs_budget_condition.`tenant_id`, + tbs_budget_condition.`create_by`, + tbs_budget_condition.`update_by`, + tbs_budget_condition.`del_flag` + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsBudgetMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsBudgetMapper.xml new file mode 100644 index 0000000..cc31a32 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsBudgetMapper.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + tbs_budget.`id`, + tbs_budget.`subject_id`, + tbs_budget.`subject_code`, + tbs_budget.`subject_name`, + tbs_budget.`center_type`, + tbs_budget.`center_id`, + tbs_budget.`center_code`, + tbs_budget.`center_name`, + tbs_budget.`schedule_id`, + tbs_budget.`schedule_code`, + tbs_budget.`schedule_name`, + tbs_budget.`remark`, + tbs_budget.`create_time`, + tbs_budget.`update_time`, + tbs_budget.`tenant_id`, + tbs_budget.`create_by`, + tbs_budget.`update_by`, + tbs_budget.`del_flag` + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsBudgetMatchMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsBudgetMatchMapper.xml new file mode 100644 index 0000000..c9f774c --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsBudgetMatchMapper.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsCostApplyMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsCostApplyMapper.xml new file mode 100644 index 0000000..5f3a114 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsCostApplyMapper.xml @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tbs_cost_apply.`id`, + tbs_cost_apply.`code`, + tbs_cost_apply.`charge_theme`, + tbs_cost_apply.`supplier_id`, + tbs_cost_apply.`supplier_code`, + tbs_cost_apply.`supplier_name`, + tbs_cost_apply.`supplier_biz_region_first_name`, + tbs_cost_apply.`supplier_biz_region_second_name`, + tbs_cost_apply.`supplier_biz_region_third_name`, + tbs_cost_apply.`charge_state`, + tbs_cost_apply.`check_state`, + tbs_cost_apply.`submit_time`, + tbs_cost_apply.`pass_time`, + tbs_cost_apply.`remark`, + tbs_cost_apply.`user_id`, + tbs_cost_apply.`user_code`, + tbs_cost_apply.`user_name`, + tbs_cost_apply.`sy_form_id`, + tbs_cost_apply.`sy_flow_id`, + tbs_cost_apply.`total_activity`, + tbs_cost_apply.`total_activity_amount`, + tbs_cost_apply.`total_activity_used_amount`, + tbs_cost_apply.`contract_flag`, + tbs_cost_apply.`create_time`, + tbs_cost_apply.`update_time`, + tbs_cost_apply.`tenant_id`, + tbs_cost_apply.`create_by`, + tbs_cost_apply.`update_by`, + tbs_cost_apply.`del_flag`, + tbs_cost_apply.`template_id`, + tbs_cost_apply.`change_source_id`, + tbs_cost_apply.`change_extend_id`, + tbs_cost_apply.`cancel_flag`, + tbs_cost_apply.`ext_user_id`, + tbs_cost_apply.`ext_user_code`, + tbs_cost_apply.`ext_user_name`, + tbs_cost_apply.`template_title` + + + + update tbs_cost_apply + set ext_user_id = #{obj.id},ext_user_id=#{obj.id},ext_user_name=#{obj.name},ext_user_code=#{obj.code} + where del_flag=0 and id in + + #{selectId} + + + + update tbs_cost_apply set ext_user_id = null,ext_user_id=null,ext_user_name=null,ext_user_code where id in + + #{selectId} + + + + + + + + + + + + + and `tbs_cost_apply`.`check_state` = #{query.checkState} + and `tbs_cost_apply`.`id` = #{query.id} + and `tbs_cost_apply`.`code` like concat('%', #{query.code},'%') + and `tbs_cost_apply`.`charge_theme` like concat('%', #{query.chargeTheme},'%') + and `tbs_cost_apply`.`supplier_id` = #{query.supplierId} + and `tbs_cost_apply`.`supplier_code` like concat('%', #{query.supplierCode},'%') + and `tbs_cost_apply`.`supplier_name` like concat('%', #{query.supplierName},'%') + and `tbs_cost_apply`.`supplier_biz_region_first_name` like concat('%', #{query.supplierBizRegionFirstName},'%') + and `tbs_cost_apply`.`supplier_biz_region_second_name` like concat('%', #{query.supplierBizRegionSecondName},'%') + and `tbs_cost_apply`.`supplier_biz_region_third_name` like concat('%', #{query.supplierBizRegionThirdName},'%') + and `tbs_cost_apply`.`charge_state` = #{query.chargeState} + and `tbs_cost_apply`.`submit_time` = #{query.submitTime} + and `tbs_cost_apply`.`pass_time` = #{query.passTime} + and `tbs_cost_apply`.`user_id` = #{query.userId} + and `tbs_cost_apply`.`user_code` like concat('%', #{query.userCode},'%') + and `tbs_cost_apply`.`user_name` like concat('%', #{query.userName},'%') + and `tbs_cost_apply`.`sy_form_id` = #{query.syFormId} + and `tbs_cost_apply`.`sy_flow_id` = #{query.syFlowId} + and `tbs_cost_apply`.`total_activity` = #{query.totalActivity} + and `tbs_cost_apply`.`total_activity_amount` = #{query.totalActivityAmount} + and `tbs_cost_apply`.`total_activity_used_amount` = #{query.totalActivityUsedAmount} + and `tbs_cost_apply`.`contract_flag` = #{query.contractFlag} + and `tbs_cost_apply`.`create_time` = #{query.createTime} + and `tbs_cost_apply`.`update_time` = #{query.updateTime} + and `tbs_cost_apply`.`tenant_id` = #{query.tenantId} + and `tbs_cost_apply`.`create_by` = #{query.createBy} + and `tbs_cost_apply`.`update_by` = #{query.updateBy} + and `tbs_cost_apply`.`ext_user_name` like concat('%', #{query.extUserName},'%') + and `tbs_cost_apply`.`del_flag` = #{query.delFlag} + and `tbs_cost_apply`.`template_title` like concat('%', #{query.templateTitle},'%') + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsCostApplySumAmountMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsCostApplySumAmountMapper.xml new file mode 100644 index 0000000..436efc9 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsCostApplySumAmountMapper.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsCostTodoMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsCostTodoMapper.xml new file mode 100644 index 0000000..5b950f5 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsCostTodoMapper.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tbs_cost_todo.`id`, + tbs_cost_todo.`todo_code`, + tbs_cost_todo.`cost_apply_id`, + tbs_cost_todo.`check_status`, + tbs_cost_todo.`sy_from_id`, + tbs_cost_todo.`submit_time`, + tbs_cost_todo.`brands`, + tbs_cost_todo.`descr`, + tbs_cost_todo.`amount`, + tbs_cost_todo.`finished_flag`, + tbs_cost_todo.`finished_time`, + tbs_cost_todo.`remark`, + tbs_cost_todo.`create_time`, + tbs_cost_todo.`create_by`, + tbs_cost_todo.`update_time`, + tbs_cost_todo.`update_by`, + tbs_cost_todo.`del_flag`, + tbs_cost_todo.`tenant_id`, + tbs_cost_todo.`pay_msg`, + tbs_cost_todo.`pre_pay_date` + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsScheduleItemBudget2Mapper.xml b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsScheduleItemBudget2Mapper.xml new file mode 100644 index 0000000..bf341c0 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsScheduleItemBudget2Mapper.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsScheduleItemBudgetMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsScheduleItemBudgetMapper.xml new file mode 100644 index 0000000..0b5c5e8 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/tbs/TbsScheduleItemBudgetMapper.xml @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + tbs_schedule_item_budget.`id`, + tbs_schedule_item_budget.`schedule_id`, + tbs_schedule_item_budget.`schedule_item_id`, + tbs_schedule_item_budget.`item_name`, + tbs_schedule_item_budget.`start_date`, + tbs_schedule_item_budget.`end_date`, + tbs_schedule_item_budget.`budget_id`, + tbs_schedule_item_budget.`budget_amount`, + tbs_schedule_item_budget.`remark`, + tbs_schedule_item_budget.`create_time`, + tbs_schedule_item_budget.`update_time`, + tbs_schedule_item_budget.`tenant_id`, + tbs_schedule_item_budget.`create_by`, + tbs_schedule_item_budget.`update_by`, + tbs_schedule_item_budget.`del_flag` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/tzc/TzcPolicyMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/tzc/TzcPolicyMapper.xml new file mode 100644 index 0000000..b51220c --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/tzc/TzcPolicyMapper.xml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tzc_policy.`id`, + tzc_policy.`title`, + tzc_policy.`policy_code`, + tzc_policy.`policy_status`, + tzc_policy.`pass_time`, + tzc_policy.`submit_time`, + tzc_policy.`total_items`, + tzc_policy.`total_item_amount`, + tzc_policy.`total_item_used_amount`, + tzc_policy.`supplier_id`, + tzc_policy.`supplier_code`, + tzc_policy.`supplier_name`, + tzc_policy.`user_id`, + tzc_policy.`user_code`, + tzc_policy.`user_name`, + tzc_policy.`sy_flow_id`, + tzc_policy.`sy_form_id`, + tzc_policy.`remark`, + tzc_policy.`create_time`, + tzc_policy.`update_time`, + tzc_policy.`tenant_id`, + tzc_policy.`create_by`, + tzc_policy.`update_by`, + tzc_policy.`del_flag`, + tzc_policy.`ext_user_id`, + tzc_policy.`ext_user_code`, + tzc_policy.`ext_user_name` + + + + + + + update tzc_policy + set ext_user_id = #{obj.id},ext_user_code=#{obj.code},ext_user_name=#{obj.name} + where del_flag=0 and id in + + #{selectId} + + + + + update vtb_verification set ext_user_id = null,ext_user_id=null,ext_user_name=null where cost_apply_id in + + #{selectId} + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/vtb/VtbFundFlowMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/vtb/VtbFundFlowMapper.xml new file mode 100644 index 0000000..4805489 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/vtb/VtbFundFlowMapper.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + vtb_fund_flow.`id`, + vtb_fund_flow.`fund_type`, + vtb_fund_flow.`verification_id`, + vtb_fund_flow.`center_goods_code`, + vtb_fund_flow.`cost_apply_id`, + vtb_fund_flow.`activity_id`, + vtb_fund_flow.`subject_id`, + vtb_fund_flow.`subject_code`, + vtb_fund_flow.`subject_name`, + vtb_fund_flow.`center_type`, + vtb_fund_flow.`center_id`, + vtb_fund_flow.`center_code`, + vtb_fund_flow.`center_name`, + vtb_fund_flow.`used_amount`, + vtb_fund_flow.`target_type`, + vtb_fund_flow.`target_id`, + vtb_fund_flow.`target_code`, + vtb_fund_flow.`target_name`, + vtb_fund_flow.`target_level_path_ids`, + vtb_fund_flow.`target_level_path_names`, + vtb_fund_flow.`remark`, + vtb_fund_flow.`create_time`, + vtb_fund_flow.`update_time`, + vtb_fund_flow.`tenant_id`, + vtb_fund_flow.`create_by`, + vtb_fund_flow.`update_by`, + vtb_fund_flow.`del_flag`, + vtb_fund_flow.`center_good_item_id`, + vtb_fund_flow.`supplier_id`, + vtb_fund_flow.`supplier_code`, + vtb_fund_flow.`supplier_name` + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/vtb/VtbVerForPayReportMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/vtb/VtbVerForPayReportMapper.xml new file mode 100644 index 0000000..cbeb6d9 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/vtb/VtbVerForPayReportMapper.xml @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + pay_payment_item.`id`, + pay_payment_item.`verification_main_code`, + pay_payment_item.`verification_code`, + pay_payment.`pay_code`, + pay_payment_item.`pay_time`, + pay_payment_item.`pay_date`, + pay_payment_item.`bill_number`, + pay_payment_item.`erp_id`, + pay_payment_item.`pay_type`, + pay_payment_item.`payment_id`, + pay_payment_item.`supplier_id`, + pay_payment_item.`item_pay_amount`, + pay_payment_item.`verification_id`, + pay_payment_item.`verification_subject_id`, + pay_payment_item.`cost_apply_id`, + cost.`code` as `cost_apply_code`, + cost.`charge_theme` as `cost_apply_title`, + act.`act_title` as `activity_title`, + pay_payment_item.`activity_id`, + pay_payment_item.`activity_code`, + pay_payment_item.`subject_id`, + pay_payment_item.`subject_code`, + pay_payment_item.`subject_name`, + pay_payment_item.`remark`, + pay_payment_item.`create_time`, + pay_payment_item.`policy_item_id`, + pay_payment_item.`policy_item_code` + + + + and pay_payment_item.del_flag = 0 + and vtb.del_flag = 0 + and act.del_flag = 0 + and act.cancel_flag = 0 + and pay_payment.del_flag = 0 + and `pay_payment_item`.`pay_type` = #{query.payType} + and `pay_payment`.`pay_code` like concat('%',#{query.payCode},'%') + and `pay_payment_item`.`payment_id` = #{query.paymentId} + and `cost`.`code` like concat('%',#{query.costApplyCode},'%') + and `pay_payment`.`supplier_code` like concat('%',#{query.supplierCode},'%') + and `pay_payment`.`supplier_name` like concat('%',#{query.supplierName},'%') + and `pay_payment`.`user_code` like concat('%',#{query.userCode},'%') + and `pay_payment`.`user_name` like concat('%',#{query.userName},'%') + and `cost`.`charge_theme` like concat('%',#{query.costApplyTitle},'%') + and `act`.`act_title` like concat('%',#{query.activityTitle},'%') + and `pay_payment_item`.`supplier_id` = #{query.supplierId} + and `pay_payment_item`.`cost_apply_id` = #{query.costApplyId} + and `pay_payment_item`.`activity_id` = #{query.activityId} + and `pay_payment_item`.`activity_code` like concat('%',#{query.activityCode},'%') + and `pay_payment_item`.`subject_code` = #{query.subjectCode} + and `pay_payment_item`.`subject_name` = #{query.subjectName} + and `pay_payment_item`.`policy_item_code` = #{query.policyItemCode} + + and `pay_payment_item`.`cost_apply_id` in + + #{selectId} + + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/vtb/VtbVerReportMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/vtb/VtbVerReportMapper.xml new file mode 100644 index 0000000..9763723 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/vtb/VtbVerReportMapper.xml @@ -0,0 +1,363 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/vtb/VtbVerfifcationMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/vtb/VtbVerfifcationMapper.xml new file mode 100644 index 0000000..ce2e643 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/vtb/VtbVerfifcationMapper.xml @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + vtb_verification.`id`, + vtb_verification.`verification_main_code`, + vtb_verification.`verification_code`, + vtb_verification.`finished_time`, + vtb_verification.`batch_id`, + vtb_verification.`cost_apply_id`, + vtb_verification.`activity_id`, + vtb_verification.`policy_item_id`, + vtb_verification.`policy_item_code`, + vtb_verification.`attach_ids`, + vtb_verification.`verification_state`, + vtb_verification.`payment_state`, + vtb_verification.`reg_release_flag`, + vtb_verification.`reg_release_user_id`, + vtb_verification.`amount`, + vtb_verification.`amount_record`, + vtb_verification.`way_id`, + vtb_verification.`way_title`, + vtb_verification.`dis_code`, + vtb_verification.`bill_number`, + vtb_verification.`remark`, + vtb_verification.`create_time`, + vtb_verification.`update_time`, + vtb_verification.`tenant_id`, + vtb_verification.`create_by`, + vtb_verification.`update_by`, + vtb_verification.`del_flag`, + vtb_verification.`sy_form_id`, + vtb_verification.`sy_flow_id`, + vtb_verification.`supplier_id`, + vtb_verification.`supplier_code`, + vtb_verification.`supplier_name`, + vtb_verification.`user_id`, + vtb_verification.`user_code`, + vtb_verification.`user_name`, + vtb_verification.`pay_condition_id`, + vtb_verification.`activity_code`, + vtb_verification.`cost_apply_code`, + vtb_verification.`supplier_biz_region_first_name`, + vtb_verification.`supplier_biz_region_second_name`, + vtb_verification.`supplier_biz_region_third_name`, + vtb_verification.`input_release_flag`, + vtb_verification.`pay_release_flag`, + vtb_verification.`ext_user_id`, + vtb_verification.`ext_user_code`, + vtb_verification.`ext_user_name`, + vtb_verification.`template_title` + + + + + + + update vtb_verification + set ext_user_id = #{obj.id},ext_user_code=#{obj.code},ext_user_name=#{obj.name},ext_user_code=#{obj.code} + where del_flag=0 and cost_apply_id in + + #{selectId} + + + + + update vtb_verification set sync_pay_flag=1 where verification_code in + + #{selectId} + + + + + update vtb_verification set ext_user_id = null,ext_user_id=null,ext_user_name=null where cost_apply_id in + + #{selectId} + + + + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/vtb/VtbVerificationBatchMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/vtb/VtbVerificationBatchMapper.xml new file mode 100644 index 0000000..e4653c7 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/vtb/VtbVerificationBatchMapper.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + vtb_verification_batch.`id`, + vtb_verification_batch.`vtb_batch_code`, + vtb_verification_batch.`vtb_batch_status`, + vtb_verification_batch.`finished_time`, + vtb_verification_batch.`cost_apply_id`, + vtb_verification_batch.`remark`, + vtb_verification_batch.`create_time`, + vtb_verification_batch.`update_time`, + vtb_verification_batch.`tenant_id`, + vtb_verification_batch.`create_by`, + vtb_verification_batch.`update_by`, + vtb_verification_batch.`del_flag`, + vtb_verification_batch.`sy_form_id`, + vtb_verification_batch.`sy_flow_id`, + vtb_verification_batch.`supplier_id`, + vtb_verification_batch.`supplier_code`, + vtb_verification_batch.`supplier_name`, + vtb_verification_batch.`user_id`, + vtb_verification_batch.`user_code`, + vtb_verification_batch.`user_name`, + vtb_verification_batch.`ext_user_id`, + vtb_verification_batch.`ext_user_code`, + vtb_verification_batch.`ext_user_name`, + vtb_verification_batch.`backed_time`, + vtb_verification_batch.`refuse_time`, + vtb_verification_batch.`way_id`, + vtb_verification_batch.`way_title`, + vtb_verification_batch.`apply_check_amount`, + vtb_verification_batch.`result_check_amount` + + + + diff --git a/cms-modules/cms-system/src/main/resources/mapper/wx/WxFormPushMapper.xml b/cms-modules/cms-system/src/main/resources/mapper/wx/WxFormPushMapper.xml new file mode 100644 index 0000000..d380023 --- /dev/null +++ b/cms-modules/cms-system/src/main/resources/mapper/wx/WxFormPushMapper.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + wx_form_push.`id`, + wx_form_push.`type_id`, + wx_form_push.`type_code`, + wx_form_push.`type_name`, + wx_form_push.`title`, + wx_form_push.`form_context`, + wx_form_push.`form_context_value`, + wx_form_push.`remark`, + wx_form_push.`create_time`, + wx_form_push.`update_time`, + wx_form_push.`tenant_id`, + wx_form_push.`create_by`, + wx_form_push.`update_by`, + wx_form_push.`del_flag`, + wx_form_push.`status`, + `wx_form_push`.`publish_time`, + wx_form_push.`pre_notify_status`, + wx_form_push.`effective_start_time`, + wx_form_push.`effective_end_time`, + wx_form_push.`business_type` + + + + diff --git a/cms-modules/pom.xml b/cms-modules/pom.xml new file mode 100644 index 0000000..9a7edef --- /dev/null +++ b/cms-modules/pom.xml @@ -0,0 +1,25 @@ + + + + jsl-cms + com.qs + 1.0-SNAPSHOT + + 4.0.0 + + pom + + cms-system + cms-actuator + cms-policy + + cms-modules + + + 8 + 8 + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..1f1a80e --- /dev/null +++ b/pom.xml @@ -0,0 +1,227 @@ + + + 4.0.0 + + com.qs + jsl-cms + pom + 1.0-SNAPSHOT + + cms-common + cms-framework + cms-modules + cms-api + + + + + true + + 8 + 8 + UTF-8 + + 2.6.4 + 8 + 8 + 2.3.0 + 5.7.19 + 3.10.3 + 4.5.7 + 3.1 + 1.2.49 + 3.5.2 + 4.2.0 + + + + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.4.4 + + + org.mybatis + mybatis-spring + + + org.mybatis + mybatis + + + + + + com.baomidou + dynamic-datasource-spring-boot-starter + ${mybatis-plus.version} + + + + + org.springframework.cloud + spring-cloud-starter-openfeign + 3.1.7 + + + + com.squareup.okhttp3 + okhttp + 4.10.0 + + + + com.alibaba + easyexcel + 3.3.2 + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.13.0 + + + + cn.hutool + hutool-all + ${hutool.version} + + + + + + com.auth0 + java-jwt + ${jwt.version} + + + + com.alibaba + fastjson + ${fastjson.version} + + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + mysql + mysql-connector-java + 8.0.15 + + + + com.microsoft.sqlserver + mssql-jdbc + 8.4.1.jre8 + + + + org.projectlombok + lombok + 1.18.12 + compile + + + + org.apache.commons + commons-lang3 + 3.12.0 + + + + com.github.binarywang + weixin-java-mp + ${wx.java.version} + + + + com.github.binarywang + weixin-java-cp + ${wx.java.version} + + + + com.tencentcloudapi + tencentcloud-sdk-java + 3.1.598 + + + + com.github.shalousun + smart-doc + 2.4.0 + test + + + + com.aliyun.oss + aliyun-sdk-oss + 3.16.1 + + + + joda-time + joda-time + 2.10 + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.2 + + 1.8 + 1.8 + UTF-8 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.2 + + true + true + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + +