From b64d67ef01e81a857046f19dd556b4e4f0695e1c Mon Sep 17 00:00:00 2001
From: liujie <liujie>
Date: 星期三, 02 八月 2023 16:41:51 +0800
Subject: [PATCH] 后台代码  门店管理

---
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_add.html                            |  163 ++++
 cloud-server-management/src/main/resources/mapper/StoreConfigMapper.xml                                     |    6 
 cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite.js                                |   70 -
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop.html                                |   83 ++
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_imgAll.html                         |  253 ++++++
 cloud-server-management/src/main/webapp/static/modular/system/tShop/tShop_info.js                           |  594 ++++++++++++++
 cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CityClient.java                    |    2 
 cloud-server-management/src/main/java/com/dsh/course/mapper/StoreConfigMapper.java                          |   17 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java      |   40 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/StoreConfigService.java           |   17 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/StoreConfig.java                    |   67 +
 cloud-server-account/src/main/java/com/dsh/account/controller/CityController.java                           |    4 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TShopController.java      |  415 ++++++++++
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TStoreListVo.java                   |   47 +
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/StoreConfigServiceImpl.java  |   21 
 cloud-server-management/src/main/webapp/static/modular/system/tCity/tCity_info.js                           |    6 
 cloud-server-other/src/main/java/com/dsh/other/feignclient/activity/model/QueryUserCouponByIdAndUserId.java |   14 
 cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/QueryUserCouponByIdAndUserId.java    |   14 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_edit.html                           |   73 +
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_img.html                            |   44 +
 cloud-server-management/src/main/webapp/static/modular/system/tShop/tShop.js                                |  429 ++++++++++
 21 files changed, 2,309 insertions(+), 70 deletions(-)

diff --git a/cloud-server-account/src/main/java/com/dsh/account/controller/CityController.java b/cloud-server-account/src/main/java/com/dsh/account/controller/CityController.java
index adeae61..c34017c 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/controller/CityController.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/controller/CityController.java
@@ -67,11 +67,13 @@
 
 
     @PostMapping("/base/city/add")
