puzhibing
2024-02-02 e14a6debcb17348164f703fcb2a7b9b1c3608352
提交版本
6个文件已删除
78个文件已修改
26个文件已添加
20087 ■■■■■ 已修改文件
meiya-admin/meiya-admin.iml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/sql/clear_data1221.sql 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/sql/meiyadb-20240201.sql 8418 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/sql/meiyadb.sql 8416 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/core/aop/LogAop.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/core/shiro/ShiroDbRealm.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/core/shiro/ShiroKit.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/core/shiro/ShiroUser.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/core/shiro/check/PermissionCheckFactory.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/core/shiro/check/PermissionCheckManager.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/core/shiro/factory/ShiroFactroy.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/controller/CommissionSettlementController.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/controller/MallGoodsController.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/controller/MallGoodsGroupController.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/controller/MallGroupSpecController.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/controller/MallOrderController.java 110 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/dao/CommissionSettlementMonthMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/dao/MallOrderDetailGroupSpecMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/dao/mapping/CommissionSettlementMonthMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/dao/mapping/MallGroupSpecMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/dao/mapping/MallOrderDetailGroupSpecMapper.xml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/dao/mapping/MallOrderMapper.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/dto/OrderSearchDto.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/model/MallGroupSpec.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/model/MallOrder.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/model/MallOrderDetailGroupSpec.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/model/vo/VoUseOrderDetailGroupSpec.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/service/ICommissionSettlementMonthService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/service/IMallOrderDetailGroupSpecService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/service/impl/CommissionSettlementMonthServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/service/impl/MallGoodsServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/mall/service/impl/MallOrderDetailGroupSpecServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/member/controller/MemUserController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/member/controller/MemUserSalesController.java 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/member/dao/mapping/MemUserRelationMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/member/model/MemUserRelation.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/system/controller/MyCouponController.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/system/controller/UserMgrController.java 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/system/dao/mapping/MemUserDeleteMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/system/dao/mapping/RoleMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/system/model/Role.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/system/model/User.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/java/com/sinata/modular/system/service/impl/TCityRegionServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/webapp/WEB-INF/view/common/tags/avatars.tag 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/webapp/WEB-INF/view/mall/mallGroupSpec/mallGroupSpec_add.html 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/webapp/WEB-INF/view/mall/mallGroupSpec/mallGroupSpec_edit.html 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/webapp/WEB-INF/view/mall/mallOrder/mallOrder.html 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/webapp/WEB-INF/view/mall/mallOrder/mallOrder_detail.html 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/webapp/WEB-INF/view/mall/mallOrder/mallOrder_detail_group.html 271 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/webapp/WEB-INF/view/member/memUserSales/edit_city_code.html 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/webapp/WEB-INF/view/member/memUserSales/memUserSales.html 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/webapp/WEB-INF/view/member/memUserSales/memUserSales_detail.html 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/webapp/WEB-INF/view/system/areaCity/areaCity_edit.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/webapp/WEB-INF/view/system/user/user_add.html 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/webapp/WEB-INF/view/system/user/user_edit.html 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/webapp/static/modular/mall/mallGoodsGroup/mallGoodsGroup_info.js 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/webapp/static/modular/mall/mallGroupSpec/mallGroupSpec_info.js 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/webapp/static/modular/mall/mallOrder/mallOrder.js 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/webapp/static/modular/member/memUserSales/memUserSales.js 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/webapp/static/modular/system/user/user.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/src/main/webapp/static/modular/system/user/user_info.js 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-common/meiya-common.iml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-common/src/main/java/com/sinata/common/enums/EnumCityRole.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-common/src/main/java/com/sinata/common/enums/EnumMemberGrade.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-common/src/main/java/com/sinata/common/enums/EnumRedisKey.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-common/src/main/java/com/sinata/common/model/GroupSpecGoodsSkuJsonVo.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-core/meiya-core.iml 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-generator/meiya-generator.iml 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/meiya-rest.iml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/auth/filter/RequestParameterFilter.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/controller/MallGoodsController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/controller/MallOrderController.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/controller/vo/VoGoodsSku.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/controller/vo/VoGroupSpecGoods.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/controller/vo/VoMallOrderDetail.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/controller/vo/VoMallOrderDetailGroupSpecGoods.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/dao/MallOrderDetailGroupSpecLogMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/dao/MallOrderDetailGroupSpecMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/dao/MallOrderMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/dao/mapping/MallCommissionSettlementMonthMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/dao/mapping/MallGoodsMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/dao/mapping/MallGroupSpecMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/dao/mapping/MallOrderDetailGroupSpecLogMapper.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/dao/mapping/MallOrderDetailGroupSpecMapper.xml 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/dao/mapping/MallOrderMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/job/CityCodeWork.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/job/CommissionSettlementMonthWork.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/model/MallGroupSpec.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/model/MallOrderDetailGroupSpec.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/model/MallOrderDetailGroupSpecLog.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/IMallCommissionSettlementMonthService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/IMallOrderDetailGroupSpecLogService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/IMallOrderDetailGroupSpecService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/IMallOrderService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/impl/MallCommissionSettlementMonthServiceImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/impl/MallCommissionSettlementServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/impl/MallOrderDetailGroupSpecLogServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/impl/MallOrderDetailGroupSpecServiceImpl.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/impl/MallOrderServiceImpl.java 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/member/controller/UserController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/member/controller/common/body/BodyMallOrderDetailUse.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/member/controller/common/body/BodyUser.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/member/dao/mapping/MemMerchantMapper.xml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/member/service/impl/MemUserServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/main/java/com/sinata/rest/modular/member/shop/ShopController.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-rest/src/test/java/com/sinata/generator/EntityGeneratorGoku.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-shop/meiya-shop.iml 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-shop/src/main/webapp/WEB-INF/view/mall/mallOrder/mallOrder.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-shop/src/main/webapp/WEB-INF/view/mall/mallOrder/mallOrder_detail.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-shop/src/main/webapp/static/modular/mall/mallOrder/mallOrder.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
meiya-admin/meiya-admin.iml
File was deleted
meiya-admin/sql/clear_data1221.sql
New file
@@ -0,0 +1,70 @@
delete from mall_app_version;
delete from mall_classify_one;
delete from mall_classify_two;
delete from mall_commission_settlement;
delete from mall_commission_settlement_month;
-- delete from mall_express_company;
delete from mall_goods;
delete from mall_goods_cart;
delete from mall_goods_detail;
delete from mall_goods_set;
delete from mall_goods_sku;
delete from mall_goods_spec;
delete from mall_goods_spec_value;
delete from mall_group_spec;
delete from mall_order;
delete from mall_order_detail;
delete from mall_order_detail_group_spec;
delete from mall_order_detail_group_spec_log;
delete from mall_order_detail_use;
delete from mall_order_main;
delete from mall_tag;
delete from mall_user_address;
delete from mall_user_collect;
delete from mall_user_evaluation;
delete from mall_user_report;
delete from mall_vip_equity;
-- delete from mem_member_grade;
-- delete from mem_member_grade_rule;
delete from mem_merchant;
delete from mem_merchant_bank;
delete from mem_uese_sales;
delete from mem_user where id != 1;
delete from mem_user_bank_detail where user_id != 1;
delete from mem_user_delete;
delete from mem_user_login;
delete from mem_user_relation where id != 1;
delete from merchant_notice;
-- delete from merchant_sys_menu;
-- delete from merchant_sys_relation;
-- delete from merchant_sys_role;
-- delete from merchant_sys_user;
delete from my_coupon;
delete from my_coupon_product;
delete from my_doctor;
delete from my_store_service;
delete from my_user_coupon;
delete from my_user_coupon_order;
delete from my_user_substance_coupon;
delete from sys_area_city;
-- delete from sys_dept;
-- delete from sys_dict;
delete from sys_expense;
delete from sys_login_log;
delete from sys_notice;
delete from sys_operation_log;
-- delete from sys_menu;
-- delete from sys_relation;
-- delete from sys_role;
-- delete from sys_user;
delete from system_notice;
-- delete from t_app_set;
delete from t_banner;
-- delete from t_city_region;
delete from t_feedback;
delete from t_notice;
delete from t_notice_message;
-- delete from t_remote_set;
delete from t_sms_record;
-- delete from t_system_set;
delete from t_system_set_audit;
meiya-admin/sql/meiyadb-20240201.sql
New file
Diff too large
meiya-admin/sql/meiyadb.sql
New file
Diff too large
meiya-admin/src/main/java/com/sinata/core/aop/LogAop.java
@@ -1,14 +1,13 @@
package com.sinata.core.aop;
import cn.hutool.json.JSONUtil;
import com.sinata.core.common.annotion.BussinessLog;
import com.sinata.core.common.constant.dictmap.base.AbstractDictMap;
import com.sinata.core.log.LogManager;
import com.sinata.core.log.LogObjectHolder;
import com.sinata.core.log.factory.LogTaskFactory;
import com.sinata.core.shiro.ShiroKit;
import com.sinata.core.shiro.ShiroUser;
import com.sinata.core.support.HttpKit;
import com.sinata.core.util.Contrast;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
@@ -86,16 +85,20 @@
            sb.append(" & ");
        }
        //如果涉及到修改,比对变化
        // 如果涉及到修改,比对变化
        String msg;
        if (bussinessName.indexOf("修改") != -1 || bussinessName.indexOf("编辑") != -1) {
            Object obj1 = LogObjectHolder.me().get();
            Map<String, String> obj2 = HttpKit.getRequestParameters();
            msg = Contrast.contrastObj(dictClass, key, obj1, obj2);
            //msg = Contrast.contrastObj(dictClass, key, obj1, obj2);
            msg = key + "=" + obj2.get(key)
                    + ";" + JSONUtil.toJsonStr(obj1)
                    + ";" + JSONUtil.toJsonStr(obj2);
        } else {
            Map<String, String> parameters = HttpKit.getRequestParameters();
            AbstractDictMap dictMap = (AbstractDictMap) dictClass.newInstance();
            msg = Contrast.parseMutiKey(dictMap, key, parameters);
            //AbstractDictMap dictMap = (AbstractDictMap) dictClass.newInstance();
            //msg = Contrast.parseMutiKey(dictMap, key, parameters);
            msg = JSONUtil.toJsonStr(parameters);
        }
        LogManager.me().executeLog(LogTaskFactory.bussinessLog(user.getId(), bussinessName, className, methodName, msg, HttpKit.getIp()));
meiya-admin/src/main/java/com/sinata/core/shiro/ShiroDbRealm.java
@@ -1,7 +1,5 @@
package com.sinata.core.shiro;
import com.sinata.core.shiro.ShiroKit;
import com.sinata.core.shiro.ShiroUser;
import com.sinata.core.shiro.factory.IShiro;
import com.sinata.core.shiro.factory.ShiroFactroy;
import com.sinata.core.util.ToolUtil;
meiya-admin/src/main/java/com/sinata/core/shiro/ShiroKit.java
@@ -17,7 +17,6 @@
import com.sinata.core.common.constant.Const;
import com.sinata.core.common.constant.factory.ConstantFactory;
import com.sinata.core.shiro.ShiroUser;
import com.sinata.core.util.ToolUtil;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.crypto.hash.Md5Hash;
meiya-admin/src/main/java/com/sinata/core/shiro/ShiroUser.java
@@ -1,5 +1,7 @@
package com.sinata.core.shiro;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@@ -9,6 +11,7 @@
 * @author fengshuonan
 * @date 2016年12月5日 上午10:26:43
 */
@Data
public class ShiroUser implements Serializable {
    private static final long serialVersionUID = 1L;
@@ -18,64 +21,8 @@
    public String name;         // 姓名
    public Integer deptId;      // 部门id
    public List<Integer> roleList; // 角色集
    public String cityCode; // 角色集
    public String deptName;        // 部门名称
    public List<String> roleNames; // 角色名称集
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getAccount() {
        return account;
    }
    public void setAccount(String account) {
        this.account = account;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getDeptId() {
        return deptId;
    }
    public void setDeptId(Integer deptId) {
        this.deptId = deptId;
    }
    public List<Integer> getRoleList() {
        return roleList;
    }
    public void setRoleList(List<Integer> roleList) {
        this.roleList = roleList;
    }
    public String getDeptName() {
        return deptName;
    }
    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }
    public List<String> getRoleNames() {
        return roleNames;
    }
    public void setRoleNames(List<String> roleNames) {
        this.roleNames = roleNames;
    }
}
meiya-admin/src/main/java/com/sinata/core/shiro/check/PermissionCheckFactory.java
@@ -18,7 +18,6 @@
import com.sinata.core.listener.ConfigListener;
import com.sinata.core.shiro.ShiroKit;
import com.sinata.core.shiro.ShiroUser;
import com.sinata.core.shiro.check.ICheck;
import com.sinata.core.support.CollectionKit;
import com.sinata.core.support.HttpKit;
import com.sinata.core.util.SpringContextHolder;
meiya-admin/src/main/java/com/sinata/core/shiro/check/PermissionCheckManager.java
@@ -15,7 +15,6 @@
 */
