From 9999e298dcf23b79e8efdb972d77d268121ee970 Mon Sep 17 00:00:00 2001
From: liujie <liujie>
Date: 星期三, 27 九月 2023 11:25:43 +0800
Subject: [PATCH] 后台修改门票

---
 cloud-server-activity/src/main/java/com/dsh/activity/mapper/PointsMerchandiseMapper.java                |    4 
 cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PointsMerchandiseCityServiceImpl.java |   20 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/PointsMerchandise.java  |  174 ++++
 cloud-server-activity/src/main/java/com/dsh/activity/model/response/StoreVos.java                       |   16 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/GoodsInfoOneVo.java             |   78 ++
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_detail_one.html               |  207 +++++
 cloud-server-activity/src/main/java/com/dsh/activity/model/response/GoodsInfoOneVo.java                 |   77 ++
 cloud-server-activity/src/main/java/com/dsh/activity/service/PointsMerchandiseService.java              |    2 
 cloud-server-management/src/main/webapp/static/modular/system/tGoods/tGoods.js                          |    4 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java               |   12 
 cloud-server-activity/src/main/java/com/dsh/activity/mapper/PointsMerchandiseCityMapper.java            |   16 
 cloud-server-activity/src/main/java/com/dsh/activity/service/PointsMerchandiseCityService.java          |   16 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_add.html                      |  274 ++++++
 cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/PointMercharsClient.java      |   36 
 cloud-server-management/src/main/webapp/static/modular/system/tGoods/tPay_info.js                       |    9 
 cloud-server-management/src/main/webapp/static/modular/system/tGoods/tGoods_info.js                     |  586 ++++++++++++---
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/StoreVos.java                   |   18 
 cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandiseCity.java                  |   67 +
 cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java            |  235 ++++++
 cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandise.java                      |    4 
 cloud-server-activity/src/main/resources/mapper/PointsMerchandiseMapper.xml                             |    6 
 cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java                       |   35 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TGoodsController.java |  239 +++++
 cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PointsMerchandiseServiceImpl.java     |    6 
 cloud-server-activity/src/main/resources/mapper/PointsMerchandiseCityMapper.xml                         |    6 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_edit.html                     |   27 
 26 files changed, 1,987 insertions(+), 187 deletions(-)

diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java
index e706008..3759f72 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java
@@ -10,9 +10,12 @@
 import com.dsh.activity.feignclient.course.model.CoursePackagePaymentConfig;
 import com.dsh.activity.feignclient.model.*;
 import com.dsh.activity.feignclient.other.StoreClient;
+import com.dsh.activity.feignclient.other.model.Store;
 import com.dsh.activity.feignclient.other.model.StoreDetailOfCourse;
 import com.dsh.activity.model.PointMerchandiseVo;
 import com.dsh.activity.model.request.*;
+import com.dsh.activity.model.response.GoodsInfoOneVo;
+import com.dsh.activity.model.response.StoreVos;
 import com.dsh.activity.service.*;
 import com.dsh.activity.util.GDMapGeocodingUtil;
 import com.dsh.activity.util.StrUtils;
@@ -70,6 +73,10 @@
 
     @Resource
     private CouponCityService ccityService;
+
+
+    @Resource
+    private PointsMerchandiseCityService pmdsCityService;
 
 
     @ResponseBody
@@ -690,4 +697,232 @@
         return mapList;
     }
 
