| package com.xzx.gc.order.controller;  | 
|   | 
|   | 
| import cn.hutool.core.collection.CollUtil;  | 
| import cn.hutool.core.convert.Convert;  | 
| import cn.hutool.core.date.DateUtil;  | 
| import cn.hutool.core.util.NumberUtil;  | 
| import cn.hutool.core.util.StrUtil;  | 
| import com.xzx.gc.common.Result;  | 
| import com.xzx.gc.common.constant.CommonEnum;  | 
| import com.xzx.gc.common.constant.Constants;  | 
| import com.xzx.gc.common.constant.OrderEnum;  | 
| import com.xzx.gc.common.constant.UserEnum;  | 
| import com.xzx.gc.common.dto.CommonDto;  | 
| import com.xzx.gc.common.dto.log.OperationAppLog;  | 
| import com.xzx.gc.common.request.BaseController;  | 
| import com.xzx.gc.common.utils.DateUtils;  | 
| import com.xzx.gc.common.utils.MqUtil;  | 
| import com.xzx.gc.entity.*;  | 
| import com.xzx.gc.model.JsonResult;  | 
| import com.xzx.gc.model.admin.XzxUserRedpaperInfoModel;  | 
| import com.xzx.gc.model.order.RedPaperDto;  | 
| import com.xzx.gc.order.mapper.ConfigMapper;  | 
| import com.xzx.gc.order.mapper.OrderDetailMapper;  | 
| import com.xzx.gc.order.mapper.OrderMapper;  | 
| import com.xzx.gc.order.service.*;  | 
| import com.xzx.gc.util.SessionUtil;  | 
| import io.swagger.annotations.Api;  | 
| import io.swagger.annotations.ApiImplicitParam;  | 
| import io.swagger.annotations.ApiImplicitParams;  | 
| import io.swagger.annotations.ApiOperation;  | 
| import lombok.extern.slf4j.Slf4j;  | 
| import org.springframework.beans.factory.annotation.Autowired;  | 
| import org.springframework.validation.annotation.Validated;  | 
| import org.springframework.web.bind.annotation.*;  | 
| import tk.mybatis.mapper.entity.Example;  | 
|   | 
| import javax.servlet.http.HttpServletRequest;  | 
| import java.math.BigDecimal;  | 
| import java.util.*;  | 
|   | 
| @Api(tags = "红包管理")  | 
| @RequestMapping  | 
| @RestController  | 
| @Slf4j  | 
| @Validated  | 
| public class RedPaperController extends BaseController {  | 
|   | 
|     @Autowired  | 
|     SessionUtil sessionUtil;  | 
|   | 
|   | 
|     @Autowired  | 
|     private CityPartnerService cityPartnerService;  | 
|   | 
|     @Autowired  | 
|     private RedPaperService redPaperService;  | 
|   | 
|     @Autowired  | 
|     private RedPaperRuleService redPaperRuleService;  | 
|   | 
|     @Autowired  | 
|     private OrderMapper orderMapper;  | 
|   | 
|     @Autowired  | 
|     private OrderService orderService;  | 
|   | 
|     @Autowired  | 
|     private ConfigMapper configMapper;  | 
|   | 
|     @Autowired  | 
|     private OrderDetailMapper orderDetailMapper;  | 
|   | 
|     @Autowired  | 
|     private OrderItemService orderItemService;  | 
|   | 
|     @Autowired  | 
|     private OtherUserService otherUserService;  | 
|   | 
|     @Autowired  | 
|     private UserService userService;  | 
|   | 
|     @Autowired  | 
|     private PartnerGaodeService partnerGaodeService;  | 
|   | 
|     @Autowired  | 
|     private SysEnvironmentalInfoService sysEnvironmentalInfoService;  | 
|   | 
|     @Autowired  | 
|     private MqUtil mqUtil;  | 
|   | 
|   | 
|   | 
|     @ApiOperation( value = "查询当前用户是否有可领红包")  | 
|     @PostMapping("/redpaper/find")  | 
|     public Result<RedPaperDto> find(HttpServletRequest request) {  | 
|         String partnerId = partnerGaodeService.findPartnerIdByUserId(getUserId(request), 0);  | 
|         RedPaperRule one = redPaperRuleService.getOne(UserEnum.红包规则.getValue(),partnerId);  | 
|         String userId=getUserId(request);  | 
|         if(one==null){  | 
|             return Result.error(-3,"当前时间段无红包活动");  | 
|         }else{  | 
|             UserInfo byId = userService.findById(userId);  | 
|             if(byId!=null){  | 
|                 String mobilePhone = byId.getMobilePhone();  | 
|                 List<OtherUserInfo> byMobile = otherUserService.findByMobile(mobilePhone);  | 
|                 if(CollUtil.isNotEmpty(byMobile)) {  | 
|                     return Result.error(-3,"平台用户不参与活动");  | 
|                 }  | 
|             }  | 
|             String conversionPerUnit = one.getConversionPerUnit();  | 
|             String sharingProfitType = one.getSharingProfitType();  | 
|             String text="";  | 
|             if(StrUtil.isNotBlank(sharingProfitType)){  | 
|                 ConfigInfo configInfo=new ConfigInfo();  | 
|                 configInfo.setConfigTypeCode("REDPAPER_TEXT");  | 
|                 ConfigInfo configInfo1 = configMapper.selectOne(configInfo);  | 
|                 if(configInfo1!=null){  | 
|                     text=configInfo1.getConfigValueName();  | 
|                 }  | 
|             }  | 
|   | 
|             RedPaper redPaper = redPaperService.getOne(one.getId());  | 
|             if(redPaper==null){  | 
|                 return Result.error(-3,"红包已被领完");  | 
|             }  | 
|             //查询用户是否已领取过红包  | 
|             boolean b = redPaperService.checkIsReceive(userId, one.getId());  | 
|             if(b) {  | 
|                 return Result.error(-3,"您已领取过红包");  | 
|             }  | 
|   | 
|             RedPaperDto redPaperDto=new RedPaperDto();  | 
|             redPaperDto.setText(text);  | 
|             redPaperDto.setRuleId(one.getId());  | 
|             redPaperDto.setIssuanceRules(one.getIssuanceRules());  | 
|             redPaperDto.setRandomAmountAverage(one.getRandomAmountAverage());  | 
|             String applicableObject = one.getApplicableObject();  | 
|             if(UserEnum.全部用户.getValue().equals(applicableObject)){  | 
|                 redPaperDto.setDesignatedUser(1);  | 
|                 return Result.success(redPaperDto);  | 
|             }else if(UserEnum.指定用户.getValue().equals(applicableObject)){  | 
|                 String designatedUser = one.getDesignatedUser();  | 
|                 if(UserEnum.首次下单用户.getValue().equals(designatedUser)){  | 
|                     int i=orderService.findByCreateTime(userId,Constants.ONLINE_REBATE_TIME,0);  | 
|                     int i2=orderService.findByCreateTime(userId,Constants.ONLINE_REBATE_TIME,1);  | 
|                     if(i==1&&i2==0){  | 
|                         redPaperDto.setDesignatedUser(2);  | 
|                         return Result.success(redPaperDto);  | 
|                     }  | 
|                 }else if(UserEnum.非首次下单用户.getValue().equals(designatedUser)){  | 
|                     //满足红包的下单重量  | 
|                     String designatedWeight = one.getDesignatedWeight();  | 
|                     Example example = new Example(OrderInfo.class);  | 
|                     Example.Criteria criteria = example.createCriteria();  | 
|                     criteria.andEqualTo("createUserId", userId);  | 
|                     List<String> list = new ArrayList<>();  | 
|                     list.add(OrderEnum.待入库.getValue());  | 
|                     list.add(OrderEnum.入库中.getValue());  | 
|                     list.add(OrderEnum.完成.getValue());  | 
|                     criteria.andIn("orderStatus", list);  | 
|                     //订单数必须大于1  | 
|                     List<OrderInfo> list1 = orderMapper.selectByExample(example);  | 
|                     List<OrderDetailInfo> list2 = new ArrayList<>();  | 
|                     if(CollUtil.isNotEmpty(list1)&&list1.size()>1){  | 
|   | 
|                         for (OrderInfo orderInfo : list1) {  | 
|                             OrderDetailInfo orderDetailInfo = orderDetailMapper.selectByPrimaryKey(orderInfo.getOrderId());  | 
|                             if (orderDetailInfo != null) {  | 
|                                 Date startTime = DateUtil.parse(one.getStartTime(), DateUtils.DATE_FORMAT_YMD);  | 
|                                 Date endTime = DateUtil.parse(one.getEndTime(), DateUtils.DATE_FORMAT_YMD);  | 
|                                 //订单完成时间要在规则有效时间之内  | 
|                                 boolean in = DateUtil.isIn(DateUtil.parse(orderDetailInfo.getCompleteTime(), DateUtils.DATE_FORMAT_YMD), startTime, endTime);  | 
|                                 if (in) {  | 
|                                     //家电折算成30kg/每个  | 
|                                     int amountNum = 0;  | 
|                                     List<String> childItemTypeByType = sysEnvironmentalInfoService.findChildItemTypeByType(Constants.TIANXIN_CODE, Constants.HOUSE_HOLD_ITEM_TYPE);  | 
|                                     if(CollUtil.isNotEmpty(childItemTypeByType)){  | 
|                                         List<OrderItemInfo> houseHold = orderItemService.findByOrderIdAndTypes(orderInfo.getOrderId(), childItemTypeByType);  | 
|                                         if (CollUtil.isNotEmpty(houseHold)) {  | 
|                                             for (OrderItemInfo orderItemInfo : houseHold) {  | 
|                                                 String amount = orderItemInfo.getAmount();  | 
|                                                 if (StrUtil.isNotBlank(amount)) {  | 
|                                                     amountNum = amountNum + Convert.toInt(amount, 0);  | 
|                                                 }  | 
|                                             }  | 
|                                         }  | 
|                                         if (StrUtil.isBlank(conversionPerUnit)) {  | 
|                                             conversionPerUnit = "0";  | 
|                                         }  | 
|                                         BigDecimal i = NumberUtil.mul(Convert.toBigDecimal(amountNum), Convert.toBigDecimal(conversionPerUnit));  | 
|                                         orderDetailInfo.setHouseHoldWeight(Convert.toStr(i));  | 
|                                     }  | 
|                                     list2.add(orderDetailInfo);  | 
|                                 }  | 
|                             }  | 
|                         }  | 
|                         if(CollUtil.isNotEmpty(list2)){  | 
|                             Double sum = list2.stream().mapToDouble(x -> Convert.toDouble(x.getWeight(), Convert.toDouble(Constants.WEIGHT_INIT))).sum();  | 
|                             Double sumHouse = list2.stream().mapToDouble(x -> Convert.toDouble(x.getHouseHoldWeight(), Convert.toDouble(Constants.WEIGHT_INIT))).sum();  | 
|                             sum=NumberUtil.add(sum,sumHouse);  | 
|                             if(NumberUtil.compare(sum,Convert.toDouble(designatedWeight))>=0){  | 
|                                 redPaperDto.setDesignatedUser(3);  | 
|                                 return Result.success(redPaperDto);  | 
|                             }  | 
|                         }  | 
|   | 
|                     }  | 
|                 }  | 
|             }  | 
|         }  | 
|         return Result.error(-3,"无红包可领");  | 
|     }  | 
|   | 
|   | 
|     @ApiOperation( value = "领取红包",notes = "id为查询接口返回的id")  | 
|     @PostMapping("/redpaper")  | 
|     public Result<RedPaper> get(HttpServletRequest request, @RequestBody CommonDto commonDto) {  | 
|         RedPaper redPaper=redPaperService.get(commonDto.getId(),getUserId(request));  | 
|   | 
|         String mobilePhone = userService.findOtherByUserId(getUserId(request),0);  | 
|         OperationAppLog build = OperationAppLog.builder().appPrograme(getFrontClient(request)).opreateName(mobilePhone)  | 
|                 .methodName(Constants.ORDER_MODUL_NAME).operateAction("领取红包-"+redPaper.getId()).build();  | 
|         mqUtil.sendApp(build);  | 
|   | 
|         return Result.success(redPaper);  | 
|     }  | 
|   | 
|   | 
|     @PostMapping(Constants.ADMIN_VIEW_PREFIX + "/xzxUserRedpaperInfo/redPaperList.do")  | 
|     @ResponseBody  | 
|     @ApiOperation(value="红包记录-红包列表", notes="test: 仅0有正确返回")  | 
|     @ApiImplicitParams({  | 
|             @ApiImplicitParam(paramType="query", name = "page", value = "页码", required = true, dataType = "int"),  | 
|             @ApiImplicitParam(paramType="query", name = "limit", value = "每页条数", required = true, dataType = "int"),  | 
|             @ApiImplicitParam(paramType="query", name = "startTime", value = "开始时间", required = true, dataType = "String"),  | 
|             @ApiImplicitParam(paramType="query", name = "endTime", value = "结束时间", required = true, dataType = "String"),  | 
|             @ApiImplicitParam(paramType="query", name = "receiveFlag", value = "红包领取状态0:已领取 1未领取", required = true, dataType = "Integer")  | 
|     })  | 
|     public JsonResult<Map<String,Object>> redPaperList(@RequestBody XzxUserRedpaperInfoModel model)  | 
|     {  | 
|         Map<String,Object> map =redPaperService.redPaperList(model);  | 
|         return JsonResult.success(map);  | 
|     }  | 
|     @PostMapping(Constants.ADMIN_VIEW_PREFIX + "/xzxUserRedpaperInfo/cancelRedPaper.do")  | 
|     @ResponseBody  | 
|     @ApiOperation(value="红包记录-红包退还", notes="test: 仅0有正确返回")  | 
|     public JsonResult<Map<String,Object>> cancelRedPaper(HttpServletRequest request){  | 
|         CoreUser user = sessionUtil.getCurrentUser();  | 
|         CityPartner partner = cityPartnerService.queryById(user.getId());  | 
|         String msg = redPaperService.cancelRedPaper(partner,"1");  | 
|         if(null!=msg&&!"".equals(msg)){  | 
|             return JsonResult.failMessage(msg);  | 
|         }else{  | 
|   | 
|             Map<String,Object> map=new HashMap<>();  | 
|             map.put("code",0);  | 
|             map.put("msg","退还成功");  | 
|   | 
|             OperationAppLog build = OperationAppLog.builder().appPrograme(CommonEnum.后台.getValue()).opreateName(getAdminName(request))  | 
|                     .methodName(Constants.ORDER_MODUL_NAME).operateAction("红包退还-"+partner.getId()).build();  | 
|             mqUtil.sendApp(build);  | 
|   | 
|             return JsonResult.success(map);  | 
|         }  | 
|     }  | 
| }  |