package com.sinata.core.shiro.check;
import com.sinata.core.shiro.check.ICheck;
import com.sinata.core.util.SpringContextHolder;
/**
meiya-admin/src/main/java/com/sinata/core/shiro/factory/ShiroFactroy.java
@@ -3,7 +3,6 @@
import com.sinata.core.common.constant.factory.ConstantFactory;
import com.sinata.core.common.constant.state.ManagerStatus;
import com.sinata.core.shiro.ShiroUser;
import com.sinata.core.shiro.factory.IShiro;
import com.sinata.core.util.Convert;
import com.sinata.core.util.SpringContextHolder;
import com.sinata.modular.system.dao.MenuMapper;
@@ -14,11 +13,11 @@
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@@ -27,10 +26,10 @@
@Transactional(readOnly = true)
public class ShiroFactroy implements com.sinata.core.shiro.factory.IShiro {
    @Autowired
    @Resource
    private UserMapper userMapper;
    @Autowired
    @Resource
    private MenuMapper menuMapper;
    public static com.sinata.core.shiro.factory.IShiro me() {
@@ -71,6 +70,7 @@
            roleNameList.add(ConstantFactory.me().getSingleRoleName(roleId));
        }
        shiroUser.setRoleList(roleList);
        shiroUser.setCityCode(user.getProvinceCode());
        shiroUser.setRoleNames(roleNameList);
        return shiroUser;
meiya-admin/src/main/java/com/sinata/modular/mall/controller/CommissionSettlementController.java
@@ -5,12 +5,15 @@
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.sinata.common.enums.EnumCityRole;
import com.sinata.core.base.controller.BaseController;
import com.sinata.core.base.tips.ErrorTip;
import com.sinata.core.base.tips.SuccessTip;
import com.sinata.core.common.annotion.BussinessLog;
import com.sinata.core.common.annotion.Permission;
import com.sinata.core.common.constant.factory.PageFactory;
import com.sinata.core.shiro.ShiroKit;
import com.sinata.core.shiro.ShiroUser;
import com.sinata.core.util.DateUtils2;
import com.sinata.core.util.ExcelExportUtil;
import com.sinata.core.util.ExcelImportUtil;
@@ -77,9 +80,25 @@
        if (StrUtil.isNotBlank(endTime)) {
            endTime = endTime.replace("-", "");
        }
        String cityCode = "";
        try {
            // 【城市管理员】数据查询
            ShiroUser shiroUser = ShiroKit.getUser();
            if (shiroUser.getRoleList().contains(EnumCityRole.PROVINCE_ROLE.index)) {
                // 省级城市管理员
                cityCode = shiroUser.getCityCode().substring(0, 2);
            } else if (shiroUser.getRoleList().contains(EnumCityRole.CITY_ROLE.index)) {
                // 市级城市管理员
                cityCode = shiroUser.getCityCode().substring(0, 4);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 查询数据列表
        page.setTotal(commissionSettlementMonthService.queryListCount(beginTime, endTime, condition, condition1, condition2, condition3, null));
        List<CommissionSettlementMonth> list = commissionSettlementMonthService.queryList(beginTime, endTime, condition, condition1, condition2, condition3, null, page.getCurrent(), page.getSize());
        page.setTotal(commissionSettlementMonthService.queryListCount(beginTime, endTime, condition, condition1, condition2, cityCode, condition3, null));
        List<CommissionSettlementMonth> list = commissionSettlementMonthService.queryList(beginTime, endTime, condition, condition1, condition2, cityCode, condition3, null, page.getCurrent(), page.getSize());
        page.setRecords(list);
        return super.packForBT(page);
    }
@@ -87,7 +106,7 @@
    @Permission
    @ResponseBody
    @RequestMapping(value = "/export")
    public void exportOrder(String beginTime, String endTime, String condition, String condition1, String condition2, Integer condition3, HttpServletResponse response) throws IOException {
    public void exportOrder(String beginTime, String endTime, String condition, String condition1, String condition2, String cityCode, Integer condition3, HttpServletResponse response) throws IOException {
        // 时间搜索
        if (StrUtil.isNotBlank(beginTime)) {
            beginTime = beginTime.replace("-", "");
@@ -96,7 +115,7 @@
            endTime = endTime.replace("-", "");
        }
        // 查询数据列表
        List<CommissionSettlementMonth> list = commissionSettlementMonthService.queryList(beginTime, endTime, condition, condition1, condition2, condition3, null, null, null);
        List<CommissionSettlementMonth> list = commissionSettlementMonthService.queryList(beginTime, endTime, condition, condition1, condition2, cityCode, condition3, null, null, null);
        List<List<Object>> dataList = new ArrayList<>();
        List<Object> titles = CollUtil.newArrayList(
meiya-admin/src/main/java/com/sinata/modular/mall/controller/MallGoodsController.java
@@ -1,5 +1,6 @@
package com.sinata.modular.mall.controller;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
@@ -10,6 +11,7 @@
import com.sinata.common.enums.EnumIsDelete;
import com.sinata.common.enums.mall.EnumMallGoodsGroupType;
import com.sinata.common.enums.mall.EnumMallGoodsState;
import com.sinata.common.model.GroupSpecGoodsSkuJsonVo;
import com.sinata.core.base.controller.BaseController;
import com.sinata.core.base.tips.ErrorTip;
import com.sinata.core.common.annotion.BussinessLog;
@@ -47,6 +49,9 @@
    @Autowired
    private IMallGoodsService mallGoodsService;
    @Autowired
    private IMallGroupSpecService groupSpecService;
    @Autowired
    private IMallGoodsSkuService mallGoodsSkuService;
@@ -527,4 +532,55 @@
                        .in("id", ids.split(","))
        );
    }
    @ResponseBody
    @BussinessLog(value = "获取商品列表")
    @GetMapping(value = "/goodsByGoodsSpecId")
    public List<Map<String, Object>> goodsByIdsList(String goodsIds, Integer groupSpecId, String oldGoodsSkuJson) {
        List<MallGoods> goodsList = mallGoodsService.selectList(
                new EntityWrapper<MallGoods>()
                        .eq("group_type", EnumMallGoodsGroupType.GOODS.index)
                        .in("id", goodsIds.split(","))
        );
        List<Map<String, Object>> list;
        if (groupSpecId != null) {
            String goodsSkuJson = oldGoodsSkuJson;
            if (StrUtil.isBlank(goodsSkuJson) || goodsSkuJson.equals("[]")) {
                // 查询套餐规格组信息
                MallGroupSpec groupSpec = groupSpecService.selectById(groupSpecId);
                goodsSkuJson = groupSpec.getGoodsSkuJson();
            }
            // 格式化套餐规格组数据
            List<GroupSpecGoodsSkuJsonVo> groupSpecGoodsSkuJsonVoList;
            if (StrUtil.isBlank(goodsSkuJson) || goodsSkuJson.equals("[]")) {
                groupSpecGoodsSkuJsonVoList = null;
            } else {
                groupSpecGoodsSkuJsonVoList = JSONUtil.parseArray(goodsSkuJson).toList(GroupSpecGoodsSkuJsonVo.class);
            }
            list = goodsList.stream().map(o -> {
                Map<String, Object> map = BeanUtil.beanToMap(o);
                Integer goodsNum = 1;
                if (groupSpecGoodsSkuJsonVoList != null) {
                    // 匹配商品数量
                    for (GroupSpecGoodsSkuJsonVo groupSpecGoodsSkuJsonVo : groupSpecGoodsSkuJsonVoList) {
                        if (o.getId().equals(groupSpecGoodsSkuJsonVo.getGoodsId())) {
                            goodsNum = groupSpecGoodsSkuJsonVo.getGoodsNum();
                        }
                    }
                }
                map.put("goodsNum", goodsNum);
                return map;
            }).collect(Collectors.toList());
        } else {
            list = goodsList.stream().map(o -> {
                Map<String, Object> map = BeanUtil.beanToMap(o);
                map.put("goodsNum", 1);
                return map;
            }).collect(Collectors.toList());
        }
        return list;
    }
}
meiya-admin/src/main/java/com/sinata/modular/mall/controller/MallGoodsGroupController.java
@@ -1,6 +1,7 @@
package com.sinata.modular.mall.controller;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
@@ -9,6 +10,7 @@
import com.sinata.common.enums.EnumIsDelete;
import com.sinata.common.enums.mall.EnumMallGoodsGroupType;
import com.sinata.common.enums.mall.EnumMallGoodsState;
import com.sinata.common.model.GroupSpecGoodsSkuJsonVo;
import com.sinata.core.base.controller.BaseController;
import com.sinata.core.base.tips.ErrorTip;
import com.sinata.core.common.annotion.BussinessLog;
@@ -536,27 +538,52 @@
        );
        return list.stream().map(o -> {
            String[] goodsIds = o.getGoodsIds().split(",");
//            String[] goodsIds = o.getGoodsIds().split(",");
//            List<MallGoods> mallGoodsList = goodsList.stream()
//                    .filter(ggg -> {
//                        for (String gid : goodsIds) {
//                            if (gid.equals(ggg.getId() + "")) {
//                                return true;
//                            }
//                        }
//                        return false;
//                    }).collect(Collectors.toList());
//
//            o.setGoodsNames(
//                    mallGoodsList.stream()
//                            .map(MallGoods::getGoodsName)
//                            .collect(Collectors.joining(","))
//            );
            // 封装显示套餐规格组商品名称、数量
            List<GroupSpecGoodsSkuJsonVo> groupSpecGoodsSkuJsonVoList;
            String goodsSkuJson = o.getGoodsSkuJson();
            if (ObjUtil.isNotEmpty(goodsSkuJson)) {
                groupSpecGoodsSkuJsonVoList = JSONUtil.parseArray(goodsSkuJson).toList(GroupSpecGoodsSkuJsonVo.class);
            } else {
                groupSpecGoodsSkuJsonVoList = null;
            }
            List<MallGoods> mallGoodsList = goodsList.stream()
                    .filter(ggg -> {
                        for (String gid : goodsIds) {
                            if (gid.equals(ggg.getId() + "")) {
                                return true;
                        if (groupSpecGoodsSkuJsonVoList != null) {
                            for (GroupSpecGoodsSkuJsonVo groupSpecGoodsSkuJsonVo : groupSpecGoodsSkuJsonVoList) {
                                if (groupSpecGoodsSkuJsonVo.getGoodsId().equals(ggg.getId())) {
                                    ggg.setStock(groupSpecGoodsSkuJsonVo.getGoodsNum());
                                    return true;
                                }
                            }
                        }
                        return false;
                    }).collect(Collectors.toList());
            o.setGoodsNames(
                    mallGoodsList.stream()
                            .map(MallGoods::getGoodsName)
                            .map(ggg -> ggg.getGoodsName() + "x" + ggg.getStock())
                            .collect(Collectors.joining(","))
            );
            o.setTotalPrice(
                    mallGoodsList.stream()
                            .map(MallGoods::getPrice)
                            .map(ggg -> ggg.getPrice().multiply(BigDecimal.valueOf(ggg.getStock())))
                            .reduce(BigDecimal.ZERO, BigDecimal::add)
            );
meiya-admin/src/main/java/com/sinata/modular/mall/controller/MallGroupSpecController.java
@@ -1,11 +1,14 @@
package com.sinata.modular.mall.controller;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.sinata.common.enums.EnumIsDelete;
import com.sinata.common.enums.mall.EnumMallGoodsGroupType;
import com.sinata.common.enums.mall.EnumMallGoodsState;
import com.sinata.common.model.GroupSpecGoodsSkuJsonVo;
import com.sinata.core.base.controller.BaseController;
import com.sinata.core.base.tips.ErrorTip;
import com.sinata.core.common.annotion.BussinessLog;
@@ -157,17 +160,40 @@
                    .orElse(null)
            );
            String[] ids = (o.get("goodsIds") + "").split(",");
//            String[] ids = (o.get("goodsIds") + "").split(",");
//            o.put("goodsNames", goodsList.stream()
//                    .filter(ggg -> {
//                        for (String gid : ids) {
//                            if (gid.equals(ggg.getId() + "")) {
//                                return true;
//                            }
//                        }
//                        return false;
//                    })
//                    .map(MallGoods::getGoodsName)
//                    .collect(Collectors.joining(",")));
            // 封装显示套餐规格组商品名称、数量
            List<GroupSpecGoodsSkuJsonVo> groupSpecGoodsSkuJsonVoList;
            Object goodsSkuJson = o.get("goodsSkuJson");
            if (ObjUtil.isNotEmpty(goodsSkuJson)) {
                groupSpecGoodsSkuJsonVoList = JSONUtil.parseArray(goodsSkuJson.toString()).toList(GroupSpecGoodsSkuJsonVo.class);
            } else {
                groupSpecGoodsSkuJsonVoList = null;
            }
            o.put("goodsNames", goodsList.stream()
                    .filter(ggg -> {
                        for (String gid : ids) {
                            if (gid.equals(ggg.getId() + "")) {
                                return true;
                        if (groupSpecGoodsSkuJsonVoList != null) {
                            for (GroupSpecGoodsSkuJsonVo groupSpecGoodsSkuJsonVo : groupSpecGoodsSkuJsonVoList) {
                                if (groupSpecGoodsSkuJsonVo.getGoodsId().equals(ggg.getId())) {
                                    ggg.setStock(groupSpecGoodsSkuJsonVo.getGoodsNum());
                                    return true;
                                }
                            }
                        }
                        return false;
                    })
                    .map(MallGoods::getGoodsName)
                    .map(ggg -> ggg.getGoodsName() + "x" + ggg.getStock())
                    .collect(Collectors.joining(",")));
            return o;
        }).collect(Collectors.toList());
meiya-admin/src/main/java/com/sinata/modular/mall/controller/MallOrderController.java
@@ -3,30 +3,35 @@
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.enums.SqlLike;
import com.baomidou.mybatisplus.mapper.Condition;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.google.common.collect.Lists;
import com.sinata.common.enums.EnumCityRole;
import com.sinata.common.enums.EnumMemberGrade;
import com.sinata.common.enums.mall.EnumMallGoodsGroupType;
import com.sinata.common.enums.mall.EnumMallOrderState;
import com.sinata.core.base.controller.BaseController;
import com.sinata.core.common.annotion.BussinessLog;
import com.sinata.core.common.annotion.Permission;
import com.sinata.core.common.constant.factory.PageFactory;
import com.sinata.core.shiro.ShiroKit;
import com.sinata.core.shiro.ShiroUser;
import com.sinata.core.util.DateUtils2;
import com.sinata.core.util.ExcelExportUtil;
import com.sinata.core.util.ExpressApi;
import com.sinata.core.util.PayUtil;
import com.sinata.modular.mall.dto.OrderSearchDto;
import com.sinata.modular.mall.model.MallGoods;
import com.sinata.modular.mall.model.MallGoodsSet;
import com.sinata.modular.mall.model.MallOrder;
import com.sinata.modular.mall.model.MallOrderDetail;
import com.sinata.modular.mall.model.*;
import com.sinata.modular.mall.service.*;
import com.sinata.modular.member.model.MemUser;
import com.sinata.modular.member.model.MemUserRelation;
import com.sinata.modular.member.service.IMemUserRelationService;
import com.sinata.modular.member.service.IMemUserService;
import com.sinata.modular.system.service.IMallOrderDetailUseService;
import com.sinata.modular.system.service.IMyCouponService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@@ -61,13 +66,13 @@
    private IMemUserService memUserService;
    @Resource
    private IMemUserRelationService userRelationService;
    @Resource
    private IMyCouponService myCouponService;
    @Autowired
    private IMallOrderService mallOrderService;
    @Resource
    private IMallOrderDetailUseService useService;
    @Resource
    private IMallGoodsSetService mallGoodsSetService;
@@ -80,6 +85,9 @@
    @Resource
    private IMallExpressCompanyService mallExpressCompanyService;
    @Resource
    private IMallOrderDetailGroupSpecService mallOrderDetailGroupSpecService;
    private MallOrder selectById(String orderNo) {
@@ -113,7 +121,7 @@
    }
    /**
     * 订单发货页面
     * 退款页面
     */
    @RequestMapping(value = "/deliverAuth/{orderNo}")
    public String deliverAuth(@PathVariable String orderNo, Model model) {
@@ -206,8 +214,8 @@
    /**
     * 跳转商品订单详情
     */
    @RequestMapping(value = "/detail/{orderNo}")
    public Object detail(@PathVariable("orderNo") String orderNo, Model model) {
    @RequestMapping(value = "/detail")
    public Object detail(String orderNo, Integer orderType, Model model) {
        Page<MallOrder> page = new PageFactory().defaultPage(1, 0);
        Wrapper<?> wrapper = new EntityWrapper<MallOrder>()
@@ -216,9 +224,17 @@
        // 订单详情
        List<MallOrderDetail> orderDetailList = this.mallOrderDetailService.selectList(new EntityWrapper<MallOrderDetail>().eq("order_no", orderNo));
        // 订单详情-商品信息
        List<Integer> goodsIdList = orderDetailList.stream().map(MallOrderDetail::getGoodsId).collect(Collectors.toList());
        // 订单详情套餐规格组商品
        List<MallOrderDetailGroupSpec> mallOrderDetailGroupSpecList = mallOrderDetailGroupSpecService.selectList(new EntityWrapper<MallOrderDetailGroupSpec>().eq("order_no", mallOrder.getOrderNo()));
        if (CollUtil.isNotEmpty(mallOrderDetailGroupSpecList)) {
            List<Integer> mallOrderDetailGroupSpecGroupSpecGoodsIds = mallOrderDetailGroupSpecList.stream().map(MallOrderDetailGroupSpec::getGroupSpecGoodsId).collect(Collectors.toList());
            goodsIdList.addAll(mallOrderDetailGroupSpecGroupSpecGoodsIds);
        }
        List<MallGoods> goodsList = mallGoodsService.selectList(new EntityWrapper<MallGoods>().in("id", goodsIdList));
        // 封装商品信息
@@ -241,8 +257,11 @@
            mallOrder.setUserPhone(memUser.getPhone());
            mallOrder.setUserNickname(memUser.getNickName());
        }
        mallOrder.setUseList(useService.getUseList(mallOrder.getOrderNo()));
        //mallOrder.setUseList(useService.getUseList(mallOrder.getOrderNo()));
        mallOrder.setUseOrderDetailGroupSpecList(mallOrderDetailGroupSpecService.getUseOrderDetailGroupSpec(mallOrder.getOrderNo()));
        model.addAttribute("item", mallOrder);
        String v4ShowId = "", v4Team = "", v5ShowId = "", v5Team = "";
        // 计算订单业绩
        BigDecimal saleGoodsMoney = BigDecimal.ZERO;
@@ -259,13 +278,55 @@
                if (saleUser.getMemberGradeId() == EnumMemberGrade.G_5.index) {
                    saleGoodsMoney = mallOrder.getPayMoney().multiply(goodsSet.getV5BuyCoef());
                }
                // 获取合伙人、市场总监
                MemUserRelation saleUserRelation = userRelationService.selectById(mallOrder.getSaleUserId());
                Integer saleUserMemberGradeId = saleUser.getMemberGradeId();
                MemUser[] parentV4V5User = userRelationService.getParentV4V5ByRelationPath(null, null, saleUserRelation.getRelationPath(), saleUserMemberGradeId);
                if (parentV4V5User[0] != null) {
                    v4ShowId = parentV4V5User[0].getShowId();
                    v4Team = parentV4V5User[0].getRealName();
                }
                if (parentV4V5User[1] != null) {
                    v5ShowId = parentV4V5User[1].getShowId();
                    v5Team = parentV4V5User[1].getRealName();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        model.addAttribute("v4ShowId", v4ShowId);
        model.addAttribute("v4Team", v4Team);
        model.addAttribute("v5ShowId", v5ShowId);
        model.addAttribute("v5Team", v5Team);
        model.addAttribute("saleGoodsMoney", saleGoodsMoney.setScale(2, BigDecimal.ROUND_HALF_UP));
        return PREFIX + "mallOrder_detail.html";
        model.addAttribute("orderType", orderType);
        if (orderType == null || orderType == EnumMallGoodsGroupType.GOODS.index) {
            // 普通商品
            return PREFIX + "mallOrder_detail.html";
        } else {
            model.addAttribute("mallOrderDetailGroupSpecList", mallOrderDetailGroupSpecList.stream()
                            .map(o -> {
                                JSONObject json = JSONUtil.parseObj(o);
                                for (MallGoods g : goodsList) {
                                    if (g.getId().equals(o.getGroupSpecGoodsId())) {
                                        json.set("groupSpecGoodsName", g.getGoodsName());
                                        json.set("groupSpecGoodsNo", g.getGoodsNo());
                                        json.set("groupSpecGoodsImage", g.getGoodsImage());
                                    }
                                }
                                return json;
                            })
                    .collect(Collectors.toList()));
            // 套餐商品
            return PREFIX + "mallOrder_detail_group.html";
        }
    }
    /**
@@ -310,7 +371,22 @@
                .eq(StrUtil.isNotBlank(dto.getUserShowId()), "u.show_id", dto.getUserShowId())
                .eq(StrUtil.isNotBlank(dto.getUserPhone()), "u.phone", dto.getUserPhone())
                //.like(StrUtil.isNotBlank(dto.getUserNickname()), "user.nick_name", dto.getUserNickname());
                .like(StrUtil.isNotBlank(dto.getUserNickname()), "o.take_name", dto.getUserNickname());
                .like(StrUtil.isNotBlank(dto.getUserNickname()), "o.take_name", dto.getUserNickname())
                .like(StrUtil.isNotBlank(dto.getGoodsName()), "order_goods.goods_name", dto.getGoodsName());
        try {
            // 【城市管理员】数据查询
            ShiroUser shiroUser = ShiroKit.getUser();
            if (shiroUser.getRoleList().contains(EnumCityRole.PROVINCE_ROLE.index)) {
                // 省级城市管理员
                wrapper.like("o.city_code", shiroUser.getCityCode().substring(0, 2), SqlLike.RIGHT);
            } else if (shiroUser.getRoleList().contains(EnumCityRole.CITY_ROLE.index)) {
                // 市级城市管理员
                wrapper.like("o.city_code", shiroUser.getCityCode().substring(0, 4), SqlLike.RIGHT);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (null != dto.getState()) {
            if (dto.getState().equals(1)) {
@@ -341,7 +417,7 @@
                "商品名称",
                "规格组",
                "购买数量",
                "下单用户昵称",
                "客户姓名",
                "下单用户手机",
                "预约门店",
                "核销次数",
@@ -404,7 +480,7 @@
    /**
     * 退款
     * 退款操作
     */
    @ResponseBody
    @RequestMapping(value = "/orderShip")
meiya-admin/src/main/java/com/sinata/modular/mall/dao/CommissionSettlementMonthMapper.java
@@ -16,7 +16,7 @@
 * @since 2023-04-22
 */
public interface CommissionSettlementMonthMapper extends BaseMapper<CommissionSettlementMonth> {
    List<CommissionSettlementMonth> queryList(@Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("name") String name, @Param("showId") String showId, @Param("area") String area, @Param("gradeId") Integer gradeId, @Param("month") String month, @Param("offset") Integer offset, @Param("size") Integer size);
    Integer queryListCount(@Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("name") String name, @Param("showId") String showId, @Param("area") String area, @Param("gradeId") Integer gradeId, @Param("month") String month);
    List<CommissionSettlementMonth> queryList(@Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("name") String name, @Param("showId") String showId, @Param("area") String area, @Param("cityCode") String cityCode, @Param("gradeId") Integer gradeId, @Param("month") String month, @Param("offset") Integer offset, @Param("size") Integer size);
    Integer queryListCount(@Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("name") String name, @Param("showId") String showId, @Param("area") String area, @Param("cityCode") String cityCode, @Param("gradeId") Integer gradeId, @Param("month") String month);
    void addList(@Param("addMonthList") List<CommissionSettlementMonth> addMonthList);
}
meiya-admin/src/main/java/com/sinata/modular/mall/dao/MallOrderDetailGroupSpecMapper.java
New file
@@ -0,0 +1,22 @@
package com.sinata.modular.mall.dao;
import com.sinata.modular.mall.model.MallOrderDetailGroupSpec;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.sinata.modular.mall.model.vo.VoUseOrderDetailGroupSpec;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
 * 订单详情套餐规格组商品 Mapper 接口
 * </p>
 *
 * @author goku
 * @since 2023-11-21
 */
public interface MallOrderDetailGroupSpecMapper extends BaseMapper<MallOrderDetailGroupSpec> {
    List<VoUseOrderDetailGroupSpec> getUseOrderDetailGroupSpec(@Param("orderNo") String orderNo);
}
meiya-admin/src/main/java/com/sinata/modular/mall/dao/mapping/CommissionSettlementMonthMapper.xml
@@ -54,6 +54,12 @@
                county.`name` like CONCAT("%",#{area},"%")
                )
            </if>
            <if test="cityCode != null and cityCode !=''">
                and (
                    cm.cityCode like CONCAT(#{cityCode},"%")
                    OR cm.countyCode like CONCAT(#{cityCode},"%")
                )
            </if>
            <if test="gradeId != null">
                and mu.member_grade_id = #{gradeId}
            </if>
meiya-admin/src/main/java/com/sinata/modular/mall/dao/mapping/MallGroupSpecMapper.xml
@@ -7,6 +7,7 @@
        <id column="id" property="id"/>
        <result column="spec_name" property="specName"/>
        <result column="goods_ids" property="goodsIds"/>
        <result column="goods_sku_json" property="goodsSkuJson"/>
        <result column="goods_names" property="goodsNames"/>
        <result column="classify_id_one" property="classifyIdOne"/>
        <result column="classify_id_two" property="classifyIdTwo"/>
@@ -24,7 +25,7 @@
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, spec_name, goods_ids, goods_names, classify_id_one, classify_id_two, start_time, end_time, stock, area_city_id, remark, create_time, is_lock, is_delete, province_code, province_name
        id, spec_name, goods_ids, goods_sku_json, goods_names, classify_id_one, classify_id_two, start_time, end_time, stock, area_city_id, remark, create_time, is_lock, is_delete, province_code, province_name
    </sql>
</mapper>
meiya-admin/src/main/java/com/sinata/modular/mall/dao/mapping/MallOrderDetailGroupSpecMapper.xml
New file
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sinata.modular.mall.dao.MallOrderDetailGroupSpecMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.sinata.modular.mall.model.MallOrderDetailGroupSpec">
        <id column="id" property="id" />
        <result column="order_no" property="orderNo" />
        <result column="order_detail_no" property="orderDetailNo" />
        <result column="goods_id" property="goodsId" />
        <result column="sku_id" property="skuId" />
        <result column="sku_num" property="skuNum" />
        <result column="group_spec_id" property="groupSpecId" />
        <result column="group_spec_goods_id" property="groupSpecGoodsId" />
        <result column="group_spec_goods_num" property="groupSpecGoodsNum" />
        <result column="group_spec_use" property="groupSpecUse" />
        <result column="is_use" property="isUse" />
        <result column="use_date_time" property="useDateTime" />
        <result column="use_merchant_id" property="useMerchantId" />
    </resultMap>
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, order_no, order_detail_no, goods_id, sku_id, sku_num, group_spec_id, group_spec_goods_id, group_spec_goods_num, group_spec_use, is_use, use_date_time, use_merchant_id
    </sql>
    <select id="getUseOrderDetailGroupSpec" resultType="com.sinata.modular.mall.model.vo.VoUseOrderDetailGroupSpec">
        SELECT
            o.*,
            m.linkman, m.merchant_name,
            g.goods_no, g.goods_name
        FROM
            mall_order_detail_group_spec_log o
            LEFT JOIN mem_merchant m ON m.id = o.use_merchant_id
            LEFT JOIN mall_goods g ON g.id = o.group_spec_goods_id
        <where>
            <if test="orderNo != null and orderNo != ''">
                AND o.order_no = #{orderNo}
            </if>
        </where>
    </select>
</mapper>
meiya-admin/src/main/java/com/sinata/modular/mall/dao/mapping/MallOrderMapper.xml
@@ -44,6 +44,7 @@
        <result column="useNum" property="useNum"/>
        <result column="refund_price" property="refundPrice"/>
        <result column="refund_time" property="refundTime"/>
        <result column="sale_nick_name" property="saleNickName"/>
        <result column="sale_user_name" property="saleUserName"/>
        <result column="sale_show_id" property="saleShowId"/>
    </resultMap>
@@ -63,7 +64,8 @@
        order_goods.goods_name as goods_name,
        order_goods.grep_name as grep_name,
        mm.merchant_name,
        user2.nick_name as sale_user_name,
        user2.nick_name as sale_nick_name,
        user2.real_name as sale_user_name,
        user2.show_id as sale_show_id,
        (select count(1) from mall_order_detail_use where order_no = o.order_no) useNum
        FROM mall_order o
meiya-admin/src/main/java/com/sinata/modular/mall/dto/OrderSearchDto.java
@@ -46,4 +46,9 @@
     * 下单用户昵称
     */
    private String userNickname;
    /**
     * 商品名称
     */
    private String goodsName;
}
meiya-admin/src/main/java/com/sinata/modular/mall/model/MallGroupSpec.java
@@ -46,6 +46,9 @@
    @TableField("goods_ids")
    @ApiModelProperty(value = "商品ID串")
    private String goodsIds;
    @TableField("goods_sku_json")
    @ApiModelProperty(value = "商品规格json")
    private String goodsSkuJson;
    /**
     * 商品名串
     */
meiya-admin/src/main/java/com/sinata/modular/mall/model/MallOrder.java
@@ -6,6 +6,7 @@
import com.baomidou.mybatisplus.annotations.TableLogic;
import com.baomidou.mybatisplus.annotations.TableName;
import com.sinata.common.enums.mall.EnumMallOrderState;
import com.sinata.modular.mall.model.vo.VoUseOrderDetailGroupSpec;
import com.sinata.modular.system.model.MallOrderDetailUse;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -268,16 +269,21 @@
    private String stateName;
    @TableField(exist = false)
    private String saleNickName;
    @TableField(exist = false)
    private String saleUserName;
    @TableField(exist = false)
    private String saleShowId;
    @TableField(exist = false)
    @ApiModelProperty(value = "核销记录")
    private List<MallOrderDetailUse> useList;
    @TableField(exist = false)
    @ApiModelProperty(value = "核销商品列表")
    private List<VoUseOrderDetailGroupSpec> useOrderDetailGroupSpecList;
    public String getStateName() {
        return EnumMallOrderState.getMarkByIndex(state);
meiya-admin/src/main/java/com/sinata/modular/mall/model/MallOrderDetailGroupSpec.java
New file
@@ -0,0 +1,113 @@
package com.sinata.modular.mall.model;
import com.baomidou.mybatisplus.enums.IdType;
import java.util.Date;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
import lombok.Data;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
 * <p>
 * 订单详情套餐规格组商品
 * </p>
 *
 * @author goku
 * @since 2023-11-21
 */
@Data
@TableName("mall_order_detail_group_spec")
@ApiModel(value = "订单详情套餐规格组商品")
public class MallOrderDetailGroupSpec extends Model<MallOrderDetailGroupSpec> {
    private static final long serialVersionUID = 1L;
    /**
     * ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    @ApiModelProperty(value = "ID")
    private Integer id;
    /**
     * 子订单编号
     */
    @TableField("order_no")
    @ApiModelProperty(value = "子订单编号")
    private String orderNo;
    /**
     * 订单详细编号
     */
    @TableField("order_detail_no")
    @ApiModelProperty(value = "订单详细编号")
    private String orderDetailNo;
    /**
     * 商品ID
     */
    @TableField("goods_id")
    @ApiModelProperty(value = "商品ID")
    private Integer goodsId;
    /**
     * 商品SkuId
     */
    @TableField("sku_id")
    @ApiModelProperty(value = "商品SkuId")
    private Integer skuId;
    /**
     * 商品Sku数量
     */
    @TableField("sku_num")
    @ApiModelProperty(value = "商品Sku数量")
    private Integer skuNum;
    /**
     * 套餐规格组ID
     */
    @TableField("group_spec_id")
    @ApiModelProperty(value = "套餐规格组ID")
    private Integer groupSpecId;
    /**
     * 套餐规格组商品ID
     */
    @TableField("group_spec_goods_id")
    @ApiModelProperty(value = "套餐规格组商品ID")
    private Integer groupSpecGoodsId;
    /**
     * 套餐规格组商品数量
     */
    @TableField("group_spec_goods_num")
    @ApiModelProperty(value = "套餐规格组商品数量")
    private Integer groupSpecGoodsNum;
    /**
     * 套餐规格组商品核销数
     */
    @TableField("group_spec_use")
    @ApiModelProperty(value = "套餐规格组商品核销数")
    private Integer groupSpecUse;
    /**
     * 是否核销完成,0否,1核销完成
     */
    @TableField("is_use")
    @ApiModelProperty(value = "是否核销完成,0否,1核销完成")
    private Integer isUse;
    /**
     * 核销时间
     */
    @TableField("use_date_time")
    @ApiModelProperty(value = "核销时间")
    private Date useDateTime;
    /**
     * 核销门店
     */
    @TableField("use_merchant_id")
    @ApiModelProperty(value = "核销门店")
    private Integer useMerchantId;
    @Override
    protected Serializable pkVal() {
        return this.id;
    }
}
meiya-admin/src/main/java/com/sinata/modular/mall/model/vo/VoUseOrderDetailGroupSpec.java
New file
@@ -0,0 +1,35 @@
package com.sinata.modular.mall.model.vo;
import com.sinata.modular.mall.model.MallOrderDetailGroupSpec;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * <p>
 * 订单详情套餐规格组商品
 * </p>
 *
 * @author goku
 * @since 2023-11-21
 */
@Data
@ApiModel(value = "订单详情套餐规格组商品")
public class VoUseOrderDetailGroupSpec extends MallOrderDetailGroupSpec {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "门店名称")
    private String merchantName;
    @ApiModelProperty(value = "核销人")
    private String linkman;
    @ApiModelProperty(value = "商品编号")
    private String goodsNo;
    @ApiModelProperty(value = "商品名称")
    private String goodsName;
}
meiya-admin/src/main/java/com/sinata/modular/mall/service/ICommissionSettlementMonthService.java
@@ -16,8 +16,8 @@
 */
public interface ICommissionSettlementMonthService extends IService<CommissionSettlementMonth> {
    List<CommissionSettlementMonth> queryList(String beginTime, String endTime, String name, String showId, String area, Integer gradeId, String month, Integer pageNo, Integer pageSize);
    Integer queryListCount(String beginTime, String endTime, String name, String showId, String area, Integer gradeId, String month);
    List<CommissionSettlementMonth> queryList(String beginTime, String endTime, String name, String showId, String area, String cityCode, Integer gradeId, String month, Integer pageNo, Integer pageSize);
    Integer queryListCount(String beginTime, String endTime, String name, String showId, String area, String cityCode, Integer gradeId, String month);
    void addList(List<CommissionSettlementMonth> addMonthList);
meiya-admin/src/main/java/com/sinata/modular/mall/service/IMallOrderDetailGroupSpecService.java
New file
@@ -0,0 +1,21 @@
package com.sinata.modular.mall.service;
import com.sinata.modular.mall.model.MallOrderDetailGroupSpec;
import com.baomidou.mybatisplus.service.IService;
import com.sinata.modular.mall.model.vo.VoUseOrderDetailGroupSpec;
import java.util.List;
/**
 * <p>
 * 订单详情套餐规格组商品 服务类
 * </p>
 *
 * @author goku
 * @since 2023-11-21
 */
public interface IMallOrderDetailGroupSpecService extends IService<MallOrderDetailGroupSpec> {
    List<VoUseOrderDetailGroupSpec> getUseOrderDetailGroupSpec(String orderNo);
}
meiya-admin/src/main/java/com/sinata/modular/mall/service/impl/CommissionSettlementMonthServiceImpl.java
@@ -20,16 +20,16 @@
public class CommissionSettlementMonthServiceImpl extends ServiceImpl<CommissionSettlementMonthMapper, CommissionSettlementMonth> implements ICommissionSettlementMonthService {
    @Override
    public List<CommissionSettlementMonth> queryList(String beginTime, String endTime, String name, String showId, String area, Integer gradeId, String month, Integer pageNo, Integer pageSize) {
    public List<CommissionSettlementMonth> queryList(String beginTime, String endTime, String name, String showId, String area, String cityCode, Integer gradeId, String month, Integer pageNo, Integer pageSize) {
        Integer offset = null;
        if (pageNo != null && pageSize != null) {
            offset = (pageNo - 1 ) * pageSize;
        }
        return baseMapper.queryList(beginTime, endTime, name, showId, area, gradeId, month, offset, pageSize);
        return baseMapper.queryList(beginTime, endTime, name, showId, area, cityCode, gradeId, month, offset, pageSize);
    }
    @Override
    public Integer queryListCount(String beginTime, String endTime, String name, String showId, String area, Integer gradeId, String month) {
        return baseMapper.queryListCount(beginTime, endTime, name, showId, area, gradeId, month);
    public Integer queryListCount(String beginTime, String endTime, String name, String showId, String area, String cityCode, Integer gradeId, String month) {
        return baseMapper.queryListCount(beginTime, endTime, name, showId, area, cityCode, gradeId, month);
    }
    @Override
meiya-admin/src/main/java/com/sinata/modular/mall/service/impl/MallGoodsServiceImpl.java
@@ -163,13 +163,16 @@
    public void addSystemNotice(MallGoods oldGoods, MallGoods newGoods) {
        try {
            StringBuffer updateStr = new StringBuffer();
            if (oldGoods.getPrice().compareTo(newGoods.getPrice()) != 0) {
            if (oldGoods.getPrice() != null && newGoods.getPrice() != null &&
                    oldGoods.getPrice().compareTo(newGoods.getPrice()) != 0) {
                updateStr.append("将市场价" + oldGoods.getPrice() + "元修改为" + newGoods.getPrice() + "元。");
            }
            if (oldGoods.getPriceSale().compareTo(newGoods.getPriceSale()) != 0) {
            if (oldGoods.getPriceSale() != null && newGoods.getPriceSale() != null &&
                    oldGoods.getPriceSale().compareTo(newGoods.getPriceSale()) != 0) {
                updateStr.append("将美天销售价" + oldGoods.getPriceSale() + "元修改为" + newGoods.getPriceSale() + "元。");
            }
            if (oldGoods.getPriceMember().compareTo(newGoods.getPriceMember()) != 0) {
            if (oldGoods.getPriceMember() != null && newGoods.getPriceMember() != null &&
                    oldGoods.getPriceMember().compareTo(newGoods.getPriceMember()) != 0) {
                updateStr.append("将会员价" + oldGoods.getPriceMember() + "元修改为" + newGoods.getPriceMember() + "元。");
            }
meiya-admin/src/main/java/com/sinata/modular/mall/service/impl/MallOrderDetailGroupSpecServiceImpl.java
New file
@@ -0,0 +1,29 @@
package com.sinata.modular.mall.service.impl;
import com.sinata.modular.mall.model.MallOrderDetailGroupSpec;
import com.sinata.modular.mall.dao.MallOrderDetailGroupSpecMapper;
import com.sinata.modular.mall.service.IMallOrderDetailGroupSpecService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import com.sinata.modular.mall.model.vo.VoUseOrderDetailGroupSpec;
import java.util.List;
/**
 * <p>
 * 订单详情套餐规格组商品 服务实现类
 * </p>
 *
 * @author goku
 * @since 2023-11-21
 */
@Service
public class MallOrderDetailGroupSpecServiceImpl extends ServiceImpl<MallOrderDetailGroupSpecMapper, MallOrderDetailGroupSpec> implements IMallOrderDetailGroupSpecService {
    @Override
    public List<VoUseOrderDetailGroupSpec> getUseOrderDetailGroupSpec(String orderNo) {
        return this.baseMapper.getUseOrderDetailGroupSpec(orderNo);
    }
}
meiya-admin/src/main/java/com/sinata/modular/member/controller/MemUserController.java
@@ -1,14 +1,19 @@
package com.sinata.modular.member.controller;
import com.baomidou.mybatisplus.enums.SqlLike;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.sinata.common.enums.EnumCityRole;
import com.sinata.common.enums.EnumIsDelete;
import com.sinata.common.enums.EnumIsLock;
import com.sinata.common.enums.EnumMemberGrade;
import com.sinata.core.base.controller.BaseController;
import com.sinata.core.common.annotion.BussinessLog;
import com.sinata.core.common.annotion.Permission;
import com.sinata.core.common.constant.factory.PageFactory;
import com.sinata.core.shiro.ShiroKit;
import com.sinata.core.shiro.ShiroUser;
import com.sinata.core.util.Convert;
import com.sinata.core.util.DateUtils2;
import com.sinata.core.util.ExcelExportUtil;
@@ -92,6 +97,20 @@
            wrapper.le("o.create_time", endTime + " 23:59:59");
        }
        try {
            // 【城市管理员】数据查询
            ShiroUser shiroUser = ShiroKit.getUser();
            if (shiroUser.getRoleList().contains(EnumCityRole.PROVINCE_ROLE.index)) {
                // 省级城市管理员
                wrapper.like("o.city_code", shiroUser.getCityCode().substring(0, 2), SqlLike.RIGHT);
            } else if (shiroUser.getRoleList().contains(EnumCityRole.CITY_ROLE.index)) {
                // 市级城市管理员
                wrapper.like("o.city_code", shiroUser.getCityCode().substring(0, 4), SqlLike.RIGHT);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 查询数据列表
        List<Map<String, Object>> list;
        if (page != null) {
@@ -161,6 +180,7 @@
        }
    }
    @Permission
    @BussinessLog(value = "用户管理-冻结/解冻")
    @ResponseBody
    @RequestMapping(value = "/updateState")
meiya-admin/src/main/java/com/sinata/modular/member/controller/MemUserSalesController.java
@@ -4,20 +4,21 @@
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.enums.SqlLike;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.sinata.common.enums.EnumAuditState;
import com.sinata.common.enums.EnumIsDelete;
import com.sinata.common.enums.EnumIsSystemNotice;
import com.sinata.common.enums.EnumMemberGrade;
import com.sinata.common.enums.*;
import com.sinata.common.enums.mall.EnumMallGoodsGroupType;
import com.sinata.common.enums.mall.EnumMallOrderState;
import com.sinata.core.base.controller.BaseController;
import com.sinata.core.base.tips.ErrorTip;
import com.sinata.core.base.tips.SuccessTip;
import com.sinata.core.common.annotion.BussinessLog;
import com.sinata.core.common.annotion.Permission;
import com.sinata.core.common.constant.factory.PageFactory;
import com.sinata.core.shiro.ShiroKit;
import com.sinata.core.shiro.ShiroUser;
import com.sinata.core.util.Convert;
import com.sinata.core.util.ExcelExportUtil;
import com.sinata.core.util.SqlUtil;
@@ -128,6 +129,20 @@
            wrapper.le("apply_time", endTime + " 23:59:59");
        }
        try {
            // 【城市管理员】数据查询
            ShiroUser shiroUser = ShiroKit.getUser();
            if (shiroUser.getRoleList().contains(EnumCityRole.PROVINCE_ROLE.index)) {
                // 省级城市管理员
                wrapper.like("o.city_code", shiroUser.getCityCode().substring(0, 2), SqlLike.RIGHT);
            } else if (shiroUser.getRoleList().contains(EnumCityRole.CITY_ROLE.index)) {
                // 市级城市管理员
                wrapper.like("o.city_code", shiroUser.getCityCode().substring(0, 4), SqlLike.RIGHT);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 查询数据列表
        List<Map<String, Object>> list;
        if (page != null) {
@@ -227,6 +242,9 @@
                map.put("v4Team", map.get("real_name"));
            }
            if (userMemberGradeId == EnumMemberGrade.G_5.index) {
                // 当是:市场总监后,城市合伙人无数据时,城市合伙人信息需显示本人的信息(只是做展示,不影响任何功能)
                map.put("v4ShowId", map.get("show_id"));
                map.put("v4Team", map.get("real_name"));
                map.put("v5ShowId", map.get("show_id"));
                map.put("v5Team", map.get("real_name"));
            }
@@ -237,6 +255,7 @@
    /**
     * 导出用户列表
     */
    @Permission
    @ResponseBody
    @RequestMapping(value = "/export")
    public void export(String beginTime, String endTime, String nickName, String phone, String showId, Integer isLock, Integer isLeaveOffice, Integer memberGradeId, HttpServletResponse response) {
@@ -249,6 +268,7 @@
        List<Object> shellList = new ArrayList<>();
        shellList.add("工号");
        shellList.add("提交时间");
        shellList.add("推荐人工号");
        shellList.add("推荐人");
        shellList.add("推荐人所在城市");
        shellList.add("姓名");
@@ -260,7 +280,7 @@
        shellList.add("银行卡号");
        shellList.add("品行分");
        shellList.add("审核状态");
        shellList.add("职级");
        shellList.add("佣金等级");
        shellList.add("积分");
        shellList.add("入司时间");
        shellList.add("状态");
@@ -275,6 +295,7 @@
            shellList = new ArrayList<>();
            shellList.add(map.get("show_id"));
            shellList.add(map.get("apply_time"));
            shellList.add(map.get("equityUserShowId"));
            shellList.add(map.get("equityUserRealName"));
            shellList.add(map.get("equityUserCityCode"));
            shellList.add(map.get("real_name"));
@@ -286,7 +307,7 @@
            shellList.add(map.get("bank_number"));
            shellList.add(map.get("credit_score"));
            shellList.add(EnumAuditState.getMarkByIndex(Convert.toInt(map.get("audit_state"))));
            shellList.add(EnumMemberGrade.getMarkByIndex(Convert.toInt(map.get("member_grade_id"))));
            shellList.add(EnumMemberGrade.getAliasByIndex(Convert.toInt(map.get("member_grade_id"))));
            shellList.add(map.get("integral"));
            shellList.add(map.get("audit_time"));
            Integer isLeaveOfficeNum = Convert.toInt(map.get("is_leave_office"));
@@ -332,6 +353,7 @@
        return PREFIX + "memUserSales_audit.html";
    }
    @Permission
    @BussinessLog(value = "营销人员管理-审核")
    @ResponseBody
    @RequestMapping(value = "/audit")
@@ -342,6 +364,7 @@
        }
        String setSql = "audit_state = " + state
                + ", audit_time = NOW()"
                + ", remark = " + SqlUtil.addSingleQuotes(remark);
        if (state == 1) {
            // 获取最新工号
@@ -356,9 +379,7 @@
            // 设置工号
            setSql += ", show_id = " + SqlUtil.addSingleQuotes(Convert.toInt(showId) + 1)
                    + ", audit_time = NOW()"
                    + ", is_leave_office = 0";
            // 购买套餐成功 即 VIP会员,申请入司 为 黄金营销员/城市合伙人
            MallOrder order = mallOrderService.selectById(memUser.getEquityOrderNo());
@@ -387,11 +408,45 @@
                            + ", member_grade_time = NOW()"
                            + ", credit_score = 100";
                }
                // 当用户已申请并通过成为营销员,用户所在城市需显示营销员的城市,营销员的城市取套餐推荐人的所在城市
                MemUser saleUser = memUserService.selectById(order.getSaleUserId());
                if (saleUser != null && StrUtil.isNotBlank(saleUser.getCityCode())) {
                    String province = StrUtil.sub(saleUser.getCityCode(), 0, 2) + "0000";
                    String city = StrUtil.sub(saleUser.getCityCode(), 0, 4) + "00";
                    String county = saleUser.getCityCode();
                    setSql += ", city_code = " + SqlUtil.addSingleQuotes(saleUser.getCityCode())
                            + ", agent_province_code = " + SqlUtil.addSingleQuotes(province)
                            + ", agent_city_code = " + SqlUtil.addSingleQuotes(city)
                            + ", agent_county_code = " + SqlUtil.addSingleQuotes(county);
                }
            }
            // 查询上级
            MemUserRelation shareUserRelation = memUserRelationService.selectById(order.getSaleUserId());
            // 更新用户关系表
            memUserRelationService.insertOrUpdate(
                    MemUserRelation.builder()
                            .id(userId)
                            .parentId(shareUserRelation.getId())
                            .relationPath(shareUserRelation.getRelationPath() + "/" + userId)
                            .build()
            );
        } else if (state == 2) {
            // 重置申请条件
            setSql += ", is_leave_office = -1";
        }
        boolean flag = memUserService.updateForSet(setSql, new EntityWrapper<MemUser>().eq("id", userId));
        if (flag) {
            if (state == 2) {
                // 订单材料受赠人,0未申请入司
                mallOrderService.updateForSet("use_user_id = 0",
                        new EntityWrapper<MallOrder>()
                                .eq("order_no", memUser.getEquityOrderNo())
                );
            }
            // 清除后台通知
            cleanSystemNotice(memUser.getId());
        }
@@ -442,6 +497,14 @@
                );
            }
            map.put("equityUser", equityUser);
            MemUser parentUser = memUserRelationService.getParentUserById(memUserId);
            if (parentUser != null) {
                model.addAttribute("equityUserRealName", parentUser.getRealName());
                model.addAttribute("equityUserCityCode", cityRegionService.getProvinceCityCountyNameByAll(null, parentUser.getCityCode()).stream()
                        .map(TCityRegion::getName)
                        .collect(Collectors.joining("-")));
            }
            model.addAttribute("item", map);
        }
@@ -570,6 +633,7 @@
    /**
     * 修改品行分
     */
    @Permission
    @BussinessLog(value = "营销人员管理-修改品行分")
    @ResponseBody
    @RequestMapping(value = "/editCreditScore")
@@ -596,19 +660,67 @@
    /**
     * 修改职级
     */
    @Permission
    @BussinessLog(value = "营销人员管理-修改职级")
    @ResponseBody
    @RequestMapping(value = "/editUserLevel")
    public Object editUserLevel(Integer userId, String memberGradeId) {
//        MemUser memUser = memUserService.selectById(userId);
//        if (memUser == null || memUser.getAuditState() == EnumAuditState.WAIT_AUDIT.index) {
//            return returnByFlag(false, "营销人员状态错误!");
//        }
        String whereSql = "member_grade_id = " + memberGradeId;
        boolean flag = memUserService.updateForSet(whereSql, new EntityWrapper<MemUser>().eq("id", userId));
        return returnByFlag(flag, null);
    }
    @RequestMapping(value = "/openEditCityCode/{userId}")
    public String openEditCityCode(Model model, @PathVariable("userId") Integer userId) {
        // 省市区三级联动
        List<TCityRegion> cityList = cityRegionService.selectList(
                new EntityWrapper<TCityRegion>()
                        .setSqlSelect("code, name")
                        .eq("parent_id", 0)
        );
        model.addAttribute("cityList", cityList);
        MemUser item = memUserService.selectOne(
                new EntityWrapper<MemUser>()
                        .setSqlSelect("id, city_code")
                        .eq("id", userId)
        );
        model.addAttribute("item", item);
        return PREFIX + "edit_city_code.html";
    }
    @Permission
    @BussinessLog(value = "营销人员管理-修改城市", key = "userId")
    @ResponseBody
    @RequestMapping(value = "/editCityCode")
    public Object editCityCode(Integer userId, String cityCode) {
        // 下级用户列表
        List<MemUserRelation> subUserList = memUserRelationService.selectList(
                new EntityWrapper<MemUserRelation>()
                       .setSqlSelect("id, relation_path")
                       .like("relation_path", "/" + userId + "/")
        );
        // 获取下级用户ID
        List<Integer> userIdList = subUserList.stream().map(MemUserRelation::getId).collect(Collectors.toList());
        // 添加自己
        userIdList.add(userId);
        String province = StrUtil.sub(cityCode, 0, 2) + "0000";
        String city = StrUtil.sub(cityCode, 0, 4) + "00";
        String county = cityCode;
        String whereSql = "city_code = " + SqlUtil.addSingleQuotes(cityCode)
                + ", agent_province_code = " + SqlUtil.addSingleQuotes(province)
                + ", agent_city_code = " + SqlUtil.addSingleQuotes(city)
                + ", agent_county_code = " + SqlUtil.addSingleQuotes(county);
        boolean flag = memUserService.updateForSet(whereSql, new EntityWrapper<MemUser>().in("id", userIdList));
        return returnByFlag(flag, null);
    }
    @Permission
    @BussinessLog(value = "营销人员管理-离职")
    @ResponseBody
    @RequestMapping(value = "/updateLeaveOffice")
@@ -617,7 +729,7 @@
        return returnByFlag(flag, null);
    }
    @Permission
    @ResponseBody
    @BussinessLog(value = "营销人员管理-冻结/解冻")
    @RequestMapping(value = "/updateState")
meiya-admin/src/main/java/com/sinata/modular/member/dao/mapping/MemUserRelationMapper.xml
@@ -32,7 +32,7 @@
    <!-- 获取用户上级推荐人信息 -->
    <select id="getParentUserById" resultType="com.sinata.modular.member.model.MemUser">
        SELECT u.nick_name nickName,u.phone,u.show_id showId FROM mem_user u
        SELECT u.nick_name nickName,u.phone,u.show_id showId,u.real_name,u.city_code FROM mem_user u
        LEFT JOIN mem_user_relation ur ON u.id = ur.parent_id
        WHERE 1=1
        <if test="userId != null">
meiya-admin/src/main/java/com/sinata/modular/member/model/MemUserRelation.java
@@ -1,16 +1,17 @@
package com.sinata.modular.member.model;
import java.util.Date;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
import lombok.Data;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
 * <p>
@@ -21,6 +22,9 @@
 * @since 2023-03-23
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("mem_user_relation")
@ApiModel(value = "会员邀请关系")
public class MemUserRelation extends Model<MemUserRelation> {
meiya-admin/src/main/java/com/sinata/modular/system/controller/MyCouponController.java
@@ -168,7 +168,9 @@
                couponProduct.setProductType(jsonObject.getInteger("type"));
                myCouponProductList.add(couponProduct);
            }
            myCouponProductService.insertBatch(myCouponProductList);
            if (myCouponProductList.size() > 0) {
                myCouponProductService.insertBatch(myCouponProductList);
            }
        }
        if(StrUtil.isNotEmpty(myCoupon.getUserInfo())){
            List<String> idList = Arrays.asList(
meiya-admin/src/main/java/com/sinata/modular/system/controller/UserMgrController.java
@@ -1,7 +1,7 @@
package com.sinata.modular.system.controller;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.sinata.common.enums.EnumIsDelete;
import com.sinata.core.base.controller.BaseController;
import com.sinata.core.base.tips.Tip;
import com.sinata.core.common.annotion.BussinessLog;
@@ -21,9 +21,10 @@
import com.sinata.modular.system.controller.util.UploadUtil;
import com.sinata.modular.system.dao.UserMapper;
import com.sinata.modular.system.factory.UserFactory;
import com.sinata.modular.system.model.AreaCity;
import com.sinata.modular.system.model.TCityRegion;
import com.sinata.modular.system.model.User;
import com.sinata.modular.system.service.IAreaCityService;
import com.sinata.modular.system.service.ITCityRegionService;
import com.sinata.modular.system.service.IUserService;
import com.sinata.modular.system.transfer.UserDto;
import com.sinata.modular.system.warpper.UserWarpper;
@@ -36,9 +37,11 @@
import javax.naming.NoPermissionException;
import javax.validation.Valid;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * 系统管理员控制器
@@ -61,6 +64,9 @@
    @Autowired
    private IAreaCityService areaCityService;
    @Autowired
    private ITCityRegionService cityRegionService;
    /**
     * 跳转到查看管理员列表的页面
     */
@@ -74,12 +80,19 @@
     */
    @RequestMapping("/user_add")
    public String addView(Model model) {
        model.addAttribute("provinceList", areaCityService.selectList(
                new EntityWrapper<AreaCity>()
                        .groupBy("province_code")
                        .eq("is_open", 1)
                        .eq("is_delete", EnumIsDelete.EXISTED.index)
        ));
//        model.addAttribute("provinceList", areaCityService.selectList(
//                new EntityWrapper<AreaCity>()
//                        .groupBy("province_code")
//                        .eq("is_open", 1)
//                        .eq("is_delete", EnumIsDelete.EXISTED.index)
//        ));
        // 省市区三级联动
        List<TCityRegion> cityList = cityRegionService.selectList(
                new EntityWrapper<TCityRegion>()
                        .setSqlSelect("code, name")
                        .eq("parent_id", 0)
        );
        model.addAttribute("cityList", cityList);
        return PREFIX + "user_add.html";
    }
@@ -115,12 +128,25 @@
        model.addAttribute("deptName", ConstantFactory.me().getDeptName(user.getDeptid()));
        LogObjectHolder.me().set(user);
        model.addAttribute("provinceList", areaCityService.selectList(
                new EntityWrapper<AreaCity>()
                        .groupBy("province_code")
                        .eq("is_open", 1)
                        .eq("is_delete", EnumIsDelete.EXISTED.index)
        ));
//        model.addAttribute("provinceList", areaCityService.selectList(
//                new EntityWrapper<AreaCity>()
//                        .groupBy("province_code")
//                        .eq("is_open", 1)
//                        .eq("is_delete", EnumIsDelete.EXISTED.index)
//        ));
        // 省市区三级联动
        List<TCityRegion> cityList = cityRegionService.selectList(
                new EntityWrapper<TCityRegion>()
                        .setSqlSelect("code, name")
                        .eq("parent_id", 0)
        );
        model.addAttribute("cityList", cityList);
        if (StrUtil.isBlank(user.getProvinceCode()) || "-1".equals(user.getProvinceCode())) {
            user.setProvinceCode("000000");
        }
        model.addAttribute("provinceCode", user.getProvinceCode().substring(0, 2) + "0000");
        model.addAttribute("cityCode", user.getProvinceCode().substring(0, 4) + "00");
        model.addAttribute("countyCode", user.getProvinceCode());
        return PREFIX + "user_edit.html";
    }
@@ -179,14 +205,19 @@
    @Permission
    @ResponseBody
    public Object list(@RequestParam(required = false) String name, @RequestParam(required = false) String beginTime, @RequestParam(required = false) String endTime, @RequestParam(required = false) Integer deptid) {
        List<Map<String, Object>> users;
        if (ShiroKit.isAdmin()) {
            List<Map<String, Object>> users = userService.selectUsers(null, name, beginTime, endTime, deptid);
            return new UserWarpper(users).warp();
            users = userService.selectUsers(null, name, beginTime, endTime, deptid);
        } else {
            DataScope dataScope = new DataScope(ShiroKit.getDeptDataScope());
            List<Map<String, Object>> users = userService.selectUsers(dataScope, name, beginTime, endTime, deptid);
            return new UserWarpper(users).warp();
            users = userService.selectUsers(dataScope, name, beginTime, endTime, deptid);
        }
        for (Map<String, Object> map : users) {
            String[] provinceCityCountyName = cityRegionService.getProvinceCityCountyName((String) map.get("provinceCode"));
            String provinceName = Arrays.stream(provinceCityCountyName).collect(Collectors.joining(""));
            map.put("provinceName", provinceName);
        }
        return new UserWarpper(users).warp();
    }
    /**
meiya-admin/src/main/java/com/sinata/modular/system/dao/mapping/MemUserDeleteMapper.xml
@@ -19,7 +19,7 @@
                and mu.nick_name like CONCAT('%',#{condition},'%')
            </if>
            <if test="status != null">
                and md.status != #{status}
                and md.status = #{status}
            </if>
        </where>
        ORDER BY md.status ASC
meiya-admin/src/main/java/com/sinata/modular/system/dao/mapping/RoleMapper.xml
@@ -13,10 +13,11 @@
        <result column="version" property="version"/>
        <result column="create_time" property="createTime"/>
        <result column="system_notice_type" property="systemNoticeType"/>
        <result column="cityRole" property="cityRole"/>
    </resultMap>
    <sql id="Base_Column_List">
        id, num, pid, name, deptid, tips, create_time, system_notice_type
        id, num, pid, name, deptid, tips, create_time, system_notice_type, cityRole
    </sql>
    <select id="selectRoles" resultType="map">
meiya-admin/src/main/java/com/sinata/modular/system/model/Role.java
@@ -64,6 +64,9 @@
    @ApiModelProperty(value = "消息类型配置")
    private String systemNoticeType;
    @ApiModelProperty(value = "城市管理员,0否,1省,2市,3区")
    private Integer cityRole;
    @Override
    protected Serializable pkVal() {
        return this.id;
meiya-admin/src/main/java/com/sinata/modular/system/model/User.java
@@ -83,7 +83,13 @@
    private Integer version;
    private String companyAddress;
    /**
     * 城市code
     */
    private String provinceCode;
    /**
     * 城市名称
     */
    private String provinceName;
    private Integer adminId;
meiya-admin/src/main/java/com/sinata/modular/system/service/impl/TCityRegionServiceImpl.java
@@ -43,6 +43,10 @@
        String province = StrUtil.sub(countyCode, 0, 2) + "0000";
        String city = StrUtil.sub(countyCode, 0, 4) + "00";
        if (cityAll == null) {
            cityAll = this.selectList(new EntityWrapper<>());
        }
        return cityAll.stream()
                .filter(o -> {
                    if (o.getCode().equals(province) || o.getCode().equals(city) || o.getCode().equals(countyCode)) {
meiya-admin/src/main/webapp/WEB-INF/view/common/tags/avatars.tag
@@ -89,6 +89,9 @@
                            if ( $btnContainer.find( "#" + self.uId + "BtnId").length > 0) {
                                $btnContainer.find( "#" + self.uId + "BtnId").remove();
                                self.$imgUpload && self.$imgUpload.destroy();
                                // 重新赋值
                                self.$input && self.$input.val( self.upImgUrls.join(","));
                            }
                            $btnContainer.prepend('' +
                                '<div class="upload-btn" style="margin: 0 0 1em 1em;margin-top: 0px!important;" id="'+ self.uId +'BtnId">' +
meiya-admin/src/main/webapp/WEB-INF/view/mall/mallGroupSpec/mallGroupSpec_add.html
@@ -37,6 +37,7 @@
                                        <th style="text-align: center;">市场价</th>
                                        <th style="text-align: center;">美天销售价</th>
                                        <th style="text-align: center;">商品库存</th>
                                        <th style="text-align: center;">数量</th>
                                    </tr>
                                </thead>
                                <tbody id="goodsSelectTbody"></tbody>
meiya-admin/src/main/webapp/WEB-INF/view/mall/mallGroupSpec/mallGroupSpec_edit.html
@@ -38,6 +38,7 @@
                                    <th style="text-align: center;">市场价</th>
                                    <th style="text-align: center;">美天销售价</th>
                                    <th style="text-align: center;">商品库存</th>
                                    <th style="text-align: center;">数量</th>
                                </tr>
                                </thead>
                                <tbody id="goodsSelectTbody"></tbody>
meiya-admin/src/main/webapp/WEB-INF/view/mall/mallOrder/mallOrder.html
@@ -44,10 +44,11 @@
                                <#NameCon id="userPhone" name="下单用户手机" />
                            </div>
                            <div class="col-sm-3">
                                <#NameCon id="userNickname" name="下单用户昵称" />
                                <input id="userShowId" type="hidden" />
                                <#NameCon id="userNickname" name="客户姓名" />
                            </div>
                            <div class="col-sm-3">
                                <#NameCon id="userShowId" name="商品名称" />
                                <#NameCon id="goodsName" name="商品名称" />
                            </div>
                        </div>
                        <div class="hidden-xs" id="MallOrderTableToolbar" role="group">
@@ -71,13 +72,13 @@
                            @if(shiro.hasPermission("/mallOrder/export")){
                                <#button name="导出数据" icon="fa-export" clickFun="MallOrder.export()"/>
                            @}
                            <!-- 删除订单 -->
                            @if(shiro.hasPermission("/mallOrder/delete")){
                                <input id="deleteAuth" type="hidden" value="true">
                            <!-- 核销记录 -->
                            @if(shiro.hasPermission("/mallOrder/useCheck")){
                                <input id="useCheckAuth" type="hidden" value="true">
                            @}
                            <!-- 查看物流 -->
                            @if(shiro.hasPermission("/mallOrder/logistics")){
                                <input id="logisticsAuth" type="hidden" value="true">
                            <!-- 处理退款 -->
                            @if(shiro.hasPermission("/mallOrder/orderShip")){
                                <input id="orderShipAuth" type="hidden" value="true">
                            @}
                        </div>
                        <#table id="MallOrderTable"/>
meiya-admin/src/main/webapp/WEB-INF/view/mall/mallOrder/mallOrder_detail.html
@@ -42,7 +42,7 @@
                        </div>
                        <div class="form-group">
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">下单用户昵称</label>
                                <label class="col-sm-4 control-label">客户姓名</label>
                                <div class="col-sm-8 form-control-static">
                                    ${item.takeName}
                                </div>
@@ -108,14 +108,12 @@
                        </div>
                        <div class="form-group">
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">市场监工号</label>
                                <div class="col-sm-8 form-control-static">
                                </div>
                                <label class="col-sm-4 control-label">市场总监工号</label>
                                <div class="col-sm-8 form-control-static">${v5ShowId}</div>
                            </div>
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">市场监工姓名</label>
                                <div class="col-sm-8 form-control-static"></div>
                                <label class="col-sm-4 control-label">市场总监姓名</label>
                                <div class="col-sm-8 form-control-static">${v5Team}</div>
                            </div>
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">退款时间</label>
@@ -126,12 +124,12 @@
                        </div>
                        <div class="form-group">
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">合伙人工号</label>
                                <div class="col-sm-8 form-control-static"></div>
                                <label class="col-sm-4 control-label">城市合伙人工号</label>
                                <div class="col-sm-8 form-control-static">${v4ShowId}</div>
                            </div>
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">合伙人姓名</label>
                                <div class="col-sm-8 form-control-static"></div>
                                <label class="col-sm-4 control-label">城市合伙人姓名</label>
                                <div class="col-sm-8 form-control-static">${v4Team}</div>
                            </div>
                        </div>
                    </div>
@@ -143,8 +141,8 @@
                        <table class="table table-bordered table-hover table-striped">
                            <thead>
                            <tr>
                                <th>商品名称</th>
                                <th>商品编号</th>
                                <th>商品名称</th>
                                <th>商品预览</th>
                                <th>商品规格</th>
                                <th>购买数量</th>
@@ -154,8 +152,8 @@
                                @if(isNotEmpty(item.orderDetails)){
                                    @for(info in item.orderDetails) {
                                        <tr>
                                            <td>${info.goodsName}</td>
                                            <td>${info.goodsNo}</td>
                                            <td>${info.goodsName}</td>
                                            <td>
                                                <img src="${info.goodsImage}" alt="" style="width: 50px; height: 50px;">
                                            </td>
meiya-admin/src/main/webapp/WEB-INF/view/mall/mallOrder/mallOrder_detail_group.html
New file
@@ -0,0 +1,271 @@
@layout("/common/_container.html"){
<div class="ibox float-e-margins">
    <div class="ibox-content">
        <div class="form-horizontal">
            <div class="row">
                <div class="panel panel-default">
                    <div class="panel-heading"><h5 class="panel-title">订单信息</h5></div>
                    <div class="panel-body">
                        <div class="form-group">
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">下单时间</label>
                                <div class="col-sm-8 form-control-static">
                                    ${item.createTime, dateFormat="yyyy-MM-dd HH:mm:SS"}
                                </div>
                            </div>
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">订单状态</label>
                                <div class="col-sm-8 form-control-static">
                                    <span id="state_show"></span>
                                    <select id="state_name" style="display: none">
                                        <option value="0">待支付</option>
                                        <option value="1">待核销</option>
                                        <option value="2">使用中</option>
                                        <option value="3">已完成</option>
                                        <option value="4">已申请实物券</option>
                                        <option value="10">已取消</option>
                                        <option value="11">待退款</option>
                                        <option value="12">已退款</option>
                                        <option value="13">退款失败</option>
                                    </select>
                                    <script>$(function () {
                                        $( "#state_show").text( Feng.getOptionFormatter( "#state_name")("${item.state}"));
                                    })</script>
                                </div>
                            </div>
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">订单编号</label>
                                <div class="col-sm-8 form-control-static">
                                    ${item.orderNo}
                                </div>
                            </div>
                        </div>
                        <div class="form-group">
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">客户姓名</label>
                                <div class="col-sm-8 form-control-static">
                                    ${item.takeName}
                                </div>
                            </div>
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">下单用户电话</label>
                                <div class="col-sm-8 form-control-static">
                                    ${item.userPhone}
                                </div>
                            </div>
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">预约门店</label>
                                <div class="col-sm-8 form-control-static">
                                    ${item.merchantName}
                                </div>
                            </div>
                        </div>
                        <div class="form-group">
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">订单来源</label>
                                <div class="col-sm-8 form-control-static">
                                    ${item.saleUserId != 0 ? '推广链接':'自然'}
                                </div>
                            </div>
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">订单类型</label>
                                <div class="col-sm-8 form-control-static">
                                    ${item.orderType==0?'普通商品':item.orderType==1?'黄金套餐':'钻石套餐'}
                                </div>
                            </div>
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">核销次数</label>
                                <div class="col-sm-8 form-control-static">
                                    ${item.useNum}
                                </div>
                            </div>
                            <!--<div class="col-sm-4">
                                <label class="col-sm-4 control-label">核销门店</label>
                                <div class="col-sm-8 form-control-static">
                                    ${item.merchantName}
                                </div>
                            </div>-->
                        </div>
                        <div class="form-group">
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">营销员工号</label>
                                <div class="col-sm-8 form-control-static">
                                    ${item.saleShowId}
                                </div>
                            </div>
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">营销员姓名</label>
                                <div class="col-sm-8 form-control-static">
                                    ${item.saleUserName}
                                </div>
                            </div>
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">营销员业绩</label>
                                <div class="col-sm-8 form-control-static">
                                    ${item.saleShowId != null ? saleGoodsMoney : "-"}
                                </div>
                            </div>
                        </div>
                        <div class="form-group">
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">市场总监工号</label>
                                <div class="col-sm-8 form-control-static">${v5ShowId}</div>
                            </div>
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">市场总监姓名</label>
                                <div class="col-sm-8 form-control-static">${v5Team}</div>
                            </div>
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">退款时间</label>
                                <div class="col-sm-8 form-control-static">
                                    ${item.refundTime, dateFormat="yyyy-MM-dd HH:mm:ss"}
                                </div>
                            </div>
                        </div>
                        <div class="form-group">
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">城市合伙人工号</label>
                                <div class="col-sm-8 form-control-static">${v4ShowId}</div>
                            </div>
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">城市合伙人姓名</label>
                                <div class="col-sm-8 form-control-static">${v4Team}</div>
                            </div>
                        </div>
                    </div>
                </div>
                <div class="panel panel-default">
                    <div class="panel-heading"><h5 class="panel-title">商品信息</h5></div>
                    <div class="panel-body">
                        <h5 class="panel-title" style="padding-bottom: 10px;">套餐信息</h5>
                        <style> th,td{ text-align: center} </style>
                        <table class="table table-bordered table-hover table-striped">
                            <thead>
                            <tr>
                                <th>商品编号</th>
                                <th>套餐名称</th>
                                <th>商品预览</th>
                                <th>规格组</th>
                                <th>购买数量</th>
                            </tr>
                            </thead>
                            <tbody>
                                @if(isNotEmpty(item.orderDetails)){
                                    @for(info in item.orderDetails) {
                                    <tr>
                                        <td>${info.goodsNo}</td>
                                        <td>${info.goodsName}</td>
                                        <td><img src="${info.goodsImage}" style="width: 50px; height: 50px;"></td>
                                        <td>${info.grepName}</td>
                                        <td>${info.goodsNum}</td>
                                    </tr>
                                    <tr>
                                        <td colspan="5" style="text-align: left;"><b>规格组信息</b></td>
                                    </tr>
                                    <tr>
                                        <td colspan="5">
                                            <table class="table table-bordered table-hover">
                                                <tr>
                                                    <th>商品编号</th>
                                                    <th>商品名称</th>
                                                    <th>商品预览</th>
                                                    <th>数量</th>
                                                </tr>
                                                @for( groupGoodsInfo in mallOrderDetailGroupSpecList ) {
                                                @if( (groupGoodsInfo.groupSpecId + '') == info.specGrep ){
                                                <tr>
                                                    <td>${groupGoodsInfo.groupSpecGoodsNo}</td>
                                                    <td>${groupGoodsInfo.groupSpecGoodsName}</td>
                                                    <td><img src="${groupGoodsInfo.groupSpecGoodsImage}" style="width: 50px; height: 50px;"></td>
                                                    <td>${groupGoodsInfo.groupSpecGoodsNum}</td>
                                                </tr>
                                                @}
                                                @}
                                            </table>
                                        </td>
                                    </tr>
                                    @}
                                @}else{
                                    <tr>
                                        <td colspan="10000">暂无数据</td>
                                    </tr>
                                @}
                            </tbody>
                        </table>
                    </div>
                </div>
                <div class="panel panel-default">
                    <div class="panel-heading"><h5 class="panel-title">费用信息</h5></div>
                    <div class="panel-body">
                        <div class="form-group">
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">订单金额</label>
                                <div class="col-sm-8 form-control-static">
                                    ${item.goodsMoney}
                                </div>
                            </div>
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">实付金额</label>
                                <div class="col-sm-8 form-control-static">
                                    ${item.payMoney}
                                </div>
                            </div>
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">优惠金额</label>
                                <div class="col-sm-8 form-control-static">
                                    ${item.goodsMoney - item.payMoney}
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
                <div class="panel panel-default">
                    <div class="panel-heading"><h5 class="panel-title">核销列表</h5></div>
                    <div class="panel-body">
                        <table class="table table-bordered table-hover table-striped">
                            <thead>
                            <tr>
                                <th>核销时间</th>
                                <th>核销门店</th>
                                <th>核销商品</th>
                                <th>核销数量</th>
                                <th>核销人</th>
                                <th>状态</th>
                            </tr>
                            </thead>
                            <tbody>
                            @if(isNotEmpty(item.useList)){
                            @for(info in item.useList) {
                            <tr>
                                <td>${info.useTime, dateFormat="yyyy-MM-dd HH:mm:ss"}</td>
                                <td>${info.merchantName}</td>
                                <td>${info.grepName}</td>
                                <td>${info.useNum}</td>
                                <td>${info.linkman}</td>
                                <td>已核销</td>
                            </tr>
                            @}
                            @}
                            @if(isNotEmpty(item.useOrderDetailGroupSpecList)){
                            @for(info in item.useOrderDetailGroupSpecList) {
                            <tr>
                                <td>${info.useDateTime, dateFormat="yyyy-MM-dd HH:mm:ss"}</td>
                                <td>${info.merchantName}</td>
                                <td>${info.goodsName}</td>
                                <td>${info.groupSpecUse}</td>
                                <td>${info.linkman}</td>
                                <td>${info.isUse == 1 ? "已核销" : "核销中"}</td>
                            </tr>
                            @}
                            @}
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="${ctxPath}/static/modular/mall/mallOrder/mallOrder_info.js"></script>
@}
meiya-admin/src/main/webapp/WEB-INF/view/member/memUserSales/edit_city_code.html
New file
@@ -0,0 +1,68 @@
@layout("/common/_container.html"){
<div class="ibox float-e-margins">
    <div class="ibox-content">
        <div class="form-horizontal">
            <input type="hidden" id="userId" name="userId" value="${item.id}">
            <div class="row">
                <div class="col-sm-10">
                    <div class="form-group">
                        <label class="col-sm-3 control-label">城市</label>
                        <div class="col-sm-9">
                            <div class="col-sm-4" style="padding-left: 0px; padding-right: 0px;">
                                <select class="form-control" id="cityCode1" name="cityCode1" onchange="Feng.selectCity1();">
                                    <option value="-1">请选择</option>
                                    @for(city in cityList) {
                                    <option value="${city.code}">${city.name}</option>
                                    @}
                                </select>
                            </div>
                            <div class="col-sm-4" style="padding-left: 0px; padding-right: 0px;">
                                <select class="form-control" id="cityCode2" name="cityCode2" onchange="Feng.selectCity2();">
                                    <option value="-1">请选择</option>
                                </select>
                            </div>
                            <div class="col-sm-4" style="padding-left: 0px; padding-right: 0px;">
                                <select class="form-control" id="cityCode" name="cityCode">
                                    <option value="-1">请选择</option>
                                </select>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            <div class="row btn-group-m-t">
                <div class="col-sm-10 col-sm-offset-5">
                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="DialogInfo.editSubmit()"/>
                </div>
            </div>
        </div>
    </div>
</div>
<script type="text/javascript">
    var DialogInfo = {};
    DialogInfo.editSubmit = function () {
        let cityCode = $("#cityCode").val();
        if(cityCode == null || cityCode == "-1") {
            Feng.error("请选择城市!");
            return;
        }
        //提交信息
        var ajax = new $ax(Feng.ctxPath + "/memUserSales/editCityCode", function (data) {
            if(data.code == 200){
                parent.layer.close(window.parent.MemUserSales.layerIndex);
                window.parent.MemUserSales.table.refresh();
                Feng.success("操作成功!");
            } else {
                Feng.error("操作失败!" + data.message);
            }
        }, function (data) {
            Feng.error("操作失败!");
        });
        ajax.set("userId", $("#userId").val());
        ajax.set("cityCode", cityCode);
        ajax.start();
    }
</script>
@}
meiya-admin/src/main/webapp/WEB-INF/view/member/memUserSales/memUserSales.html
@@ -42,14 +42,19 @@
                            </div>
                            <div class="col-sm-3">
                                <div class="input-group">
                                    <span class="input-group-addon">职级</span>
                                    <span class="input-group-addon">佣金等级</span>
                                    <select id="memberGradeId" class="form-control">
                                        <option value="-1">全部</option>
                                        <option value="1">普通会员</option>
                                        <!--<option value="1">普通会员</option>
                                        <option value="2">VIP会员</option>
                                        <option value="3">黄金营销员</option>
                                        <option value="4">城市合伙人</option>
                                        <option value="5">市场总监</option>
                                        <option value="5">市场总监</option>-->
                                        <option value="1">Y</option>
                                        <option value="2">Y</option>
                                        <option value="3">S</option>
                                        <option value="4">E</option>
                                        <option value="5">X</option>
                                    </select>
                                </div>
                            </div>
@@ -82,6 +87,9 @@
                        @if(shiro.hasPermission("/memUserSales/editUserLevel")){
                        <button type="button" class="btn btn-primary" onclick="MemUserSales.openEditUserLevel()">调整职级</button>
                        @}
                        @if(shiro.hasPermission("/memUserSales/editCityCode")){
                        <button type="button" class="btn btn-primary" onclick="MemUserSales.openEditCityCode()">修改城市</button>
                        @}
                        @if(shiro.hasPermission("/memUserSales/updateState")){
                        <input id='updateStateAuth' type="hidden" value='true'>
                        @}
meiya-admin/src/main/webapp/WEB-INF/view/member/memUserSales/memUserSales_detail.html
@@ -5,10 +5,10 @@
            <div class="panel-body">
                <div class="form-group">
                    <label class="col-sm-2 control-label">推荐人</label>
                    <div class="col-sm-2 form-control-static">${item.equityUser.realName!}</div>
                    <div class="col-sm-2 form-control-static">${equityUserRealName!}</div>
                    <label class="col-sm-2 control-label"></label>
                    <div class="col-sm-2 form-control-static">${item.equityUser.cityCode!}</div>
                    <div class="col-sm-2 form-control-static">${equityUserCityCode!}</div>
                </div>
                <div class="form-group">
                    <label class="col-sm-2 control-label">权益转让</label>
meiya-admin/src/main/webapp/WEB-INF/view/system/areaCity/areaCity_edit.html
@@ -11,7 +11,7 @@
                            <div class="col-sm-4" style="padding-left: 0px; padding-right: 0px;">
                                <select class="form-control" id="cityCode1" name="cityCode1" onchange="Feng.selectCity1();">
                                    <option value="-1">请选择</option>
                                    @for(city in cityList){
                                    @for(city in cityList) {
                                    <option value="${city.code}">${city.name}</option>
                                    @}
                                </select>
meiya-admin/src/main/webapp/WEB-INF/view/system/user/user_add.html
@@ -9,24 +9,31 @@
                <div class="col-sm-6 b-r">
                    <#input id="account" name="账户" underline="true"/>
                    <#input id="password" name="密码" underline="true" value="123456" type="password"/>
                    <#input id="rePassword" name="确认密码" type="password" value="123456" underline="true"/>
                    <#input id="citySel" name="部门" underline="true" readonly="readonly" hidden="deptid" clickFun="UserInfoDlg.showDeptSelectTree(); return false;" style="background-color: #ffffff !important;"/>
                    <#input id="companyAddress" name="公司地址" type="text" underline="true"/>
                </div>
                <div class="col-sm-6">
                    <div id="driverInfoContent">
                        <input id="birthday" name="birthday" type="hidden"/>
                        <#input id="name" name="姓名" underline="true"/>
                        <#input id="rePassword" name="确认密码" type="password" value="123456" underline="true"/>
                        <#input id="phone" name="联系电话" underline="true"/>
                        <#input id="citySel" name="部门" underline="true" readonly="readonly" hidden="deptid"
                        clickFun="UserInfoDlg.showDeptSelectTree(); return false;" style="background-color: #ffffff !important;"/>
                        <div class="form-group">
                            <label class="col-sm-3 control-label">选择省</label>
                            <label class="col-sm-3 control-label">所属城市</label>
                            <div class="col-sm-9">
                                <select class="form-control" id="provinceCode" name="provinceCode">
                                    @for(cityArea in provinceList) {
                                    <option value="${cityArea.provinceCode}">${cityArea.provinceName}</option>
                                <select class="form-control" id="cityCode1" name="cityCode1" onchange="Feng.selectCity1();">
                                    <option value="-1">请选择</option>
                                    @for(city in cityList) {
                                    <option value="${city.code}">${city.name}</option>
                                    @}
                                </select>
                                <select class="form-control" id="cityCode2" name="cityCode2" onchange="Feng.selectCity2();">
                                    <option value="-1">请选择</option>
                                </select>
                                <select class="form-control" id="cityCode" name="cityCode">
                                    <option value="-1">请选择</option>
                                </select>
                            </div>
                        </div>
                    </div>
meiya-admin/src/main/webapp/WEB-INF/view/system/user/user_edit.html
@@ -9,6 +9,7 @@
            <div class="row">
                <div class="col-sm-6 b-r">
                    <#input id="account" name="账户" underline="true" value="${user.account}"/>
                    <#input id="citySel" name="部门" underline="true" readonly="readonly" hidden="deptid" hiddenValue="${user.deptid}" value="${deptName}" clickFun="UserInfoDlg.showDeptSelectTree(); return false;" style="background-color: #ffffff !important;"/>
                    <#input id="companyAddress" name="公司地址" value="${user.companyAddress}" underline="true" type="text"/>
                </div>
                <div class="col-sm-6">
@@ -16,15 +17,63 @@
                        <input id="birthday" name="birthday" value="${user.birthday}" type="hidden"/>
                        <#input id="name" name="姓名" underline="true" value="${user.name}"/>
                        <#input id="phone" name="联系电话" value="${user.phone}" underline="true"/>
                        <#input id="citySel" name="部门" underline="true" readonly="readonly" hidden="deptid" hiddenValue="${user.deptid}" value="${deptName}" clickFun="UserInfoDlg.showDeptSelectTree(); return false;" style="background-color: #ffffff !important;"/>
                        <div class="form-group">
                            <label class="col-sm-3 control-label">选择省</label>
                            <label class="col-sm-3 control-label">所属城市</label>
                            <div class="col-sm-9">
                                <select class="form-control" id="provinceCode" name="provinceCode">
                                    @for(cityArea in provinceList) {
                                    <option value="${cityArea.provinceCode}" ${cityArea.provinceCode==user.provinceCode?'selected="selected"':''}>${cityArea.provinceName}</option>
                                <select class="form-control" id="cityCode1" name="cityCode1" onchange="Feng.selectCity1();">
                                    @for(city in cityList){
                                    <option value="${city.code}" ${city.code==provinceCode?'selected="selected"':''}>${city.name}</option>
                                    @}
                                </select>
                                <select class="form-control" id="cityCode2" name="cityCode2" onchange="Feng.selectCity2();">
                                    <option value="-1">请选择</option>
                                </select>
                                <select class="form-control" id="cityCode" name="cityCode">
                                    <option value="-1">请选择</option>
                                </select>
                                <input type="hidden" id="cityCode2Str" value="${cityCode}">
                                <input type="hidden" id="cityCode3Str" value="${countyCode}">
                                <script type="text/javascript">
                                    var cityCode2Str = $("#cityCode2Str").val();
                                    var cityCode3Str = $("#cityCode3Str").val();
                                    var code1 = $("#cityCode1").val();
                                    $.ajax({
                                        type: "GET",
                                        url: Feng.ctxPath + "/cityRegion/getListByParentId",
                                        data: {code1: code1},
                                        success: function(data) {
                                            var options = '<option value="-1">请选择</option>';
                                            $(data).each(function (i, item) {
                                                var selectedStr = "";
                                                if (cityCode2Str == item.code) {
                                                    selectedStr = 'selected="selected"';
                                                }
                                                options += "<option value='" + item.code + "' " + selectedStr + ">" + item.name + "</option>"
                                            });
                                            $("#cityCode2").html(options);
                                            var code2 = $("#cityCode2").val();
                                            $.ajax({
                                                type: "GET",
                                                url: Feng.ctxPath + "/cityRegion/getListByParentId",
                                                data: {code2: code2},
                                                success: function(data) {
                                                    var options = '<option value="-1">请选择</option>';
                                                    $(data).each(function (i, item) {
                                                        var selectedStr = "";
                                                        if (cityCode3Str == item.code) {
                                                            selectedStr = 'selected="selected"';
                                                        }
                                                        options += "<option value='" + item.code + "' " + selectedStr + ">" + item.name + "</option>"
                                                    });
                                                    $("#cityCode").html(options);
                                                }
                                            });
                                        }
                                    });
                                </script>
                            </div>
                        </div>
                    </div>
meiya-admin/src/main/webapp/static/modular/mall/mallGoodsGroup/mallGoodsGroup_info.js
@@ -126,9 +126,9 @@
                    + "<input class='inputSpec' type='hidden' value='" + item.specName + "'>"
                    + item.specName + "</td>"
                    + "<td>" + item.goodsNames + "</td>"
                    + "<td><input class='inputSpec' type='hidden' value='" + item.stock + "'>" + item.stock + "</td>"
                    + "<td>" + item.provinceName + "</td>"
                    + "<td><input class='inputSpec' type='number' value='" + item.priceMerchant + "'></td>"
                    + "<td style='text-align: center;'><input class='inputSpec' type='hidden' value='" + item.stock + "'>" + item.stock + "</td>"
                    + "<td style='text-align: center;'>" + item.provinceName + "</td>"
                    + "<td style='text-align: center;'><input class='inputSpec' type='number' value='" + item.priceMerchant + "'></td>"
                    + "</tr>"
            });
@@ -152,9 +152,9 @@
                    + item.specName + "</td>"
                    + "<td>" + item.goodsNames + "</td>"
                    + "<td>" + item.totalPrice + "</td>"
                    + "<td><input class='inputSpec' type='hidden' value='" + item.stock + "'>" + item.stock + "</td>"
                    + "<td>" + item.provinceName + "</td>"
                    + "<td><input class='inputSpec' type='number' value='" + item.priceMerchant + "'></td>"
                    + "<td style='text-align: center;'><input class='inputSpec' type='hidden' value='" + item.stock + "'>" + item.stock + "</td>"
                    + "<td style='text-align: center;'>" + item.provinceName + "</td>"
                    + "<td style='text-align: center;'><input class='inputSpec' type='number' value='" + item.priceMerchant + "'></td>"
                    + "</tr>"
            });
meiya-admin/src/main/webapp/static/modular/mall/mallGroupSpec/mallGroupSpec_info.js
@@ -42,10 +42,16 @@
 * 收集数据
 */
MallGroupSpecInfoDlg.collectData = function() {
    let goodsSkuJson = MallGroupSpecInfoDlg.getGoodsSkuJson(1);
    if (goodsSkuJson == 'ERROR') {
        return false;
    }
    this
    .set('id')
    .set('specName')
    .set('goodsIds', Feng.getMultipleSelectVal("goodsIds"))
    .set('goodsSkuJson', goodsSkuJson)
    .set('goodsNames')
    .set('classifyIdOne')
    .set('classifyIdTwo')
@@ -59,13 +65,83 @@
    .set('isDelete')
    .set('provinceCode')
    .set('provinceName', $('#provinceCode option:selected').text());
    return true;
};
MallGroupSpecInfoDlg.getGoodsSkuJson = function(isCheck) {
    let result = '';
    let goodsSkuJson = [];
    $(".goods_sku_json").each(function() {
        let inputs = $(this).find("input"); // 找到当前<td>元素中的所有输入框
        let input1Value = $(inputs[0]).val(); // 获取第一个输入框的内容-商品id
        let input2Value = $(inputs[1]).val(); // 获取第二个输入框的内容-输入数量
        let input3Value = $(inputs[2]).val(); // 获取第三个输入框的内容-库存
        // 是否需要验证
        if(isCheck == 1) {
            if(input3Value - input2Value < 0) {
                Feng.error("数量不能大于商品库存");
                // 错误标记
                result = "ERROR";
                // 中断each()循环
                return false;
            }
            if(input2Value == 0) {
                Feng.error("数量不能小于1");
                // 错误标记
                result = "ERROR";
                // 中断each()循环
                return false;
            }
        }
        let json = {
            "goodsId": input1Value,
            "goodsNum": input2Value
        };
        goodsSkuJson.push(json);
    });
    if (result == '') {
        result = JSON.stringify(goodsSkuJson);
    }
    return result;
}
MallGroupSpecInfoDlg.chooseGoods = function() {
    // $.ajax({
    //     url : Feng.ctxPath + "/mallGoods/goodsByIdsList",
    //     type : "get",
    //     data : {"ids": Feng.getMultipleSelectVal("goodsIds")},
    //     dataType : "json",
    //     success : function (list) {
    //         let goodsSelectTbodyStr = '';
    //         $.each(list, function(i, item) {
    //             goodsSelectTbodyStr += "<tr>"
    //                 + "<td> " + item.goodsNo + " </td>"
    //                 + "<td> " + item.goodsName + " </td>"
    //                 + "<td> " + item.price + " </td>"
    //                 + "<td> " + item.priceSale + " </td>"
    //                 + "<td> " + item.stock + " </td>"
    //                 + "<td style='text-align: center;' class='goods_sku_json'>" +
    //                     "<input type='hidden' value='" + item.goodsNo + "'>" +
    //                     "<input type='text' value='0'>" +
    //                 "</td>"
    //             + "</tr>"
    //         });
    //
    //         $("#goodsSelectTbody").html(goodsSelectTbodyStr);
    //     }
    // });
    $.ajax({
        url : Feng.ctxPath + "/mallGoods/goodsByIdsList",
        url : Feng.ctxPath + "/mallGoods/goodsByGoodsSpecId",
        type : "get",
        data : {"ids": Feng.getMultipleSelectVal("goodsIds")},
        data : {
            "goodsIds": Feng.getMultipleSelectVal("goodsIds"),
            "groupSpecId": $("#id").val(),
            "oldGoodsSkuJson": MallGroupSpecInfoDlg.getGoodsSkuJson(0)
        },
        dataType : "json",
        success : function (list) {
            let goodsSelectTbodyStr = '';
@@ -76,6 +152,11 @@
                    + "<td> " + item.price + " </td>"
                    + "<td> " + item.priceSale + " </td>"
                    + "<td> " + item.stock + " </td>"
                    + "<td style='text-align: center;' class='goods_sku_json'>" +
                        "<input type='hidden' value='" + item.id + "'>" +
                        "<input type='text' value='" + item.goodsNum + "'>" +
                        "<input type='hidden' value='" + item.stock + "'>" +
                    "</td>"
                + "</tr>"
            });
@@ -90,7 +171,10 @@
 */
MallGroupSpecInfoDlg.addSubmit = function() {
    this.clearData();
    this.collectData();
    let checkForm = this.collectData();
    if (!checkForm) {
        return;
    }
    //提交信息
    var ajax = new $ax(Feng.ctxPath + "/mallGroupSpec/add", function(data){
@@ -113,7 +197,10 @@
 */
MallGroupSpecInfoDlg.editSubmit = function() {
    this.clearData();
    this.collectData();
    let checkForm = this.collectData();
    if (!checkForm) {
        return;
    }
    //提交信息
    var ajax = new $ax(Feng.ctxPath + "/mallGroupSpec/update", function(data){
meiya-admin/src/main/webapp/static/modular/mall/mallOrder/mallOrder.js
@@ -34,7 +34,7 @@
        {title: '商品名称', field: 'goodsName', visible: true, align: 'center', valign: 'middle'},
        {title: '规格组', field: 'grepName', visible: true, align: 'center', valign: 'middle'},
        {title: '数量', field: 'goodsNum', visible: true, align: 'center', valign: 'middle'},
        {title: '下单用户昵称', field: 'takeName', visible: true, align: 'center', valign: 'middle'},
        {title: '客户姓名', field: 'takeName', visible: true, align: 'center', valign: 'middle'},
        {title: '下单用户手机', field: 'userPhone', visible: true, align: 'center', valign: 'middle'},
        {title: '预约门店', field: 'merchantName', visible: true, align: 'center', valign: 'middle'},
        {title: '到店消费次数', field: 'useNum', visible: true, align: 'center', valign: 'middle'},
@@ -51,17 +51,18 @@
            formatter: function (value, row) {
                var opts = Feng.Opts(), state = row.state;
                opts.add("MallOrder.detailAuth('"+row.orderNo+"');", "订单详情");
                if(state ==11){
                    opts.add("MallOrder.deliverAuth('"+row.orderNo+"');", "处理退款");
                if ($("#detailAuth").val() == 'true') {
                    opts.add("MallOrder.openDetail('" + row.orderNo + "','" + row.orderType + "');", "订单详情");
                }
                if(state ==2 || state ==3){
                    opts.add("MallOrder.detailAuth('"+row.orderNo+"');", "核销记录");
                if (state == 11 && $("#orderShipAuth").val() == 'true') {
                    opts.add("MallOrder.deliverAuth('" + row.orderNo + "');", "处理退款");
                }
                if ( (state == 2 || state == 3)  && $("#useCheckAuth").val() == 'true' ) {
                    opts.add("MallOrder.openDetail('" + row.orderNo + "','" + row.orderType + "');", "核销记录");
                }
                return opts.getOpts();
            }
        }
    ];
};
@@ -104,20 +105,6 @@
        fix: false, //不固定
        maxmin: true,
        content: Feng.ctxPath + '/mallOrder/logisticsAuth/' + id
    });
};
/**
 * 点击 打开订单详情页面
 */
MallOrder.detailAuth = function ( id) {
    this.layerIndex = layer.open({
        type: 2,
        title: '订单详情',
        area: ['80%', '80%'], //宽高
        fix: false, //不固定
        maxmin: true,
        content: Feng.ctxPath + '/mallOrder/detailAuth/' + id
    });
};
@@ -194,16 +181,15 @@
/**
 * 打开查看商品订单详情
 */
MallOrder.detailAuth = function (id) {
    var index = layer.open({
MallOrder.openDetail = function (orderNo, orderType) {
    this.layerIndex = layer.open({
        type: 2,
        title: '商品订单详情',
        area: ['80%', '80%'], //宽高
        area: ['95%', '95%'], //宽高
        fix: false, //不固定
        maxmin: true,
        content: Feng.ctxPath + '/mallOrder/detail/' + id
        content: Feng.ctxPath + '/mallOrder/detail?orderNo=' + orderNo + '&orderType=' + orderType
    });
    this.layerIndex = index;
};
/**
@@ -260,6 +246,7 @@
    queryData['userShowId'] = $("#userShowId").val();
    queryData['userPhone'] = $("#userPhone").val();
    queryData['userNickname'] = $("#userNickname").val();
    queryData['goodsName'] = $("#goodsName").val();
    return queryData;
}
@@ -289,6 +276,7 @@
    $("#userShowId").val("");
    $("#userPhone").val("");
    $("#userNickname").val("");
    $("#goodsName").val("");
    MallOrder.search();
};
$(function () {
meiya-admin/src/main/webapp/static/modular/member/memUserSales/memUserSales.js
@@ -40,9 +40,10 @@
                return {0: "待处理", 1: "通过", 2: "拒绝"}[value];
            }
        },
        {title: '职级', field: 'member_grade_id', visible: true, align: 'center', valign: 'middle',
        {title: '佣金等级', field: 'member_grade_id', visible: true, align: 'center', valign: 'middle',
            formatter: function (value, row) {
                return {1: "普通会员", 2: "VIP会员", 3: "黄金营销员", 4: "城市合伙人", 5: "市场总监"}[value];
                //return {1: "普通会员", 2: "VIP会员", 3: "黄金营销员", 4: "城市合伙人", 5: "市场总监"}[value];
                return {1: "Y", 2: "Y", 3: "S", 4: "E", 5: "X"}[value];
            }
        },
        {title: '积分', field: 'integral', visible: true, align: 'center', valign: 'middle'},
@@ -119,6 +120,24 @@
        fix: false, //不固定
        maxmin: true,
        content: Feng.ctxPath + '/memUserSales/openEditUserLevel/' + MemUserSales.seItem.id
    });
};
/**
 * 点击 修改城市
 */
MemUserSales.openEditCityCode = function () {
    if (!MemUserSales.checkTableOnlyId()) {
        return;
    }
    this.layerIndex = layer.open({
        type: 2,
        title: '',
        area: ['80%', '60%'], //宽高
        fix: false, //不固定
        maxmin: true,
        content: Feng.ctxPath + '/memUserSales/openEditCityCode/' + MemUserSales.seItem.id
    });
};
@@ -203,7 +222,7 @@
        ajax.set("state", state);
        ajax.start();
    };
    Feng.confirm("是否 " + (state == 0 ? "解冻" : "解冻") + " 该用户?", operation);
    Feng.confirm("是否 " + (state == 0 ? "解冻" : "冻结") + " 该用户?", operation);
};
/**
meiya-admin/src/main/webapp/static/modular/system/user/user.js
@@ -25,7 +25,7 @@
        {title: '公司地址', field: 'companyAddress', align: 'center', valign: 'middle', sortable: false},
        {title: '创建时间', field: 'createtime', align: 'center', valign: 'middle', sortable: false},
        {title: '创建人', field: 'adminName', align: 'center', valign: 'middle', sortable: false},
        {title: '所属省', field: 'provinceName', align: 'center', valign: 'middle', sortable: false},
        {title: '所属城市', field: 'provinceName', align: 'center', valign: 'middle', sortable: false},
        {title: '状态', field: 'statusName', align: 'center', valign: 'middle', sortable: false}];
    return columns;
};
@@ -51,7 +51,7 @@
    var index = layer.open({
        type: 2,
        title: '添加管理员',
        area: ['800px', '560px'], //宽高
        area: ['800px', '650px'], //宽高
        fix: false, //不固定
        maxmin: true,
        content: Feng.ctxPath + '/mgr/user_add'
@@ -68,7 +68,7 @@
        var index = layer.open({
            type: 2,
            title: '编辑管理员',
            area: ['800px', '450px'], //宽高
            area: ['800px', '650px'], //宽高
            fix: false, //不固定
            maxmin: true,
            content: Feng.ctxPath + '/mgr/user_edit/' + this.seItem.id
meiya-admin/src/main/webapp/static/modular/system/user/user_info.js
@@ -91,8 +91,15 @@
    }
    this.userInfoData['companyAddress']= $("#companyAddress").val();
    this.userInfoData['provinceCode']= $("#provinceCode").val();
    this.userInfoData['provinceName']= $('#provinceCode option:selected').text();
    let provinceCode = $("#cityCode").val();
    if (provinceCode == -1) {
        provinceCode = $("#cityCode2").val();
    }
    if (provinceCode == -1) {
        provinceCode = $("#cityCode1").val();
    }
    this.userInfoData['provinceCode']= provinceCode;
    return this;
};
meiya-common/meiya-common.iml
File was deleted
meiya-common/src/main/java/com/sinata/common/enums/EnumCityRole.java
New file
@@ -0,0 +1,43 @@
package com.sinata.common.enums;
/**
 * 城市管理员
 */
public enum EnumCityRole {
    NOT_ROLE(1, "非城市管理员"),
    PROVINCE_ROLE(2, "省级城市管理员"),
    CITY_ROLE(3, "市级城市管理员"),
    COUNTY_ROLE(4, "区级城市管理员"),
    ;
    public final int index;
    public final String mark;
    EnumCityRole(int index, String mark) {
        this.index = index;
        this.mark = mark;
    }
    public int getIndex() {
        return index;
    }
    public String getMark() {
        return mark;
    }
    /**
     * 通过index查询说明
     */
    public static String getMarkByIndex(Integer index) {
        if (index != null) {
            for (EnumCityRole obj : values()) {
                if (obj.getIndex() == index) {
                    return obj.getMark();
                }
            }
        }
        return null;
    }
}
meiya-common/src/main/java/com/sinata/common/enums/EnumMemberGrade.java
@@ -41,4 +41,16 @@
        }
        return null;
    }
    public static String getAliasByIndex(Integer index) {
        switch (index) {
            case 3:
                return "S";
            case 4:
                return "E";
            case 5:
                return "X";
            default:
                return "Y";
        }
    }
}
meiya-common/src/main/java/com/sinata/common/enums/EnumRedisKey.java
@@ -8,11 +8,11 @@
    EXC_ORDER_TIME("exc_order_time", "每日挂单时间"),
    REDIS_TOKEN_OPEN("redis_token_open", "Redis中token开关"),
    TOKEN("token", "用户token"),
    TOKEN_SHOP("toke_shop", "商户token"),
    TOKEN_SHOP("toke_shop", "门店token"),
    MAP_ACCOUNT_CHECK("map_account_check", "用户账号防爆验证"),
    MAP_MEM_ADMIN_CHECK("map_mem_admin_check", "会员后台账号防爆验证"),
    MAP_EXC_ADMIN_CHECK("map_exc_admin_check", "交易所后台账号防爆验证"),
    MAP_MER_ADMIN_CHECK("map_mer_admin_check", "商家后台账号防爆验证"),
    MAP_MEM_ADMIN_CHECK("map_mem_admin_check", "后台账号防爆验证"),
    MAP_EXC_ADMIN_CHECK("map_exc_admin_check", "后台账号防爆验证"),
    MAP_MER_ADMIN_CHECK("map_mer_admin_check", "门店后台账号防爆验证"),
    ORDER_ID_INDEX("order_id_index", "订单ID序号"),
    WX_CODE("wx_code:", "微信Code"),
    ;
meiya-common/src/main/java/com/sinata/common/model/GroupSpecGoodsSkuJsonVo.java
New file
@@ -0,0 +1,9 @@
package com.sinata.common.model;
import lombok.Data;
@Data
public class GroupSpecGoodsSkuJsonVo {
    private Integer goodsId;
    private Integer goodsNum;
}
meiya-core/meiya-core.iml
File was deleted
meiya-generator/meiya-generator.iml
File was deleted
meiya-rest/meiya-rest.iml
File was deleted
meiya-rest/src/main/java/com/sinata/rest/modular/auth/filter/RequestParameterFilter.java
@@ -1,5 +1,7 @@
package com.sinata.rest.modular.auth.filter;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.google.common.collect.ImmutableSet;
import lombok.extern.slf4j.Slf4j;
@@ -66,7 +68,7 @@
            try {
                // 请求地址
                String url = request.getRequestURL().toString();
                if (!url.endsWith(".css") && !url.endsWith(".js") && !url.endsWith(".ico")
                if (StrUtil.isBlank(FileUtil.getSuffix(url))
                        && !url.contains("/doc.html")
                        && !url.contains("/swagger")
                        && !url.contains("/webjars")
@@ -82,7 +84,7 @@
                        }
                    }
                    log.error(
                    log.debug(
                            "url: " + url + "  method: " + request.getMethod()
                                    + "\nheader: " + JSONUtil.toJsonStr(header)
                                    + "\nparams: " + request.getQueryString()
meiya-rest/src/main/java/com/sinata/rest/modular/mall/controller/MallGoodsController.java
@@ -8,7 +8,6 @@
import com.sinata.rest.common.ApiUtils;
import com.sinata.rest.modular.mall.controller.vo.VoGoods;
import com.sinata.rest.modular.mall.controller.vo.VoGoodsDetail;
import com.sinata.rest.modular.mall.controller.vo.VoGoodsSpec;
import com.sinata.rest.modular.mall.controller.vo.VoGoodsSpecSet;
import com.sinata.rest.modular.mall.model.MallGoods;
import com.sinata.rest.modular.mall.model.MallGoodsSku;
@@ -30,7 +29,6 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@@ -88,7 +86,7 @@
    @ApiOperation(value = "推广商品")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "userId", value = "用户ID", defaultValue = "1", dataType = "Int", paramType = "query", required = true),
            @ApiImplicitParam(name = "cityCode", value = "城市code", defaultValue = "1", dataType = "String", paramType = "query", required = true),
            @ApiImplicitParam(name = "cityCode", value = "城市code", dataType = "String", paramType = "query", required = true),
            @ApiImplicitParam(name = "current", value = "当前页数", defaultValue = "1", dataType = "Int", required = true, paramType = "query"),
            @ApiImplicitParam(name = "size", value = "每页条数", defaultValue = "20", dataType = "Int", required = true, paramType = "query"),
    })
@@ -126,7 +124,7 @@
    @ApiOperation(value = "获取商品适用门店")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "商品ID", dataType = "Int", defaultValue = "1", paramType = "path"),
            @ApiImplicitParam(name = "cityCode", value = "城市code", dataType = "Int", defaultValue = "1", paramType = "query")
            @ApiImplicitParam(name = "cityCode", value = "城市code", dataType = "Int", paramType = "query")
    })
    public ApiUtils<List<MemMerchant>> merchant(@PathVariable("id") Integer id, String cityCode) {
        MallGoods goods = goodsService.getById(id);
meiya-rest/src/main/java/com/sinata/rest/modular/mall/controller/MallOrderController.java
@@ -1,10 +1,8 @@
package com.sinata.rest.modular.mall.controller;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sinata.common.enums.EnumIsDelete;
import com.sinata.common.enums.mall.EnumMallOrderState;
@@ -17,7 +15,10 @@
import com.sinata.rest.modular.mall.controller.vo.VoGoodsSku;
import com.sinata.rest.modular.mall.controller.vo.VoMallOrder;
import com.sinata.rest.modular.mall.controller.vo.VoMallOrderDetail;
import com.sinata.rest.modular.mall.model.*;
import com.sinata.rest.modular.mall.controller.vo.VoMallOrderDetailGroupSpecGoods;
import com.sinata.rest.modular.mall.model.MallOrder;
import com.sinata.rest.modular.mall.model.MallOrderDetail;
import com.sinata.rest.modular.mall.model.MallOrderMain;
import com.sinata.rest.modular.mall.service.*;
import com.sinata.rest.modular.member.model.MemUser;
import com.sinata.rest.modular.member.model.MyCoupon;
@@ -36,7 +37,6 @@
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
 * 订单接口
@@ -76,6 +76,9 @@
    @Autowired
    private IMallGroupSpecService mallGroupSpecService;
    @Autowired
    private IMallOrderDetailGroupSpecService mallOrderDetailGroupSpecService;
    @GetMapping(value = "/list")
    @ApiOperation(value = "获取订单列表", notes = "获取订单列表")
    @ApiImplicitParams({
@@ -114,52 +117,63 @@
            @ApiImplicitParam(name = "orderNo", value = "订单编号", defaultValue = "1", dataType = "String", paramType = "query", required = true),
    })
    public ApiUtils<VoMallOrder> detail(String orderNo) {
        VoMallOrder order = orderService.getOrderByOrderNo(orderNo);
        if (order == null) {
        VoMallOrder o = orderService.getOrderByOrderNo(orderNo);
        if (o == null) {
            return ApiUtils.returnNG(null, "订单信息不存在");
        }
        wrapperVoMallOrder(orderNo, o);
        return ApiUtils.returnOK(o);
    }
    public VoMallOrder wrapperVoMallOrder(String orderNo, VoMallOrder voMallOrder) {
        try {
            order.setOrderCode(QRCodeUtils.crateQRCode(orderNo, 200, 200));
            voMallOrder.setOrderCode(QRCodeUtils.crateQRCode(orderNo, 200, 200));
        } catch (Exception e) {
            e.printStackTrace();
        }
        List<VoMallOrderDetail> detailList = orderService.getOrderDetailByOrderNoList(orderNo);
        for (VoMallOrderDetail od : detailList) {
            List<Integer> groupSpecGoodsIdList = new ArrayList<>();
            MallGoodsSku goodsSku = mallGoodsSkuService.getOne(
                    Wrappers.<MallGoodsSku>query().lambda()
                            .eq(MallGoodsSku::getGoodsId, od.getGoodsId())
                            .eq(MallGoodsSku::getMerchantId, 0)
                            .last("LIMIT 1")
            );
            if (goodsSku != null && StrUtil.isNotBlank(goodsSku.getSpecIds())) {
                String[] specIdArray = goodsSku.getSpecIds().split(",");
                List<MallGroupSpec> groupSpecList = mallGroupSpecService.list(
                        Wrappers.<MallGroupSpec>query().lambda()
                                .in(MallGroupSpec::getId, specIdArray)
                );
                for (MallGroupSpec mallGroupSpec : groupSpecList) {
                    groupSpecGoodsIdList.addAll(
                            Arrays.stream(mallGroupSpec.getGoodsIds().split(",")).map(Integer::parseInt).collect(Collectors.toList())
                    );
                }
            }
            if (groupSpecGoodsIdList != null && groupSpecGoodsIdList.size() > 0) {
                List<MallGoods> groupSpecGoodsList = mallGoodsService.list(
                        Wrappers.<MallGoods>query().lambda()
                                .in(MallGoods::getId, groupSpecGoodsIdList)
                );
                od.setGroupSpecGoodsList(groupSpecGoodsList);
            }
            List<VoMallOrderDetailGroupSpecGoods> voMallOrderDetailGroupSpecGoodsList = mallOrderDetailGroupSpecService.getListByOrderNo(null, od.getOrderDetailNo());
            od.setGroupSpecGoodsList(voMallOrderDetailGroupSpecGoodsList);
//            List<Integer> groupSpecGoodsIdList = new ArrayList<>();
//            MallGoodsSku goodsSku = mallGoodsSkuService.getById(od.getSkuId());
//            if (goodsSku != null && StrUtil.isNotBlank(goodsSku.getSpecIds())) {
//                String[] specIdArray = goodsSku.getSpecIds().split(",");
//                List<MallGroupSpec> groupSpecList = mallGroupSpecService.list(
//                        Wrappers.<MallGroupSpec>query().lambda()
//                                .in(MallGroupSpec::getId, specIdArray)
//                );
//                for (MallGroupSpec mallGroupSpec : groupSpecList) {
//                    groupSpecGoodsIdList.addAll(
//                            Arrays.stream(mallGroupSpec.getGoodsIds().split(",")).map(Integer::parseInt).collect(Collectors.toList())
//                    );
//                }
//            }
//            if (groupSpecGoodsIdList != null && groupSpecGoodsIdList.size() > 0) {
//                List<MallGoods> groupSpecGoodsList = mallGoodsService.list(
//                        Wrappers.<MallGoods>query().lambda()
//                                .in(MallGoods::getId, groupSpecGoodsIdList)
//                );
//                od.setGroupSpecGoodsList(groupSpecGoodsList);
//            }
        }
        order.setDetailList(detailList);
        return ApiUtils.returnOK(order);
        voMallOrder.setDetailList(detailList);
        return voMallOrder;
    }
    @GetMapping(value = "/getOrderDetailGroupSpecGoods")
    @ApiOperation(value = "获取订单套餐规格组商品列表", notes = "获取订单套餐规格组商品列表")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "orderNo", value = "订单编号", dataType = "String", paramType = "query", required = true),
    })
    public ApiUtils<List<VoMallOrderDetailGroupSpecGoods>> getOrderDetailGroupSpecGoods(String orderNo) {
        return ApiUtils.returnOK(mallOrderDetailGroupSpecService.getListByOrderNo(orderNo, null));
    }
    @GetMapping(value = "/getSkuByMerchant")
    @ApiOperation(value = "获取门店sku信息", notes = "获取门店sku信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "skuIds", value = "商品Sku串(逗号分隔)", defaultValue = "1", dataType = "String", paramType = "query", required = true),
            @ApiImplicitParam(name = "skuIds", value = "商品Sku串(逗号分隔)", dataType = "String", paramType = "query", required = true),
            @ApiImplicitParam(name = "merchantId", value = "门店ID", defaultValue = "1", dataType = "String", paramType = "query", required = true),
    })
    public List<VoGoodsSku> getSkuByMerchant(String skuIds, Integer merchantId) {
meiya-rest/src/main/java/com/sinata/rest/modular/mall/controller/vo/VoGoodsSku.java
@@ -42,6 +42,9 @@
    @ApiModelProperty(value = "规格ID")
    private String specGrep;
    @ApiModelProperty(value = "规格属性ids")
    private String specIds;
    @ApiModelProperty(value = "商品图")
    private String imgUrl;
meiya-rest/src/main/java/com/sinata/rest/modular/mall/controller/vo/VoGroupSpecGoods.java
New file
@@ -0,0 +1,48 @@
package com.sinata.rest.modular.mall.controller.vo;
import com.sinata.rest.modular.mall.model.MallOrderDetailGroupSpec;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * <p>
 * 商品列表
 * </p>
 *
 * @ClassName com.sinata.rest.modular.mall.controller.vo.VoGoods
 * @Description 商品列表
 * @Author sl
 * @Date 2023/3/12 17:45
 */
@Data
@ApiModel(value = "套餐规格组商品-响应")
public class VoGroupSpecGoods extends MallOrderDetailGroupSpec {
    @ApiModelProperty(value = "ID")
    private Integer id;
    @ApiModelProperty(value = "商品编号")
    private String goodsNo;
    @ApiModelProperty(value = "商品名称")
    private String goodsName;
    @ApiModelProperty(value = "商品副标题")
    private String goodsTitle;
    @ApiModelProperty(value = "商品列表图")
    private String goodsImage;
    @ApiModelProperty(value = "市场价")
    private BigDecimal price;
    @ApiModelProperty(value = "美天销售价")
    private BigDecimal priceSale;
    @ApiModelProperty(value = "会员价")
    private BigDecimal priceMember;
}
meiya-rest/src/main/java/com/sinata/rest/modular/mall/controller/vo/VoMallOrderDetail.java
@@ -52,11 +52,14 @@
    @ApiModelProperty(value = "门店销售价")
    private BigDecimal priceMerchant;
    @ApiModelProperty(value = "商品SkuId")
    private Integer skuId;
    @ApiModelProperty(value = "商品ID")
    private Integer goodsId;
    @ApiModelProperty(value = "套餐规格商品列表")
    private List<MallGoods> groupSpecGoodsList;
    private List<VoMallOrderDetailGroupSpecGoods> groupSpecGoodsList;
    @ApiModelProperty(value = "商品名称")
    private String goodsName;
meiya-rest/src/main/java/com/sinata/rest/modular/mall/controller/vo/VoMallOrderDetailGroupSpecGoods.java
New file
@@ -0,0 +1,31 @@
package com.sinata.rest.modular.mall.controller.vo;
import com.sinata.rest.modular.mall.model.MallOrderDetailGroupSpec;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@ApiModel(value = "订单详情套餐规格组商品-响应")
public class VoMallOrderDetailGroupSpecGoods extends MallOrderDetailGroupSpec implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "商品编号")
    private String goodsNo;
    @ApiModelProperty(value = "商品名称")
    private String goodsName;
    @ApiModelProperty(value = "商品副标题")
    private String goodsTitle;
    @ApiModelProperty(value = "商品列表图")
    private String goodsImage;
    @ApiModelProperty(value = "市场价")
    private BigDecimal price;
    @ApiModelProperty(value = "美天销售价")
    private BigDecimal priceSale;
    @ApiModelProperty(value = "会员价")
    private BigDecimal priceMember;
}
meiya-rest/src/main/java/com/sinata/rest/modular/mall/dao/MallOrderDetailGroupSpecLogMapper.java
New file
@@ -0,0 +1,16 @@
package com.sinata.rest.modular.mall.dao;
import com.sinata.rest.modular.mall.model.MallOrderDetailGroupSpecLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 * 订单详情套餐规格组商品核销记录 Mapper 接口
 * </p>
 *
 * @author goku
 * @since 2023-11-22
 */
public interface MallOrderDetailGroupSpecLogMapper extends BaseMapper<MallOrderDetailGroupSpecLog> {
}
meiya-rest/src/main/java/com/sinata/rest/modular/mall/dao/MallOrderDetailGroupSpecMapper.java
New file
@@ -0,0 +1,22 @@
package com.sinata.rest.modular.mall.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sinata.rest.modular.mall.controller.vo.VoMallOrderDetailGroupSpecGoods;
import com.sinata.rest.modular.mall.model.MallOrderDetailGroupSpec;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
 * 订单详情套餐规格组商品 Mapper 接口
 * </p>
 *
 * @author goku
 * @since 2023-11-04
 */
public interface MallOrderDetailGroupSpecMapper extends BaseMapper<MallOrderDetailGroupSpec> {
    List<VoMallOrderDetailGroupSpecGoods> getListByOrderNo(@Param("orderNo") String orderNo, @Param("orderDetailNo") String orderDetailNo);
}
meiya-rest/src/main/java/com/sinata/rest/modular/mall/dao/MallOrderMapper.java
@@ -28,7 +28,7 @@
     */
    List<VoMallOrder> getOrderByUserIdList(@Param("userId") Integer userId, @Param("saleUserId") Integer saleUserId, @Param("stateArray") Object[] stateArray);
    List<VoMallOrder> getOrderByUserIdList(@Param("userId") Integer userId, @Param("saleUserId") Integer saleUserId, @Param("state")Integer state, @Param("page") Page page);
    VoMallOrder getOrderByOrderNo(@Param("orderNo") String orderNo);
    List<VoMallOrder> getOrderListByOrderNo(@Param("orderNo") String orderNo);
    /**
     * 获取用户详细订单列表
     */
meiya-rest/src/main/java/com/sinata/rest/modular/mall/dao/mapping/MallCommissionSettlementMonthMapper.xml
@@ -7,10 +7,10 @@
        <id column="id" property="id" />
        <result column="userId" property="userId" />
        <result column="showId" property="showId" />
        <result column="order_no" property="orderNo" />
        <result column="province_code" property="provinceCode" />
        <result column="city_code" property="cityCode" />
        <result column="county_code" property="countyCode" />
        <result column="orderNo" property="orderNo" />
        <result column="provinceCode" property="provinceCode" />
        <result column="cityCode" property="cityCode" />
        <result column="countyCode" property="countyCode" />
        <result column="salesCommissionGoods" property="salesCommissionGoods" />
        <result column="salesCommissionGroup" property="salesCommissionGroup" />
        <result column="manageProfitGoods" property="manageProfitGoods" />
@@ -25,8 +25,6 @@
        <result column="month" property="month" />
        <result column="remark" property="remark" />
    </resultMap>
    <select id="getNotCommissionSettlementList" resultType="com.sinata.rest.modular.mall.model.MallCommissionSettlementMonth">
        SELECT
meiya-rest/src/main/java/com/sinata/rest/modular/mall/dao/mapping/MallGoodsMapper.xml
@@ -55,7 +55,7 @@
    <select id="getGoodsBySkuIdArray" resultType="com.sinata.rest.modular.mall.controller.vo.VoGoodsSku">
        SELECT
            goods.id goods_id, goods.goods_name,goods.goods_image, goods.state, mall_group_spec.start_time, mall_group_spec.end_time, goods.group_type,
            sku.id, sku.sku_id, sku.grep_name, sku.spec_grep, sku.img_url, sku.price, sku.price_sale, sku.price_member, sku.price_merchant, sku.stock, sku.merchant_id,
            sku.id, sku.sku_id, sku.grep_name, sku.spec_grep, sku.spec_ids, sku.img_url, sku.price, sku.price_sale, sku.price_member, sku.price_merchant, sku.stock, sku.merchant_id,
            city.province_code, city.city_code, city.county_code
        FROM mall_goods_sku sku
        LEFT JOIN mall_group_spec ON mall_group_spec.id = sku.spec_ids
@@ -77,7 +77,7 @@
    <select id="getGoodsBySkuIdMerchant" resultType="com.sinata.rest.modular.mall.controller.vo.VoGoodsSku">
        SELECT
            goods.id goods_id, goods.goods_name, goods.state, goods.start_time, goods.end_time, goods.group_type,
            sku.id, sku.sku_id, sku.grep_name, sku.spec_grep, sku.img_url, sku.price, sku.price_sale, sku.price_member, sku.price_merchant, sku.stock, sku.merchant_id,
            sku.id, sku.sku_id, sku.grep_name, sku.spec_grep, sku.spec_ids, sku.img_url, sku.price, sku.price_sale, sku.price_member, sku.price_merchant, sku.stock, sku.merchant_id,
            city.province_code, city.city_code, city.county_code
        FROM mall_goods_sku sku
        LEFT JOIN mall_goods goods ON sku.goods_id = goods.id
meiya-rest/src/main/java/com/sinata/rest/modular/mall/dao/mapping/MallGroupSpecMapper.xml
@@ -7,6 +7,7 @@
        <id column="id" property="id" />
        <result column="spec_name" property="specName" />
        <result column="goods_ids" property="goodsIds" />
        <result column="goods_sku_json" property="goodsSkuJson"/>
        <result column="goods_names" property="goodsNames" />
        <result column="classify_id_one" property="classifyIdOne" />
        <result column="classify_id_two" property="classifyIdTwo" />
meiya-rest/src/main/java/com/sinata/rest/modular/mall/dao/mapping/MallOrderDetailGroupSpecLogMapper.xml
New file
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sinata.rest.modular.mall.dao.MallOrderDetailGroupSpecLogMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.sinata.rest.modular.mall.model.MallOrderDetailGroupSpecLog">
        <id column="id" property="id" />
        <result column="order_no" property="orderNo" />
        <result column="order_detail_no" property="orderDetailNo" />
        <result column="goods_id" property="goodsId" />
        <result column="sku_id" property="skuId" />
        <result column="sku_num" property="skuNum" />
        <result column="group_spec_id" property="groupSpecId" />
        <result column="group_spec_goods_id" property="groupSpecGoodsId" />
        <result column="group_spec_goods_num" property="groupSpecGoodsNum" />
        <result column="group_spec_use" property="groupSpecUse" />
        <result column="is_use" property="isUse" />
        <result column="use_date_time" property="useDateTime" />
        <result column="use_merchant_id" property="useMerchantId" />
    </resultMap>
</mapper>
meiya-rest/src/main/java/com/sinata/rest/modular/mall/dao/mapping/MallOrderDetailGroupSpecMapper.xml
New file
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sinata.rest.modular.mall.dao.MallOrderDetailGroupSpecMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.sinata.rest.modular.mall.model.MallOrderDetailGroupSpec">
        <id column="id" property="id" />
        <result column="order_detail_no" property="orderDetailNo" />
        <result column="order_no" property="orderNo" />
        <result column="goods_id" property="goodsId" />
        <result column="sku_id" property="skuId" />
        <result column="sku_num" property="skuNum" />
        <result column="group_spec_goods_id" property="groupSpecGoodsId" />
        <result column="group_spec_goods_num" property="groupSpecGoodsNum" />
        <result column="group_spec_use" property="groupSpecUse" />
        <result column="is_use" property="isUse" />
        <result column="use_date_time" property="useDateTime" />
        <result column="use_merchant_id" property="useMerchantId" />
    </resultMap>
    <select id="getListByOrderNo" resultType="com.sinata.rest.modular.mall.controller.vo.VoMallOrderDetailGroupSpecGoods">
        SELECT
            o.*,
            goods_no, goods_name, goods_title, goods_image, price, price_sale, price_member
        FROM
            mall_order_detail_group_spec o
            LEFT JOIN mall_goods g ON o.group_spec_goods_id = g.id
        <where>
            <if test="orderNo != null and orderNo != ''">
                AND o.order_no = #{orderNo}
            </if>
            <if test="orderDetailNo != null and orderDetailNo != ''">
                AND o.order_detail_no = #{orderDetailNo}
            </if>
        </where>
    </select>
</mapper>
meiya-rest/src/main/java/com/sinata/rest/modular/mall/dao/mapping/MallOrderMapper.xml
@@ -89,7 +89,7 @@
        ORDER BY o.order_no DESC
    </select>
    <select id="getOrderByOrderNo" resultType="com.sinata.rest.modular.mall.controller.vo.VoMallOrder">
    <select id="getOrderListByOrderNo" resultType="com.sinata.rest.modular.mall.controller.vo.VoMallOrder">
        SELECT
            o.*,
            merchant.id merchant_id,
meiya-rest/src/main/java/com/sinata/rest/modular/mall/job/CityCodeWork.java
@@ -27,7 +27,7 @@
    public void run() {
        List<MemUser> list = memUserService.list(
                Wrappers.<MemUser>query().lambda()
                        .isNull(MemUser::getAgentProvinceCode)
                        .isNull(MemUser::getCityCode)
        );
        for (MemUser u : list) {
            if (StrUtil.isBlank(u.getCityCode())) {
meiya-rest/src/main/java/com/sinata/rest/modular/mall/job/CommissionSettlementMonthWork.java
@@ -24,7 +24,7 @@
    @Scheduled(cron = "0 1 0 1 * *")
    public void run() {
        log.info("佣金月结算");
        mallCommissionSettlementMonthService.commissionSettlemenMonth();
        mallCommissionSettlementMonthService.commissionSettlementMonth();
    }
}
meiya-rest/src/main/java/com/sinata/rest/modular/mall/model/MallGroupSpec.java
@@ -1,13 +1,14 @@
package com.sinata.rest.modular.mall.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Data;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
@@ -39,6 +40,8 @@
     */
    @ApiModelProperty(value = "商品ID串")
    private String goodsIds;
    @ApiModelProperty(value = "商品规格json")
    private String goodsSkuJson;
    /**
     * 商品名串
     */
meiya-rest/src/main/java/com/sinata/rest/modular/mall/model/MallOrderDetailGroupSpec.java
New file
@@ -0,0 +1,105 @@
package com.sinata.rest.modular.mall.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
 * <p>
 * 订单详情套餐规格组商品
 * </p>
 *
 * @author goku
 * @since 2023-11-04
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "订单详情套餐规格组商品")
public class MallOrderDetailGroupSpec extends Model<MallOrderDetailGroupSpec> {
    private static final long serialVersionUID = 1L;
    /**
     * ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    @ApiModelProperty(value = "ID")
    private Integer id;
    /**
     * 子订单编号
     */
    @ApiModelProperty(value = "子订单编号")
    private String orderNo;
    /**
     * 订单详细编号
     */
    @ApiModelProperty(value = "订单详细编号")
    private String orderDetailNo;
    /**
     * 商品ID
     */
    @ApiModelProperty(value = "商品ID")
    private Integer goodsId;
    /**
     * 商品SkuId
     */
    @ApiModelProperty(value = "商品SkuId")
    private Integer skuId;
    /**
     * 商品Sku数量
     */
    @ApiModelProperty(value = "商品Sku数量")
    private Integer skuNum;
    /**
     * 套餐规格组ID
     */
    @ApiModelProperty(value = "套餐规格组ID")
    private Integer groupSpecId;
    /**
     * 套餐规格组商品ID
     */
    @ApiModelProperty(value = "套餐规格组商品ID")
    private Integer groupSpecGoodsId;
    /**
     * 套餐规格组商品数量
     */
    @ApiModelProperty(value = "套餐规格组商品数量")
    private Integer groupSpecGoodsNum;
    /**
     * 套餐规格组商品核销数
     */
    @ApiModelProperty(value = "套餐规格组商品核销数")
    private Integer groupSpecUse;
    /**
     * 是否核销完成,0否,1核销完成
     */
    @ApiModelProperty(value = "是否核销完成,0否,1核销完成")
    private Integer isUse;
    /**
     * 核销时间
     */
    @ApiModelProperty(value = "核销时间")
    private Date useDateTime;
    /**
     * 核销门店
     */
    @ApiModelProperty(value = "核销门店")
    private Integer useMerchantId;
    @Override
    protected Serializable pkVal() {
        return this.id;
    }
}
meiya-rest/src/main/java/com/sinata/rest/modular/mall/model/MallOrderDetailGroupSpecLog.java
New file
@@ -0,0 +1,98 @@
package com.sinata.rest.modular.mall.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Data;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
 * <p>
 * 订单详情套餐规格组商品核销记录
 * </p>
 *
 * @author goku
 * @since 2023-11-22
 */
@Data
@ApiModel(value = "订单详情套餐规格组商品核销记录")
public class MallOrderDetailGroupSpecLog extends Model<MallOrderDetailGroupSpecLog> {
    private static final long serialVersionUID = 1L;
    /**
     * ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    @ApiModelProperty(value = "ID")
    private Integer id;
    /**
     * 子订单编号
     */
    @ApiModelProperty(value = "子订单编号")
    private String orderNo;
    /**
     * 订单详细编号
     */
    @ApiModelProperty(value = "订单详细编号")
    private String orderDetailNo;
    /**
     * 商品ID
     */
    @ApiModelProperty(value = "商品ID")
    private Integer goodsId;
    /**
     * 商品SkuId
     */
    @ApiModelProperty(value = "商品SkuId")
    private Integer skuId;
    /**
     * 商品Sku数量
     */
    @ApiModelProperty(value = "商品Sku数量")
    private Integer skuNum;
    /**
     * 套餐规格组ID
     */
    @ApiModelProperty(value = "套餐规格组ID")
    private Integer groupSpecId;
    /**
     * 套餐规格组商品ID
     */
    @ApiModelProperty(value = "套餐规格组商品ID")
    private Integer groupSpecGoodsId;
    /**
     * 套餐规格组商品数量
     */
    @ApiModelProperty(value = "套餐规格组商品数量")
    private Integer groupSpecGoodsNum;
    /**
     * 套餐规格组商品核销数
     */
    @ApiModelProperty(value = "套餐规格组商品核销数")
    private Integer groupSpecUse;
    /**
     * 是否核销完成,0否,1核销完成
     */
    @ApiModelProperty(value = "是否核销完成,0否,1核销完成")
    private Integer isUse;
    /**
     * 核销时间
     */
    @ApiModelProperty(value = "核销时间")
    private LocalDateTime useDateTime;
    /**
     * 核销门店
     */
    @ApiModelProperty(value = "核销门店")
    private Integer useMerchantId;
    @Override
    protected Serializable pkVal() {
        return this.id;
    }
}
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/IMallCommissionSettlementMonthService.java
@@ -21,6 +21,6 @@
     */
    List<MallCommissionSettlementMonth> getNotCommissionSettlementList(String beginTime, String endTime);
    void commissionSettlemenMonth();
    void commissionSettlementMonth();
}
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/IMallOrderDetailGroupSpecLogService.java
New file
@@ -0,0 +1,16 @@
package com.sinata.rest.modular.mall.service;
import com.sinata.rest.modular.mall.model.MallOrderDetailGroupSpecLog;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * 订单详情套餐规格组商品核销记录 服务类
 * </p>
 *
 * @author goku
 * @since 2023-11-22
 */
public interface IMallOrderDetailGroupSpecLogService extends IService<MallOrderDetailGroupSpecLog> {
}
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/IMallOrderDetailGroupSpecService.java
New file
@@ -0,0 +1,21 @@
package com.sinata.rest.modular.mall.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sinata.rest.modular.mall.controller.vo.VoMallOrderDetailGroupSpecGoods;
import com.sinata.rest.modular.mall.model.MallOrderDetailGroupSpec;
import java.util.List;
/**
 * <p>
 * 订单详情套餐规格组商品 服务类
 * </p>
 *
 * @author goku
 * @since 2023-11-04
 */
public interface IMallOrderDetailGroupSpecService extends IService<MallOrderDetailGroupSpec> {
    List<VoMallOrderDetailGroupSpecGoods> getListByOrderNo(String orderNo, String orderDetailNo);
}
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/IMallOrderService.java
@@ -8,11 +8,13 @@
import com.sinata.rest.modular.mall.controller.vo.VoMallOrderDetail;
import com.sinata.rest.modular.mall.controller.vo.VoMallOrderPayInfo;
import com.sinata.rest.modular.mall.model.MallOrder;
import com.sinata.rest.modular.member.controller.common.body.BodyMallOrderDetailUse;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeoutException;
/**
 * <p>
@@ -29,6 +31,7 @@
     */
    List<VoMallOrder> getOrderByUserIdList(Integer userId, Integer saleUserId, Integer state, Page page);
    VoMallOrder getOrderByOrderNo(String orderNo);
    List<VoMallOrder> getOrderListByOrderNo(String orderNo);
    /**
     * 获取订单详细信息
@@ -101,4 +104,6 @@
     */
    List<VoMallOrder> getNotCommissionSettlementOrderList();
    Boolean use(BodyMallOrderDetailUse body) throws TimeoutException;
}
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/impl/MallCommissionSettlementMonthServiceImpl.java
@@ -3,6 +3,7 @@
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sinata.rest.modular.mall.dao.MallCommissionSettlementMonthMapper;
@@ -44,7 +45,7 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void commissionSettlemenMonth() {
    public void commissionSettlementMonth() {
        // 上月时间
        DateTime lastMonth = DateUtil.offsetMonth(DateUtil.date(), -1);
        String beginLastMonth = DateUtil.beginOfMonth(lastMonth).toString();
@@ -65,10 +66,10 @@
        for (MallCommissionSettlementMonth m : notCommissionSettlementList) {
            for (MemUser u : memUserList) {
                // 匹配用户城市
                if (u.getId().equals(m.getUserId())) {
                    m.setProvinceCode(u.getAgentProvinceCode());
                    m.setCityCode(u.getAgentCityCode());
                    m.setCountyCode(u.getAgentCountyCode());
                if (u.getId().equals(m.getUserId()) && StrUtil.isNotBlank(u.getCityCode())) {
                    m.setProvinceCode(u.getCityCode().substring(0, 2) + "0000");
                    m.setCityCode(u.getCityCode().substring(0, 4) + "00");
                    m.setCountyCode(u.getCityCode());
                    break;
                }
            }
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/impl/MallCommissionSettlementServiceImpl.java
@@ -106,7 +106,7 @@
        // 获取销售人员关系
        MemUserRelation userRelation = memUserRelationService.getById(mallOrder.getSaleUserId());
        if (userRelation == null && StrUtil.isBlank(userRelation.getRelationPath())) {
        if (userRelation == null || StrUtil.isBlank(userRelation.getRelationPath())) {
            log.error("【核销订单-分佣】营销员团队关系{}错误!", userRelation);
            return ApiUtils.returnNG("营销员团队关系错误!");
        }
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/impl/MallOrderDetailGroupSpecLogServiceImpl.java
New file
@@ -0,0 +1,20 @@
package com.sinata.rest.modular.mall.service.impl;
import com.sinata.rest.modular.mall.model.MallOrderDetailGroupSpecLog;
import com.sinata.rest.modular.mall.dao.MallOrderDetailGroupSpecLogMapper;
import com.sinata.rest.modular.mall.service.IMallOrderDetailGroupSpecLogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 * 订单详情套餐规格组商品核销记录 服务实现类
 * </p>
 *
 * @author goku
 * @since 2023-11-22
 */
@Service
public class MallOrderDetailGroupSpecLogServiceImpl extends ServiceImpl<MallOrderDetailGroupSpecLogMapper, MallOrderDetailGroupSpecLog> implements IMallOrderDetailGroupSpecLogService {
}
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/impl/MallOrderDetailGroupSpecServiceImpl.java
New file
@@ -0,0 +1,28 @@
package com.sinata.rest.modular.mall.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sinata.rest.modular.mall.controller.vo.VoMallOrderDetailGroupSpecGoods;
import com.sinata.rest.modular.mall.dao.MallOrderDetailGroupSpecMapper;
import com.sinata.rest.modular.mall.model.MallOrderDetailGroupSpec;
import com.sinata.rest.modular.mall.service.IMallOrderDetailGroupSpecService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * <p>
 * 订单详情套餐规格组商品 服务实现类
 * </p>
 *
 * @author goku
 * @since 2023-11-04
 */
@Service
public class MallOrderDetailGroupSpecServiceImpl extends ServiceImpl<MallOrderDetailGroupSpecMapper, MallOrderDetailGroupSpec> implements IMallOrderDetailGroupSpecService {
    @Override
    public List<VoMallOrderDetailGroupSpecGoods> getListByOrderNo(String orderNo, String orderDetailNo) {
        return this.baseMapper.getListByOrderNo(orderNo, orderDetailNo);
    }
}
meiya-rest/src/main/java/com/sinata/rest/modular/mall/service/impl/MallOrderServiceImpl.java
@@ -1,8 +1,12 @@
package com.sinata.rest.modular.mall.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sinata.common.enums.EnumMemberGrade;
@@ -13,6 +17,7 @@
import com.sinata.common.enums.mall.EnumMallGoodsState;
import com.sinata.common.enums.mall.EnumMallOrderPrefix;
import com.sinata.common.enums.mall.EnumMallOrderState;
import com.sinata.common.model.GroupSpecGoodsSkuJsonVo;
import com.sinata.rest.common.ApiUtils;
import com.sinata.rest.core.util.DailyIncrementIdGenerator;
import com.sinata.rest.core.util.DateUtils;
@@ -25,6 +30,7 @@
import com.sinata.rest.modular.mall.dao.NoticeMapper;
import com.sinata.rest.modular.mall.model.*;
import com.sinata.rest.modular.mall.service.*;
import com.sinata.rest.modular.member.controller.common.body.BodyMallOrderDetailUse;
import com.sinata.rest.modular.member.model.MemMerchant;
import com.sinata.rest.modular.member.model.MemUser;
import com.sinata.rest.modular.member.model.MemUserBankDetail;
@@ -34,6 +40,7 @@
import com.sinata.rest.modular.system.model.AreaCity;
import com.sinata.rest.modular.system.service.ISystemSetService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -42,6 +49,7 @@
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.TimeoutException;
import java.util.stream.Collectors;
/**
@@ -92,6 +100,15 @@
    @Resource
    private DailyIncrementIdGenerator dailyIncrementIdGenerator;
    @Resource
    private IMallOrderDetailGroupSpecService mallOrderDetailGroupSpecService;
    @Resource
    private IMallGroupSpecService mallGroupSpecService;
    @Resource
    private IMallCommissionSettlementService mallCommissionSettlementService;
    @Override
    public List<VoMallOrder> getOrderByUserIdList(Integer userId, Integer saleUserId, Integer state, Page page) {
        return this.baseMapper.getOrderByUserIdList(userId, saleUserId, state, page);
@@ -99,7 +116,13 @@
    @Override
    public VoMallOrder getOrderByOrderNo(String orderNo) {
        return this.baseMapper.getOrderByOrderNo(orderNo);
        List<VoMallOrder> voMallOrderList = this.baseMapper.getOrderListByOrderNo(orderNo);
        return voMallOrderList.stream().findFirst().orElse(null);
    }
    @Override
    public List<VoMallOrder> getOrderListByOrderNo(String orderNo) {
        return this.baseMapper.getOrderListByOrderNo(orderNo);
    }
    @Override
@@ -144,6 +167,13 @@
            MallOrder order = new MallOrder();
            order.setOrderMainNo(orderMain.getOrderNo());
            order.setSaleUserId(body.getSaleUserId());
            // 设置销售人员地区所属区域
            if (order.getSaleUserId() != null) {
                MemUser saleUser = memUserService.getById(order.getSaleUserId());
                if (saleUser != null && StrUtil.isNotBlank(saleUser.getCityCode())) {
                    order.setCityCode(saleUser.getCityCode());
                }
            }
            order.setMerchantId(body.getMerchantId());
            order.setCityCode(body.getCityCode());
            order.setUserId(userId);
@@ -153,7 +183,8 @@
            order.setNumber(body.getNumber());
            order.setState(EnumMallOrderState.WAIT_PAY.index);
            // 生成订单编号
            order.setOrderNo(dailyIncrementIdGenerator.generateId());
            String generateOrderNo = dailyIncrementIdGenerator.generateId();
            order.setOrderNo(generateOrderNo);
            String provinceCode = null;
            String cityCode = null;
@@ -186,7 +217,8 @@
                    // 套餐商品
                    skuVoList.add(o);
                    order.setOrderNo(EnumMallOrderPrefix.GOODS_GROUP_ORDER.index + order.getOrderNo());
                    // 拼接套餐订单编号
                    order.setOrderNo(EnumMallOrderPrefix.GOODS_GROUP_ORDER.index + generateOrderNo);
                }
                order.setOrderType(o.getGroupType());
            }
@@ -199,6 +231,9 @@
            for(BodyMallOrderDetail boSku : body.getSkuList()) {
                for (VoGoodsSku skuVo : skuVoList) {
                    if(skuVo.getId().intValue() == boSku.getSkuId() || skuVo.getSkuId().intValue() == boSku.getSkuId() ) {
                        // 设置订单详情编号
                        String orderDetailNoStr = EnumMallOrderPrefix.ORDER_DETAIL.index + DateUtils.format(new Date(), "yyMMddHHmmSSS") + ToolUtil.getRandomNumber(6);
                        // 判断商品状态是否正常
                        if(skuVo.getState() != EnumMallGoodsState.FOR_SALE.index) {
                            return ApiUtils.returnNG(null, "商品:" + skuVo.getGoodsName() + "," + EnumMallGoodsState.getMarkByIndex(skuVo.getState()));
@@ -235,6 +270,24 @@
                                // 销售价
                                sellCost = skuVo.getPriceMerchant();
                            }
                            // 查询套餐规格组ID
                            MallGroupSpec mallGroupSpec = mallGroupSpecService.getById(skuVo.getSpecIds());
                            List<GroupSpecGoodsSkuJsonVo> groupSpecGoodsSkuJsonVoList = JSONUtil.parseArray(mallGroupSpec.getGoodsSkuJson()).toList(GroupSpecGoodsSkuJsonVo.class);
                            for (GroupSpecGoodsSkuJsonVo groupSpecGoodsSkuJsonVo : groupSpecGoodsSkuJsonVoList) {
                                // 对套餐规格组商品添加记录
                                MallOrderDetailGroupSpec.builder()
                                        .orderNo(order.getOrderNo())
                                        .orderDetailNo(orderDetailNoStr)
                                        .goodsId(skuVo.getGoodsId())
                                        .skuId(skuVo.getId())
                                        .skuNum(boSku.getGoodsNum())
                                        .groupSpecId(mallGroupSpec.getId())
                                        .groupSpecGoodsId(groupSpecGoodsSkuJsonVo.getGoodsId())
                                        .groupSpecGoodsNum(groupSpecGoodsSkuJsonVo.getGoodsNum() * boSku.getGoodsNum())
                                        .build()
                                        .insert();
                            }
                        }
                        // 总金额
@@ -242,17 +295,17 @@
                        // 订单详细信息
                        MallOrderDetail orderDetail = new MallOrderDetail();
                        orderDetail.setOrderDetailNo(EnumMallOrderPrefix.ORDER_DETAIL.index + DateUtils.format(new Date(), "yyMMddHHmmSSS") + ToolUtil.getRandomNumber(6));
                        orderDetail.setOrderDetailNo(orderDetailNoStr);
                        orderDetail.setOrderNo(order.getOrderNo());
                        orderDetail.setTotalMoney(totalMoney);
                        orderDetail.setGoodsId(skuVo.getGoodsId());
                        orderDetail.setSkuId(skuVo.getSkuId());
                        orderDetail.setSkuId(skuVo.getId());
                        orderDetail.setGoodsSku(JSON.toJSONString(skuVo));
                        orderDetail.setSellCost(sellCost);
                        orderDetail.setGoodsNum(boSku.getGoodsNum());
                        orderDetail.setGoodsName(skuVo.getGoodsName());
                        orderDetail.setGrepName(skuVo.getGrepName());
                        orderDetail.setSpecGrep(skuVo.getSpecGrep());
                        orderDetail.setSpecGrep(skuVo.getSpecIds());
                        orderDetail.setGoodsImage(skuVo.getGoodsImage());
                        orderDetail.setProvinceCode(StrUtil.isNotBlank(provinceCode) ? provinceCode : skuVo.getProvinceCode());
                        orderDetail.setCityCode(StrUtil.isNotBlank(cityCode) ? cityCode : skuVo.getCityCode());
@@ -543,4 +596,125 @@
    public List<VoMallOrder> getNotCommissionSettlementOrderList() {
        return this.baseMapper.getNotCommissionSettlementOrderList();
    }
    @Override
    public Boolean use(BodyMallOrderDetailUse body) throws TimeoutException {
        VoMallOrder order = this.getOrderByOrderNo(body.getOrderNo());
        if (Objects.isNull(order)) {
            throw new IllegalArgumentException("错误的订单信息");
        }
        if (!order.getMerchantId().equals(ThreadPoolUtil.getUserId()) && body.getOrderDetailGroupSpecId() == null) {
            throw new IllegalArgumentException("该订单不是此门店的预约订单");
        }
        Long nowTime = System.currentTimeMillis();
        if ((Objects.nonNull(order.getStartTime()) && Objects.nonNull(order.getEndTime())
                && (nowTime.compareTo(order.getEndTime().getTime()) > 0
                || nowTime.compareTo(order.getStartTime().getTime()) < 0))) {
            throw new IllegalArgumentException("未到核销时间");
        }
        if (!order.getState().equals(EnumMallOrderState.WAIT_CHECK.index)
                && !order.getState().equals(EnumMallOrderState.USE.index)) {
            throw new IllegalArgumentException("订单状态无法被核销");
        }
        LambdaQueryWrapper<MallOrderDetail> queryWrapper2 = new LambdaQueryWrapper<>();
        queryWrapper2.eq(MallOrderDetail::getOrderDetailNo, body.getOrderDetailNo());
        MallOrderDetail orderDetail = orderDetailService.getOne(queryWrapper2);
        Integer useNumber = 0;
        // 是否保存核销记录
        Boolean isSaveUse = false;
        if (body.getOrderDetailGroupSpecId() != null) {
            MallOrderDetailGroupSpec orderDetailGroupSpec = mallOrderDetailGroupSpecService.getById(body.getOrderDetailGroupSpecId());
            if (orderDetailGroupSpec == null) {
                throw new TimeoutException("套餐规格组商品信息无效!");
            }
            // 套餐规格组商品核销数
            Integer groupSpecUse = orderDetailGroupSpec.getGroupSpecUse() + body.getUseNum();
            orderDetailGroupSpec.setGroupSpecUse(groupSpecUse);
            if (groupSpecUse.equals(orderDetailGroupSpec.getGroupSpecGoodsNum())) {
                orderDetailGroupSpec.setIsUse(1);
            }
            orderDetailGroupSpec.setUseDateTime(new Date());
            orderDetailGroupSpec.setUseMerchantId(order.getMerchantId());
            // 更新信息
            orderDetailGroupSpec.updateById();
            // 核销记录
            MallOrderDetailGroupSpecLog mallOrderDetailGroupSpecLog = BeanUtil.copyProperties(orderDetailGroupSpec, MallOrderDetailGroupSpecLog.class);
            mallOrderDetailGroupSpecLog.setId(null);
            mallOrderDetailGroupSpecLog.setGroupSpecUse(body.getUseNum());
            mallOrderDetailGroupSpecLog.setIsUse(1);
            mallOrderDetailGroupSpecLog.insert();
            int notUseCount = mallOrderDetailGroupSpecService.count(
                    Wrappers.<MallOrderDetailGroupSpec>query().lambda()
                            .eq(MallOrderDetailGroupSpec::getOrderDetailNo, body.getOrderDetailNo())
                            .eq(MallOrderDetailGroupSpec::getSkuId, orderDetailGroupSpec.getSkuId())
                            .eq(MallOrderDetailGroupSpec::getIsUse, 0)
            );
            if (notUseCount == 0) {
                // 已全部核销,可以保存核销记录
                isSaveUse = true;
                // 重新定义核销数量
                body.setUseNum(orderDetailGroupSpec.getSkuNum());
                useNumber = body.getUseNum();
            }
        } else {
            // 普通商品直接保存记录
            isSaveUse = true;
            useNumber = orderDetail.getUseNum() + body.getUseNum();
            if (useNumber > orderDetail.getGoodsNum()) {
                throw new IllegalArgumentException("核销信息错误请检查");
            }
        }
        if (isSaveUse) {
            // 添加核销记录
            MallOrderDetailUse detailUse = new MallOrderDetailUse();
            BeanUtils.copyProperties(orderDetail, detailUse);
            detailUse.setId(null);
            detailUse.setUseNum(body.getUseNum());
            detailUse.setUseTime(new Date());
            mallOrderDetailUseService.save(detailUse);
        }
        //添加核销时间
        MallOrderDetail updateOrder = new MallOrderDetail();
        updateOrder.setUseNum(useNumber);
        updateOrder.setUseTime(new Date());
        UpdateWrapper<MallOrderDetail> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("order_detail_no", orderDetail.getOrderDetailNo());
        orderDetailService.update(updateOrder, updateWrapper);
        LambdaQueryWrapper<MallOrderDetail> orderWrapper = new LambdaQueryWrapper<>();
        orderWrapper.eq(MallOrderDetail::getOrderNo, body.getOrderNo());
        orderWrapper.last("and use_num <> goods_num");
        List<MallOrderDetail> detailList = orderDetailService.list(orderWrapper);
        if (detailList.size() == 0) {
            //修改订单状态
            MallOrder mallOrder = new MallOrder();
            mallOrder.setState(EnumMallOrderState.SUCCESS.index);
            mallOrder.setOrderNo(orderDetail.getOrderNo());
            this.updateById(mallOrder);
            // 核销订单-分佣
            mallCommissionSettlementService.commissionSettlement(mallOrder.getOrderNo());
        } else {
            //修改订单状态
            MallOrder mallOrder = new MallOrder();
            mallOrder.setState(EnumMallOrderState.USE.index);
            mallOrder.setOrderNo(orderDetail.getOrderNo());
            this.updateById(mallOrder);
        }
        //插入预约通知
        if(Objects.nonNull(order.getMerchantId())){
            noticeMapper.addMerchantNotice(order.getMerchantId(),2,"您有新的核销订单");
        }
        return Boolean.TRUE;
    }
}
meiya-rest/src/main/java/com/sinata/rest/modular/member/controller/UserController.java
@@ -1,6 +1,7 @@
package com.sinata.rest.modular.member.controller;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -270,6 +271,16 @@
        user.setNickName(info.nickname);
        user.setSex(info.gender);
        user.setBirthday(info.birthday);
        if (StrUtil.isNotBlank(info.getCityCode())) {
            String province = StrUtil.sub(info.getCityCode(), 0, 2) + "0000";
            String city = StrUtil.sub(info.getCityCode(), 0, 4) + "00";
            String county = info.getCityCode();
            user.setCityCode(info.getCityCode());
            user.setAgentProvinceCode(province);
            user.setAgentCityCode(city);
            user.setAgentCountyCode(county);
        }
        //  user.setSignature(info.signature);
        // user.setAddress(info.address);
        userService.saveOrUpdate(user);
meiya-rest/src/main/java/com/sinata/rest/modular/member/controller/common/body/BodyMallOrderDetailUse.java
New file
@@ -0,0 +1,25 @@
package com.sinata.rest.modular.member.controller.common.body;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "请求-订单核销")
public class BodyMallOrderDetailUse {
    @TableField("order_no")
    @ApiModelProperty(value = "子订单编号")
    private String orderNo;
    @ApiModelProperty(value = "订单详细编号")
    private String orderDetailNo;
    @ApiModelProperty(value = "核销数量")
    private Integer useNum;
    @ApiModelProperty(value = "套餐规格商品ID")
    private Integer orderDetailGroupSpecId;
}
meiya-rest/src/main/java/com/sinata/rest/modular/member/controller/common/body/BodyUser.java
@@ -23,10 +23,10 @@
    @ApiModelProperty(value = "生日")
    public String birthday;
    /* @ApiModelProperty(value = "个性签名")
    public String signature;
    @ApiModelProperty(value = "注册城市")
    public String cityCode;
    @ApiModelProperty(value = "收货地址")
    /* @ApiModelProperty(value = "收货地址")
    public String address;
   @ApiModelProperty(value = "收款码地址")
meiya-rest/src/main/java/com/sinata/rest/modular/member/dao/mapping/MemMerchantMapper.xml
@@ -126,15 +126,15 @@
        )
    </select>
    <select id="getMerchantOrderList" resultType="com.sinata.rest.modular.mall.controller.vo.VoMallOrder">
        SELECT
        mo.order_no,mo.state,ms.goods_name,mo.goods_money,mo.use_user_id,md.goods_image goodsImage,md.use_time
            mo.*,
            md.goods_image goodsImage, md.use_time,
            ms.goods_name
        FROM
        mall_order mo
        Left JOIN `mall_order_detail` md ON md.order_no = mo.order_no
        Left JOIN mall_goods ms ON ms.id = md.goods_id
            mall_order mo
            Left JOIN `mall_order_detail` md ON md.order_no = mo.order_no
            Left JOIN mall_goods ms ON ms.id = md.goods_id
        WHERE mo.is_delete = 0 and mo.state in (1,2,3)
        <if test="merchantId != null">
            and (mo.merchant_id =  #{merchantId})
meiya-rest/src/main/java/com/sinata/rest/modular/member/service/impl/MemUserServiceImpl.java
@@ -453,12 +453,14 @@
//                        .build().insert();
//            }
//        } else {
            // 添加邀请关系
            MemUserRelation.builder()
                    .id(user.getId())
                    .parentId(shareUserRelation.getId())
                    .relationPath(shareUserRelation.getRelationPath() + "/" + user.getId())
                    .build().insert();
            // 添加更新用户关系
            memUserRelationService.saveOrUpdate(
                    MemUserRelation.builder()
                            .id(user.getId())
                            .parentId(shareUserRelation.getId())
                            .relationPath(shareUserRelation.getRelationPath() + "/" + user.getId())
                            .build()
            );
//        }
        // 订单材料受赠人,0未申请入司
meiya-rest/src/main/java/com/sinata/rest/modular/member/shop/ShopController.java
@@ -1,24 +1,17 @@
package com.sinata.rest.modular.member.shop;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sinata.common.enums.EnumMemberGrade;
import com.sinata.common.enums.mall.EnumMallOrderState;
import com.sinata.rest.common.ApiUtils;
import com.sinata.rest.modular.auth.util.ThreadPoolUtil;
import com.sinata.rest.modular.mall.controller.vo.VoMallOrder;
import com.sinata.rest.modular.mall.controller.vo.VoMallOrderDetail;
import com.sinata.rest.modular.mall.dao.NoticeMapper;
import com.sinata.rest.modular.mall.model.MallOrder;
import com.sinata.rest.modular.mall.model.MallOrderDetail;
import com.sinata.rest.modular.mall.model.MallOrderDetailUse;
import com.sinata.rest.modular.mall.service.IMallCommissionSettlementService;
import com.sinata.rest.modular.mall.service.IMallOrderDetailService;
import com.sinata.rest.modular.mall.service.IMallOrderService;
import com.sinata.rest.modular.member.model.MemUser;
import com.sinata.rest.modular.member.model.MemUserRelation;
import com.sinata.rest.modular.member.controller.common.body.BodyMallOrderDetailUse;
import com.sinata.rest.modular.member.service.IMallOrderDetailUseService;
import com.sinata.rest.modular.member.service.IMemMerchantService;
import com.sinata.rest.modular.member.service.IMemUserRelationService;
@@ -30,12 +23,11 @@
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.*;
import java.util.List;
@Slf4j
@RestController
@@ -90,7 +82,7 @@
    @GetMapping(value = "/detail")
    @ApiOperation(value = "获取订单详细", notes = "获取订单详细", response = VoMallOrder.class)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "orderNo", value = "订单编号", defaultValue = "1", dataType = "String", paramType = "query", required = true),
            @ApiImplicitParam(name = "orderNo", value = "订单编号", dataType = "String", paramType = "query", required = true),
    })
    public Object detail(String orderNo) {
        VoMallOrder order = orderService.getOrderByOrderNo(orderNo);
@@ -105,7 +97,7 @@
//    @PostMapping(value = "/userTest")
//    @ApiOperation(value = "订单-核销分佣test")
//    @ApiImplicitParams({
//            @ApiImplicitParam(name = "orderNo", value = "订单编号", defaultValue = "1", dataType = "String", paramType = "query", required = true),
//            @ApiImplicitParam(name = "orderNo", value = "订单编号", dataType = "String", paramType = "query", required = true),
//    })
//    public Object userTest(String orderNo) {
//        // 核销订单-分佣
@@ -142,73 +134,40 @@
//    }
    @PostMapping(value = "/use")
    @ApiOperation(value = "订单核销", notes = "获取订单详细", response = VoMallOrder.class)
    public Object use(@RequestBody MallOrderDetailUse useDetail) {
        VoMallOrder order = orderService.getOrderByOrderNo(useDetail.getOrderNo());
        if (Objects.isNull(order)) {
            throw new IllegalArgumentException("错误的订单信息");
    @ApiOperation(value = "订单核销", notes = "订单核销", response = VoMallOrder.class)
    public Object use(@RequestBody MallOrderDetailUse orderDetailUse) {
        BodyMallOrderDetailUse body = BeanUtil.toBean(orderDetailUse, BodyMallOrderDetailUse.class);
        try {
            return orderService.use(body);
        } catch (Exception e) {
            return ApiUtils.returnNG(null, e.getMessage());
        }
        if(!order.getMerchantId().equals(ThreadPoolUtil.getUserId())){
            throw new IllegalArgumentException("该订单不是此门店的预约订单");
        }
        Long nowTime = System.currentTimeMillis();
        if ((Objects.nonNull(order.getStartTime()) && Objects.nonNull(order.getEndTime())
                && (nowTime.compareTo(order.getEndTime().getTime()) > 0
                || nowTime.compareTo(order.getStartTime().getTime()) < 0))) {
            throw new IllegalArgumentException("未到核销时间");
        }
        if (!order.getState().equals(EnumMallOrderState.WAIT_CHECK.index)
                && !order.getState().equals(EnumMallOrderState.USE.index)) {
            throw new IllegalArgumentException("订单状态无法被核销");
        }
        LambdaQueryWrapper<MallOrderDetail> queryWrapper2 = new LambdaQueryWrapper<>();
        queryWrapper2.eq(MallOrderDetail::getOrderDetailNo, useDetail.getOrderDetailNo());
        MallOrderDetail orderDetail = orderDetailService.getOne(queryWrapper2);
        Integer useNumber = orderDetail.getUseNum() + useDetail.getUseNum();
        if (useNumber > orderDetail.getGoodsNum()) {
            throw new IllegalArgumentException("核销信息错误请检查");
        }
        //添加核销记录
        MallOrderDetailUse detailUse = new MallOrderDetailUse();
        BeanUtils.copyProperties(orderDetail, detailUse);
        detailUse.setId(null);
        detailUse.setUseNum(useDetail.getUseNum());
        detailUse.setUseTime(new Date());
        mallOrderDetailUseService.save(detailUse);
        //添加核销时间
        MallOrderDetail updateOrder = new MallOrderDetail();
        updateOrder.setUseNum(useNumber);
        updateOrder.setUseTime(new Date());
        UpdateWrapper<MallOrderDetail> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("order_detail_no", orderDetail.getOrderDetailNo());
        orderDetailService.update(updateOrder, updateWrapper);
    }
        LambdaQueryWrapper<MallOrderDetail> orderWrapper = new LambdaQueryWrapper<>();
        orderWrapper.eq(MallOrderDetail::getOrderNo, useDetail.getOrderNo());
        orderWrapper.last("and use_num <> goods_num");
        List<MallOrderDetail> detailList = orderDetailService.list(orderWrapper);
        if (detailList.size() == 0) {
            //修改订单状态
            MallOrder mallOrder = new MallOrder();
            mallOrder.setState(EnumMallOrderState.SUCCESS.index);
            mallOrder.setOrderNo(orderDetail.getOrderNo());
            orderService.updateById(mallOrder);
            // 核销订单-分佣
            mallCommissionSettlementService.commissionSettlement(mallOrder.getOrderNo());
        } else {
            //修改订单状态
            MallOrder mallOrder = new MallOrder();
            mallOrder.setState(EnumMallOrderState.USE.index);
            mallOrder.setOrderNo(orderDetail.getOrderNo());
            orderService.updateById(mallOrder);
    @PostMapping(value = "/useGroup")
    @ApiOperation(value = "套餐订单核销", notes = "套餐订单核销")
    public Object useGroup(@RequestBody BodyMallOrderDetailUse body) {
        try {
            return orderService.use(body);
        } catch (Exception e) {
            return ApiUtils.returnNG(null, e.getMessage());
        }
    }
        //插入预约通知
        if(Objects.nonNull(order.getMerchantId())){
            noticeMapper.addMerchantNotice(order.getMerchantId(),2,"您有新的核销订单");
    @PostMapping(value = "/useGroupBatch")
    @ApiOperation(value = "套餐订单核销(批量)", notes = "套餐订单核销(批量)")
    public Object useGroupBatch(@RequestBody List<BodyMallOrderDetailUse> list) {
        try {
            Boolean use = true;
            for (BodyMallOrderDetailUse body : list) {
                if (use) {
                    use = orderService.use(body);
                }
            }
            return use;
        } catch (Exception e) {
            return ApiUtils.returnNG(null, e.getMessage());
        }
        return Boolean.TRUE;
    }
    @PostMapping(value = "/useList")
meiya-rest/src/test/java/com/sinata/generator/EntityGeneratorGoku.java
@@ -16,7 +16,7 @@
public class EntityGeneratorGoku {
    // 代码生成输出目录
    public static final String outputDir = "D:\\work\\IdeaProjects\\project\\meiya-parent\\meiya-rest\\src\\main\\java";
    public static final String outputDir = "D:\\IdeaProjects\\demo\\springboot-demo\\meiya-parent\\meiya-rest\\src\\main\\java";
    // 数据库配置
    public static final String dbUrl = "jdbc:mysql://140.210.218.57:8306/meiyadb-dev?characterEncoding=utf8&serverTimezone=GMT%2B8";
    public static final String dbUsername = "root";
@@ -48,7 +48,9 @@
//            "mall_goods_set",
//            "mem_user_login",
//            "system_notice",
            "mall_group_spec",
//            "mall_group_spec",
//            "mall_order_detail_group_spec",
            "mall_order_detail_group_spec_log",
    };
    /***************   com.sinata.modular.code.controller.CodeController   获取全部表数组   ***************************
meiya-shop/meiya-shop.iml
File was deleted
meiya-shop/src/main/webapp/WEB-INF/view/mall/mallOrder/mallOrder.html
@@ -47,7 +47,7 @@
                                <#NameCon id="userPhone" name="下单用户手机" />
                            </div>
                            <div class="col-sm-3">
                                <#NameCon id="userNickname" name="下单用户昵称" />
                                <#NameCon id="userNickname" name="客户姓名" />
                            </div>
                        </div>
                        <div class="hidden-xs" id="MallOrderTableToolbar" role="group">
meiya-shop/src/main/webapp/WEB-INF/view/mall/mallOrder/mallOrder_detail.html
@@ -42,7 +42,7 @@
                        </div>
                        <div class="form-group">
                            <div class="col-sm-4">
                                <label class="col-sm-4 control-label">下单用户昵称</label>
                                <label class="col-sm-4 control-label">客户姓名</label>
                                <div class="col-sm-8 form-control-static">
                                    ${item.userNickname}
                                </div>
meiya-shop/src/main/webapp/static/modular/mall/mallOrder/mallOrder.js
@@ -31,7 +31,7 @@
        {title: '商品名称', field: 'goodsName', visible: true, align: 'center', valign: 'middle'},
        {title: '规格组', field: 'grepName', visible: true, align: 'center', valign: 'middle'},
        {title: '数量', field: 'goodsNum', visible: true, align: 'center', valign: 'middle'},
        {title: '下单用户昵称', field: 'userNickname', visible: true, align: 'center', valign: 'middle'},
        {title: '客户姓名', field: 'userNickname', visible: true, align: 'center', valign: 'middle'},
        {title: '下单用户手机', field: 'userPhone', visible: true, align: 'center', valign: 'middle'},
        {title: '下单门店', field: 'merchantName', visible: true, align: 'center', valign: 'middle'},
        {title: '到店核销次数', field: 'useNum', visible: true, align: 'center', valign: 'middle'},