massageTask.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. package com.ylx.massage.task;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  5. import com.ylx.common.constant.MassageConstants;
  6. import com.ylx.common.core.domain.entity.SysDept;
  7. import com.ylx.common.utils.StringUtils;
  8. import com.ylx.massage.domain.*;
  9. import com.ylx.massage.enums.BillTypeEnum;
  10. import com.ylx.massage.enums.JsStatusEnum;
  11. import com.ylx.massage.enums.OrderStatusEnum;
  12. import com.ylx.massage.mapper.TConsumptionLogMapper;
  13. import com.ylx.massage.service.*;
  14. import com.ylx.massage.utils.DateTimeUtils;
  15. import com.ylx.system.service.ISysDeptService;
  16. import lombok.extern.slf4j.Slf4j;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.stereotype.Component;
  19. import javax.annotation.Resource;
  20. import java.math.BigDecimal;
  21. import java.util.*;
  22. /**
  23. * @author jianlong
  24. * @date 2024-04-19 14:11
  25. */
  26. @Slf4j
  27. @Component("massageTask")
  28. public class massageTask {
  29. @Resource
  30. private TOrderService orderService;
  31. @Resource
  32. private TJsService jsService;
  33. @Resource
  34. private TSignService signService;
  35. @Autowired
  36. private ISysDeptService deptService;
  37. @Autowired
  38. private TRechargeService rechargeService;
  39. @Resource
  40. private TJsDayService jsDayService;
  41. @Resource
  42. private TConsumptionLogService consumptionLogService;
  43. @Resource
  44. private TConsumptionLogMapper consumptionLogMapper;
  45. @Resource
  46. private TWxUserService userService;
  47. public void cancelOrder() {
  48. Date nowDate = new Date();
  49. log.info("开始执行取消订单任务当前时间,{}", nowDate);
  50. Date date = DateTimeUtils.addMinute(nowDate, -5);
  51. log.info("开始执行取消订单任务当前时间减5分钟,{}", date);
  52. long total = 1L;
  53. while (total > 0L) {
  54. total = extracted(date);
  55. }
  56. }
  57. private Long extracted(Date nowDate) {
  58. log.info("extracted 开始执行取消订单任务时间,{}", nowDate);
  59. LambdaQueryWrapper<TOrder> objectLambdaQueryWrapper = new LambdaQueryWrapper<>();
  60. objectLambdaQueryWrapper.eq(TOrder::getnStatus, OrderStatusEnum.WAIT_PAY.getCode()).
  61. le(TOrder::getDtCreateTime, nowDate).
  62. orderByAsc(TOrder::getDtCreateTime);
  63. Page<TOrder> page = new Page<>();
  64. page.setSize(MassageConstants.TWO_HUNDRED);
  65. Page<TOrder> resPage = orderService.page(page, objectLambdaQueryWrapper);
  66. if (CollectionUtil.isNotEmpty(resPage.getRecords())) {
  67. resPage.getRecords().forEach(order -> {
  68. TOrder newOrder = new TOrder();
  69. //todo 订单锁
  70. newOrder.setcId(order.getcId());
  71. newOrder.setnStatus(OrderStatusEnum.CANCEL.getCode());
  72. orderService.updateById(newOrder);
  73. log.info("取消超时未支付订单orderNo,{}", order.getOrderNo());
  74. });
  75. }
  76. return resPage.getTotal();
  77. }
  78. public void timeoutNotOrder() {
  79. Date nowDate = new Date();
  80. log.info("开始执行超时未接单任务,{}", nowDate);
  81. Date date = DateTimeUtils.addMinute(nowDate, -10);
  82. log.info("开始执行超时未接单任务当前时间减10分钟,{}", date);
  83. long total = 1L;
  84. while (total > 0L) {
  85. total = timeoutNotOrder(date);
  86. }
  87. }
  88. private Long timeoutNotOrder(Date nowDate) {
  89. LambdaQueryWrapper<TOrder> objectLambdaQueryWrapper = new LambdaQueryWrapper<>();
  90. objectLambdaQueryWrapper.eq(TOrder::getnStatus, OrderStatusEnum.WAIT_JD.getCode()).
  91. le(TOrder::getPayTime, nowDate).
  92. orderByAsc(TOrder::getPayTime);
  93. Page<TOrder> page = new Page<>();
  94. page.setSize(MassageConstants.TWO_HUNDRED);
  95. Page<TOrder> resPage = orderService.page(page, objectLambdaQueryWrapper);
  96. if (CollectionUtil.isNotEmpty(resPage.getRecords())) {
  97. resPage.getRecords().forEach(order -> {
  98. //调用拒绝接单
  99. order.setReasonRefusal("超时未接单");
  100. orderService.jujue(order);
  101. });
  102. }
  103. return resPage.getTotal();
  104. }
  105. public void isGetAmount() {
  106. Date nowDate = new Date();
  107. log.info("定时分配出账金额日期,{}", nowDate);
  108. Date date = DateTimeUtils.addDays(nowDate, -7);
  109. log.info("定时分配出账金额日期,{}", date);
  110. isGetAmount(date);
  111. }
  112. private void isGetAmount(Date date) {
  113. //查询所有部门
  114. List<SysDept> sysDepts = deptService.selectDeptList(new SysDept());
  115. //遍历部门技师
  116. sysDepts.forEach(sysDept -> {
  117. LambdaQueryWrapper<TJs> jsLambdaQueryWrapper = new LambdaQueryWrapper<>();
  118. jsLambdaQueryWrapper.eq(TJs::getnTong, JsStatusEnum.JS_PASS.getCode()).eq(TJs::getDeptId, sysDept.getDeptId());
  119. List<TJs> jsList = jsService.list(jsLambdaQueryWrapper);
  120. if (CollectionUtil.isNotEmpty(jsList)) {
  121. jsList.forEach(js -> {
  122. //根据技师openId 查询未领取金额
  123. LambdaQueryWrapper<TConsumptionLog> logLambdaQueryWrapper = new LambdaQueryWrapper<>();
  124. logLambdaQueryWrapper.eq(TConsumptionLog::getIsGet, MassageConstants.INTEGER_ZERO).
  125. eq(TConsumptionLog::getOpenId, js.getcOpenId()).
  126. in(TConsumptionLog::getBillType, Arrays.asList(BillTypeEnum.INCOME.getCode(), BillTypeEnum.DISTRIBUTION.getCode())).
  127. le(TConsumptionLog::getCreateTime, date).
  128. orderByAsc(TConsumptionLog::getCreateTime);
  129. List<TConsumptionLog> consumptionLogList = consumptionLogService.list(logLambdaQueryWrapper);
  130. if (CollectionUtil.isNotEmpty(consumptionLogList)) {
  131. //处理可提现金额
  132. //1.修改余额记录状态
  133. consumptionLogList.forEach(consumptionLog -> {
  134. //修改状态未已到提现账户
  135. consumptionLog.setIsGet(MassageConstants.INTEGER_ONE);
  136. });
  137. int i = consumptionLogMapper.insertOrUpdateBatch(consumptionLogList);
  138. //2.修改技师提现账户
  139. BigDecimal getAmount = consumptionLogList.stream().map(TConsumptionLog::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
  140. TWxUser user = userService.getByOpenId(js.getcOpenId());
  141. user.setGetAmount(user.getGetAmount().add(getAmount));
  142. userService.updateById(user);
  143. }
  144. });
  145. }
  146. });
  147. }
  148. public void cancelNewJs() {
  149. Date nowDate = new Date();
  150. log.info("开始执行取消新技师标识任务当前时间,{}", nowDate);
  151. long flag = 1L;
  152. while (flag > 0L) {
  153. LambdaQueryWrapper<TJs> objectLambdaQueryWrapper = new LambdaQueryWrapper<>();
  154. Date date = DateTimeUtils.addDays(nowDate, -7);
  155. log.info("开始执行取新技师当前时间减7天,{}", date);
  156. objectLambdaQueryWrapper.eq(TJs::getnB2, MassageConstants.INTEGER_ONE).
  157. le(TJs::getcTime, date).
  158. gt(TJs::getId, String.valueOf(flag)).
  159. orderByAsc(TJs::getId);
  160. Page<TJs> page = new Page<>();
  161. page.setSize(MassageConstants.TWO_HUNDRED);
  162. Page<TJs> page1 = jsService.page(page, objectLambdaQueryWrapper);
  163. if (CollectionUtil.isNotEmpty(page1.getRecords())) {
  164. page1.getRecords().forEach(tjs -> {
  165. TJs js = new TJs();
  166. js.setId(tjs.getId());
  167. js.setnB2(MassageConstants.INTEGER_ZERO);
  168. jsService.updateById(js);
  169. log.info("取消新技师标识,{}", js.getcOpenId() + js.getcName());
  170. });
  171. Optional<String> maxId = page1.getRecords().stream().max(Comparator.comparing(TJs::getId)).map(TJs::getId);
  172. flag = Long.parseLong(maxId.orElse("0"));
  173. } else {
  174. flag = 0L;
  175. }
  176. }
  177. }
  178. public void cancelHotJs() {
  179. Date nowDate = new Date();
  180. log.info("开始执行取消技师热度标识任务当前时间,{}", nowDate);
  181. Date date = DateTimeUtils.addDays(nowDate, -3);
  182. long flag = 1L;
  183. while (flag > 0L) {
  184. LambdaQueryWrapper<TJs> objectLambdaQueryWrapper = new LambdaQueryWrapper<>();
  185. objectLambdaQueryWrapper.eq(TJs::getnB3, MassageConstants.INTEGER_ONE).gt(TJs::getId, String.valueOf(flag)).orderByAsc(TJs::getId);
  186. Page<TJs> page = new Page<>();
  187. page.setSize(MassageConstants.TWO_HUNDRED);
  188. Page<TJs> page1 = jsService.page(page, objectLambdaQueryWrapper);
  189. if (CollectionUtil.isNotEmpty(page1.getRecords())) {
  190. page1.getRecords().forEach(tjs -> {
  191. List<TOrder> list = orderService.list(new LambdaQueryWrapper<TOrder>().eq(TOrder::getcJsId, tjs.getId()).ge(TOrder::getDtCreateTime, date));
  192. if (CollectionUtil.isEmpty(list) || list.size() < 3) {
  193. TJs js = new TJs();
  194. js.setId(tjs.getId());
  195. js.setnB3(MassageConstants.INTEGER_ZERO);
  196. jsService.updateById(js);
  197. log.info("取消热度技师标识,{}", js.getcOpenId() + js.getcName());
  198. }
  199. });
  200. Optional<String> maxId = page1.getRecords().stream().max(Comparator.comparing(TJs::getId)).map(TJs::getId);
  201. flag = Long.parseLong(maxId.orElse("0"));
  202. } else {
  203. flag = 0L;
  204. }
  205. }
  206. }
  207. /**
  208. * 定时下岗
  209. * 12:01 查询前一天 是否有上岗记录
  210. * 如果有上岗记录 没有下岗记录
  211. * 插入一条(前一天)下岗记录(并计算在线时长) 和当天上岗记录
  212. *
  213. * @param date yyyy-MM-dd
  214. **/
  215. public void RegularLayoff(String date) {
  216. Date date2 = new Date();
  217. if (StringUtils.isNotBlank(date)) {
  218. date2 = DateTimeUtils.parseDate(date, DateTimeUtils.DATE_FORMAT);
  219. } else {
  220. date2 = DateTimeUtils.addDays(date2, -1);
  221. }
  222. Date startDate = DateTimeUtils.getStartDate(date2);
  223. Date endDate = DateTimeUtils.getEndDate(date2);
  224. long total = 1L;
  225. while (total > 0L) {
  226. Page<TSign> signPage = new Page<>();
  227. signPage.setSize(MassageConstants.TWO_HUNDRED);
  228. LambdaQueryWrapper<TSign> signLambdaQueryWrapper = new LambdaQueryWrapper<>();
  229. //上岗
  230. signLambdaQueryWrapper.isNull(TSign::getLayoffTime).ge(TSign::getSingTime, startDate).le(TSign::getSingTime, endDate);
  231. Page<TSign> page = signService.page(signPage, signLambdaQueryWrapper);
  232. if (CollectionUtil.isNotEmpty(page.getRecords())) {
  233. page.getRecords().forEach(sign -> {
  234. sign.setLayoffTime(endDate);
  235. Long layoff = DateTimeUtils.dateToStamp(sign.getLayoffTime());
  236. Long sing = DateTimeUtils.dateToStamp(sign.getSingTime());
  237. Long time = layoff - sing;
  238. time = time / 1000;
  239. time = time / 60;
  240. sign.setOnlineTime(time.intValue());
  241. signService.updateById(sign);
  242. //增加上岗记录
  243. TSign tSign = new TSign();
  244. tSign.setSingTime(endDate);
  245. tSign.setName(sign.getName());
  246. tSign.setJsId(sign.getJsId());
  247. tSign.setDeptId(sign.getDeptId());
  248. tSign.setDeptName(sign.getDeptName());
  249. tSign.setOpenId(sign.getOpenId());
  250. signService.save(tSign);
  251. });
  252. }
  253. total = page.getTotal();
  254. }
  255. //查询所有部门
  256. List<SysDept> sysDepts = deptService.selectDeptList(new SysDept());
  257. sysDepts.forEach(sysDept -> {
  258. //查询所有技师
  259. LambdaQueryWrapper<TJs> jsLambdaQueryWrapper = new LambdaQueryWrapper<>();
  260. jsLambdaQueryWrapper.eq(TJs::getnTong, JsStatusEnum.JS_PASS.getCode()).eq(TJs::getDeptId, sysDept.getDeptId());
  261. List<TJs> jsList = jsService.list(jsLambdaQueryWrapper);
  262. if (CollectionUtil.isNotEmpty(jsList)) {
  263. jsList.forEach(js -> {
  264. TJsDay tJsDay = new TJsDay();
  265. tJsDay.setDeptName(js.getCity());
  266. tJsDay.setDeptId(js.getDeptId());
  267. tJsDay.setOpenId(js.getcOpenId());
  268. tJsDay.setJsId(js.getId());
  269. tJsDay.setName(js.getcName());
  270. Integer onLine = signService.getOnLineTime(js.getId(), startDate, endDate);
  271. tJsDay.setOnLine(onLine);
  272. Integer orderNum = orderService.getOrderNum(js.getId(), startDate, endDate);
  273. tJsDay.setOrderNum(orderNum);
  274. Integer addNum = orderService.getAddNum(js.getId(), startDate, endDate);
  275. tJsDay.setAddNum(addNum);
  276. Integer upgradeNum = orderService.getUpgradeNum(js.getId(), startDate, endDate);
  277. tJsDay.setUpgradeNum(upgradeNum);
  278. BigDecimal turnover = orderService.getTurnover(js.getId(), startDate, endDate);
  279. tJsDay.setTurnover(turnover);
  280. BigDecimal recharge = rechargeService.getRecharge(js.getId(), startDate, endDate);
  281. tJsDay.setRecharge(recharge);
  282. tJsDay.setCountDate(DateTimeUtils.formatDate(startDate, DateTimeUtils.DATE_FORMAT));
  283. jsDayService.save(tJsDay);
  284. });
  285. }
  286. });
  287. }
  288. }