From 63b6d78b7f906d7464eca710695bef600772651d Mon Sep 17 00:00:00 2001
From: 44323 <443237572@qq.com>
Date: 星期二, 05 九月 2023 12:01:15 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PointsMerchandiseCityServiceImpl.java    |   20 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/DiscountList.java            |   23 
 cloud-server-activity/logback-spring.xml                                                                   |    0 
 cloud-server-activity/src/main/java/com/dsh/activity/model/request/PointMercharsVo.java                    |    4 
 cloud-server-management/mb-cloud-management.iml                                                            |    2 
 cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java                        |    5 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_detail_two.html                  |  396 +++
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryDiscountList.java       |   25 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/DiscountUpdateState.java     |   14 
 .idea/workspace.xml                                                                                        |  733 +++--
 cloud-server-course/src/main/resources/mapper/TCoursePackageMapper.xml                                     |    6 
 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/course/feignClient/course/model/AuditDiscount.java           |   16 
 cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackageMapper.java                          |    6 
 cloud-server-management/src/main/resources/logback-spring.xml                                              |    0 
 cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java               |   10 
 cloud-server-management/src/main/webapp/static/modular/system/tDiscount/tDiscount.js                       |  358 ++
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java     |   38 
 cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandiseCity.java                     |   67 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscountAudit/TCity_edit.html                 |   98 
 cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java               |  248 +
 cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandise.java                         |    4 
 cloud-server-management/src/main/webapp/static/modular/system/tDiscountAudit/tDiscount_info.js             |  320 ++
 cloud-server-management/src/main/webapp/static/modular/system/tDiscountAudit/coursePackageDiscount.js      |  819 ++++++
 cloud-server-competition/src/main/resources/logback-spring.xml                                             |   10 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/PointMercharsVo.java       |    4 
 cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageDiscountService.java                |    7 
 cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java                          |  101 
 cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PointsMerchandiseServiceImpl.java        |    5 
 cloud-server-activity/src/main/resources/mapper/PointsMerchandiseCityMapper.xml                            |    6 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_edit.html                        |   28 
 cloud-server-management/src/main/webapp/static/modular/system/tDiscountAudit/tCity_info.js                 |  320 ++
 cloud-server-activity/src/main/java/com/dsh/activity/mapper/PointsMerchandiseMapper.java                   |    1 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscount/TCity_edit.html                      |   98 
 cloud-server-course/src/main/java/com/dsh/course/model/AuditDiscount.java                                  |   16 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/PointsMerchandise.java     |  172 +
 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                    |   78 
 cloud-server-course/src/main/java/com/dsh/course/model/DiscountUpdateState.java                            |   14 
 cloud-server-activity/src/main/java/com/dsh/activity/service/PointsMerchandiseService.java                 |    1 
 cloud-server-course/src/main/resources/mapper/TCoursePackageDiscountMapper.xml                             |   38 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscountAudit/TDiscount.html                  |   79 
 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                  |   35 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscountAudit/TCity_add.html                  |   83 
 cloud-server-course/src/main/java/com/dsh/course/model/DiscountList.java                                   |   23 
 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                         |  252 +
 cloud-server-course/src/main/java/com/dsh/course/model/QueryDiscountList.java                              |   25 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/PointMercharsClient.java         |   38 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscountAudit/coursePackageDiscount.html      |  105 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscount/TDiscount.html                       |   80 
 cloud-server-management/src/main/webapp/static/modular/system/tDiscount/tDiscount_info.js                  |  320 ++
 cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageDiscountClient.java   |    3 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscount/TCity_add.html                       |   83 
 cloud-server-management/src/main/webapp/static/modular/system/tDiscountAudit/tDiscount.js                  |  433 +++
 cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackageDiscountMapper.java                  |    8 
 cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageDiscountController.java           |    6 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/StoreVos.java                      |   18 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TDiscountController.java |  382 ++
 cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackageDiscount.java                        |    4 
 cloud-server-activity/src/main/resources/mapper/PointsMerchandiseMapper.xml                                |    3 
 /dev/null                                                                                                  |  227 -
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/TCouponAdd.html                        |    3 
 cloud-server-management/src/main/webapp/static/modular/system/tCoupon/TCouponInfo.js                       |    2 
 cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageDiscountServiceImpl.java       |   68 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TGoodsController.java    |  240 +
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscount/coursePackageDiscount.html           |   88 
 72 files changed, 6,898 insertions(+), 753 deletions(-)

diff --git a/.idea/libraries/Maven__com_huaweicloud_esdk_obs_java_bundle_3_23_3.xml b/.idea/libraries/Maven__com_huaweicloud_esdk_obs_java_bundle_3_23_3.xml
deleted file mode 100644
index 83bc299..0000000
--- a/.idea/libraries/Maven__com_huaweicloud_esdk_obs_java_bundle_3_23_3.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<component name="libraryTable">
-  <library name="Maven: com.huaweicloud:esdk-obs-java-bundle:3.23.3">
-    <CLASSES>
-      <root url="jar://$MAVEN_REPOSITORY$/com/huaweicloud/esdk-obs-java-bundle/3.23.3/esdk-obs-java-bundle-3.23.3.jar!/" />
-    </CLASSES>
-    <JAVADOC>
-      <root url="jar://$MAVEN_REPOSITORY$/com/huaweicloud/esdk-obs-java-bundle/3.23.3/esdk-obs-java-bundle-3.23.3-javadoc.jar!/" />
-    </JAVADOC>
-    <SOURCES>
-      <root url="jar://$MAVEN_REPOSITORY$/com/huaweicloud/esdk-obs-java-bundle/3.23.3/esdk-obs-java-bundle-3.23.3-sources.jar!/" />
-    </SOURCES>
-  </library>
-</component>
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 15613af..f2ab91c 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -1,200 +1,39 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
+  <component name="BranchesTreeState">
+    <expand>
+      <path>
+        <item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
+        <item name="LOCAL_ROOT" type="e8cecc67:BranchNodeDescriptor" />
+      </path>
+      <path>
+        <item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
+        <item name="REMOTE_ROOT" type="e8cecc67:BranchNodeDescriptor" />
+      </path>
+      <path>
+        <item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
+        <item name="REMOTE_ROOT" type="e8cecc67:BranchNodeDescriptor" />
+        <item name="GROUP_NODE:origin" type="e8cecc67:BranchNodeDescriptor" />
+      </path>
+    </expand>
+    <select />
+  </component>
   <component name="ChangeListManager">
-    <list default="true" id="f560b179-9233-4e76-92e7-a3f41cf84d9f" name="Default Changelist" comment="">
-      <change afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/controller/CoachTypeController.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/model/query/coachQuery/CoachQuery.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/model/vo/CoachChangeStateVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/model/vo/CoachSerchVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/controller/BodySideAppointmentsController.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/entity/BodySideAppointment.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BodySideAppointmentMapper.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/model/BenefitsVedioChangeStateVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/model/QueryBenefitsVedioVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/model/QueryBodySideAppointment.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/model/QueryBodySideAppointmentVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/model/TQueryBenefitsVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/BodySideAppointmentService.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BodySideAppointmentServiceImpl.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/resources/mapper/BodySideAppointmentsMapper.xml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/model/dto/CourseChangeStateDTO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/model/dto/TQueryBenefitsVideosDTO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/model/vo/CoursePackageTypeVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/model/vo/TQueryBenefitsVideosVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachTypeClient.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/StoreStaffClient.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/CoachSerchVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/CoachType.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/TStoreStaff.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/BenefitsVideoClient.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/BodySideAppointmentClient.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BenefitsVedioChangeStateVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BenefitsVideoClassification.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BenefitsVideos.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/BodySideAppointment.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/QueryBenefitsVedioVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/QueryBodySideAppointment.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/QueryBodySideAppointmentVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CourseChangeStateDTO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/CoursePackageTypeVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/SiteClient.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/SiteLockClient.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/StoreClient.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/Site.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/SiteAddDTO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/SiteChangeStateVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/TSiteDTO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/other/model/TSiteLockDTO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/CoachController.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/CoachTypeController.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TBodySideAppointmentsController.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCoursePackageTypeController.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CoachChangeStateVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CoachQuery.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/ExpireSiteSearchVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/SiteSearchVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/Store.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TQueryBenefitsVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TQueryBenefitsVideosDTO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TQueryBenefitsVideosVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefits.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos_add.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos_edit.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefitsVideos_info.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefits_add.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/benefits/TBenefits_edit.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment/TBodySideAppointment.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment/TBodySideAppointment_add.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment/TBodySideAppointment_edit.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/coursePackageType/CoursePackageType.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach_add.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoach/TCoach_edit.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoachType/TCoachType.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_edit.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_lock.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/benefits/TBenefits.js" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/benefits/tBenefitsVideos.js" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/benefits/tBenefitsVideos_add.js" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/benefits/tBenefitsVideos_edit.js" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/bodySideAppointment/tBodySideAppointment.js" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/bodySideAppointment/tBodySideAppointment_edit.js" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/coursePackageType/coursePackageType.js" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach.js" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach_add.js" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tCoach/tCoach_info.js" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tCoachType/tCoachType.js" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSiteLock.js" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/controller/SiteLockController.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/entity/TSite.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/feignclient/account/CityManagerClient.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/feignclient/account/model/CityManager.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/feignclient/model/SiteAddDTO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/feignclient/model/SiteChangeStateVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/TSiteDTO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/model/dto/siteDto/TSiteLockDTO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/model/vo/siteVo/ExpireSiteSearchVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/model/vo/siteVo/SiteSearchVO.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/.idea/compiler.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/compiler.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/.idea/encodings.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/encodings.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/.idea/modules.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/.idea/vcs.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
+    <list default="true" id="cb08d02f-fd4f-4fa2-85fe-abd508fa83ac" name="Default Changelist" comment="后台代码">
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tCity/tCity.js" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tCity/tCity_info.js" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/cloud-server-account/mb-cloud-account.iml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/mb-cloud-account.iml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-account/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/pom.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/controller/CityManagerController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/controller/CityManagerController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/controller/CoachController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/controller/CoachController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/entity/Coach.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/entity/Coach.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/mapper/CoachMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/mapper/CoachMapper.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/service/CoachService.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/service/CoachService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/service/ICityManagerService.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/service/ICityManagerService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/service/impl/CityManagerServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/service/impl/CityManagerServiceImpl.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/service/impl/CoachServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/service/impl/CoachServiceImpl.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/resources/mapper/CoachMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/resources/mapper/CoachMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/controller/CityController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/controller/CityController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/entity/TCityManager.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-account/src/main/java/com/dsh/account/entity/TCityManager.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/cloud-server-activity/mb-cloud-activity.iml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/mb-cloud-activity.iml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-activity/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/pom.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/controller/BenefitVideoController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/controller/BenefitVideoController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideoClassification.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideoClassification.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideos.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideos.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/other/StoreClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/other/StoreClient.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/other/model/Store.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/other/model/Store.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideoClassificationMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideoClassificationMapper.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideosMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideosMapper.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/BenefitsVideosService.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/BenefitsVideosService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/IBenefitsVideoClassificationService.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/IBenefitsVideoClassificationService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideoClassificationServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideoClassificationServiceImpl.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideosServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideosServiceImpl.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/resources/mapper/BenefitsVideoClassificationMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/resources/mapper/BenefitsVideoClassificationMapper.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-activity/src/main/resources/mapper/BenefitsVideosMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-activity/src/main/resources/mapper/BenefitsVideosMapper.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/cloud-server-auth/mb-cloud-auth.iml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-auth/mb-cloud-auth.iml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-competition/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-competition/pom.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-course/mb-cloud-course.iml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-course/mb-cloud-course.iml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-course/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-course/pom.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/controller/CourseController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageTypeController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageTypeController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/mapper/TCourseMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/mapper/TCourseMapper.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/service/TCourseService.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/service/TCourseService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCourseServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCourseServiceImpl.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-course/src/main/resources/mapper/TCourseMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-course/src/main/resources/mapper/TCourseMapper.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-gateway/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-gateway/pom.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/pom.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CityManagerClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CityManagerClient.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CoachClient.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/Coach.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/model/Coach.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CourseClient.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageTypeClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageTypeClient.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/QuestionController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/QuestionController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CityClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/course/feignClient/account/CityClient.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCouponController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCouponController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TSiteController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TSiteController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TWelfareVideoController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TWelfareVideoController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/system/LoginController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/system/LoginController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/UploadUtil.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/UploadUtil.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/enums/RuleStatusEnum.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/enums/RuleStatusEnum.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TSite.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TSite.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/common/_right.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/common/_right.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/TCouponAdd.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/TCouponAdd.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionAdd.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionAdd.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionEdit.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionEdit.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionInfo.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tQuestion/TQuestionInfo.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_edit.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tShop/TShop_edit.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_add.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_add.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_edit.html" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_img.html" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TShop_imgAll.html" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/js/common/ajax-object.js" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/js/common/ajax-object.js" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/js/common/web-upload-file.js" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/js/common/web-upload-file.js" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tQuestion/TQuestion.js" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tQuestion/TQuestion.js" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tSite/electricFence.js" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite.js" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite.js" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite_info.js" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tSite/tSite_info.js" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/pom.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/entity/Site.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/entity/Site.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/entity/SiteLock.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/entity/SiteLock.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/feignclient/HonorDeClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/feignclient/HonorDeClient.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/feignclient/SiteClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/feignclient/SiteClient.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteLockMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteLockMapper.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteMapper.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/mapper/StoreMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/mapper/StoreMapper.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/ISiteLockService.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/ISiteLockService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/ISiteTypeService.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/ISiteTypeService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/StoreService.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/StoreService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteLockServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteLockServiceImpl.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteTypeServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteTypeServiceImpl.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/impl/StoreServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/java/com/dsh/other/service/impl/StoreServiceImpl.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/resources/mapper/SiteLockMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/resources/mapper/SiteLockMapper.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/resources/mapper/SiteMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/resources/mapper/SiteMapper.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/cloud-server-other/src/main/resources/mapper/StoreMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-other/src/main/resources/mapper/StoreMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCity/TCity.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCity/TCity.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCity/TCity_add.html" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCity/TCity_add.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tCar/tCar_info.js" beforeDir="false" afterPath="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system/tCar/tCar_info.js" afterDir="false" />
     </list>
-    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
     <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@@ -203,18 +42,37 @@
   <component name="FileTemplateManagerImpl">
     <option name="RECENT_TEMPLATES">
       <list>
-        <option value="HTML File" />
+        <option value="Interface" />
         <option value="Class" />
-        <option value="mybatis-mapper" />
       </list>
     </option>
   </component>
   <component name="Git.Settings">
     <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
   </component>
-  <component name="ProjectId" id="2Tjw32TibW9vX8W0bRu35zUVftR" />
+  <component name="JsFlowSettings">
+    <service-enabled>true</service-enabled>
+    <exe-path />
+    <other-services-enabled>true</other-services-enabled>
+    <auto-save>true</auto-save>
+  </component>
+  <component name="MavenImportPreferences">
+    <option name="generalSettings">
+      <MavenGeneralSettings>
+        <option name="mavenHome" value="D:/apache-maven/apache-maven-3.6.1" />
+        <option name="userSettingsFile" value="D:\apache-maven\apache-maven-3.6.1\conf\settings.xml" />
+      </MavenGeneralSettings>
+    </option>
+  </component>
+  <component name="ProjectId" id="2T0poWYlZShlnPso29uxjn4gQQo" />
+  <component name="ProjectLevelVcsManager" settingsEditedManually="true">
+    <ConfirmationsSetting value="1" id="Add" />
+  </component>
+  <component name="ProjectViewState">
+    <option name="hideEmptyMiddlePackages" value="true" />
+    <option name="showLibraryContents" value="true" />
+  </component>
   <component name="PropertiesComponent">
-    <property name="DefaultHtmlFileTemplate" value="HTML File" />
     <property name="ExpandSpringBootJavaOptionsPanel" value="true" />
     <property name="RequestMappingsPanelOrder0" value="0" />
     <property name="RequestMappingsPanelOrder1" value="1" />
@@ -222,28 +80,33 @@
     <property name="RequestMappingsPanelWidth1" value="75" />
     <property name="WebServerToolWindowFactoryState" value="false" />
     <property name="aspect.path.notification.shown" value="true" />
-    <property name="last_opened_file_path" value="$PROJECT_DIR$/cloud-server-management/src/main/webapp/WEB-INF/view/system/bodySideAppointment" />
-    <property name="nodejs_package_manager_path" value="npm" />
-    <property name="project.structure.last.edited" value="Modules" />
+    <property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1686656087610" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$/cloud-server-management/src/main/webapp/static/modular/system" />
+    <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
+    <property name="nodejs_npm_path_reset_for_default_project" value="true" />
+    <property name="project.structure.last.edited" value="Global Libraries" />
     <property name="project.structure.proportion" value="0.0" />
     <property name="project.structure.side.proportion" value="0.2" />
-    <property name="restartRequiresConfirmation" value="false" />
-    <property name="settings.editor.selected.configurable" value="MavenSettings" />
+    <property name="run.code.analysis.last.selected.profile" value="pProject Default" />
+    <property name="settings.editor.selected.configurable" value="project.propVCSSupport.Mappings" />
+  </component>
+  <component name="ReactorSettings">
+    <option name="notificationShown" value="true" />
   </component>
   <component name="RecentsManager">
     <key name="CopyClassDialog.RECENTS_KEY">
-      <recent name="com.dsh.activity.feignclient.other.model" />
-      <recent name="com.dsh.course.feignClient.activity" />
-      <recent name="com.dsh.guns.modular.system.controller.code" />
-      <recent name="com.dsh.course.feignClient.activity.model" />
-      <recent name="com.dsh.activity.model" />
+      <recent name="com.dsh.course.feignClient.account.model" />
+      <recent name="com.dsh.account.mapper" />
+      <recent name="com.dsh.account.service.impl" />
+      <recent name="com.dsh.account.service" />
+      <recent name="com.dsh.account.controller" />
     </key>
     <key name="CopyFile.RECENT_KEYS">
-      <recent name="E:\IdeaProjects\PlayPai\cloud-server-management\src\main\webapp\WEB-INF\view\system\bodySideAppointment" />
-      <recent name="E:\IdeaProjects\PlayPai\cloud-server-management\src\main\webapp\static\modular\system\bodySideAppointment" />
-      <recent name="E:\IdeaProjects\PlayPai\cloud-server-management\src\main\java\com\dsh\course\feignClient\activity\model" />
-      <recent name="E:\IdeaProjects\PlayPai\cloud-server-management\src\main\webapp\static\modular\system\benefits" />
-      <recent name="E:\IdeaProjects\PlayPai\cloud-server-management\src\main\webapp\WEB-INF\view\system\benefits" />
+      <recent name="F:\code\PlayPai\cloud-server-management\src\main\webapp\static\modular\system" />
+      <recent name="F:\code\PlayPai\cloud-server-account\src\main\resources\mapper" />
+      <recent name="F:\code\PlayPai\cloud-server-management\src\main\webapp\WEB-INF\view\system" />
+      <recent name="F:\code\PlayPai\cloud-server-competition\src\main\java\com\dsh" />
+      <recent name="F:\code\PlayPai\cloud-server-management\src\main\resources\mapper" />
     </key>
   </component>
   <component name="RunDashboard">
@@ -252,18 +115,8 @@
         <option value="SpringBootApplicationConfigurationType" />
       </set>
     </option>
-    <option name="ruleStates">
-      <list>
-        <RuleState>
-          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
-        </RuleState>
-        <RuleState>
-          <option name="name" value="StatusDashboardGroupingRule" />
-        </RuleState>
-      </list>
-    </option>
   </component>
-  <component name="RunManager" selected="Spring Boot.ManagementApplication">
+  <component name="RunManager" selected="Spring Boot.AccountApplication">
     <configuration name="AccountApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
       <module name="mb-cloud-account" />
       <option name="SPRING_BOOT_MAIN_CLASS" value="com.dsh.AccountApplication" />
@@ -273,11 +126,17 @@
         <option name="Make" enabled="true" />
       </method>
     </configuration>
+    <configuration name="AccountApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
+      <module name="mb-cloud-account" />
+      <option name="SPRING_BOOT_MAIN_CLASS" value="com.dsh.AccountApplication" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
     <configuration name="ActivityApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
       <module name="mb-cloud-activity" />
       <option name="SPRING_BOOT_MAIN_CLASS" value="com.dsh.ActivityApplication" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="SHORTEN_COMMAND_LINE" value="MANIFEST" />
       <method v="2">
         <option name="Make" enabled="true" />
       </method>
@@ -299,17 +158,8 @@
       </method>
     </configuration>
     <configuration name="CourseApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
-      <module name="mb-cloud-course" />
+      <module name="mb-cloud-competition (1)" />
       <option name="SPRING_BOOT_MAIN_CLASS" value="com.dsh.CourseApplication" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="SHORTEN_COMMAND_LINE" value="MANIFEST" />
-      <method v="2">
-        <option name="Make" enabled="true" />
-      </method>
-    </configuration>
-    <configuration name="GatewayApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
-      <module name="mb-cloud-gateway" />
-      <option name="SPRING_BOOT_MAIN_CLASS" value="cn.mb.cloud.gateway.GatewayApplication" />
       <method v="2">
         <option name="Make" enabled="true" />
       </method>
@@ -317,153 +167,380 @@
     <configuration name="ManagementApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
       <module name="mb-cloud-management" />
       <option name="SPRING_BOOT_MAIN_CLASS" value="com.dsh.ManagementApplication" />
+      <option name="ENABLE_JMX_AGENT" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="SHORTEN_COMMAND_LINE" value="MANIFEST" />
       <method v="2">
         <option name="Make" enabled="true" />
       </method>
     </configuration>
-    <configuration name="OtherApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
-      <module name="mb-cloud-other" />
-      <option name="SPRING_BOOT_MAIN_CLASS" value="com.dsh.OtherApplication" />
+    <configuration name="UserApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
+      <module name="mb-cloud-user" />
+      <option name="SPRING_BOOT_MAIN_CLASS" value="com.dsh.UserApplication" />
       <method v="2">
         <option name="Make" enabled="true" />
       </method>
     </configuration>
     <list>
+      <item itemvalue="Spring Boot.UserApplication" />
+      <item itemvalue="Spring Boot.ManagementApplication" />
+      <item itemvalue="Spring Boot.AuthApplication" />
       <item itemvalue="Spring Boot.AccountApplication" />
       <item itemvalue="Spring Boot.ActivityApplication" />
-      <item itemvalue="Spring Boot.AuthApplication" />
       <item itemvalue="Spring Boot.CompetitionApplication" />
       <item itemvalue="Spring Boot.CourseApplication" />
-      <item itemvalue="Spring Boot.GatewayApplication" />
-      <item itemvalue="Spring Boot.ManagementApplication" />
-      <item itemvalue="Spring Boot.OtherApplication" />
     </list>
-  </component>
-  <component name="ServiceViewManager">
-    <option name="allServicesViewState">
-      <serviceView>
-        <treeState>
-          <expand>
-            <path>
-              <item name="services root" type="e789fda9:ObjectUtils$Sentinel" />
-              <item name="com.intellij.execution.services.ServiceModel$ServiceGroupNode@e758ef9a" type="7427dc5b:ServiceModel$ServiceGroupNode" />
-            </path>
-            <path>
-              <item name="services root" type="e789fda9:ObjectUtils$Sentinel" />
-              <item name="com.intellij.execution.services.ServiceModel$ServiceGroupNode@e758ef9a" type="7427dc5b:ServiceModel$ServiceGroupNode" />
-              <item name="com.intellij.execution.services.ServiceModel$ServiceGroupNode@872283ff" type="7427dc5b:ServiceModel$ServiceGroupNode" />
-            </path>
-            <path>
-              <item name="services root" type="e789fda9:ObjectUtils$Sentinel" />
-              <item name="com.intellij.execution.services.ServiceModel$ServiceGroupNode@e758ef9a" type="7427dc5b:ServiceModel$ServiceGroupNode" />
-              <item name="com.intellij.execution.services.ServiceModel$ServiceGroupNode@69458c78" type="7427dc5b:ServiceModel$ServiceGroupNode" />
-            </path>
-          </expand>
-          <select />
-        </treeState>
-      </serviceView>
-    </option>
   </component>
   <component name="SvnConfiguration">
     <configuration />
   </component>
   <component name="TaskManager">
     <task active="true" id="Default" summary="Default task">
