|
@@ -0,0 +1,289 @@
|
|
|
+package com.usky.dxtop.service.impl;
|
|
|
+
|
|
|
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
|
|
|
+import cn.afterturn.easypoi.excel.entity.ExportParams;
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+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.core.toolkit.CollectionUtils;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.usky.dxtop.common.core.domain.model.LoginUser;
|
|
|
+import com.usky.dxtop.common.core.page.CommonPage;
|
|
|
+import com.usky.dxtop.common.exception.CustomException;
|
|
|
+import com.usky.dxtop.common.utils.*;
|
|
|
+import com.usky.dxtop.common.utils.http.HttpUtils;
|
|
|
+import com.usky.dxtop.model.*;
|
|
|
+import com.usky.dxtop.mapper.ProductOrderMapper;
|
|
|
+import com.usky.dxtop.service.*;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.usky.dxtop.service.api.OneCardApi;
|
|
|
+import com.usky.dxtop.service.api.TopApiConfiger;
|
|
|
+import com.usky.dxtop.service.emun.*;
|
|
|
+import com.usky.dxtop.service.vo.ProductInfoExport;
|
|
|
+import com.usky.dxtop.service.vo.ProductInfoRequest;
|
|
|
+import com.usky.dxtop.service.vo.ProductOrderExport;
|
|
|
+import com.usky.dxtop.service.vo.ProductOrderRequest;
|
|
|
+import org.apache.logging.log4j.core.util.JsonUtils;
|
|
|
+import org.apache.poi.ss.usermodel.Workbook;
|
|
|
+import org.springframework.aop.framework.AopContext;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.scheduling.annotation.Async;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
+import oshi.jna.platform.windows.NtDll;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.nio.file.OpenOption;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * <p>
|
|
|
+ * 服务实现类
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @author yq
|
|
|
+ * @since 2022-07-05
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class ProductOrderServiceImpl extends ServiceImpl<ProductOrderMapper, ProductOrder> implements ProductOrderService {
|
|
|
+
|
|
|
+
|
|
|
+ public static final String CARD_PAY = "卡消费";
|
|
|
+
|
|
|
+ public static final String FIND_ORDER_INFO = "卡消费交易查询";
|
|
|
+
|
|
|
+ public static final String FP_SET_PERMISSION = "费浦门禁权限";
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private StaffService staffService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private OrderService orderService;
|
|
|
+ @Autowired
|
|
|
+ private MsgLogService msgLogService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private CallApiLogService callApiLogService;
|
|
|
+
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SysFileService sysFileService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ISysAsyncTaskService sysAsyncTaskService;
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public Boolean add(ProductOrder productOrder) {
|
|
|
+ checkOrder(productOrder,staffService.getById(productOrder.getUserId()));
|
|
|
+ this.save(productOrder);
|
|
|
+ ((ProductOrderServiceImpl) AopContext.currentProxy()).oneCardPayApi(productOrder);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public CommonPage<ProductOrder> page(ProductOrderRequest productOrderRequest) {
|
|
|
+ IPage<ProductOrder> page = new Page<>(productOrderRequest.getCurrent(), productOrderRequest.getSize());
|
|
|
+ LambdaQueryWrapper<ProductOrder> queryWrapper = Wrappers.lambdaQuery();
|
|
|
+ queryWrapper
|
|
|
+ .like(StringUtils.isNotBlank(productOrderRequest.getUserName()),ProductOrder::getUserName,productOrderRequest.getUserName())
|
|
|
+ .eq(null != productOrderRequest.getProductTypeId(),ProductOrder::getProductTypeId,productOrderRequest.getProductTypeId())
|
|
|
+ .eq(null != productOrderRequest.getUserId(),ProductOrder::getUserId,productOrderRequest.getUserId())
|
|
|
+ .ge(null != productOrderRequest.getStartTime(),ProductOrder::getStartTime,productOrderRequest.getStartTime())
|
|
|
+ .le(null != productOrderRequest.getEndTime(),ProductOrder::getEndTime,productOrderRequest.getEndTime())
|
|
|
+ .eq(null != productOrderRequest.getAppointmentTime(),ProductOrder::getAppointmentTime,productOrderRequest.getEndTime())
|
|
|
+ .eq(null != productOrderRequest.getProductStatus(),ProductOrder::getOrderFlag,productOrderRequest.getProductStatus());
|
|
|
+ page = this.page(page, queryWrapper);
|
|
|
+ return new CommonPage<>(page.getRecords(),page.getTotal(),page.getCurrent(),page.getSize());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String export(ProductOrderRequest productOrderRequest) {
|
|
|
+ LoginUser loginUser = SecurityUtils.getLoginUser();
|
|
|
+ SysUser user = loginUser.getUser();
|
|
|
+ Long taskId = sysAsyncTaskService.getId(user.getUserName(), "订单详情");
|
|
|
+ if (null == taskId) {
|
|
|
+ throw new CustomException("获取次数太多了请稍后获取");
|
|
|
+ }
|
|
|
+ ((ProductOrderServiceImpl) AopContext.currentProxy()).syncInfo(taskId,productOrderRequest);
|
|
|
+ return String.valueOf(taskId);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ @Async
|
|
|
+ public void syncInfo(Long taskId, ProductOrderRequest productOrderRequest){
|
|
|
+ Workbook workbook = null;
|
|
|
+ try {
|
|
|
+ ExportParams params = new ExportParams(null, "商品订单详情");
|
|
|
+ workbook = ExcelExportUtil.exportBigExcel(params, ProductInfoExport.class,
|
|
|
+ (o, i) -> {
|
|
|
+ productOrderRequest.setCurrent(i);
|
|
|
+ productOrderRequest.setSize(30);
|
|
|
+ CommonPage<ProductOrder> page = this.page(productOrderRequest);
|
|
|
+ return new ArrayList<>(BeanMapperUtils.mapList(page.getRecords(), ProductOrder.class, ProductOrderExport.class));
|
|
|
+ },null);
|
|
|
+ if (null != workbook) {
|
|
|
+ String fileName = String.format("%s.xls", "商品订单详情");
|
|
|
+ MultipartFile multipartFile = ExcelUtils.downLoadExcel(workbook, fileName);
|
|
|
+ uploadOrderFile(multipartFile,taskId);
|
|
|
+ } else {
|
|
|
+ sysAsyncTaskService.sendResult(taskId, false, "商品订单详情表格数据为空", AsyncResultType.TEXT);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("导出文件失败", e);
|
|
|
+ sysAsyncTaskService.sendResult(taskId, false, "导出订单文件失败", AsyncResultType.TEXT);
|
|
|
+ } finally {
|
|
|
+ if (workbook != null) {
|
|
|
+ try {
|
|
|
+ workbook.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ log.error("===export spec=== 关闭workbook失败", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void uploadOrderFile(MultipartFile multipartFile, Long taskId){
|
|
|
+ List<MultipartFile> list = new ArrayList<>();
|
|
|
+ list.add(multipartFile);
|
|
|
+ String batchNo = sysFileService.generateBatchNo();
|
|
|
+ SysFile sysFile = new SysFile();
|
|
|
+ sysFile.setBatchNo(batchNo);
|
|
|
+ sysFile.setFiles(list);
|
|
|
+ sysFile.setUploadType(SysFileServiceImpl.FILE);
|
|
|
+ sysFile.setBusinessType("商品订单详情");
|
|
|
+ sysFile.setExpriceAt(DateUtils.addDays(new Date(), 3));
|
|
|
+ List<SysFile> sysFileList = sysFileService.addFile(sysFile);
|
|
|
+ long count = sysFileList.stream().filter(sysFileDTO -> !sysFileDTO.getSuccess()).count();
|
|
|
+ if (count > 0) {
|
|
|
+ sysAsyncTaskService.sendResult(taskId, false, "上传文件失败", AsyncResultType.TEXT);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ List<String> idList = sysFileList.stream().map(sf -> sf.getId().toString()).collect(Collectors.toList());
|
|
|
+ boolean active = sysFileService.active(batchNo,idList);
|
|
|
+ if (active) {
|
|
|
+ sysAsyncTaskService.sendResult(taskId, true, batchNo, AsyncResultType.FILE);
|
|
|
+ } else {
|
|
|
+ sysAsyncTaskService.sendResult(taskId, false, "上传文件失败", AsyncResultType.TEXT);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public Boolean unsubscribeBath(List<ProductOrder> list) {
|
|
|
+ List<MsgLog> msgLogs;
|
|
|
+ List<Order> orderList;
|
|
|
+ try {
|
|
|
+ //批量添加订单
|
|
|
+ orderList = list.stream().map(this::generateReturnOrder).collect(Collectors.toList());
|
|
|
+ orderService.saveBatch(orderList);
|
|
|
+ //生成消息日志
|
|
|
+ msgLogs = orderList.stream().map(order -> orderService.enhanceMsgLog(order)).collect(Collectors.toList());
|
|
|
+ //批量添加消息日志
|
|
|
+ msgLogService.saveBatch(msgLogs);
|
|
|
+ }catch (Exception e){
|
|
|
+ throw new CustomException("数据库异常请联系管理员,异常信息"+e.getMessage());
|
|
|
+ }
|
|
|
+ this.updateBatchById(list);
|
|
|
+ orderService.sendMessage(orderList,msgLogs);
|
|
|
+ try {
|
|
|
+ orderService.updateBatchById(orderList);
|
|
|
+ }catch (Exception e){
|
|
|
+ log.error("订单退订修Torder失败+++++++++++++++"+e.getMessage());
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> orderCollect(Long userId) {
|
|
|
+ Map<String,Object> map = new HashMap<>();
|
|
|
+ QueryWrapper<ProductOrder> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.select("count(id) as money","order_flag as orderFlag")
|
|
|
+ .eq(null != userId,"user_id",userId)
|
|
|
+ .groupBy("orderFlag");
|
|
|
+ map.put("orderFlagList",this.getMap(queryWrapper));
|
|
|
+ QueryWrapper<ProductOrder> sumQueryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.select("IFNULL(sum(order_money),0) as moneyTotal","IFNULL(sum(end_time-start_time),0) as timeTotal")
|
|
|
+ .eq("order_flag",ProductOrderStatus.SUCCESS.getCode())
|
|
|
+ .eq(null != userId,"user_id",userId);
|
|
|
+ map.put("sumCollect",this.getMap(sumQueryWrapper));
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void checkOrder(ProductOrder productOrder, Staff staff){
|
|
|
+ String orderNumber = TopApiConfiger.getOrderNumber();
|
|
|
+ productOrder.setOrderNumber(orderNumber);
|
|
|
+ BigDecimal money = productOrder.getOrderMoney();
|
|
|
+ Assert.check(null != money && money.compareTo(BigDecimal.ZERO) != 0,"请输入订单金额");
|
|
|
+ String[] str=money.toString().split("\\.");
|
|
|
+ Assert.check(str[0].length() <= 10 && str[1].length() <= 2,"订单整数不能超过十位,小数不能超过两位");
|
|
|
+ Assert.check(null != productOrder.getUserId() && 0 != productOrder.getUserId(),"用户编号不能为空");
|
|
|
+ Optional.ofNullable(staff).orElseThrow(() -> new CustomException("用户信息不存在"));
|
|
|
+ Assert.check(staff.getIsSuccess(),"人员:"+staff.getName()+"未同步或者同步失败,请手动同步人员信息");
|
|
|
+ productOrder.setUserName(staff.getUsername());
|
|
|
+ productOrder.setUserPhone(staff.getContacts());
|
|
|
+ productOrder.setUserCode(staff.getUserCode());
|
|
|
+ productOrder.setOrderFlag(ProductOrderStatus.NO_PAY.getCode());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 调用雄伟卡消费api
|
|
|
+ */
|
|
|
+ public void oneCardPayApi(ProductOrder productOrder){
|
|
|
+ TreeMap<String, String> param = OneCardApi.cardPayParam(productOrder);
|
|
|
+ Map<String,String> map = new HashMap<>();
|
|
|
+ map.put("Content-Type","application/x-www-form-urlencoded");
|
|
|
+ String result;
|
|
|
+ try {
|
|
|
+ result = OneCardApi.commonRequest(OneCardApi.CARD_PAY_URL,OneCardApi.joinParam(param),map,jsonObject -> {
|
|
|
+ checkCarPayResult(productOrder,jsonObject);
|
|
|
+ this.updateById(productOrder);
|
|
|
+ return true;
|
|
|
+ });
|
|
|
+ }catch (Exception e){
|
|
|
+ result = e.getMessage();
|
|
|
+ log.error("调用雄伟卡消费异常,订单编号:"+productOrder.getOrderNumber()+"异常信息"+e.getMessage());
|
|
|
+ }
|
|
|
+ callApiLogService.saveOrUpdate(productOrder.getOrderNumber(),CARD_PAY, OneCardApi.CARD_PAY_URL, JSONObject.toJSONString(param), result);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void checkCarPayResult(ProductOrder productOrder,JSONObject jsonObject){
|
|
|
+ if ("1".equals(jsonObject.get("code"))){
|
|
|
+ productOrder.setOrderFlag(ProductOrderStatus.TAKE.getCode());
|
|
|
+ }else {
|
|
|
+ productOrder.setOrderFlag(ProductOrderStatus.DISH_ERROR.getCode());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成退订订单
|
|
|
+ * @param productOrder
|
|
|
+ */
|
|
|
+ public Order generateReturnOrder(ProductOrder productOrder){
|
|
|
+ Order order = new Order();
|
|
|
+ order.setUserId(productOrder.getUserId());
|
|
|
+ order.setUserName(productOrder.getUserName());
|
|
|
+ order.setUserPhone(productOrder.getUserPhone());
|
|
|
+ order.setMoney(productOrder.getOrderMoney());
|
|
|
+ order.setCard(productOrder.getCard());
|
|
|
+ order.setPayType(OrderPayType.XJ.getPayCode());
|
|
|
+ order.setScene(OrderSceneCode.BACK_STAGE.getCode());
|
|
|
+ order.setOrderFlag(OrderStatus.PAYMENT_ERROR_DEBIT.getCode());
|
|
|
+ String orderNumber = TopApiConfiger.getOrderNumber();
|
|
|
+ order.setOrderNumber(orderNumber);
|
|
|
+ productOrder.setTOrderNumber(orderNumber);
|
|
|
+ productOrder.setOrderFlag(ProductOrderStatus.RETURN_ORDER.getCode());
|
|
|
+ return order;
|
|
|
+ }
|
|
|
+}
|