package org.jeecg.modules.bon.controller.customer;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import io.swagger.annotations.Api;
|
import io.swagger.annotations.ApiOperation;
|
import lombok.extern.slf4j.Slf4j;
|
import org.jeecg.common.api.vo.Result;
|
import org.jeecg.common.aspect.annotation.AutoLog;
|
import org.jeecg.common.system.base.controller.JeecgController;
|
import org.jeecg.common.system.query.QueryGenerator;
|
import org.jeecg.common.util.DateUtils;
|
import org.jeecg.modules.bon.entity.BonProject;
|
import org.jeecg.modules.bon.entity.BonSaleRecord;
|
import org.jeecg.modules.bon.entity.BonSalesRecord;
|
import org.jeecg.modules.bon.service.IBonProjectService;
|
import org.jeecg.modules.bon.service.IBonSalesRecordService;
|
import org.jeecg.modules.bon.util.Constant;
|
import org.jeecgframework.poi.excel.ExcelImportUtil;
|
import org.jeecgframework.poi.excel.entity.ImportParams;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartHttpServletRequest;
|
import org.springframework.web.servlet.ModelAndView;
|
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.IOException;
|
import java.math.BigDecimal;
|
import java.time.Instant;
|
import java.time.LocalDate;
|
import java.time.LocalTime;
|
import java.time.ZoneId;
|
import java.time.temporal.ChronoUnit;
|
import java.util.Arrays;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
/**
|
* @Description: bon_project
|
* @Author: jeecg-boot
|
* @Date: 2023-08-01
|
* @Version: V1.0
|
*/
|
@Api(tags = "bon_project")
|
@RestController
|
@RequestMapping("/bon/pro/custom")
|
@Slf4j
|
public class BonProjectController extends JeecgController<BonProject, IBonProjectService> {
|
@Autowired
|
private IBonProjectService bonProjectService;
|
@Autowired
|
private IBonSalesRecordService salesRecordService;
|
|
/**
|
* 分页列表查询
|
*
|
* @param bonProject
|
* @param pageNo
|
* @param pageSize
|
* @param req
|
* @return
|
*/
|
@AutoLog(value = "bon_project-分页列表查询")
|
@ApiOperation(value = "bon_project-分页列表查询", notes = "bon_project-分页列表查询")
|
@GetMapping(value = "/list")
|
public Result<?> queryPageList(BonProject bonProject,
|
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
|
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
|
HttpServletRequest req) {
|
QueryWrapper<BonProject> queryWrapper = QueryGenerator.initQueryWrapper(bonProject, req.getParameterMap());
|
Page<BonProject> page = new Page<BonProject>(pageNo, pageSize);
|
IPage<BonProject> pageList = bonProjectService.page(page, queryWrapper);
|
return Result.OK(pageList);
|
}
|
|
|
@AutoLog(value = "bon_project-批量计算")
|
@ApiOperation(value = "bon_project-批量计算", notes = "bon_project-批量计算")
|
@GetMapping(value = "/calc")
|
public Result<?> calc(BonProject bonProject) {
|
//查询项目列表
|
QueryWrapper<BonProject> projectQueryWrapper = new QueryWrapper<>();
|
projectQueryWrapper.lambda().eq(BonProject::getType, Constant.PRO_TYPE2);
|
List<BonProject> proList = bonProjectService.list();
|
//查询销售记录
|
QueryWrapper<BonSalesRecord> salesRecordQueryWrapper = new QueryWrapper<>();
|
salesRecordQueryWrapper.lambda().eq(BonSalesRecord::getType, Constant.PRO_TYPE2);
|
List<BonSalesRecord> salesList = salesRecordService.list(salesRecordQueryWrapper);
|
|
AtomicInteger success = new AtomicInteger();
|
AtomicInteger fail = new AtomicInteger();
|
//计算每列数据的奖金
|
proList.stream().forEach(pro -> {
|
if (pro.getCode() == null || pro.getProModel() == null || pro.getCoeff() == null || pro.getReleaseDate() == null) {
|
pro.setRemark("数据缺失,不能计算");
|
return;
|
}
|
//TODO 以释放日期或首销100日期
|
//1.计算当前发放阶段
|
Date releaseDate = pro.getReleaseDate();
|
String releaseDateStr = DateUtils.date2Str(releaseDate, DateUtils.date_sdf.get());
|
LocalDate releaseDateLocal = LocalDate.parse(releaseDateStr);
|
//计算出该发放奖金的三年
|
LocalDate n1 = releaseDateLocal.plus(1, ChronoUnit.YEARS);
|
LocalDate n2 = releaseDateLocal.plus(2, ChronoUnit.YEARS);
|
LocalDate n3 = releaseDateLocal.plus(3, ChronoUnit.YEARS);
|
|
Instant instant1 = n1.atTime(LocalTime.MIDNIGHT).atZone(ZoneId.systemDefault()).toInstant();
|
Instant instant2 = n2.atTime(LocalTime.MIDNIGHT).atZone(ZoneId.systemDefault()).toInstant();
|
Instant instant3 = n3.atTime(LocalTime.MIDNIGHT).atZone(ZoneId.systemDefault()).toInstant();
|
|
Date date1 = Date.from(instant1);
|
Date date2 = Date.from(instant2);
|
Date date3 = Date.from(instant3);
|
|
Date today = new Date();
|
//计算项目现在方法哪个阶段
|
//第一阶段
|
if (today.compareTo(date1) <= 0) {
|
pro.setCurStage(1);
|
|
//第二阶段
|
} else if (today.compareTo(date2) <= 0) {
|
|
pro.setCurStage(2);
|
//第三阶段
|
} else if (today.compareTo(date3) <= 0) {
|
pro.setCurStage(3);
|
|
} else {
|
pro.setCurStage(-1);
|
pro.setRemark("不在奖金发放期");
|
}
|
//对所有需累积数据置空
|
pro.setCurSales(new BigDecimal(0));
|
pro.setCurBonus(new BigDecimal(0));
|
pro.setStep1Bonus(new BigDecimal(0));
|
pro.setStep2Bonus(new BigDecimal(0));
|
pro.setStep3Bonus(new BigDecimal(0));
|
pro.setStep1Sales(new BigDecimal(0));
|
pro.setStep2Sales(new BigDecimal(0));
|
pro.setStep3Sales(new BigDecimal(0));
|
|
|
salesList.stream().forEach(sale -> {
|
if (sale.getSellDate() == null || sale.getLongCode() == null || sale.getAmount() == null) {
|
sale.setProid(pro.getId());
|
sale.setRemark("数据缺失,不能计算");
|
return;
|
}
|
Date sellDate = sale.getSellDate();
|
|
|
//计算正常数据
|
if (sale.getLongCode().startsWith(pro.getProModel())) {
|
//第一阶段
|
if (sellDate.compareTo(releaseDate) >= 0 && sellDate.compareTo(date1) <= 0) {
|
pro.setStep1Sales(pro.getStep1Sales().add(sale.getAmount()));
|
pro.setStep1Bonus(pro.getStep1Bonus().add(sale.getAmount().multiply( BigDecimal.valueOf(pro.getCoeff()))));
|
if (pro.getCurStage() == 1) {
|
pro.setCurBonus(pro.getStep1Bonus());
|
pro.setCurSales(pro.getStep1Sales());
|
}
|
|
//第二阶段
|
} else if (sellDate.compareTo(releaseDate) >= 0 && sellDate.compareTo(date2) <= 0) {
|
pro.setStep2Sales(pro.getStep2Sales().add(sale.getAmount()));
|
pro.setStep2Bonus(pro.getStep2Bonus().add(sale.getAmount().multiply(BigDecimal.valueOf(pro.getCoeff()))));
|
if (pro.getCurStage() == 2) {
|
pro.setCurBonus(pro.getStep2Bonus());
|
pro.setCurSales(pro.getStep2Sales());
|
}
|
//第三阶段
|
} else if (sellDate.compareTo(releaseDate) >= 0 && sellDate.compareTo(date3) <= 0) {
|
pro.setStep3Sales(pro.getStep3Sales().add(sale.getAmount()));
|
pro.setStep3Bonus(pro.getStep3Bonus().add(sale.getAmount().multiply(BigDecimal.valueOf(pro.getCoeff() / 2.0))));
|
if (pro.getCurStage() == 3) {
|
pro.setCurBonus(pro.getStep3Bonus());
|
pro.setCurSales(pro.getStep3Sales());
|
}
|
//过奖励时间
|
} else {
|
sale.setRemark("不在奖金发放期");
|
}
|
|
}
|
|
|
});
|
|
|
//正常可计算数据
|
|
});
|
bonProjectService.saveOrUpdateBatch(proList);
|
salesRecordService.saveOrUpdateBatch(salesList);
|
|
return Result.OK("计算成功!");
|
}
|
|
|
@AutoLog(value = "bon_project-删除全部")
|
@ApiOperation(value = "bon_project-删除全部", notes = "bon_project-删除全部")
|
@GetMapping(value = "/delall")
|
public Result<?> delall(BonProject bonProject) {
|
QueryWrapper<BonProject> queryWrapper = new QueryWrapper<>();
|
bonProjectService.remove(queryWrapper);
|
return Result.OK("操作成功!");
|
}
|
|
/**
|
* 添加
|
*
|
* @param bonProject
|
* @return
|
*/
|
@AutoLog(value = "bon_project-添加")
|
@ApiOperation(value = "bon_project-添加", notes = "bon_project-添加")
|
@PostMapping(value = "/add")
|
public Result<?> add(@RequestBody BonProject bonProject) {
|
bonProjectService.save(bonProject);
|
return Result.OK("添加成功!");
|
}
|
|
/**
|
* 编辑
|
*
|
* @param bonProject
|
* @return
|
*/
|
@AutoLog(value = "bon_project-编辑")
|
@ApiOperation(value = "bon_project-编辑", notes = "bon_project-编辑")
|
@PutMapping(value = "/edit")
|
public Result<?> edit(@RequestBody BonProject bonProject) {
|
bonProjectService.updateById(bonProject);
|
return Result.OK("编辑成功!");
|
}
|
|
/**
|
* 通过id删除
|
*
|
* @param id
|
* @return
|
*/
|
@AutoLog(value = "bon_project-通过id删除")
|
@ApiOperation(value = "bon_project-通过id删除", notes = "bon_project-通过id删除")
|
@DeleteMapping(value = "/delete")
|
public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
|
bonProjectService.removeById(id);
|
return Result.OK("删除成功!");
|
}
|
|
/**
|
* 批量删除
|
*
|
* @param ids
|
* @return
|
*/
|
@AutoLog(value = "bon_project-批量删除")
|
@ApiOperation(value = "bon_project-批量删除", notes = "bon_project-批量删除")
|
@DeleteMapping(value = "/deleteBatch")
|
public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
|
this.bonProjectService.removeByIds(Arrays.asList(ids.split(",")));
|
return Result.OK("批量删除成功!");
|
}
|
|
/**
|
* 通过id查询
|
*
|
* @param id
|
* @return
|
*/
|
@AutoLog(value = "bon_project-通过id查询")
|
@ApiOperation(value = "bon_project-通过id查询", notes = "bon_project-通过id查询")
|
@GetMapping(value = "/queryById")
|
public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
|
BonProject bonProject = bonProjectService.getById(id);
|
if (bonProject == null) {
|
return Result.error("未找到对应数据");
|
}
|
return Result.OK(bonProject);
|
}
|
|
/**
|
* 导出excel
|
*
|
* @param request
|
* @param bonProject
|
*/
|
@RequestMapping(value = "/exportXls")
|
public ModelAndView exportXls(HttpServletRequest request, BonProject bonProject) {
|
return super.exportXls(request, bonProject, BonProject.class, "bon_project");
|
}
|
|
/**
|
* 通过excel导入数据
|
*
|
* @param request
|
* @param response
|
* @return
|
*/
|
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
|
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
|
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
|
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
|
for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
|
MultipartFile file = entity.getValue();// 获取上传文件对象
|
ImportParams params = new ImportParams();
|
params.setTitleRows(2);
|
params.setHeadRows(1);
|
params.setNeedSave(true);
|
try {
|
List<BonProject> proList = ExcelImportUtil.importExcel(file.getInputStream(), BonProject.class, params);
|
createData(proList);
|
//update-begin-author:taoyan date:20190528 for:批量插入数据
|
long start = System.currentTimeMillis();
|
int rows = bonProjectService.insertBatch(proList);
|
//400条 saveBatch消耗时间1592毫秒 循环插入消耗时间1947毫秒
|
//1200条 saveBatch消耗时间3687毫秒 循环插入消耗时间5212毫秒
|
log.info("消耗时间" + (System.currentTimeMillis() - start) + "毫秒");
|
//update-end-author:taoyan date:20190528 for:批量插入数据
|
return Result.ok("文件导入成功!成功行数:" + rows + ",忽略重复数据:" + (proList.size() - rows));
|
} catch (Exception e) {
|
log.error(e.getMessage(), e);
|
return Result.error("文件导入失败:" + e.getMessage());
|
} finally {
|
try {
|
file.getInputStream().close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
return Result.error("文件导入失败!");
|
}
|
|
private List<BonProject> createData(List<BonProject> list) {
|
list.stream().forEach(item -> {
|
item.setId(item.getCode() + item.getProModel());
|
item.setGroupBasis(item.getCode() + item.getProModel());
|
});
|
|
return null;
|
}
|
|
}
|