-      <changelist id="f560b179-9233-4e76-92e7-a3f41cf84d9f" name="Default Changelist" comment="" />
-      <created>1691569594609</created>
+      <changelist id="cb08d02f-fd4f-4fa2-85fe-abd508fa83ac" name="Default Changelist" comment="" />
+      <created>1686653431962</created>
       <option name="number" value="Default" />
       <option name="presentableId" value="Default" />
-      <updated>1691569594609</updated>
-      <workItem from="1691569596751" duration="65000" />
-      <workItem from="1691569675100" duration="270000" />
-      <workItem from="1691569964197" duration="5608000" />
-      <workItem from="1691628065563" duration="26776000" />
-      <workItem from="1691714824948" duration="32278000" />
-      <workItem from="1691752453575" duration="55000" />
-      <workItem from="1691974807017" duration="29112000" />
-      <workItem from="1692060742194" duration="20502000" />
-      <workItem from="1692087400805" duration="8025000" />
-      <workItem from="1692146436177" duration="23500000" />
-      <workItem from="1692233067279" duration="10090000" />
-      <workItem from="1692252017276" duration="7536000" />
-      <workItem from="1692260089826" duration="8503000" />
-      <workItem from="1692319933611" duration="26839000" />
-      <workItem from="1692578769161" duration="28170000" />
-      <workItem from="1692665038696" duration="13077000" />
-      <workItem from="1692684619085" duration="13291000" />
-      <workItem from="1692751172028" duration="28054000" />
-      <workItem from="1692837854502" duration="6293000" />
-      <workItem from="1692844552907" duration="8241000" />
-      <workItem from="1692859160967" duration="13015000" />
-      <workItem from="1692924469163" duration="21622000" />
-      <workItem from="1692954633621" duration="995000" />
-      <workItem from="1692955658907" duration="4758000" />
-      <workItem from="1693183363744" duration="30378000" />
-      <workItem from="1693269664223" duration="20846000" />
-      <workItem from="1693296305848" duration="948000" />
-      <workItem from="1693297281055" duration="121000" />
-      <workItem from="1693297534980" duration="7686000" />
-      <workItem from="1693356090840" duration="27477000" />
-      <workItem from="1693442643841" duration="24243000" />
-      <workItem from="1693528994907" duration="29480000" />
-      <workItem from="1693566786046" duration="243000" />
-      <workItem from="1693567041762" duration="123000" />
-      <workItem from="1693623395574" duration="598000" />
-      <workItem from="1693643198935" duration="776000" />
-      <workItem from="1693705892630" duration="12000" />
-      <workItem from="1693706255970" duration="1688000" />
-      <workItem from="1693879663101" duration="1191000" />
-      <workItem from="1693884719266" duration="158000" />
+      <updated>1686653431962</updated>
+      <workItem from="1686653433491" duration="2267000" />
+      <workItem from="1690190039038" duration="16883000" />
+      <workItem from="1690333209172" duration="26986000" />
     </task>
-    <task id="LOCAL-00001" summary="客服管理、荣誉管理">
-      <created>1692233310670</created>
+    <task id="LOCAL-00001" summary="后台代码删除">
+      <created>1690249807612</created>
       <option name="number" value="00001" />
       <option name="presentableId" value="LOCAL-00001" />
       <option name="project" value="LOCAL" />
-      <updated>1692233310670</updated>
+      <updated>1690249807612</updated>
     </task>
-    <option name="localTasksCounter" value="2" />
+    <task id="LOCAL-00002" summary="后台代码删除">
+      <created>1690254629455</created>
+      <option name="number" value="00002" />
+      <option name="presentableId" value="LOCAL-00002" />
+      <option name="project" value="LOCAL" />
+      <updated>1690254629455</updated>
+    </task>
+    <task id="LOCAL-00003" summary="后台代码删除">
+      <created>1690254749862</created>
+      <option name="number" value="00003" />
+      <option name="presentableId" value="LOCAL-00003" />
+      <option name="project" value="LOCAL" />
+      <updated>1690254749862</updated>
+    </task>
+    <task id="LOCAL-00004" summary="后台代码">
+      <created>1690334274202</created>
+      <option name="number" value="00004" />
+      <option name="presentableId" value="LOCAL-00004" />
+      <option name="project" value="LOCAL" />
+      <updated>1690334274203</updated>
+    </task>
+    <task id="LOCAL-00005" summary="后台代码">
+      <created>1690335913450</created>
+      <option name="number" value="00005" />
+      <option name="presentableId" value="LOCAL-00005" />
+      <option name="project" value="LOCAL" />
+      <updated>1690335913450</updated>
+    </task>
+    <task id="LOCAL-00006" summary="后台代码">
+      <created>1690338179876</created>
+      <option name="number" value="00006" />
+      <option name="presentableId" value="LOCAL-00006" />
+      <option name="project" value="LOCAL" />
+      <updated>1690338179876</updated>
+    </task>
+    <task id="LOCAL-00007" summary="后台代码">
+      <created>1690338325966</created>
+      <option name="number" value="00007" />
+      <option name="presentableId" value="LOCAL-00007" />
+      <option name="project" value="LOCAL" />
+      <updated>1690338325966</updated>
+    </task>
+    <task id="LOCAL-00008" summary="后台代码">
+      <created>1690341067099</created>
+      <option name="number" value="00008" />
+      <option name="presentableId" value="LOCAL-00008" />
+      <option name="project" value="LOCAL" />
+      <updated>1690341067099</updated>
+    </task>
+    <task id="LOCAL-00009" summary="后台代码">
+      <created>1690355617215</created>
+      <option name="number" value="00009" />
+      <option name="presentableId" value="LOCAL-00009" />
+      <option name="project" value="LOCAL" />
+      <updated>1690355617215</updated>
+    </task>
+    <task id="LOCAL-00010" summary="后台代码删除">
+      <created>1690362658673</created>
+      <option name="number" value="00010" />
+      <option name="presentableId" value="LOCAL-00010" />
+      <option name="project" value="LOCAL" />
+      <updated>1690362658673</updated>
+    </task>
+    <task id="LOCAL-00011" summary="后台代码删除">
+      <created>1690363462474</created>
+      <option name="number" value="00011" />
+      <option name="presentableId" value="LOCAL-00011" />
+      <option name="project" value="LOCAL" />
+      <updated>1690363462474</updated>
+    </task>
+    <task id="LOCAL-00012" summary="后台代码">
+      <created>1690364368448</created>
+      <option name="number" value="00012" />
+      <option name="presentableId" value="LOCAL-00012" />
+      <option name="project" value="LOCAL" />
+      <updated>1690364368448</updated>
+    </task>
+    <task id="LOCAL-00013" summary="后台代码">
+      <created>1690364506501</created>
+      <option name="number" value="00013" />
+      <option name="presentableId" value="LOCAL-00013" />
+      <option name="project" value="LOCAL" />
+      <updated>1690364506501</updated>
+    </task>
+    <option name="localTasksCounter" value="14" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
-    <option name="version" value="1" />
+    <option name="version" value="2" />
   </component>
   <component name="Vcs.Log.Tabs.Properties">
     <option name="TAB_STATES">
       <map>
         <entry key="MAIN">
           <value>
-            <State>
-              <option name="COLUMN_ORDER" />
-            </State>
+            <State />
           </value>
         </entry>
       </map>
     </option>
+    <option name="oldMeFiltersMigrated" value="true" />
   </component>
   <component name="VcsManagerConfiguration">
-    <MESSAGE value="客服管理、荣誉管理" />
-    <option name="LAST_COMMIT_MESSAGE" value="客服管理、荣誉管理" />
+    <MESSAGE value="后台代码删除" />
+    <MESSAGE value="后台代码" />
+    <option name="LAST_COMMIT_MESSAGE" value="后台代码" />
+  </component>
+  <component name="WindowStateProjectService">
+    <state x="590" y="80" key="#&lt;template&gt;_of_Spring_Boot" timestamp="1690338437444">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state x="590" y="80" key="#&lt;template&gt;_of_Spring_Boot/0.0.1920.1032@0.0.1920.1032" timestamp="1690338437444" />
+    <state x="590" y="0" width="753" height="1032" key="#AccountApplication" timestamp="1690363440283">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state x="590" y="0" width="753" height="1032" key="#AccountApplication/0.0.1920.1032@0.0.1920.1032" timestamp="1690363440283" />
+    <state x="590" y="0" width="753" height="1032" key="#CompetitionApplication" timestamp="1690342021698">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state x="590" y="0" width="753" height="1032" key="#CompetitionApplication/0.0.1920.1032@0.0.1920.1032" timestamp="1690342021698" />
+    <state x="590" y="109" width="753" height="813" key="#ManagementApplication" timestamp="1690338483958">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state x="590" y="109" width="753" height="813" key="#ManagementApplication/0.0.1920.1032@0.0.1920.1032" timestamp="1690338483958" />
+    <state x="765" y="199" key="#com.intellij.ide.util.MemberChooser" timestamp="1690351593596">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state x="765" y="199" key="#com.intellij.ide.util.MemberChooser/0.0.1920.1032@0.0.1920.1032" timestamp="1690351593596" />
+    <state x="689" y="304" key="#com.intellij.ide.util.TreeClassChooserDialog" timestamp="1690338381045">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state x="689" y="304" key="#com.intellij.ide.util.TreeClassChooserDialog/0.0.1920.1032@0.0.1920.1032" timestamp="1690338381045" />
+    <state x="504" y="438" key="#com.intellij.refactoring.move.MoveHandler.SelectRefactoringDialog" timestamp="1690337455729">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state x="504" y="438" key="#com.intellij.refactoring.move.MoveHandler.SelectRefactoringDialog/0.0.1920.1032@0.0.1920.1032" timestamp="1690337455729" />
+    <state x="674" y="382" width="571" height="274" key="#com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesDialog.classes" timestamp="1690338847091">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state x="674" y="382" width="571" height="274" key="#com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesDialog.classes/0.0.1920.1032@0.0.1920.1032" timestamp="1690338847091" />
+    <state x="703" y="346" key="ANALYSIS_DLG_com.intellij.analysis.BaseAnalysisAction$1" timestamp="1690363667225">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state x="703" y="346" key="ANALYSIS_DLG_com.intellij.analysis.BaseAnalysisAction$1/0.0.1920.1032@0.0.1920.1032" timestamp="1690363667225" />
+    <state x="519" y="82" key="CommitChangelistDialog2" timestamp="1690364505261">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state x="519" y="82" key="CommitChangelistDialog2/0.0.1920.1032@0.0.1920.1032" timestamp="1690364505261" />
+    <state width="464" height="466" key="DebuggerActiveHint" timestamp="1690354723383">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state width="464" height="466" key="DebuggerActiveHint/0.0.1920.1032@0.0.1920.1032" timestamp="1690354723383" />
+    <state x="740" y="270" key="FileChooserDialogImpl" timestamp="1690249419357">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state x="740" y="270" key="FileChooserDialogImpl/0.0.1920.1032@0.0.1920.1032" timestamp="1690249419357" />
+    <state width="1293" height="418" key="GridCell.Tab.0.bottom" timestamp="1690366694918">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state width="1293" height="418" key="GridCell.Tab.0.bottom/0.0.1920.1032@0.0.1920.1032" timestamp="1690366694918" />
+    <state width="1293" height="418" key="GridCell.Tab.0.center" timestamp="1690366694918">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state width="1293" height="418" key="GridCell.Tab.0.center/0.0.1920.1032@0.0.1920.1032" timestamp="1690366694918" />
+    <state width="1293" height="418" key="GridCell.Tab.0.left" timestamp="1690366694918">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state width="1293" height="418" key="GridCell.Tab.0.left/0.0.1920.1032@0.0.1920.1032" timestamp="1690366694918" />
+    <state width="1293" height="418" key="GridCell.Tab.0.right" timestamp="1690366694918">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state width="1293" height="418" key="GridCell.Tab.0.right/0.0.1920.1032@0.0.1920.1032" timestamp="1690366694918" />
+    <state width="1293" height="418" key="GridCell.Tab.1.bottom" timestamp="1690366694918">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state width="1293" height="418" key="GridCell.Tab.1.bottom/0.0.1920.1032@0.0.1920.1032" timestamp="1690366694918" />
+    <state width="1293" height="418" key="GridCell.Tab.1.center" timestamp="1690366694918">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state width="1293" height="418" key="GridCell.Tab.1.center/0.0.1920.1032@0.0.1920.1032" timestamp="1690366694918" />
+    <state width="1293" height="418" key="GridCell.Tab.1.left" timestamp="1690366694918">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state width="1293" height="418" key="GridCell.Tab.1.left/0.0.1920.1032@0.0.1920.1032" timestamp="1690366694918" />
+    <state width="1293" height="418" key="GridCell.Tab.1.right" timestamp="1690366694918">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state width="1293" height="418" key="GridCell.Tab.1.right/0.0.1920.1032@0.0.1920.1032" timestamp="1690366694918" />
+    <state width="1293" height="418" key="GridCell.Tab.2.bottom" timestamp="1690366555269">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state width="1293" height="418" key="GridCell.Tab.2.bottom/0.0.1920.1032@0.0.1920.1032" timestamp="1690366555269" />
+    <state width="1293" height="418" key="GridCell.Tab.2.center" timestamp="1690366555269">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state width="1293" height="418" key="GridCell.Tab.2.center/0.0.1920.1032@0.0.1920.1032" timestamp="1690366555269" />
+    <state width="1293" height="418" key="GridCell.Tab.2.left" timestamp="1690366555269">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state width="1293" height="418" key="GridCell.Tab.2.left/0.0.1920.1032@0.0.1920.1032" timestamp="1690366555269" />
+    <state width="1293" height="418" key="GridCell.Tab.2.right" timestamp="1690366555269">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state width="1293" height="418" key="GridCell.Tab.2.right/0.0.1920.1032@0.0.1920.1032" timestamp="1690366555269" />
+    <state x="461" y="160" key="SettingsEditor" timestamp="1690191509088">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state x="461" y="160" key="SettingsEditor/0.0.1920.1032@0.0.1920.1032" timestamp="1690191509088" />
+    <state x="552" y="248" key="Vcs.Push.Dialog.v2" timestamp="1690364507500">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state x="552" y="248" key="Vcs.Push.Dialog.v2/0.0.1920.1032@0.0.1920.1032" timestamp="1690364507500" />
+    <state x="92" y="92" width="1736" height="848" key="com.intellij.history.integration.ui.views.DirectoryHistoryDialog" timestamp="1690340014123">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state x="92" y="92" width="1736" height="848" key="com.intellij.history.integration.ui.views.DirectoryHistoryDialog/0.0.1920.1032@0.0.1920.1032" timestamp="1690340014123" />
+    <state x="92" y="92" width="1736" height="848" key="com.intellij.history.integration.ui.views.FileHistoryDialog" timestamp="1690340014123">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state x="92" y="92" width="1736" height="848" key="com.intellij.history.integration.ui.views.FileHistoryDialog/0.0.1920.1032@0.0.1920.1032" timestamp="1690340014123" />
+    <state x="754" y="428" key="com.intellij.openapi.vcs.update.UpdateOrStatusOptionsDialogupdate-v2" timestamp="1690362660961">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state x="754" y="428" key="com.intellij.openapi.vcs.update.UpdateOrStatusOptionsDialogupdate-v2/0.0.1920.1032@0.0.1920.1032" timestamp="1690362660961" />
+    <state x="661" y="224" width="721" height="584" key="find.popup" timestamp="1690365779184">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state x="661" y="224" width="721" height="584" key="find.popup/0.0.1920.1032@0.0.1920.1032" timestamp="1690365779184" />
+    <state x="623" y="223" width="672" height="678" key="search.everywhere.popup" timestamp="1690365810397">
+      <screen x="0" y="0" width="1920" height="1032" />
+    </state>
+    <state x="623" y="223" width="672" height="678" key="search.everywhere.popup/0.0.1920.1032@0.0.1920.1032" timestamp="1690365810397" />
   </component>
   <component name="XDebuggerManager">
     <breakpoint-manager>
       <breakpoints>
         <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/util/UploadUtil.java</url>
-          <line>148</line>
-          <option name="timeStamp" value="3" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/cloud-server-activity/src/main/java/com/dsh/activity/controller/BodySideAppointmentsController.java</url>
-          <line>88</line>
-          <option name="timeStamp" value="43" />
+          <url>file://$PROJECT_DIR$/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/system/LoginController.java</url>
+          <line>145</line>
+          <option name="timeStamp" value="1" />
         </line-breakpoint>
       </breakpoints>
     </breakpoint-manager>
-    <watches-manager>
-      <configuration name="SpringBootApplicationConfigurationType">
-        <watch expression="vo.data3" />
-      </configuration>
-    </watches-manager>
+  </component>
+  <component name="masterDetails">
+    <states>
+      <state key="ArtifactsStructureConfigurable.UI">
+        <settings>
+          <artifact-editor />
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.2" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+      <state key="FacetStructureConfigurable.UI">
+        <settings>
+          <last-edited>No facets are configured</last-edited>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.2" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+      <state key="GlobalLibrariesConfigurable.UI">
+        <settings>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.2" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+      <state key="JdkListConfigurable.UI">
+        <settings>
+          <last-edited>1.8</last-edited>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.2" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+      <state key="ModuleStructureConfigurable.UI">
+        <settings>
+          <last-edited>PlayPai</last-edited>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.2" />
+                <option value="0.6" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+      <state key="ProjectJDKs.UI">
+        <settings>
+          <last-edited>1.8</last-edited>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.2" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+      <state key="ProjectLibrariesConfigurable.UI">
+        <settings>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.2" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+    </states>
   </component>
 </project>
\ No newline at end of file
diff --git a/cloud-server-activity/src/main/resources/logback-spring.xml b/cloud-server-activity/logback-spring.xml
similarity index 100%
copy from cloud-server-activity/src/main/resources/logback-spring.xml
copy to cloud-server-activity/logback-spring.xml
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 b176c57..b9699bb 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,9 @@
 
     @Resource
     private CouponCityService ccityService;
+
+    @Resource
+    private PointsMerchandiseCityService pmdsCityService;
 
 
     @ResponseBody
@@ -474,7 +480,10 @@
 
     @PostMapping("/base/pointMerchars/updateDetailsUserPointMercase")
     public void updateDetailsUserPointMercase(@RequestBody UserPointsMerchandise merchandise){
-        upmseService.updateById(merchandise);
+        upmseService.update(merchandise,new LambdaQueryWrapper<UserPointsMerchandise>()
+                .eq(UserPointsMerchandise::getUserId,merchandise.getUserId())
+                .eq(UserPointsMerchandise::getId,merchandise.getId()));
+
     }
 
     @PostMapping("/base/pointMerchars/queryUserPointMerchaseByCode")
@@ -524,7 +533,9 @@
         if (list.size() > 0 ){
             for (UserPointsMerchandise pointsMerchandise : list) {
                 pointsMerchandise.setState(2);
-                upmseService.updateById(pointsMerchandise);
+                upmseService.update(pointsMerchandise,new LambdaQueryWrapper<UserPointsMerchandise>()
+                        .eq(UserPointsMerchandise::getUserId,pointsMerchandise.getUserId())
+                        .eq(UserPointsMerchandise::getId,pointsMerchandise.getId()));
             }
         }
 
@@ -624,10 +635,13 @@
     public PointMercharsVo queryPointMerchaseDetailOfId(@RequestBody Integer pointMercharsId){
         PointMercharsVo vo = new PointMercharsVo();
         PointsMerchandise byId = pmdsService.getById(pointMercharsId);
+        List<UserPointsMerchandise> list = upmseService.list(new LambdaQueryWrapper<UserPointsMerchandise>()
+                .eq(UserPointsMerchandise::getPointsMerchandiseId, pointMercharsId));
         if (ToolUtil.isNotEmpty(byId)){
             vo.setName(byId.getName());
             vo.setCover(byId.getCover());
             vo.setPics(byId.getProductImages());
+            vo.setQuantityHas(list.size());
             vo.setQuantityIssued(byId.getQuantityIssued());
             vo.setPickUpQuantity(byId.getPickUpQuantity());
             vo.setSort(byId.getSort());
@@ -669,7 +683,7 @@
         if (list.size() > 0 ){
             for (UserPointsMerchandise pointsMerchandise : list) {
                 Map<String, Object> map = new HashMap<>();
-                map.put("id",pointsMerchandise.getId());
+                map.put("id",pointsMerchandise.getId().toString());
                 map.put("userId",pointsMerchandise.getUserId());
                 map.put("status", pointsMerchandise.getStatus());
                 mapList.add(map);
@@ -679,4 +693,232 @@
         return mapList;
     }
 
+    @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;
+        }
+    }
+
+
+
+    @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/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/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/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;
+    }
+
+    @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;
+        }
+
+    }
+
+
+    @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;
+    }
+
 }
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 2afd765..017a237 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..fba1382 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,5 @@
                                                      @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/request/PointMercharsVo.java b/cloud-server-activity/src/main/java/com/dsh/activity/model/request/PointMercharsVo.java
index e781c0e..323169b 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/model/request/PointMercharsVo.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/model/request/PointMercharsVo.java
@@ -24,6 +24,10 @@
      */
     Integer quantityIssued;
     /**
+     * 已领数量
+     */
+    Integer quantityHas;
+    /**
      * 限领数量
      */
     Integer pickUpQuantity;
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..3bfcf80
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/model/response/GoodsInfoOneVo.java
@@ -0,0 +1,78 @@
+package com.dsh.activity.model.response;
+
+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-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..c41c807 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,5 @@
 
     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..eb072a7 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,9 @@
         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..0d4abde 100644
--- a/cloud-server-activity/src/main/resources/mapper/PointsMerchandiseMapper.xml
+++ b/cloud-server-activity/src/main/resources/mapper/PointsMerchandiseMapper.xml
@@ -1,6 +1,9 @@
 <?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.PointsMerchandiseMapper">
