admin
2024-01-23 81da61b828e29b7745e1382dfbbaeb685dc083ef
fanli/src/main/java/com/yeshi/fanli/controller/client/v2/UserCloudControllerV2.java
@@ -1,862 +1,860 @@
package com.yeshi.fanli.controller.client.v2;
import java.io.PrintWriter;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
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;
import org.yeshi.utils.JsonUtil;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.yeshi.fanli.dto.ConfigParamsDTO;
import com.yeshi.fanli.dto.aitaoker.QrcodeLoginDTO;
import com.yeshi.fanli.entity.accept.AcceptData;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.bus.user.cloud.CloudOrderMenuEnum;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloud;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudGoods;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudGroup;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudManage;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudOrder;
import com.yeshi.fanli.entity.dynamic.GoodsEvaluate;
import com.yeshi.fanli.entity.goods.CommonGoods;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
import com.yeshi.fanli.exception.user.cloud.UserCloudException;
import com.yeshi.fanli.exception.user.cloud.UserCloudGroupException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.dynamic.GoodsEvaluateService;
import com.yeshi.fanli.service.inter.homemodule.SwiperPictureService;
import com.yeshi.fanli.service.inter.order.OrderHongBaoMoneyComputeService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudGoodsService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudGroupService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudManageService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudOrderService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudService;
import com.yeshi.fanli.service.manger.alipay.UserCloudAlipayManager;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.RedisKeyEnum;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import org.yeshi.utils.TimeUtil;
import com.yeshi.fanli.util.aitaoker.AitaokerApiUtil;
import com.yeshi.fanli.util.annotation.RequestSerializableByKey;
import com.yeshi.fanli.util.factory.goods.GoodsDetailVOFactory;
import com.yeshi.fanli.util.suning.SuningUtil;
import com.yeshi.fanli.vo.goods.GoodsDetailVO;
import com.yeshi.fanli.vo.homemodule.BannerVO;
import com.yeshi.fanli.vo.user.cloud.CloudOrderMenuVO;
import com.yeshi.fanli.vo.user.cloud.UserCloudInfoVO;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@Controller
@RequestMapping("api/v2/user/cloud")
public class UserCloudControllerV2 {
    @Resource
    private UserCloudService userCloudService;
    @Resource
    private UserCloudOrderService userCloudOrderService;
    @Resource
    private UserCloudGroupService userCloudGroupService;
    @Resource
    private UserCloudGoodsService userCloudGoodsService;
    @Resource
    private UserInfoService userInfoService;
    @Resource
    private OrderHongBaoMoneyComputeService orderHongBaoMoneyComputeService;
    @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 UserVIPPreInfoService userVIPPreInfoService;
    /**
     * 查询开通记录
     *
     * @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;
        }
        if (page == null)
            page = 1;
        // 查询成功记录
        int state = 1;
        List<UserCloudOrder> list = userCloudOrderService.getOrderRecord(page, Constant.PAGE_SIZE, uid, state);
        if (list == null)
            list = new ArrayList<>();
        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));
                }
            }
        });
        long count = userCloudOrderService.countOrderRecord(uid, state);
        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
     */
    @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;
        }
        UserInfo userInfo = userInfoService.getUserByIdWithMybatis(uid);
        if (userInfo == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户信息不存在"));
            return;
        }
        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);
                    }
                }
                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);
                            }
                        }
                    }
                    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)));
    }
    /**
     * 获取登录二维码
     *
     * @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;
        }
        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()));
            }
        }
    }
}
package com.yeshi.fanli.controller.client.v2;
import java.io.PrintWriter;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
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.UserVIPPreInfoService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.yeshi.utils.DateUtil;
import org.yeshi.utils.JsonUtil;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.yeshi.fanli.dto.GoodsMoneyConfigParamsDTO;
import com.yeshi.fanli.dto.aitaoker.QrcodeLoginDTO;
import com.yeshi.fanli.entity.accept.AcceptData;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.bus.user.cloud.CloudOrderMenuEnum;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloud;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudGoods;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudGroup;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudManage;
import com.yeshi.fanli.entity.bus.user.cloud.UserCloudOrder;
import com.yeshi.fanli.entity.dynamic.GoodsEvaluate;
import com.yeshi.fanli.entity.goods.CommonGoods;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
import com.yeshi.fanli.exception.user.cloud.UserCloudException;
import com.yeshi.fanli.exception.user.cloud.UserCloudGroupException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.dynamic.GoodsEvaluateService;
import com.yeshi.fanli.service.inter.homemodule.SwiperPictureService;
import com.yeshi.fanli.service.inter.order.OrderHongBaoMoneyComputeService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudGoodsService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudGroupService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudManageService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudOrderService;
import com.yeshi.fanli.service.inter.user.cloud.UserCloudService;
import com.yeshi.fanli.service.manger.alipay.UserCloudAlipayManager;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.RedisKeyEnum;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import org.yeshi.utils.TimeUtil;
import com.yeshi.fanli.util.aitaoker.AitaokerApiUtil;
import com.yeshi.fanli.util.annotation.RequestSerializableByKey;
import com.yeshi.fanli.util.factory.goods.GoodsDetailVOFactory;
import com.yeshi.fanli.util.suning.SuningUtil;
import com.yeshi.fanli.vo.goods.GoodsDetailVO;
import com.yeshi.fanli.vo.homemodule.BannerVO;
import com.yeshi.fanli.vo.user.cloud.CloudOrderMenuVO;
import com.yeshi.fanli.vo.user.cloud.UserCloudInfoVO;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@Controller
@RequestMapping("api/v2/user/cloud")
public class UserCloudControllerV2 {
    @Resource
    private UserCloudService userCloudService;
    @Resource
    private UserCloudOrderService userCloudOrderService;
    @Resource
    private UserCloudGroupService userCloudGroupService;
    @Resource
    private UserCloudGoodsService userCloudGoodsService;
    @Resource
    private UserInfoService userInfoService;
    @Resource
    private OrderHongBaoMoneyComputeService orderHongBaoMoneyComputeService;
    @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 UserVIPPreInfoService userVIPPreInfoService;
    /**
     * 查询开通记录
     *
     * @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;
        }
        if (page == null)
            page = 1;
        // 查询成功记录
        int state = 1;
        List<UserCloudOrder> list = userCloudOrderService.getOrderRecord(page, Constant.PAGE_SIZE, uid, state);
        if (list == null)
            list = new ArrayList<>();
        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));
                }
            }
        });
        long count = userCloudOrderService.countOrderRecord(uid, state);
        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
     */
    @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;
        }
        UserInfo userInfo = userInfoService.getUserByIdWithMybatis(uid);
        if (userInfo == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(1, "用户信息不存在"));
            return;
        }
        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);
                    }
                }
                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);
                            }
                        }
                    }
                    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)));
    }
    /**
     * 获取登录二维码
     *
     * @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;
        }
        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 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();
            GoodsMoneyConfigParamsDTO 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 {
                String gid = null;
                Long sellerId = null;
                if (goodsType == Constant.SOURCE_TYPE_SUNING) { // 苏宁
                    String[] ids = SuningUtil.getGoodsIdDetail(goodsId);
                    gid = ids[1];
                    sellerId = Long.parseLong(ids[0]);
                } else {
                    gid = 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()));
            }
        }
    }
}