+    @PostMapping("/base/pointMerchars/queryPointMerchaseById")
+    public PointsMerchandise queryPointMerchaseById(@RequestBody Integer id){
+        return pmdsService.getById(id);
+    }
+
+    @PostMapping("/base/pointMerchars/getshopName")
+    public Integer getshopName(@RequestBody Integer id){
+        List<PointsMerchandiseStore> list = pmdstoService.list(new LambdaQueryWrapper<PointsMerchandiseStore>().eq(PointsMerchandiseStore::getPointsMerchandiseId, id));
+        PointsMerchandiseStore pointsMerchandiseStore = list.get(0);
+        Integer storeId = pointsMerchandiseStore.getStoreId();
+        return storeId;
+    }
+
+
+    @PostMapping("/base/pointMerchars/queryDetailsOfGoods")
+    public GoodsInfoOneVo queryDetailsOfGoods(@RequestBody Integer id){
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        GoodsInfoOneVo infoOneVo = new GoodsInfoOneVo();
+        PointsMerchandise byId = pmdsService.getById(id);
+
+        if (ToolUtil.isNotEmpty(byId)){
+            infoOneVo.setName(byId.getName());
+            infoOneVo.setCover(byId.getCover());
+            infoOneVo.setPics(byId.getProductImages());
+            infoOneVo.setPrice(byId.getPrice());
+            infoOneVo.setExchangeMethod(byId.getRedemptionMethod());
+            switch (byId.getRedemptionMethod()){
+                case 1:
+                    infoOneVo.setIntegral(byId.getIntegral());
+                    break;
+                case 2:
+                    infoOneVo.setIntegral(byId.getIntegral());
+                    infoOneVo.setCash(byId.getCash());
+                    break;
+                case 3:
+                    infoOneVo.setCash(byId.getCash());
+                    break;
+                default:
+                    break;
+            }
+            switch (byId.getUserPopulation()){
+                case 1:
+                    infoOneVo.setUserPopulation("全部用户");
+                    break;
+                case 2:
+                    infoOneVo.setUserPopulation("年度会员");
+                    break;
+                case 3:
+                    infoOneVo.setUserPopulation("已有学员用户");
+                    break;
+                default:
+                    break;
+            }
+            infoOneVo.setQuantityIssued(byId.getQuantityIssued());
+            List<UserPointsMerchandise> list = upmseService.list(new LambdaQueryWrapper<UserPointsMerchandise>()
+                    .eq(UserPointsMerchandise::getPointsMerchandiseId,byId.getId()));
+            infoOneVo.setUseScope(byId.getUseScope());
+            switch (byId.getUseScope()){
+                case 1:
+                    infoOneVo.setExchangeArea("全国通用");
+                    break;
+                case 2:
+                    infoOneVo.setExchangeArea("指定城市");
+                    break;
+                case 3:
+                    infoOneVo.setExchangeArea("指定门店");
+                    break;
+                default:
+                    break;
+            }
+            infoOneVo.setHasPicked(list.size());
+            infoOneVo.setPickUpQuantity(byId.getPickUpQuantity());
+            infoOneVo.setValidTime(simpleDateFormat.format(byId.getStartTime())+"至"+ simpleDateFormat.format(byId.getEndTime()));
+            infoOneVo.setRedemptionInstructions(byId.getRedemptionInstructions());
+            infoOneVo.setSort(byId.getSort());
+        }
+        return infoOneVo;
+    }
+
+
+    @ResponseBody
+    @PostMapping("/base/pointMerchars/getProvinces")
+    public List<StoreVos> getProvinces(@RequestBody Integer id){
+        List<StoreVos> storeVos = new ArrayList<>();
+        List<PointsMerchandiseCity> list = pmdsCityService.list(new LambdaQueryWrapper<PointsMerchandiseCity>()
+                .eq(PointsMerchandiseCity::getPointsMerchandiseId,id));
+        if (list.size() > 0 ){
+            for (PointsMerchandiseCity pointsMerchandiseCity : list) {
+                StoreVos storeVos1 = new StoreVos();
+                storeVos1.setNum1(pointsMerchandiseCity.getProvince());
+                storeVos1.setNum2(pointsMerchandiseCity.getCity());
+                storeVos.add(storeVos1);
+            }
+        }
+        return storeVos;
+    }
+
+
+    @ResponseBody
+    @PostMapping("/base/pointMerchars/getStoreList")
+    public List<StoreVos> getStoreList(@RequestBody Integer id){
+        List<StoreVos> storeVos = new ArrayList<>();
+        List<PointsMerchandiseStore> list = pmdstoService.list(new QueryWrapper<PointsMerchandiseStore>()
+                .eq("pointsMerchandiseId",id));
+        if (list.size() > 0 ){
+            List<Integer> collect = list.stream().map(PointsMerchandiseStore::getStoreId).collect(Collectors.toList());
+            List<Store> stores = stoClient.queryStoreByIds(collect);
+            if (stores.size() > 0 ){
+                for (Store store : stores) {
+                    StoreVos storeVos1 = new StoreVos();
+                    storeVos1.setNum1(store.getProvince() +"省"+ store.getCity() +"市");
+                    storeVos1.setNum2(store.getName());
+                    storeVos.add(storeVos1);
+                }
+            }
+        }
+        return storeVos;
+    }
+
+
+
+    @ResponseBody
+    @PostMapping("/base/pointMerchars/updateGoodsDetail")
+    public boolean updateGoodsDetail(@RequestBody Map<String, Object> map){
+        try {
+            Integer pointMerchandiseId = (Integer) map.get("pointMerchandiseId");
+            PointsMerchandise byId1 = pmdsService.getById(pointMerchandiseId);
+
+            Integer quantityIssued = (Integer) map.get("quantityIssued");
+            Integer pickUpQuantity = (Integer) map.get("pickUpQuantity");
+            String redemptionInstructions = (String) map.get("redemptionInstructions");
+            String cover = (String) map.get("cover");
+            String productImages = (String) map.get("productImages");
+            Integer sort = (Integer) map.get("sort");
+
+            byId1.setQuantityIssued(quantityIssued);
+            byId1.setPickUpQuantity(pickUpQuantity);
+            byId1.setRedemptionInstructions(redemptionInstructions);
+            if (ToolUtil.isNotEmpty(cover)){
+                byId1.setCover(cover);
+            }
+            if (ToolUtil.isNotEmpty(productImages)){
+                byId1.setProductImages(productImages);
+            }
+            byId1.setSort(sort);
+            pmdsService.updateById(byId1);
+            return true;
+        }catch (Exception e){
+            return false;
+        }
+    }
+
+
+
+    @PostMapping("/base/pointMerchars/add")
+    public Integer add(@RequestBody PointsMerchandise pointsMerchandise){
+        Integer storeId = pointsMerchandise.getShelves();
+        pointsMerchandise.setShelves(2);
+        boolean save = pmdsService.save(pointsMerchandise);
+        if(save && ToolUtil.isNotEmpty(storeId) && pointsMerchandise.getType()==2){
+            PointsMerchandiseStore pointsMerchandiseStore = new PointsMerchandiseStore();
+            pointsMerchandiseStore.setPointsMerchandiseId(pointsMerchandise.getId());
+            pointsMerchandiseStore.setStoreId(storeId);
+            save =  pmdstoService.save(pointsMerchandiseStore);
+        }
+        if(save  && pointsMerchandise.getType()==2 && ToolUtil.isNotEmpty(pointsMerchandise.getProvinceCode())){
+            pmdsService.saveCity(pointsMerchandise.getId(),pointsMerchandise.getProvince(),pointsMerchandise.getProvinceCode(),pointsMerchandise.getCity(),pointsMerchandise.getCityCode());
+        }
+        if(save){
+            return pointsMerchandise.getId();
+        }
+        return null;
+    }
+
+
+
+    @PostMapping("/base/pointMerchars/addOther")
+    public Boolean addOther(@RequestBody String pam){
+        Boolean save =false;
+        String[] split = pam.split("_");
+        for (String s : split[1].split(",")) {
+            PointsMerchandiseStore pointsMerchandiseStore = new PointsMerchandiseStore();
+            pointsMerchandiseStore.setPointsMerchandiseId(Integer.valueOf(split[0]));
+            pointsMerchandiseStore.setStoreId(Integer.valueOf(s));
+            save =  pmdstoService.save(pointsMerchandiseStore);
+        }
+        return save;
+    }
+
+    @PostMapping("/base/pointMerchars/addCitys")
+    public Boolean addCitys(@RequestBody ArrayList<Map<String, String>> objects){
+        try {
+            for (Map<String, String> object : objects) {
+                pmdsService.saveCity(Integer.valueOf(object.get("id")),object.get("pName"),object.get("pCode"),object.get("cName"),object.get("cCode"));
+            }
+            return true;
+        }catch (Exception e){
+            e.printStackTrace();
+            return false;
+        }
+
+    }
+
+    @ResponseBody
+    @PostMapping("/base/pointMerchars/writeOffGoodsStatus")
+    public boolean writeOffGoodsStatus(@RequestBody Map<String, Object> map){
+        try {
+            String o = (String) map.get("goodsId");
+            Integer managerId = (Integer) map.get("managerId");
+            UserPointsMerchandise byId = upmseService.getOne(new LambdaQueryWrapper<UserPointsMerchandise>()
+                    .eq(UserPointsMerchandise::getId,Long.parseLong(o) ));
+            if (byId.getStatus() == 2){
+                return false;
+            }
+            byId.setStatus(2);
+            byId.setVerificationUserId(managerId);
+            byId.setVerificationTime(new Date());
+            upmseService.update(byId,new LambdaQueryWrapper<UserPointsMerchandise>()
+                    .eq(UserPointsMerchandise::getUserId,byId.getUserId())
+                    .eq(UserPointsMerchandise::getId,byId.getId()));
+            System.out.println(byId);
+            return true;
+        }catch (Exception e){
+            return false;
+        }
+    }
+
+
 }
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandise.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandise.java
index 9b7bd28..bb20553 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandise.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandise.java
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -98,11 +99,13 @@
      * 开始时间
      */
     @TableField("startTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date startTime;
     /**
      * 结束时间
      */
     @TableField("endTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date endTime;
     /**
      * 使用范围(1=全国,2=指定城市,3=指定门店)
@@ -148,6 +151,7 @@
      * 添加时间
      */
     @TableField("insertTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date insertTime;
     /**
      * 课包支付配置id
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandiseCity.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandiseCity.java
new file mode 100644
index 0000000..357ef8f
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandiseCity.java
@@ -0,0 +1,67 @@
+package com.dsh.activity.entity;
+
+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-07-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("t_points_merchandise_city")
+public class PointsMerchandiseCity extends Model<PointsMerchandiseCity> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 积分商品id
+     */
+    @TableField("pointsMerchandiseId")
+    private Integer pointsMerchandiseId;
+    /**
+     *
+     */
+    @TableField("city")
+    private String city;
+    /**
+     *
+     */
+    @TableField("cityCode")
+    private String cityCode;
+    /**
+     *
+     */
+    @TableField("province")
+    private String province;
+    /**
+     *
+     */
+    @TableField("provinceCode")
+    private String provinceCode;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/mapper/PointsMerchandiseCityMapper.java b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/PointsMerchandiseCityMapper.java
new file mode 100644
index 0000000..91eb2c9
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/PointsMerchandiseCityMapper.java
@@ -0,0 +1,16 @@
+package com.dsh.activity.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dsh.activity.entity.PointsMerchandiseCity;
+
+/**
+ * <p>
+ * 积分商品使用门店关系数据 Mapper 接口
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-07-12
+ */
+public interface PointsMerchandiseCityMapper extends BaseMapper<PointsMerchandiseCity> {
+
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/mapper/PointsMerchandiseMapper.java b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/PointsMerchandiseMapper.java
index 1293821..721e0d3 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/mapper/PointsMerchandiseMapper.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/PointsMerchandiseMapper.java
@@ -26,4 +26,8 @@
                                                      @Param("state") Integer state,
                                                      @Param("page") Page<Map<String, Object>> page);
 
+
+    void saveCity(@Param("id") Integer id, @Param("province") String province, @Param("provinceCode") String provinceCode, @Param("city") String city, @Param("cityCode") String cityCode);
+
+
 }
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/model/response/GoodsInfoOneVo.java b/cloud-server-activity/src/main/java/com/dsh/activity/model/response/GoodsInfoOneVo.java
new file mode 100644
index 0000000..9dd5f71
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/model/response/GoodsInfoOneVo.java
@@ -0,0 +1,77 @@
+package com.dsh.activity.model.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class GoodsInfoOneVo {
+
+
+    String name;
+    /**
+     * 封面图
+     */
+    String cover;
+    /**
+     * 原价
+     */
+    BigDecimal price;
+    /**
+     * 兑换方式(1=积分,2=现金+积分, 3=现金)
+     */
+    Integer exchangeMethod;
+    /**
+     * 现金
+     */
+    BigDecimal cash;
+    /**
+     * 积分
+     */
+    Integer integral;
+    /**
+     * 图片
+     */
+    String pics;
+    /**
+     * 用户人群
+     */
+    String userPopulation;
+    /**
+     * 发放数量
+     */
+    Integer quantityIssued;
+    /**
+     * 已领数量
+     */
+    Integer hasPicked;
+    /**
+     * 限领数量
+     */
+    Integer pickUpQuantity;
+    /**
+     * 有效期
+     */
+    String validTime;
+    /**
+     * 兑换地点
+     */
+    String exchangeArea;
+    /**
+     * 兑换地点 (1=全国,2=指定城市,3=指定门店)
+     */
+    Integer useScope;
+    /**
+     * 商品说明
+     */
+    String redemptionInstructions;
+    /**
+     * 排序
+     */
+    Integer sort;
+
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/model/response/StoreVos.java b/cloud-server-activity/src/main/java/com/dsh/activity/model/response/StoreVos.java
new file mode 100644
index 0000000..aa7ffbb
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/model/response/StoreVos.java
@@ -0,0 +1,16 @@
+package com.dsh.activity.model.response;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class StoreVos {
+
+    String num1;
+
+    String num2;
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/PointsMerchandiseCityService.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/PointsMerchandiseCityService.java
new file mode 100644
index 0000000..9b42bbe
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/PointsMerchandiseCityService.java
@@ -0,0 +1,16 @@
+package com.dsh.activity.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dsh.activity.entity.PointsMerchandiseCity;
+
+/**
+ * <p>
+ * 积分商品使用门店关系数据 服务类
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-07-12
+ */
+public interface PointsMerchandiseCityService extends IService<PointsMerchandiseCity> {
+
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/PointsMerchandiseService.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/PointsMerchandiseService.java
index a27221b..5ac48d5 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/service/PointsMerchandiseService.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/PointsMerchandiseService.java
@@ -19,4 +19,6 @@
 
     List<Map<String, Object>> queryGoodsListOfSearch(IntegralGoodsOfSearch ofSearch);
 
+    void saveCity(Integer id, String province, String provinceCode, String city, String cityCode);
+
 }
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PointsMerchandiseCityServiceImpl.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PointsMerchandiseCityServiceImpl.java
new file mode 100644
index 0000000..457096c
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PointsMerchandiseCityServiceImpl.java
@@ -0,0 +1,20 @@
+package com.dsh.activity.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dsh.activity.entity.PointsMerchandiseCity;
+import com.dsh.activity.mapper.PointsMerchandiseCityMapper;
+import com.dsh.activity.service.PointsMerchandiseCityService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 积分商品使用门店关系数据 服务实现类
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-07-12
+ */
+@Service
+public class PointsMerchandiseCityServiceImpl extends ServiceImpl<PointsMerchandiseCityMapper, PointsMerchandiseCity> implements PointsMerchandiseCityService {
+
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PointsMerchandiseServiceImpl.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PointsMerchandiseServiceImpl.java
index 3709d22..85e4cde 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PointsMerchandiseServiceImpl.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PointsMerchandiseServiceImpl.java
@@ -26,4 +26,10 @@
         return this.baseMapper.queryGoodsListOfSearch(ofSearch.getName(),ofSearch.getType(),ofSearch.getRedemptionMethod(),
                 ofSearch.getUserPopulation(),ofSearch.getActiveStatus(),ofSearch.getState(),ofSearch.getPage());
     }
+
+
+    @Override
+    public void saveCity(Integer id, String province, String provinceCode, String city, String cityCode) {
+        this.baseMapper.saveCity(id,province,provinceCode,city,cityCode);
+    }
 }
diff --git a/cloud-server-activity/src/main/resources/mapper/PointsMerchandiseCityMapper.xml b/cloud-server-activity/src/main/resources/mapper/PointsMerchandiseCityMapper.xml
new file mode 100644
index 0000000..9ff98bd
--- /dev/null
+++ b/cloud-server-activity/src/main/resources/mapper/PointsMerchandiseCityMapper.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.activity.mapper.PointsMerchandiseCityMapper">
+
+
+</mapper>
diff --git a/cloud-server-activity/src/main/resources/mapper/PointsMerchandiseMapper.xml b/cloud-server-activity/src/main/resources/mapper/PointsMerchandiseMapper.xml
index 38bcc37..a69138a 100644
--- a/cloud-server-activity/src/main/resources/mapper/PointsMerchandiseMapper.xml
+++ b/cloud-server-activity/src/main/resources/mapper/PointsMerchandiseMapper.xml
@@ -35,4 +35,10 @@
         </if>
         order by insertTime desc
     </select>
+
+
+    <insert id="saveCity">
+        insert into t_points_merchandise_city (id,pointsMerchandiseId,city,cityCode,province,provinceCode) value (null ,#{id},#{city},#{cityCode},#{province},#{provinceCode})
+    </insert>
+
 </mapper>
diff --git a/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java
index b1478b6..337f37d 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java
@@ -2,9 +2,11 @@
 
 
 import cn.mb.cloud.common.data.controller.BaseController;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.dsh.course.entity.TCourse;
+import com.dsh.course.entity.TCoursePackage;
 import com.dsh.course.entity.TCoursePackagePayment;
 import com.dsh.course.entity.TCoursePackageType;
 import com.dsh.course.feignclient.model.ExerciseVideo;
@@ -34,6 +36,7 @@
 import javax.servlet.http.HttpServletResponse;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -340,6 +343,20 @@
     }
 
 
+    @PostMapping("/course/getPageageType")
+    public List<Map<String, Object>> getPageageType(){
+        List<TCoursePackageType> list = coursePackageTypeService.list(new LambdaQueryWrapper<TCoursePackageType>().eq(TCoursePackageType::getState, 1));
+        ArrayList<Map<String, Object>> objects = new ArrayList<>();
+        for (TCoursePackageType tCoursePackageType : list) {
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("id",tCoursePackageType.getId());
+            map.put("name",tCoursePackageType.getName());
+            objects.add(map);
+        }
+        return objects;
+    }
+
+
     /**
      * 获取课程管理列表数据
      * @param queryCourseList
@@ -416,4 +433,22 @@
     public List<TCourse> queryCourseByType(@RequestBody Integer type){
         return courseService.list(new QueryWrapper<TCourse>().eq("type", type).eq("state", 1));
     }
+
+
+    @PostMapping("/course/queryPackageById")
+    public List<String> queryPackageById(@RequestBody Integer coursePackageId){
+        ArrayList<String> strings = new ArrayList<>();
+        TCoursePackage byId = coursePackageService.getById(coursePackageId);
+        Integer coursePackageTypeId = byId.getCoursePackageTypeId();
+        strings.add(coursePackageTypeService.getById(coursePackageTypeId).getName());
+        strings.add(byId.getName());
+
+        return strings;
+
+    }
+
+    @PostMapping("/course/getHours")
+    public String getHours(@RequestBody Integer coursePackageId1){
+        return coursePackageService.getHours(coursePackageId1);
+    }
 }
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/PointMercharsClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/PointMercharsClient.java
index 7c252e3..21ca434 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/PointMercharsClient.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/PointMercharsClient.java
@@ -5,6 +5,9 @@
 import com.dsh.course.feignClient.activity.model.IntegralGoodsOfSearch;
 import com.dsh.course.feignClient.activity.model.PointMercharsPayedVo;
 import com.dsh.course.feignClient.activity.model.PointMercharsVo;
+import com.dsh.course.feignClient.activity.model.PointsMerchandise;
+import com.dsh.guns.modular.system.model.GoodsInfoOneVo;
+import com.dsh.guns.modular.system.model.StoreVos;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -27,4 +30,37 @@
     @PostMapping("/base/pointMerchars/queryUserPayedGoodsList")
     List<Map<String, Object>> queryUserPayedGoodsList(@RequestBody PointMercharsPayedVo pointMercharsPayedVo);
 
+    @PostMapping("/base/pointMerchars/queryPointMerchaseById")
+    PointsMerchandise queryPointMerchaseById(Integer id);
+
+
+    @PostMapping("/base/pointMerchars/getshopName")
+    Integer getshopName(Integer id);
+
+
+    @PostMapping("/base/pointMerchars/queryDetailsOfGoods")
+    GoodsInfoOneVo queryDetailsOfGoods(@RequestBody Integer id);
+
+    @PostMapping("/base/pointMerchars/getProvinces")
+    List<StoreVos> getProvinces(@RequestBody Integer id);
+
+    @PostMapping("/base/pointMerchars/getStoreList")
+    List<StoreVos> getStoreList(@RequestBody Integer id);
+
+    @PostMapping("/base/pointMerchars/updateGoodsDetail")
+    boolean updateGoodsDetail(@RequestBody Map<String, Object> stringObjectHashMap);
+
+    @PostMapping("/base/pointMerchars/add")
+    Integer add(PointsMerchandise pointsMerchandise);
+
+
+    @PostMapping("/base/pointMerchars/addOther")
+    Boolean addOther(@RequestBody String pam);
+
+    @PostMapping("/base/pointMerchars/addCitys")
+    Boolean addCitys(@RequestBody List<Map<String, String>> objects);
+
+    @PostMapping("/base/pointMerchars/writeOffGoodsStatus")
+    boolean writeOffGoodsStatus(@RequestBody Map<String, Object> map);
+
 }
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/PointsMerchandise.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/PointsMerchandise.java
new file mode 100644
index 0000000..4e8d7ca6
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/PointsMerchandise.java
@@ -0,0 +1,174 @@
+package com.dsh.course.feignClient.activity.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 com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 积分商品
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-07-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("t_points_merchandise")
+public class PointsMerchandise extends Model<PointsMerchandise> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 类型(1=实体商品,2=课包商品,3=门票商品 4=优惠券)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 商品名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 课包id
+     */
+    @TableField("coursePackageId")
+    private Integer coursePackageId;
+    /**
+     * 原价
+     */
+    @TableField("price")
+    private BigDecimal price;
+    /**
+     * 兑换方式(1=积分,2=现金+积分)
+     */
+    @TableField("redemptionMethod")
+    private Integer redemptionMethod;
+    /**
+     * 所需现金
+     */
+    @TableField("cash")
+    private BigDecimal cash;
+    /**
+     * 所属积分
+     */
+    @TableField("integral")
+    private Integer integral;
+    /**
+     * 商品封面
+     */
+    @TableField("cover")
+    private String cover;
+    /**
+     * 商品图片
+     */
+    @TableField("productImages")
+    private String productImages;
+    /**
+     * 用户人群(1=全部用户,2=年度会员,3=已有学员用户)
+     */
+    @TableField("userPopulation")
+    private Integer userPopulation;
+    /**
+     * 发放数量
+     */
+    @TableField("quantityIssued")
+    private Integer quantityIssued;
+    /**
+     * 限领数量
+     */
+    @TableField("pickUpQuantity")
+    private Integer pickUpQuantity;
+    /**
+     * 开始时间
+     */
+    @TableField("startTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startTime;
+    /**
+     * 结束时间
+     */
+    @TableField("endTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endTime;
+    /**
+     * 使用范围(1=全国,2=指定城市,3=指定门店)
+     */
+    @TableField("useScope")
+    private Integer useScope;
+    /**
+     * 省
+     */
+    @TableField("province")
+    private String province;
+    /**
+     * 省编号
+     */
+    @TableField("provinceCode")
+    private String provinceCode;
+    /**
+     * 市
+     */
+    @TableField("city")
+    private String city;
+    /**
+     * 市编号
+     */
+    @TableField("cityCode")
+    private String cityCode;
+    /**
+     * 兑换说明
+     */
+    @TableField("redemptionInstructions")
+    private String redemptionInstructions;
+    /**
+     * 排序
+     */
+    @TableField("sort")
+    private Integer sort;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date insertTime;
+    /**
+     * 课包支付配置id
+     */
+    @TableField("coursePackageConfigId")
+    private Integer coursePackageConfigId;
+    /**
+     * 1=上架 2=下架
+     */
+    @TableField("shelves")
+    private Integer shelves;
+    @TableField("cardType")
+    private Integer cardType;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java
index fe050a9..171b993 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java
@@ -95,4 +95,16 @@
      */
     @PostMapping("/course/queryCourseByType")
     List<TCourse> queryCourseByType(Integer type);
+
+
+    @PostMapping("/course/getPageageType")
+    List<Map<String, Object>> getPageageType();
+
+
+
+    @PostMapping("/course/queryPackageById")
+    List<String> queryPackageById(Integer coursePackageId);
+
+    @PostMapping("/course/getHours")
+    String getHours(Integer coursePackageId1);
 }
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TGoodsController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TGoodsController.java
index 58c86e5..7c36464 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TGoodsController.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TGoodsController.java
@@ -13,15 +13,14 @@
 import com.dsh.course.feignClient.activity.CouponClient;
 import com.dsh.course.feignClient.activity.PointMercharsClient;
 import com.dsh.course.feignClient.activity.model.*;
+import com.dsh.course.feignClient.course.CourseClient;
 import com.dsh.guns.config.UserExt;
+import com.dsh.guns.core.base.controller.BaseController;
 import com.dsh.guns.core.base.tips.ErrorTip;
 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.CouponDataVo;
-import com.dsh.guns.modular.system.model.Region;
-import com.dsh.guns.modular.system.model.TCity;
-import com.dsh.guns.modular.system.model.TStore;
+import com.dsh.guns.modular.system.model.*;
 import com.dsh.guns.modular.system.service.ICityService;
 import com.dsh.guns.modular.system.service.IRegionService;
 import com.dsh.guns.modular.system.service.IStoreService;
@@ -34,11 +33,10 @@
 
 import javax.annotation.Resource;
 import java.io.IOException;
+import java.math.BigDecimal;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -48,7 +46,7 @@
 
 @Controller
 @RequestMapping("/tGoods")
-public class TGoodsController {
+public class TGoodsController extends BaseController {
 
 
 
@@ -71,6 +69,9 @@
     private AppUserClient appUserClient;
     @Autowired
     private ICityService cityService;
+
+    @Autowired
+    private CourseClient courseClient;
 
     @Resource
     private PointMercharsClient pointMercharsClient;
@@ -96,7 +97,72 @@
         model.addAttribute("userType",objectType);
         List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
         model.addAttribute("list",list);
+        List<Map<String,Object>> listOne =  courseClient.getPageageType();
+        model.addAttribute("courseType",listOne);
+
+
         return PREFIX + "TGoods_add.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/tGoods_info")
+    public String tGoodsInfo(Model model) {
+        Integer objectType = UserExt.getUser().getObjectType();
+        System.out.println(objectType);
+        model.addAttribute("userType",objectType);
+        List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
+        model.addAttribute("list",list);
+        return PREFIX + "TGoods_detail_one.html";
+    }
+
+    @RequestMapping("/goods_info/{id}")
+    public String memberCouponInfo(@PathVariable Integer id, Model model) {
+        PointsMerchandise pointMercharsVo = pointMercharsClient.queryPointMerchaseById(id);
+        model.addAttribute("item",pointMercharsVo);
+        if(pointMercharsVo.getType()==2){
+            Date startTime = pointMercharsVo.getStartTime();
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+            model.addAttribute("sTime",format.format(startTime));
+            model.addAttribute("eTime",format.format(pointMercharsVo.getEndTime()));
+            Integer shopId = pointMercharsClient.getshopName(id);
+            TStore byId = storeService.getById(shopId);
+            model.addAttribute("shopName",byId.getName());
+            Integer coursePackageId = pointMercharsVo.getCoursePackageId();
+            List<String> name = courseClient.queryPackageById(coursePackageId);
+            Integer coursePackageId1 = pointMercharsVo.getCoursePackageId();
+            String classHours = courseClient.getHours(coursePackageId1);
+            model.addAttribute("typeName",name.get(0));
+            model.addAttribute("pageName",name.get(1));
+            model.addAttribute("classHours",classHours);
+            String productImages = pointMercharsVo.getProductImages();
+            ArrayList<String> strings = new ArrayList<>();
+            for (String s : productImages.split(",")) {
+                strings.add(s);
+            }
+            model.addAttribute("pictures",strings);
+            return PREFIX + "TGoods_detail_two.html";
+        }else {
+            GoodsInfoOneVo infoOneVo = pointMercharsClient.queryDetailsOfGoods(id);
+            System.out.println("pointMercharsVo:"+infoOneVo);
+            model.addAttribute("item",infoOneVo);
+            String[] split = infoOneVo.getPics().split(",");
+            List<String> list = Arrays.asList(split);
+            if (infoOneVo.getUseScope() == 2){
+                List<StoreVos> provinces = pointMercharsClient.getProvinces(id);
+                model.addAttribute("city",provinces);
+            }
+            if (infoOneVo.getUseScope() == 2){
+                List<StoreVos> storeVos = pointMercharsClient.getStoreList(id);
+                model.addAttribute("store",storeVos);
+            }
+            model.addAttribute("pictures",list);
+            model.addAttribute("exchangeMethod",infoOneVo.getExchangeMethod());
+            return PREFIX + "TGoods_detail_one.html";
+        }
+
+
     }
 
 
@@ -303,15 +369,131 @@
         client.insertIntoData(dataVo);
         return new SuccessTip<>();
     }
+
+    /**
+     *  编辑 商品详情
+     * @param pointMerchandiseId 商品Id
+     * @param quantityIssued 发放数量
+     * @param pickUpQuantity 限领数量
+     * @param redemptionInstructions 说明
+     * @param cover 封面图
+     * @param productImages 商品图片
+     * @param sort 排序
+     * @return
+     */
     @PostMapping(value = "/update")
     @ResponseBody
-    public Object update( Integer id,Integer num,Integer num1,String text){
-        Coupon coupon = client.queryCouponById(id);
-        coupon.setQuantityIssued(num);
-        coupon.setPickUpQuantity(num1);
-        coupon.setIllustrate(text);
-        client.updateCouponData(coupon);
+    public Object update( Integer pointMerchandiseId,Integer quantityIssued,Integer pickUpQuantity,String redemptionInstructions,String cover,String productImages,Integer sort){
+        Map<String, Object> stringObjectHashMap = new HashMap<>();
+        stringObjectHashMap.put("pointMerchandiseId",pointMerchandiseId);
+        stringObjectHashMap.put("quantityIssued",quantityIssued);
+        stringObjectHashMap.put("pickUpQuantity",pickUpQuantity);
+        stringObjectHashMap.put("redemptionInstructions",redemptionInstructions);
+        stringObjectHashMap.put("cover",cover);
+        stringObjectHashMap.put("productImages",productImages);
+        stringObjectHashMap.put("sort",sort);
+        System.out.println(stringObjectHashMap);
+        pointMercharsClient.updateGoodsDetail(stringObjectHashMap);
         return new SuccessTip<>();
+    }
+    /*
+    ajax.set("typeAll",typeAll);
+        ajax.set("provinceCode",pCode);
+        ajax.set("cityCode",cCode);
+        ajax.set("storeId",storeId);
+        ajax.set("coursePackageTypeId",coursePackageTypeId);
+        ajax.set("coursePackageId",coursePackageId);
+        ajax.set("coursePackageConfigId",coursePackageConfigId);
+        ajax.set("price",price);
+        ajax.set("type",type);
+        ajax.set("integral",integral);
+        ajax.set("cash",cash);
+        ajax.set("cover",cover1);
+        ajax.set("imgOne",imgOne);
+        ajax.set("userPopulation",userPopulation);
+        ajax.set("quantityIssued",quantityIssued);
+        ajax.set("pickUpQuantity",pickUpQuantity);
+        ajax.set("startTime",startTime);
+        ajax.set("text",text);
+        ajax.set("sort",sort);
+        ajax.set("useScope",company);
+        ajax.set("cityIds",cts);
+        ajax.set("storeIds",stores);
+     */
+    @PostMapping(value = "/add")
+    @ResponseBody
+    public Object add( Integer typeAll,String provinceCode,String cityCode,Integer storeId,Integer coursePackageTypeId,Integer coursePackageId,Integer coursePackageConfigId,
+                       Double price,Integer type,Integer integral,Double cash,String cover,String imgOne,Integer userPopulation,Integer quantityIssued,Integer pickUpQuantity,
+                       String startTime,String text,Integer sort,String name,Integer useScope,String cityIds,String storeIds,Integer cardType
+    ) throws ParseException {
+        PointsMerchandise pointsMerchandise = new PointsMerchandise();
+        pointsMerchandise.setType(typeAll);
+        pointsMerchandise.setName(name);
+        pointsMerchandise.setCoursePackageId(coursePackageId);
+        pointsMerchandise.setPrice(new BigDecimal(price));
+        pointsMerchandise.setRedemptionMethod(type);
+        if(type==2 || type==3){
+            pointsMerchandise.setCash(new BigDecimal(cash));
+        }
+        if(type==1 || type==2){
+            pointsMerchandise.setIntegral(integral);
+        }
+        pointsMerchandise.setCover(cover);
+        pointsMerchandise.setProductImages(imgOne);
+        pointsMerchandise.setUserPopulation(userPopulation);
+        pointsMerchandise.setCardType(cardType);
+        pointsMerchandise.setQuantityIssued(quantityIssued);
+        pointsMerchandise.setPickUpQuantity(pickUpQuantity);
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        pointsMerchandise.setStartTime(format.parse(startTime.split(" - ")[0]));
+        pointsMerchandise.setEndTime(format.parse(startTime.split(" - ")[1]));
+        pointsMerchandise.setUseScope(useScope);
+        if(ToolUtil.isNotEmpty(provinceCode)){
+            TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, provinceCode));
+            pointsMerchandise.setProvinceCode(provinceCode);
+            pointsMerchandise.setProvince(one.getName());
+        }
+        if(ToolUtil.isNotEmpty(cityCode)){
+            TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, cityCode));
+            pointsMerchandise.setCityCode(cityCode);
+            pointsMerchandise.setCity(one.getName());
+        }
+        pointsMerchandise.setRedemptionInstructions(text);
+        pointsMerchandise.setSort(sort);
+        pointsMerchandise.setState(1);
+        pointsMerchandise.setInsertTime(new Date());
+        pointsMerchandise.setCoursePackageConfigId(coursePackageConfigId);
+        // 代替storeId
+        pointsMerchandise.setShelves(storeId);
+        Integer id = pointMercharsClient.add(pointsMerchandise);
+        if(typeAll!=2){
+            if(useScope==2){
+                ArrayList<Map<String,String>> objects = new ArrayList<>();
+                for (String s : cityIds.split(",")) {
+                    TCity tCity = cityService.getById(Integer.valueOf(s));
+                    HashMap<String, String> map = new HashMap<>();
+                    TCity pCity = cityService.getById(tCity.getParentId());
+                    map.put("pName",pCity.getName());
+                    map.put("pCode",pCity.getCode());
+                    map.put("cName",tCity.getName());
+                    map.put("cCode",tCity.getCode());
+                    map.put("id",id.toString());
+                    objects.add(map);
+                }
+                pointMercharsClient.addCitys(objects);
+            }else if(useScope==3){
+                String pam = id+"_"+storeIds;
+                // 添加多个城市 门店
+                try{
+                    pointMercharsClient.addOther(pam);
+
+                }catch (Exception e){
+                    e.printStackTrace();
+                }
+            }
+        }
+        return new SuccessTip<>();
+
     }
 
 
@@ -338,7 +520,7 @@
 
 
     /**
-     * 跳转到修改车辆管理
+     * 跳转到修改商品详情
      */
     @RequestMapping("/tGoods_update/{id}")
     public String tCityUpdate(@PathVariable Integer id, Model model) {
@@ -346,8 +528,11 @@
         PointMercharsVo pointMercharsVo = pointMercharsClient.queryPointMerchaseDetailOfId(id);
         System.out.println("pointMercharsVo:"+pointMercharsVo);
         String[] split = pointMercharsVo.getPics().split(",");
+        List<String> list = Arrays.asList(split);
+        model.addAttribute("id",id);
         model.addAttribute("item",pointMercharsVo);
-        model.addAttribute("pictures",split);
+        model.addAttribute("pictures",list);
+        System.out.println(list);
         return PREFIX + "TGoods_edit.html";
     }
 
@@ -434,11 +619,23 @@
      */
     @RequestMapping("/write_off")
     @ResponseBody
-    public Object GoodsWriteOff(Integer id){
-        System.out.println(id);
-        // TODO: 2023/8/15 核销操作
-        return new SuccessTip<>();
+    public Object GoodsWriteOff(String id){
+        Integer objectType = UserExt.getUser().getObjectType();
+        Map<String, Object> stringObjectHashMap = new HashMap<>();
+        stringObjectHashMap.put("goodsId",id);
+        stringObjectHashMap.put("managerId",objectType);
+        boolean b = pointMercharsClient.writeOffGoodsStatus(stringObjectHashMap);
+        System.out.println(b);
+        if (b){
+            return new SuccessTip<>();
+        }else {
+            return ERROR;
+        }
+
     }
 
 
+
+
+
 }
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/GoodsInfoOneVo.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/GoodsInfoOneVo.java
new file mode 100644
index 0000000..dfc1294
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/GoodsInfoOneVo.java
@@ -0,0 +1,78 @@
+package com.dsh.guns.modular.system.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class GoodsInfoOneVo {
+
+
+    String name;
+    /**
+     * 封面图
+     */
+    String cover;
+    /**
+     * 原价
+     */
+    BigDecimal price;
+    /**
+     * 兑换方式(1=积分,2=现金+积分, 3=现金)
+     */
+    Integer exchangeMethod;
+    /**
+     * 现金
+     */
+    BigDecimal cash;
+    /**
+     * 积分
+     */
+    Integer integral;
+    /**
+     * 图片
+     */
+    String pics;
+    /**
+     * 用户人群
+     */
+    String userPopulation;
+    /**
+     * 发放数量
+     */
+    Integer quantityIssued;
+    /**
+     * 已领数量
+     */
+    Integer hasPicked;
+    /**
+     * 限领数量
+     */
+    Integer pickUpQuantity;
+    /**
+     * 有效期
+     */
+    String validTime;
+    /**
+     * 兑换点
+     */
+    String exchangeArea;
+    /**
+     * 兑换地点 (1=全国,2=指定城市,3=指定门店)
+     */
+    Integer useScope;
+    /**
+     * 商品说明
+     */
+    String redemptionInstructions;
+    /**
+     * 排序
+     */
+    Integer sort;
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/StoreVos.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/StoreVos.java
new file mode 100644
index 0000000..1ce4dc4
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/StoreVos.java
@@ -0,0 +1,18 @@
+package com.dsh.guns.modular.system.model;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class StoreVos {
+
+    String num1;
+
+    String num2;
+
+    String num3;
+}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_add.html
index 2a03a9d..e64b2c4 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_add.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_add.html
@@ -49,13 +49,22 @@
             </div>
             <div id="b1">
         <#input id="name" name="商品名称" type="text"/>
+        <div class="form-group" id="ticket" hidden>
+            <label class="col-sm-3 control-label">门票类型:</label>
+            <div class="col-sm-9">
+                <input type="radio" name="cardType" value="1"   checked> 日卡
+                <input type="radio" name="cardType" value="2"> 月卡
+                <input type="radio" name="cardType" value="3" > 季卡
+                <input type="radio" name="cardType" value="4" > 年卡
+            </div>
+        </div>
         <#input id="price" name="原价" type="text"/>
             <div class="form-group">
                 <label class="col-sm-3 control-label">兑换方式:</label>
                 <div class="col-sm-9">
-                    <input type="radio" name="redemptionMethod" value="1" checked> 积分
-                    <input type="radio" name="redemptionMethod" value="2" > 现金+积分
-                    <input type="radio" name="redemptionMethod" value="3" > 现金
+                    <input type="radio" name="redemptionMethod" value="1"  onclick="updateMethod(3)" checked> 积分
+                    <input type="radio" name="redemptionMethod" value="2" onclick="updateMethod(4)"> 现金+积分
+                    <input type="radio" name="redemptionMethod" value="3" onclick="updateMethod(5)"> 现金
                 </div>
             </div>
 
@@ -76,26 +85,29 @@
             </div>
 
             <#avatar id="cover" name="商品封面" />
-            <div class="row" id="app" style="margin-left: 225px;" >
-                <div class="col-sm-6">
-                    <div class="form-group">
-                        <label class="col-sm-3 control-label">商品图片: </label>
-                        <div class="col-sm-2" style="margin-top: 2%">
-                            <el-upload
-                                    class="avatar-uploader"
-                                    action="/tCouponManage/uploadPic"
-                                    :on-success="handleAvatarSuccess"
-                                    accept=".jpg,.jpeg,.png,.JPG,.JPEG"
-                                    :on-remove="handleRemove"
-                                    :before-upload="beforeAvatarUpload">
-                                <img v-if="imageUrl" :src="imageUrl" class="avatar">
-                                <i v-else class="el-icon-plus avatar-uploader-icon"></i>
-                            </el-upload>
-                        </div>
-                    </div>
 
+                <div class="row" id="app" >
+                    <div class="col-sm-6" style="width: 100%">
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label" style="width: 15%;margin-left: 7%">*商品图片(请上传不超过五张图片): </label>
+                            <div class="col-sm-2" style="width: 100%;margin-left: 12%;margin-top: 1%">
+                                <el-upload
+                                        :limit="5"
+                                        class="avatar-uploader"
+                                        action="/tCouponManage/uploadPic"
+                                        list-type="picture-card"
+                                        accept=".jpg,.jpeg,.png,.JPG,.JPEG"
+                                        :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=""></el-dialog>
+                            </div>
+                        </div>
+
+                    </div>
                 </div>
-            </div>
 
 
             <div class="form-group">
@@ -129,17 +141,17 @@
                             <label class="col-sm-3">*适用范围: </label>
                             <div class="col-sm-2" id="belongsNationwide" >
                                 <input class="col-sm-1" onclick="scopeOfApplication1()" name="company" type="radio"
-                                       value="0" checked style="margin-top: 10px"/>
+                                       value="1" checked style="margin-top: 10px"/>
                                 <label class="col-sm-1" style="width: 38%;margin-top: 7px">全国通用</label>
                             </div>
                             <div class="col-sm-2" id="belongsCity"  >
                                 <input class="col-sm-1" name="company" onclick="scopeOfApplication2()" type="radio"
-                                       value="1"  style="margin-top: 10px"/>
+                                       value="2"  style="margin-top: 10px"/>
                                 <label class="col-sm-1" style="width: 38%;margin-top: 7px">指定城市</label>
                             </div>
                             <div class="col-sm-2" id="belongsStore"  >
                                 <input class="col-sm-1" name="company" onclick="scopeOfApplication3()" type="radio"
-                                       value="1" style="margin-left: 4%;margin-top: 10px;width: 13px;height: 13px"/>
+                                       value="3" style="margin-left: 4%;margin-top: 10px;width: 13px;height: 13px"/>
                                 <label class="col-sm-1" style="width: 38%;margin-top: 6px;">指定门店</label>
                             </div>
                         </div>
@@ -161,7 +173,7 @@
                                 <option value="">请选择</option>
                             </select>
                             <label class="col-sm-1" style="width: 7%;margin-top: 7px">市</label>
-                            <label name="addBranch" class="col-sm-1" onclick="TCarInfoDlg.addBranch()" style="border: 0px;cursor: pointer;margin-top: 1%"><i class="fa fa-plus-circle"></i></label>
+                            <label name="addBranch" class="col-sm-1" onclick="TGoodsInfoDlg.addBranch()" style="border: 0px;cursor: pointer;margin-top: 1%"><i class="fa fa-plus-circle"></i></label>
                         </div>
                         <div id="cityDemo"></div>
                     </div>
@@ -217,7 +229,7 @@
                 <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)">
+                        <select class="form-control" id="pCode" name="pCode" onchange="TGoodsInfoDlg.oneChange(this)">
                             <option value="">选择省</option>
                             @for(obj in list){
                             <option value="${obj.code}">${obj.name}</option>
@@ -228,9 +240,141 @@
                 <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">
+                        <select class="form-control" id="cCode" name="cCode"  onchange="TGoodsInfoDlg.storeChange(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="storeId" name="storeId">
+                            <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="coursePackageTypeId" name="pCode" onchange="TGoodsInfoDlg.packageChange(this)">
+                            <option value="">选择课包类型</option>
+                            @for(obj in courseType){
+                            <option value="${obj.id}">${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="coursePackageId" name="coursePackageId" onchange="TGoodsInfoDlg.timeChange(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="coursePackageConfigId" name="coursePackageConfigId">
+                            <option value="">选择课时数</option>
+                        </select>
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">原价:</label>
+                    <div class="col-sm-9">
+                        <input class="form-control" id="price1" name="price" type="text">
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">兑换方式:</label>
+                    <div class="col-sm-9">
+                        <input type="radio" name="redemptionMethod" value="1" checked onclick="updateMethod(1)" > 积分
+                        <input type="radio" name="redemptionMethod" value="2" onclick="updateMethod(2)"> 现金+积分
+                    </div>
+                </div>
+
+                <div class="form-group" id="y3" hidden>
+                    <label class="col-sm-3 control-label">所需现金:</label>
+                    <div class="col-sm-9">
+                        <input class="form-control" id="cash1" name="cash" type="text">
+
+                    </div>
+                </div>
+                <div class="form-group" id="y4">
+                    <label class="col-sm-3 control-label">所需积分:</label>
+                    <div class="col-sm-9">
+                        <input class="form-control" id="integral1" name="integral" type="text">
+
+                    </div>
+                </div>
+
+
+                <#avatar id="cover1" name="*商品封面" />
+                <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: 7%">*商品图片(请上传不超过五张图片): </label>
+                            <div class="col-sm-2" style="width: 100%;margin-left: 12%;margin-top: 1%">
+                                <el-upload
+                                        :limit="5"
+                                        class="avatar-uploader"
+                                        action="/tCouponManage/uploadPic"
+                                        list-type="picture-card"
+                                        accept=".jpg,.jpeg,.png,.JPG,.JPEG"
+                                        :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=""></el-dialog>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">用户人群:</label>
+                    <div class="col-sm-9">
+                        <input type="radio" name="userPopulation" value="1" checked> 全部用户
+                        <input type="radio" name="userPopulation" value="2" > 年度会员
+                        <input type="radio" name="userPopulation" value="3" > 已有学员用户
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">发放数量:</label>
+                    <div class="col-sm-9">
+                        <input class="form-control" id="quantityIssued1" name="quantityIssued" type="text">
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">限领数量:</label>
+                    <div class="col-sm-9">
+                        <input class="form-control" id="pickUpQuantity1" name="pickUpQuantity" type="text">
+                    </div>
+                </div>
+                <#input id="startTime1" name="有效期" type="text"/>
+
+                <div class="form-group" style="margin-left:262px">
+                    <label class="col-sm-1 control-label">兑换说明:</label>
+                    <div class="col-sm-5">
+                        <textarea type="text/plain" id="editor1"  style="height: 300px;width: 800px;"></textarea>
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">排序:</label>
+                    <div class="col-sm-9">
+                        <input class="form-control" id="sort1" name="sort" type="text">
+
                     </div>
                 </div>
 
@@ -242,29 +386,64 @@
 
 <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()"/>
+        <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TGoodsInfoDlg.addSubmit()"/>
+        <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TGoodsInfoDlg.close()"/>
     </div>
 </div>
 
         </div>
 
-    </div>
-</div>
 <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 src="${ctxPath}/modular/system/tGoods/tGoods_info.js"></script>
 <script src="${ctxPath}/modular/system/tGoods/TStoreInfo.js"></script>
 <script>
+    laydate.render({
+        elem: '#startTime',
+        range: true
+    });
+    laydate.render({
+        elem: '#startTime1',
+        range: true
+    });
+    function updateMethod(e) {
+        console.log(e)
+        if(e==1){
+            $("#y3").hide()
+            $("#y4").show()
+        }else if(e==2){
+            $("#y4").show()
+            $("#y3").show()
+        }else if(e==3){
+            $("#y1").hide()
+            $("#y2").show()
+        }else if(e==4){
+            $("#y1").show()
+            $("#y2").show()
+        }else if(e==5) {
+            $("#y2").hide()
+            $("#y1").show()
+        }
 
+    }
+    let i =1;
     function updateType(e) {
+
         if(e==2){
             $("#b1").hide()
             $("#b2").show()
+            if(i==1){
+                var drivingLicensePhoto = new $WebUpload("cover1");
+                drivingLicensePhoto.setUploadBarId("progressBar");
+                drivingLicensePhoto.init();
+                i++;
+            }
+            $("#ticket").hide()
         }else {
-            $("#b2  ").hide()
+            $("#b2").hide()
             $("#b1").show()
+            $("#ticket").show()
         }
     }
 
@@ -341,7 +520,7 @@
         },
         methods: {
             handleAvatarSuccess(res, file) {
-                TCarInfoDlg.goodsPicArray.push(file);
+                TGoodsInfoDlg.goodsPicArray.push(file);
             },
             beforeAvatarUpload(file) {
                 const isLt2M = file.size / 1024 / 1024 < 10;
@@ -351,7 +530,34 @@
                 return isLt2M;
             },
             handleRemove(file, fileList) {
-                couponInfoDlg.goodsPicArray = couponInfoDlg.goodsPicArray.filter(item => {
+                TGoodsInfoDlg.goodsPicArray = TGoodsInfoDlg.goodsPicArray.filter(item => {
+                    return item.uid != file.uid;
+                });
+            },
+        },
+        created() {
+        },
+    });
+    var vue2 = new Vue({
+        el: '#app1',
+        data: {
+            autoUpload: true,//自动上传
+            imageUrl1: '',//模型数据,用于上传图片完成后图片预览
+            dialogVisible: false
+        },
+        methods: {
+            handleAvatarSuccess(res, file) {
+                TGoodsInfoDlg.goodsPicArray1.push(file);
+            },
+            beforeAvatarUpload(file) {
+                const isLt2M = file.size / 1024 / 1024 < 10;
+                if (!isLt2M) {
+                    this.$message.error('上传图片大小不能超过 10MB!');
+                }
+                return isLt2M;
+            },
+            handleRemove(file, fileList) {
+                TGoodsInfoDlg.goodsPicArray = TGoodsInfoDlg.goodsPicArray.filter(item => {
                     return item.uid != file.uid;
                 });
             },
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_detail_one.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_detail_one.html
new file mode 100644
index 0000000..e0e7f55
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_detail_one.html
@@ -0,0 +1,207 @@
+@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;
+        display: inline-block;
+    }
+
+    .avatar-uploader .el-upload:hover {
+        border-color: #409eff;
+    }
+
+    .avatar-uploader-icon {
+        font-size: 28px;
+        color: #8c939d;
+        width: 100px;
+        height: 100px;
+        line-height: 110px;
+        margin-top: 40px;
+        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">
+            <div id="b1">
+                <#input id="name" name="*商品名称:" type="text" value="${item.name}" readonly="true" />
+
+                <#input id="cover" name="*原价:" avatarImg="${item.price}" readonly="true" />
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label">*兑换方式:</label>
+                    <div class="col-sm-4">
+                        @if(exchangeMethod == 1){
+                        <input class="col-sm-1 control-label" name="userGroup" type="radio"
+                               value="1" checked style="margin-top: 10px" disabled/>
+                        <label class="col-sm-1" style="margin-left: -15px;width: 16%;margin-top: 7px">全部用户</label>
+                        <input class="col-sm-1 control-label" name="userGroup" type="radio"
+                               value="2"  style="margin-left: 5%;margin-top: 10px;width: 13px;height: 13px" disabled/>
+                        <label class="col-sm-1" style="width: 16%;margin-top: 7px">年度会员</label>
+                        <input class="col-sm-1 control-label" name="userGroup" type="radio"
+                               value="3"  style="margin-left: 4%;margin-top: 10px;width: 13px;height: 13px" disabled/>
+                        <label class="col-sm-1" style="width: 18%;margin-top: 5px">已有学员用户</label>
+                        @}
+
+                        @if(exchangeMethod == 2){
+                        <input class="col-sm-1 control-label" name="userGroup" type="radio"
+                               value="1"  style="margin-top: 10px" disabled/>
+                        <label class="col-sm-1" style="margin-left: -15px;width: 16%;margin-top: 7px">全部用户</label>
+                        <input class="col-sm-1 control-label" name="userGroup" type="radio"
+                               value="2"  checked style="margin-left: 5%;margin-top: 10px;width: 13px;height: 13px" disabled/>
+                        <label class="col-sm-1" style="width: 16%;margin-top: 7px">年度会员</label>
+                        <input class="col-sm-1 control-label" name="userGroup" type="radio"
+                               value="3"  style="margin-left: 4%;margin-top: 10px;width: 13px;height: 13px" disabled/>
+                        <label class="col-sm-1" style="width: 18%;margin-top: 5px">已有学员用户</label>
+                        @}
+
+                        @if(exchangeMethod == 3){
+                        <input class="col-sm-1 control-label" name="userGroup" type="radio"
+                               value="1"  style="margin-top: 10px" disabled/>
+                        <label class="col-sm-1" style="margin-left: -15px;width: 16%;margin-top: 7px">全部用户</label>
+                        <input class="col-sm-1 control-label" name="userGroup" type="radio"
+                               value="2"  style="margin-left: 5%;margin-top: 10px;width: 13px;height: 13px" disabled/>
+                        <label class="col-sm-1" style="width: 16%;margin-top: 7px">年度会员</label>
+                        <input class="col-sm-1 control-label" name="userGroup" type="radio"
+                               value="3" checked  style="margin-left: 4%;margin-top: 10px;width: 13px;height: 13px" disabled/>
+                        <label class="col-sm-1" style="width: 18%;margin-top: 5px">已有学员用户</label>
+                        @}
+
+                    </div>
+                </div>
+
+                <#input id="cover" name="*所需现金:" avatarImg="${item.cash}" readonly="true" />
+                <#input id="cover" name="*所需积分:" avatarImg="${item.integral}" readonly="true" />
+
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label">*商品封面:</label>
+                    <div class="col-sm-4">
+                        <img height="100px" width="100px" src="${item.cover}">
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <label class="col-sm-3 control-label head-scu-label">*商品图片:</label>
+                    <div class="col-sm-4">
+                        @if(pictures != null){
+                        @for(im in pictures){
+                            <img  height="100px" width="100px" src="${im}">
+                        @}
+                        @}
+                    </div>
+                </div>
+
+                <#input id="quantityIssued" name="*用户人群:" type="text" value="${item.userPopulation}" readonly="true" />
+                <#input id="quantityIssued" name="*发放数量:" type="text" value="${item.quantityIssued}" readonly="true" />
+                <#input id="quantityIssued" name="*限领数量:" type="text" value="${item.pickUpQuantity}" readonly="true" />
+                <#input id="quantityIssued" name="*已兑换数量:" type="text" value="${item.hasPicked}" readonly="true" />
+                <#input id="quantityIssued" name="*有效期:" type="text" value="${item.validTime}" readonly="true" />
+
+                <#input id="quantityIssued" name="*兑换地点:" type="text" value="${item.exchangeArea}" readonly="true" />
+
+                @if(item.useScope == 2){
+                <table class="table table-bordered" style="width: 70%;margin-left: 228px;" >
+                    <thead>
+                    <tr>
+                        <td>所在省市</td>
+                        <td>所属账号</td>
+                        <td>门店名称</td>
+                    </tr>
+                    </thead>
+                    @for(s in store){
+                    <td>${s.num1}</td>
+                    <td>${s.num2}</td>
+                    <td>${s.num3}</td>
+                    @}
+                </table>
+                @}
+
+                @if(item.useScope == 3){
+                <table class="table table-bordered" style="width: 70%;margin-left: 228px;" >
+                    <thead>
+                    <tr>
+                        <td>所在省市</td>
+                        <td>所属账号</td>
+                        <td>门店名称</td>
+                    </tr>
+                    </thead>
+                    @for(c in city){
+                    <td>${c.num1}</td>
+                    <td>${c.num2}</td>
+                    @}
+                </table>
+                @}
+                <div class="form-group" style="margin-left:262px">
+                    <label class="col-sm-3 control-label">兑换说明:</label>
+                    <div class="col-sm-4">
+                        <textarea type="text/plain" id="editor"  style="height: 300px;width: 800px;" readonly>${item.redemptionInstructions}</textarea>
+                    </div>
+                </div>
+                <#input id="quantityIssued" name="*排序:" type="text" value="${item.sort}" readonly="true" />
+
+            </div>
+        </div>
+    </div>
+
+    <div class="row btn-group-m-t">
+        <div class="col-sm-10 col-sm-offset-5">
+            <#button btnCss="danger" name="关闭" id="cancel" icon="fa-eraser" clickFun="TGoodsInfoDlg.close()"/>
+        </div>
+    </div>
+
+</div>
+
+</div>
+</div>
+<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 src="${ctxPath}/modular/system/tGoods/tGoods_info.js"></script>
+<script>
+    var vue2 = new Vue({
+        el: '#app',
+        data: {
+            autoUpload: true,//自动上传
+            imageUrl1: '',//模型数据,用于上传图片完成后图片预览
+            dialogVisible: false
+        },
+        methods: {
+            handleAvatarSuccess(res, file) {
+                TGoodsInfoDlg.goodsPicArray.push(file.response);
+            },
+            beforeAvatarUpload(file) {
+                const isLt2M = file.size / 1024 / 1024 < 10;
+                if (!isLt2M) {
+                    this.$message.error('上传图片大小不能超过 10MB!');
+                }
+                return isLt2M;
+            },
+            handleRemove(file, fileList) {
+                TGoodsInfoDlg.goodsPicArray = TGoodsInfoDlg.goodsPicArray.filter(item => {
+                    return item.uid != file.uid;
+                });
+            },
+        },
+        created() {
+        },
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_edit.html
index 59b18fe..0d43e8b 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_edit.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_edit.html
@@ -8,6 +8,7 @@
         height: 100px;
         width: 100px;
         overflow: hidden;
+        display: inline-block;
     }
 
     .avatar-uploader .el-upload:hover {
@@ -42,7 +43,7 @@
     <div class="ibox-content">
         <div class="form-horizontal" id="carInfoForm">
             <div id="b1">
-
+                <input id="goodsId" value="${id}" hidden="hidden">
                 <#input id="name" name="商品名称" type="text" value="${item.name}" readonly="true" />
 
                 <#avatar id="cover" name="商品封面:" avatarImg="${item.cover}" />
@@ -52,7 +53,14 @@
                     <div class="col-sm-6">
                         <div class="form-group">
                             <label class="col-sm-3 control-label">商品图片(请上传不超过五张图片): </label>
-                            <div class="col-sm-2" style="width: 100%;margin-left: 12%;margin-top: 1%">
+                            <div class="col-sm-2" style="width: 100%;margin-left: 24%;margin-top: 1%">
+                                <div class="avatar-uploader" style="display: flex;">
+                                @for(im in pictures){
+                                    <div style="margin-right: 16px;position: relative">
+                                        <img  height="100px" width="100px" src="${im}">
+                                        <i class="el-icon-delete" onclick="delImg(this)" style="color: red;font-size: 18px;position: absolute;left: 0;right: 0;top: 0;bottom: 0"></i>
+                                    </div>
+                                @}
                                 <el-upload
                                         :limit="5"
                                         class="avatar-uploader"
@@ -63,17 +71,12 @@
                                         :on-remove="handleRemove">
                                     <i class="el-icon-plus"></i>
                                 </el-upload>
-                                <el-dialog :visible.sync="dialogVisible">
-<!--                                    <img width="100%" :src="imageUrl1" alt="">-->
-                                    @for(im in pictures){
-                                    <img width="100%" src="${im}">
-                                    @}
+                                </div>
                             </div>
                         </div>
 
                     </div>
                 </div>
-
                 <div class="form-group">
                     <label class="col-sm-3 control-label">发放数量:</label>
                     <div class="col-sm-9">
@@ -109,8 +112,8 @@
 
     <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.editSubmit()"/>
-            <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCarInfoDlg.close()"/>
+            <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TGoodsInfoDlg.editSubmit()"/>
+            <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TGoodsInfoDlg.close()"/>
         </div>
     </div>
 
@@ -132,7 +135,7 @@
         },
         methods: {
             handleAvatarSuccess(res, file) {
-                TCarInfoDlg.goodsPicArray.push(file);
+                TGoodsInfoDlg.goodsPicArray.push(file.response);
             },
             beforeAvatarUpload(file) {
                 const isLt2M = file.size / 1024 / 1024 < 10;
@@ -142,7 +145,7 @@
                 return isLt2M;
             },
             handleRemove(file, fileList) {
-                TCarInfoDlg.goodsPicArray = TCarInfoDlg.goodsPicArray.filter(item => {
+                TGoodsInfoDlg.goodsPicArray = TGoodsInfoDlg.goodsPicArray.filter(item => {
                     return item.uid != file.uid;
                 });
             },
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tGoods/tGoods.js b/cloud-server-management/src/main/webapp/static/modular/system/tGoods/tGoods.js
index f323923..f75a56d 100644
--- a/cloud-server-management/src/main/webapp/static/modular/system/tGoods/tGoods.js
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tGoods/tGoods.js
@@ -130,11 +130,11 @@
     if (this.check()) {
         var index = layer.open({
             type: 2,
-            title:'编辑',
+            title:'详情',
             area: ['100%', '100%'], //宽高
             fix: false, //不固定
             maxmin: true,
-            content: Feng.ctxPath + '/tGoods/tCity_update/' + TPointProducts.seItem.id
+            content: Feng.ctxPath + '/tGoods/goods_info/' + TPointProducts.seItem.id
         });
         this.layerIndex = index;
     }
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tGoods/tGoods_info.js b/cloud-server-management/src/main/webapp/static/modular/system/tGoods/tGoods_info.js
index aff59ba..6bb63f6 100644
--- a/cloud-server-management/src/main/webapp/static/modular/system/tGoods/tGoods_info.js
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tGoods/tGoods_info.js
@@ -2,11 +2,12 @@
  * 初始化车辆管理详情对话框
  */
 var language=1;
-var TCarInfoDlg = {
-    tCarInfoData : {},
+var TGoodsInfoDlg = {
+    tGoodsInfoData : {},
     validateFields: {
     },
     goodsPicArray:[],
+    goodsPicArray1:[],
     storeIds: [],
 
 };
@@ -14,7 +15,7 @@
 /**
  * 验证数据是否为空
  */
-TCarInfoDlg.validate = function () {
+TGoodsInfoDlg.validate = function () {
     $('#carInfoForm').data("bootstrapValidator").resetForm();
     $('#carInfoForm').bootstrapValidator('validate');
     return $("#carInfoForm").data('bootstrapValidator').isValid();
@@ -23,8 +24,8 @@
 /**
  * 清除数据
  */
-TCarInfoDlg.clearData = function() {
-    this.tCarInfoData = {};
+TGoodsInfoDlg.clearData = function() {
+    this.tGoodsInfoData = {};
 }
 
 /**
@@ -33,8 +34,8 @@
  * @param key 数据的名称
  * @param val 数据的具体值
  */
-TCarInfoDlg.set = function(key, val) {
-    this.tCarInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+TGoodsInfoDlg.set = function(key, val) {
+    this.tGoodsInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
     return this;
 }
 
@@ -44,14 +45,14 @@
  * @param key 数据的名称
  * @param val 数据的具体值
  */
-TCarInfoDlg.get = function(key) {
+TGoodsInfoDlg.get = function(key) {
     return $("#" + key).val();
 }
 
 /**
  * 关闭此对话框
  */
-TCarInfoDlg.close = function() {
+TGoodsInfoDlg.close = function() {
     parent.layer.close(window.parent.TPointProducts.layerIndex);
 }
 
@@ -59,7 +60,7 @@
 /**
  * 收集数据
  */
-TCarInfoDlg.collectData = function() {
+TGoodsInfoDlg.collectData = function() {
     this
     .set('id')
     .set('isPlatCar')
@@ -114,7 +115,7 @@
     });
     this.layerIndex = index;
 }
-TCarInfoDlg.selecUserOpt = function (arrays){
+TGoodsInfoDlg.selecUserOpt = function (arrays){
     console.log(arrays)
     //获取所有的值
     var subArr= this.storeIds;
@@ -145,15 +146,15 @@
     console.log(e);
     var row = $(e).closest('tr');
     var value = row.find('#id').val();
-    TCarInfoDlg.storeIds.splice(TCarInfoDlg.storeIds.indexOf(parseInt(value)), 1)
+    TGoodsInfoDlg.storeIds.splice(TGoodsInfoDlg.storeIds.indexOf(parseInt(value)), 1)
     $(e).parent().parent().remove();
-    console.log('storeIds',TCarInfoDlg.storeIds)
+    console.log('storeIds',TGoodsInfoDlg.storeIds)
 }
-TCarInfoDlg.delete = function (o) {
+TGoodsInfoDlg.delete = function (o) {
     $(o).parent("div").remove()
 }
 var num = 0;
-TCarInfoDlg.addBranch = function () {
+TGoodsInfoDlg.addBranch = function () {
     num=num+1;
     var a= "";
     a = "<div style=\'margin-left: 25%\' class=\"col-sm-9 control-label\">\n" +
@@ -165,7 +166,7 @@
         "                                <option value=\"\">请选择</option>\n" +
         "                            </select>\n" +
         "                            <label class=\"col-sm-1\" style=\"width: 7%;margin-top: 7px\">市</label>\n" +
-        "                            <label name=\"addBranch\" class=\"col-sm-1\" onclick=\"TCarInfoDlg.delete(this)\" style=\"border: 0px;cursor: pointer;margin-top: 1%\"><i class=\"fa fa-trash\"></i></label>"+
+        "                            <label name=\"addBranch\" class=\"col-sm-1\" onclick=\"TGoodsInfoDlg.delete(this)\" style=\"border: 0px;cursor: pointer;margin-top: 1%\"><i class=\"fa fa-trash\"></i></label>"+
         "                        </div>";
     $("#cityDemo").append($(a));
     getProvince(num);
@@ -229,7 +230,7 @@
 /**
  * 提交添加
  */
-TCarInfoDlg.addSubmit = function() {
+TGoodsInfoDlg.addSubmit = function() {
 
     this.clearData();
     this.collectData();
@@ -237,121 +238,412 @@
         return ;
     }
 
-    let pCode = $("#pCode").val()
-    let cCode = $("#cCode").val()
-    let name = $("#name").val()
-    let phone = $("#phone").val()
-
-    if(pCode==''){
-        Feng.info("请选择省")
-        return;
-    }
-    if(cCode==''){
-        Feng.info("请选择市")
-        return;
-    }
-    if(name==''){
-        Feng.info("管理员姓名不能为空")
-        return;
-    }
-    if(phone==''){
-        Feng.info("管理员手机号不能为空")
-        return;
-    }
-
-    //提交信息
-    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("添加成功!");
-            }else if(language==2){
-                Feng.success("Successfully added!");
-            }else {
-                Feng.success("Sangat berhasil ditambah!");
+    let typeAll = document.querySelector('input[name="type"]:checked').value;
+    if(typeAll==2){
+        let pCode = $("#pCode").val()
+        let cCode = $("#cCode").val()
+        if(pCode==''){
+            Feng.info("请选择省")
+            return;
+        }
+        if(cCode==''){
+            Feng.info("请选择市")
+            return;
+        }
+        let storeId = $("#storeId").val()
+        if(storeId==''){
+            Feng.info("请选择门店")
+            return;
+        }
+        let coursePackageTypeId = $("#coursePackageTypeId").val()
+        if(coursePackageTypeId==''){
+            Feng.info("请选择课包类型")
+            return;
+        }
+        let coursePackageId = $("#coursePackageId").val()
+        if(coursePackageId==''){
+            Feng.info("请选择课包")
+            return;
+        }
+        let coursePackageConfigId = $("#coursePackageConfigId").val()
+        if(coursePackageConfigId==''){
+            Feng.info("请选择课时数")
+            return;
+        }
+        let price = $("#price1").val()
+        if(price==''){
+            Feng.info("请填写原价")
+            return;
+        }
+        let type = document.querySelector('input[name="redemptionMethod"]:checked').value;
+        if(type==''){
+            Feng.info("请选择兑换方式")
+            return;
+        }
+        let integral='';
+        let cash='';
+        if(type==1){
+             integral = $("#integral1").val()
+            if(integral==''){
+                Feng.info("请填写所需积分")
+                return;
             }
-            window.parent.TCompetition.table.refresh();
-            TCarInfoDlg.close();
-        }else{
-            Feng.error(data.msg);
+        }
+        if(type==2){
+             integral = $("#integral1").val()
+            if(integral==''){
+                Feng.info("请填写所需积分")
+                return;
+            }
+             cash = $("#cash1").val()
+            if(cash==''){
+                Feng.info("请填写所需现金")
+                return;
+            }
         }
 
-    },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.start();
+        let cover1 = $("#cover1").val()
+        // if(cover1==''){
+        //     Feng.info("请上传封面")
+        //     return;
+        // }
+        var goodImgs = this.goodsPicArray1;
+        var imgOne ="";
+        if(goodImgs.length==0){
+        }else {
+            for (let i = 0; i <goodImgs.length; i++) {
+                if(i==goodImgs.length-1){
+                    imgOne += (goodImgs[i].response)
+                }else {
+                    imgOne+=(goodImgs[i].response+",")
+                }
+            }
+        }
+
+        let userPopulation = document.querySelector('input[name="userPopulation"]:checked').value;
+        if(userPopulation==''){
+            Feng.info("请选择用户人群")
+            return;
+        }
+
+        let quantityIssued = $("#quantityIssued1").val()
+        if(quantityIssued==''){
+            Feng.info("请填写发放数量")
+            return;
+        }
+        let pickUpQuantity = $("#pickUpQuantity1").val()
+        if(pickUpQuantity==''){
+            Feng.info("请填写限领数量")
+            return;
+        }
+        let startTime = $("#startTime1").val()
+        if(startTime==''){
+            Feng.info("请选择有效期")
+            return;
+        }
+        let text  = TGoodsInfoDlg.editor1.getContent();
+        console.log(text)
+        if(text==""){
+            Feng.info("请输入兑换说明")
+            return;
+        }
+
+        let sort = $("#sort1").val()
+        if(sort==''){
+            Feng.info("请填写排序")
+            return;
+        }
+
+
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tGoods/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.TPointProducts.table.refresh();
+                TGoodsInfoDlg.close();
+            }else{
+                Feng.error(data.msg);
+            }
+        },function(data){
+            Feng.error("添加失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("typeAll",typeAll);
+        ajax.set("provinceCode",pCode);
+        ajax.set("cityCode",cCode);
+        ajax.set("storeId",storeId);
+        ajax.set("coursePackageTypeId",coursePackageTypeId);
+        ajax.set("coursePackageId",coursePackageId);
+        ajax.set("coursePackageConfigId",coursePackageConfigId);
+        ajax.set("price",price);
+        ajax.set("type",type);
+        ajax.set("integral",integral);
+        ajax.set("cash",cash);
+        ajax.set("cover",cover1);
+        ajax.set("imgOne",imgOne);
+        ajax.set("userPopulation",userPopulation);
+        ajax.set("quantityIssued",quantityIssued);
+        ajax.set("pickUpQuantity",pickUpQuantity);
+        ajax.set("startTime",startTime);
+        ajax.set("text",text);
+        ajax.set("sort",sort);
+        ajax.start();
+
+    }else {
+        let name = $("#name").val()
+        if(name==''){
+            Feng.info("请填写商品名称")
+            return;
+        }
+        let price = $("#price").val()
+        if(price==''){
+            Feng.info("请填写原价")
+            return;
+        }
+        let type = document.querySelector('input[name="redemptionMethod"]:checked').value;
+        if(type==''){
+            Feng.info("请选择兑换方式")
+            return;
+        }
+
+        let integral='';
+        let cash='';
+        if(type==1){
+            integral = $("#integral").val()
+            if(integral==''){
+                Feng.info("请填写所需积分")
+                return;
+            }
+        }
+        if(type==2){
+            integral = $("#integral").val()
+            if(integral==''){
+                Feng.info("请填写所需积分")
+                return;
+            }
+            cash = $("#cash").val()
+            if(cash==''){
+                Feng.info("请填写所需现金")
+                return;
+            }
+        }
+        if(type==3){
+            cash = $("#cash").val()
+            if(cash==''){
+                Feng.info("请填写所需现金")
+                return;
+            }
+        }
+
+        let cover1 = $("#cover").val()
+        var goodImgs = this.goodsPicArray;
+        var imgOne ="";
+        if(goodImgs.length==0){
+        }else {
+            for (let i = 0; i <goodImgs.length; i++) {
+                if(i==goodImgs.length-1){
+                    imgOne += (goodImgs[i].response)
+                }else {
+                    imgOne+=(goodImgs[i].response+",")
+                }
+            }
+        }
+
+        let userPopulation = document.querySelector('input[name="userPopulation"]:checked').value;
+        if(userPopulation==''){
+            Feng.info("请选择用户人群")
+            return;
+        }
+
+        let quantityIssued = $("#quantityIssued").val()
+        if(quantityIssued==''){
+            Feng.info("请填写发放数量")
+            return;
+        }
+        let pickUpQuantity = $("#pickUpQuantity").val()
+        if(pickUpQuantity==''){
+            Feng.info("请填写限领数量")
+            return;
+        }
+        let startTime = $("#startTime").val()
+        if(startTime==''){
+            Feng.info("请选择有效期")
+            return;
+        }
+
+        let company = document.querySelector('input[name="company"]:checked').value;
+
+        var cityIds = [];
+        var cts = "";
+        if (company === '2'){
+            var myselect=document.getElementById('cityData');
+            var seCity = myselect.options[myselect.selectedIndex].value;
+            if (seCity === null || seCity === undefined || seCity === ''){
+                return Feng.error('请选中一个省市');
+            }
+            cityIds.push(seCity);
+            if (num > 0){
+                for (let i = 1; i <= num; i++) {
+                    var insSelect=document.getElementById('cityData'+i);
+                    var inData = insSelect.options[insSelect.selectedIndex].value;
+                    if (inData !== undefined || inData !== null ||  inData !== ''){
+                        cityIds.push(inData);
+                    }
+                }
+                cts = cityIds.join(',');
+            }else {
+                cts = cityIds
+            }
+        }
+
+        const commaSeparatedString = this.goodsPicArray.join(',');
+
+        var stores = "";
+        if (company === '3'){
+            console.log('3---this.storeIds',this.storeIds);
+            if (TGoodsInfoDlg.storeIds.length === 0 ){
+                return Feng.error('请至少选择一个门店');
+            }
+            stores = this.storeIds.join(',');
+            console.log('stores--===--',stores)
+        }
+
+        let text  = TGoodsInfoDlg.editor.getContent();
+        console.log(text)
+        if(text==""){
+            Feng.info("请输入兑换说明")
+            return;
+        }
+
+        let sort = $("#sort").val()
+        if(sort==''){
+            Feng.info("请填写排序")
+            return;
+        }
+
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tGoods/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.TPointProducts.table.refresh();
+                TGoodsInfoDlg.close();
+            }else{
+                Feng.error(data.msg);
+            }
+
+        },function(data){
+            Feng.error("添加失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("typeAll",typeAll);
+        ajax.set("name",name);
+        ajax.set("price",price);
+        ajax.set("type",type);
+        ajax.set("integral",integral);
+        ajax.set("cash",cash);
+        ajax.set("cover",cover1);
+        ajax.set("imgOne",imgOne);
+        ajax.set("userPopulation",userPopulation);
+        ajax.set("quantityIssued",quantityIssued);
+        ajax.set("pickUpQuantity",pickUpQuantity);
+        ajax.set("startTime",startTime);
+        ajax.set("useScope",company);
+        ajax.set("cityIds",cts);
+        ajax.set("storeIds",stores);
+        ajax.set("text",text);
+        ajax.set("sort",sort);
+        ajax.set("cardType",document.querySelector('input[name="cardType"]:checked').value);
+        ajax.start();
+
+    }
+
+
 }
+
+/**
+ * 删除图片的函数
+ * @param e
+ */
+function delImg(e){
+
+    $(e).parent().remove();
+}
+
 
 /**
  * 提交修改
  */
-TCarInfoDlg.editSubmit = function() {
+TGoodsInfoDlg.editSubmit = function() {
+    let cover = $("#cover").val();
+    let goodsId = $("#goodsId").val();
+    var productImages = "";
+    if (TGoodsInfoDlg.goodsPicArray.length > 0){
+        productImages = TGoodsInfoDlg.goodsPicArray.join(',');
+    }
+    let quantityIssued = $("#quantityIssued").val();
+    let pickUpQuantity = $("#pickUpQuantity").val();
+    let editor = jQuery.trim(TGoodsInfoDlg.editor.getContent());
+    console.log('editor:',editor)
 
-    this.clearData();
-    this.collectData();
-    if(!this.validate()){
-        return ;
-    }
-    let pCode = $("#pCode").val()
-    let cCode = $("#cCode").val()
-    let name = $("#name").val()
-    let phone = $("#phone").val()
+    let sort = $("#sort").val();
 
-    if(pCode==''){
-        Feng.info("请选择省")
-        return;
+    if (quantityIssued === undefined || quantityIssued === null || quantityIssued === ''){
+        return Feng.error('发放数量不能为空!');
     }
-    if(cCode==''){
-        Feng.info("请选择市")
-        return;
+    if (pickUpQuantity === undefined || pickUpQuantity === null || pickUpQuantity === ''){
+        return Feng.error('限领数量不能为空!');
     }
-    if(name==''){
-        Feng.info("管理员姓名不能为空")
-        return;
+    let quantityHas = $("#quantityHas").val();
+    if (quantityIssued <= quantityHas){
+        return Feng.error('发放数量小于已领数量!');
     }
-    if(phone==''){
-        Feng.info("管理员手机号不能为空")
-        return;
+
+
+    if (editor === undefined || editor === null || editor === ''){
+        return Feng.error('兑换说明不能为空!');
     }
+    if (sort === undefined || sort === null || sort === ''){
+        return Feng.error('排序不能为空!');
+    }
+
     //提交信息
-    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("修改成功!");
-            }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);
-        }
+    var ajax = new $ax(Feng.ctxPath + "/tGoods/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TPointProducts.table.refresh();
+        TGoodsInfoDlg.close();
     },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("id",$("#id").val());
+    ajax.set("pointMerchandiseId",goodsId);
+    ajax.set("quantityIssued",quantityIssued);
+    ajax.set("pickUpQuantity",pickUpQuantity);
+    ajax.set("redemptionInstructions",editor);
+    ajax.set("cover",cover);
+    ajax.set("productImages",productImages);
+    ajax.set("sort",sort);
     ajax.start();
 }
 
 $(function() {
+
     getProvince(null);
-    Feng.initValidator("carInfoForm", TCarInfoDlg.validateFields);
+    Feng.initValidator("carInfoForm", TGoodsInfoDlg.validateFields);
     // 初始化图片上传
     var carPhoto = new $WebUpload("cover");
     carPhoto.setUploadBarId("progressBar");
@@ -359,13 +651,17 @@
     var drivingLicensePhoto = new $WebUpload("drivingLicensePhoto");
     drivingLicensePhoto.setUploadBarId("progressBar");
     drivingLicensePhoto.init();
-    TCarInfoDlg.editor = UE.getEditor('editor');
+    var drivingLicensePhoto = new $WebUpload("drivingLicensePhoto");
+    drivingLicensePhoto.setUploadBarId("progressBar");
+    drivingLicensePhoto.init();
+    TGoodsInfoDlg.editor = UE.getEditor('editor');
+    TGoodsInfoDlg.editor1 = UE.getEditor('editor1');
 });
 
 /**
  * 选择分公司后执行
  */
-TCarInfoDlg.oneChange = function (e) {
+TGoodsInfoDlg.oneChange = function (e) {
     var oneId=$(e).val();
     var ajax = new $ax(Feng.ctxPath + "/tCity/onChange", function(data){
         if(data!=null){
@@ -385,12 +681,72 @@
     ajax.set("oneId",oneId);
     ajax.start();
 }
+TGoodsInfoDlg.storeChange = function (e) {
+    var oneId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCity/storeChange", 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>";
+            });
+            $("#storeId").empty().append(content);
+        }
+    });
+    ajax.set("oneId",oneId);
+    ajax.start();
+}
+TGoodsInfoDlg.packageChange = function (e) {
+    var oneId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCity/packageChange", 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>";
+            });
+            $("#coursePackageId").empty().append(content);
+        }
+    });
+    ajax.set("oneId",oneId);
+    ajax.start();
+}
+TGoodsInfoDlg.timeChange = function (e) {
+    var oneId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCity/timeChange", 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.classHours+"</option>";
+            });
+            $("#coursePackageConfigId").empty().append(content);
+        }
+    });
+    ajax.set("oneId",oneId);
+    ajax.start();
+}
 
 /**
  * 类型改变执行
  * @param e
  */
-TCarInfoDlg.companyTypeClick = function (e) {
+TGoodsInfoDlg.companyTypeClick = function (e) {
     if (1 == e){
         $(".companyDiv").hide();
     } else if (2 == e){
@@ -401,7 +757,7 @@
 /**
  * 车辆品牌改变时执行
  */
-TCarInfoDlg.brandChange = function (e) {
+TGoodsInfoDlg.brandChange = function (e) {
     var carBrandId=$(e).val();
     var ajax = new $ax(Feng.ctxPath + "/tCar/brandChange", function(data){
         if(data!=null){
@@ -426,7 +782,7 @@
 /**
  * 专车服务被点击
  */
-TCarInfoDlg.zcServerClick = function () {
+TGoodsInfoDlg.zcServerClick = function () {
     var serverBox1 = $('#serverBox1').prop('checked');
     if (serverBox1){
         $("#zcModelDiv").show();
@@ -438,7 +794,7 @@
 /**
  * 跨城服务被点击
  */
-TCarInfoDlg.kcServerClick = function () {
+TGoodsInfoDlg.kcServerClick = function () {
     var serverBox3 = $('#serverBox3').prop('checked');
     if (serverBox3){
         $("#kcModelDiv").show();
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tGoods/tPay_info.js b/cloud-server-management/src/main/webapp/static/modular/system/tGoods/tPay_info.js
index 8045689..2c49494 100644
--- a/cloud-server-management/src/main/webapp/static/modular/system/tGoods/tPay_info.js
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tGoods/tPay_info.js
@@ -20,7 +20,7 @@
         {title: '联系方式', field: 'phone', visible: true, align: 'center', valign: 'middle'},
         {title: '使用状态', field: 'status', visible: true, align: 'center', valign: 'middle',
             formatter: function (value, row, index) {
-                return {1: "未使用", 2: "待核销"}[value]
+                return {1: "未使用", 2: "已核销"}[value]
             }
         },
     ];
@@ -46,14 +46,17 @@
  * @constructor
  */
 TPayInfo.WriteOff = function (){
-    if (this.check()) {
+    if (TPayInfo.check()) {
+        if (TPayInfo.seItem.status === 2){
+            return Feng.error("重复核销!");
+        }
         var ajax = new $ax(Feng.ctxPath + "/tGoods/write_off", function (data) {
             Feng.success("核销成功!");
             TPayInfo.table.refresh();
         }, function (data) {
             Feng.error("核销失败!" + data.responseJSON.message + "!");
         });
-        ajax.set("id",this.seItem.id);
+        ajax.set("id",TPayInfo.seItem.id);
         ajax.start();
     }
 }

--
Gitblit v1.7.1