+    <insert id="saveCity">
+        insert into t_points_merchandise_city (id,pointsMerchandiseId,city,cityCode,province,provinceCode) value (null ,#{id},#{city},#{cityCode},#{province},#{provinceCode})
+    </insert>
 
 
     <select id="queryGoodsListOfSearch" resultType="java.util.Map">
diff --git a/cloud-server-auth/src/main/resources/logback-spring.xml b/cloud-server-auth/src/main/resources/logback-spring.xml
deleted file mode 100644
index b13e9b3..0000000
--- a/cloud-server-auth/src/main/resources/logback-spring.xml
+++ /dev/null
@@ -1,227 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,比如: 如果设置为WARN,则低于WARN的信息都不会输出 -->
-<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
-<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
-<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
-<configuration  scan="true" scanPeriod="10 seconds">
-    <contextName>logback</contextName>
-
-    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
-    <property name="log.path" value="/Users/java/logs"/>
-
-    <!--0. 日志格式和颜色渲染 -->
-    <!-- 彩色日志依赖的渲染类 -->
-    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
-    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
-    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
-    <!-- 彩色日志格式 -->
-    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
-
-    <!--1. 输出到控制台-->
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
-        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
-            <level>debug</level>
-        </filter>
-        <encoder>
-            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
-            <!-- 设置字符集 -->
-            <charset>UTF-8</charset>
-        </encoder>
-    </appender>
-
-    <!--2. 输出到文档-->
-    <!-- 2.1 level为 DEBUG 日志,时间滚动输出  -->
-    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文档的路径及文档名 -->
-        <file>${log.path}/${artifactId}/debug.log</file>
-        <!--日志文档输出格式 Output format of the log document.-->
-        <encoder>
-            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 设置字符集 -->
-        </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录  Rolling strategy of the logger, recording by date or by size.-->
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 日志归档 -->
-            <fileNamePattern>${log.path}/${artifactId}/%d{yyyy-MM-dd}/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
-            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-                <maxFileSize>100MB</maxFileSize>
-            </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文档保留天数-->
-            <maxHistory>15</maxHistory>
-        </rollingPolicy>
-        <!-- 此日志文档只记录debug级别的 -->
-        <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>debug</level>
-            <onMatch>ACCEPT</onMatch>
-            <onMismatch>DENY</onMismatch>
-        </filter>
-    </appender>
-
-    <!-- 2.2 level为 INFO 日志,时间滚动输出  -->
-    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文档的路径及文档名 -->
-        <file>${log.path}/${artifactId}/info.log</file>
-        <!--日志文档输出格式 Output format of the log document.-->
-        <encoder>
-            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset>
-        </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录  Rolling strategy of the logger, recording by date or by size.-->
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <!-- 每天日志归档路径以及格式 -->
-            <fileNamePattern>${log.path}/${artifactId}/%d{yyyy-MM-dd}/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
-            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-                <maxFileSize>100MB</maxFileSize>
-            </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文档保留天数-->
-            <maxHistory>15</maxHistory>
-        </rollingPolicy>
-        <!-- 此日志文档只记录info级别的 -->
-        <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>info</level>
-            <onMatch>ACCEPT</onMatch>
-            <onMismatch>DENY</onMismatch>
-        </filter>
-    </appender>
-
-    <!-- 2.3 level为 WARN 日志,时间滚动输出  -->
-    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文档的路径及文档名 -->
-        <file>${log.path}/${artifactId}/warn.log</file>
-        <!--日志文档输出格式 Output format of the log document.-->
-        <encoder>
-            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
-        </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录  Rolling strategy of the logger, recording by date or by size.-->
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/${artifactId}/%d{yyyy-MM-dd}/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
-            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-                <maxFileSize>100MB</maxFileSize>
-            </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文档保留天数-->
-            <maxHistory>15</maxHistory>
-        </rollingPolicy>
-        <!-- 此日志文档只记录warn级别的 -->
-        <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>warn</level>
-            <onMatch>ACCEPT</onMatch>
-            <onMismatch>DENY</onMismatch>
-        </filter>
-    </appender>
-
-    <!-- 2.4 level为 ERROR 日志,时间滚动输出  -->
-    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文档的路径及文档名 -->
-        <file>${log.path}/${artifactId}/error.log</file>
-        <!--日志文档输出格式 Output format of the log document.-->
-        <encoder>
-            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
-        </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录  Rolling strategy of the logger, recording by date or by size.-->
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/${artifactId}/%d{yyyy-MM-dd}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
-            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-                <maxFileSize>100MB</maxFileSize>
-            </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文档保留天数-->
-            <maxHistory>15</maxHistory>
-        </rollingPolicy>
-        <!-- 此日志文档只记录ERROR级别的 -->
-        <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>ERROR</level>
-            <onMatch>ACCEPT</onMatch>
-            <onMismatch>DENY</onMismatch>
-        </filter>
-    </appender>
-
-    <!-- 2.5 所有 除了DEBUG级别的其它高于DEBUG的 日志,记录到一个文件  -->
-    <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- 正在记录的日志文档的路径及文档名 -->
-        <file>${log.path}/${artifactId}/all.log</file>
-        <!--日志文档输出格式 Output format of the log document.-->
-        <encoder>
-            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
-            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
-        </encoder>
-        <!-- 日志记录器的滚动策略,按日期,按大小记录  Rolling strategy of the logger, recording by date or by size.-->
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${log.path}/${artifactId}/%d{yyyy-MM-dd}/all-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
-            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-                <maxFileSize>100MB</maxFileSize>
-            </timeBasedFileNamingAndTriggeringPolicy>
-            <!--日志文档保留天数-->
-            <maxHistory>15</maxHistory>
-        </rollingPolicy>
-        <!-- 此日志文档记录除了DEBUG级别的其它高于DEBUG的 -->
-        <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>DEBUG</level>
-            <onMatch>DENY</onMatch>
-            <onMismatch>ACCEPT</onMismatch>
-        </filter>
-    </appender>
-
-    <!--
-        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
-        以及指定<appender>。<logger>仅有一个name属性,
-        一个可选的level和一个可选的addtivity属性。
-        name:用来指定受此logger约束的某一个包或者具体的某一个类。
-        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-              还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。
-              如果未设置此属性,那么当前logger将会继承上级的级别。
-        addtivity:是否向上级logger传递打印信息。默认是true。
-        <logger name="org.springframework.web" level="info"/>
-        <logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
-    -->
-
-    <!--
-        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
-        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
-        不能设置为INHERITED或者同义词NULL。默认是DEBUG
-        可以包含零个或多个元素,标识这个appender将会添加到这个logger。
-    -->
-
-    <!-- 4  最终的策略:
-                 基本策略(root级) + 根据profile在启动时, logger标签中定制化package日志级别(优先级高于上面的root级)-->
-    <springProfile name="dev">
-        <root level="info">
-            <appender-ref ref="CONSOLE" />
-            <appender-ref ref="DEBUG_FILE" />
-            <appender-ref ref="INFO_FILE" />
-            <appender-ref ref="WARN_FILE" />
-            <appender-ref ref="ERROR_FILE" />
-            <appender-ref ref="ALL_FILE" />
-        </root>
-        <logger name="com.dsh" level="debug"/>
-        <logger name="business-log" level="warn"/>
-    </springProfile>
-
-    <springProfile name="fat">
-        <root level="info">
-            <appender-ref ref="CONSOLE" />
-            <appender-ref ref="DEBUG_FILE" />
-            <appender-ref ref="INFO_FILE" />
-            <appender-ref ref="WARN_FILE" />
-            <appender-ref ref="ERROR_FILE" />
-            <appender-ref ref="ALL_FILE" />
-        </root>
-        <logger name="com.dsh.course.mapper" level="error"/>
-        <logger name="business-log" level="warn"/>
-    </springProfile>
-
-    <springProfile name="prod">
-        <root level="warn">
-            <!-- 生产环境最好不配置console写文件 -->
-            <appender-ref ref="DEBUG_FILE" />
-            <appender-ref ref="INFO_FILE" />
-            <appender-ref ref="WARN_FILE" />
-            <appender-ref ref="ERROR_FILE" />
-            <appender-ref ref="ALL_FILE" />
-        </root>
-        <logger name="com.dsh.course.mapper" level="error"/>
-        <logger name="business-log" level="warn"/>
-    </springProfile>
-
-</configuration>
\ No newline at end of file
diff --git a/cloud-server-competition/src/main/resources/logback-spring.xml b/cloud-server-competition/src/main/resources/logback-spring.xml
index e98de73..b13e9b3 100644
--- a/cloud-server-competition/src/main/resources/logback-spring.xml
+++ b/cloud-server-competition/src/main/resources/logback-spring.xml
@@ -35,7 +35,7 @@
     <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <!-- 正在记录的日志文档的路径及文档名 -->
         <file>${log.path}/${artifactId}/debug.log</file>
-        <!--日志文档输出格式  Output format of the log document.-->
+        <!--日志文档输出格式 Output format of the log document.-->
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset> <!-- 设置字符集 -->
@@ -62,7 +62,7 @@
     <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <!-- 正在记录的日志文档的路径及文档名 -->
         <file>${log.path}/${artifactId}/info.log</file>
-        <!--日志文档输出格式  Output format of the log document.-->
+        <!--日志文档输出格式 Output format of the log document.-->
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset>
@@ -89,7 +89,7 @@
     <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <!-- 正在记录的日志文档的路径及文档名 -->
         <file>${log.path}/${artifactId}/warn.log</file>
-        <!--日志文档输出格式  Output format of the log document.-->
+        <!--日志文档输出格式 Output format of the log document.-->
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset> <!-- 此处设置字符集 -->
@@ -115,7 +115,7 @@
     <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <!-- 正在记录的日志文档的路径及文档名 -->
         <file>${log.path}/${artifactId}/error.log</file>
-        <!--日志文档输出格式  Output format of the log document.-->
+        <!--日志文档输出格式 Output format of the log document.-->
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset> <!-- 此处设置字符集 -->
@@ -141,7 +141,7 @@
     <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <!-- 正在记录的日志文档的路径及文档名 -->
         <file>${log.path}/${artifactId}/all.log</file>
-        <!--日志文档输出格式  Output format of the log document.-->
+        <!--日志文档输出格式 Output format of the log document.-->
         <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset> <!-- 此处设置字符集 -->
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 bb2a1fe..f885da2 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,11 +2,10 @@
 
 
 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.TCoursePackagePayment;
-import com.dsh.course.entity.TCoursePackageType;
+import com.dsh.course.entity.*;
 import com.dsh.course.feignclient.model.ExerciseVideo;
 import com.dsh.course.model.*;
 import com.dsh.course.model.dto.CourseChangeStateDTO;
@@ -16,6 +15,7 @@
 import com.dsh.course.service.TCoursePackageService;
 import com.dsh.course.service.TCoursePackageTypeService;
 import com.dsh.course.service.TCourseService;
+import com.dsh.course.service.*;
 import com.dsh.course.util.PageFactory;
 import com.dsh.course.util.PayMoneyUtil;
 import com.dsh.course.util.ResultUtil;
@@ -34,6 +34,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;
 
@@ -63,6 +64,8 @@
     @Autowired
     private TCoursePackagePaymentService coursePackagePaymentService;
 
+    @Autowired
+    private TCoursePackageDiscountService discountService;
     /**
      * 上/下架 1为上架 2为下架 3为删除
      *
@@ -71,6 +74,9 @@
     @RequestMapping("/base/course/changeState")
     @ResponseBody
     public Object changeState(@RequestBody CourseChangeStateDTO dto){
+
+
+
 
         return courseService.changeState(dto);
     }
@@ -377,4 +383,93 @@
     public List<TCourse> queryCourseByType(@RequestBody Integer type){
         return courseService.list(new QueryWrapper<TCourse>().eq("type", type).eq("state", 1));
     }
+
+
+    @PostMapping("/course/queryDiscountList")
+    public List<DiscountList> queryDiscountList(@RequestBody  QueryDiscountList queryDiscountList){
+       return discountService.queryDiscountList(queryDiscountList);
+    }
+    @PostMapping("/course/queryDiscountListAudit")
+    public List<DiscountList> queryDiscountListAudit(@RequestBody  QueryDiscountList queryDiscountList){
+       return discountService.queryDiscountListAudit(queryDiscountList);
+    }
+
+    @PostMapping("/course/updateState")
+    public Boolean updateState( @RequestBody DiscountUpdateState discountUpdateState){
+        TCoursePackageDiscount byId = discountService.getById(discountUpdateState.getId());
+        List<TCoursePackageDiscount> list = discountService.list(new LambdaQueryWrapper<TCoursePackageDiscount>().eq(TCoursePackageDiscount::getCoursePackageId, byId.getCoursePackageId()));
+        list.forEach(e->e.setStatus(discountUpdateState.getStatus()));
+        return discountService.updateBatchById(list);
+    }
+
+
+    @PostMapping("/course/auditDiscount")
+    public Boolean auditDiscount( @RequestBody AuditDiscount auditDiscount){
+        TCoursePackageDiscount byId = discountService.getById(auditDiscount.getId());
+        List<TCoursePackageDiscount> list = discountService.list(new LambdaQueryWrapper<TCoursePackageDiscount>().eq(TCoursePackageDiscount::getCoursePackageId, byId.getCoursePackageId()));
+        for (TCoursePackageDiscount tCoursePackageDiscount : list) {
+            tCoursePackageDiscount.setAuditStatus(auditDiscount.getType());
+            tCoursePackageDiscount.setAuditRemark(auditDiscount.getText());
+        }
+
+        return discountService.updateBatchById(list);
+    }
+
+    @PostMapping("/course/queryByDiscountId")
+    public TCoursePackage queryByDiscountId(@RequestBody Integer id){
+        TCoursePackageDiscount byId = discountService.getById(id);
+        TCoursePackage byId1 = coursePackageService.getById(byId.getCoursePackageId());
+        return byId1;
+    }
+
+    @PostMapping("/course/queryDiscountById")
+    public Integer queryDiscountById(@RequestBody Integer id){
+        TCoursePackageDiscount byId = discountService.getById(id);
+        return byId.getAuditStatus();
+    }
+
+
+
+    @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;
+    }
+
+
+    @PostMapping("/course/queryByTypeId")
+    public List<TCoursePackage> queryByTypeId(@RequestBody Integer oneId){
+        return coursePackageService.list(new LambdaQueryWrapper<TCoursePackage>().eq(TCoursePackage::getCoursePackageTypeId,oneId).eq(TCoursePackage::getAuditStatus,2).eq(TCoursePackage::getState,1));
+    }
+
+
+    @PostMapping("/course/queryByConfigId")
+    public List<Map<String, Object>> queryByConfigId(@RequestBody Integer oneId){
+        return coursePackageService.queryByConfigId(oneId);
+    }
+
+
+    @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-course/src/main/java/com/dsh/course/controller/CoursePackageDiscountController.java b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageDiscountController.java
index d5649f6..45be4c1 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageDiscountController.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackageDiscountController.java
@@ -31,7 +31,11 @@
         return coursePackageDiscountService.list(new QueryWrapper<TCoursePackageDiscount>().eq("coursePackagePaymentConfigId", coursePackagePaymentConfigId)
                 .eq("auditStatus", 2));
     }
-
+    @PostMapping("/coursePackageDiscount/queryCoursePackageDiscountOne")
+    public List<TCoursePackageDiscount> queryCoursePackageDiscountOne(@RequestBody Integer id){
+        return coursePackageDiscountService.list(new QueryWrapper<TCoursePackageDiscount>().eq("coursePackagePaymentConfigId", id)
+                .ne("auditStatus", 2));
+    }
 
     /**
      * 编辑课包折扣
diff --git a/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackageDiscount.java b/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackageDiscount.java
index 48ac5e9..bebf2e2 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackageDiscount.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackageDiscount.java
@@ -74,6 +74,6 @@
     @TableField("insertTime")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date insertTime;
-
-
+    @TableField("status")
+    private Integer status;
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackageDiscountMapper.java b/cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackageDiscountMapper.java
index 38b7057..90b2fe2 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackageDiscountMapper.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackageDiscountMapper.java
@@ -1,7 +1,12 @@
 package com.dsh.course.mapper;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.dsh.course.entity.TCoursePackageDiscount;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dsh.course.model.DiscountList;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +18,7 @@
  */
 public interface TCoursePackageDiscountMapper extends BaseMapper<TCoursePackageDiscount> {
 
+    List<DiscountList> queryDiscountList(@Param("discountListPage") Page<DiscountList> discountListPage, @Param("pCode") String pCode, @Param("cCode") String cCode, @Param("name") String name, @Param("type") Integer type, @Param("ids") List<Integer> ids);
+
+    List<DiscountList> queryDiscountListAudit(@Param("discountListPage") Page<DiscountList> discountListPage, @Param("pCode") String pCode, @Param("cCode") String cCode, @Param("name") String name, @Param("type") Integer type, @Param("ids") List<Integer> ids);
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackageMapper.java b/cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackageMapper.java
index f85010f..3017da9 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackageMapper.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/mapper/TCoursePackageMapper.java
@@ -42,4 +42,10 @@
      */
     List<Map<String, Object>> queryExamineCoursePackageLists(Page<Map<String, Object>> page, @Param("item") QueryExamineCoursePackageLists queryExamineCoursePackageLists);
 
+    List<Map<String, Object>> queryByConfigId(@Param("oneId") Integer oneId);
+
+    String getHours(@Param("coursePackageId") Integer coursePackageId);
+
+
+
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/AuditDiscount.java b/cloud-server-course/src/main/java/com/dsh/course/model/AuditDiscount.java
new file mode 100644
index 0000000..970b818
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/AuditDiscount.java
@@ -0,0 +1,16 @@
+package com.dsh.course.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AuditDiscount {
+    private Integer id;
+    
+    private Integer type;
+    
+    private String text;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/DiscountList.java b/cloud-server-course/src/main/java/com/dsh/course/model/DiscountList.java
new file mode 100644
index 0000000..f054562
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/DiscountList.java
@@ -0,0 +1,23 @@
+package com.dsh.course.model;
+
+import lombok.Data;
+
+@Data
+public class DiscountList {
+    private Integer id;
+
+    private String pName;
+
+    private String cName;
+
+    private String shopName;
+
+    private String name;
+
+    private String type;
+
+    private Integer status;
+
+    private Integer storeId;
+    private Integer courseId;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/DiscountUpdateState.java b/cloud-server-course/src/main/java/com/dsh/course/model/DiscountUpdateState.java
new file mode 100644
index 0000000..1b4747e
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/DiscountUpdateState.java
@@ -0,0 +1,14 @@
+package com.dsh.course.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DiscountUpdateState {
+    private Integer id;
+    
+    private Integer status;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/model/QueryDiscountList.java b/cloud-server-course/src/main/java/com/dsh/course/model/QueryDiscountList.java
new file mode 100644
index 0000000..72c4cd0
--- /dev/null
+++ b/cloud-server-course/src/main/java/com/dsh/course/model/QueryDiscountList.java
@@ -0,0 +1,25 @@
+package com.dsh.course.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class QueryDiscountList {
+    private long offset;
+    private long limit;
+
+    private String pCode;
+
+    private String cCode;
+
+    private String name;
+
+    private Integer type;
+
+    private List<Integer> ids;
+}
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageDiscountService.java b/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageDiscountService.java
index cd02a1a..118f746 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageDiscountService.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageDiscountService.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dsh.course.entity.TCoursePackageDiscount;
+import com.dsh.course.model.DiscountList;
+import com.dsh.course.model.QueryDiscountList;
 import com.dsh.course.model.vo.response.Details;
 import com.dsh.course.model.vo.response.ExchangeCoursePackageResponse;
 
@@ -23,4 +25,9 @@
     ExchangeCoursePackageResponse getWeekFreeCourseDetails(Integer coursePackageDiscountId,String lat,String lon);
 
 
+    List<DiscountList> queryDiscountList(QueryDiscountList queryDiscountList);
+
+
+    List<DiscountList> queryDiscountListAudit(QueryDiscountList queryDiscountList);
+
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java b/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java
index d7d6a12..4708c1c 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackageService.java
@@ -84,4 +84,9 @@
      * @return
      */
     List<Map<String, Object>> queryExamineCoursePackageLists(Page<Map<String, Object>> page, QueryExamineCoursePackageLists queryExamineCoursePackageLists);
+
+    List<Map<String, Object>> queryByConfigId(Integer oneId);
+
+    String getHours(Integer coursePackageId);
+
 }
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageDiscountServiceImpl.java b/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageDiscountServiceImpl.java
index 1017f20..ec83f76 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageDiscountServiceImpl.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageDiscountServiceImpl.java
@@ -3,7 +3,9 @@
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dsh.course.entity.CoursePackagePaymentConfig;
 import com.dsh.course.entity.TCoursePackage;
@@ -16,6 +18,8 @@
 import com.dsh.course.mapper.TCoursePackageDiscountMapper;
 import com.dsh.course.mapper.TCoursePackageMapper;
 import com.dsh.course.mapper.TCoursePackagePaymentMapper;
+import com.dsh.course.model.DiscountList;
+import com.dsh.course.model.QueryDiscountList;
 import com.dsh.course.model.vo.response.Details;
 import com.dsh.course.model.vo.response.ExchangeCoursePackageResponse;
 import com.dsh.course.service.TCoursePackageDiscountService;
@@ -352,6 +356,70 @@
         return packageResponse;
     }
 
+    @Override
+    public List<DiscountList> queryDiscountList(QueryDiscountList queryDiscountList) {
+        Page<DiscountList> discountListPage = new Page<>(queryDiscountList.getOffset(), queryDiscountList.getLimit());
+        List<DiscountList> discountLists = this.baseMapper.queryDiscountList(discountListPage, queryDiscountList.getPCode(), queryDiscountList.getCCode(), queryDiscountList.getName(), queryDiscountList.getType(), queryDiscountList.getIds());
+        for (DiscountList discountList : discountLists) {
+            List<TCoursePackageDiscount> tCoursePackageDiscounts = this.baseMapper.selectList(new LambdaQueryWrapper<TCoursePackageDiscount>().eq(TCoursePackageDiscount::getCoursePackageId, discountList.getCourseId()).eq(TCoursePackageDiscount::getAuditStatus,2).orderByAsc(TCoursePackageDiscount::getType));
+            long count = tCoursePackageDiscounts.stream().filter(e -> e.getStatus().equals(2)).count();
+            if(count>0){
+                discountList.setStatus(2);
+            }else {
+                discountList.setStatus(1);
+            }
+            String type="";
+            for (int i = 0; i < tCoursePackageDiscounts.size(); i++) {
+                if(tCoursePackageDiscounts.get(i).getType()==1){
+                    type += "会员折扣、";
+                }else if(tCoursePackageDiscounts.get(i).getType()==3){
+                    type += "限时折扣、";
+                }else if(tCoursePackageDiscounts.get(i).getType()==4){
+                    type += "赠送课时、";
+                }
+            }
+            if(type.length()>0){
+                type = type.substring(0,type.length()-1);
+            }
+            discountList.setType(type);
+        }
+        return discountLists;
+    }
+
+    public static void main(String[] args) {
+        String a ="1312dsad132";
+        a = a.substring(0,a.length()-1);
+        System.out.println(a);
+    }
+    @Override
+    public List<DiscountList> queryDiscountListAudit(QueryDiscountList queryDiscountList) {
+        Page<DiscountList> discountListPage = new Page<>(queryDiscountList.getOffset(), queryDiscountList.getLimit());
+        List<DiscountList> discountLists = this.baseMapper.queryDiscountListAudit(discountListPage, queryDiscountList.getPCode(), queryDiscountList.getCCode(), queryDiscountList.getName(), queryDiscountList.getType(), queryDiscountList.getIds());
+        for (DiscountList discountList : discountLists) {
+            List<TCoursePackageDiscount> tCoursePackageDiscounts = this.baseMapper.selectList(new LambdaQueryWrapper<TCoursePackageDiscount>().eq(TCoursePackageDiscount::getCoursePackageId, discountList.getCourseId()).ne(TCoursePackageDiscount::getAuditStatus,2).orderByAsc(TCoursePackageDiscount::getType));
+            long count = tCoursePackageDiscounts.stream().filter(e -> e.getAuditStatus().equals(2)).count();
+            if(count>0){
+                discountList.setStatus(2);
+            }else {
+                discountList.setStatus(1);
+            }
+            String type="";
+            for (int i = 0; i < tCoursePackageDiscounts.size(); i++) {
+                if(tCoursePackageDiscounts.get(i).getType()==1){
+                    type += "会员折扣、";
+                }else if(tCoursePackageDiscounts.get(i).getType()==3){
+                    type += "限时折扣、";
+                }else if(tCoursePackageDiscounts.get(i).getType()==4){
+                    type += "赠送课时、";
+                }
+            }
+            if(type.length()>0){
+                type = type.substring(0,type.length()-1);
+            }
+            discountList.setType(type);
+        }
+        return discountLists;
+    }
 
 
     private static boolean isDateWithinRange(Date date, Date startTime, Date endTime) {
diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java b/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java
index 7358a5e..8111282 100644
--- a/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java
+++ b/cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackageServiceImpl.java
@@ -951,4 +951,14 @@
         }
         return list;
     }
+
+    @Override
+    public List<Map<String, Object>> queryByConfigId(Integer oneId) {
+        return this.baseMapper.queryByConfigId(oneId);
+    }
+
+    @Override
+    public String getHours(Integer coursePackageId) {
+        return this.baseMapper.getHours(coursePackageId);
+    }
 }
diff --git a/cloud-server-course/src/main/resources/mapper/TCoursePackageDiscountMapper.xml b/cloud-server-course/src/main/resources/mapper/TCoursePackageDiscountMapper.xml
index 95fc2a7..4f085f6 100644
--- a/cloud-server-course/src/main/resources/mapper/TCoursePackageDiscountMapper.xml
+++ b/cloud-server-course/src/main/resources/mapper/TCoursePackageDiscountMapper.xml
@@ -14,5 +14,43 @@
         <result column="auditRemark" property="auditRemark" />
         <result column="insertTime" property="insertTime" />
     </resultMap>
+    <select id="queryDiscountList" resultType="com.dsh.course.model.DiscountList">
+        select t1.id,t1.type,t1.status,t2.province pName,t2.city cName,t2.name,t2.storeId,t2.id courseId from t_course_package_discount t1 left join  t_course_package t2 on t1.coursePackageId = t2.id
+        where t2.storeId in <foreach collection="ids" close=")" item="id" open="(" separator=",">
+        #{id} and t1.auditStatus =2
+    </foreach>
+     <if test="pCode !=null and pCode !=''">
+         and t2.provinceCode =#{pCode}
+     </if>
+     <if test="cCode !=null and cCode !=''">
+         and t2.cityCode =#{cCode}
+     </if>
+     <if test="name !=null and name !=''">
+         and t2.name like concat("%",#{name},"%")
+     </if>
+     <if test="type !=null ">
+         and t1.type =#{type}
+     </if>
+     group by t1.coursePackageId
+    </select>
+    <select id="queryDiscountListAudit" resultType="com.dsh.course.model.DiscountList">
+        select t1.id,t1.type,t1.auditStatus status,t2.province pName,t2.city cName,t2.name,t2.storeId,t2.id courseId from t_course_package_discount t1 left join  t_course_package t2 on t1.coursePackageId = t2.id
+        where t2.storeId in <foreach collection="ids" close=")" item="id" open="(" separator=",">
+        #{id} and t1.auditStatus !=2
+    </foreach>
+     <if test="pCode !=null and pCode !=''">
+         and t2.provinceCode =#{pCode}
+     </if>
+     <if test="cCode !=null and cCode !=''">
+         and t2.cityCode =#{cCode}
+     </if>
+     <if test="name !=null and name !=''">
+         and t2.name like concat("%",#{name},"%")
+     </if>
+     <if test="type !=null ">
+         and t1.type =#{type}
+     </if>
+        group by t1.coursePackageId
+    </select>
 
 </mapper>
diff --git a/cloud-server-course/src/main/resources/mapper/TCoursePackageMapper.xml b/cloud-server-course/src/main/resources/mapper/TCoursePackageMapper.xml
index bf5df87..8fc1230 100644
--- a/cloud-server-course/src/main/resources/mapper/TCoursePackageMapper.xml
+++ b/cloud-server-course/src/main/resources/mapper/TCoursePackageMapper.xml
@@ -125,4 +125,10 @@
         </if>
         order by a.insertTime desc
     </select>
+    <select id="queryByConfigId" resultType="java.util.Map">
+        select id,classHours from t_course_package_payment_config where coursePackageId =#{oneId}
+    </select>
+    <select id="getHours" resultType="java.lang.String">
+        select classHours from t_course_package_payment_config where id =#{coursePackageId}
+    </select>
 </mapper>
diff --git a/cloud-server-management/mb-cloud-management.iml b/cloud-server-management/mb-cloud-management.iml
index 50ddf3f..ad486c1 100644
--- a/cloud-server-management/mb-cloud-management.iml
+++ b/cloud-server-management/mb-cloud-management.iml
@@ -205,7 +205,7 @@
     <orderEntry type="library" name="Maven: xpp3:xpp3_min:1.1.4c" level="project" />
     <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.10" level="project" />
     <orderEntry type="library" name="Maven: com.aliyun.oss:aliyun-sdk-oss:2.5.0" level="project" />
-    <orderEntry type="library" name="Maven: com.huaweicloud:esdk-obs-java-bundle:3.23.3" level="project" />
+    <orderEntry type="library" name="Maven: com.huaweicloud:esdk-obs-java-bundle:3.23.5" level="project" />
     <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-core:2.13.3" level="project" />
     <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.13.3" level="project" />
     <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.13" level="project" />
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..fc8eeb3 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,10 +5,15 @@
 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;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -27,4 +32,37 @@
     @PostMapping("/base/pointMerchars/queryUserPayedGoodsList")
     List<Map<String, Object>> queryUserPayedGoodsList(@RequestBody PointMercharsPayedVo pointMercharsPayedVo);
 
+    @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/queryPointMerchaseById")
+    PointsMerchandise queryPointMerchaseById(Integer id);
+
+
+    @PostMapping("/base/pointMerchars/getshopName")
+    Integer getshopName(Integer id);
+
+    @PostMapping("/base/pointMerchars/writeOffGoodsStatus")
+    boolean writeOffGoodsStatus(@RequestBody Map<String, Object> map);
+
+    @PostMapping("/base/pointMerchars/updateGoodsDetail")
+    boolean updateGoodsDetail(@RequestBody Map<String, Object> stringObjectHashMap);
+
+
+    @PostMapping("/base/pointMerchars/queryDetailsOfGoods")
+    GoodsInfoOneVo queryDetailsOfGoods(@RequestBody Integer id);
+
+
+    @PostMapping("/base/pointMerchars/getStoreList")
+    List<StoreVos> getStoreList(@RequestBody Integer id);
+
+    @PostMapping("/base/pointMerchars/getProvinces")
+    List<StoreVos> getProvinces(@RequestBody Integer id);
+
 }
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/PointMercharsVo.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/PointMercharsVo.java
index ab8d03b..8e3e984 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/PointMercharsVo.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/PointMercharsVo.java
@@ -24,6 +24,10 @@
      */
     Integer quantityIssued;
     /**
+     * 已领数量
+     */
+    Integer quantityHas;
+    /**
      * 限领数量
      */
     Integer pickUpQuantity;
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..fe72114
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/PointsMerchandise.java
@@ -0,0 +1,172 @@
+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;
+
+    @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..c815dfb 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
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.dsh.course.feignClient.course.model.CourseChangeStateDTO;
 import com.dsh.course.feignClient.course.model.QueryCourseList;
+import com.dsh.course.feignClient.course.model.*;
 import com.dsh.guns.modular.system.model.EditCourseState;
 import com.dsh.guns.modular.system.model.TCourse;
 import com.dsh.guns.modular.system.model.TQueryBenefitsVideosDTO;
@@ -95,4 +96,38 @@
      */
     @PostMapping("/course/queryCourseByType")
     List<TCourse> queryCourseByType(Integer type);
+
+
+    @PostMapping("/course/queryDiscountList")
+    List<DiscountList> queryDiscountList(QueryDiscountList queryDiscountList);
+
+    @PostMapping("/course/updateState")
+    Boolean updateState(DiscountUpdateState discountUpdateState);
+
+    @PostMapping("/course/queryDiscountListAudit")
+    List<DiscountList> queryDiscountListAudit(QueryDiscountList queryDiscountList);
+
+    @PostMapping("/course/auditDiscount")
+    Boolean auditDiscount(AuditDiscount auditDiscount);
+
+    @PostMapping("/course/queryByDiscountId")
+    TCoursePackage queryByDiscountId(Integer id);
+    @PostMapping("/course/queryDiscountById")
+    Integer queryDiscountById(Integer id);
+
+    @PostMapping("/course/getPageageType")
+    List<Map<String, Object>> getPageageType();
+
+    @PostMapping("/course/queryByTypeId")
+    List<TCoursePackage> queryByTypeId(Integer oneId);
+
+    @PostMapping("/course/queryByConfigId")
+    List<Map<String, Object>> queryByConfigId(Integer oneId);
+
+    @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/course/feignClient/course/CoursePackageDiscountClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageDiscountClient.java
index b3faf17..9ba9a71 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageDiscountClient.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/CoursePackageDiscountClient.java
@@ -26,7 +26,10 @@
      * 配置课包折扣数据
      * @param list
      */
+
     @PostMapping("/coursePackageDiscount/setCoursePackageDiscount")
     void setCoursePackageDiscount(List<TCoursePackageDiscount> list);
 
+    @PostMapping("/coursePackageDiscount/queryCoursePackageDiscountOne")
+    List<TCoursePackageDiscount> queryCoursePackageDiscountOne(Integer id);
 }
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/AuditDiscount.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/AuditDiscount.java
new file mode 100644
index 0000000..66dae0b
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/AuditDiscount.java
@@ -0,0 +1,16 @@
+package com.dsh.course.feignClient.course.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AuditDiscount {
+    private Integer id;
+
+    private Integer type;
+
+    private String text;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/DiscountList.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/DiscountList.java
new file mode 100644
index 0000000..59af385
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/DiscountList.java
@@ -0,0 +1,23 @@
+package com.dsh.course.feignClient.course.model;
+
+import lombok.Data;
+
+@Data
+public class DiscountList {
+    private Integer id;
+
+    private String pName;
+
+    private String cName;
+
+    private String shopName;
+
+    private String name;
+
+    private String type;
+
+    private Integer status;
+
+    private Integer storeId;
+    private Integer courseId;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/DiscountUpdateState.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/DiscountUpdateState.java
new file mode 100644
index 0000000..d89f36e
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/DiscountUpdateState.java
@@ -0,0 +1,14 @@
+package com.dsh.course.feignClient.course.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DiscountUpdateState {
+    private Integer id;
+
+    private Integer status;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryDiscountList.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryDiscountList.java
new file mode 100644
index 0000000..6c78a09
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/course/model/QueryDiscountList.java
@@ -0,0 +1,25 @@
+package com.dsh.course.feignClient.course.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class QueryDiscountList {
+    private long offset;
+    private long limit;
+
+    private String pCode;
+
+    private String cCode;
+
+    private String name;
+
+    private Integer type;
+
+    private List<Integer> ids;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java
index a7ea97d..9d33d8f 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCityController.java
@@ -11,6 +11,8 @@
 import com.dsh.course.feignClient.account.model.TCityManager;
 import com.dsh.course.feignClient.competition.CompetitionClient;
 import com.dsh.course.feignClient.competition.model.*;
+import com.dsh.course.feignClient.course.CourseClient;
+import com.dsh.course.feignClient.course.model.TCoursePackage;
 import com.dsh.course.mapper.UserMapper;
 import com.dsh.guns.core.base.controller.BaseController;
 import com.dsh.guns.core.base.tips.SuccessTip;
@@ -32,6 +34,7 @@
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -59,6 +62,9 @@
 
     @Resource
     private UserMapper userMapper;
+
+    @Autowired
+    private CourseClient courseClient;
 
 
     /**
@@ -182,6 +188,38 @@
             return ERROR;
         }
     }
+    @RequestMapping(value = "/storeChange")
+    @ResponseBody
+    public Object storeChange(Integer oneId) {
+        try {
+            return storeService.list(new LambdaQueryWrapper<TStore>().eq(TStore::getCityCode, oneId));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+    @RequestMapping(value = "/packageChange")
+    @ResponseBody
+    public Object packageChange(Integer oneId) {
+        try {
+            List<TCoursePackage> list = courseClient.queryByTypeId(oneId);
+            return list;
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+    @RequestMapping(value = "/timeChange")
+    @ResponseBody
+    public Object timeChange(Integer oneId) {
+        try {
+            List<Map<String,Object>> list = courseClient.queryByConfigId(oneId);
+            return list;
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
 
 
     @RequestMapping(value = "/cancel")
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TDiscountController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TDiscountController.java
new file mode 100644
index 0000000..b8d1c5d
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TDiscountController.java
@@ -0,0 +1,382 @@
+package com.dsh.guns.modular.system.controller.code;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dsh.course.feignClient.competition.CompetitionClient;
+import com.dsh.course.feignClient.competition.model.Competition;
+import com.dsh.course.feignClient.competition.model.CompetitionUser;
+import com.dsh.course.feignClient.competition.model.GetPeopleQuery;
+import com.dsh.course.feignClient.competition.model.ListQuery;
+import com.dsh.course.feignClient.course.CourseClient;
+import com.dsh.course.feignClient.course.CoursePackageDiscountClient;
+import com.dsh.course.feignClient.course.CoursePackagePaymentConfigClient;
+import com.dsh.course.feignClient.course.CoursePackageTypeClient;
+import com.dsh.course.feignClient.course.model.*;
+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.TCity;
+import com.dsh.guns.modular.system.model.TStore;
+import com.dsh.guns.modular.system.service.ICityService;
+import com.dsh.guns.modular.system.service.ICoursePackageService;
+import com.dsh.guns.modular.system.service.IStoreService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 车辆管理控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-05 17:25:12
+ */
+@Controller
+@RequestMapping("/tDiscount")
+public class TDiscountController extends BaseController {
+
+    private String PREFIX = "/system/tDiscount/";
+    private String PREFIX1 = "/system/tDiscountAudit/";
+
+    @Autowired
+    private CompetitionClient competitionClient;
+
+    @Autowired
+    private IStoreService storeService;
+
+    @Autowired
+    private ICityService cityService;
+
+    @Autowired
+    private CourseClient courseClient;
+
+
+
+
+    /**
+     * 跳转到车辆管理首页
+     */
+    @RequestMapping("")
+    public String index(Model model) {
+        List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
+        model.addAttribute("list",list);
+        return PREFIX + "TDiscount.html";
+    }
+    @RequestMapping("/audit")
+    public String indexAudit(Model model) {
+        List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
+        model.addAttribute("list",list);
+        return PREFIX1 + "TDiscount.html";
+    }
+
+    /**
+     * 跳转到添加车辆管理
+     */
+    @RequestMapping("/tCompetition_add")
+    public String tCompetitionAdd(Model model) {
+        List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
+        model.addAttribute("list",list);
+        return PREFIX + "TCompetition_add.html";
+    }
+
+
+    /**
+     * 跳转到修改车辆管理
+     */
+    @RequestMapping("/tCompetition_update/{id}")
+    public String tCarUpdate(@PathVariable Integer id, Model model) {
+        Competition competition = competitionClient.queryById(id);
+        model.addAttribute("item",competition);
+        List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
+        TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, competition.getProvinceCode()));
+        List<TCity> list1 = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId,one.getId()));
+
+        List<TStore> list2 = storeService.list(new LambdaQueryWrapper<TStore>().eq(TStore::getCityCode,competition.getCityCode()));
+        model.addAttribute("list",list);
+        model.addAttribute("list1",list1);
+        model.addAttribute("list2",list2);
+        model.addAttribute("type",1);
+        return PREFIX + "TCompetition_edit.html";
+    }
+    @RequestMapping("/tCompetition_info/{id}")
+    public String tCarInfo(@PathVariable Integer id, Model model) {
+        Competition competition = competitionClient.queryById(id);
+        model.addAttribute("item",competition);
+        List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0));
+        TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, competition.getProvinceCode()));
+        List<TCity> list1 = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId,one.getId()));
+
+        List<TStore> list2 = storeService.list(new LambdaQueryWrapper<TStore>().eq(TStore::getCityCode,competition.getCityCode()));
+        model.addAttribute("list",list);
+        model.addAttribute("list1",list1);
+        model.addAttribute("list2",list2);
+        model.addAttribute("type",2);
+
+        return PREFIX + "TCompetition_edit.html";
+    }
+    @RequestMapping("/tCompetition_user/{id}")
+    public String tCarUser(@PathVariable Integer id, Model model) {
+        model.addAttribute("id",id);
+        return PREFIX + "TCompetitionUser.html";
+    }
+
+    @Autowired
+    private ICoursePackageService coursePackageService;
+
+    @Resource
+    private CoursePackagePaymentConfigClient coursePackagePaymentConfigClient;
+
+    @Resource
+    private CoursePackageDiscountClient coursePackageDiscountClient;
+    @RequestMapping("/info")
+    public String info( Integer id, Model model) {
+        TCoursePackage tCoursePackage1 = courseClient.queryByDiscountId(id);
+        TCoursePackage tCoursePackage = coursePackageService.queryById(tCoursePackage1.getId());
+        model.addAttribute("item", tCoursePackage);
+        List<CoursePackagePaymentConfig> list4 = coursePackagePaymentConfigClient.queryCoursePackagePaymentConfigList(id);
+        List<Map<String, Object>> list = new ArrayList<>();
+        for (CoursePackagePaymentConfig coursePackagePaymentConfig : list4) {
+            if(coursePackagePaymentConfig.getCashPayment() == 0){
+                continue;
+            }
+            Map<String, Object> map = new HashMap<>();
+            map.put("coursePackagePaymentConfigId", coursePackagePaymentConfig.getId());
+            map.put("classHours", coursePackagePaymentConfig.getClassHours());
+            String payment = "";
+            if(coursePackagePaymentConfig.getCashPayment() > 0){
+                payment += "现金支付";
+            }
+            if(coursePackagePaymentConfig.getPlayPaiCoin() > 0){
+                payment += (ToolUtil.isNotEmpty(payment) ? "、" : "") + "玩湃币支付";
+            }
+            map.put("payment",  payment);
+            map.put("cashPayment", coursePackagePaymentConfig.getCashPayment());
+            List<TCoursePackageDiscount> tCoursePackageDiscounts = coursePackageDiscountClient.queryCoursePackageDiscount(coursePackagePaymentConfig.getId());
+            map.put("coursePackageDiscount", tCoursePackageDiscounts);
+            list.add(map);
+        }
+        model.addAttribute("coursePackagePaymentConfig", JSON.toJSONString(list));
+        return PREFIX + "coursePackageDiscount.html";
+    }
+    @RequestMapping("/infoOne")
+    public String infoOne( Integer id, Model model) {
+        Integer state = courseClient.queryDiscountById(id);
+        if(state==1){
+            model.addAttribute("stateStr","待审核");
+            model.addAttribute("state",1);
+        }else {
+            model.addAttribute("stateStr","未通过");
+            model.addAttribute("state",3);
+        }
+
+        TCoursePackage tCoursePackage1 = courseClient.queryByDiscountId(id);
+        TCoursePackage tCoursePackage = coursePackageService.queryById(tCoursePackage1.getId());
+        model.addAttribute("item", tCoursePackage);
+        List<CoursePackagePaymentConfig> list4 = coursePackagePaymentConfigClient.queryCoursePackagePaymentConfigList(id);
+        List<Map<String, Object>> list = new ArrayList<>();
+        for (CoursePackagePaymentConfig coursePackagePaymentConfig : list4) {
+            if(coursePackagePaymentConfig.getCashPayment() == 0){
+                continue;
+            }
+            Map<String, Object> map = new HashMap<>();
+            map.put("coursePackagePaymentConfigId", coursePackagePaymentConfig.getId());
+            map.put("classHours", coursePackagePaymentConfig.getClassHours());
+            String payment = "";
+            if(coursePackagePaymentConfig.getCashPayment() > 0){
+                payment += "现金支付";
+            }
+            if(coursePackagePaymentConfig.getPlayPaiCoin() > 0){
+                payment += (ToolUtil.isNotEmpty(payment) ? "、" : "") + "玩湃币支付";
+            }
+            map.put("payment",  payment);
+            map.put("cashPayment", coursePackagePaymentConfig.getCashPayment());
+            List<TCoursePackageDiscount> tCoursePackageDiscounts = coursePackageDiscountClient.queryCoursePackageDiscountOne(coursePackagePaymentConfig.getId());
+            map.put("coursePackageDiscount", tCoursePackageDiscounts);
+            list.add(map);
+        }
+        model.addAttribute("coursePackagePaymentConfig", JSON.toJSONString(list));
+        return PREFIX1 + "coursePackageDiscount.html";
+    }
+
+
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String provinceCode, String cityCode, String shopName, String name, Integer type) {
+        LambdaQueryWrapper<TStore> wrapper = new LambdaQueryWrapper<>();
+        if(ToolUtil.isNotEmpty(shopName)){
+            wrapper.like(TStore::getName, shopName);
+        }
+        List<TStore> list = storeService.list(wrapper);
+        Page<DiscountList> page = new PageFactory<DiscountList>().defaultPage();
+        List<DiscountList> discountLists = courseClient.queryDiscountList(new QueryDiscountList(page.getCurrent(),page.getSize(),provinceCode,cityCode,name,type,list.stream().map(TStore::getId).collect(Collectors.toList())));
+        for (DiscountList discountList : discountLists) {
+            for (TStore tStore : list) {
+                if(discountList.getStoreId().equals(tStore.getId())){
+                    discountList.setShopName(tStore.getName());
+                }
+            }
+        }
+        page.setRecords(discountLists);
+        return  super.packForBT(page);
+    }
+    @RequestMapping(value = "/listAudit")
+    @ResponseBody
+    public Object listAudit(String provinceCode, String cityCode, String shopName, String name, Integer type) {
+        LambdaQueryWrapper<TStore> wrapper = new LambdaQueryWrapper<>();
+        if(ToolUtil.isNotEmpty(shopName)){
+            wrapper.like(TStore::getName, shopName);
+        }
+        List<TStore> list = storeService.list(wrapper);
+        Page<DiscountList> page = new PageFactory<DiscountList>().defaultPage();
+        List<DiscountList> discountLists = courseClient.queryDiscountListAudit(new QueryDiscountList(page.getCurrent(),page.getSize(),provinceCode,cityCode,name,type,list.stream().map(TStore::getId).collect(Collectors.toList())));
+        for (DiscountList discountList : discountLists) {
+            for (TStore tStore : list) {
+                if(discountList.getStoreId().equals(tStore.getId())){
+                    discountList.setShopName(tStore.getName());
+                }
+            }
+        }
+        page.setRecords(discountLists);
+        return  super.packForBT(page);
+    }
+
+
+    @RequestMapping(value = "/updateState")
+    @ResponseBody
+    public Object updateState( Integer id,Integer status) {
+        try {
+            Boolean b = courseClient.updateState(new DiscountUpdateState(id,status));
+            if(b){
+                return new SuccessTip<>();
+            }
+            return  new ErrorTip(500,"");
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+    @RequestMapping(value = "/auditDiscount")
+    @ResponseBody
+    public Object auditDiscount(Integer id,Integer audit,String text) {
+        try {
+            Boolean b = courseClient.auditDiscount(new AuditDiscount(id,audit,text));
+            if(b){
+                return new SuccessTip<>();
+            }
+            return  new ErrorTip(500,"");
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+
+
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object list(Competition competition) {
+        try {
+            if(ToolUtil.isNotEmpty(competition.getProvinceCode())) {
+                TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, competition.getProvinceCode()));
+                competition.setProvince(one.getName());
+                TCity one1 = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, competition.getCityCode()));
+                competition.setCity(one1.getName());
+            }
+            competition.setAuditStatus(1);
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            competition.setStartTime(format.parse(competition.getSTime()));
+            competition.setEndTime(format.parse(competition.getETime()));
+            competition.setRegisterEndTime(format.parse(competition.getREndTime()));
+            competitionClient.add(competition);
+            return new SuccessTip<>();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(Competition competition) {
+        try {
+            Competition competition1 = competitionClient.queryById(competition.getId());
+            if(ToolUtil.isNotEmpty(competition.getProvinceCode())) {
+                TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, competition.getProvinceCode()));
+                competition.setProvince(one.getName());
+                TCity one1 = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, competition.getCityCode()));
+                competition.setCity(one1.getName());
+            }
+            if(ToolUtil.isEmpty(competition.getCoverDrawing())){
+                competition.setCoverDrawing(competition1.getCoverDrawing());
+            }
+            if(ToolUtil.isEmpty(competition.getRegistrationNotes())){
+                competition.setRegistrationNotes(competition1.getRegistrationNotes());
+            }
+            competitionClient.update(competition);
+            return new SuccessTip<>();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+
+
+    @RequestMapping(value = "/cancel")
+    public Object cancel(Integer id) {
+        try {
+            competitionClient.cancel(id);
+            return SUCCESS_TIP;
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+
+    @RequestMapping(value = "/getPeopleFromId")
+    public Object getPeopleFromId(Integer id,Integer state) {
+        try {
+            Page<Object> page = new PageFactory<>().defaultPage();
+            Page<CompetitionUser> data =   competitionClient.getPeopleFromId(new GetPeopleQuery(page.getSize(),page.getCurrent(),id,state));
+            return  super.packForBT(data);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+
+    @RequestMapping(value = "/onChange")
+    @ResponseBody
+    public Object onChange(Integer oneId) {
+        try {
+            TCity one = cityService.getOne(new LambdaQueryWrapper<TCity>().eq(TCity::getCode, oneId));
+            return cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId,one.getId()));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+    @RequestMapping(value = "/oneChangeNext")
+    @ResponseBody
+    public Object oneChangeNext(Integer oneId) {
+        try {
+            return storeService.list(new LambdaQueryWrapper<TStore>().eq(TStore::getCityCode, oneId));
+        }catch (Exception e){
+            e.printStackTrace();
+            return ERROR;
+        }
+    }
+
+
+}
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..4bde281 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,74 @@
         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 +371,130 @@
         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
+                       ) 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.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 +521,7 @@
 
 
     /**
-     * 跳转到修改车辆管理
+     * 跳转到修改商品详情
      */
     @RequestMapping("/tGoods_update/{id}")
     public String tCityUpdate(@PathVariable Integer id, Model model) {
@@ -346,8 +529,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 +620,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-activity/src/main/resources/logback-spring.xml b/cloud-server-management/src/main/resources/logback-spring.xml
similarity index 100%
rename from cloud-server-activity/src/main/resources/logback-spring.xml
rename to cloud-server-management/src/main/resources/logback-spring.xml
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/TCouponAdd.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/TCouponAdd.html
index 75f870d..9ea5bab 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/TCouponAdd.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tCoupon/TCouponAdd.html
@@ -256,7 +256,8 @@
                                 <i class="el-icon-plus"></i>
                             </el-upload>
                             <el-dialog :visible.sync="dialogVisible">
-                                <img width="100%" :src="imageUrl1" alt="">
+                                <img width="100%" :src="imageUrl1" alt=""></el-dialog>
+                            </el-dialog>
                         </div>
                     </div>
                 </div>
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscount/TCity_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscount/TCity_add.html
new file mode 100644
index 0000000..0e0a53c
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscount/TCity_add.html
@@ -0,0 +1,83 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+
+
+        <div class="form-horizontal" id="carInfoForm">
+            <div class="form-group" id="provinceCode">
+                <label class="col-sm-3 control-label">所在省:</label>
+                <div class="col-sm-9">
+                    <select class="form-control" id="pCode" name="pCode" onchange="TCarInfoDlg.oneChange(this)">
+                        <option value="">选择省</option>
+                        @for(obj in list){
+                        <option value="${obj.code}">${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+            <div class="form-group" id="cityCode">
+                <label class="col-sm-3 control-label">所在市:</label>
+                <div class="col-sm-9">
+                    <select class="form-control" id="cCode" name="cCode">
+                        <option value="">选择市</option>
+                    </select>
+                </div>
+            </div>
+        <#input id="name" name="管理员姓名" type="text"/>
+        <#input id="phone" name="管理员手机号" type="text"/>
+
+
+        </div>
+</div>
+
+<div class="row btn-group-m-t">
+    <div class="col-sm-10 col-sm-offset-5">
+        <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCarInfoDlg.addSubmit()"/>
+        <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCarInfoDlg.close()"/>
+    </div>
+</div>
+
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/tCity/tCity_info.js"></script>
+<script>
+    laydate.render({
+        elem: '#annualInspectionTime'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#commercialInsuranceTime'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#certifyDateA'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#transDateStart'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#transDateStop'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#certifyDateB'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#nextFixDate'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#GPSInstallDate'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#registerDate'
+        ,lang:"en"
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscount/TCity_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscount/TCity_edit.html
new file mode 100644
index 0000000..8bb70f5
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscount/TCity_edit.html
@@ -0,0 +1,98 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+
+        <div class="form-horizontal" id="carInfoForm">
+            <input hidden id="id" value="${item.id}">
+            <div class="form-group" id="provinceCode">
+                <label class="col-sm-3 control-label">所在省:</label>
+                <div class="col-sm-9">
+                    <select class="form-control" id="pCode" name="pCode" onchange="TCarInfoDlg.oneChange(this)">
+                        <option value="">选择省</option>
+                        @for(obj in list){
+                        <option value="${obj.code}" ${obj.code == item.provinceCode ? 'selected=selected' : ''}>${obj.name}</option>
+                        <option value="${obj.code}">${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+            <div class="form-group" id="cityCode">
+                <label class="col-sm-3 control-label">所在市:</label>
+                <div class="col-sm-9">
+                    <select class="form-control" id="cCode" name="cCode">
+                        <option value="">选择市</option>
+                        @for(obj in list1){
+                        <option value="${obj.code}" ${obj.code == item.cityCode ? 'selected=selected' : ''}>${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+            <#input id="name" name="发放数量" type="text" value="${item.name}"/>
+            <#input id="phone" name="管理员手机号" type="text" value="${item.phone}"/>
+
+
+        </div>
+        <div class="row btn-group-m-t">
+            <div class="col-sm-10 col-sm-offset-5">
+                <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCarInfoDlg.editSubmit()"/>
+                <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCarInfoDlg.close()"/>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/tCity/tCity_info.js"></script>
+<script>
+    laydate.render({
+        elem: '#annualInspectionTime'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#commercialInsuranceTime'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#certifyDateA'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#transDateStart'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#transDateStop'
+        ,lang:"en"
+    });
+    laydate.render({
+
+        elem: '#certifyDateB'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#nextFixDate'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#GPSInstallDate'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#registerDate'
+        ,lang:"en"
+    });
+</script>
+<script type="application/javascript">
+    $(function() {
+        var companyType = $("input[name='companyType']:checked").val();
+        if (1 == companyType){
+            $(".companyDiv").hide();
+        } else if (2 == companyType){
+            $(".companyDiv").show();
+        }
+
+        TCarInfoDlg.zcServerClick();
+        TCarInfoDlg.kcServerClick();
+
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscount/TDiscount.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscount/TDiscount.html
new file mode 100644
index 0000000..009a6c1
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscount/TDiscount.html
@@ -0,0 +1,80 @@
+    @layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+
+            <div class="ibox-title">
+                <h5>折扣管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <div class="input-group">
+                                    <div class="input-group-btn open">
+                                        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button" aria-expanded="true">
+                                            所在省
+                                        </button>
+                                    </div>
+                                    <select class="form-control" id="pCode" onchange="TCompetition.oneChange(this)">
+                                        <option value="">全部</option>
+                                        @for(obj in list){
+                                        <option value="${obj.code}">${obj.name}</option>
+                                        @}
+                                    </select>
+                                </div>
+                            </div>
+
+                            <div class="col-sm-3">
+                                <div class="input-group">
+                                <div class="input-group-btn open">
+                                    <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button" aria-expanded="true">
+                                        所在市
+                                    </button>
+                                </div>
+                                <select class="form-control" id="cCode">
+                                </select>
+                            </div>
+                                </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="shopName" name="所属门店" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="课包名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="type" name="折扣类型" >
+                                <option value="">全部</option>
+                                <option value="1">会员折扣</option>
+                                <option value="3">限时折扣</option>
+                                <option value="4">赠送课时</option>
+                            </#SelectCon>
+                            </div>
+                    <div class="col-sm-3">
+                        <#button name="搜索" icon="fa-search" clickFun="TCompetition.search()"/>
+                        <#button name="重置" icon="fa-trash" clickFun="TCompetition.resetSearch()" space="true"/>
+                    </div>
+                </div>
+                <div class="hidden-xs" id="TCompetitionTableToolbar" role="group">
+                    <#button name="上架" icon="fa-plus" clickFun="TCompetition.updateState(1)"/>
+                    <#button name="下架" icon="fa-edit" clickFun="TCompetition.updateState(2)" space="true"/>
+                    <#button name="查看详情" icon="fa-remove" clickFun="TCompetition.info()" space="true"/>
+
+                </div>
+                <#table id="TCompetitionTable"/>
+            </div>
+        </div>
+    </div>
+</div>
+</div>
+</div>
+<script src="${ctxPath}/modular/system/tDiscount/tDiscount.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+        ,lang:"en"
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscount/coursePackageDiscount.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscount/coursePackageDiscount.html
new file mode 100644
index 0000000..8b7c500
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscount/coursePackageDiscount.html
@@ -0,0 +1,88 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <div class="row">
+                <input type="hidden" id="id" value="${item.id}">
+                <input type="hidden" id="coursePackagePaymentConfig" value='${coursePackagePaymentConfig}'>
+                <div class="form-group">
+                    <div class="col-sm-2"></div>
+                    <div class="col-sm-10">
+                        <label class="col-sm-2 control-label">课包名称:</label>
+                        <div class="col-sm-4" style="margin-top: 6px;">
+                            <span>${item.name}</span>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <div class="col-sm-2"></div>
+                    <div class="col-sm-10">
+                        <div class="col-sm-2">
+                        </div>
+                        <div class="col-sm-6" id="classHours" style="margin-top: 6px;">
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <div class="col-sm-2"></div>
+                    <div class="col-sm-10">
+                        <label class="col-sm-2 control-label">支付方式:</label>
+                        <div class="col-sm-4" style="margin-top: 6px;">
+                            <span id="payment"></span>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <div class="col-sm-2"></div>
+                    <div class="col-sm-10">
+                        <label class="col-sm-2 control-label">现金支付:</label>
+                        <div class="col-sm-4" style="margin-top: 6px;">
+                            <span id="cashPayment"></span>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <div class="col-sm-2"></div>
+                    <div class="col-sm-10">
+                        <label class="col-sm-2 control-label">*折扣类型:</label>
+                        <div class="col-sm-6" id="types" style="margin-top: 6px;">
+                            <input type="checkbox" name="type" value="1"> 会员折扣&nbsp;&nbsp;&nbsp;&nbsp;
+                            <input type="checkbox" name="type" value="2"> 续课优惠&nbsp;&nbsp;&nbsp;&nbsp;
+                            <input type="checkbox" name="type" value="3"> 限时折扣&nbsp;&nbsp;&nbsp;&nbsp;
+                            <input type="checkbox" name="type" value="4"> 赠送课时&nbsp;&nbsp;&nbsp;&nbsp;
+                        </div>
+                    </div>
+                </div>
+                <div id="memberDiscount">
+
+                </div>
+                <div id="renewalOffer">
+
+                </div>
+                <div id="limitedTimeDiscount">
+
+                </div>
+                <div id="complimentaryClass">
+
+                </div>
+            </div>
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="danger" name="关闭" id="cancel" icon="fa-eraser" clickFun="TCarInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/coursePackage/coursePackageDiscount.js"></script>
+<script src="${ctxPath}/modular/system/tDiscount/tDiscount_info.js"></script>
+
+
+<script type="text/javascript">
+    laydate.render({
+        elem: '#classStartTime'
+        ,type: 'time'
+        ,range: true
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscountAudit/TCity_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscountAudit/TCity_add.html
new file mode 100644
index 0000000..0e0a53c
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscountAudit/TCity_add.html
@@ -0,0 +1,83 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+
+
+        <div class="form-horizontal" id="carInfoForm">
+            <div class="form-group" id="provinceCode">
+                <label class="col-sm-3 control-label">所在省:</label>
+                <div class="col-sm-9">
+                    <select class="form-control" id="pCode" name="pCode" onchange="TCarInfoDlg.oneChange(this)">
+                        <option value="">选择省</option>
+                        @for(obj in list){
+                        <option value="${obj.code}">${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+            <div class="form-group" id="cityCode">
+                <label class="col-sm-3 control-label">所在市:</label>
+                <div class="col-sm-9">
+                    <select class="form-control" id="cCode" name="cCode">
+                        <option value="">选择市</option>
+                    </select>
+                </div>
+            </div>
+        <#input id="name" name="管理员姓名" type="text"/>
+        <#input id="phone" name="管理员手机号" type="text"/>
+
+
+        </div>
+</div>
+
+<div class="row btn-group-m-t">
+    <div class="col-sm-10 col-sm-offset-5">
+        <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCarInfoDlg.addSubmit()"/>
+        <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCarInfoDlg.close()"/>
+    </div>
+</div>
+
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/tCity/tCity_info.js"></script>
+<script>
+    laydate.render({
+        elem: '#annualInspectionTime'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#commercialInsuranceTime'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#certifyDateA'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#transDateStart'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#transDateStop'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#certifyDateB'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#nextFixDate'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#GPSInstallDate'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#registerDate'
+        ,lang:"en"
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscountAudit/TCity_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscountAudit/TCity_edit.html
new file mode 100644
index 0000000..8bb70f5
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscountAudit/TCity_edit.html
@@ -0,0 +1,98 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+
+        <div class="form-horizontal" id="carInfoForm">
+            <input hidden id="id" value="${item.id}">
+            <div class="form-group" id="provinceCode">
+                <label class="col-sm-3 control-label">所在省:</label>
+                <div class="col-sm-9">
+                    <select class="form-control" id="pCode" name="pCode" onchange="TCarInfoDlg.oneChange(this)">
+                        <option value="">选择省</option>
+                        @for(obj in list){
+                        <option value="${obj.code}" ${obj.code == item.provinceCode ? 'selected=selected' : ''}>${obj.name}</option>
+                        <option value="${obj.code}">${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+            <div class="form-group" id="cityCode">
+                <label class="col-sm-3 control-label">所在市:</label>
+                <div class="col-sm-9">
+                    <select class="form-control" id="cCode" name="cCode">
+                        <option value="">选择市</option>
+                        @for(obj in list1){
+                        <option value="${obj.code}" ${obj.code == item.cityCode ? 'selected=selected' : ''}>${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+            <#input id="name" name="发放数量" type="text" value="${item.name}"/>
+            <#input id="phone" name="管理员手机号" type="text" value="${item.phone}"/>
+
+
+        </div>
+        <div class="row btn-group-m-t">
+            <div class="col-sm-10 col-sm-offset-5">
+                <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCarInfoDlg.editSubmit()"/>
+                <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCarInfoDlg.close()"/>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/tCity/tCity_info.js"></script>
+<script>
+    laydate.render({
+        elem: '#annualInspectionTime'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#commercialInsuranceTime'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#certifyDateA'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#transDateStart'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#transDateStop'
+        ,lang:"en"
+    });
+    laydate.render({
+
+        elem: '#certifyDateB'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#nextFixDate'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#GPSInstallDate'
+        ,lang:"en"
+    });
+    laydate.render({
+        elem: '#registerDate'
+        ,lang:"en"
+    });
+</script>
+<script type="application/javascript">
+    $(function() {
+        var companyType = $("input[name='companyType']:checked").val();
+        if (1 == companyType){
+            $(".companyDiv").hide();
+        } else if (2 == companyType){
+            $(".companyDiv").show();
+        }
+
+        TCarInfoDlg.zcServerClick();
+        TCarInfoDlg.kcServerClick();
+
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscountAudit/TDiscount.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscountAudit/TDiscount.html
new file mode 100644
index 0000000..0865808
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscountAudit/TDiscount.html
@@ -0,0 +1,79 @@
+    @layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+
+            <div class="ibox-title">
+                <h5>折扣管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <div class="input-group">
+                                    <div class="input-group-btn open">
+                                        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button" aria-expanded="true">
+                                            所在省
+                                        </button>
+                                    </div>
+                                    <select class="form-control" id="pCode" onchange="TCompetition.oneChange(this)">
+                                        <option value="">全部</option>
+                                        @for(obj in list){
+                                        <option value="${obj.code}">${obj.name}</option>
+                                        @}
+                                    </select>
+                                </div>
+                            </div>
+
+                            <div class="col-sm-3">
+                                <div class="input-group">
+                                <div class="input-group-btn open">
+                                    <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button" aria-expanded="true">
+                                        所在市
+                                    </button>
+                                </div>
+                                <select class="form-control" id="cCode">
+                                </select>
+                            </div>
+                                </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="shopName" name="所属门店" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="课包名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="type" name="折扣类型" >
+                                <option value="">全部</option>
+                                <option value="1">会员折扣</option>
+                                <option value="3">限时折扣</option>
+                                <option value="4">赠送课时</option>
+                            </#SelectCon>
+                            </div>
+                    <div class="col-sm-3">
+                        <#button name="搜索" icon="fa-search" clickFun="TCompetition.search()"/>
+                        <#button name="重置" icon="fa-trash" clickFun="TCompetition.resetSearch()" space="true"/>
+                    </div>
+                </div>
+                <div class="hidden-xs" id="TCompetitionTableToolbar" role="group">
+                    <#button name="审核" icon="fa-plus" clickFun="TCompetition.audit()"/>
+                    <#button name="查看详情" icon="fa-remove" clickFun="TCompetition.info()" space="true"/>
+
+                </div>
+                <#table id="TCompetitionTable"/>
+            </div>
+        </div>
+    </div>
+</div>
+</div>
+</div>
+<script src="${ctxPath}/modular/system/tDiscountAudit/tDiscount.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+        ,lang:"en"
+    });
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscountAudit/coursePackageDiscount.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscountAudit/coursePackageDiscount.html
new file mode 100644
index 0000000..eafdd81
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tDiscountAudit/coursePackageDiscount.html
@@ -0,0 +1,105 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <div class="row">
+                <input type="hidden" id="id" value="${item.id}">
+                <input type="hidden" id="coursePackagePaymentConfig" value='${coursePackagePaymentConfig}'>
+                <div class="form-group">
+                    <div class="col-sm-2"></div>
+                    <div class="col-sm-10">
+                        <label class="col-sm-2 control-label">当前状态:</label>
+                        @if(state==1){
+                        <div class="col-sm-4" style="margin-top: 6px;color: goldenrod">
+                            <span>${stateStr}</span>
+                        </div>
+                        @}
+                        @if(state==3){
+                        <div class="col-sm-4" style="margin-top: 6px;color: red">
+                            <span>${stateStr}</span>
+                        </div>
+                        @}
+
+                    </div>
+                </div>
+                <div class="form-group">
+                    <div class="col-sm-2"></div>
+                    <div class="col-sm-10">
+                        <label class="col-sm-2 control-label">课包名称:</label>
+                        <div class="col-sm-4" style="margin-top: 6px;">
+                            <span>${item.name}</span>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <div class="col-sm-2"></div>
+                    <div class="col-sm-10">
+                        <div class="col-sm-2">
+                        </div>
+                        <div class="col-sm-6" id="classHours" style="margin-top: 6px;">
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <div class="col-sm-2"></div>
+                    <div class="col-sm-10">
+                        <label class="col-sm-2 control-label">支付方式:</label>
+                        <div class="col-sm-4" style="margin-top: 6px;">
+                            <span id="payment"></span>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <div class="col-sm-2"></div>
+                    <div class="col-sm-10">
+                        <label class="col-sm-2 control-label">现金支付:</label>
+                        <div class="col-sm-4" style="margin-top: 6px;">
+                            <span id="cashPayment"></span>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <div class="col-sm-2"></div>
+                    <div class="col-sm-10">
+                        <label class="col-sm-2 control-label">*折扣类型:</label>
+                        <div class="col-sm-6" id="types" style="margin-top: 6px;">
+                            <input type="checkbox" name="type" value="1"> 会员折扣&nbsp;&nbsp;&nbsp;&nbsp;
+                            <input type="checkbox" name="type" value="2"> 续课优惠&nbsp;&nbsp;&nbsp;&nbsp;
+                            <input type="checkbox" name="type" value="3"> 限时折扣&nbsp;&nbsp;&nbsp;&nbsp;
+                            <input type="checkbox" name="type" value="4"> 赠送课时&nbsp;&nbsp;&nbsp;&nbsp;
+                        </div>
+                    </div>
+                </div>
+                <div id="memberDiscount">
+
+                </div>
+                <div id="renewalOffer">
+
+                </div>
+                <div id="limitedTimeDiscount">
+
+                </div>
+                <div id="complimentaryClass">
+
+                </div>
+            </div>
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="danger" name="关闭" id="cancel" icon="fa-eraser" clickFun="TCarInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/modular/system/tDiscountAudit/coursePackageDiscount.js"></script>
+<script src="${ctxPath}/modular/system/tDiscount/tDiscount_info.js"></script>
+
+
+<script type="text/javascript">
+    laydate.render({
+        elem: '#classStartTime'
+        ,type: 'time'
+        ,range: true
+    });
+</script>
+@}
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..6c080fa 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
@@ -53,9 +53,9 @@
             <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 +76,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 +132,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>
@@ -228,9 +231,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="TCarInfoDlg.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="TCarInfoDlg.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="TCarInfoDlg.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>
 
@@ -249,21 +384,55 @@
 
         </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++;
+            }
+
         }else {
-            $("#b2  ").hide()
+            $("#b2").hide()
             $("#b1").show()
         }
     }
@@ -359,5 +528,32 @@
         created() {
         },
     });
+    var vue2 = new Vue({
+        el: '#app1',
+        data: {
+            autoUpload: true,//自动上传
+            imageUrl1: '',//模型数据,用于上传图片完成后图片预览
+            dialogVisible: false
+        },
+        methods: {
+            handleAvatarSuccess(res, file) {
+                TCarInfoDlg.goodsPicArray1.push(file);
+            },
+            beforeAvatarUpload(file) {
+                const isLt2M = file.size / 1024 / 1024 < 10;
+                if (!isLt2M) {
+                    this.$message.error('上传图片大小不能超过 10MB!');
+                }
+                return isLt2M;
+            },
+            handleRemove(file, fileList) {
+                couponInfoDlg.goodsPicArray = couponInfoDlg.goodsPicArray.filter(item => {
+                    return item.uid != file.uid;
+                });
+            },
+        },
+        created() {
+        },
+    });
 </script>
 @}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/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_detail_two.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_detail_two.html
new file mode 100644
index 0000000..56fd499
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_detail_two.html
@@ -0,0 +1,396 @@
+@layout("/common/_container.html"){
+<style>
+    .avatar-uploader .el-upload {
+        border: 1px dashed #d9d9d9;
+        border-radius: 6px;
+        cursor: pointer;
+        position: relative;
+        height: 100px;
+        width: 100px;
+        overflow: hidden;
+    }
+
+    .avatar-uploader .el-upload:hover {
+        border-color: #409eff;
+    }
+    .avatar-uploader-icon {
+        font-size: 28px;
+        color: #8c939d;
+        width: 100px;
+        height: 100px;
+        line-height: 100px;
+        margin-top: 34px;
+        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">
+        <input id="s1" value="${item.redemptionMethod}" hidden>
+        <input id="s2" value="${item.userPopulation}" hidden>
+        <div class="form-horizontal" id="carInfoForm">
+            <#label  id="types" name="商品类型" type="text" value="课包商品" />
+
+            <div id="b2" >
+                <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">
+                            <option value="">${item.province}</option>
+                        </select>
+                    </div>
+                </div>
+                <div class="form-group" id="cityCode">
+                    <label class="col-sm-3 control-label">所在市:</label>
+                    <div class="col-sm-9">
+                        <select class="form-control" id="cCode" name="cCode"  >
+                            <option value="">${item.city}</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="">${item.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="coursePackageTypeId" name="pCode" onchange="TGoodsInfoDlg.packageChange(this)">
+                            <option value="">${shopName}</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="">${pageName}</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="">${classHours}</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" value="${item.price}"  readonly>
+                    </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" value="${item.cash}">
+
+                    </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" value="${item.integral}">
+
+                    </div>
+                </div>
+
+                <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">
+                        @for(im in pictures){
+                        <img  height="100px" width="100px" src="${im}">
+                        @}
+                    </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" value="${item.quantityIssued}" readonly>
+                    </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" value="${item.pickUpQuantity}" readonly>
+                    </div>
+                </div>
+                <#input id="startTime1" name="有效期" type="text" value="${sTime} - ${eTime}" readonly="true"/>
+
+                <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;" readonly>${item.redemptionInstructions}</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" value="${item.sort}" readonly>
+
+                    </div>
+                </div>
+
+            </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>
+
+<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++;
+            }
+
+        }else {
+            $("#b2").hide()
+            $("#b1").show()
+        }
+    }
+
+
+
+    function changeCity(n){
+
+        var provinceSelect = null;
+        if (n === undefined || n === null || n === ''){
+            provinceSelect = document.getElementById("provinceData");
+        }else {
+            provinceSelect = document.getElementById("provinceData"+n);
+        }
+
+        var citySelect = null;
+        if (n === undefined || n === null || n === ''){
+            citySelect = document.getElementById("cityData");
+        }else {
+            citySelect = document.getElementById("cityData"+n);
+        }
+
+        var selectedProvince = provinceSelect.value;
+        // 清空城市下拉框
+        citySelect.innerHTML = '<option value="">请选择</option>';
+        if (selectedProvince === "") {
+            return;
+        }
+        var ajax = new $ax(Feng.ctxPath + "/tCouponManage/getCity", function(data){
+            data.forEach(province => {
+                var option = document.createElement("option");
+                option.value = province.id;  // 根据你的数据结构确定省份的id字段
+                option.text = province.name;  // 根据你的数据结构确定省份的name字段
+                citySelect.appendChild(option);
+            });
+        },function(data){
+            console.log('data:',data)
+            Feng.error("获取失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set('province',selectedProvince);
+        ajax.start();
+    }
+
+    /**
+     * 全国通用
+     */
+    function scopeOfApplication1() {
+        $("#storeSelect").hide();
+        $("#citySelect").hide();
+    }
+    /**
+     * 指定城市
+     */
+    function scopeOfApplication2() {
+        $("#storeSelect").hide();
+        $("#citySelect").show();
+    }
+    /**
+     * 指定门店
+     */
+    function scopeOfApplication3() {
+        $("#storeSelect").show();
+        $("#citySelect").hide();
+    }
+
+
+
+
+    var vue2 = new Vue({
+        el: '#app',
+        data: {
+            autoUpload: true,//自动上传
+            imageUrl1: '',//模型数据,用于上传图片完成后图片预览
+            dialogVisible: false
+        },
+        methods: {
+            handleAvatarSuccess(res, file) {
+                TGoodsInfoDlg.goodsPicArray.push(file);
+            },
+            beforeAvatarUpload(file) {
+                const isLt2M = file.size / 1024 / 1024 < 10;
+                if (!isLt2M) {
+                    this.$message.error('上传图片大小不能超过 10MB!');
+                }
+                return isLt2M;
+            },
+            handleRemove(file, fileList) {
+                couponInfoDlg.goodsPicArray = couponInfoDlg.goodsPicArray.filter(item => {
+                    return item.uid != file.uid;
+                });
+            },
+        },
+        created() {
+        },
+    });
+    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) {
+                couponInfoDlg.goodsPicArray = couponInfoDlg.goodsPicArray.filter(item => {
+                    return item.uid != file.uid;
+                });
+            },
+        },
+        created() {
+        },
+    });
+
+
+    window.onload = function(){
+        var OBJradio=document.getElementsByName("redemptionMethod")
+        if(OBJradio==1){
+            $("#y4").show()
+            $("#y3").hide()
+        }
+        if(OBJradio==2){
+            $("#y4").show()
+            $("#y3").show()
+        }
+        for(i=0;i<OBJradio.length;i++){//循环查找这个radio
+            if($("#s1").val()==OBJradio[i].value){//判断是否与radio的值相同
+                OBJradio[i].checked=true//修改选中状态
+            }
+        }
+        var OBJradio=document.getElementsByName("userPopulation")
+        for(i=0;i<OBJradio.length;i++){//循环查找这个radio
+            if($("#s2").val()==OBJradio[i].value){//判断是否与radio的值相同
+                OBJradio[i].checked=true//修改选中状态
+            }
+        }
+    }
+</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..1390455 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,13 @@
                                         :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>
-
+                <input id="quantityHas" value="${item.quantityHas}" hidden="hidden">
                 <div class="form-group">
                     <label class="col-sm-3 control-label">发放数量:</label>
                     <div class="col-sm-9">
@@ -109,8 +113,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 +136,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 +146,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/tCoupon/TCouponInfo.js b/cloud-server-management/src/main/webapp/static/modular/system/tCoupon/TCouponInfo.js
index 467b12e..f42e2e2 100644
--- a/cloud-server-management/src/main/webapp/static/modular/system/tCoupon/TCouponInfo.js
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tCoupon/TCouponInfo.js
@@ -432,6 +432,8 @@
                 }
             }
             cts = cityIds.join(',');
+        }else {
+            cts = cityIds;
         }
     }
 
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tDiscount/tDiscount.js b/cloud-server-management/src/main/webapp/static/modular/system/tDiscount/tDiscount.js
new file mode 100644
index 0000000..95da68a
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tDiscount/tDiscount.js
@@ -0,0 +1,358 @@
+/**
+ * 车辆管理管理初始化
+ */
+var TCompetition = {
+    id: "TCompetitionTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+var language =1
+/**
+ * 初始化表格的列
+ */
+TCompetition.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '所在省', field: 'pname', visible: true, align: 'center', valign: 'middle'
+        },
+        {title: '所在市', field: 'cname', visible: true, align: 'center', valign: 'middle'},
+        {title: '所属门店', field: 'shopName', visible: true, align: 'center', valign: 'middle'
+        },
+        {title:  '课包名称', field: 'name', visible: true, align: 'center', valign: 'middle'
+        },
+        {title:  '折扣类型', field: 'type', visible: true, align: 'center', valign: 'middle'
+        },
+        {title: '状态', field: 'status', visible: true, align: 'center', valign: 'middle'
+            ,formatter:function (data) {
+                return{1:"上架中",2:"下架中"}[data]
+            }
+        },
+    ];
+};
+function currentTime(timestamp){
+    var time = timestamp + '';
+    if(time.length != 13){
+        timestamp = timestamp * 1000;
+    }
+    var date = new Date(timestamp);;
+    var Y = date.getFullYear() + '-';
+    var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
+    var D = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()) + ' ';
+
+    var h = (date.getHours() < 10 ? '0' + (date.getHours()) : date.getHours()) + ':';
+    var m = (date.getMinutes() < 10 ? '0' + (date.getMinutes()) : date.getMinutes()) + ':';
+    var s = (date.getSeconds() < 10 ? '0' + (date.getSeconds()) : date.getSeconds());
+    var strDate = Y + M + D + h + m + s;
+    return strDate
+}
+
+function currentTime1(timestamp){
+    var time = timestamp + '';
+    if(time.length != 13){
+        timestamp = timestamp * 1000;
+    }
+    var date = new Date(timestamp);;
+    var Y = date.getFullYear() + '-';
+    var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
+    var D = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()) + ' ';
+
+    var h = (date.getHours() < 10 ? '0' + (date.getHours()) : date.getHours()) + ':';
+    var m = (date.getMinutes() < 10 ? '0' + (date.getMinutes()) : date.getMinutes()) + ':';
+    var s = (date.getSeconds() < 10 ? '0' + (date.getSeconds()) : date.getSeconds());
+    var strDate = Y + M + D ;
+    return strDate
+}
+/**
+ * 检查是否选中
+ */
+TCompetition.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+            Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TCompetition.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加车辆管理
+ */
+TCompetition.openAddTCompetition = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tCity/tCity_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看车辆管理详情
+ */
+TCompetition.openTCompetitionDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title:'编辑',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tCity/tCity_update/' + TCompetition.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除车辆管理
+ */
+TCompetition.updateState = function (e) {
+    if (this.check()) {
+        var id = TCompetition.seItem.id;
+            var ajax = new $ax(Feng.ctxPath + "/tDiscount/updateState", function (data) {
+                if(data.code==200){
+                    Feng.success("操作成功")
+                }else {
+                    Feng.error("操作失败")
+                }
+                TCompetition.table.refresh();
+            }, function (data) {
+                Feng.error("操作失败")
+                TCompetition.table.refresh();
+            });
+            ajax.set("id",id);
+            ajax.set("status",e);
+            ajax.start();
+        ;
+    }
+};
+TCompetition.oneChange = function (e) {
+    console.log(111)
+    var oneId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCompetition/onChange", function(data){
+        if(data!=null){
+            if(language==1){
+                var content='<option value="">选择市</option>';
+            }else if(language==2){
+                var content='<option value="">Choose your franchisee</option>';
+            }else {
+                var content='<option value="">Pilih franchisee Anda</option>';
+            }
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.code+"'>"+v.name+"</option>";
+            });
+            $("#cCode").empty().append(content);
+        }
+    });
+    ajax.set("oneId",oneId);
+    ajax.start();
+}
+
+TCompetition.freeze = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tCity/freeze", function (data) {
+            Feng.success("冻结成功!");
+            TCompetition.table.refresh();
+        }, function (data) {
+            Feng.error("冻结失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("id",this.seItem.id);
+        ajax.start();
+    }
+};
+TCompetition.unfreeze = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tCity/unfreeze", function (data) {
+            Feng.success("解冻成功!");
+            TCompetition.table.refresh();
+        }, function (data) {
+            Feng.error("解冻失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("id",this.seItem.id);
+        ajax.start();
+    }
+};
+TCompetition.reload = function () {
+    if (this.check()) {
+        let id = this.seItem.id
+        var operation = function(){
+            var ajax = new $ax(Feng.ctxPath + "/tCity/pwd", function (data) {
+                Feng.success("重置成功!");
+                TCompetition.table.refresh();
+            }, function (data) {
+                Feng.error("重置失败!" + data.responseJSON.message + "!");
+            });
+            ajax.set("id",id);
+            ajax.start();
+        }
+        Feng.confirm("确认重置密码?重置后密码为:a123456", operation);
+    }
+
+};
+
+TCompetition.carInsurance = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: language==1?'车辆保险':(language==2?'Vehicle insurance':'Asuransi kendaraan'),
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/TCompetition/carInsurance?carId=' + TCompetition.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+TCompetition.info = function () {
+    if (this.check()) {
+        let index = layer.open({
+            type: 2,
+            title: '折扣详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tDiscount/info?id=' + this.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+
+
+/**
+ * 查询车辆管理列表
+ */
+TCompetition.search = function () {
+    var queryData = {};
+    queryData['provinceCode'] = $("#pCode").val();
+    queryData['cityCode'] = $("#cCode").val();
+    queryData['name'] = $("#name").val();
+    queryData['shopName'] = $("#shopName").val();
+    queryData['type'] = $("type").val();
+    TCompetition.table.refresh({query: queryData});
+};
+
+TCompetition.resetSearch = function () {
+    $("#pCode").val("");
+    $("#cCode").val("");
+    $("#name").val("");
+    $("#type").val("");
+    $("#shopName").val("");
+    TCompetition.search();
+};
+
+$(function () {
+    var defaultColunms = TCompetition.initColumn();
+    var table = new BSTable(TCompetition.id, "/tDiscount/list", defaultColunms);
+    table.setPaginationType("server");
+    TCompetition.table = table.init();
+});
+
+/**
+ * 下载模板
+ */
+TCompetition.uploadCarModel = function () {
+    window.location.href = Feng.ctxPath + "/TCompetition/uploadCarModel";
+}
+
+var agreement = function(){
+    this.init = function(){
+        //模拟上传excel  
+        $("#uploadEventBtn").unbind("click").bind("click",function(){
+            $("#uploadEventFile").click();
+        });
+    };
+}
+/**
+ * 导入合同
+ */
+TCompetition.exporTCompetition = function () {
+    var uploadEventFile = $("#uploadEventFile").val();
+    if(uploadEventFile == ''){
+        if(language==1){
+            Feng.info("请选择Excel,再上传");
+        }else if(language==2){
+            Feng.info("Please select Excel and upload");
+        }else {
+            Feng.info("Silakan pilih Excel dan upload");
+        }
+    }else if(uploadEventFile.lastIndexOf(".xls")<0){//可判断以.xls和.xlsx结尾的excel  
+        if(language==1){
+            Feng.info("只能上传Excel文件");
+        }else if(language==2){
+            Feng.info("Only Excel files can be uploaded");
+        }else {
+            Feng.info("Hanya berkas Excel yang dapat diunggah");
+        }
+    }else{
+        var url = Feng.ctxPath + '/TCompetition/exporTCompetition';
+        var file = document.querySelector('input[name=file]').files[0];
+        var reader = new FileReader();
+        if (file) {
+            var formData = new FormData();
+            formData.append("myfile", file);
+            this.sendAjaxRequest(url, 'POST', formData);
+        }
+    }
+}
+TCompetition.sendAjaxRequest = function(url,type,data){
+    $.ajax({
+        url : url,
+        type : type,
+        data : data,
+        success : function(result) {
+            if(result.code==500) {
+                Feng.info(result.message);
+            }else {
+                if(language==1){
+                    Feng.success("导入成功!");
+                }else if(language==2){
+                    Feng.success("SUCCESSFUL IMPORT!");
+                }else {
+                    Feng.success("Import berhasil!");
+                }
+            }
+            TCompetition.table.refresh();
+        },
+        error : function() {
+            if(language==1){
+                Feng.error("excel上传失败!");
+            }else if(language==2){
+                Feng.error("Uploading excel Fails. Procedure!");
+            }else {
+                Feng.error("Gagal mengunggah excel!");
+            }
+        },
+        cache : false,
+        contentType : false,
+        processData : false
+    });
+};
+
+var agreement;
+$(function(){
+    agreement = new agreement();
+    agreement.init();
+});
+
+/**
+ * 导出车辆操作
+ */
+TCompetition.ouTCompetition = function () {
+    var operation = function() {
+        window.location.href = Feng.ctxPath + "/TCompetition/ouTCompetition";
+    };
+    if(language==1){
+        Feng.confirm("是否确认导出车辆信息?", operation);
+    }else if(language==2){
+        Feng.confirm("Are you sure to export vehicle information?", operation);
+    }else {
+        Feng.confirm("Apakah Anda pasti akan mengekspor informasi kendaraan?", operation);
+    }
+}
\ No newline at end of file
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tDiscount/tDiscount_info.js b/cloud-server-management/src/main/webapp/static/modular/system/tDiscount/tDiscount_info.js
new file mode 100644
index 0000000..8360403
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tDiscount/tDiscount_info.js
@@ -0,0 +1,320 @@
+/**
+ * 初始化车辆管理详情对话框
+ */
+var language=1;
+var TCarInfoDlg = {
+    tCarInfoData : {},
+    validateFields: {
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TCarInfoDlg.validate = function () {
+    $('#carInfoForm').data("bootstrapValidator").resetForm();
+    $('#carInfoForm').bootstrapValidator('validate');
+    return $("#carInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TCarInfoDlg.clearData = function() {
+    this.tCarInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCarInfoDlg.set = function(key, val) {
+    this.tCarInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCarInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TCarInfoDlg.close = function() {
+    parent.layer.close(window.parent.TCompetition.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TCarInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('isPlatCar')
+    .set('companyId')
+    .set('franchiseeId')
+    .set('carColor')
+    .set('carModelId')
+    .set('carBrandId')
+    .set('carLicensePlate')
+    .set('carPhoto')
+    .set('drivingLicenseNumber')
+    .set('drivingLicensePhoto')
+    .set('annualInspectionTime')
+    .set('commercialInsuranceTime')
+    .set('createTime')
+    .set('state')
+    .set('addType')
+    .set('addObjectId')
+    .set('plateColor')
+    .set('vehicleType')
+    .set('ownerName')
+    .set('engineId')
+    .set('VIN')
+    .set('certifyDateA')
+    .set('fuelType')
+    .set('engineDisplace')
+    .set('certificate')
+    .set('transAgency')
+    .set('transArea')
+    .set('transDateStart')
+    .set('transDateStop')
+    .set('certifyDateB')
+    .set('fixState')
+    .set('nextFixDate')
+    .set('checkState')
+    .set('feePrintId')
+    .set('GPSBrand')
+    .set('GPSModel')
+    .set('GPSIMEI')
+    .set('GPSInstallDate')
+    .set('registerDate')
+    .set('commercialType');
+}
+
+/**
+ * 提交添加
+ */
+TCarInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        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!");
+            }
+            window.parent.TCompetition.table.refresh();
+            TCarInfoDlg.close();
+        }else{
+            Feng.error(data.msg);
+        }
+
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tCarInfoData);
+    ajax.set("provinceCode",pCode);
+    ajax.set("cityCode",cCode);
+    ajax.set("name",name);
+    ajax.set("phone",phone);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TCarInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        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/update", function(data){
+        if(data=="5001"){
+            Feng.error("改账号已经存在");
+        }else
+        if(data.code == 200){
+            if(language==1){
+                Feng.success("修改成功!");
+            }else if(language==2){
+                Feng.success("Modify successfully!");
+            }else {
+                Feng.success("Mengubah dengan sukses!");
+            }
+            window.parent.TCompetition.table.refresh();
+            TCarInfoDlg.close();
+        }else{
+            Feng.error(data.msg);
+        }
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("provinceCode",pCode);
+    ajax.set("cityCode",cCode);
+    ajax.set("name",name);
+    ajax.set("phone",phone);
+    ajax.set("id",$("#id").val());
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("carInfoForm", TCarInfoDlg.validateFields);
+    // 初始化图片上传
+    var carPhoto = new $WebUpload("carPhoto");
+    carPhoto.setUploadBarId("progressBar");
+    carPhoto.init();
+    var drivingLicensePhoto = new $WebUpload("drivingLicensePhoto");
+    drivingLicensePhoto.setUploadBarId("progressBar");
+    drivingLicensePhoto.init();
+});
+
+/**
+ * 选择分公司后执行
+ */
+TCarInfoDlg.oneChange = function (e) {
+    var oneId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCity/onChange", function(data){
+        if(data!=null){
+            if(language==1){
+                var content='<option value="">选择市</option>';
+            }else if(language==2){
+                var content='<option value="">Choose your franchisee</option>';
+            }else {
+                var content='<option value="">Pilih franchisee Anda</option>';
+            }
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.code+"'>"+v.name+"</option>";
+            });
+            $("#cCode").empty().append(content);
+        }
+    });
+    ajax.set("oneId",oneId);
+    ajax.start();
+}
+
+/**
+ * 类型改变执行
+ * @param e
+ */
+TCarInfoDlg.companyTypeClick = function (e) {
+    if (1 == e){
+        $(".companyDiv").hide();
+    } else if (2 == e){
+        $(".companyDiv").show();
+    }
+}
+
+/**
+ * 车辆品牌改变时执行
+ */
+TCarInfoDlg.brandChange = function (e) {
+    var carBrandId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCar/brandChange", function(data){
+        if(data!=null){
+            if(language==1){
+                var content='<option value="">选择车辆类型</option>';
+            }else if(language==2){
+                var content='<option value="">Please select the vehicle type</option>';
+            }else {
+                var content='<option value="">Pilih Jenis Kendaraan</option>';
+            }
+
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#carModelId").empty().append(content);
+        }
+    });
+    ajax.set("carBrandId",carBrandId);
+    ajax.start();
+}
+
+/**
+ * 专车服务被点击
+ */
+TCarInfoDlg.zcServerClick = function () {
+    var serverBox1 = $('#serverBox1').prop('checked');
+    if (serverBox1){
+        $("#zcModelDiv").show();
+    } else {
+        $("#zcModelDiv").hide();
+    }
+}
+
+/**
+ * 跨城服务被点击
+ */
+TCarInfoDlg.kcServerClick = function () {
+    var serverBox3 = $('#serverBox3').prop('checked');
+    if (serverBox3){
+        $("#kcModelDiv").show();
+    } else {
+        $("#kcModelDiv").hide();
+    }
+}
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tDiscountAudit/coursePackageDiscount.js b/cloud-server-management/src/main/webapp/static/modular/system/tDiscountAudit/coursePackageDiscount.js
new file mode 100644
index 0000000..9b77955
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tDiscountAudit/coursePackageDiscount.js
@@ -0,0 +1,819 @@
+/**
+ * 用户详情对话框(可用于添加和修改对话框)
+ */
+var CoursePackageDiscount = {
+    userInfoData: {},
+    coursePackagePaymentConfig: {}
+};
+
+
+
+/**
+ * 关闭此对话框
+ */
+CoursePackageDiscount.close = function () {
+    parent.layer.close(window.parent.CoursePackage.layerIndex);
+};
+
+
+/**
+ * 提交修改
+ */
+CoursePackageDiscount.editSubmit = function () {
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/coursePackage/setCoursePackageDiscount", function (data) {
+        if(data.code == 200){
+            Feng.success("编辑成功!");
+            CoursePackageDiscount.close();
+            window.parent.CoursePackage.table.refresh();
+        }else{
+            Feng.error(data.msg);
+        }
+    }, function (data) {
+        Feng.error("编辑失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set('json', JSON.stringify(CoursePackageDiscount.coursePackagePaymentConfig));
+    ajax.set('id', $('#id').val());
+    ajax.start();
+};
+
+
+
+
+
+
+function addPrice(type){
+    let index = $('#classHours').find('button[checked]').attr('index');
+    if(type == 3){
+        let ll = $('#limitedTimeDiscount .limitedTimeDiscount').length;
+        let htmlStr =
+            '   <div class="form-group limitedTimeDiscount" index="' + ll + '">' +
+            '           <div class="col-sm-2"></div>\n' +
+            '           <div class="col-sm-8" style="border: 1px solid; padding: 20px;">\n' +
+            '                <div class="form-group">\n' +
+            '                    <label class="col-sm-2 control-label">折扣有效期:</label>\n' +
+            '                    <div class="col-sm-9">\n' +
+            '                         <input class="startAndEndDay" style="width: 300px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/>' +
+            '                    </div>\n' +
+            '                    <div class="col-sm-1"><i class="fa fa-trash-o" style="font-size:24px;color: red;" onclick="removePrice(3, this)"></i></div>\n' +
+            '                </div>' +
+            '                <div class="form-group">\n' +
+            '                    <label class="col-sm-2 control-label">*折扣时间:</label>\n' +
+            '                    <div class="col-sm-5">\n' +
+            '                        <input class="time" style="width: 200px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/>\n' +
+            '                    </div>\n' +
+            '                </div>' +
+            '                <div class="form-group">\n' +
+            '                    <label class="col-sm-2 control-label"></label>\n' +
+            '                    <div class="col-sm-8" style="margin-top: 6px;">\n' +
+            '                        <input type="checkbox" name="week" value="1" onclick="addPriceValue(3, this, \'weeks\')"/> 周一&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="2" onclick="addPriceValue(3, this, \'weeks\')"/> 周二&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="3" onclick="addPriceValue(3, this, \'weeks\')"/> 周三&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="4" onclick="addPriceValue(3, this, \'weeks\')"/> 周四&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="5" onclick="addPriceValue(3, this, \'weeks\')"/> 周五&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="6" onclick="addPriceValue(3, this, \'weeks\')"/> 周六&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="7" onclick="addPriceValue(3, this, \'weeks\')"/> 周日&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                    </div>\n' +
+            '                </div>' +
+            '                <div class="form-group">\n' +
+            '                    <label class="col-sm-2 control-label">*现金支付:</label>\n' +
+            '                    <div class="col-sm-4">\n' +
+            '                        <input type="number" class="price" onblur="addPriceValue(3, this, \'cashPayment\')" min="0" placeholder="请输入折扣后支付价格" style="width: 180px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/> ¥\n' +
+            '                    </div>\n' +
+            '                </div>' +
+            '           </div>' +
+            '   </div>';
+
+        $('#limitedTimeDiscount').append(htmlStr);
+        let arr = CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount;
+        for(let k in arr){
+            if(arr[k].type == 3){
+                arr[k].content.push({})
+            }
+        }
+        lay('.startAndEndDay').each(function(i, e){
+            laydate.render({
+                elem: this
+                ,type: 'datetime'
+                ,range: true
+                ,done: function(value, date, endDate){
+                    let index = $('#classHours').find('button[checked]').attr('index');
+                    let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+                    let ii = $(e).parent('div').parent('div').parent('div').parent('div').attr('index');
+                    for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+                        if(type == obj.coursePackageDiscount[i].type){
+                            let jsonArray = obj.coursePackageDiscount[i].content;
+                            for (let j = 0; j < jsonArray.length; j++) {
+                                if(j == ii){
+                                    let arr = value.split(" - ");
+                                    obj.coursePackageDiscount[i].content[j]['startDate'] = arr[0];
+                                    obj.coursePackageDiscount[i].content[j]['endDate'] = arr[1];
+                                }
+                            }
+                        }
+                    }
+                }
+            });
+        });
+        lay('.time').each(function(i, e){
+            laydate.render({
+                elem: this
+                ,type: 'time'
+                ,range: true
+                ,done: function(value, date, endDate){
+                    let index = $('#classHours').find('button[checked]').attr('index');
+                    let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+                    let ii = $(e).parent('div').parent('div').parent('div').parent('div').attr('index');
+                    for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+                        if(type == obj.coursePackageDiscount[i].type){
+                            let jsonArray = obj.coursePackageDiscount[i].content;
+                            for (let j = 0; j < jsonArray.length; j++) {
+                                if(j == ii){
+                                    let arr = value.split(" - ");
+                                    obj.coursePackageDiscount[i].content[j]['startTime'] = arr[0];
+                                    obj.coursePackageDiscount[i].content[j]['endTime'] = arr[1];
+                                }
+                            }
+                        }
+                    }
+                }
+            });
+        });
+    }
+    if(type == 4){
+        let ll = $('#complimentaryClass .complimentaryClass').length;
+        let htmlStr =
+            '   <div class="form-group complimentaryClass" index="' + ll + '">' +
+            '           <div class="col-sm-2"></div>\n' +
+            '           <div class="col-sm-8" style="border: 1px solid; padding: 20px;">\n' +
+            '                <div class="form-group">\n' +
+            '                    <label class="col-sm-2 control-label">*赠送有效期:</label>\n' +
+            '                    <div class="col-sm-9">\n' +
+            '                         <input class="startAndEndDay" style="width: 300px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/>' +
+            '                    </div>\n' +
+            '                    <div class="col-sm-1"><i class="fa fa-trash-o" style="font-size:24px;color: red;" onclick="removePrice(4, this)"></i></div>\n' +
+            '                </div>' +
+            '                <div class="form-group">\n' +
+            '                    <label class="col-sm-2 control-label">*赠送时间:</label>\n' +
+            '                    <div class="col-sm-5">\n' +
+            '                        <input class="time" style="width: 200px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/>\n' +
+            '                    </div>\n' +
+            '                </div>' +
+            '                <div class="form-group">\n' +
+            '                    <label class="col-sm-2 control-label"></label>\n' +
+            '                    <div class="col-sm-8" style="margin-top: 6px;">\n' +
+            '                        <input type="checkbox" name="week" value="1" onclick="addPriceValue(4, this, \'weeks\')"/> 周一&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="2" onclick="addPriceValue(4, this, \'weeks\')"/> 周二&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="3" onclick="addPriceValue(4, this, \'weeks\')"/> 周三&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="4" onclick="addPriceValue(4, this, \'weeks\')"/> 周四&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="5" onclick="addPriceValue(4, this, \'weeks\')"/> 周五&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="6" onclick="addPriceValue(4, this, \'weeks\')"/> 周六&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                        <input type="checkbox" name="week" value="7" onclick="addPriceValue(4, this, \'weeks\')"/> 周日&nbsp;&nbsp;&nbsp;&nbsp;' +
+            '                    </div>\n' +
+            '                </div>' +
+            '                <div class="form-group">\n' +
+            '                    <label class="col-sm-2 control-label">*赠送课时数:</label>\n' +
+            '                    <div class="col-sm-4">\n' +
+            '                        <input type="number" class="price" onblur="addPriceValue(4, this, \'hour\')" min="0" placeholder="请输入赠送课时数" style="width: 180px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/> ¥\n' +
+            '                    </div>\n' +
+            '                </div>' +
+            '           </div>' +
+            '   </div>';
+        $('#complimentaryClass').append(htmlStr);
+        let arr = CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount;
+        for(let k in arr){
+            if(arr[k].type == 4){
+                arr[k].content.push({})
+            }
+        }
+        lay('.startAndEndDay').each(function(i, e){
+            laydate.render({
+                elem: this
+                ,type: 'datetime'
+                ,range: true
+                ,done: function(value, date, endDate){
+                    let index = $('#classHours').find('button[checked]').attr('index');
+                    let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+                    let ii = $(e).parent('div').parent('div').parent('div').parent('div').attr('index');
+                    for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+                        if(type == obj.coursePackageDiscount[i].type){
+                            let jsonArray = obj.coursePackageDiscount[i].content;
+                            for (let j = 0; j < jsonArray.length; j++) {
+                                if(j == ii){
+                                    let arr = value.split(" - ");
+                                    obj.coursePackageDiscount[i].content[j]['startDate'] = arr[0];
+                                    obj.coursePackageDiscount[i].content[j]['endDate'] = arr[1];
+                                }
+                            }
+                        }
+                    }
+                }
+            });
+        });
+        lay('.time').each(function(i, e){
+            laydate.render({
+                elem: this
+                ,type: 'time'
+                ,range: true
+                ,done: function(value, date, endDate){
+                    let index = $('#classHours').find('button[checked]').attr('index');
+                    let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+                    let ii = $(e).parent('div').parent('div').parent('div').parent('div').attr('index');
+                    for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+                        if(type == obj.coursePackageDiscount[i].type){
+                            let jsonArray = obj.coursePackageDiscount[i].content;
+                            for (let j = 0; j < jsonArray.length; j++) {
+                                if(j == ii){
+                                    let arr = value.split(" - ");
+                                    obj.coursePackageDiscount[i].content[j]['startTime'] = arr[0];
+                                    obj.coursePackageDiscount[i].content[j]['endTime'] = arr[1];
+                                }
+                            }
+                        }
+                    }
+                }
+            });
+        });
+    }
+}
+
+
+function removePrice(type, e){
+    let index = $('#classHours').find('button[checked]').attr('index');
+    let object = $(e).parent('div').parent('div').parent('div').parent('div');
+    let ii = object.attr('index');
+    let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+    for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+        if(type == obj.coursePackageDiscount[i].type){
+            let jsonArray = null;
+            if(typeof obj.coursePackageDiscount[i].content == "string"){
+                jsonArray = JSON.parse(obj.coursePackageDiscount[i].content);
+            }else{
+                jsonArray = obj.coursePackageDiscount[i].content;
+            }
+
+            let arr = [];
+            for (let j = 0; j < jsonArray.length; j++) {
+                if(j == ii){
+                    continue
+                }
+                arr.push(jsonArray[j]);
+            }
+            CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount[i].content = arr;
+        }
+    }
+    object.remove();
+}
+
+
+function addPriceValue(type, e, name){
+    let index = $('#classHours').find('button[checked]').attr('index');
+    if(type == 1){
+        let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+        for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+            if(type == obj.coursePackageDiscount[i].type){
+                let content = null;
+                if(typeof obj.coursePackageDiscount[i].content == "string"){
+                    content = JSON.parse(obj.coursePackageDiscount[i].content);
+                }else{
+                    content = obj.coursePackageDiscount[i].content;
+                }
+                content[name] = parseFloat($(e).val());
+                CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount[i].content = content;
+            }
+        }
+    }
+    if(type == 2){
+        let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+        for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+            if(type == obj.coursePackageDiscount[i].type){
+                let content = null;
+                if(typeof obj.coursePackageDiscount[i].content == "string"){
+                    content = JSON.parse(obj.coursePackageDiscount[i].content);
+                }else{
+                    content = obj.coursePackageDiscount[i].content;
+                }
+                content[name] = parseFloat($(e).val());
+                CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount[i].content = content;
+            }
+        }
+    }
+    if(type == 3){
+        let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+        let ii = $(e).parent('div').parent('div').parent('div').parent('div').attr('index');
+        for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+            if(type == obj.coursePackageDiscount[i].type){
+                let jsonArray = null;
+                if(typeof obj.coursePackageDiscount[i].content == "string"){
+                    jsonArray = JSON.parse(obj.coursePackageDiscount[i].content);
+                }else{
+                    jsonArray = obj.coursePackageDiscount[i].content;
+                }
+
+                for (let j = 0; j < jsonArray.length; j++) {
+                    if(j == ii){
+                        if('weeks' == name){
+                            let weeks = jsonArray[j].weeks;
+                            let v = parseInt($(e).val());
+                            if(null != weeks && typeof weeks != "undefined"){
+                                if(e.checked){
+                                    weeks.push(v);
+                                }else{
+                                    let arr = [];
+                                    for (let k = 0; k < weeks.length; k++) {
+                                        if(weeks[k] == v){
+                                            continue
+                                        }
+                                        arr.push(weeks[k]);
+                                    }
+                                    weeks = arr;
+                                }
+                            }else{
+                                weeks = [v];
+                            }
+                            jsonArray[j].weeks = weeks;
+                        }else{
+                            jsonArray[j][name] = parseFloat($(e).val());
+                        }
+                    }
+                }
+                CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount[i].content = jsonArray;
+            }
+        }
+    }
+    if(type == 4){
+        let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+        let ii = $(e).parent('div').parent('div').parent('div').parent('div').attr('index');
+        for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+            if(type == obj.coursePackageDiscount[i].type){
+                let jsonArray = null;
+                if(typeof obj.coursePackageDiscount[i].content == "string"){
+                    jsonArray = JSON.parse(obj.coursePackageDiscount[i].content);
+                }else{
+                    jsonArray = obj.coursePackageDiscount[i].content;
+                }
+                for (let j = 0; j < jsonArray.length; j++) {
+                    if(j == ii){
+                        if('weeks' == name){
+                            let weeks = jsonArray[j].weeks;
+                            let v = parseInt($(e).val());
+                            if(null != weeks && typeof weeks != "undefined"){
+                                if(e.checked){
+                                    weeks.push(v);
+                                }else{
+                                    let arr = [];
+                                    for (let k = 0; k < weeks.length; k++) {
+                                        if(weeks[k] == v){
+                                            continue
+                                        }
+                                        arr.push(weeks[k]);
+                                    }
+                                    weeks = arr;
+                                }
+                            }else{
+                                weeks = [v];
+                            }
+                            jsonArray[j].weeks = weeks;
+                        }else{
+                            jsonArray[j][name] = parseFloat($(e).val());
+                        }
+                    }
+                }
+                CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount[i].content = jsonArray;
+            }
+        }
+    }
+}
+
+
+function selectedPperiod(e){
+    $('#classHours').find('button[checked]').attr('style', 'width: 60px;height: 30px;border: none;border-radius: 5px;');
+    $('#classHours').find('button[checked]').removeAttr('checked');
+    if(typeof e != "undefined"){
+        $(e).attr('style', 'width: 60px;height: 30px;background-color: #0086F6;border: none;border-radius: 5px;color: white;');
+        $(e).attr('checked', true);
+    }else{
+        $($('#classHours').find('button')[0]).attr('style', 'width: 60px;height: 30px;background-color: #0086F6;border: none;border-radius: 5px;color: white;');
+        $($('#classHours').find('button')[0]).attr('checked', true);
+    }
+
+    let index = $('#classHours').find('button[checked]').attr('index');
+    let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+    $('#payment').text(obj.payment);
+    $('#cashPayment').text(obj.cashPayment);
+
+    $('#memberDiscount').html('');
+    $('#renewalOffer').html('');
+    $('#limitedTimeDiscount').html('');
+    $('#complimentaryClass').html('');
+    let objv = CoursePackageDiscount.coursePackagePaymentConfig[index];
+    $('input[name="type"]').each(function (i, e) {
+        e.checked = false;
+        let v = $(e).val();
+        for (let i = 0; i < objv.coursePackageDiscount.length; i++) {
+            if(v == objv.coursePackageDiscount[i].type){
+                $(e).click();
+            }
+        }
+    })
+}
+
+
+
+
+$(function () {
+    CoursePackageDiscount.coursePackagePaymentConfig = JSON.parse($('#coursePackagePaymentConfig').val());
+    let htmlStr = '';
+    for (let i = 0; i < CoursePackageDiscount.coursePackagePaymentConfig.length; i++) {
+        let obj = CoursePackageDiscount.coursePackagePaymentConfig[i];
+        if(i == 0){
+            htmlStr += '<button checked onclick="selectedPperiod(this)" index="' + i + '" style="width: 60px;height: 30px;background-color: #0086F6;border: none;border-radius: 5px;color: white;">' + obj.classHours + '课时</button>&nbsp;&nbsp;&nbsp;&nbsp;';
+        }else{
+            htmlStr += '<button onclick="selectedPperiod(this)" index="' + i + '" style="width: 60px;height: 30px;border: none;border-radius: 5px;">' + obj.classHours + '课时</button>&nbsp;&nbsp;&nbsp;&nbsp;';
+        }
+    }
+    $('#classHours').html(htmlStr);
+
+    $('input[name="type"]').click(function () {
+        let v = $(this).val();
+        let index = $('#classHours').find('button[checked]').attr('index');
+        if(this.checked && v == '1'){
+            let discountMember = true;
+            let hh = '<div class="hr-line-dashed"></div>' +
+                '<h3>会员折扣</h3>\n' +
+                '                <div class="form-group">\n' +
+                '                   <div class="col-sm-2"></div>'+
+                '                   <div class="col-sm-10">' +
+                '                       <label class="col-sm-2 control-label">*现金支付:</label>\n' +
+                '                       <div class="col-sm-3">\n' +
+                '                           <input type="number" min="0" value="';
+            let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+            for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+                if(v == obj.coursePackageDiscount[i].type){
+                    let jsonObject = null;
+                    if(typeof obj.coursePackageDiscount[i].content == "string"){
+                        jsonObject = JSON.parse(obj.coursePackageDiscount[i].content);
+                    }else{
+                        jsonObject = obj.coursePackageDiscount[i].content;
+                    }
+                    hh += (null == jsonObject.discountMember ? '' : jsonObject.discountMember);
+                    discountMember = false;
+                }
+            }
+            hh += '" placeholder="请输入会员支付价格" onblur="addPriceValue(1, this, \'discountMember\')" style="width: 180px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/> ¥\n' +
+                '                       </div>\n' +
+                '                   </div>'+
+                '                </div>';
+
+            $('#memberDiscount').html(hh);
+            if(discountMember){
+                CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount.push({
+                    type: 1,
+                    content:{
+                        discountMember: null
+                    }
+                });
+            }
+        }else if(!this.checked && v == '1'){
+            $('#memberDiscount').html('');
+            let datas = CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount;
+            let arra = [];
+            for (let i = 0; i < datas.length; i++){
+                if(datas[i].type == v){
+                    continue;
+                }
+                arra.push(datas[i]);
+            }
+            CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount = arra;
+        }
+        if(this.checked && v == '2'){
+            let continuingMember = true;
+            let hh = '<div class="hr-line-dashed"></div>' +
+                '<h3>续课优惠</h3>\n' +
+                '                <div class="form-group">\n' +
+                '                   <div class="col-sm-2"></div>'+
+                '                   <div class="col-sm-10">' +
+                '                       <label class="col-sm-2 control-label">会员续课:</label>\n' +
+                '                       <div class="col-sm-3">\n' +
+                '                       </div>\n' +
+                '                       <label class="col-sm-2 control-label">用户续课:</label>\n' +
+                '                       <div class="col-sm-3">\n' +
+                '                       </div>\n' +
+                '                   </div>'+
+                '                </div>' +
+                '                <div class="form-group">\n' +
+                '                   <div class="col-sm-2"></div>'+
+                '                   <div class="col-sm-10">' +
+                '                       <label class="col-sm-2 control-label">*现金支付:</label>\n' +
+                '                       <div class="col-sm-3">\n' +
+                '                           <input type="number" min="0" value="';
+            let obj = CoursePackageDiscount.coursePackagePaymentConfig[index];
+            for (let i = 0; i < obj.coursePackageDiscount.length; i++) {
+                if(v == obj.coursePackageDiscount[i].type){
+                    let jsonObject = null;
+                    if(typeof obj.coursePackageDiscount[i].content == "string"){
+                        jsonObject = JSON.parse(obj.coursePackageDiscount[i].content);
+                    }else{
+                        jsonObject = obj.coursePackageDiscount[i].content;
+                    }
+                    hh += (null == jsonObject.continuingMember ? '' : jsonObject.continuingMember);
+                    continuingMember = false;
+                }
+            }
+            hh += '" placeholder="请输入会员支付价格" onblur="addPriceValue(2, this, \'continuingMember\')" style="width: 180px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/> ¥\n' +
+                '                       </div>\n' +
+                '                       <label class="col-sm-2 control-label">*现金支付:</label>\n' +
+                '                       <div class="col-sm-3">\n' +
+                '                           <input type="number" min="0" value="';
+            let obje = CoursePackageDiscount.coursePackagePaymentConfig[index];
+            for (let i = 0; i < obje.coursePackageDiscount.length; i++) {
+                if(v == obje.coursePackageDiscount[i].type){
+                    let jsonObject = null;
+                    if(typeof obje.coursePackageDiscount[i].content == "string"){
+                        jsonObject = JSON.parse(obje.coursePackageDiscount[i].content);
+                    }else{
+                        jsonObject = obje.coursePackageDiscount[i].content;
+                    }
+                    hh += (null == jsonObject.continuingUser ? '' : jsonObject.continuingUser);
+                }
+            }
+            hh += '" placeholder="请输入用户支付价格" onblur="addPriceValue(2, this, \'continuingUser\')" style="width: 180px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/> ¥\n' +
+                '                       </div>\n' +
+                '                   </div>'+
+                '                </div>';
+            $('#renewalOffer').html(hh);
+            if(continuingMember){
+                CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount.push({
+                    type: 2,
+                    content: {
+                        continuingMember: null,
+                        continuingUser: null
+                    }
+                })
+            }
+        }else if(!this.checked && v == '2'){
+            $('#renewalOffer').html('');
+            let datas = CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount;
+            let arra = [];
+            for (let i = 0; i < datas.length; i++){
+                if(datas[i].type == v){
+                    continue;
+                }
+                arra.push(datas[i]);
+            }
+            CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount = arra;
+        }
+        if(this.checked && v == '3'){
+            let data_value = true;
+            let hh = '<div class="hr-line-dashed"></div>' +
+                '<span style="font-size: 16px;font-weight: 500;">限时折扣</span>&nbsp;&nbsp;&nbsp;&nbsp;<i class="fa fa-plus-circle" style="font-size:24px" onclick="addPrice(3)"></i>\n';
+            let obje = CoursePackageDiscount.coursePackagePaymentConfig[index];
+            for (let i = 0; i < obje.coursePackageDiscount.length; i++) {
+                if(v == obje.coursePackageDiscount[i].type){
+                    data_value = false
+                    let jsonArray = null;
+                    if(typeof obje.coursePackageDiscount[i].content == "string"){
+                        jsonArray = JSON.parse(obje.coursePackageDiscount[i].content);
+                    }else{
+                        jsonArray = obje.coursePackageDiscount[i].content;
+                    }
+
+                    for (let j = 0; j < jsonArray.length; j++) {
+                        hh += '' +
+                            '   <div class="form-group limitedTimeDiscount" index="' + j + '">' +
+                            '           <div class="col-sm-2"></div>\n' +
+                            '           <div class="col-sm-8" style="border: 1px solid; padding: 20px;">\n' +
+                            '                <div class="form-group">\n' +
+                            '                    <label class="col-sm-2 control-label">折扣有效期:</label>\n' +
+                            '                    <div class="col-sm-9">\n' +
+                            '                         <input class="startAndEndDay" value="' + (jsonArray[j].startDate + " - " + jsonArray[j].endDate) + '" style="width: 300px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/>' +
+                            '                    </div>\n' +
+                            '                    <div class="col-sm-1"><i class="fa fa-trash-o" style="font-size:24px;color: red;" onclick="removePrice(3, this)"></i></div>\n' +
+                            '                </div>' +
+                            '                <div class="form-group">\n' +
+                            '                    <label class="col-sm-2 control-label">*折扣时间:</label>\n' +
+                            '                    <div class="col-sm-5">\n' +
+                            '                        <input class="time" value="' + jsonArray[j].startTime + " - " + jsonArray[j].endTime + '" style="width: 200px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/>\n' +
+                            '                    </div>\n' +
+                            '                </div>' +
+                            '                <div class="form-group">\n' +
+                            '                    <label class="col-sm-2 control-label"></label>\n' +
+                            '                    <div class="col-sm-8" style="margin-top: 6px;">\n' +
+                            '                        <input type="checkbox" name="week" value="1"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 1){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周一&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="2"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 2){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周二&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="3"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 3){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周三&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="4"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 4){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周四&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="5"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 5){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周五&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="6"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 6){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周六&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="7"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 7){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周日&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                    </div>\n' +
+                            '                </div>' +
+                            '                <div class="form-group">\n' +
+                            '                    <label class="col-sm-2 control-label">*现金支付:</label>\n' +
+                            '                    <div class="col-sm-4">\n' +
+                            '                        <input type="number" min="0" value="' + jsonArray[j].cashPayment + '" onblur="addPriceValue(3, this, \'cashPayment\')" placeholder="请输入折扣后支付价格" style="width: 180px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/> ¥\n' +
+                            '                    </div>\n' +
+                            '                </div>' +
+                            '           </div>' +
+                            '   </div>';
+                    }
+
+                }
+            }
+            $('#limitedTimeDiscount').html(hh);
+            if(data_value){
+                CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount.push({
+                    type: 3,
+                    content: []
+                })
+            }
+        }else if(!this.checked && v == '3'){
+            $('#limitedTimeDiscount').html('');
+            let datas = CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount;
+            let arra = [];
+            for (let i = 0; i < datas.length; i++){
+                if(datas[i].type == v){
+                    continue;
+                }
+                arra.push(datas[i]);
+            }
+            CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount = arra;
+        }
+        if(this.checked && v == '4'){
+            let data_value = true;
+            let hh =
+                '<div class="hr-line-dashed"></div>' +
+                '<span style="font-size: 16px;font-weight: 500;">赠送课时</span>&nbsp;&nbsp;&nbsp;&nbsp;<i class="fa fa-plus-circle" style="font-size:24px" onclick="addPrice(4)"></i>\n';
+            let obje = CoursePackageDiscount.coursePackagePaymentConfig[index];
+            for (let i = 0; i < obje.coursePackageDiscount.length; i++) {
+                if (v == obje.coursePackageDiscount[i].type) {
+                    data_value = false;
+                    let jsonArray = null;
+                    if(typeof obje.coursePackageDiscount[i].content == "string"){
+                        jsonArray = JSON.parse(obje.coursePackageDiscount[i].content);
+                    }else{
+                        jsonArray = obje.coursePackageDiscount[i].content;
+                    }
+                    for (let j = 0; j < jsonArray.length; j++) {
+                        hh +=
+                            '   <div class="form-group complimentaryClass" index="' + j + '">' +
+                            '           <div class="col-sm-2"></div>\n' +
+                            '           <div class="col-sm-8" style="border: 1px solid; padding: 20px;">\n' +
+                            '                <div class="form-group">\n' +
+                            '                    <label class="col-sm-2 control-label">*赠送有效期:</label>\n' +
+                            '                    <div class="col-sm-9">\n' +
+                            '                         <input class="startAndEndDay" value="' + (jsonArray[j].startDate + " - " + jsonArray[j].endDate) + '" style="width: 300px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/>' +
+                            '                    </div>\n' +
+                            '                    <div class="col-sm-1"><i class="fa fa-trash-o" style="font-size:24px;color: red;" onclick="removePrice(4, this)"></i></div>\n' +
+                            '                </div>' +
+                            '                <div class="form-group">\n' +
+                            '                    <label class="col-sm-2 control-label">*赠送时间:</label>\n' +
+                            '                    <div class="col-sm-5">\n' +
+                            '                        <input class="time" value="' + jsonArray[j].startTime + " - " + jsonArray[j].endTime + '" style="width: 200px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/>\n' +
+                            '                    </div>\n' +
+                            '                </div>' +
+                            '                <div class="form-group">\n' +
+                            '                    <label class="col-sm-2 control-label"></label>\n' +
+                            '                    <div class="col-sm-8" style="margin-top: 6px;">\n' +
+                            '                        <input type="checkbox" name="week" value="1"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 1){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周一&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="2"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 2){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周二&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="3"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 3){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周三&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="4"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 4){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周四&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="5"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 5){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周五&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="6"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 6){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周六&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                        <input type="checkbox" name="week" value="7"';
+                        for (let k = 0; k < jsonArray[j].weeks.length; k++) {
+                            let w = jsonArray[j].weeks[k];
+                            if(w == 7){
+                                hh += 'checked';
+                            }
+                        }
+                        hh += '/> 周日&nbsp;&nbsp;&nbsp;&nbsp;' +
+                            '                    </div>\n' +
+                            '                </div>' +
+                            '                <div class="form-group">\n' +
+                            '                    <label class="col-sm-2 control-label">*赠送课时数:</label>\n' +
+                            '                    <div class="col-sm-4">\n' +
+                            '                        <input type="number" value="' + jsonArray[j].hour + '" onblur="addPriceValue(4, this, \'hour\')" min="0" placeholder="请输入赠送课时数" style="width: 180px;background-color: #FFFFFF;background-image: none;border: 1px solid #e5e6e7;border-radius: 1px;color: inherit;padding: 6px 12px;"/> ¥\n' +
+                            '                    </div>\n' +
+                            '                </div>' +
+                            '           </div>' +
+                            '   </div>';
+                    }
+                }
+            }
+            $('#complimentaryClass').html(hh);
+            if(data_value){
+                CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount.push({
+                    type: 4,
+                    content: []
+                })
+            }
+        }else if(!this.checked && v == '4'){
+            $('#complimentaryClass').html('');
+            let datas = CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount;
+            let arra = [];
+            for (let i = 0; i < datas.length; i++){
+                if(datas[i].type == v){
+                    continue;
+                }
+                arra.push(datas[i]);
+            }
+            CoursePackageDiscount.coursePackagePaymentConfig[index].coursePackageDiscount = arra;
+        }
+    })
+
+
+    selectedPperiod();
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tDiscountAudit/tCity_info.js b/cloud-server-management/src/main/webapp/static/modular/system/tDiscountAudit/tCity_info.js
new file mode 100644
index 0000000..8360403
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tDiscountAudit/tCity_info.js
@@ -0,0 +1,320 @@
+/**
+ * 初始化车辆管理详情对话框
+ */
+var language=1;
+var TCarInfoDlg = {
+    tCarInfoData : {},
+    validateFields: {
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TCarInfoDlg.validate = function () {
+    $('#carInfoForm').data("bootstrapValidator").resetForm();
+    $('#carInfoForm').bootstrapValidator('validate');
+    return $("#carInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TCarInfoDlg.clearData = function() {
+    this.tCarInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCarInfoDlg.set = function(key, val) {
+    this.tCarInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCarInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TCarInfoDlg.close = function() {
+    parent.layer.close(window.parent.TCompetition.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TCarInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('isPlatCar')
+    .set('companyId')
+    .set('franchiseeId')
+    .set('carColor')
+    .set('carModelId')
+    .set('carBrandId')
+    .set('carLicensePlate')
+    .set('carPhoto')
+    .set('drivingLicenseNumber')
+    .set('drivingLicensePhoto')
+    .set('annualInspectionTime')
+    .set('commercialInsuranceTime')
+    .set('createTime')
+    .set('state')
+    .set('addType')
+    .set('addObjectId')
+    .set('plateColor')
+    .set('vehicleType')
+    .set('ownerName')
+    .set('engineId')
+    .set('VIN')
+    .set('certifyDateA')
+    .set('fuelType')
+    .set('engineDisplace')
+    .set('certificate')
+    .set('transAgency')
+    .set('transArea')
+    .set('transDateStart')
+    .set('transDateStop')
+    .set('certifyDateB')
+    .set('fixState')
+    .set('nextFixDate')
+    .set('checkState')
+    .set('feePrintId')
+    .set('GPSBrand')
+    .set('GPSModel')
+    .set('GPSIMEI')
+    .set('GPSInstallDate')
+    .set('registerDate')
+    .set('commercialType');
+}
+
+/**
+ * 提交添加
+ */
+TCarInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        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!");
+            }
+            window.parent.TCompetition.table.refresh();
+            TCarInfoDlg.close();
+        }else{
+            Feng.error(data.msg);
+        }
+
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tCarInfoData);
+    ajax.set("provinceCode",pCode);
+    ajax.set("cityCode",cCode);
+    ajax.set("name",name);
+    ajax.set("phone",phone);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TCarInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        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/update", function(data){
+        if(data=="5001"){
+            Feng.error("改账号已经存在");
+        }else
+        if(data.code == 200){
+            if(language==1){
+                Feng.success("修改成功!");
+            }else if(language==2){
+                Feng.success("Modify successfully!");
+            }else {
+                Feng.success("Mengubah dengan sukses!");
+            }
+            window.parent.TCompetition.table.refresh();
+            TCarInfoDlg.close();
+        }else{
+            Feng.error(data.msg);
+        }
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("provinceCode",pCode);
+    ajax.set("cityCode",cCode);
+    ajax.set("name",name);
+    ajax.set("phone",phone);
+    ajax.set("id",$("#id").val());
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("carInfoForm", TCarInfoDlg.validateFields);
+    // 初始化图片上传
+    var carPhoto = new $WebUpload("carPhoto");
+    carPhoto.setUploadBarId("progressBar");
+    carPhoto.init();
+    var drivingLicensePhoto = new $WebUpload("drivingLicensePhoto");
+    drivingLicensePhoto.setUploadBarId("progressBar");
+    drivingLicensePhoto.init();
+});
+
+/**
+ * 选择分公司后执行
+ */
+TCarInfoDlg.oneChange = function (e) {
+    var oneId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCity/onChange", function(data){
+        if(data!=null){
+            if(language==1){
+                var content='<option value="">选择市</option>';
+            }else if(language==2){
+                var content='<option value="">Choose your franchisee</option>';
+            }else {
+                var content='<option value="">Pilih franchisee Anda</option>';
+            }
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.code+"'>"+v.name+"</option>";
+            });
+            $("#cCode").empty().append(content);
+        }
+    });
+    ajax.set("oneId",oneId);
+    ajax.start();
+}
+
+/**
+ * 类型改变执行
+ * @param e
+ */
+TCarInfoDlg.companyTypeClick = function (e) {
+    if (1 == e){
+        $(".companyDiv").hide();
+    } else if (2 == e){
+        $(".companyDiv").show();
+    }
+}
+
+/**
+ * 车辆品牌改变时执行
+ */
+TCarInfoDlg.brandChange = function (e) {
+    var carBrandId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCar/brandChange", function(data){
+        if(data!=null){
+            if(language==1){
+                var content='<option value="">选择车辆类型</option>';
+            }else if(language==2){
+                var content='<option value="">Please select the vehicle type</option>';
+            }else {
+                var content='<option value="">Pilih Jenis Kendaraan</option>';
+            }
+
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#carModelId").empty().append(content);
+        }
+    });
+    ajax.set("carBrandId",carBrandId);
+    ajax.start();
+}
+
+/**
+ * 专车服务被点击
+ */
+TCarInfoDlg.zcServerClick = function () {
+    var serverBox1 = $('#serverBox1').prop('checked');
+    if (serverBox1){
+        $("#zcModelDiv").show();
+    } else {
+        $("#zcModelDiv").hide();
+    }
+}
+
+/**
+ * 跨城服务被点击
+ */
+TCarInfoDlg.kcServerClick = function () {
+    var serverBox3 = $('#serverBox3').prop('checked');
+    if (serverBox3){
+        $("#kcModelDiv").show();
+    } else {
+        $("#kcModelDiv").hide();
+    }
+}
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tDiscountAudit/tDiscount.js b/cloud-server-management/src/main/webapp/static/modular/system/tDiscountAudit/tDiscount.js
new file mode 100644
index 0000000..d475168
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tDiscountAudit/tDiscount.js
@@ -0,0 +1,433 @@
+/**
+ * 车辆管理管理初始化
+ */
+var TCompetition = {
+    id: "TCompetitionTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+var language =1
+/**
+ * 初始化表格的列
+ */
+TCompetition.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '所在省', field: 'pname', visible: true, align: 'center', valign: 'middle'
+        },
+        {title: '所在市', field: 'cname', visible: true, align: 'center', valign: 'middle'},
+        {title: '所属门店', field: 'shopName', visible: true, align: 'center', valign: 'middle'
+        },
+        {title:  '课包名称', field: 'name', visible: true, align: 'center', valign: 'middle'
+        },
+        {title:  '折扣类型', field: 'type', visible: true, align: 'center', valign: 'middle'
+            ,formatter:function (data) {
+                return{1:"会员折扣",3:"限时折扣",4:"赠送课时"}[data]
+            }
+        },
+        {title: '状态', field: 'status', visible: true, align: 'center', valign: 'middle'
+            ,formatter:function (data) {
+                return{1:"待审核",3:"未通过"}[data]
+            }
+        },
+    ];
+};
+function currentTime(timestamp){
+    var time = timestamp + '';
+    if(time.length != 13){
+        timestamp = timestamp * 1000;
+    }
+    var date = new Date(timestamp);;
+    var Y = date.getFullYear() + '-';
+    var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
+    var D = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()) + ' ';
+
+    var h = (date.getHours() < 10 ? '0' + (date.getHours()) : date.getHours()) + ':';
+    var m = (date.getMinutes() < 10 ? '0' + (date.getMinutes()) : date.getMinutes()) + ':';
+    var s = (date.getSeconds() < 10 ? '0' + (date.getSeconds()) : date.getSeconds());
+    var strDate = Y + M + D + h + m + s;
+    return strDate
+}
+
+function currentTime1(timestamp){
+    var time = timestamp + '';
+    if(time.length != 13){
+        timestamp = timestamp * 1000;
+    }
+    var date = new Date(timestamp);;
+    var Y = date.getFullYear() + '-';
+    var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
+    var D = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()) + ' ';
+
+    var h = (date.getHours() < 10 ? '0' + (date.getHours()) : date.getHours()) + ':';
+    var m = (date.getMinutes() < 10 ? '0' + (date.getMinutes()) : date.getMinutes()) + ':';
+    var s = (date.getSeconds() < 10 ? '0' + (date.getSeconds()) : date.getSeconds());
+    var strDate = Y + M + D ;
+    return strDate
+}
+/**
+ * 检查是否选中
+ */
+TCompetition.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+            Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TCompetition.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加车辆管理
+ */
+TCompetition.openAddTCompetition = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tCity/tCity_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看车辆管理详情
+ */
+TCompetition.openTCompetitionDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title:'编辑',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tCity/tCity_update/' + TCompetition.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除车辆管理
+ */
+TCompetition.updateState = function (e) {
+    if (this.check()) {
+        var id = TCompetition.seItem.id;
+            var ajax = new $ax(Feng.ctxPath + "/TDiscount/updateState", function (data) {
+                if(data.code==200){
+                    Feng.success("操作成功")
+                }else {
+                    Feng.error("操作失败")
+                }
+                TCompetition.table.refresh();
+            }, function (data) {
+                Feng.error("操作失败")
+                TCompetition.table.refresh();
+            });
+            ajax.set("id",id);
+            ajax.set("status",e);
+            ajax.start();
+        ;
+    }
+};
+TCompetition.oneChange = function (e) {
+    console.log(111)
+    var oneId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCompetition/onChange", function(data){
+        if(data!=null){
+            if(language==1){
+                var content='<option value="">选择市</option>';
+            }else if(language==2){
+                var content='<option value="">Choose your franchisee</option>';
+            }else {
+                var content='<option value="">Pilih franchisee Anda</option>';
+            }
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.code+"'>"+v.name+"</option>";
+            });
+            $("#cCode").empty().append(content);
+        }
+    });
+    ajax.set("oneId",oneId);
+    ajax.start();
+}
+
+TCompetition.freeze = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tCity/freeze", function (data) {
+            Feng.success("冻结成功!");
+            TCompetition.table.refresh();
+        }, function (data) {
+            Feng.error("冻结失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("id",this.seItem.id);
+        ajax.start();
+    }
+};
+TCompetition.audit = function () {
+    if (this.check()) {
+        var index = layer.load(1,{
+            type: 1
+            , title: '折扣审核'
+            , area: ['50%', '50%']
+            , offset: 'auto' //具体配置参考:http://www.layui.com/doc/modules/layer.html#offset
+            , id: 'layerDemo' //防止重复弹出cge
+            , content: '<div class="form-horizontal">' +
+                '                    <div class="col-sm-11" >' +
+                '                    <div class="col-sm-11">' +
+                '                        <div class="form-group">\n' +
+                '                            <label class="col-sm-3 control-label">审核状态:</label>\n' +
+                '                            <div class="col-sm-9">\n' +
+                '                     <input type="radio" name="r1" value="2" checked> 通过   <input type="radio" name="r1" value="3" > 拒绝     '+
+                '                            </div>\n' +
+                '                        </div>\n' +
+                '                        <div class="form-group">\n' +
+                '                            <label class="col-sm-3 control-label">拒绝理由:</label>\n' +
+                '                            <div class="col-sm-9">\n' +
+                '                     <textarea id="text" style="width: 460px; height: 138px;"></textarea>  '+
+                '                            </div>\n' +
+                '                        </div>\n' +
+                '                       </div>' +
+                '                   </div>' +
+                '</div>'
+            , btn: ['关闭', '保存']
+            , btnAlign: 'c' //按钮居中
+            , shade:  0.5 //不显示遮罩
+            ,load:1
+            , yes: function () {
+                layer.closeAll();
+            },
+            btn2:function () {
+                let audit = document.querySelector('input[name="r1"]:checked').value;
+                let text = $("#text").val()
+                if(audit==3){
+                    if(text==''){
+                        Feng.info("请输入拒绝理由")
+                        return false;
+                    }
+                }
+                var ajax = new $ax(Feng.ctxPath + "/tDiscount/auditDiscount", function (data) {
+                    if (data.code == 200) {
+                        Feng.success("操作成功!");
+                        window.location.reload();
+                        window.parent.layer.closeAll();
+                    } else if(data=="repeat"){
+                        window.location.reload();
+                        window.parent.layer.closeAll();
+                        Feng.error("请勿重复操作");
+                    }else {
+                        return  Feng.error(data.msg);
+                    }
+                }, function (data) {
+                    Feng.error("操作失败!")
+                    window.location.reload();
+                    window.parent.layer.closeAll();
+                    return   Feng.error("操作失败!");
+                });
+                ajax.set("id", TCompetition.seItem.id);
+                ajax.set("audit", audit);
+                ajax.set("text", text);
+                ajax.start();
+                layer.closeAll();
+            }
+        });
+
+        this.layerIndex = index;
+    }
+};
+TCompetition.unfreeze = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tCity/unfreeze", function (data) {
+            Feng.success("解冻成功!");
+            TCompetition.table.refresh();
+        }, function (data) {
+            Feng.error("解冻失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("id",this.seItem.id);
+        ajax.start();
+    }
+};
+TCompetition.info = function () {
+    console.log(111)
+    if (this.check()) {
+        let index = layer.open({
+            type: 2,
+            title: '折扣详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tDiscount/infoOne?id=' + this.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+TCompetition.reload = function () {
+    if (this.check()) {
+        let id = this.seItem.id
+        var operation = function(){
+            var ajax = new $ax(Feng.ctxPath + "/tCity/pwd", function (data) {
+                Feng.success("重置成功!");
+                TCompetition.table.refresh();
+            }, function (data) {
+                Feng.error("重置失败!" + data.responseJSON.message + "!");
+            });
+            ajax.set("id",id);
+            ajax.start();
+        }
+        Feng.confirm("确认重置密码?重置后密码为:a123456", operation);
+    }
+
+};
+
+TCompetition.carInsurance = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: language==1?'车辆保险':(language==2?'Vehicle insurance':'Asuransi kendaraan'),
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/TCompetition/carInsurance?carId=' + TCompetition.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+
+
+/**
+ * 查询车辆管理列表
+ */
+TCompetition.search = function () {
+    var queryData = {};
+    queryData['provinceCode'] = $("#pCode").val();
+    queryData['cityCode'] = $("#cCode").val();
+    queryData['name'] = $("#name").val();
+    queryData['shopName'] = $("#shopName").val();
+    queryData['type'] = $("type").val();
+    TCompetition.table.refresh({query: queryData});
+};
+
+TCompetition.resetSearch = function () {
+    $("#pCode").val("");
+    $("#cCode").val("");
+    $("#name").val("");
+    $("#type").val("");
+    $("#shopName").val("");
+    TCompetition.search();
+};
+
+$(function () {
+    var defaultColunms = TCompetition.initColumn();
+    var table = new BSTable(TCompetition.id, "/tDiscount/listAudit", defaultColunms);
+    table.setPaginationType("server");
+    TCompetition.table = table.init();
+});
+
+/**
+ * 下载模板
+ */
+TCompetition.uploadCarModel = function () {
+    window.location.href = Feng.ctxPath + "/TCompetition/uploadCarModel";
+}
+
+var agreement = function(){
+    this.init = function(){
+        //模拟上传excel  
+        $("#uploadEventBtn").unbind("click").bind("click",function(){
+            $("#uploadEventFile").click();
+        });
+    };
+}
+/**
+ * 导入合同
+ */
+TCompetition.exporTCompetition = function () {
+    var uploadEventFile = $("#uploadEventFile").val();
+    if(uploadEventFile == ''){
+        if(language==1){
+            Feng.info("请选择Excel,再上传");
+        }else if(language==2){
+            Feng.info("Please select Excel and upload");
+        }else {
+            Feng.info("Silakan pilih Excel dan upload");
+        }
+    }else if(uploadEventFile.lastIndexOf(".xls")<0){//可判断以.xls和.xlsx结尾的excel  
+        if(language==1){
+            Feng.info("只能上传Excel文件");
+        }else if(language==2){
+            Feng.info("Only Excel files can be uploaded");
+        }else {
+            Feng.info("Hanya berkas Excel yang dapat diunggah");
+        }
+    }else{
+        var url = Feng.ctxPath + '/TCompetition/exporTCompetition';
+        var file = document.querySelector('input[name=file]').files[0];
+        var reader = new FileReader();
+        if (file) {
+            var formData = new FormData();
+            formData.append("myfile", file);
+            this.sendAjaxRequest(url, 'POST', formData);
+        }
+    }
+}
+TCompetition.sendAjaxRequest = function(url,type,data){
+    $.ajax({
+        url : url,
+        type : type,
+        data : data,
+        success : function(result) {
+            if(result.code==500) {
+                Feng.info(result.message);
+            }else {
+                if(language==1){
+                    Feng.success("导入成功!");
+                }else if(language==2){
+                    Feng.success("SUCCESSFUL IMPORT!");
+                }else {
+                    Feng.success("Import berhasil!");
+                }
+            }
+            TCompetition.table.refresh();
+        },
+        error : function() {
+            if(language==1){
+                Feng.error("excel上传失败!");
+            }else if(language==2){
+                Feng.error("Uploading excel Fails. Procedure!");
+            }else {
+                Feng.error("Gagal mengunggah excel!");
+            }
+        },
+        cache : false,
+        contentType : false,
+        processData : false
+    });
+};
+
+var agreement;
+$(function(){
+    agreement = new agreement();
+    agreement.init();
+});
+
+/**
+ * 导出车辆操作
+ */
+TCompetition.ouTCompetition = function () {
+    var operation = function() {
+        window.location.href = Feng.ctxPath + "/TCompetition/ouTCompetition";
+    };
+    if(language==1){
+        Feng.confirm("是否确认导出车辆信息?", operation);
+    }else if(language==2){
+        Feng.confirm("Are you sure to export vehicle information?", operation);
+    }else {
+        Feng.confirm("Apakah Anda pasti akan mengekspor informasi kendaraan?", operation);
+    }
+}
\ No newline at end of file
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tDiscountAudit/tDiscount_info.js b/cloud-server-management/src/main/webapp/static/modular/system/tDiscountAudit/tDiscount_info.js
new file mode 100644
index 0000000..8360403
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tDiscountAudit/tDiscount_info.js
@@ -0,0 +1,320 @@
+/**
+ * 初始化车辆管理详情对话框
+ */
+var language=1;
+var TCarInfoDlg = {
+    tCarInfoData : {},
+    validateFields: {
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TCarInfoDlg.validate = function () {
+    $('#carInfoForm').data("bootstrapValidator").resetForm();
+    $('#carInfoForm').bootstrapValidator('validate');
+    return $("#carInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TCarInfoDlg.clearData = function() {
+    this.tCarInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCarInfoDlg.set = function(key, val) {
+    this.tCarInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCarInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TCarInfoDlg.close = function() {
+    parent.layer.close(window.parent.TCompetition.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TCarInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('isPlatCar')
+    .set('companyId')
+    .set('franchiseeId')
+    .set('carColor')
+    .set('carModelId')
+    .set('carBrandId')
+    .set('carLicensePlate')
+    .set('carPhoto')
+    .set('drivingLicenseNumber')
+    .set('drivingLicensePhoto')
+    .set('annualInspectionTime')
+    .set('commercialInsuranceTime')
+    .set('createTime')
+    .set('state')
+    .set('addType')
+    .set('addObjectId')
+    .set('plateColor')
+    .set('vehicleType')
+    .set('ownerName')
+    .set('engineId')
+    .set('VIN')
+    .set('certifyDateA')
+    .set('fuelType')
+    .set('engineDisplace')
+    .set('certificate')
+    .set('transAgency')
+    .set('transArea')
+    .set('transDateStart')
+    .set('transDateStop')
+    .set('certifyDateB')
+    .set('fixState')
+    .set('nextFixDate')
+    .set('checkState')
+    .set('feePrintId')
+    .set('GPSBrand')
+    .set('GPSModel')
+    .set('GPSIMEI')
+    .set('GPSInstallDate')
+    .set('registerDate')
+    .set('commercialType');
+}
+
+/**
+ * 提交添加
+ */
+TCarInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        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!");
+            }
+            window.parent.TCompetition.table.refresh();
+            TCarInfoDlg.close();
+        }else{
+            Feng.error(data.msg);
+        }
+
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tCarInfoData);
+    ajax.set("provinceCode",pCode);
+    ajax.set("cityCode",cCode);
+    ajax.set("name",name);
+    ajax.set("phone",phone);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TCarInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        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/update", function(data){
+        if(data=="5001"){
+            Feng.error("改账号已经存在");
+        }else
+        if(data.code == 200){
+            if(language==1){
+                Feng.success("修改成功!");
+            }else if(language==2){
+                Feng.success("Modify successfully!");
+            }else {
+                Feng.success("Mengubah dengan sukses!");
+            }
+            window.parent.TCompetition.table.refresh();
+            TCarInfoDlg.close();
+        }else{
+            Feng.error(data.msg);
+        }
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("provinceCode",pCode);
+    ajax.set("cityCode",cCode);
+    ajax.set("name",name);
+    ajax.set("phone",phone);
+    ajax.set("id",$("#id").val());
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("carInfoForm", TCarInfoDlg.validateFields);
+    // 初始化图片上传
+    var carPhoto = new $WebUpload("carPhoto");
+    carPhoto.setUploadBarId("progressBar");
+    carPhoto.init();
+    var drivingLicensePhoto = new $WebUpload("drivingLicensePhoto");
+    drivingLicensePhoto.setUploadBarId("progressBar");
+    drivingLicensePhoto.init();
+});
+
+/**
+ * 选择分公司后执行
+ */
+TCarInfoDlg.oneChange = function (e) {
+    var oneId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCity/onChange", function(data){
+        if(data!=null){
+            if(language==1){
+                var content='<option value="">选择市</option>';
+            }else if(language==2){
+                var content='<option value="">Choose your franchisee</option>';
+            }else {
+                var content='<option value="">Pilih franchisee Anda</option>';
+            }
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.code+"'>"+v.name+"</option>";
+            });
+            $("#cCode").empty().append(content);
+        }
+    });
+    ajax.set("oneId",oneId);
+    ajax.start();
+}
+
+/**
+ * 类型改变执行
+ * @param e
+ */
+TCarInfoDlg.companyTypeClick = function (e) {
+    if (1 == e){
+        $(".companyDiv").hide();
+    } else if (2 == e){
+        $(".companyDiv").show();
+    }
+}
+
+/**
+ * 车辆品牌改变时执行
+ */
+TCarInfoDlg.brandChange = function (e) {
+    var carBrandId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCar/brandChange", function(data){
+        if(data!=null){
+            if(language==1){
+                var content='<option value="">选择车辆类型</option>';
+            }else if(language==2){
+                var content='<option value="">Please select the vehicle type</option>';
+            }else {
+                var content='<option value="">Pilih Jenis Kendaraan</option>';
+            }
+
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#carModelId").empty().append(content);
+        }
+    });
+    ajax.set("carBrandId",carBrandId);
+    ajax.start();
+}
+
+/**
+ * 专车服务被点击
+ */
+TCarInfoDlg.zcServerClick = function () {
+    var serverBox1 = $('#serverBox1').prop('checked');
+    if (serverBox1){
+        $("#zcModelDiv").show();
+    } else {
+        $("#zcModelDiv").hide();
+    }
+}
+
+/**
+ * 跨城服务被点击
+ */
+TCarInfoDlg.kcServerClick = function () {
+    var serverBox3 = $('#serverBox3').prop('checked');
+    if (serverBox3){
+        $("#kcModelDiv").show();
+    } else {
+        $("#kcModelDiv").hide();
+    }
+}
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/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..8e79b8b 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,129 +230,418 @@
 /**
  * 提交添加
  */
-TCarInfoDlg.addSubmit = function() {
+TGoodsInfoDlg.addSubmit = function() {
 
     this.clearData();
     this.collectData();
     if(!this.validate()){
         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.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 +649,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 +679,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 +755,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 +780,7 @@
 /**
  * 专车服务被点击
  */
-TCarInfoDlg.zcServerClick = function () {
+TGoodsInfoDlg.zcServerClick = function () {
     var serverBox1 = $('#serverBox1').prop('checked');
     if (serverBox1){
         $("#zcModelDiv").show();
@@ -438,7 +792,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