admin
2020-09-30 01955bc3f6e6eec6d82a5a3848efde1fa6cc8137
云发单优化
5个文件已修改
1953 ■■■■ 已修改文件
fanli/src/main/java/com/yeshi/fanli/controller/client/v2/UserCloudControllerV2.java 1498 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/dao/mybatis/user/cloud/UserCloudOrderMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/entity/bus/user/cloud/CloudOrderMenuEnum.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/user/cloud/UserCloudOrderServiceImpl.java 222 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/resource/mapping/user/cloud/UserCloudOrderMapper.xml 220 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/controller/client/v2/UserCloudControllerV2.java
@@ -9,6 +9,10 @@
import javax.annotation.Resource;
import com.yeshi.fanli.dto.vip.UserVIPLevel;
import com.yeshi.fanli.entity.bus.user.vip.UserVIPPreInfo;
import com.yeshi.fanli.service.inter.user.vip.UserVIPInfoService;
import com.yeshi.fanli.service.inter.user.vip.UserVIPPreInfoService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.yeshi.utils.DateUtil;
@@ -68,773 +72,791 @@
@RequestMapping("api/v2/user/cloud")
public class UserCloudControllerV2 {
    @Resource
    private UserCloudService userCloudService;
    @Resource
    private UserCloudService userCloudService;
    @Resource
    private UserCloudOrderService userCloudOrderService;
    @Resource
    private UserCloudOrderService userCloudOrderService;
    @Resource
    private UserCloudGroupService userCloudGroupService;
    @Resource
    private UserCloudGroupService userCloudGroupService;
    @Resource
    private UserCloudGoodsService userCloudGoodsService;
    @Resource
    private UserCloudGoodsService userCloudGoodsService;
    @Resource
    private UserInfoService userInfoService;
    @Resource
    private UserInfoService userInfoService;
    @Resource
    private OrderHongBaoMoneyComputeService orderHongBaoMoneyComputeService;
    @Resource
    private OrderHongBaoMoneyComputeService orderHongBaoMoneyComputeService;
    @Resource
    private UserCloudManageService userCloudManageService;
    @Resource
    private UserCloudManageService userCloudManageService;
    @Resource
    private UserCloudAlipayManager userCloudAlipayManager;
    @Resource
    private GoodsEvaluateService goodsEvaluateService;
    @Resource
    private ConfigService configService;
    @Resource
    private RedisManager redisManager;
    @Resource
    private SwiperPictureService swiperPictureService;
    @Resource
    private UserCloudAlipayManager userCloudAlipayManager;
    /**
     * 查询开通记录
     *
     * @param callback
     * @param acceptData
     * @param page
     * @param uid
     * @param out
     */
    @RequestMapping(value = "getOrderRecord")
    public void getOrderRecord(String callback, AcceptData acceptData, Integer page, Long uid, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
    @Resource
    private GoodsEvaluateService goodsEvaluateService;
        if (page == null)
            page = 1;
    @Resource
    private ConfigService configService;
        // 查询成功记录
        int state = 1;
        List<UserCloudOrder> list = userCloudOrderService.getOrderRecord(page, Constant.PAGE_SIZE, uid, state);
        if (list == null)
            list = new ArrayList<>();
    @Resource
    private RedisManager redisManager;
        GsonBuilder gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation();
        gsonBuilder.registerTypeAdapter(BigDecimal.class, new JsonSerializer<BigDecimal>() {
            @Override
            public JsonElement serialize(BigDecimal value, Type theType, JsonSerializationContext context) {
                if (value == null) {
                    return new JsonPrimitive("");
                } else {
                    // 保留2位小数
                    value = value.setScale(2, BigDecimal.ROUND_DOWN);
                    return new JsonPrimitive(value.toString());
                }
            }
        }).registerTypeAdapter(Date.class, new JsonSerializer<Date>() {
            @Override
            public JsonElement serialize(Date value, Type theType, JsonSerializationContext context) {
                if (value == null) {
                    return new JsonPrimitive("");
                } else {
                    return new JsonPrimitive(TimeUtil.formatDate(value));
                }
            }
        });
    @Resource
    private SwiperPictureService swiperPictureService;
        long count = userCloudOrderService.countOrderRecord(uid, state);
    @Resource
    private UserVIPPreInfoService userVIPPreInfoService;
        JSONObject data = new JSONObject();
        data.put("count", count);
        data.put("list", gsonBuilder.create().toJson(list));
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
    }
    /**
     * 查询开通记录
     *
     * @param callback
     * @param acceptData
     * @param page
     * @param uid
     * @param out
     */
    @RequestMapping(value = "getOrderRecord")
    public void getOrderRecord(String callback, AcceptData acceptData, Integer page, Long uid, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
    /**
     * 获取开通信息
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param out
     */
    @RequestMapping(value = "getCloudInfo")
    public void getCloudInfo(String callback, AcceptData acceptData, Long uid, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
        if (page == null)
            page = 1;
        UserInfo userInfo = userInfoService.getUserByIdWithMybatis(uid);
        if (userInfo == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户信息不存在"));
            return;
        }
        // 查询成功记录
        int state = 1;
        List<UserCloudOrder> list = userCloudOrderService.getOrderRecord(page, Constant.PAGE_SIZE, uid, state);
        if (list == null)
            list = new ArrayList<>();
        List<CloudOrderMenuVO> listMenu = new ArrayList<>();
        CloudOrderMenuEnum[] menus = CloudOrderMenuEnum.values();
        for (CloudOrderMenuEnum menuEnum: menus) {
            CloudOrderMenuVO menuVO = new CloudOrderMenuVO();
            menuVO.setMoney(BigDecimal.valueOf(menuEnum.getMoney()) );
            menuVO.setType(menuEnum.name());
            menuVO.setDesc(menuEnum.getDescShow());
            listMenu.add(menuVO);
        }
        UserCloudInfoVO cloudInfoVO = new UserCloudInfoVO();
        cloudInfoVO.setNickName(userInfo.getNickName());
        cloudInfoVO.setPortrait(userInfo.getPortrait());
        cloudInfoVO.setOpenState(0); // 未开通
        cloudInfoVO.setListMenu(listMenu);
        // 是否开通
        UserCloud userCloud = userCloudService.getLastByUid(uid);
        if (userCloud == null) {
            cloudInfoVO.setOpenState(0); // 未开通
        } else {
            Date endTime = userCloud.getEndTime();
            if (endTime != null && endTime.getTime() > java.lang.System.currentTimeMillis()) {
                cloudInfoVO.setOpenState(1); // 还未过期
                // 登录微信
                cloudInfoVO.setWxName(userCloud.getWxName());
                if (userCloud.getStartTime() != null)
                    cloudInfoVO.setOpenTime(TimeUtil.formatDateDot(userCloud.getStartTime()));
                if (userCloud.getEndTime() != null) {
                    try {
                        cloudInfoVO.setCountdown(DateUtil.daysBetween2(new Date(), userCloud.getEndTime()) + "");
                    } catch (Exception e) {
                        LogHelper.errorDetailInfo(e);
                    }
                }
        GsonBuilder gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation();
        gsonBuilder.registerTypeAdapter(BigDecimal.class, new JsonSerializer<BigDecimal>() {
            @Override
            public JsonElement serialize(BigDecimal value, Type theType, JsonSerializationContext context) {
                if (value == null) {
                    return new JsonPrimitive("");
                } else {
                    // 保留2位小数
                    value = value.setScale(2, BigDecimal.ROUND_DOWN);
                    return new JsonPrimitive(value.toString());
                }
            }
        }).registerTypeAdapter(Date.class, new JsonSerializer<Date>() {
            @Override
            public JsonElement serialize(Date value, Type theType, JsonSerializationContext context) {
                if (value == null) {
                    return new JsonPrimitive("");
                } else {
                    return new JsonPrimitive(TimeUtil.formatDate(value));
                }
            }
        });
                Integer robotId = userCloud.getRobotId();
                // 检测是否已登录
                if (AitaokerApiUtil.onlineCheck(robotId)) {
                    boolean circle = false;
                    List<UserCloudGroup> listGroup = new ArrayList<>();
                    List<UserCloudGroup> list = userCloudGroupService.listByUid(uid);
                    if (list != null && list.size() > 0) {
                        for (UserCloudGroup cloudGroup : list) {
                            if (cloudGroup.getType() == UserCloudGroup.TYPE_CIRCLE) {
                                if (cloudGroup.getState() != null)
                                    circle = cloudGroup.getState();
                            } else {
                                listGroup.add(cloudGroup);
                            }
                        }
                    }
        long count = userCloudOrderService.countOrderRecord(uid, state);
                    cloudInfoVO.setLoginState(true);
                    cloudInfoVO.setCircle(circle);
                    cloudInfoVO.setListGroup(listGroup);
                }
            }
        }
        // 教程
        List<BannerVO> listBanner = swiperPictureService.getByBannerCard("cloud_course",acceptData.getSystem());
        if (listBanner != null && listBanner.size() > 0) {
            cloudInfoVO.setCourse(listBanner.get(0));
        }
        GsonBuilder gsonBuilder = new GsonBuilder();
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(gsonBuilder.create().toJson(cloudInfoVO)));
    }
        JSONObject data = new JSONObject();
        data.put("count", count);
        data.put("list", gsonBuilder.create().toJson(list));
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
    }
    /**
     * 获取登录二维码
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param out
     */
    @RequestSerializableByKey(key = "'getQrcodeMaclogin-'+#uid")
    @RequestMapping(value = "getQrcodeMaclogin")
    public void getQrcodeMaclogin(String callback, AcceptData acceptData, Long uid, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
    /**
     * 获取开通信息
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param out
     */
    @RequestMapping(value = "getCloudInfo")
    public void getCloudInfo(String callback, AcceptData acceptData, Long uid, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
        UserCloud userCloud = userCloudService.getValidByUid(uid);
        if (userCloud == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "未开通云发单"));
            return;
        }
        UserInfo userInfo = userInfoService.getUserByIdWithMybatis(uid);
        if (userInfo == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户信息不存在"));
            return;
        }
        // 机器人ID
        Integer robotId = userCloud.getRobotId();
        if (robotId == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "正在开通中,如有疑问请联系客服"));
            return;
        }
        // 获取登录URL
        QrcodeLoginDTO maclogin = AitaokerApiUtil.getQrcodeMaclogin(userCloud.getRobotId());
        if (maclogin == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "获取登录二维码失败"));
            return;
        }
        JSONObject data = new JSONObject();
        data.put("wId", maclogin.getwId());
        data.put("qrCodeUrl", maclogin.getQrCodeUrl());
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
    }
    /**
     * 检测是否微信登录
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param wId
     * @param out
     */
    @RequestMapping(value = "macloginCheck")
    public void macloginCheck(String callback, AcceptData acceptData, Long uid, String wId, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
        UserCloud userCloud = userCloudService.getValidByUid(uid);
        if (userCloud == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "云发单开通已过期"));
            return;
        }
        // 机器人ID
        Integer robotId = userCloud.getRobotId();
        if (robotId == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "正在开通中,如有疑问请联系客服"));
            return;
        }
        boolean state = false;
        JSONObject data = new JSONObject();
        QrcodeLoginDTO dto = AitaokerApiUtil.getQrcodeMacloginCheck(robotId, wId);
        if (dto != null) {
            LogHelper.cloudInfo("方法macloginCheck: [uid=" + uid + "][wxID=" + dto.getWcId() + "][ NickName=" + dto.getNickName() + "]" );
            try {
                // 更新微信信息
                userCloudService.updateWXInfo(uid, dto.getWcId(), dto.getNickName(), dto.getHeadUrl());
            } catch (UserCloudException e) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, e.getMsg()));
                return;
            }
            state = true;
            boolean circle = false;
            List<UserCloudGroup> listGroup = new ArrayList<>();
            List<UserCloudGroup> list = userCloudGroupService.listByUid(uid);
            if (list != null && list.size() > 0) {
                for (UserCloudGroup cloudGroup : list) {
                    if (cloudGroup.getType() == UserCloudGroup.TYPE_CIRCLE) {
                        if (cloudGroup.getState() != null)
                            circle = cloudGroup.getState();
                    } else {
                        listGroup.add(cloudGroup);
                    }
                }
            }
            data.put("wxName", dto.getNickName());
            data.put("circle", circle);
            data.put("listGroup", listGroup);
        }
        data.put("state", state);
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
    }
    /**
     * 退出登录
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param out
     */
    @RequestMapping(value = "macloginOffline")
    public void macloginOffline(String callback, AcceptData acceptData, Long uid, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
        UserCloud userCloud = userCloudService.getLastByUid(uid);
        if (userCloud == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("云发单开通已过期"));
            return;
        }
        // 机器人ID
        Integer robotId = userCloud.getRobotId();
        if (robotId == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "未绑定机器人"));
            return;
        }
        // 退出机器人
        boolean offline = AitaokerApiUtil.macloginOffline(robotId);
        if (offline) {
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("退出成功"));
        } else {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("退出失败"));
        }
    }
    /**
     * 切换朋友圈状态
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param id
     * @param out
     */
    @RequestMapping(value = "switchCircleState")
    public void switchCircleState(String callback, AcceptData acceptData, Long uid, Integer state, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
        if (state == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "状态不能为空"));
            return;
        }
        boolean reslut = false;
        if (state == 1) {
            reslut = true;
        }
        try {
            userCloudGroupService.switchCircleState(uid, reslut);
        } catch (UserCloudGroupException e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMsg()));
        }
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("操作成功"));
    }
    /**
     * 检测是否微信登录
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param wId
     * @param out
     */
    @RequestMapping(value = "searchGroup")
    public void searchGroup(String callback, AcceptData acceptData, Long uid, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
        UserCloud userCloud = userCloudService.getValidByUid(uid);
        if (userCloud == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "请先开通云发单"));
            return;
        }
        try {
            // 重新获取群列表
            userCloudService.searchGroup(uid);
            // 获取最新群
            List<UserCloudGroup> list = userCloudGroupService.listGroupByUid(uid);
            if (list == null)
                list = new ArrayList<>();
            JSONObject data = new JSONObject();
            data.put("listGroup", list);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (UserCloudException e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, e.getMsg()));
        }
    }
    /**
     * 设置状态
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param type
     * @param out
     */
    @RequestMapping(value = "switchGroupState")
    public void switchGroupState(String callback, AcceptData acceptData, Long uid, Long id, Integer state,
            PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
        if (id == null || state == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "参数不能为空"));
            return;
        }
        UserCloud userCloud = userCloudService.getValidByUid(uid);
        if (userCloud == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "请先开通云发单"));
            return;
        }
        boolean reslut = false;
        if (state == 1) {
            reslut = true;
        }
        try {
            userCloudGroupService.switchGroupState(uid, id, reslut);
            // 获取最新群
            List<UserCloudGroup> list = userCloudGroupService.listGroupByUid(uid);
            if (list == null)
                list = new ArrayList<>();
            JSONObject data = new JSONObject();
            data.put("listGroup", list);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (UserCloudGroupException e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMsg()));
        }
    }
    /**
     * 设置状态
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param type
     * @param out
     */
    @RequestMapping(value = "deleteGroup")
    public void switchGroupState(String callback, AcceptData acceptData, Long uid, Long id,
            PrintWriter out) {
        if (uid == null || id == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "参数不完整"));
            return;
        }
        try {
            userCloudGroupService.deleteGroup(uid, id);
            // 获取最新群
            List<UserCloudGroup> list = userCloudGroupService.listGroupByUid(uid);
            if (list == null)
                list = new ArrayList<>();
            JSONObject data = new JSONObject();
            data.put("listGroup", list);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (UserCloudGroupException e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMsg()));
        }
    }
    /**
     * 获取云发单库商品
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param page
     * @param out
     */
    @RequestMapping(value = "getGoodsList")
    public void getGoodsList(String callback, AcceptData acceptData, Long uid, Integer page, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
        if (page == null)
            page = 1;
        List<UserCloudGoods> list = userCloudGoodsService.listByUid((page - 1) * Constant.PAGE_SIZE, Constant.PAGE_SIZE,
                uid);
        if (list == null)
            list = new ArrayList<>();
        JSONArray array = new JSONArray();
        JSONObject data = new JSONObject();
        if (list.size() > 0) {
            Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder())
                    .excludeFieldsWithoutExposeAnnotation().setDateFormat("yyyy-MM-dd").create();
            ConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate(acceptData.getPlatform(),
                    acceptData.getVersion(),acceptData.getSystem());
            for (UserCloudGoods cloudGoods : list) {
                CommonGoods commonGoods = cloudGoods.getCommonGoods();
                if (commonGoods == null) {
                    continue;
                }
                // 判断是否已分享, 已分享显示已下架
                Integer state = cloudGoods.getState();
                if (state != null && state == UserCloudGoods.STATE_SHARED) {
                    Integer goodsState = commonGoods.getState();
                    if (goodsState != null && goodsState != 1) {
                        commonGoods.setState(2);
                    }
                }
                if (state != null && state == UserCloudGoods.STATE_INVALID) {
                    commonGoods.setState(1);
                }
                GoodsDetailVO detailVO = GoodsDetailVOFactory.convertCommonGoods(commonGoods, paramsDTO);
                detailVO.setId(commonGoods.getId());
                JSONObject dataObject = new JSONObject();
                dataObject.put("id", cloudGoods.getId());
                dataObject.put("goods", gson.toJson(detailVO));
                array.add(dataObject);
            }
        }
        // 第一页返回设置信息
        if (page == 1) {
            boolean custom = false;
            boolean official = false;
            UserCloudManage cloudManage = userCloudManageService.selectByPrimaryKey(uid);
            if (cloudManage != null) {
                if (cloudManage.getOfficial() != null)
                    official = cloudManage.getOfficial();
                if (cloudManage.getCustom() != null)
                    custom = cloudManage.getCustom();
            }
            data.put("custom", custom);
            data.put("official", official);
        }
        data.put("count", userCloudGoodsService.countByUid(uid));
        data.put("list", array);
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
    }
        List<CloudOrderMenuVO> listMenu = new ArrayList<>();
        CloudOrderMenuEnum[] menus = CloudOrderMenuEnum.values();
        for (CloudOrderMenuEnum menuEnum : menus) {
            CloudOrderMenuVO menuVO = new CloudOrderMenuVO();
            menuVO.setMoney(BigDecimal.valueOf(menuEnum.getMoney()));
            menuVO.setType(menuEnum.name());
            menuVO.setDesc(menuEnum.getDescShow());
            listMenu.add(menuVO);
        }
        UserCloudInfoVO cloudInfoVO = new UserCloudInfoVO();
        cloudInfoVO.setNickName(userInfo.getNickName());
        cloudInfoVO.setPortrait(userInfo.getPortrait());
        cloudInfoVO.setOpenState(0); // 未开通
        cloudInfoVO.setListMenu(listMenu);
    /**
     *  删除云发单备选库
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param id
     * @param out
     */
    @RequestMapping(value = "deleteGoods")
    public void deleteGoods(String callback, AcceptData acceptData, Long uid, Long id, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("用户未登录"));
            return;
        }
        if (id == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "参数不完整"));
            return;
        }
        userCloudGoodsService.deleteByPrimaryKeyAndUid(id, uid);
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("操作成功"));
    }
        // 是否开通
        UserCloud userCloud = userCloudService.getLastByUid(uid);
        if (userCloud == null) {
            cloudInfoVO.setOpenState(0); // 未开通
        } else {
            Date endTime = userCloud.getEndTime();
            if (endTime != null && endTime.getTime() > java.lang.System.currentTimeMillis()) {
                cloudInfoVO.setOpenState(1); // 还未过期
                // 登录微信
                cloudInfoVO.setWxName(userCloud.getWxName());
                if (userCloud.getStartTime() != null)
                    cloudInfoVO.setOpenTime(TimeUtil.formatDateDot(userCloud.getStartTime()));
                if (userCloud.getEndTime() != null) {
                    try {
                        cloudInfoVO.setCountdown(DateUtil.daysBetween2(new Date(), userCloud.getEndTime()) + "");
                    } catch (Exception e) {
                        LogHelper.errorDetailInfo(e);
                    }
                }
    /**
     * 设置状态
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param type
     * @param out
     */
    @RequestMapping(value = "switchState")
    public void switchState(String callback, AcceptData acceptData, Long uid, Integer type, Integer state,
            PrintWriter out) {
        if (uid == null || type == null || state == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "参数不完整"));
            return;
        }
        boolean reslut = false;
        if (state == 1) {
            reslut = true;
        }
        if (type == 1) {
            userCloudManageService.save(uid, reslut, null);
        } else {
            userCloudManageService.save(uid, null, reslut);
        }
        JSONObject data = new JSONObject();
        data.put("state", reslut);
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
    }
                Integer robotId = userCloud.getRobotId();
                // 检测是否已登录
                if (AitaokerApiUtil.onlineCheck(robotId)) {
                    boolean circle = false;
                    List<UserCloudGroup> listGroup = new ArrayList<>();
                    List<UserCloudGroup> list = userCloudGroupService.listByUid(uid);
                    if (list != null && list.size() > 0) {
                        for (UserCloudGroup cloudGroup : list) {
                            if (cloudGroup.getType() == UserCloudGroup.TYPE_CIRCLE) {
                                if (cloudGroup.getState() != null)
                                    circle = cloudGroup.getState();
                            } else {
                                listGroup.add(cloudGroup);
                            }
                        }
                    }
    /**
     * 云发单支付
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param type       机器人类型
     * @param response
     * @param out
     */
    @RequestMapping(value = "pay")
    public void pay(String callback, AcceptData acceptData, Long uid, String type, PrintWriter out) {
        try {
            if (uid == null) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
                return;
            }
                    cloudInfoVO.setLoginState(true);
                    cloudInfoVO.setCircle(circle);
                    cloudInfoVO.setListGroup(listGroup);
                }
            }
        }
            if (StringUtil.isNullOrEmpty(type)) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "请选择云发单套餐"));
                return;
            }
        // 教程
        List<BannerVO> listBanner = swiperPictureService.getByBannerCard("cloud_course", acceptData.getSystem());
        if (listBanner != null && listBanner.size() > 0) {
            cloudInfoVO.setCourse(listBanner.get(0));
        }
        GsonBuilder gsonBuilder = new GsonBuilder();
            // 创建支付信息
            String alipayForm = userCloudAlipayManager.getAlipayForm(uid, type);
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(gsonBuilder.create().toJson(cloudInfoVO)));
    }
            // 返回信息 - 缓存到session
            StringBuilder builder = new StringBuilder();
            builder.append("<html><head><title>alipay</title></head>");
            builder.append("<body>" + alipayForm + "</body></html>");
            // 缓存到redis- 一分钟
            String key = RedisKeyEnum.cloudAlipayLink.getKey() + uid + "_" + type;
            key = StringUtil.Md5(key);
            redisManager.cacheCommonString(key , builder.toString() , 60*10);
            String link = configService.getValue(ConfigKeyEnum.cloudAlipayJumpLink.getKey(),acceptData.getSystem()) +"?key=%s";
            JSONObject dataObject = new JSONObject();
            dataObject.put("link", String.format(link, key));
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(dataObject));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "创建支付信息失败"));
            LogHelper.errorDetailInfo(e);
        }
    }
    /**
     * 获取登录二维码
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param out
     */
    @RequestSerializableByKey(key = "'getQrcodeMaclogin-'+#uid")
    @RequestMapping(value = "getQrcodeMaclogin")
    public void getQrcodeMaclogin(String callback, AcceptData acceptData, Long uid, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
    /**
     * 支付完成
     *
     * @param id
     * @param out
     */
    @RequestMapping(value = "payEnd")
    public void payEnd(String callback, AcceptData acceptData, Long uid, Long id, PrintWriter out) {
        if (uid == null || id == null) {
            out.print(JsonUtil.loadFalseResult(1, "参数信息缺失"));
            return;
        }
        try {
            // 检测是否支付完成
            userCloudAlipayManager.tradeQueryByOrderId(id);
            UserCloudOrder cloudOrder = userCloudOrderService.selectByPrimaryKey(id);
            JSONObject dataObject = new JSONObject();
            dataObject.put("money", cloudOrder.getMoney());
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(dataObject));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult(1, "回调信息失败"));
            LogHelper.errorDetailInfo(e);
        }
    }
    /**
     * 动态一键发单
     * @param callback
     * @param acceptData
     * @param uid
     * @param id
     * @param out
     */
    @RequestMapping(value = "sendCircle")
    public void sendCircle(String callback, AcceptData acceptData, Long uid, String id,    PrintWriter out) {
        if (uid == null || StringUtil.isNullOrEmpty(id)) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("参数不能为空"));
            return;
        }
        try {
            userCloudService.sendByDynamic(uid, id);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("一键发单成功"));
        } catch (UserCloudException e) {
            if (e.getCode() > 1000 && e.getCode() < 1100) {
                JSONObject data = new JSONObject();
                data.put("link",  configService.getValue(ConfigKeyEnum.robotCloudLink.getKey(),acceptData.getSystem()));
                JsonUtil.printMode(out, callback, JsonUtil.loadTrue(e.getCode(), data, e.getMsg()).toString());
            } else {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getCode(),e.getMsg()));
            }
        }
    }
    /**
     * 商品详情一键发单
     * @param callback
     * @param acceptData
     * @param uid
     * @param goodsId
     * @param goodsType
     * @param out
     */
    @RequestMapping(value = "sendGoods")
    public void sendGoods(String callback, AcceptData acceptData, Long uid, String goodsId, Integer goodsType, PrintWriter out) {
        if (uid == null || goodsId == null || goodsType == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("参数不能为空"));
            return;
        }
        try {
            GoodsEvaluate evaluate = goodsEvaluateService.queryExistSingle(goodsId, goodsType,acceptData.getSystem());
            if (evaluate != null) {
                userCloudService.sendByDynamic(uid, evaluate.getId());
            } else {
                Long gid = null;
                Long sellerId = null;
                if (goodsType == Constant.SOURCE_TYPE_SUNING) { // 苏宁
                    String[] ids = SuningUtil.getGoodsIdDetail(goodsId);
                    gid = Long.parseLong(ids[1]);
                    sellerId = Long.parseLong(ids[0]);
                } else {
                    gid = Long.parseLong(goodsId);
                }
                userCloudService.sendCustomGoods(uid, gid, goodsType, sellerId);
            }
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("加入发单库成功"));
        } catch (UserCloudException e) {
            if (e.getCode() > 1000 && e.getCode() < 1100) {
                JSONObject data = new JSONObject();
                data.put("link",  configService.getValue(ConfigKeyEnum.robotCloudLink.getKey(),acceptData.getSystem()));
                JsonUtil.printMode(out, callback, JsonUtil.loadTrue(e.getCode(), data, e.getMsg()).toString());
            } else {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getCode(),e.getMsg()));
            }
        }
    }
        UserCloud userCloud = userCloudService.getValidByUid(uid);
        if (userCloud == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "未开通云发单"));
            return;
        }
        // 机器人ID
        Integer robotId = userCloud.getRobotId();
        if (robotId == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "正在开通中,如有疑问请联系客服"));
            return;
        }
        // 获取登录URL
        QrcodeLoginDTO maclogin = AitaokerApiUtil.getQrcodeMaclogin(userCloud.getRobotId());
        if (maclogin == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "获取登录二维码失败"));
            return;
        }
        JSONObject data = new JSONObject();
        data.put("wId", maclogin.getwId());
        data.put("qrCodeUrl", maclogin.getQrCodeUrl());
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
    }
    /**
     * 检测是否微信登录
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param wId
     * @param out
     */
    @RequestMapping(value = "macloginCheck")
    public void macloginCheck(String callback, AcceptData acceptData, Long uid, String wId, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
        UserCloud userCloud = userCloudService.getValidByUid(uid);
        if (userCloud == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "云发单开通已过期"));
            return;
        }
        // 机器人ID
        Integer robotId = userCloud.getRobotId();
        if (robotId == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "正在开通中,如有疑问请联系客服"));
            return;
        }
        boolean state = false;
        JSONObject data = new JSONObject();
        QrcodeLoginDTO dto = AitaokerApiUtil.getQrcodeMacloginCheck(robotId, wId);
        if (dto != null) {
            LogHelper.cloudInfo("方法macloginCheck: [uid=" + uid + "][wxID=" + dto.getWcId() + "][ NickName=" + dto.getNickName() + "]");
            try {
                // 更新微信信息
                userCloudService.updateWXInfo(uid, dto.getWcId(), dto.getNickName(), dto.getHeadUrl());
            } catch (UserCloudException e) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, e.getMsg()));
                return;
            }
            state = true;
            boolean circle = false;
            List<UserCloudGroup> listGroup = new ArrayList<>();
            List<UserCloudGroup> list = userCloudGroupService.listByUid(uid);
            if (list != null && list.size() > 0) {
                for (UserCloudGroup cloudGroup : list) {
                    if (cloudGroup.getType() == UserCloudGroup.TYPE_CIRCLE) {
                        if (cloudGroup.getState() != null)
                            circle = cloudGroup.getState();
                    } else {
                        listGroup.add(cloudGroup);
                    }
                }
            }
            data.put("wxName", dto.getNickName());
            data.put("circle", circle);
            data.put("listGroup", listGroup);
        }
        data.put("state", state);
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
    }
    /**
     * 退出登录
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param out
     */
    @RequestMapping(value = "macloginOffline")
    public void macloginOffline(String callback, AcceptData acceptData, Long uid, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
        UserCloud userCloud = userCloudService.getLastByUid(uid);
        if (userCloud == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("云发单开通已过期"));
            return;
        }
        // 机器人ID
        Integer robotId = userCloud.getRobotId();
        if (robotId == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "未绑定机器人"));
            return;
        }
        // 退出机器人
        boolean offline = AitaokerApiUtil.macloginOffline(robotId);
        if (offline) {
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("退出成功"));
        } else {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("退出失败"));
        }
    }
    /**
     * 切换朋友圈状态
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param id
     * @param out
     */
    @RequestMapping(value = "switchCircleState")
    public void switchCircleState(String callback, AcceptData acceptData, Long uid, Integer state, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
        if (state == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "状态不能为空"));
            return;
        }
        boolean reslut = false;
        if (state == 1) {
            reslut = true;
        }
        try {
            userCloudGroupService.switchCircleState(uid, reslut);
        } catch (UserCloudGroupException e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMsg()));
        }
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("操作成功"));
    }
    /**
     * 检测是否微信登录
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param wId
     * @param out
     */
    @RequestMapping(value = "searchGroup")
    public void searchGroup(String callback, AcceptData acceptData, Long uid, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
        UserCloud userCloud = userCloudService.getValidByUid(uid);
        if (userCloud == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "请先开通云发单"));
            return;
        }
        try {
            // 重新获取群列表
            userCloudService.searchGroup(uid);
            // 获取最新群
            List<UserCloudGroup> list = userCloudGroupService.listGroupByUid(uid);
            if (list == null)
                list = new ArrayList<>();
            JSONObject data = new JSONObject();
            data.put("listGroup", list);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (UserCloudException e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, e.getMsg()));
        }
    }
    /**
     * 设置状态
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param type
     * @param out
     */
    @RequestMapping(value = "switchGroupState")
    public void switchGroupState(String callback, AcceptData acceptData, Long uid, Long id, Integer state,
                                 PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
        if (id == null || state == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "参数不能为空"));
            return;
        }
        UserCloud userCloud = userCloudService.getValidByUid(uid);
        if (userCloud == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "请先开通云发单"));
            return;
        }
        boolean reslut = false;
        if (state == 1) {
            reslut = true;
        }
        try {
            userCloudGroupService.switchGroupState(uid, id, reslut);
            // 获取最新群
            List<UserCloudGroup> list = userCloudGroupService.listGroupByUid(uid);
            if (list == null)
                list = new ArrayList<>();
            JSONObject data = new JSONObject();
            data.put("listGroup", list);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (UserCloudGroupException e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMsg()));
        }
    }
    /**
     * 设置状态
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param type
     * @param out
     */
    @RequestMapping(value = "deleteGroup")
    public void switchGroupState(String callback, AcceptData acceptData, Long uid, Long id,
                                 PrintWriter out) {
        if (uid == null || id == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "参数不完整"));
            return;
        }
        try {
            userCloudGroupService.deleteGroup(uid, id);
            // 获取最新群
            List<UserCloudGroup> list = userCloudGroupService.listGroupByUid(uid);
            if (list == null)
                list = new ArrayList<>();
            JSONObject data = new JSONObject();
            data.put("listGroup", list);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (UserCloudGroupException e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMsg()));
        }
    }
    /**
     * 获取云发单库商品
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param page
     * @param out
     */
    @RequestMapping(value = "getGoodsList")
    public void getGoodsList(String callback, AcceptData acceptData, Long uid, Integer page, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
            return;
        }
        if (page == null)
            page = 1;
        List<UserCloudGoods> list = userCloudGoodsService.listByUid((page - 1) * Constant.PAGE_SIZE, Constant.PAGE_SIZE,
                uid);
        if (list == null)
            list = new ArrayList<>();
        JSONArray array = new JSONArray();
        JSONObject data = new JSONObject();
        if (list.size() > 0) {
            Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder())
                    .excludeFieldsWithoutExposeAnnotation().setDateFormat("yyyy-MM-dd").create();
            ConfigParamsDTO paramsDTO = orderHongBaoMoneyComputeService.getShowComputeRate(acceptData.getPlatform(),
                    acceptData.getVersion(), acceptData.getSystem());
            for (UserCloudGoods cloudGoods : list) {
                CommonGoods commonGoods = cloudGoods.getCommonGoods();
                if (commonGoods == null) {
                    continue;
                }
                // 判断是否已分享, 已分享显示已下架
                Integer state = cloudGoods.getState();
                if (state != null && state == UserCloudGoods.STATE_SHARED) {
                    Integer goodsState = commonGoods.getState();
                    if (goodsState != null && goodsState != 1) {
                        commonGoods.setState(2);
                    }
                }
                if (state != null && state == UserCloudGoods.STATE_INVALID) {
                    commonGoods.setState(1);
                }
                GoodsDetailVO detailVO = GoodsDetailVOFactory.convertCommonGoods(commonGoods, paramsDTO);
                detailVO.setId(commonGoods.getId());
                JSONObject dataObject = new JSONObject();
                dataObject.put("id", cloudGoods.getId());
                dataObject.put("goods", gson.toJson(detailVO));
                array.add(dataObject);
            }
        }
        // 第一页返回设置信息
        if (page == 1) {
            boolean custom = false;
            boolean official = false;
            UserCloudManage cloudManage = userCloudManageService.selectByPrimaryKey(uid);
            if (cloudManage != null) {
                if (cloudManage.getOfficial() != null)
                    official = cloudManage.getOfficial();
                if (cloudManage.getCustom() != null)
                    custom = cloudManage.getCustom();
            }
            data.put("custom", custom);
            data.put("official", official);
        }
        data.put("count", userCloudGoodsService.countByUid(uid));
        data.put("list", array);
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
    }
    /**
     * 删除云发单备选库
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param id
     * @param out
     */
    @RequestMapping(value = "deleteGoods")
    public void deleteGoods(String callback, AcceptData acceptData, Long uid, Long id, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("用户未登录"));
            return;
        }
        if (id == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "参数不完整"));
            return;
        }
        userCloudGoodsService.deleteByPrimaryKeyAndUid(id, uid);
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("操作成功"));
    }
    /**
     * 设置状态
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param type
     * @param out
     */
    @RequestMapping(value = "switchState")
    public void switchState(String callback, AcceptData acceptData, Long uid, Integer type, Integer state,
                            PrintWriter out) {
        if (uid == null || type == null || state == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "参数不完整"));
            return;
        }
        boolean reslut = false;
        if (state == 1) {
            reslut = true;
        }
        if (type == 1) {
            userCloudManageService.save(uid, reslut, null);
        } else {
            userCloudManageService.save(uid, null, reslut);
        }
        JSONObject data = new JSONObject();
        data.put("state", reslut);
        JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
    }
    /**
     * 云发单支付
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param type       机器人类型
     * @param response
     * @param out
     */
    @RequestMapping(value = "pay")
    public void pay(String callback, AcceptData acceptData, Long uid, String type, PrintWriter out) {
        try {
            if (uid == null) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户未登录"));
                return;
            }
            if (StringUtil.isNullOrEmpty(type)) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "请选择云发单套餐"));
                return;
            }
            CloudOrderMenuEnum typeEnum = CloudOrderMenuEnum.valueOf(type);
            if (typeEnum == null) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "套餐选择出错"));
                return;
            }
            if (typeEnum == CloudOrderMenuEnum.robotMonthVip) {
                UserVIPPreInfo vip = userVIPPreInfoService.getLatestProcessInfo(uid);
                if (vip == null || vip.getProcess() < UserVIPLevel.LEVEL_7) {
                    JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户等级不满足"));
                    return;
                }
            }
            // 创建支付信息
            String alipayForm = userCloudAlipayManager.getAlipayForm(uid, type);
            // 返回信息 - 缓存到session
            StringBuilder builder = new StringBuilder();
            builder.append("<html><head><title>alipay</title></head>");
            builder.append("<body>" + alipayForm + "</body></html>");
            // 缓存到redis- 一分钟
            String key = RedisKeyEnum.cloudAlipayLink.getKey() + uid + "_" + type;
            key = StringUtil.Md5(key);
            redisManager.cacheCommonString(key, builder.toString(), 60 * 10);
            String link = configService.getValue(ConfigKeyEnum.cloudAlipayJumpLink.getKey(), acceptData.getSystem()) + "?key=%s";
            JSONObject dataObject = new JSONObject();
            dataObject.put("link", String.format(link, key));
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(dataObject));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "创建支付信息失败"));
            LogHelper.errorDetailInfo(e);
        }
    }
    /**
     * 支付完成
     *
     * @param id
     * @param out
     */
    @RequestMapping(value = "payEnd")
    public void payEnd(String callback, AcceptData acceptData, Long uid, Long id, PrintWriter out) {
        if (uid == null || id == null) {
            out.print(JsonUtil.loadFalseResult(1, "参数信息缺失"));
            return;
        }
        try {
            // 检测是否支付完成
            userCloudAlipayManager.tradeQueryByOrderId(id);
            UserCloudOrder cloudOrder = userCloudOrderService.selectByPrimaryKey(id);
            JSONObject dataObject = new JSONObject();
            dataObject.put("money", cloudOrder.getMoney());
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(dataObject));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult(1, "回调信息失败"));
            LogHelper.errorDetailInfo(e);
        }
    }
    /**
     * 动态一键发单
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param id
     * @param out
     */
    @RequestMapping(value = "sendCircle")
    public void sendCircle(String callback, AcceptData acceptData, Long uid, String id, PrintWriter out) {
        if (uid == null || StringUtil.isNullOrEmpty(id)) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("参数不能为空"));
            return;
        }
        try {
            userCloudService.sendByDynamic(uid, id);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("一键发单成功"));
        } catch (UserCloudException e) {
            if (e.getCode() > 1000 && e.getCode() < 1100) {
                JSONObject data = new JSONObject();
                data.put("link", configService.getValue(ConfigKeyEnum.robotCloudLink.getKey(), acceptData.getSystem()));
                JsonUtil.printMode(out, callback, JsonUtil.loadTrue(e.getCode(), data, e.getMsg()).toString());
            } else {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
            }
        }
    }
    /**
     * 商品详情一键发单
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param goodsId
     * @param goodsType
     * @param out
     */
    @RequestMapping(value = "sendGoods")
    public void sendGoods(String callback, AcceptData acceptData, Long uid, String goodsId, Integer goodsType, PrintWriter out) {
        if (uid == null || goodsId == null || goodsType == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("参数不能为空"));
            return;
        }
        try {
            GoodsEvaluate evaluate = goodsEvaluateService.queryExistSingle(goodsId, goodsType, acceptData.getSystem());
            if (evaluate != null) {
                userCloudService.sendByDynamic(uid, evaluate.getId());
            } else {
                Long gid = null;
                Long sellerId = null;
                if (goodsType == Constant.SOURCE_TYPE_SUNING) { // 苏宁
                    String[] ids = SuningUtil.getGoodsIdDetail(goodsId);
                    gid = Long.parseLong(ids[1]);
                    sellerId = Long.parseLong(ids[0]);
                } else {
                    gid = Long.parseLong(goodsId);
                }
                userCloudService.sendCustomGoods(uid, gid, goodsType, sellerId);
            }
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("加入发单库成功"));
        } catch (UserCloudException e) {
            if (e.getCode() > 1000 && e.getCode() < 1100) {
                JSONObject data = new JSONObject();
                data.put("link", configService.getValue(ConfigKeyEnum.robotCloudLink.getKey(), acceptData.getSystem()));
                JsonUtil.printMode(out, callback, JsonUtil.loadTrue(e.getCode(), data, e.getMsg()).toString());
            } else {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
            }
        }
    }
}
fanli/src/main/java/com/yeshi/fanli/dao/mybatis/user/cloud/UserCloudOrderMapper.java
@@ -15,6 +15,15 @@
     * @return
     */
    UserCloudOrder selectForUpdate(long id);
    /**
     * 检索
     * @param type
     * @param uid
     * @param state
     * @return
     */
    List<UserCloudOrder> list(@Param("type") String type,@Param("uid")Long uid, @Param("state")boolean state);
    
    /**
     * 查询后一条支付完成的
fanli/src/main/java/com/yeshi/fanli/entity/bus/user/cloud/CloudOrderMenuEnum.java
@@ -3,7 +3,9 @@
import com.yeshi.fanli.util.StringUtil;
public enum CloudOrderMenuEnum {
    robotMonth(20, 4, 1, "全能机器人", "一个月");
    robotMonth(20, 4, 1, "全能机器人", "月卡"),//全价
    robotMonthHalfPrice(10, 4, 1, "全能机器人", "月卡"),//半价
    robotMonthVip(0.01, 4, 1, "全能机器人", "月卡");//会员价
    
    private double money;
    private Integer robotType;
fanli/src/main/java/com/yeshi/fanli/service/impl/user/cloud/UserCloudOrderServiceImpl.java
@@ -17,118 +17,124 @@
import com.yeshi.fanli.service.inter.msg.UserOtherMsgNotificationService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudOrderService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudService;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserCloudOrderServiceImpl implements UserCloudOrderService {
    @Resource
    private UserCloudOrderMapper userCloudOrderMapper;
    @Resource
    private UserCloudOrderMapper userCloudOrderMapper;
    @Lazy
    @Resource
    private UserCloudService userCloudService;
    @Override
    public UserCloudOrder addCloudOrder(Long uid, String type) throws UserCloudOrderException{
        if (uid == null)
            throw new UserCloudOrderException(1, "用户未登录");
        CloudOrderMenuEnum menuEnum = CloudOrderMenuEnum.getMenuEnum(type);
        if (menuEnum == null)
            throw new UserCloudOrderException(1, "请选择正确套餐");
        UserCloudOrder cloudOrder = new UserCloudOrder();
        cloudOrder.setUid(uid);
        cloudOrder.setState(false);
        cloudOrder.setType(menuEnum);
        cloudOrder.setMoney(BigDecimal.valueOf(menuEnum.getMoney()));
        cloudOrder.setCreateTime(new Date());
        cloudOrder.setUpdateTime(new Date());
        userCloudOrderMapper.insertSelective(cloudOrder);
        return cloudOrder;
    }
    @Override
    public void updateByPrimaryKeySelective(UserCloudOrder cloudOrder) {
        userCloudOrderMapper.updateByPrimaryKeySelective(cloudOrder);
    }
    @Override
    public UserCloudOrder selectByPrimaryKey(Long id) {
        return userCloudOrderMapper.selectByPrimaryKey(id);
    }
    @Override
    public void cloudPayCloudSuccess(Long orderId) throws UserCloudOrderException{
        UserCloudOrder cloudOrder = userCloudOrderMapper.selectForUpdate(orderId);
        if (cloudOrder == null)
            throw new UserCloudOrderException(1, "订单信息不存在");
        if (cloudOrder.getState())
            return; // 已支付成功更新
        UserCloudOrder updateOrder = new UserCloudOrder();
        updateOrder.setState(true);
        updateOrder.setId(cloudOrder.getId());
        updateOrder.setDesc("成功开通" + cloudOrder.getType().getDescShow());
        updateOrder.setUpdateTime(new Date());
        userCloudOrderMapper.updateByPrimaryKeySelective(updateOrder);
        // 创建开通信息
        try {
            userCloudService.openCloud(cloudOrder.getUid(), cloudOrder.getId(), cloudOrder.getType());
        } catch (Exception e) {
            LogHelper.error(e);
        }
    }
    @Override
    public UserCloudOrder getLastOrderByUnpaid(Long uid, String type) {
        return userCloudOrderMapper.getLastOrderByUnpaid(uid, type);
    }
    @Override
    public UserCloudOrder getLastOrderByPayEnd(Long uid, String type) {
        return userCloudOrderMapper.getLastOrderByPayEnd(uid, type);
    }
    @Override
    public List<UserCloudOrder> getOrderRecord(int page, int count, Long uid, Integer state) {
        return userCloudOrderMapper.getOrderRecord((page-1)* count, count, uid, state);
    }
    @Override
    public long countOrderRecord(Long uid, Integer state) {
        Long count = userCloudOrderMapper.countOrderRecord(uid, state);
        if (count == null)
            count = 0L;
        return count;
    }
    @Override
    public List<UserCloudOrder> getLasthourByUnpaid() {
        return userCloudOrderMapper.getLasthourByUnpaid();
    }
    @Override
    public List<UserCloudOrder> query(int page, int count,String key, Integer state) {
        return userCloudOrderMapper.query((page-1)* count, count, key, state);
    }
    @Override
    public long count(String key, Integer state) {
        Long count = userCloudOrderMapper.count(key, state);
        if (count == null)
            count = 0L;
        return count;
    }
    @Lazy
    @Resource
    private UserCloudService userCloudService;
    @Transactional
    @Override
    public UserCloudOrder addCloudOrder(Long uid, String type) throws UserCloudOrderException {
        if (uid == null)
            throw new UserCloudOrderException(1, "用户未登录");
        CloudOrderMenuEnum menuEnum = CloudOrderMenuEnum.getMenuEnum(type);
        if (menuEnum == null)
            throw new UserCloudOrderException(1, "请选择正确套餐");
        if (menuEnum == CloudOrderMenuEnum.robotMonthHalfPrice || menuEnum == CloudOrderMenuEnum.robotMonthVip) {
            List<UserCloudOrder> list = userCloudOrderMapper.list(menuEnum.name(), uid, true);
            if (list != null && list.size() > 0)
                throw new UserCloudOrderException(1, "只能购买一次");
        }
        UserCloudOrder cloudOrder = new UserCloudOrder();
        cloudOrder.setUid(uid);
        cloudOrder.setState(false);
        cloudOrder.setType(menuEnum);
        cloudOrder.setMoney(BigDecimal.valueOf(menuEnum.getMoney()));
        cloudOrder.setCreateTime(new Date());
        cloudOrder.setUpdateTime(new Date());
        userCloudOrderMapper.insertSelective(cloudOrder);
        return cloudOrder;
    }
    @Override
    public void updateByPrimaryKeySelective(UserCloudOrder cloudOrder) {
        userCloudOrderMapper.updateByPrimaryKeySelective(cloudOrder);
    }
    @Override
    public UserCloudOrder selectByPrimaryKey(Long id) {
        return userCloudOrderMapper.selectByPrimaryKey(id);
    }
    @Override
    public void cloudPayCloudSuccess(Long orderId) throws UserCloudOrderException {
        UserCloudOrder cloudOrder = userCloudOrderMapper.selectForUpdate(orderId);
        if (cloudOrder == null)
            throw new UserCloudOrderException(1, "订单信息不存在");
        if (cloudOrder.getState())
            return; // 已支付成功更新
        UserCloudOrder updateOrder = new UserCloudOrder();
        updateOrder.setState(true);
        updateOrder.setId(cloudOrder.getId());
        updateOrder.setDesc("成功开通" + cloudOrder.getType().getDescShow());
        updateOrder.setUpdateTime(new Date());
        userCloudOrderMapper.updateByPrimaryKeySelective(updateOrder);
        // 创建开通信息
        try {
            userCloudService.openCloud(cloudOrder.getUid(), cloudOrder.getId(), cloudOrder.getType());
        } catch (Exception e) {
            LogHelper.error(e);
        }
    }
    @Override
    public UserCloudOrder getLastOrderByUnpaid(Long uid, String type) {
        return userCloudOrderMapper.getLastOrderByUnpaid(uid, type);
    }
    @Override
    public UserCloudOrder getLastOrderByPayEnd(Long uid, String type) {
        return userCloudOrderMapper.getLastOrderByPayEnd(uid, type);
    }
    @Override
    public List<UserCloudOrder> getOrderRecord(int page, int count, Long uid, Integer state) {
        return userCloudOrderMapper.getOrderRecord((page - 1) * count, count, uid, state);
    }
    @Override
    public long countOrderRecord(Long uid, Integer state) {
        Long count = userCloudOrderMapper.countOrderRecord(uid, state);
        if (count == null)
            count = 0L;
        return count;
    }
    @Override
    public List<UserCloudOrder> getLasthourByUnpaid() {
        return userCloudOrderMapper.getLasthourByUnpaid();
    }
    @Override
    public List<UserCloudOrder> query(int page, int count, String key, Integer state) {
        return userCloudOrderMapper.query((page - 1) * count, count, key, state);
    }
    @Override
    public long count(String key, Integer state) {
        Long count = userCloudOrderMapper.count(key, state);
        if (count == null)
            count = 0L;
        return count;
    }
}
fanli/src/main/resource/mapping/user/cloud/UserCloudOrderMapper.xml
@@ -2,108 +2,140 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yeshi.fanli.dao.mybatis.user.cloud.UserCloudOrderMapper">
  <resultMap id="BaseResultMap" type="com.yeshi.fanli.entity.bus.user.cloud.UserCloudOrder">
    <id column="crd_id" property="id" jdbcType="BIGINT"/>
    <result column="crd_uid" property="uid" jdbcType="BIGINT"/>
    <result column="crd_money" property="money" jdbcType="DECIMAL"/>
    <result column="crd_state" property="state" jdbcType="BOOLEAN"/>
    <result column="crd_desc" property="desc" jdbcType="VARCHAR"/>
    <result column="crd_create_time" property="createTime" jdbcType="TIMESTAMP"/>
    <result column="crd_update_time" property="updateTime" jdbcType="TIMESTAMP"/>
    <result column="crd_type" property="type" typeHandler="com.yeshi.fanli.util.mybatishandler.CloudOrderMenuEnumHandler"/>
  </resultMap>
  <sql id="Base_Column_List">crd_id,crd_uid,crd_money,crd_type,crd_state,crd_desc,crd_create_time,crd_update_time</sql>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long">select
    <include refid="Base_Column_List"/>from yeshi_ec_user_cloud_order where crd_id = #{id,jdbcType=BIGINT}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">delete from yeshi_ec_user_cloud_order where crd_id = #{id,jdbcType=BIGINT}</delete>
  <insert id="insert" parameterType="com.yeshi.fanli.entity.bus.user.cloud.UserCloudOrder" useGeneratedKeys="true" keyProperty="id">insert into yeshi_ec_user_cloud_order (crd_id,crd_uid,crd_money,crd_type,crd_state,crd_desc,crd_create_time,crd_update_time) values (#{id,jdbcType=BIGINT},#{uid,jdbcType=BIGINT},#{money,jdbcType=DECIMAL},#{type,jdbcType=VARCHAR},#{state,jdbcType=BOOLEAN},#{desc,jdbcType=VARCHAR},#{createTime,jdbcType=TIMESTAMP},#{updateTime,jdbcType=TIMESTAMP})</insert>
  <insert id="insertSelective" parameterType="com.yeshi.fanli.entity.bus.user.cloud.UserCloudOrder" useGeneratedKeys="true" keyProperty="id">insert into yeshi_ec_user_cloud_order
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">crd_id,</if>
      <if test="uid != null">crd_uid,</if>
      <if test="money != null">crd_money,</if>
      <if test="type != null">crd_type,</if>
      <if test="state != null">crd_state,</if>
      <if test="desc != null">crd_desc,</if>
      <if test="createTime != null">crd_create_time,</if>
      <if test="updateTime != null">crd_update_time,</if>
    </trim>values
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">#{id,jdbcType=BIGINT},</if>
      <if test="uid != null">#{uid,jdbcType=BIGINT},</if>
      <if test="money != null">#{money,jdbcType=DECIMAL},</if>
      <if test="type != null">#{type,jdbcType=VARCHAR},</if>
      <if test="state != null">#{state,jdbcType=BOOLEAN},</if>
      <if test="desc != null">#{desc,jdbcType=VARCHAR},</if>
      <if test="createTime != null">#{createTime,jdbcType=TIMESTAMP},</if>
      <if test="updateTime != null">#{updateTime,jdbcType=TIMESTAMP},</if>
    </trim>
  </insert>
  <update id="updateByPrimaryKey" parameterType="com.yeshi.fanli.entity.bus.user.cloud.UserCloudOrder">update yeshi_ec_user_cloud_order set crd_uid = #{uid,jdbcType=BIGINT},crd_money = #{money,jdbcType=DECIMAL},crd_type = #{type,jdbcType=VARCHAR},crd_state = #{state,jdbcType=BOOLEAN},crd_desc = #{desc,jdbcType=VARCHAR},crd_create_time = #{createTime,jdbcType=TIMESTAMP},crd_update_time = #{updateTime,jdbcType=TIMESTAMP} where crd_id = #{id,jdbcType=BIGINT}</update>
  <update id="updateByPrimaryKeySelective" parameterType="com.yeshi.fanli.entity.bus.user.cloud.UserCloudOrder">update yeshi_ec_user_cloud_order
    <set>
      <if test="uid != null">crd_uid=#{uid,jdbcType=BIGINT},</if>
      <if test="money != null">crd_money=#{money,jdbcType=DECIMAL},</if>
      <if test="type != null">crd_type=#{type,jdbcType=VARCHAR},</if>
      <if test="state != null">crd_state=#{state,jdbcType=BOOLEAN},</if>
      <if test="desc != null">crd_desc=#{desc,jdbcType=VARCHAR},</if>
      <if test="createTime != null">crd_create_time=#{createTime,jdbcType=TIMESTAMP},</if>
      <if test="updateTime != null">crd_update_time=#{updateTime,jdbcType=TIMESTAMP},</if>
    </set> where crd_id = #{id,jdbcType=BIGINT}
  </update>
  <select id="selectForUpdate" resultMap="BaseResultMap" parameterType="java.lang.Long">
    <resultMap id="BaseResultMap" type="com.yeshi.fanli.entity.bus.user.cloud.UserCloudOrder">
        <id column="crd_id" property="id" jdbcType="BIGINT"/>
        <result column="crd_uid" property="uid" jdbcType="BIGINT"/>
        <result column="crd_money" property="money" jdbcType="DECIMAL"/>
        <result column="crd_state" property="state" jdbcType="BOOLEAN"/>
        <result column="crd_desc" property="desc" jdbcType="VARCHAR"/>
        <result column="crd_create_time" property="createTime" jdbcType="TIMESTAMP"/>
        <result column="crd_update_time" property="updateTime" jdbcType="TIMESTAMP"/>
        <result column="crd_type" property="type"
                typeHandler="com.yeshi.fanli.util.mybatishandler.CloudOrderMenuEnumHandler"/>
    </resultMap>
    <sql id="Base_Column_List">crd_id,crd_uid,crd_money,crd_type,crd_state,crd_desc,crd_create_time,crd_update_time</sql>
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long">select
        <include refid="Base_Column_List"/>from yeshi_ec_user_cloud_order where crd_id = #{id,jdbcType=BIGINT}
    </select>
    <delete id="deleteByPrimaryKey"
            parameterType="java.lang.Long">delete from yeshi_ec_user_cloud_order where crd_id = #{id,jdbcType=BIGINT}</delete>
    <insert id="insert" parameterType="com.yeshi.fanli.entity.bus.user.cloud.UserCloudOrder" useGeneratedKeys="true"
            keyProperty="id">insert into yeshi_ec_user_cloud_order (crd_id,crd_uid,crd_money,crd_type,crd_state,crd_desc,crd_create_time,crd_update_time) values (#{id,jdbcType=BIGINT},#{uid,jdbcType=BIGINT},#{money,jdbcType=DECIMAL},#{type,jdbcType=VARCHAR},#{state,jdbcType=BOOLEAN},#{desc,jdbcType=VARCHAR},#{createTime,jdbcType=TIMESTAMP},#{updateTime,jdbcType=TIMESTAMP})</insert>
    <insert id="insertSelective" parameterType="com.yeshi.fanli.entity.bus.user.cloud.UserCloudOrder"
            useGeneratedKeys="true" keyProperty="id">insert into yeshi_ec_user_cloud_order
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="id != null">crd_id,</if>
            <if test="uid != null">crd_uid,</if>
            <if test="money != null">crd_money,</if>
            <if test="type != null">crd_type,</if>
            <if test="state != null">crd_state,</if>
            <if test="desc != null">crd_desc,</if>
            <if test="createTime != null">crd_create_time,</if>
            <if test="updateTime != null">crd_update_time,</if>
        </trim>
        values
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="id != null">#{id,jdbcType=BIGINT},</if>
            <if test="uid != null">#{uid,jdbcType=BIGINT},</if>
            <if test="money != null">#{money,jdbcType=DECIMAL},</if>
            <if test="type != null">#{type,jdbcType=VARCHAR},</if>
            <if test="state != null">#{state,jdbcType=BOOLEAN},</if>
            <if test="desc != null">#{desc,jdbcType=VARCHAR},</if>
            <if test="createTime != null">#{createTime,jdbcType=TIMESTAMP},</if>
            <if test="updateTime != null">#{updateTime,jdbcType=TIMESTAMP},</if>
        </trim>
    </insert>
    <update id="updateByPrimaryKey"
            parameterType="com.yeshi.fanli.entity.bus.user.cloud.UserCloudOrder">update yeshi_ec_user_cloud_order set crd_uid = #{uid,jdbcType=BIGINT},crd_money = #{money,jdbcType=DECIMAL},crd_type = #{type,jdbcType=VARCHAR},crd_state = #{state,jdbcType=BOOLEAN},crd_desc = #{desc,jdbcType=VARCHAR},crd_create_time = #{createTime,jdbcType=TIMESTAMP},crd_update_time = #{updateTime,jdbcType=TIMESTAMP} where crd_id = #{id,jdbcType=BIGINT}</update>
    <update id="updateByPrimaryKeySelective" parameterType="com.yeshi.fanli.entity.bus.user.cloud.UserCloudOrder">update
        yeshi_ec_user_cloud_order
        <set>
            <if test="uid != null">crd_uid=#{uid,jdbcType=BIGINT},</if>
            <if test="money != null">crd_money=#{money,jdbcType=DECIMAL},</if>
            <if test="type != null">crd_type=#{type,jdbcType=VARCHAR},</if>
            <if test="state != null">crd_state=#{state,jdbcType=BOOLEAN},</if>
            <if test="desc != null">crd_desc=#{desc,jdbcType=VARCHAR},</if>
            <if test="createTime != null">crd_create_time=#{createTime,jdbcType=TIMESTAMP},</if>
            <if test="updateTime != null">crd_update_time=#{updateTime,jdbcType=TIMESTAMP},</if>
        </set>
        where crd_id = #{id,jdbcType=BIGINT}
    </update>
    <select id="selectForUpdate" resultMap="BaseResultMap" parameterType="java.lang.Long">
       SELECT * from yeshi_ec_user_cloud_order where crd_id = #{id,jdbcType=BIGINT} FOR UPDATE
  </select>
  <select id="getLastOrderByPayEnd" resultMap="BaseResultMap">
    <select id="list" resultMap="BaseResultMap">
        SELECT * from yeshi_ec_user_cloud_order where 1=1
        <if test="type!=null">
            and crd_type=#{type}
        </if>
        <if test="uid!=null">
            and crd_uid=#{uid}
        </if>
        <if test="state!=null">
            and crd_state=#{state}
        </if>
    </select>
    <select id="getLastOrderByPayEnd" resultMap="BaseResultMap">
      SELECT * FROM yeshi_ec_user_cloud_order d
    WHERE d.`crd_uid` = #{uid}  AND d.`crd_type` = #{type} AND crd_state = 1
    ORDER BY d.`crd_id` DESC
    LIMIT 1
  </select>
  <select id="getLastOrderByUnpaid" resultMap="BaseResultMap">
      SELECT <include refid="Base_Column_List"/> FROM yeshi_ec_user_cloud_order d
    WHERE d.`crd_uid` = #{uid}  AND d.`crd_type` = #{type} AND crd_state = 0
    ORDER BY d.`crd_id` DESC
    LIMIT 1
  </select>
  <select id="getOrderRecord" resultMap="BaseResultMap">
      SELECT * FROM yeshi_ec_user_cloud_order d
    WHERE d.`crd_uid` = #{uid} <if test="state != null">and d.crd_state = #{state}</if>
    ORDER BY d.`crd_id` DESC
    LIMIT #{start},#{count}
  </select>
  <select id="countOrderRecord" resultType="Long">
      SELECT count(d.`crd_id`) FROM yeshi_ec_user_cloud_order d
    WHERE d.`crd_uid` = #{uid} <if test="state != null">and d.crd_state = #{state}</if>
  </select>
  <select id="getLasthourByUnpaid" resultMap="BaseResultMap">
    <select id="getLastOrderByUnpaid" resultMap="BaseResultMap">
        SELECT
        <include refid="Base_Column_List"/>
        FROM yeshi_ec_user_cloud_order d
        WHERE d.`crd_uid` = #{uid} AND d.`crd_type` = #{type} AND crd_state = 0
        ORDER BY d.`crd_id` DESC
        LIMIT 1
    </select>
    <select id="getOrderRecord" resultMap="BaseResultMap">
        SELECT * FROM yeshi_ec_user_cloud_order d
        WHERE d.`crd_uid` = #{uid}
        <if test="state != null">and d.crd_state = #{state}</if>
        ORDER BY d.`crd_id` DESC
        LIMIT #{start},#{count}
    </select>
    <select id="countOrderRecord" resultType="Long">
        SELECT count(d.`crd_id`) FROM yeshi_ec_user_cloud_order d
        WHERE d.`crd_uid` = #{uid}
        <if test="state != null">and d.crd_state = #{state}</if>
    </select>
    <select id="getLasthourByUnpaid" resultMap="BaseResultMap">
      SELECT * FROM yeshi_ec_user_cloud_order
    WHERE crd_state = 0 AND crd_update_time > DATE_SUB(NOW(),INTERVAL 2 HOUR)
  </select>
  <select id="query" resultMap="BaseResultMap">
      SELECT * FROM yeshi_ec_user_cloud_order d
    WHERE 1=1
     <if test="key != null  and key !=''"> AND d.`crd_uid` LIKE '%#{key}%' </if>
     <if test="state != null">AND d.crd_state = #{state}</if>
    ORDER BY d.`crd_id` DESC
    LIMIT #{start},#{count}
  </select>
  <select id="count" resultType="Long">
      SELECT count(d.`crd_id`) FROM yeshi_ec_user_cloud_order d
    WHERE 1=1
        <if test="key != null and key !='' "> AND d.`crd_uid` LIKE '%#{key}%' </if>
        <if test="state != null">AND d.crd_state = #{state}</if>
  </select>
    <select id="query" resultMap="BaseResultMap">
        SELECT * FROM yeshi_ec_user_cloud_order d
        WHERE 1=1
        <if test="key != null  and key !=''">AND d.`crd_uid` LIKE '%#{key}%'</if>
        <if test="state != null">AND d.crd_state = #{state}</if>
        ORDER BY d.`crd_id` DESC
        LIMIT #{start},#{count}
    </select>
    <select id="count" resultType="Long">
        SELECT count(d.`crd_id`) FROM yeshi_ec_user_cloud_order d
        WHERE 1=1
        <if test="key != null and key !='' ">AND d.`crd_uid` LIKE '%#{key}%'</if>
        <if test="state != null">AND d.crd_state = #{state}</if>
    </select>
</mapper>