-    public void add(@RequestBody TCityManager manager){
+    public Integer add(@RequestBody TCityManager manager){
         try {
             cityService.save(manager);
+            return manager.getId();
         }catch (Exception e){
             e.printStackTrace();
+            return null;
         }
     }
 
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/QueryUserCouponByIdAndUserId.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/QueryUserCouponByIdAndUserId.java
new file mode 100644
index 0000000..c16fd2b
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/QueryUserCouponByIdAndUserId.java
@@ -0,0 +1,14 @@
+package com.dsh.activity.feignclient.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class QueryUserCouponByIdAndUserId {
+    private Long id;
+
+    private Integer userId;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CityClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CityClient.java
index 320518d..e6f3f19 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CityClient.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CityClient.java
@@ -13,7 +13,7 @@
     Page<TCityManager> list(CityListQuery listQuery);
 
     @PostMapping("/base/city/add")
-    void add(TCityManager manager);
+    Integer add(TCityManager manager);
 
     @PostMapping("/base/city/getById")
     TCityManager getById(Integer id);
diff --git a/cloud-server-management/src/main/java/com/dsh/course/mapper/StoreConfigMapper.java b/cloud-server-management/src/main/java/com/dsh/course/mapper/StoreConfigMapper.java
new file mode 100644
index 0000000..18de6b1
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/mapper/StoreConfigMapper.java
@@ -0,0 +1,17 @@
+package com.dsh.course.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dsh.guns.modular.system.model.StoreConfig;
+
+/**
+ * <p>
+ * 门店基础配置 Mapper 接口
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-06-14
+ */
+public interface StoreConfigMapper extends BaseMapper<StoreConfig> {
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java
index 40c0273..aa1e0db 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java
@@ -13,12 +13,14 @@
 import com.dsh.course.feignClient.competition.model.GetPeopleQuery;
 import com.dsh.course.feignClient.competition.model.ListQuery;
 import com.dsh.course.feignClient.competition.model.Participant;
+import com.dsh.course.mapper.UserMapper;
 import com.dsh.guns.core.base.controller.BaseController;
 import com.dsh.guns.core.base.tips.SuccessTip;
 import com.dsh.guns.core.common.constant.factory.PageFactory;
 import com.dsh.guns.core.util.ToolUtil;
 import com.dsh.guns.modular.system.model.TCity;
 import com.dsh.guns.modular.system.model.TStore;
+import com.dsh.guns.modular.system.model.User;
 import com.dsh.guns.modular.system.service.ICityService;
 import com.dsh.guns.modular.system.service.IStoreService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,7 +30,9 @@
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import javax.annotation.Resource;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -54,6 +58,9 @@
     private IStoreService storeService;
     @Autowired
     private ICityService cityService;
+
+    @Resource
+    private UserMapper userMapper;
 
 
     /**
@@ -114,7 +121,23 @@
             manager.setProvince(one.getName());
             TCity one1 = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, manager.getCityCode()));
             manager.setCity(one1.getName());
-            cityClient.add(manager);
+            List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getAccount, manager.getPhone()));
+            if(users.size()>0){
+                return "5001";
+            }
+            Integer add = cityClient.add(manager);
+            User user = new User();
+            user.setPhone(manager.getPhone());
+            user.setAccount(manager.getPhone());
+            user.setRoleid(manager.getPhone());
+            user.setRoleid("3");
+            user.setName(manager.getName());
+            user.setPassword(SecureUtil.md5("a123456"));
+            user.setCreatetime(new Date());
+            user.setObjectId(add);
+            user.setObjectType(2);
+            userMapper.insert(user);
+
             return new SuccessTip<>();
         }catch (Exception e){
             e.printStackTrace();
@@ -130,6 +153,17 @@
             manager.setProvince(one.getName());
             TCity one1 = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, manager.getCityCode()));
             manager.setCity(one1.getName());
+            List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getAccount, manager.getPhone()).ne(User::getObjectId,manager.getId()));
+            if(users.size()>0){
+                return "5001";
+            }
+
+                User user = userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getObjectType, 2).eq(User::getObjectId, manager.getId()));
+                user.setAccount(manager.getPhone());
+                user.setName(manager.getName());
+                user.setPhone(manager.getPhone());
+            userMapper.updateById(user);
+
             cityClient.update(manager);
             return new SuccessTip<>();
         }catch (Exception e){
@@ -188,9 +222,7 @@
     @ResponseBody
     public Object pwd(Integer id) {
         try {
-            TCityManager byId = cityClient.getById(id);
-            byId.setPassword(SecureUtil.md5("a123456"));
-            cityClient.update(byId);
+            userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getObjectId,id).eq(User::getObjectType,2));
             return SUCCESS_TIP;
         }catch (Exception e){
             e.printStackTrace();
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TShopController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TShopController.java
new file mode 100644
index 0000000..59b1de2
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TShopController.java
@@ -0,0 +1,415 @@
+package com.dsh.guns.modular.system.controller.code;
+
+import cn.hutool.crypto.SecureUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dsh.course.feignClient.account.CityClient;
+import com.dsh.course.feignClient.account.model.CityListQuery;
+import com.dsh.course.feignClient.account.model.TCityManager;
+import com.dsh.course.feignClient.competition.CompetitionClient;
+import com.dsh.course.feignClient.competition.model.Competition;
+import com.dsh.course.feignClient.competition.model.GetPeopleQuery;
+import com.dsh.course.feignClient.competition.model.Participant;
+import com.dsh.course.mapper.StoreConfigMapper;
+import com.dsh.course.mapper.UserMapper;
+import com.dsh.guns.config.UserExt;
+import com.dsh.guns.core.base.controller.BaseController;
+import com.dsh.guns.core.base.tips.SuccessTip;
+import com.dsh.guns.core.common.constant.factory.PageFactory;
+import com.dsh.guns.core.util.ToolUtil;
+import com.dsh.guns.modular.system.model.*;
+import com.dsh.guns.modular.system.service.ICityService;
+import com.dsh.guns.modular.system.service.IStoreService;
+import com.dsh.guns.modular.system.service.StoreConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 车辆管理控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-05 17:25:12
+ */
+@Controller
+@RequestMapping("/tShop")
+public class TShopController extends BaseController {
+
+    private String PREFIX = "/system/tShop/";
+
+    @Autowired
+    private CompetitionClient competitionClient;
+
+    @Autowired
+    private CityClient cityClient;
+
+    @Autowired
+    private IStoreService storeService;
+    @Autowired
+    private ICityService cityService;
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Resource
+    private StoreConfigService storeConfigService;
+
+
+    /**
+     * 跳转到车辆管理首页
+     */
+    @RequestMapping("")
+    public String index(Model model) {
+        List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
+        model.addAttribute("list",list);
+        String roleid = UserExt.getUser().getRoleid();
+        model.addAttribute("role",roleid);
+        return PREFIX + "TShop.html";
+    }
+
+    /**
+     * 跳转到添加车辆管理
+     */
+    @RequestMapping("/tShop_add")
+    public String tCompetitionAdd(Model model) {
+        List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
+        model.addAttribute("list",list);
+        String roleid = UserExt.getUser().getRoleid();
+        model.addAttribute("role",roleid);
+        return PREFIX + "tShop_add.html";
+    }
+
+
+    /**
+     * 跳转到修改车辆管理
+     */
+    @RequestMapping("/tShop_update/{id}")
+    public String tCityUpdate(@PathVariable Integer id, Model model) {
+        TStore byId = storeService.getById(id);
+        model.addAttribute("item",byId);
+        List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
+        model.addAttribute("list",list);
+        TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, byId.getProvinceCode()));
+        List<TCity> list1 = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId,one.getId()));
+        CityListQuery cityListQuery = new CityListQuery();
+        cityListQuery.setOffset(1);
+        cityListQuery.setLimit(10000);
+        cityListQuery.setCityCode(byId.getCityCode());
+        Page<TCityManager> list2 = cityClient.list(cityListQuery);
+        model.addAttribute("list1",list1);
+        model.addAttribute("list2",list2.getRecords());
+        String roleid = UserExt.getUser().getRoleid();
+        model.addAttribute("role",roleid);
+        model.addAttribute("time",byId.getStartTime()+" - "+byId.getEndTime());
+        User byId1 = userMapper.selectById(byId.getStoreStaffId());
+        model.addAttribute("city",byId1);
+        model.addAttribute("type",1);
+        return PREFIX + "tShop_edit.html";
+    }
+    @RequestMapping("/tShop_info/{id}")
+    public String tCityInfo(@PathVariable Integer id, Model model) {
+        TStore byId = storeService.getById(id);
+        model.addAttribute("item",byId);
+        List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
+        model.addAttribute("list",list);
+        TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, byId.getProvinceCode()));
+        List<TCity> list1 = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId,one.getId()));
+        CityListQuery cityListQuery = new CityListQuery();
+        cityListQuery.setOffset(1);
+        cityListQuery.setLimit(10000);
+        cityListQuery.setCityCode(byId.getCityCode());
+        Page<TCityManager> list2 = cityClient.list(cityListQuery);
+        model.addAttribute("list1",list1);
+        model.addAttribute("list2",list2.getRecords());
+        String roleid = UserExt.getUser().getRoleid();
+        model.addAttribute("role",roleid);
+        model.addAttribute("time",byId.getStartTime()+" - "+byId.getEndTime());
+        User byId1 = userMapper.selectById(byId.getStoreStaffId());
+        model.addAttribute("city",byId1);
+        model.addAttribute("type",0);
+        return PREFIX + "tShop_edit.html";
+    }
+    @RequestMapping("/tShop_gift/{id}")
+    public String tCityGift(@PathVariable Integer id, Model model) {
+        TStore byId = storeService.getById(id);
+        model.addAttribute("welfarePicture",byId.getWelfarePicture());
+        model.addAttribute("id",id);
+        return PREFIX + "tShop_img.html";
+    }
+    @RequestMapping("/tShop_indexSet/{id}")
+    public String tCityIndexSet(@PathVariable Integer id, Model model) {
+        StoreConfig c1 = storeConfigService.getOne(new LambdaQueryWrapper<StoreConfig>().eq(StoreConfig::getStoreId, id).eq(StoreConfig::getType,1));
+        model.addAttribute("c1",c1);
+        StoreConfig c2 = storeConfigService.getOne(new LambdaQueryWrapper<StoreConfig>().eq(StoreConfig::getStoreId, id).eq(StoreConfig::getType,2));
+        model.addAttribute("c2",c2);
+        StoreConfig c3 = storeConfigService.getOne(new LambdaQueryWrapper<StoreConfig>().eq(StoreConfig::getStoreId, id).eq(StoreConfig::getType,3));
+        model.addAttribute("c3",c3);
+        StoreConfig c4 = storeConfigService.getOne(new LambdaQueryWrapper<StoreConfig>().eq(StoreConfig::getStoreId, id).eq(StoreConfig::getType,4));
+        model.addAttribute("c4",c4);
+        StoreConfig c5 = storeConfigService.getOne(new LambdaQueryWrapper<StoreConfig>().eq(StoreConfig::getStoreId, id).eq(StoreConfig::getType,5));
+        model.addAttribute("c5",c5);
+        StoreConfig c6 = storeConfigService.getOne(new LambdaQueryWrapper<StoreConfig>().eq(StoreConfig::getStoreId, id).eq(StoreConfig::getType,6));
+        model.addAttribute("c6",c6);
+        StoreConfig c7 = storeConfigService.getOne(new LambdaQueryWrapper<StoreConfig>().eq(StoreConfig::getStoreId, id).eq(StoreConfig::getType,7));
+        model.addAttribute("c7",c7);
+        StoreConfig c8 = storeConfigService.getOne(new LambdaQueryWrapper<StoreConfig>().eq(StoreConfig::getStoreId, id).eq(StoreConfig::getType,8));
+        model.addAttribute("c8",c8);
+        model.addAttribute("id",id);
+        return PREFIX + "tShop_imgAll.html";
+    }
+
+
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String provinceCode, String cityCode , String name, String phone,String shopName) {
+        Page<TStoreListVo> page = new PageFactory<TStoreListVo>().defaultPage();
+        List<TStoreListVo> list =  storeService.listAll(page,provinceCode,cityCode,name,phone,shopName);
+        for (TStoreListVo tStoreListVo : list) {
+            TCityManager byId = cityClient.getById(tStoreListVo.getCityManagerId());
+            tStoreListVo.setAccount(byId.getName()+"-"+byId.getPhone());
+
+        }
+        page.setRecords(list);
+        return  super.packForBT(page);
+    }
+
+
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object list(TStore tStore,String time,String userName,String userPhone) {
+        try {
+            if(ToolUtil.isNotEmpty(tStore.getProvinceCode())) {
+                TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, tStore.getProvinceCode()));
+                tStore.setProvince(one.getName());
+                TCity one1 = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, tStore.getCityCode()));
+                tStore.setCity(one1.getName());
+            }
+            tStore.setStartTime(time.split(" - ")[0]);
+            tStore.setEndTime(time.split(" - ")[1]);
+            tStore.setState(1);
+            User user = new User();
+            List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getAccount, userPhone));
+            if(users.size()>0){
+                return "5001";
+            }
+            user.setAccount(userPhone);
+            user.setName(userName);
+            user.setRoleid("2");
+            user.setPhone(userPhone);
+            user.setPassword(SecureUtil.md5("a123456"));
+            userMapper.insert(user);
+            tStore.setStoreStaffId(user.getId());
+            storeService.save(tStore);
+
+            ArrayList<StoreConfig> storeConfigs = new ArrayList<>();
+            for (int i = 1; i < 9; i++) {
+                StoreConfig storeConfig = new StoreConfig();
+                storeConfig.setIsOpen(1);
+                storeConfig.setSort(i);
+                storeConfig.setType(i);
+                storeConfig.setStoreId(tStore.getId());
+                storeConfigs.add(storeConfig);
+            }
+            storeConfigService.saveBatch(storeConfigs);
+            return new SuccessTip<>();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TStore tStore,String time,String userName,String userPhone) {
+        try {
+            TStore byId = storeService.getById(tStore.getId());
+
+            if(ToolUtil.isNotEmpty(tStore.getProvinceCode())) {
+                TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, tStore.getProvinceCode()));
+                tStore.setProvince(one.getName());
+                TCity one1 = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, tStore.getCityCode()));
+                tStore.setCity(one1.getName());
+            }
+            tStore.setStartTime(time.split(" - ")[0]);
+            tStore.setEndTime(time.split(" - ")[1]);
+            if(ToolUtil.isEmpty(tStore.getCoverDrawing())){
+                tStore.setCoverDrawing(byId.getCoverDrawing());
+            }
+            User user = userMapper.selectById(byId.getStoreStaffId());
+            List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getAccount, userPhone).ne(User::getId,tStore.getStoreStaffId()));
+            if(users.size()>0){
+                return "5001";
+            }
+            user.setAccount(userPhone);
+            user.setName(userName);
+            user.setPhone(userPhone);
+            userMapper.updateById(user);
+            storeService.updateById(tStore);
+            return new SuccessTip<>();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+    @RequestMapping(value = "/onChange")
+    @ResponseBody
+    public Object onChange(Integer oneId) {
+        try {
+            TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, oneId));
+            return cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId,one.getId()));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+    @RequestMapping(value = "/saveImgAll")
+    @ResponseBody
+    public Object saveImgAll(Integer id,Integer px1,Integer px2,Integer px3,Integer px4,Integer px5,Integer px6,Integer px7,Integer px8,
+                             String c1,String c2,String c3,String c4,String c5,String c6,String c7,String c8,
+                             Integer r1,Integer r2,Integer r3,Integer r4,Integer r5,Integer r6,Integer r7,Integer r8) {
+        try {
+            ArrayList<StoreConfig> storeConfigs = new ArrayList<>();
+            StoreConfig collect1 = collect(id, px1, r1, c1, 1);
+            StoreConfig collect2 = collect(id, px2, r2, c2, 2);
+            StoreConfig collect3 = collect(id, px3, r3, c3, 3);
+            StoreConfig collect4 = collect(id, px4, r4, c4, 4);
+            StoreConfig collect5 = collect(id, px5, r5, c5, 5);
+            StoreConfig collect6 = collect(id, px6, r6, c6, 6);
+            StoreConfig collect7 = collect(id, px7, r7, c7, 7);
+            StoreConfig collect8 = collect(id, px8, r8, c8, 8);
+            storeConfigs.add(collect1);
+            storeConfigs.add(collect2);
+            storeConfigs.add(collect3);
+            storeConfigs.add(collect4);
+            storeConfigs.add(collect5);
+            storeConfigs.add(collect6);
+            storeConfigs.add(collect7);
+            storeConfigs.add(collect8);
+            storeConfigService.updateBatchById(storeConfigs);
+            return new SuccessTip<>();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+
+    private StoreConfig collect(Integer id,Integer sort,Integer isOpen,String img,int type){
+        StoreConfig one = storeConfigService.getOne(new LambdaQueryWrapper<StoreConfig>().eq(StoreConfig::getStoreId, id).eq(StoreConfig::getType, type));
+        one.setSort(sort);
+        one.setIsOpen(isOpen);
+        if(ToolUtil.isNotEmpty(img)){
+            one.setBackgroundImage(img);
+        }
+        return one;
+    }
+    @RequestMapping(value = "/oneChangeNext")
+    @ResponseBody
+    public Object oneChangeNext(String oneId) {
+
+        try {
+            CityListQuery cityListQuery = new CityListQuery();
+            cityListQuery.setCityCode(oneId);
+            cityListQuery.setOffset(1);
+            cityListQuery.setLimit(100000);
+            Page<TCityManager> list = cityClient.list(cityListQuery);
+            List<TCityManager> records = list.getRecords();
+            for (TCityManager record : records) {
+                record.setName(record.getName()+"-"+record.getPhone());
+            }
+            return records;
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+
+
+    @RequestMapping(value = "/cancel")
+    public Object cancel(Integer id) {
+        try {
+            competitionClient.cancel(id);
+            return SUCCESS_TIP;
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+
+    @RequestMapping(value = "/saveImg")
+    @ResponseBody
+    public Object saveImg(Integer id,String img) {
+        try {
+            TStore byId = storeService.getById(id);
+            byId.setWelfarePicture(img);
+            storeService.updateById(byId);
+            return SUCCESS_TIP;
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+
+    @RequestMapping(value = "/freeze")
+    @ResponseBody
+    public Object freeze(Integer id) {
+        try {
+            TStore byId = storeService.getById(id);
+            byId.setState(2);
+            storeService.updateById(byId);
+            return SUCCESS_TIP;
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+    @RequestMapping(value = "/unfreeze")
+    @ResponseBody
+    public Object unfreeze(Integer id) {
+        try {
+            TStore byId = storeService.getById(id);
+            byId.setState(1);
+            storeService.updateById(byId);
+            return SUCCESS_TIP;
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+
+    @RequestMapping(value = "/pwd")
+    @ResponseBody
+    public Object pwd(Integer id) {
+        try {
+            TStore byId = storeService.getById(id);
+            User user = userMapper.selectById(byId.getStoreStaffId());
+            user.setPassword(SecureUtil.md5("a123456"));
+            userMapper.updateById(user);
+            return SUCCESS_TIP;
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+
+    @RequestMapping(value = "/getPeopleFromId")
+    public Object getPeopleFromId(Integer id,Integer state) {
+        try {
+            Page<Object> page = new PageFactory<>().defaultPage();
+            Page<Participant> data =   competitionClient.getPeopleFromId(new GetPeopleQuery(page.getSize(),page.getCurrent(),id,state));
+            return  super.packForBT(data);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+
+
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/StoreConfig.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/StoreConfig.java
new file mode 100644
index 0000000..e69c697
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/StoreConfig.java
@@ -0,0 +1,67 @@
+package com.dsh.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 门店基础配置
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-06-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("t_store_config")
+public class StoreConfig extends Model<StoreConfig> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 门店id
+     */
+    @TableField("storeId")
+    private Integer storeId;
+    /**
+     * 数据类型(1=报名玩湃课程,2=预约场地,3=报名赛事及活动,4=免费福利,5=线上课程积分,6=购买优惠门票,7=看视频得奖励,8=智慧球场)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 是否开启(0=否,1=是)
+     */
+    @TableField("isOpen")
+    private Integer isOpen;
+    /**
+     * 排序
+     */
+    @TableField("sort")
+    private Integer sort;
+    /**
+     * 背景图
+     */
+    @TableField("backgroundImage")
+    private String backgroundImage;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TStoreListVo.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TStoreListVo.java
new file mode 100644
index 0000000..d116d3e
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TStoreListVo.java
@@ -0,0 +1,47 @@
+package com.dsh.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@TableName("t_store")
+@Data
+public class TStoreListVo {
+    private Integer id;
+    private String name;
+    @TableField("storeStaffId")
+    private Integer storeStaffId;
+    @TableField("cityManagerId")
+    private Integer cityManagerId;
+    private String province;
+    @TableField("provinceCode")
+    private String provinceCode;
+    private String city;
+    @TableField("cityCode")
+    private String cityCode;
+    private String phone;
+    private String address;
+    private String lat;
+    private String lon;
+    @TableField("startTime")
+    private String startTime;
+    @TableField("endTime")
+    private String endTime;
+    @TableField("coverDrawing")
+    private String coverDrawing;
+    @TableField("realPicture")
+    private String realPicture;
+    private String introduce;
+    @TableField("welfarePicture")
+    private String welfarePicture;
+    private BigDecimal score;
+    private Integer state;
+
+    private String userName;
+    private String userPhone;
+
+    private String account;
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/StoreConfigService.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/StoreConfigService.java
new file mode 100644
index 0000000..1bd1d96
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/StoreConfigService.java
@@ -0,0 +1,17 @@
+package com.dsh.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dsh.guns.modular.system.model.StoreConfig;
+
+
+/**
+ * <p>
+ * 门店基础配置 服务类
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-06-14
+ */
+public interface StoreConfigService extends IService<StoreConfig> {
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/StoreConfigServiceImpl.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/StoreConfigServiceImpl.java
new file mode 100644
index 0000000..892e3d9
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/StoreConfigServiceImpl.java
@@ -0,0 +1,21 @@
+package com.dsh.guns.modular.system.service.impl;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dsh.course.mapper.StoreConfigMapper;
+import com.dsh.guns.modular.system.model.StoreConfig;
+import com.dsh.guns.modular.system.service.StoreConfigService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 门店基础配置 服务实现类
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-06-14
+ */
+@Service
+public class StoreConfigServiceImpl extends ServiceImpl<StoreConfigMapper, StoreConfig> implements StoreConfigService {
+
+}
diff --git a/cloud-server-management/src/main/resources/mapper/StoreConfigMapper.xml b/cloud-server-management/src/main/resources/mapper/StoreConfigMapper.xml
new file mode 100644
index 0000000..9a75a68
--- /dev/null
+++ b/cloud-server-management/src/main/resources/mapper/StoreConfigMapper.xml
@@ -0,0 +1,6 @@
+<?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.dsh.course.mapper.StoreConfigMapper">
+
+
+</mapper>
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop.html
new file mode 100644
index 0000000..bed4675
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop.html
@@ -0,0 +1,83 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+
+            <div class="ibox-title">
+                <h5>门店管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            @if(role=='1'){
+                            <div class="col-sm-3">
+                                <div class="input-group">
+                                    <div class="input-group-btn open">
+                                        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button" aria-expanded="true">
+                                            所在省
+                                        </button>
+                                    </div>
+                                    <select class="form-control" id="pCode" onchange="TCompetition.oneChange(this)">
+                                        <option value="">全部</option>
+                                        @for(obj in list){
+                                        <option value="${obj.code}">${obj.name}</option>
+                                        @}
+                                    </select>
+                                </div>
+                            </div>
+                            @}
+                            @if(role=='1'){
+                            <div class="col-sm-3">
+                                <div class="input-group">
+                                <div class="input-group-btn open">
+                                    <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button" aria-expanded="true">
+                                        所在市
+                                    </button>
+                                </div>
+                                <select class="form-control" id="cCode">
+                                </select>
+                                 </div>
+                            </div>
+                            @}
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="店长姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="phone" name="店长手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="shopName" name="门店名称" />
+                            </div>
+                    <div class="col-sm-3">
+                        <#button name="搜索" icon="fa-search" clickFun="TCompetition.search()"/>
+                        <#button name="重置" icon="fa-trash" clickFun="TCompetition.resetSearch()" space="true"/>
+                    </div>
+                </div>
+                <div class="hidden-xs" id="TCompetitionTableToolbar" role="group">
+                    <#button name="添加" icon="fa-plus" clickFun="TCompetition.openAddTCompetition()"/>
+                    <#button name="编辑" icon="fa-edit" clickFun="TCompetition.openTCompetitionDetail()" space="true"/>
+                    <#button name="冻结" icon="fa-remove" clickFun="TCompetition.freeze()" space="true"/>
+                    <#button name="解冻" icon="fa-remove" clickFun="TCompetition.unfreeze()" space="true"/>
+                    <#button name="查看详情" icon="fa-remove" clickFun="TCompetition.info()" space="true"/>
+                    <#button name="重置密码" icon="fa-remove" clickFun="TCompetition.reload()" space="true"/>
+                    <#button name="免费福利" icon="fa-remove" clickFun="TCompetition.gift()" space="true"/>
+                    <#button name="首页设置" icon="fa-remove" clickFun="TCompetition.indexSet()" space="true"/>
+
+                </div>
+                <#table id="TCompetitionTable"/>
+            </div>
+        </div>
+    </div>
+</div>
+</div>
+</div>
+<script src="${ctxPath}/modular/system/tShop/tShop.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+        ,lang:"en"
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_add.html
new file mode 100644
index 0000000..7d19df7
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_add.html
@@ -0,0 +1,163 @@
+@layout("/common/_container.html"){
+<style>
+    .avatar-uploader .el-upload {
+        border: 1px dashed #d9d9d9;
+        border-radius: 6px;
+        cursor: pointer;
+        position: relative;
+        height: 100px;
+        width: 100px;
+        overflow: hidden;
+    }
+
+    .avatar-uploader .el-upload:hover {
+        border-color: #409EFF;
+    }
+    .avatar-uploader-icon {
+        font-size: 28px;
+        color: #8c939d;
+        width: 100px;
+        height: 100px;
+        line-height: 100px;
+        margin-top: 32px;
+        text-align: center;
+    }
+    .avatar {
+        width: 100px;
+        height: 100px;
+        display: block;
+    }
+
+    .col-sm-12 {
+        margin-top: 20px;
+    }
+
+    .col-sm-12 select {
+        height: 33px;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+
+
+        <div class="form-horizontal" id="carInfoForm">
+            <input hidden id="role" value="${role}">
+            <div class="form-group" id="provinceCode">
+                <label class="col-sm-3 control-label">所在省:</label>
+                <div class="col-sm-9">
+                    <select class="form-control" id="pCode" name="pCode" onchange="TCarInfoDlg.oneChange(this)">
+                        <option value="">选择省</option>
+                        @for(obj in list){
+                        <option value="${obj.code}">${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+            <div class="form-group" id="cityCode">
+                <label class="col-sm-3 control-label">所在市:</label>
+                <div class="col-sm-9">
+                    <select class="form-control" id="cCode" name="cCode" onchange="TCarInfoDlg.oneChangeNext(this)">
+                        <option value="">选择市</option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">所属账号:</label>
+                <div class="col-sm-9">
+                    <select class="form-control" id="account" name="account">
+                        <option value="">选择账号</option>
+                    </select>
+                </div>
+            </div>
+        <#input id="name" name="门店名称" type="text"/>
+        <#input id="phone" name="联系电话" type="text"/>
+        <#input id="address" name="门店地址" type="text"/>
+        <#input id="time" name="营业时间" type="text"/>
+        <#input id="intro" name="门店介绍" type="text"/>
+        <#input id="userName" name="店长姓名" type="text"/>
+        <#input id="userPhone" name="店长手机号" type="text"/>
+        <#avatar id="img" name="门店封面(推荐像素722*360px)" />
+            <div class="row" id="app1">
+                <div class="col-sm-6" style="width: 100%">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label" style="width: 15%;margin-left: 5%">*实景图片(请上传不超过五张图片): </label>
+                        <div class="col-sm-2" style="width: 100%;margin-left: 11%;margin-top: 1%">
+                            <el-upload
+                                    :limit="5"
+                                    class="avatar-uploader"
+                                    action="/tCouponManage/uploadPic"
+                                    list-type="picture-card"
+                                    accept="."
+                                    :on-success="handleAvatarSuccess"
+                                    :on-remove="handleRemove">
+                                <i class="el-icon-plus"></i>
+                            </el-upload>
+                            <el-dialog :visible.sync="dialogVisible">
+                                <img width="100%" :src="imageUrl1" alt="">
+                        </div>
+                    </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="TCarInfoDlg.addSubmit()"/>
+        <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCarInfoDlg.close()"/>
+    </div>
+</div>
+
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/tShop/tShop_info.js"></script>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+<script>
+    laydate.render({
+        elem: '#time',
+        range:true
+    });
+
+    var vue2 = new Vue({
+        el: '#app1',
+        props: {
+            // 数量限制
+            limit: {
+                type: Number,
+                default: 2
+            },
+        },
+        data: {
+            autoUpload: true,//自动上传
+            imageUrl1: '',//模型数据,用于上传图片完成后图片预览
+            dialogVisible: false
+        },
+        methods: {
+            handleAvatarSuccess(res, file) {
+                couponInfoDlg.goodsPicArray.push(file);
+            },
+            beforeAvatarUpload(file) {
+                const isLt2M = file.size / 1024 / 1024 < 10;
+                if (!isLt2M) {
+                    this.$message.error('上传图片大小不能超过 10MB!');
+                }
+                return isLt2M;
+            },
+            handleRemove(file, fileList) {
+                couponInfoDlg.goodsPicArray = couponInfoDlg.goodsPicArray.filter(item => {
+                    return item.uid != file.uid;
+                });
+            },
+        },
+        created() {
+        },
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_edit.html
new file mode 100644
index 0000000..e92282e
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_edit.html
@@ -0,0 +1,73 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+
+        <div class="form-horizontal" id="carInfoForm">
+            <input hidden id="id" value="${item.id}">
+            <div class="form-group" id="provinceCode">
+                <label class="col-sm-3 control-label">所在省:</label>
+                <div class="col-sm-9">
+                    <select class="form-control" id="pCode" name="pCode" onchange="TCarInfoDlg.oneChange(this)">
+                        <option value="">选择省</option>
+                        @for(obj in list){
+                        <option value="${obj.code}" ${obj.code == item.provinceCode ? 'selected=selected' : ''}>${obj.name}</option>
+                        <option value="${obj.code}">${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+            <div class="form-group" id="cityCode">
+                <label class="col-sm-3 control-label">所在市:</label>
+                <div class="col-sm-9">
+                    <select class="form-control" id="cCode" name="cCode"  onchange="TCarInfoDlg.oneChangeNext(this)">
+                        <option value="">选择市</option>
+                        @for(obj in list1){
+                        <option value="${obj.code}" ${obj.code == item.cityCode ? 'selected=selected' : ''}>${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+            <div class="form-group" >
+                <label class="col-sm-3 control-label">所属账号:</label>
+                <div class="col-sm-9">
+                    <select class="form-control" id="account" name="account">
+                        <option value="">选择账号</option>
+                        @for(obj in list2){
+                        <option value="${obj.id}" ${obj.id == item.cityManagerId ? 'selected=selected' : ''}>${obj.name}-${obj.phone}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+            <#input id="name" name="门店名称" type="text" value="${item.name}"/>
+            <#input id="phone" name="联系电话" type="text" value="${item.phone}"/>
+            <#input id="address" name="门店地址" type="text" value="${item.address}"/>
+            <#input id="time" name="营业时间" type="text" value="${time}"/>
+            <#input id="intro" name="门店介绍" type="text" value="${item.introduce}"/>
+            <#input id="userName" name="管理员姓名" type="text" value="${city.name}"/>
+            <#input id="userPhone" name="管理员手机号" type="text" value="${city.account}"/>
+            <#avatar id="img" name="门店封面(推荐像素722*360px)" avatarImg="${item.coverDrawing}"/>
+            <#input id="imgOne" name="实景照片" type="text" value="${item.realPicture}"/>
+
+
+        </div>
+        <div class="row btn-group-m-t">
+            <div class="col-sm-10 col-sm-offset-5">
+                @if(type==1){
+                <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCarInfoDlg.editSubmit()"/>
+                @}
+                <#button btnCss="danger" name="关闭" id="cancel" icon="fa-eraser" clickFun="TCarInfoDlg.close()"/>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/tShop/tShop_info.js"></script>
+<script>
+    laydate.render({
+        elem: '#time',
+        range:true
+    });
+</script>
+<script type="application/javascript">
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_img.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_img.html
new file mode 100644
index 0000000..1cff518
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_img.html
@@ -0,0 +1,44 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+
+        <div class="form-horizontal" id="carInfoForm">
+            <input hidden id="id" value="${id}">
+            @if(welfarePicture==null){
+            <#avatar id="welfarePicture" name="福利图片"/>
+            @}
+            @if(welfarePicture!=null){
+            <#avatar id="welfarePicture" name="福利图片" avatarImg="${welfarePicture}"/>
+            @}
+            @if(welfarePicture==12321){
+            <div class="form-group">
+                <div class="col-sm-4">
+                    <div id="welfarePicturePreId">
+                        <div><img width="700px" height="800px" id="img" src="${welfarePicture}" ></div>
+                    </div>
+                </div>
+
+                <input type="hidden" id="welfarePicture">
+            </div>
+            <div class="col-sm-2" style="margin-left: 280px">
+                <div class="head-scu-btn upload-btn webuploader-container" id="welfarePictureBtnId"><div class="webuploader-pick">
+                    <i class="fa fa-upload"></i>&nbsp;Upload
+                </div><div id="rt_rt_1h6lka0hk9mucj87vf1t21qk31" style="position: absolute; inset: 0px auto auto 0px; width: 82px; height: 28px; overflow: hidden;"><input type="file" name="file" class="webuploader-element-invisible" accept="image/gif,image/jpg,image/jpeg,image/bmp,image/png"><label style="opacity: 0; width: 100%; height: 100%; display: block; cursor: pointer; background: rgb(255, 255, 255);"></label></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="TCarInfoDlg.saveImg()"/>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/tShop/tShop_info.js"></script>
+<script>
+</script>
+<script type="application/javascript">
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_imgAll.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_imgAll.html
new file mode 100644
index 0000000..9a40637
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_imgAll.html
@@ -0,0 +1,253 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+
+        <div class="form-horizontal" id="carInfoForm">
+            <input hidden id="id" value="${id}">
+            <input hidden id="s1" value="${c1.isOpen}">
+            <input hidden id="s2" value="${c2.isOpen}">
+            <input hidden id="s3" value="${c3.isOpen}">
+            <input hidden id="s4" value="${c4.isOpen}">
+            <input hidden id="s5" value="${c5.isOpen}">
+            <input hidden id="s6" value="${c6.isOpen}">
+            <input hidden id="s7" value="${c7.isOpen}">
+            <input hidden id="s8" value="${c8.isOpen}">
+            <div class="row">
+                <div class="col-lg-6" style="">
+                    <div class="form-group" style="margin-left: 96px">
+                        <label class="col-sm-4 control-label" >
+                              报名玩湃课程:<input type="radio" name="r1" value="1">开启 <input type="radio" name="r1" value="0">关闭
+                        </label>
+                    </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">排序:</label>
+                    <div class="col-sm-9">
+                        <input class="form-control"  style="width: 200px;"  type="text" id="px1" value="${c1.sort}">
+                    </div>
+                </div>
+                @if(c1==null){
+                <#avatar id="c1" name="背景图" />
+                @}
+                @if(c1!=null){
+                <#avatar id="c1" name="背景图" avatarImg="${c1.backgroundImage}"/>
+                @}
+                </div>
+                <div class="col-lg-6" style="">
+                    <div class="form-group" style="margin-left: 96px">
+                        <label class="col-sm-4 control-label" >
+                            预约场地:<input type="radio" name="r2" value="1">开启 <input type="radio" name="r2" value="0">关闭
+                        </label>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">排序:</label>
+                        <div class="col-sm-9">
+                            <input class="form-control"  style="width: 200px;"  type="text" id="px2" value="${c2.sort}">
+                        </div>
+                    </div>
+                    @if(c2==null){
+                    <#avatar id="c2" name="背景图" />
+                    @}
+                    @if(c2!=null){
+                    <#avatar id="c2" name="背景图" avatarImg="${c2.backgroundImage}"/>
+                    @}
+                </div>
+            </div>
+
+
+
+            <div class="row">
+                <div class="col-lg-6" style="">
+                    <div class="form-group" style="margin-left: 96px">
+                        <label class="col-sm-4 control-label" >
+                            报名赛事及活动:<input type="radio" name="r3" value="1">开启 <input type="radio" name="r3" value="0">关闭
+                        </label>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">排序:</label>
+                        <div class="col-sm-9">
+                            <input class="form-control"  style="width: 200px;"  type="text" id="px3" value="${c3.sort}">
+                        </div>
+                    </div>
+                    @if(c3==null){
+                    <#avatar id="c3" name="背景图" />
+                    @}
+                    @if(c3!=null){
+                    <#avatar id="c3" name="背景图" avatarImg="${c3.backgroundImage}"/>
+                    @}
+                </div>
+                <div class="col-lg-6" style="">
+                    <div class="form-group" style="margin-left: 96px">
+                        <label class="col-sm-4 control-label" >
+                            免费福利:<input type="radio" name="r4" value="1">开启 <input type="radio" name="r4" value="0">关闭
+                        </label>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">排序:</label>
+                        <div class="col-sm-9">
+                            <input class="form-control"  style="width: 200px;"  type="text" id="px4" value="${c4.sort}">
+                        </div>
+                    </div>
+                    @if(c4==null){
+                    <#avatar id="c4" name="背景图" />
+                    @}
+                    @if(c4!=null){
+                    <#avatar id="c4" name="背景图" avatarImg="${c4.backgroundImage}"/>
+                    @}
+                </div>
+            </div>
+
+
+
+            <div class="row">
+                <div class="col-lg-6" style="">
+                    <div class="form-group" style="margin-left: 96px">
+                        <label class="col-sm-4 control-label" >
+                            线上课得积分:<input type="radio" name="r5" value="1">开启 <input type="radio" name="r5" value="0">关闭
+                        </label>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">排序:</label>
+                        <div class="col-sm-9">
+                            <input class="form-control"  style="width: 200px;"  type="text" id="px5" value="${c5.sort}">
+                        </div>
+                    </div>
+                    @if(c5==null){
+                    <#avatar id="c5" name="背景图" />
+                    @}
+                    @if(c5!=null){
+                    <#avatar id="c5" name="背景图" avatarImg="${c5.backgroundImage}"/>
+                    @}
+                </div>
+                <div class="col-lg-6" style="">
+                    <div class="form-group" style="margin-left: 96px">
+                        <label class="col-sm-4 control-label" >
+                            购买优惠门票:<input type="radio" name="r6" value="1">开启 <input type="radio" name="r6" value="0">关闭
+                        </label>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">排序:</label>
+                        <div class="col-sm-9">
+                            <input class="form-control"  style="width: 200px;"  type="text" id="px6" value="${c6.sort}">
+                        </div>
+                    </div>
+                    @if(c6==null){
+                    <#avatar id="c6" name="背景图" />
+                    @}
+                    @if(c6!=null){
+                    <#avatar id="c6" name="背景图" avatarImg="${c6.backgroundImage}"/>
+                    @}
+                </div>
+            </div>
+
+
+            <div class="row">
+                <div class="col-lg-6" style="">
+                    <div class="form-group" style="margin-left: 96px">
+                        <label class="col-sm-4 control-label" >
+                            看视频得奖励:<input type="radio" name="r7" value="1">开启 <input type="radio" name="r7" value="0">关闭
+                        </label>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">排序:</label>
+                        <div class="col-sm-9">
+                            <input class="form-control"  style="width: 200px;"  type="text" id="px7" value="${c7.sort}">
+                        </div>
+                    </div>
+                    @if(c7==null){
+                    <#avatar id="c7" name="背景图" />
+                    @}
+                    @if(c7!=null){
+                    <#avatar id="c7" name="背景图" avatarImg="${c7.backgroundImage}"/>
+                    @}
+                </div>
+                <div class="col-lg-6" style="">
+                    <div class="form-group" style="margin-left: 96px">
+                        <label class="col-sm-4 control-label" >
+                            智慧球场:<input type="radio" name="r8" value="1">开启 <input type="radio" name="r8" value="0">关闭
+                        </label>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">排序:</label>
+                        <div class="col-sm-9">
+                            <input class="form-control"  style="width: 200px;"  type="text" id="px8" value="${c8.sort}">
+                        </div>
+                    </div>
+                    @if(c8==null){
+                    <#avatar id="c8" name="背景图" />
+                    @}
+                    @if(c8!=null){
+                    <#avatar id="c8" name="背景图" avatarImg="${c8.backgroundImage}"/>
+                    @}
+                </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="TCarInfoDlg.saveAllImg()"/>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/tShop/tShop_info.js"></script>
+
+<script>
+</script>
+<script type="application/javascript">
+    window.onload = function(){
+        var OBJradio=document.getElementsByName("r1")
+        for(i=0;i<OBJradio.length;i++){//循环查找这个radio
+            if($("#s1").val()==OBJradio[i].value){//判断是否与radio的值相同
+                OBJradio[i].checked=true//修改选中状态
+            }
+        }
+        var OBJradio=document.getElementsByName("r2")
+        for(i=0;i<OBJradio.length;i++){//循环查找这个radio
+            if($("#s2").val()==OBJradio[i].value){//判断是否与radio的值相同
+                OBJradio[i].checked=true//修改选中状态
+            }
+        }
+        var OBJradio=document.getElementsByName("r3")
+        for(i=0;i<OBJradio.length;i++){//循环查找这个radio
+            if($("#s3").val()==OBJradio[i].value){//判断是否与radio的值相同
+                OBJradio[i].checked=true//修改选中状态
+            }
+        }
+        var OBJradio=document.getElementsByName("r4")
+        for(i=0;i<OBJradio.length;i++){//循环查找这个radio
+            if($("#s4").val()==OBJradio[i].value){//判断是否与radio的值相同
+                OBJradio[i].checked=true//修改选中状态
+            }
+        }
+        var OBJradio=document.getElementsByName("r5")
+        for(i=0;i<OBJradio.length;i++){//循环查找这个radio
+            if($("#s5").val()==OBJradio[i].value){//判断是否与radio的值相同
+                OBJradio[i].checked=true//修改选中状态
+            }
+        }
+        var OBJradio=document.getElementsByName("r6")
+        for(i=0;i<OBJradio.length;i++){//循环查找这个radio
+            if($("#s6").val()==OBJradio[i].value){//判断是否与radio的值相同
+                OBJradio[i].checked=true//修改选中状态
+            }
+        }
+        var OBJradio=document.getElementsByName("r7")
+        for(i=0;i<OBJradio.length;i++){//循环查找这个radio
+            if($("#s7").val()==OBJradio[i].value){//判断是否与radio的值相同
+                OBJradio[i].checked=true//修改选中状态
+            }
+        }
+        var OBJradio=document.getElementsByName("r8")
+        for(i=0;i<OBJradio.length;i++){//循环查找这个radio
+            if($("#s8").val()==OBJradio[i].value){//判断是否与radio的值相同
+                OBJradio[i].checked=true//修改选中状态
+            }
+        }
+
+
+    }
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tCity/tCity_info.js b/cloud-server-management/src/main/webapp/static/modular/system/tCity/tCity_info.js
index fa3be08..8360403 100644
--- a/cloud-server-management/src/main/webapp/static/modular/system/tCity/tCity_info.js
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tCity/tCity_info.js
@@ -135,6 +135,9 @@
 
     //提交信息
     var ajax = new $ax(Feng.ctxPath + "/tCity/add", function(data){
+        if(data=="5001"){
+            Feng.error("改账号已经存在");
+        }else
         if(data.code == 200){
             if(language==1){
                 Feng.success("添加成功!");
@@ -193,6 +196,9 @@
     }
     //提交信息
     var ajax = new $ax(Feng.ctxPath + "/tCity/update", function(data){
+        if(data=="5001"){
+            Feng.error("改账号已经存在");
+        }else
         if(data.code == 200){
             if(language==1){
                 Feng.success("修改成功!");
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tShop/tShop.js b/cloud-server-management/src/main/webapp/static/modular/system/tShop/tShop.js
new file mode 100644
index 0000000..92d6406
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tShop/tShop.js
@@ -0,0 +1,429 @@
+/**
+ * 车辆管理管理初始化
+ */
+var TCompetition = {
+    id: "TCompetitionTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+var language =1
+/**
+ * 初始化表格的列
+ */
+TCompetition.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '省', field: 'province', visible: true, align: 'center', valign: 'middle'
+        },
+        {title: '市', field: 'city', visible: true, align: 'center', valign: 'middle'},
+        {title: '所属账号', field: 'account', visible: true, align: 'center', valign: 'middle'
+        },
+        {title:  '门店名称', field: 'name', visible: true, align: 'center', valign: 'middle'
+        },
+        {title:  '门店地址', field: 'address', visible: true, align: 'center', valign: 'middle'
+        },
+        {title:  '店长姓名', field: 'userName', visible: true, align: 'center', valign: 'middle'
+        },
+        {title:  '店长手机号', field: 'userPhone', visible: true, align: 'center', valign: 'middle'
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle'
+            ,formatter:function (data) {
+                return{1:"正常",2:"冻结"}[data]
+            }
+        },
+    ];
+};
+function currentTime(timestamp){
+    var time = timestamp + '';
+    if(time.length != 13){
+        timestamp = timestamp * 1000;
+    }
+    var date = new Date(timestamp);;
+    var Y = date.getFullYear() + '-';
+    var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
+    var D = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()) + ' ';
+
+    var h = (date.getHours() < 10 ? '0' + (date.getHours()) : date.getHours()) + ':';
+    var m = (date.getMinutes() < 10 ? '0' + (date.getMinutes()) : date.getMinutes()) + ':';
+    var s = (date.getSeconds() < 10 ? '0' + (date.getSeconds()) : date.getSeconds());
+    var strDate = Y + M + D + h + m + s;
+    return strDate
+}
+
+function currentTime1(timestamp){
+    var time = timestamp + '';
+    if(time.length != 13){
+        timestamp = timestamp * 1000;
+    }
+    var date = new Date(timestamp);;
+    var Y = date.getFullYear() + '-';
+    var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
+    var D = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()) + ' ';
+
+    var h = (date.getHours() < 10 ? '0' + (date.getHours()) : date.getHours()) + ':';
+    var m = (date.getMinutes() < 10 ? '0' + (date.getMinutes()) : date.getMinutes()) + ':';
+    var s = (date.getSeconds() < 10 ? '0' + (date.getSeconds()) : date.getSeconds());
+    var strDate = Y + M + D ;
+    return strDate
+}
+/**
+ * 检查是否选中
+ */
+TCompetition.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+            Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TCompetition.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加车辆管理
+ */
+TCompetition.openAddTCompetition = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tShop/tShop_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看车辆管理详情
+ */
+TCompetition.openTCompetitionDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title:'编辑',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tShop/tShop_update/' + TCompetition.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+TCompetition.info = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title:'详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tShop/tShop_info/' + TCompetition.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+TCompetition.gift = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title:'免费福利',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tShop/tShop_gift/' + TCompetition.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+TCompetition.indexSet = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title:'首页设置',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tShop/tShop_indexSet/' + TCompetition.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除车辆管理
+ */
+TCompetition.delete = function () {
+    if (this.check()) {
+        var nickname = TCompetition.seItem.carLicensePlate;
+        if (nickname == "" || nickname == null || nickname == undefined){
+                nickname = "该车辆";
+        }else{
+            nickname = "【"+nickname+"】";
+        }
+        swal({
+           title: language==1?"您是否确认删除" + nickname + "?":(language==2?"Are you sure to delete the" + nickname + "?":"Apakah Anda pasti akan menghapus" + nickname + "?"),
+            text: language==1?"请谨慎操作!":(language==2?' Please operate with caution!':'Harap beroperasi dengan hati -hati!'),
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: language==1?"删除":(language==2?'Delete':'Hapus'),
+            closeOnConfirm: true
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/TCompetition/delete", function (data) {
+                  if(language==1){
+                    swal("删除成功", "您已经成功删除了" + nickname + "。", "success");
+                }else if(language==2){
+                    swal("Delete succeeded!", "You have successfully deleted it" + nickname + "。", "success");
+                }else {
+                    swal("Hapus berhasil!", "Anda berhasil menghapus" + nickname + "。", "success");
+                }
+                TCompetition.table.refresh();
+            }, function (data) {
+                if(language==1){
+                    swal("删除失败", data.responseJSON.message + "!", "warning");
+                }else if(language==2){
+                    swal("Failed to delete", data.responseJSON.message + "!", "warning");
+                }else {
+                    swal("Hapus Gagal", data.responseJSON.message + "!", "warning");
+                }
+
+            });
+            ajax.set("TCompetitionId",TCompetition.seItem.id);
+            ajax.start();
+        });
+    }
+};
+TCompetition.oneChange = function (e) {
+    console.log(111)
+    var oneId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCompetition/onChange", function(data){
+        if(data!=null){
+            if(language==1){
+                var content='<option value="">选择市</option>';
+            }else if(language==2){
+                var content='<option value="">Choose your franchisee</option>';
+            }else {
+                var content='<option value="">Pilih franchisee Anda</option>';
+            }
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.code+"'>"+v.name+"</option>";
+            });
+            $("#cCode").empty().append(content);
+        }
+    });
+    ajax.set("oneId",oneId);
+    ajax.start();
+}
+TCompetition.oneChangeNext = function (e) {
+    var oneId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCompetition/oneChangeNext", function(data){
+        if(data!=null){
+            if(language==1){
+                var content='<option value="">选择账号</option>';
+            }else if(language==2){
+                var content='<option value="">Choose your franchisee</option>';
+            }else {
+                var content='<option value="">Pilih franchisee Anda</option>';
+            }
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#account").empty().append(content);
+        }
+    });
+    ajax.set("oneId",oneId);
+    ajax.start();
+}
+
+TCompetition.freeze = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tShop/freeze", function (data) {
+            Feng.success("冻结成功!");
+            TCompetition.table.refresh();
+        }, function (data) {
+            Feng.error("冻结失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("id",this.seItem.id);
+        ajax.start();
+    }
+};
+TCompetition.unfreeze = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tShop/unfreeze", function (data) {
+            Feng.success("解冻成功!");
+            TCompetition.table.refresh();
+        }, function (data) {
+            Feng.error("解冻失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("id",this.seItem.id);
+        ajax.start();
+    }
+};
+TCompetition.reload = function () {
+    if (this.check()) {
+        let id = this.seItem.id
+        var operation = function(){
+            var ajax = new $ax(Feng.ctxPath + "/tCity/pwd", function (data) {
+                Feng.success("重置成功!");
+                TCompetition.table.refresh();
+            }, function (data) {
+                Feng.error("重置失败!" + data.responseJSON.message + "!");
+            });
+            ajax.set("id",id);
+            ajax.start();
+        }
+        Feng.confirm("确认重置密码?重置后密码为:a123456", operation);
+    }
+
+};
+
+TCompetition.carInsurance = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: language==1?'车辆保险':(language==2?'Vehicle insurance':'Asuransi kendaraan'),
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/TCompetition/carInsurance?carId=' + TCompetition.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+
+
+/**
+ * 查询车辆管理列表
+ */
+TCompetition.search = function () {
+    var queryData = {};
+    queryData['provinceCode'] = $("#pCode").val();
+    queryData['cityCode'] = $("#cCode").val();
+    queryData['name'] = $("#name").val();
+    queryData['phone'] = $("#phone").val();
+    queryData['shopName'] = $("#shopName").val();
+    TCompetition.table.refresh({query: queryData});
+};
+
+TCompetition.resetSearch = function () {
+    $("#pCode").val("");
+    $("#cCode").val("");
+    $("#name").val("");
+    $("#phone").val("");
+    $("#shopName").val("");
+    TCompetition.search();
+};
+
+$(function () {
+    var defaultColunms = TCompetition.initColumn();
+    var table = new BSTable(TCompetition.id, "/tShop/list", defaultColunms);
+    table.setPaginationType("server");
+    TCompetition.table = table.init();
+});
+
+/**
+ * 下载模板
+ */
+TCompetition.uploadCarModel = function () {
+    window.location.href = Feng.ctxPath + "/TCompetition/uploadCarModel";
+}
+
+var agreement = function(){
+    this.init = function(){
+        //模拟上传excel  
+        $("#uploadEventBtn").unbind("click").bind("click",function(){
+            $("#uploadEventFile").click();
+        });
+    };
+}
+/**
+ * 导入合同
+ */
+TCompetition.exporTCompetition = function () {
+    var uploadEventFile = $("#uploadEventFile").val();
+    if(uploadEventFile == ''){
+        if(language==1){
+            Feng.info("请选择Excel,再上传");
+        }else if(language==2){
+            Feng.info("Please select Excel and upload");
+        }else {
+            Feng.info("Silakan pilih Excel dan upload");
+        }
+    }else if(uploadEventFile.lastIndexOf(".xls")<0){//可判断以.xls和.xlsx结尾的excel  
+        if(language==1){
+            Feng.info("只能上传Excel文件");
+        }else if(language==2){
+            Feng.info("Only Excel files can be uploaded");
+        }else {
+            Feng.info("Hanya berkas Excel yang dapat diunggah");
+        }
+    }else{
+        var url = Feng.ctxPath + '/TCompetition/exporTCompetition';
+        var file = document.querySelector('input[name=file]').files[0];
+        var reader = new FileReader();
+        if (file) {
+            var formData = new FormData();
+            formData.append("myfile", file);
+            this.sendAjaxRequest(url, 'POST', formData);
+        }
+    }
+}
+TCompetition.sendAjaxRequest = function(url,type,data){
+    $.ajax({
+        url : url,
+        type : type,
+        data : data,
+        success : function(result) {
+            if(result.code==500) {
+                Feng.info(result.message);
+            }else {
+                if(language==1){
+                    Feng.success("导入成功!");
+                }else if(language==2){
+                    Feng.success("SUCCESSFUL IMPORT!");
+                }else {
+                    Feng.success("Import berhasil!");
+                }
+            }
+            TCompetition.table.refresh();
+        },
+        error : function() {
+            if(language==1){
+                Feng.error("excel上传失败!");
+            }else if(language==2){
+                Feng.error("Uploading excel Fails. Procedure!");
+            }else {
+                Feng.error("Gagal mengunggah excel!");
+            }
+        },
+        cache : false,
+        contentType : false,
+        processData : false
+    });
+};
+
+var agreement;
+$(function(){
+    agreement = new agreement();
+    agreement.init();
+});
+
+/**
+ * 导出车辆操作
+ */
+TCompetition.ouTCompetition = function () {
+    var operation = function() {
+        window.location.href = Feng.ctxPath + "/TCompetition/ouTCompetition";
+    };
+    if(language==1){
+        Feng.confirm("是否确认导出车辆信息?", operation);
+    }else if(language==2){
+        Feng.confirm("Are you sure to export vehicle information?", operation);
+    }else {
+        Feng.confirm("Apakah Anda pasti akan mengekspor informasi kendaraan?", operation);
+    }
+}
\ No newline at end of file
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tShop/tShop_info.js b/cloud-server-management/src/main/webapp/static/modular/system/tShop/tShop_info.js
new file mode 100644
index 0000000..2680aff
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tShop/tShop_info.js
@@ -0,0 +1,594 @@
+/**
+ * 初始化车辆管理详情对话框
+ */
+var language=1;
+var TCarInfoDlg = {
+    tCarInfoData : {},
+    validateFields: {
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TCarInfoDlg.validate = function () {
+    $('#carInfoForm').data("bootstrapValidator").resetForm();
+    $('#carInfoForm').bootstrapValidator('validate');
+    return $("#carInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TCarInfoDlg.clearData = function() {
+    this.tCarInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCarInfoDlg.set = function(key, val) {
+    this.tCarInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCarInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TCarInfoDlg.close = function() {
+    parent.layer.close(window.parent.TCompetition.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TCarInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('isPlatCar')
+    .set('companyId')
+    .set('franchiseeId')
+    .set('carColor')
+    .set('carModelId')
+    .set('carBrandId')
+    .set('carLicensePlate')
+    .set('carPhoto')
+    .set('drivingLicenseNumber')
+    .set('drivingLicensePhoto')
+    .set('annualInspectionTime')
+    .set('commercialInsuranceTime')
+    .set('createTime')
+    .set('state')
+    .set('addType')
+    .set('addObjectId')
+    .set('plateColor')
+    .set('vehicleType')
+    .set('ownerName')
+    .set('engineId')
+    .set('VIN')
+    .set('certifyDateA')
+    .set('fuelType')
+    .set('engineDisplace')
+    .set('certificate')
+    .set('transAgency')
+    .set('transArea')
+    .set('transDateStart')
+    .set('transDateStop')
+    .set('certifyDateB')
+    .set('fixState')
+    .set('nextFixDate')
+    .set('checkState')
+    .set('feePrintId')
+    .set('GPSBrand')
+    .set('GPSModel')
+    .set('GPSIMEI')
+    .set('GPSInstallDate')
+    .set('registerDate')
+    .set('commercialType');
+}
+
+TCarInfoDlg.oneChange = function (e) {
+    console.log(111)
+    var oneId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCompetition/onChange", function(data){
+        if(data!=null){
+            if(language==1){
+                var content='<option value="">选择市</option>';
+            }else if(language==2){
+                var content='<option value="">Choose your franchisee</option>';
+            }else {
+                var content='<option value="">Pilih franchisee Anda</option>';
+            }
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.code+"'>"+v.name+"</option>";
+            });
+            $("#cCode").empty().append(content);
+        }
+    });
+    ajax.set("oneId",oneId);
+    ajax.start();
+}
+TCarInfoDlg.oneChangeNext = function (e) {
+    var oneId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tShop/oneChangeNext", function(data){
+        if(data!=null){
+            if(language==1){
+                var content='<option value="">选择账号</option>';
+            }else if(language==2){
+                var content='<option value="">Choose your franchisee</option>';
+            }else {
+                var content='<option value="">Pilih franchisee Anda</option>';
+            }
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#account").empty().append(content);
+        }
+    });
+    ajax.set("oneId",oneId);
+    ajax.start();
+}
+TCarInfoDlg.saveImg = function () {
+    var id=$("#id").val();
+    var img=$("#welfarePicture").val();
+    var ajax = new $ax(Feng.ctxPath + "/tShop/saveImg", function(data){
+        if(data.code == 200){
+            Feng.success("保存成功")
+        }
+    });
+    ajax.set("id",id);
+    ajax.set("img",img);
+    ajax.start();
+}
+
+/**
+ * 提交添加
+ */
+TCarInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+
+    let pCode = $("#pCode").val()
+    let cCode = $("#cCode").val()
+    let account = $("#account").val()
+    if(account==''){
+        Feng.info("请选择所属账号")
+        return;
+    }
+
+    let name = $("#name").val()
+    let phone = $("#phone").val()
+
+    if(pCode=='' && $("#role")=="1"){
+        Feng.info("请选择省")
+        return;
+    }
+    if(cCode=='' && $("#role")=="1"){
+        Feng.info("请选择市")
+        return;
+    }
+    if(name==''){
+        Feng.info("门店名称不能为空")
+        return;
+    }
+    if(phone==''){
+        Feng.info("联系电话不能为空")
+        return;
+    }
+
+    let address = $("#address").val()
+
+    if(address==''){
+        Feng.info("请输入地址")
+        return;
+    }
+    let time = $("#time").val()
+
+    if(time==''){
+        Feng.info("请填写营业时间")
+        return;
+    }
+    let intro = $("#intro").val()
+
+    if(intro==''){
+        Feng.info("请填写门店介绍")
+        return;
+    }
+    let userName = $("#userName").val()
+
+    if(userName==''){
+        Feng.info("请输入店长姓名")
+        return;
+    }
+    let userPhone = $("#userPhone").val()
+
+    if(userPhone==''){
+        Feng.info("请输入店长手机号")
+        return;
+    }
+    let img = $("#img").val()
+
+    if(img==''){
+        Feng.info("请上传门店封面")
+        return;
+    }
+
+    let imgOne = $("#imgOne").val()
+
+    if(imgOne==''){
+        Feng.info("请上传实景图")
+        return;
+    }
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tShop/add", function(data){
+        if(data=="5001"){
+            Feng.error("该店长手机号已经存在!")
+        }else
+        if(data.code == 200){
+            if(language==1){
+                Feng.success("添加成功!");
+            }else if(language==2){
+                Feng.success("Successfully added!");
+            }else {
+                Feng.success("Sangat berhasil ditambah!");
+            }
+            window.parent.TCompetition.table.refresh();
+            TCarInfoDlg.close();
+        }else{
+            Feng.error(data.msg);
+        }
+
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tCarInfoData);
+    ajax.set("provinceCode",pCode);
+    ajax.set("cityCode",cCode);
+    ajax.set("name",name);
+    ajax.set("phone",phone);
+    ajax.set("cityManagerId",account);
+    ajax.set("address",address);
+    ajax.set("time",time);
+    ajax.set("introduce",intro);
+    ajax.set("userName",userName);
+    ajax.set("userPhone",userPhone);
+    ajax.set("coverDrawing",img);
+    ajax.set("realPicture",imgOne);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TCarInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+
+    let pCode = $("#pCode").val()
+    let cCode = $("#cCode").val()
+    let account = $("#account").val()
+    if(account==''){
+        Feng.info("请选择所属账号")
+        return;
+    }
+
+    let name = $("#name").val()
+    let phone = $("#phone").val()
+
+    if(pCode=='' && $("#role")=="1"){
+        Feng.info("请选择省")
+        return;
+    }
+    if(cCode=='' && $("#role")=="1"){
+        Feng.info("请选择市")
+        return;
+    }
+    if(name==''){
+        Feng.info("门店名称不能为空")
+        return;
+    }
+    if(phone==''){
+        Feng.info("联系电话不能为空")
+        return;
+    }
+
+    let address = $("#address").val()
+
+    if(address==''){
+        Feng.info("请输入地址")
+        return;
+    }
+    let time = $("#time").val()
+
+    if(time==''){
+        Feng.info("请填写营业时间")
+        return;
+    }
+    let intro = $("#intro").val()
+
+    if(intro==''){
+        Feng.info("请填写门店介绍")
+        return;
+    }
+    let userName = $("#userName").val()
+
+    if(userName==''){
+        Feng.info("请输入店长姓名")
+        return;
+    }
+    let userPhone = $("#userPhone").val()
+
+    if(userPhone==''){
+        Feng.info("请输入店长手机号")
+        return;
+    }
+    let img = $("#img").val()
+
+
+    let imgOne = $("#imgOne").val()
+
+    if(imgOne==''){
+        Feng.info("请上传实景图")
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tShop/update", function(data){
+        if(data=="5001"){
+            Feng.error("该店长手机号已经存在!")
+        }else
+        if(data.code == 200){
+            if(language==1){
+                Feng.success("修改成功!");
+            }else if(language==2){
+                Feng.success("Modify successfully!");
+            }else {
+                Feng.success("Mengubah dengan sukses!");
+            }
+            window.parent.TCompetition.table.refresh();
+            TCarInfoDlg.close();
+        }else{
+            Feng.error(data.msg);
+        }
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("provinceCode",pCode);
+    ajax.set("cityCode",cCode);
+    ajax.set("name",name);
+    ajax.set("phone",phone);
+    ajax.set("cityManagerId",account);
+    ajax.set("address",address);
+    ajax.set("time",time);
+    ajax.set("introduce",intro);
+    ajax.set("userName",userName);
+    ajax.set("userPhone",userPhone);
+    ajax.set("coverDrawing",img);
+    ajax.set("realPicture",imgOne);
+    ajax.set("id",$("#id").val());
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("carInfoForm", TCarInfoDlg.validateFields);
+    // 初始化图片上传
+    var carPhoto = new $WebUpload("c1");
+    carPhoto.setUploadBarId("progressBar");
+    carPhoto.init();
+    var carPhoto = new $WebUpload("c2");
+    carPhoto.setUploadBarId("progressBar");
+    carPhoto.init();
+    var carPhoto = new $WebUpload("c3");
+    carPhoto.setUploadBarId("progressBar");
+    carPhoto.init();
+    var carPhoto = new $WebUpload("c4");
+    carPhoto.setUploadBarId("progressBar");
+    carPhoto.init();
+    var carPhoto = new $WebUpload("c5");
+    carPhoto.setUploadBarId("progressBar");
+    carPhoto.init();
+    var carPhoto = new $WebUpload("c6");
+    carPhoto.setUploadBarId("progressBar");
+    carPhoto.init();
+    var carPhoto = new $WebUpload("c7");
+    carPhoto.setUploadBarId("progressBar");
+    carPhoto.init();
+    var carPhoto = new $WebUpload("c8");
+    carPhoto.setUploadBarId("progressBar");
+    carPhoto.init();
+    var carPhoto = new $WebUpload("img");
+    carPhoto.setUploadBarId("progressBar");
+    carPhoto.init();
+    var drivingLicensePhoto = new $WebUpload("drivingLicensePhoto");
+    drivingLicensePhoto.setUploadBarId("progressBar");
+    drivingLicensePhoto.init();
+});
+
+/**
+ * 选择分公司后执行
+ */
+TCarInfoDlg.oneChange = function (e) {
+    var oneId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCity/onChange", function(data){
+        if(data!=null){
+            if(language==1){
+                var content='<option value="">选择市</option>';
+            }else if(language==2){
+                var content='<option value="">Choose your franchisee</option>';
+            }else {
+                var content='<option value="">Pilih franchisee Anda</option>';
+            }
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.code+"'>"+v.name+"</option>";
+            });
+            $("#cCode").empty().append(content);
+        }
+    });
+    ajax.set("oneId",oneId);
+    ajax.start();
+}
+
+/**
+ * 类型改变执行
+ * @param e
+ */
+TCarInfoDlg.companyTypeClick = function (e) {
+    if (1 == e){
+        $(".companyDiv").hide();
+    } else if (2 == e){
+        $(".companyDiv").show();
+    }
+}
+
+/**
+ * 车辆品牌改变时执行
+ */
+TCarInfoDlg.saveAllImg = function (e) {
+    var id = $("#id").val()
+    var px1 = $("#px1").val()
+    var px2 = $("#px2").val()
+    var px3 = $("#px3").val()
+    var px4 = $("#px4").val()
+    var px5 = $("#px5").val()
+    var px6 = $("#px6").val()
+    var px7 = $("#px7").val()
+    var px8 = $("#px8").val()
+    var c1 = $("#c1").val()
+    var c2 = $("#c2").val()
+    var c3 = $("#c3").val()
+    var c4 = $("#c4").val()
+    var c5 = $("#c5").val()
+    var c6 = $("#c6").val()
+    var c7 = $("#7").val()
+    var c8 = $("#c8").val()
+    var r1 =  document.querySelector('input[name="r1"]').checked;
+    var r2 =  document.querySelector('input[name="r2"]').checked;
+    var r3 =  document.querySelector('input[name="r3"]').checked;
+    var r4 =  document.querySelector('input[name="r4"]').checked;
+    var r5 =  document.querySelector('input[name="r5"]').checked;
+    var r6 =  document.querySelector('input[name="r6"]').checked;
+    var r7 =  document.querySelector('input[name="r7"]').checked;
+    var r8 =  document.querySelector('input[name="r8"]').checked;
+    if(r1){
+        r1 =1
+    }else{
+        r1=0
+    }
+    if(r2){
+        r2 =1
+    }else{
+        r2=0
+    }
+    if(r3){
+        r3 =1
+    }else{
+        r3=0
+    }
+    if(r4){
+        r4 =1
+    }else{
+        r4=0
+    }
+    if(r5){
+        r5 =1
+    }else{
+        r5=0
+    }
+    if(r6){
+        r6 =1
+    }else{
+        r6=0
+    }
+    if(r7){
+        r7 =1
+    }else{
+        r7=0
+    }
+    if(r8){
+        r8 =1
+    }else{
+        r8=0
+    }
+
+    var ajax = new $ax(Feng.ctxPath + "/tShop/saveImgAll", function(data){
+        if(data.code == 200){
+            Feng.success("保存成功!");
+        }else{
+            Feng.error(data.msg);
+        }
+        },function(data){
+            Feng.error("保存失败!" + data.responseJSON.message + "!");
+
+    });
+    ajax.set("id",id);
+    ajax.set("px1",px1);
+    ajax.set("px2",px2);
+    ajax.set("px3",px3);
+    ajax.set("px4",px4);
+    ajax.set("px5",px5);
+    ajax.set("px6",px6);
+    ajax.set("px7",px7);
+    ajax.set("px8",px8);
+    ajax.set("c1",c1);
+    ajax.set("c2",c2);
+    ajax.set("c3",c3);
+    ajax.set("c4",c4);
+    ajax.set("c5",c5);
+    ajax.set("c6",c6);
+    ajax.set("c7",c7);
+    ajax.set("c8",c8);
+    ajax.set("r1",r1);
+    ajax.set("r2",r2);
+    ajax.set("r3",r3);
+    ajax.set("r4",r4);
+    ajax.set("r5",r5);
+    ajax.set("r6",r6);
+    ajax.set("r7",r7);
+    ajax.set("r8",r8);
+    ajax.start();
+}
+
+/**
+ * 专车服务被点击
+ */
+TCarInfoDlg.zcServerClick = function () {
+    var serverBox1 = $('#serverBox1').prop('checked');
+    if (serverBox1){
+        $("#zcModelDiv").show();
+    } else {
+        $("#zcModelDiv").hide();
+    }
+}
+
+/**
+ * 跨城服务被点击
+ */
+TCarInfoDlg.kcServerClick = function () {
+    var serverBox3 = $('#serverBox3').prop('checked');
+    if (serverBox3){
+        $("#kcModelDiv").show();
+    } else {
+        $("#kcModelDiv").hide();
+    }
+}
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite.js b/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite.js
index f6ed3b6..c672429 100644
--- a/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite.js
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite.js
@@ -15,76 +15,18 @@
     return [
         {field: 'selectItem', radio: true},
         {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
-        {title: language==1?'添加时间':(language==2?'Add Time':'Tambahkan waktu'), field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'20%',
-            formatter: function (value, row) {
-                var btn = "";
-                if(row.insertTime != '' && row.insertTime != null) {
-                    var time = row.insertTime.replace(" ",'<br>');
-                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + row.insertTime + '</p>']
-                }
-                return btn;
-            }
+        {title: '省', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'20%',
         },
-        {title: '站点名称', field: 'name', visible: true, align: 'center', valign: 'middle',
-            formatter: function (value, row) {
-                var btn = "";
-                if(row.name != '' && row.name != null) {
-                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
-                }
-                return btn;
-            }
+        {title: '市', field: 'name', visible: true, align: 'center', valign: 'middle',
         },
-        {title: '添加人ID', field: 'insertUserId', visible: false, align: 'center', valign: 'middle'},
-        {title: '创建者', field: 'insertUser', visible: true, align: 'center', valign: 'middle',
-            formatter: function (value, row) {
-                var btn = "";
-                if(row.insertUser != '' && row.insertUser != null) {
-                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertUser + '" onfocus="TUser.tooltip()">' + row.insertUser + '</p>']
-                }
-                return btn;
-            }
+        {title: '门店名称', field: 'insertUserId', visible: false, align: 'center', valign: 'middle'},
+        {title: '场地类型', field: 'insertUser', visible: true, align: 'center', valign: 'middle',
         },
-        {title: '所属城市', field: 'province', visible: true, align: 'center', valign: 'middle',
-            formatter: function (value, row) {
-                var btn = "";
-                if(row.province != '' && row.province != null) {
-                    var str = "";
-                    if ("" != row.province && undefined != row.province){
-                        str = str + row.province+"-";
-                    }
-                    if ("" != row.city && undefined != row.city){
-                        str = str + row.city+"-";
-                    }
-                    if ("" != row.district && undefined != row.district){
-                        str = str + row.district+"-";
-                    }
-                    str = str.substring(0,str.length-1);
-                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="'+ str +'" onfocus="TUser.tooltip()">' + str + '</p>']
-                }
-                return btn;
-            }
+        {title: '场地名称', field: 'province', visible: true, align: 'center', valign: 'middle',
         },
-        {title: '关联线路', field: 'lineNum', visible: true, align: 'center', valign: 'middle',
-            formatter: function (value, row) {
-                var btn = "";
-                if(row.lineNum != '' && row.lineNum != null) {
-                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.lineNum + '" onfocus="TUser.tooltip()">' + row.lineNum + '</p>']
-                }
-                return btn;
-            }
+        {title: '场地责任险有效期', field: 'lineNum', visible: true, align: 'center', valign: 'middle',
         },
         {title: language==1?'状态':(language==2?'State':'Status'), field: 'state', visible: true, align: 'center', valign: 'middle',
-            formatter: function (value, row) {
-                var btn = "";
-                if(row.state != '' && row.state != null) {
-                    if(row.state == 1){
-                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="正常" onfocus="TUser.tooltip()">正常</p>']
-                    }else if(row.state == 2){
-                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="冻结" onfocus="TUser.tooltip()">冻结</p>']
-                    }
-                }
-                return btn;
-            }
         }
     ];
 };
diff --git a/cloud-server-other/src/main/java/com/dsh/other/feignclient/activity/model/QueryUserCouponByIdAndUserId.java b/cloud-server-other/src/main/java/com/dsh/other/feignclient/activity/model/QueryUserCouponByIdAndUserId.java
new file mode 100644
index 0000000..666db4f
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/feignclient/activity/model/QueryUserCouponByIdAndUserId.java
@@ -0,0 +1,14 @@
+package com.dsh.other.feignclient.activity.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class QueryUserCouponByIdAndUserId {
+    private Long id;
+
+    private Integer userId;
+}

--
Gitblit v1.7.1