Bläddra i källkod

Merge remote-tracking branch 'company/master'

dongdong.xiang 1 månad sedan
förälder
incheckning
e8f8f8f231
65 ändrade filer med 1490 tillägg och 379 borttagningar
  1. 1 1
      .gitignore
  2. 1 0
      fs-admin/src/main/java/com/fs/core/config/SecurityConfig.java
  3. 15 0
      fs-admin/src/main/java/com/fs/course/controller/FsUserCoursePeriodController.java
  4. 14 0
      fs-admin/src/main/java/com/fs/store/controller/FsExpressController.java
  5. 29 0
      fs-admin/src/main/java/com/fs/task/period/PeriodTask.java
  6. 1 1
      fs-common/pom.xml
  7. 55 3
      fs-common/src/main/java/com/fs/common/config/FSSysConfig.java
  8. 1 1
      fs-common/src/main/java/com/fs/common/utils/TimeUtils.java
  9. 10 1
      fs-common/src/main/java/com/fs/common/utils/date/DateUtil.java
  10. 1 1
      fs-company-app/src/main/java/com/fs/app/controller/WxCompanyUserController.java
  11. 1 1
      fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java
  12. 5 5
      fs-service-system/pom.xml
  13. 4 0
      fs-service-system/src/main/java/com/fs/course/domain/FsCourseLink.java
  14. 4 0
      fs-service-system/src/main/java/com/fs/course/domain/FsCourseRealLink.java
  15. 13 0
      fs-service-system/src/main/java/com/fs/course/domain/FsUserCoursePeriod.java
  16. 12 1
      fs-service-system/src/main/java/com/fs/course/domain/FsUserCoursePeriodDays.java
  17. 12 0
      fs-service-system/src/main/java/com/fs/course/mapper/FsUserCoursePeriodDaysMapper.java
  18. 16 0
      fs-service-system/src/main/java/com/fs/course/mapper/FsUserCoursePeriodMapper.java
  19. 3 0
      fs-service-system/src/main/java/com/fs/course/param/FsCourseLinkCreateParam.java
  20. 3 0
      fs-service-system/src/main/java/com/fs/course/param/newfs/FsCourseSortLinkParam.java
  21. 7 0
      fs-service-system/src/main/java/com/fs/course/param/newfs/FsUserCourseVideoLinkParam.java
  22. 8 0
      fs-service-system/src/main/java/com/fs/course/service/IFsUserCoursePeriodDaysService.java
  23. 13 1
      fs-service-system/src/main/java/com/fs/course/service/IFsUserCoursePeriodService.java
  24. 7 6
      fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseQuestionBankServiceImpl.java
  25. 53 9
      fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java
  26. 71 6
      fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodServiceImpl.java
  27. 42 0
      fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  28. 19 0
      fs-service-system/src/main/java/com/fs/course/vo/UpdateCourseTimeVo.java
  29. 8 1
      fs-service-system/src/main/java/com/fs/course/vo/newfs/FsUserCourseVideoLinkDetailsVO.java
  30. 3 0
      fs-service-system/src/main/java/com/fs/course/vo/newfs/FsUserCourseVideoPageListVO.java
  31. 29 0
      fs-service-system/src/main/java/com/fs/kingbos/domian/KbStockRequest.java
  32. 48 0
      fs-service-system/src/main/java/com/fs/kingbos/domian/KbStockResponse.java
  33. 33 0
      fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosOrderD1Data.java
  34. 71 0
      fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosOrderData.java
  35. 12 0
      fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosOrderRequest.java
  36. 10 0
      fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosOrderResponse.java
  37. 20 0
      fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosRefundOrderD1Data.java
  38. 25 0
      fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosRefundOrderData.java
  39. 12 0
      fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosRefundOrderRequest.java
  40. 47 0
      fs-service-system/src/main/java/com/fs/kingbos/enums/OrderStatusEnum.java
  41. 15 0
      fs-service-system/src/main/java/com/fs/kingbos/service/K9OrderService.java
  42. 19 0
      fs-service-system/src/main/java/com/fs/kingbos/service/K9StockService.java
  43. 248 0
      fs-service-system/src/main/java/com/fs/kingbos/service/impl/K9OrderServiceImpl.java
  44. 49 0
      fs-service-system/src/main/java/com/fs/kingbos/service/impl/K9StockServiceImpl.java
  45. 12 0
      fs-service-system/src/main/java/com/fs/kingbos/util/SignUtil.java
  46. 26 0
      fs-service-system/src/main/java/com/fs/kingbos/util/UrlUtil.java
  47. 9 2
      fs-service-system/src/main/java/com/fs/qw/service/impl/QwWatchLogServiceImpl.java
  48. 3 1
      fs-service-system/src/main/java/com/fs/sop/service/impl/CompanySopRoleServiceImpl.java
  49. 43 0
      fs-service-system/src/main/java/com/fs/store/dto/ExpressResultDTO.java
  50. 10 1
      fs-service-system/src/main/java/com/fs/store/service/IFsStoreOrderService.java
  51. 3 3
      fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreAfterSalesServiceImpl.java
  52. 29 31
      fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreCartServiceImpl.java
  53. 29 44
      fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java
  54. 7 0
      fs-service-system/src/main/resources/application-config.yml
  55. 3 0
      fs-service-system/src/main/resources/mapper/course/FsCourseAnswerLogsMapper.xml
  56. 3 0
      fs-service-system/src/main/resources/mapper/course/FsCourseRedPacketLogMapper.xml
  57. 3 0
      fs-service-system/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
  58. 16 2
      fs-service-system/src/main/resources/mapper/course/FsUserCoursePeriodDaysMapper.xml
  59. 9 0
      fs-service-system/src/main/resources/mapper/course/FsUserCoursePeriodMapper.xml
  60. 1 1
      fs-service-system/src/main/resources/mapper/course/FsUserCourseTrainingCampMapper.xml
  61. 2 1
      fs-service-system/src/main/resources/mapper/course/FsUserCourseVideoMapper.xml
  62. 3 93
      fs-user-app/src/main/java/com/fs/app/controller/PayController.java
  63. 25 59
      fs-user-app/src/main/java/com/fs/app/controller/StoreOrderController.java
  64. 183 102
      fs-user-app/src/main/java/com/fs/app/controller/WxUserController.java
  65. 1 1
      fs-user-app/src/main/resources/application.yml

+ 1 - 1
.gitignore

@@ -6,7 +6,7 @@ target/
 !**/src/main/**/target/
 !**/src/test/**/target/
 #*.yml
-logback.xml
+#logback.xml
 
 ### STS ###
 .apt_generated

+ 1 - 0
fs-admin/src/main/java/com/fs/core/config/SecurityConfig.java

@@ -114,6 +114,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
 //                .antMatchers("/hwcloud/upload/progress").anonymous()
                 .antMatchers("/common/uploadHuaWeiObs").anonymous()
 //                .antMatchers("/hwcloud/upload/videoUrl").anonymous()
+                .antMatchers("/store/express/expressNotify").anonymous()
                 .antMatchers("/common/uploadWang").anonymous()
                 .antMatchers("/common/upload").anonymous()
                 .antMatchers("/profile/**").anonymous()

+ 15 - 0
fs-admin/src/main/java/com/fs/course/controller/FsUserCoursePeriodController.java

@@ -19,6 +19,7 @@ import com.fs.course.service.IFsUserCourseVideoRedPackageService;
 import com.fs.course.vo.FsPeriodCountVO;
 import com.fs.course.vo.FsUserCoursePeriodVO;
 import com.fs.course.vo.PeriodRedPacketVO;
+import com.fs.course.vo.UpdateCourseTimeVo;
 import com.fs.his.vo.OptionsVO;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
@@ -142,6 +143,14 @@ public class FsUserCoursePeriodController extends BaseController {
     public R addCourse(@RequestBody FsUserCoursePeriodDays entity){
         return fsUserCoursePeriodDaysService.addCourse(entity);
     }
+    @PostMapping("/updateCourseTime")
+    public R updateCourseTime(@RequestBody UpdateCourseTimeVo vo){
+        return fsUserCoursePeriodDaysService.updateCourseTime(vo);
+    }
+    @PostMapping("/updateCourseDate")
+    public R updateCourseDate(@RequestBody UpdateCourseTimeVo vo){
+        return fsUserCoursePeriodDaysService.updateCourseDate(vo);
+    }
     @PostMapping("/updateListCourseData")
     public R updateListCourseData(@RequestBody List<FsUserCoursePeriodDays> entity){
         return fsUserCoursePeriodDaysService.updateListCourseData(entity);
@@ -217,5 +226,11 @@ public class FsUserCoursePeriodController extends BaseController {
         return fsUserCoursePeriodDaysService.periodCourseMove(id, targetId);
     }
 
+    @ApiOperation("结束营期")
+    @PostMapping("/closePeriod")
+    public R closePeriod(Long id) {
+        fsUserCoursePeriodService.closePeriod(id);
+        return R.ok();
+    }
 
 }

+ 14 - 0
fs-admin/src/main/java/com/fs/store/controller/FsExpressController.java

@@ -5,6 +5,10 @@ import java.util.List;
 import com.fs.common.core.domain.R;
 import com.fs.company.domain.Company;
 import com.fs.company.service.ICompanyService;
+import com.fs.store.dto.ExpressNotifyDTO;
+import com.fs.store.dto.ExpressResultDTO;
+import com.fs.store.service.IFsStoreOrderService;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -40,6 +44,9 @@ public class FsExpressController extends BaseController
     @Autowired
     private ICompanyService companyService;
 
+    @Autowired
+    private IFsStoreOrderService orderService;
+
     /**
      * 查询快递公司列表
      */
@@ -131,4 +138,11 @@ public class FsExpressController extends BaseController
         List<Long> list = companyService.selectCompanyByOmsCode(omsCode);
         return R.ok().put("data2",list);
     }
+
+    @ApiOperation("物流信息回调")
+    @PostMapping(path = "/expressNotify" )
+    public ExpressResultDTO expressNotify(ExpressNotifyDTO notifyDTO) throws Exception
+    {
+        return orderService.updateDeliveryItem(notifyDTO);
+    }
 }

+ 29 - 0
fs-admin/src/main/java/com/fs/task/period/PeriodTask.java

@@ -0,0 +1,29 @@
+package com.fs.task.period;
+
+import com.fs.course.service.IFsUserCoursePeriodDaysService;
+import com.fs.course.service.IFsUserCoursePeriodService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component("periodTask")
+public class PeriodTask {
+
+    @Autowired
+    private IFsUserCoursePeriodService userCoursePeriodService;
+    @Autowired
+    private IFsUserCoursePeriodDaysService userCoursePeriodDaysService;
+
+    /**
+     * 更新营期状态
+     */
+    public void refreshPeriod() {
+        userCoursePeriodService.changePeriodStatus();
+    }
+
+    /**
+     * 更新营期课程状态
+     */
+    public void refreshPeriodDays() {
+        userCoursePeriodDaysService.changePeriodCourseStatus();
+    }
+}

+ 1 - 1
fs-common/pom.xml

@@ -117,7 +117,7 @@
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
-            <version>5.3.3</version>
+            <version>5.8.22</version> <!-- 强制指定最新版本 -->
         </dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>

+ 55 - 3
fs-common/src/main/java/com/fs/common/config/FSSysConfig.java

@@ -1,14 +1,12 @@
 package com.fs.common.config;
 
 
-import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
 
 /**
  * 读取项目相关配置
  *
-
  */
 @Component
 @ConfigurationProperties(prefix = "fs-config")
@@ -43,7 +41,13 @@ public class FSSysConfig
     String payGateWayUrl;
     String payNotifyUrl;
     String refundNotifyUrl;
-
+    //金博erp
+    private String kingbosan;//账套名称
+    private String kingbosSecret;//金博密钥
+    private String kingbosUrl;//金博地址
+    private String corgid;//机构编码
+    private String cwarehouseCode;
+    private String cwarehouseName;
 
     public String getKdnId() {
         return kdnId;
@@ -236,4 +240,52 @@ public class FSSysConfig
     public void setRefundNotifyUrl(String refundNotifyUrl) {
         this.refundNotifyUrl = refundNotifyUrl;
     }
+
+    public String getKingbosan() {
+        return kingbosan;
+    }
+
+    public void setKingbosan(String kingbosan) {
+        this.kingbosan = kingbosan;
+    }
+
+    public String getCorgid() {
+        return corgid;
+    }
+
+    public void setCorgid(String corgid) {
+        this.corgid = corgid;
+    }
+
+    public String getKingbosUrl() {
+        return kingbosUrl;
+    }
+
+    public void setKingbosUrl(String kingbosUrl) {
+        this.kingbosUrl = kingbosUrl;
+    }
+
+    public String getKingbosSecret() {
+        return kingbosSecret;
+    }
+
+    public void setKingbosSecret(String kingbosSecret) {
+        this.kingbosSecret = kingbosSecret;
+    }
+
+    public String getCwarehouseCode() {
+        return cwarehouseCode;
+    }
+
+    public void setCwarehouseCode(String cwarehouseCode) {
+        this.cwarehouseCode = cwarehouseCode;
+    }
+
+    public String getCwarehouseName() {
+        return cwarehouseName;
+    }
+
+    public void setCwarehouseName(String cwarehouseName) {
+        this.cwarehouseName = cwarehouseName;
+    }
 }

+ 1 - 1
fs-common/src/main/java/com/fs/common/utils/TimeUtils.java

@@ -230,7 +230,7 @@ public class TimeUtils
         }
 
         public Map<String, Object> toMap() {
-            return BeanUtil.beanToMap(this);
+            return BeanUtil.beanToMap(this, false, true);
         }
 
         public String getSqlDateFormat() {

+ 10 - 1
fs-common/src/main/java/com/fs/common/utils/date/DateUtil.java

@@ -493,5 +493,14 @@ public final class DateUtil {
 		return itemEdate;
 	}
 
-
+	public static boolean isWithinRangeSafe(LocalDate targetDate, LocalDate startDate, LocalDate endDate) {
+		LocalDate actualStart = startDate.isBefore(endDate) ? startDate : endDate;
+		LocalDate actualEnd = startDate.isBefore(endDate) ? endDate : startDate;
+		return !targetDate.isBefore(actualStart) && !targetDate.isAfter(actualEnd);
+	}
+	public static boolean isWithinRangeSafe(LocalDateTime targetDate, LocalDateTime startDate, LocalDateTime endDate) {
+		LocalDateTime actualStart = startDate.isBefore(endDate) ? startDate : endDate;
+		LocalDateTime actualEnd = startDate.isBefore(endDate) ? endDate : startDate;
+		return !targetDate.isBefore(actualStart) && !targetDate.isAfter(actualEnd);
+	}
 }

+ 1 - 1
fs-company-app/src/main/java/com/fs/app/controller/WxCompanyUserController.java

@@ -36,7 +36,7 @@ import org.springframework.web.bind.annotation.*;
 import java.util.Date;
 import java.util.Objects;
 
-@Api("微信小程序相关接口")
+@Api("微信小程序相关接口(暂废弃,后面再删除)")
 @RestController
 @RequestMapping(value = "/app/wx/miniapp")
 @Slf4j

+ 1 - 1
fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java

@@ -676,7 +676,7 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
                 groupChat.getChatUserList().forEach(user -> {
                     ruleTimeVO.setSendType(2);
                     ruleTimeVO.setRemark("客户群催课");
-                    QwSopLogs sopLogs = createBaseLog(formattedSendTime, logVo, ruleTimeVO, user.getId().toString(), user.getName(), null);
+                    QwSopLogs sopLogs = createBaseLog(formattedSendTime, logVo, ruleTimeVO, user.getUserId(), user.getName(), null);
                     handleLogBasedOnType(sopLogs, content, logVo, sendTime, courseId, videoId,
                             type, qwUserId, companyUserId, companyId, user.getId().toString(), welcomeText, qwUserName, null, false);
                 });

+ 5 - 5
fs-service-system/pom.xml

@@ -40,11 +40,11 @@
             <version>1.5.21</version>
         </dependency>
 
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-all</artifactId>
-            <version>5.3.7</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>cn.hutool</groupId>-->
+<!--            <artifactId>hutool-all</artifactId>-->
+<!--            <version>5.3.7</version>-->
+<!--        </dependency>-->
         <!-- oss -->
         <dependency>
             <groupId>com.qiniu</groupId>

+ 4 - 0
fs-service-system/src/main/java/com/fs/course/domain/FsCourseLink.java

@@ -2,6 +2,7 @@ package com.fs.course.domain;
 
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -62,4 +63,7 @@ public class FsCourseLink extends BaseEntity
     @Excel(name = "营期id")
     private Long periodId;
 
+    @ApiModelProperty(value = "营期课程id")
+    private Long id;
+
 }

+ 4 - 0
fs-service-system/src/main/java/com/fs/course/domain/FsCourseRealLink.java

@@ -1,5 +1,6 @@
 package com.fs.course.domain;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -38,4 +39,7 @@ public class FsCourseRealLink implements Serializable
 
     private Long periodId;
 
+    @ApiModelProperty(value = "营期课程id")
+    private Long id;
+
 }

+ 13 - 0
fs-service-system/src/main/java/com/fs/course/domain/FsUserCoursePeriod.java

@@ -2,6 +2,7 @@ package com.fs.course.domain;
 
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.Date;
 import java.util.List;
 
@@ -82,6 +83,18 @@ public class FsUserCoursePeriod
     @Excel(name = "营期状态,1-未开始,2-进行中,3-已结束")
     private Long periodStatus;
 
+    @JsonFormat(pattern = "HH:mm:ss")
+    @Excel(name = "开始看课时间")
+    private LocalTime viewStartTime;
+
+    @JsonFormat(pattern = "HH:mm:ss")
+    @Excel(name = "结束看课时间")
+    private LocalTime viewEndTime;
+
+    @JsonFormat(pattern = "HH:mm:ss")
+    @Excel(name = "领取红包结束时间")
+    private LocalTime lastJoinTime;
+
     @TableField(exist = false)
     private List<Long> companyIdList;
 }

+ 12 - 1
fs-service-system/src/main/java/com/fs/course/domain/FsUserCoursePeriodDays.java

@@ -3,6 +3,7 @@ package com.fs.course.domain;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.Date;
 import java.util.List;
 
@@ -47,11 +48,15 @@ public class FsUserCoursePeriodDays extends BaseEntityTow {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime startDateTime;
-
     /** 结束时间 */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime endDateTime;
+    /** 领取红包时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "领取红包时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime lastJoinTime;
+
 
     /** 课程ID */
     @Excel(name = "课程ID")
@@ -75,4 +80,10 @@ public class FsUserCoursePeriodDays extends BaseEntityTow {
     private String courseName;
     @TableField(exist = false)
     private String videoName;
+    @TableField(exist = false)
+    private LocalTime startTime;
+    @TableField(exist = false)
+    private LocalTime endTime1;
+    @TableField(exist = false)
+    private LocalTime joinTime;
 }

+ 12 - 0
fs-service-system/src/main/java/com/fs/course/mapper/FsUserCoursePeriodDaysMapper.java

@@ -5,6 +5,7 @@ import com.fs.course.domain.FsUserCoursePeriodDays;
 import com.fs.his.vo.OptionsVO;
 import org.apache.ibatis.annotations.Param;
 
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -83,4 +84,15 @@ public interface FsUserCoursePeriodDaysMapper extends BaseMapper<FsUserCoursePer
      */
     void batchUpdateCoursePeriodDays(List<FsUserCoursePeriodDays> fsUserCoursePeriodDaysList);
 
+    /**
+     * 开启课程
+     * @param now  时间
+     */
+    void startPeriodCourse(@Param("now") LocalDateTime now);
+
+    /**
+     * 关闭课程
+     * @param now  时间
+     */
+    void endPeriodCourse(@Param("now") LocalDateTime now);
 }

+ 16 - 0
fs-service-system/src/main/java/com/fs/course/mapper/FsUserCoursePeriodMapper.java

@@ -6,7 +6,9 @@ import com.fs.course.vo.FsUserCoursePeriodVO;
 import com.fs.course.vo.PeriodRedPacketVO;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
 
+import java.time.LocalDate;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -111,4 +113,18 @@ public interface FsUserCoursePeriodMapper
      * @return  count
      */
     int countPeriodByCampIds(@Param("params") Map<String, Object> params);
+
+    /**
+     * 开营
+     * @param now   当前日期
+     */
+    @Update("update fs_user_course_period set period_status = 2, update_time = now() where period_status = 1 and period_starting_time >= #{now}")
+    void startPeriod(@Param("now") LocalDate now);
+
+    /**
+     * 关营
+     * @param now   当前日期
+     */
+    @Update("update fs_user_course_period set period_status = 3, update_time = now() where period_status = 2 and period_end_time < #{now}")
+    void endPeriod(@Param("now") LocalDate now);
 }

+ 3 - 0
fs-service-system/src/main/java/com/fs/course/param/FsCourseLinkCreateParam.java

@@ -34,4 +34,7 @@ public class FsCourseLinkCreateParam {
 
     private Long periodId;
 
+    @ApiModelProperty(value = "营期课程id")
+    private Long id;
+
 }

+ 3 - 0
fs-service-system/src/main/java/com/fs/course/param/newfs/FsCourseSortLinkParam.java

@@ -35,4 +35,7 @@ public class FsCourseSortLinkParam {
     @ApiModelProperty(value = "营期id")
     private Long periodId;
 
+    @ApiModelProperty(value = "营期课程id")
+    private Long id;
+
 }

+ 7 - 0
fs-service-system/src/main/java/com/fs/course/param/newfs/FsUserCourseVideoLinkParam.java

@@ -24,4 +24,11 @@ public class FsUserCourseVideoLinkParam implements Serializable {
     @NotNull(message = "销售id不能为空")
     @ApiModelProperty(value = "销售id")
     private Long companyUserId;
+
+    @ApiModelProperty(value = "营期课程ID")
+    private Long id;
+
+    @ApiModelProperty(value = "营期id")
+    private Long periodId;
+
 }

+ 8 - 0
fs-service-system/src/main/java/com/fs/course/service/IFsUserCoursePeriodDaysService.java

@@ -7,6 +7,7 @@ import com.fs.course.param.CompanyRedPacketParam;
 import com.fs.course.param.PeriodCountParam;
 import com.fs.course.vo.FsPeriodCountVO;
 import com.fs.course.vo.PeriodRedPacketVO;
+import com.fs.course.vo.UpdateCourseTimeVo;
 import com.fs.his.vo.OptionsVO;
 
 import java.util.List;
@@ -109,4 +110,11 @@ public interface IFsUserCoursePeriodDaysService extends IService<FsUserCoursePer
      */
     R periodCourseMove(Long id, Long targetId);
 
+    R updateCourseTime(UpdateCourseTimeVo vo);
+
+    R updateCourseDate(UpdateCourseTimeVo vo);
+    /**
+     * 更新营期课程状态
+     */
+    void changePeriodCourseStatus();
 }

+ 13 - 1
fs-service-system/src/main/java/com/fs/course/service/IFsUserCoursePeriodService.java

@@ -1,9 +1,10 @@
 package com.fs.course.service;
 
-import java.util.List;
 import com.fs.course.domain.FsUserCoursePeriod;
 import com.fs.course.vo.FsUserCoursePeriodVO;
 
+import java.util.List;
+
 /**
  * 会员营期Service接口
  *
@@ -66,4 +67,15 @@ public interface IFsUserCoursePeriodService
      * @return vo
      */
     List<FsUserCoursePeriodVO> selectFsUserCoursePeriodPage(FsUserCoursePeriod fsUserCoursePeriod);
+
+    /**
+     * 结束营期
+     * @param id    营期ID
+     */
+    void closePeriod(Long id);
+
+    /**
+     * 更新营期状态
+     */
+    void changePeriodStatus();
 }

+ 7 - 6
fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseQuestionBankServiceImpl.java

@@ -148,7 +148,8 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer
         //日志id
         Long logId = null;
 
-        FsCourseAnswerLogs rightLog = new FsCourseAnswerLogs();
+        new FsCourseAnswerLogs();
+        FsCourseAnswerLogs rightLog;
         //判断短链类型
         if (param.getLinkType()!=null&&param.getLinkType()==1){
             rightLog = courseAnswerLogsMapper.selectRightLogByCourseVideo(param.getVideoId(), param.getUserId(),null);
@@ -174,11 +175,11 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer
 
             rightLog = courseAnswerLogsMapper.selectRightLogByCourseVideo(param.getVideoId(), param.getUserId(), param.getQwUserId());
             if (rightLog != null) {
-                if (log.getRewardType() != null) {
-                    return R.error("该课程已答题完成,不可重复答题");
-                } else {
-                    return R.ok("答题成功");
-                }
+//                if (log.getRewardType() != null) {
+//                    return R.error("该课程已答题完成,不可重复答题");
+//                } else {
+//                }
+                return R.error("该课程已答题完成,不可重复答题");
             }
             errorCount = courseAnswerLogsMapper.selectErrorCountByCourseVideo(param.getVideoId(), param.getUserId(),param.getQwUserId());
         }

+ 53 - 9
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java

@@ -1,14 +1,5 @@
 package com.fs.course.service.impl;
 
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.sql.Wrapper;
-import java.time.LocalDate;
-import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.core.domain.R;
@@ -24,6 +15,7 @@ import com.fs.course.param.PeriodCountParam;
 import com.fs.course.service.IFsUserCoursePeriodDaysService;
 import com.fs.course.vo.FsPeriodCountVO;
 import com.fs.course.vo.PeriodRedPacketVO;
+import com.fs.course.vo.UpdateCourseTimeVo;
 import com.fs.course.vo.newfs.FsCourseAnalysisCountVO;
 import com.fs.his.vo.OptionsVO;
 import com.fs.store.mapper.FsUserMapper;
@@ -32,9 +24,13 @@ import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -153,8 +149,18 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
             day.setLesson(dayList.size() + i.getAndIncrement());
             day.setDayDate(period.getPeriodStartingTime().plusDays(day.getLesson()));
             day.setCourseId(entity.getCourseId());
+            day.setStartDateTime(LocalDateTime.of(day.getDayDate(), entity.getStartTime()));
+            day.setEndDateTime(LocalDateTime.of(day.getDayDate(), entity.getEndTime1()));
+            day.setLastJoinTime(LocalDateTime.of(day.getDayDate(), entity.getJoinTime()));
             day.setVideoId(e);
             day.setCreateTime(new Date());
+            // 默认开启今天及以后的两天
+            LocalDate compareDay = LocalDate.now().plusDays(1);
+            if(day.getDayDate().isBefore(compareDay)){
+                day.setStatus(1);
+            } else {
+                day.setStatus(0);
+            }
             return day;
         }).collect(Collectors.toList());
         super.saveBatch(collect);
@@ -264,6 +270,44 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
         return R.ok();
     }
 
+    @Override
+    public R updateCourseTime(UpdateCourseTimeVo vo) {
+        List<FsUserCoursePeriodDays> list = fsUserCoursePeriodDaysMapper.selectBatchIds(vo.getIds());
+        list.forEach(day -> {
+            day.setStartDateTime(LocalDateTime.of(day.getDayDate(), vo.getStartTime()));
+            day.setEndDateTime(LocalDateTime.of(day.getDayDate(), vo.getEndTime1()));
+            day.setLastJoinTime(LocalDateTime.of(day.getDayDate(), vo.getJoinTime()));
+            fsUserCoursePeriodDaysMapper.updateById(day);
+        });
+        return R.ok();
+    }
+
+    @Override
+    public R updateCourseDate(UpdateCourseTimeVo vo) {
+        FsUserCoursePeriodDays day = getById(vo.getId());
+        FsUserCoursePeriod period = fsUserCoursePeriodMapper.selectFsUserCoursePeriodById(day.getPeriodId());
+        if(!DateUtil.isWithinRangeSafe(vo.getDayDate(), period.getPeriodStartingTime(), period.getPeriodEndTime())) return R.error("时间不在营期范围内");
+        day.setDayDate(vo.getDayDate());
+        day.setStartDateTime(LocalDateTime.of(day.getDayDate(), day.getStartDateTime().toLocalTime()));
+        day.setEndDateTime(LocalDateTime.of(day.getDayDate(), day.getEndDateTime().toLocalTime()));
+        day.setLastJoinTime(LocalDateTime.of(day.getDayDate(), day.getLastJoinTime().toLocalTime()));
+        updateById(day);
+        return R.ok();
+    }
+
+    /**
+     * 更新营期课程状态
+     */
+    @Transactional(rollbackFor = RuntimeException.class)
+    @Override
+    public void changePeriodCourseStatus() {
+        // 开启
+        fsUserCoursePeriodDaysMapper.startPeriodCourse(LocalDateTime.now());
+
+        // 关闭
+        fsUserCoursePeriodDaysMapper.endPeriodCourse(LocalDateTime.now());
+    }
+
     private static FsCourseAnalysisCountVO getCourseAnalysisCountVO(FsUserCoursePeriodDays v, Map<Long, FsCourseAnalysisCountVO> courseMap, Map<Long, FsCourseAnalysisCountVO> redPacketMap, Map<Long, FsCourseAnalysisCountVO> answerMap) {
         FsCourseAnalysisCountVO countVO = new FsCourseAnalysisCountVO();
         FsCourseAnalysisCountVO courseVO = courseMap.getOrDefault(v.getVideoId(), countVO);

+ 71 - 6
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodServiceImpl.java

@@ -1,14 +1,23 @@
 package com.fs.course.service.impl;
 
-import java.time.LocalDateTime;
-import java.util.List;
-import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fs.common.exception.ServiceException;
+import com.fs.course.domain.FsUserCoursePeriod;
+import com.fs.course.domain.FsUserCoursePeriodDays;
+import com.fs.course.mapper.FsUserCoursePeriodDaysMapper;
+import com.fs.course.mapper.FsUserCoursePeriodMapper;
+import com.fs.course.service.IFsUserCoursePeriodService;
 import com.fs.course.vo.FsUserCoursePeriodVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.fs.course.mapper.FsUserCoursePeriodMapper;
-import com.fs.course.domain.FsUserCoursePeriod;
-import com.fs.course.service.IFsUserCoursePeriodService;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Objects;
 
 /**
  * 会员营期Service业务层处理
@@ -21,6 +30,8 @@ public class FsUserCoursePeriodServiceImpl implements IFsUserCoursePeriodService
 {
     @Autowired
     private FsUserCoursePeriodMapper fsUserCoursePeriodMapper;
+    @Resource
+    private FsUserCoursePeriodDaysMapper fsUserCoursePeriodDaysMapper;
 
     /**
      * 查询会员营期
@@ -56,6 +67,14 @@ public class FsUserCoursePeriodServiceImpl implements IFsUserCoursePeriodService
     public int insertFsUserCoursePeriod(FsUserCoursePeriod fsUserCoursePeriod)
     {
         fsUserCoursePeriod.setCreateTime(LocalDateTime.now());
+        // 设置营期状态
+        if(LocalDate.now().isBefore(fsUserCoursePeriod.getPeriodStartingTime())){
+            fsUserCoursePeriod.setPeriodStatus(1L);
+        } else if(LocalDate.now().isAfter(fsUserCoursePeriod.getPeriodEndTime())){
+            fsUserCoursePeriod.setPeriodStatus(3L);
+        } else{
+            fsUserCoursePeriod.setPeriodStatus(2L);
+        }
         return fsUserCoursePeriodMapper.insertFsUserCoursePeriod(fsUserCoursePeriod);
     }
 
@@ -100,4 +119,50 @@ public class FsUserCoursePeriodServiceImpl implements IFsUserCoursePeriodService
     public List<FsUserCoursePeriodVO> selectFsUserCoursePeriodPage(FsUserCoursePeriod fsUserCoursePeriod) {
         return fsUserCoursePeriodMapper.selectFsUserCoursePeriodPage(fsUserCoursePeriod);
     }
+
+    /**
+     * 结束营期
+     * @param id    营期ID
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void closePeriod(Long id) {
+        // 修改营期结束时间
+        FsUserCoursePeriod fsUserCoursePeriod = fsUserCoursePeriodMapper.selectFsUserCoursePeriodById(id);
+        if (Objects.isNull(fsUserCoursePeriod)) {
+            throw new ServiceException("结束营期失败:营期不存在");
+        }
+
+        if (fsUserCoursePeriod.getPeriodStatus() == 1) {
+            throw new ServiceException("结束营期失败:营期未开始不能进行结束操作!");
+        }
+
+        if (fsUserCoursePeriod.getPeriodStatus() == 3) {
+            throw new ServiceException("结束营期失败:营期已结束不能进行结束操作!");
+        }
+
+        fsUserCoursePeriod.setPeriodEndTime(LocalDate.now());
+        fsUserCoursePeriodMapper.updateFsUserCoursePeriod(fsUserCoursePeriod);
+
+        // 修改大于当前时间的课程状态
+        Wrapper<FsUserCoursePeriodDays> updateWrapper = Wrappers.<FsUserCoursePeriodDays>lambdaUpdate()
+        .set(FsUserCoursePeriodDays::getStatus, 2)
+        .eq(FsUserCoursePeriodDays::getPeriodId, fsUserCoursePeriod.getPeriodId())
+        .eq(FsUserCoursePeriodDays::getStatus, 0)
+        .gt(FsUserCoursePeriodDays::getDayDate, LocalDate.now());
+        fsUserCoursePeriodDaysMapper.update(null, updateWrapper);
+    }
+
+    /**
+     * 更新营期状态
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void changePeriodStatus() {
+        // 开营
+        fsUserCoursePeriodMapper.startPeriod(LocalDate.now());
+
+        // 关营
+        fsUserCoursePeriodMapper.endPeriod(LocalDate.now());
+    }
 }

+ 42 - 0
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -9,6 +9,7 @@ import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
+import com.fs.common.utils.date.DateUtil;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyUserMapper;
 import com.fs.course.config.CourseConfig;
@@ -57,6 +58,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
@@ -135,6 +137,12 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     @Autowired
     private FsUserCourseMapper fsUserCourseMapper;
 
+    @Autowired
+    private FsUserCoursePeriodMapper fsUserCoursePeriodMapper;
+
+    @Autowired
+    private FsUserCoursePeriodDaysMapper fsUserCoursePeriodDaysMapper;
+
     /**
      * 查询课堂视频
      *
@@ -728,6 +736,20 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
      * @return 处理结果
      */
     private R sendRedPacketReward(FsCourseSendRewardUParam param, FsUser user, FsCourseWatchLog log, FsUserCourseVideo video, CourseConfig config) {
+        // 判断是否属于领取红包时间(会员看课发放红包)
+        FsUserCoursePeriodDays periodDays = new FsUserCoursePeriodDays();
+        periodDays.setVideoId(param.getVideoId());
+        periodDays.setPeriodId(param.getPeriodId());
+        //正常情况是只能查询到一条,之前可能存在重复的脏数据,暂使用查询list的方式
+        List<FsUserCoursePeriodDays> fsUserCoursePeriodDays = fsUserCoursePeriodDaysMapper.selectFsUserCoursePeriodDaysList(periodDays);
+        if(fsUserCoursePeriodDays != null && !fsUserCoursePeriodDays.isEmpty()){
+            periodDays = fsUserCoursePeriodDays.get(0);
+        }
+
+        if(periodDays != null && periodDays.getLastJoinTime() !=null && LocalDateTime.now().isAfter(periodDays.getLastJoinTime())) {
+            return R.error(403,"已超过领取红包时间");
+        }
+
         // 确定红包金额
         BigDecimal amount = BigDecimal.ZERO;
         FsUserCourseVideoRedPackage redPackage = fsUserCourseVideoRedPackageMapper.selectRedPacketByCompanyId(param.getVideoId(), param.getCompanyId(), param.getPeriodId());
@@ -774,6 +796,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             redPacketLog.setCreateTime(new Date());
             redPacketLog.setAmount(amount);
             redPacketLog.setWatchLogId(log.getLogId() != null ? log.getLogId() : null);
+            redPacketLog.setPeriodId(param.getPeriodId());
             redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
 
             // 更新观看记录的奖励类型
@@ -954,6 +977,19 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
     @Override
     public ResponseResult<FsUserCourseVideoLinkDetailsVO> getLinkCourseVideoDetails(FsUserCourseVideoLinkParam param) {
+        //判断营期的课程状态是否是进行中
+        FsUserCoursePeriodDays periodDays = new FsUserCoursePeriodDays();
+        periodDays.setVideoId(param.getVideoId());
+        periodDays.setPeriodId(param.getPeriodId());
+        //正常情况是只能查询到一条,之前可能存在重复的脏数据,暂使用查询list的方式
+        List<FsUserCoursePeriodDays> fsUserCoursePeriodDays = fsUserCoursePeriodDaysMapper.selectFsUserCoursePeriodDaysList(periodDays);
+        if(fsUserCoursePeriodDays != null && !fsUserCoursePeriodDays.isEmpty()){
+            periodDays = fsUserCoursePeriodDays.get(0);
+        }
+        if(periodDays.getStatus() != 1){
+            return ResponseResult.fail(403, "当前课程未开始或已结束,暂不能看课");
+        }
+
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
 
@@ -1002,6 +1038,12 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         }
         vo.setIsFinish(isFinish);
         vo.setPlayDuration(duration);
+        if(param.getId() != null){
+            FsUserCoursePeriodDays days = fsUserCoursePeriodDaysMapper.selectById(param.getId());
+            vo.setStartDateTime(days.getStartDateTime());
+            vo.setEndDateTime(days.getEndDateTime());
+            vo.setRang(DateUtil.isWithinRangeSafe(LocalDateTime.now(), days.getStartDateTime(), days.getEndDateTime()));
+        }
         return ResponseResult.ok(vo);
     }
 

+ 19 - 0
fs-service-system/src/main/java/com/fs/course/vo/UpdateCourseTimeVo.java

@@ -0,0 +1,19 @@
+package com.fs.course.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.List;
+
+@Data
+public class UpdateCourseTimeVo {
+
+    private List<Long> ids;
+    private Long id;
+    private LocalTime startTime;
+    private LocalTime endTime1;
+    private LocalTime joinTime;
+    private LocalDate dayDate;
+}

+ 8 - 1
fs-service-system/src/main/java/com/fs/course/vo/newfs/FsUserCourseVideoLinkDetailsVO.java

@@ -1,10 +1,13 @@
 package com.fs.course.vo.newfs;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.course.config.CourseConfig;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.time.LocalDateTime;
+
 @Data
 @ApiModel
 public class FsUserCourseVideoLinkDetailsVO {
@@ -20,5 +23,9 @@ public class FsUserCourseVideoLinkDetailsVO {
 
     @ApiModelProperty(value = "看课时长")
     private Long playDuration;
-
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime startDateTime;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime endDateTime;
+    private boolean isRang;
 }

+ 3 - 0
fs-service-system/src/main/java/com/fs/course/vo/newfs/FsUserCourseVideoPageListVO.java

@@ -46,5 +46,8 @@ public class FsUserCourseVideoPageListVO extends BaseEntity {
     @ApiModelProperty(value = "营期id")
     private Long periodId;
 
+    @ApiModelProperty(value = "营期课程ID")
+    private Long id;
+
 
 }

+ 29 - 0
fs-service-system/src/main/java/com/fs/kingbos/domian/KbStockRequest.java

@@ -0,0 +1,29 @@
+package com.fs.kingbos.domian;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class KbStockRequest {
+
+    /**
+     * 单据ID
+     */
+    @JSONField(name = "key", ordinal = 1)
+    @Builder.Default
+    private String key = "GoodStock";
+
+    /**
+     * 仓库编码
+     */
+    @JSONField(name = "ckid", ordinal = 2)
+    private String stockCode;
+
+    /**
+     * 商品编码 【注:不传值,默认查询对应仓库所有商品库存;传值查询对应商品库存。传值格式为:商品编码+英文逗号。如:123,456,789】
+     */
+    @JSONField(name = "cgoodsid", ordinal = 3)
+    private String goodsCode;
+}

+ 48 - 0
fs-service-system/src/main/java/com/fs/kingbos/domian/KbStockResponse.java

@@ -0,0 +1,48 @@
+package com.fs.kingbos.domian;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+@Data
+public class KbStockResponse {
+
+    /**
+     * true:请求成功;false:请求失败;
+     */
+    @JSONField(name = "IsSuccess")
+    private Boolean success;
+
+    /**
+     * 提示消息
+     */
+    @JSONField(name = "errmsg")
+    private String msg;
+
+    /**
+     * 返回数据
+     */
+    @JSONField(name = "data")
+    private String data;
+
+    /**
+     * 库存
+     */
+    private Integer stock;
+
+    public Integer getStock() {
+        int stocks = 0;
+        JSONArray dataArray = JSON.parseArray(this.data);
+        for (int i = 0; i < dataArray.size(); i++) {
+            JSONObject base = dataArray.getJSONObject(i);
+            for (Object item : base.getJSONArray("base")) {
+                JSONObject json = (JSONObject) item;
+                stocks += json.getIntValue("fqty");
+            }
+        }
+
+        return stocks;
+    }
+}

+ 33 - 0
fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosOrderD1Data.java

@@ -0,0 +1,33 @@
+package com.fs.kingbos.domian;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class KingbosOrderD1Data {
+    // OMS发货单号
+    private String cdo_id;
+    // OMS订单号
+    private String co_id;
+    // 药品编码
+    private String csku_id;
+    // ERP药品编码
+    private String cgoodsid;
+    // 药品名称
+    private String cname;
+    // 规格代码
+    private String cshop_sku_id;
+    // 数量
+    private BigDecimal iqty;
+    // 单价
+    private BigDecimal fprice;
+    // 总金额
+    private BigDecimal famount;
+    // 订单来源平台
+    private String cordersource;
+    // 是否退款
+    private Integer isreturn;
+    // 优惠金额
+    private BigDecimal fpromoamount;
+}

+ 71 - 0
fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosOrderData.java

@@ -0,0 +1,71 @@
+package com.fs.kingbos.domian;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 金博订单实体  data
+ */
+@Data
+public class KingbosOrderData {
+    // 订单来源
+    private String cordersource;
+    // 订单下单时间
+    private String dorder_date;
+    // 店铺买家编号
+    private String cshop_buyer_id;
+    // 平台类型
+    private String cplatformtype;
+    // 平台店铺编号
+    private String cshop_id;
+    // 平台店铺名称
+    private String cshop_name;
+    // 平台订单号
+    private String cso_id;
+    // OMS订单号
+    private String co_id;
+    // OMS发货单号
+    private String cdo_id;
+    // 应付金额
+    private BigDecimal fpay_amount;
+    // 已付金额
+    private BigDecimal fpaid_amount;
+    // 运费
+    private BigDecimal ffreight;
+    // 优惠金额
+    private BigDecimal ffree_amount;
+    // 订单状态
+    private String cstatus;
+    // 物流成本
+    private BigDecimal fpostcost;
+    // 最后更新时间
+    private String dmodified;
+    // 收件人(省)
+    private String creceiver_state;
+    // 收件人(城市)
+    private String creceiver_city;
+    // 收件人(区)
+    private String creceiver_district;
+    // 收件人(详细地址)
+    private String creceiver_address;
+    // 收件人(名称)
+    private String creceiver_name;
+    // 收件人(电话)
+    private String creceiver_mobile;
+    // 快递单号
+    private String cexpress_no;
+    // 快递公司代码
+    private String cexpress_code;
+    // 快递公司名称
+    private String cexpress_name;
+    // 仓库代码
+    private String cwarehouse_code;
+    // 仓库名称
+    private String cwarehouse_name;
+    //货到付款
+    private Integer bis_cod;
+    //代收金额
+    private BigDecimal fshouldpaymoney;
+}

+ 12 - 0
fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosOrderRequest.java

@@ -0,0 +1,12 @@
+package com.fs.kingbos.domian;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class KingbosOrderRequest {
+    private String key;//单据ID
+    private KingbosOrderData data; //主表
+    private List<KingbosOrderD1Data> d1_data; //D1表
+}

+ 10 - 0
fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosOrderResponse.java

@@ -0,0 +1,10 @@
+package com.fs.kingbos.domian;
+
+import lombok.Data;
+
+@Data
+public class KingbosOrderResponse {
+    private Boolean IsSuccess; //true:请求成功;false:请求失败;
+    private String cbilid; //平台单号
+    private String errmsg;  //错误信息
+}

+ 20 - 0
fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosRefundOrderD1Data.java

@@ -0,0 +1,20 @@
+package com.fs.kingbos.domian;
+
+import cn.hutool.core.annotation.Alias;
+import lombok.Data;
+
+@Data
+public class KingbosRefundOrderD1Data {
+
+    /**
+     * 平台订单来源
+     */
+    @Alias("cordersource")
+    private String corderSource;
+
+    /**
+     * OMS售后单号
+     */
+    @Alias("cas_id")
+    private String casId;
+}

+ 25 - 0
fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosRefundOrderData.java

@@ -0,0 +1,25 @@
+package com.fs.kingbos.domian;
+
+import cn.hutool.core.annotation.Alias;
+import lombok.Data;
+
+@Data
+public class KingbosRefundOrderData {
+    /**
+     * 平台订单来源
+     */
+    @Alias("cordersource")
+    private String corderSource;
+
+    /**
+     * OMS售后单号
+     */
+    @Alias("cas_id")
+    private String casId;
+
+    /**
+     * OMS订单号
+     */
+    @Alias("co_id")
+    private String coId;
+}

+ 12 - 0
fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosRefundOrderRequest.java

@@ -0,0 +1,12 @@
+package com.fs.kingbos.domian;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class KingbosRefundOrderRequest {
+    private String key;//单据ID
+    private KingbosRefundOrderData data; //主表
+    private List<KingbosRefundOrderD1Data> d1_data; //D1表
+}

+ 47 - 0
fs-service-system/src/main/java/com/fs/kingbos/enums/OrderStatusEnum.java

@@ -0,0 +1,47 @@
+package com.fs.kingbos.enums;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public enum OrderStatusEnum {
+
+    /**
+     * 发货失败
+     */
+    FAILURE("Failure", "发货失败"),
+
+    /**
+     * 未发货
+     */
+    NO_DELIVERED("NoDelivered", "未发货"),
+
+    /**
+     * 发货中
+     */
+    DELIVERING("Delivering", "发货中"),
+
+    /**
+     * 已发货
+     */
+    SENT("Sent", "已发货"),
+
+    /**
+     * 已取消
+     */
+    CANCELLED("Cancelled", "已取消"),
+
+    /**
+     * 已退货
+     */
+    RETURN("Return", "已退货");
+
+    private String code;
+    private String desc;
+
+}

+ 15 - 0
fs-service-system/src/main/java/com/fs/kingbos/service/K9OrderService.java

@@ -0,0 +1,15 @@
+package com.fs.kingbos.service;
+
+import com.fs.kingbos.domian.KingbosOrderRequest;
+import com.fs.kingbos.domian.KingbosOrderResponse;
+import com.fs.kingbos.domian.KingbosRefundOrderRequest;
+
+import java.text.ParseException;
+
+public interface K9OrderService {
+    KingbosOrderResponse addOrder(KingbosOrderRequest request);
+
+    KingbosOrderResponse refundOrder(KingbosRefundOrderRequest request);
+
+    void createOmsOrder(Long orderId,String orderStatus);
+}

+ 19 - 0
fs-service-system/src/main/java/com/fs/kingbos/service/K9StockService.java

@@ -0,0 +1,19 @@
+package com.fs.kingbos.service;
+
+import com.fs.common.exception.ServiceException;
+import com.fs.kingbos.domian.KbStockRequest;
+import com.fs.kingbos.domian.KbStockResponse;
+
+/**
+ * 库存服务
+ */
+public interface K9StockService {
+
+    /**
+     * 查看库存
+     * @param request 入参
+     * @return  KbStockResponse
+     * @throws ServiceException 异常
+     */
+    KbStockResponse getStock(KbStockRequest request) throws ServiceException;
+}

+ 248 - 0
fs-service-system/src/main/java/com/fs/kingbos/service/impl/K9OrderServiceImpl.java

@@ -0,0 +1,248 @@
+package com.fs.kingbos.service.impl;
+
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.fs.common.config.FSSysConfig;
+import com.fs.common.exception.ServiceException;
+import com.fs.common.utils.StringUtils;
+import com.fs.kingbos.domian.*;
+import com.fs.kingbos.enums.OrderStatusEnum;
+import com.fs.kingbos.service.K9OrderService;
+import com.fs.kingbos.util.SignUtil;
+import com.fs.kingbos.util.UrlUtil;
+import com.fs.store.domain.FsStoreOrder;
+import com.fs.store.domain.FsStoreOrderItem;
+import com.fs.store.dto.FsStoreCartDTO;
+import com.fs.store.mapper.FsStoreOrderMapper;
+import com.fs.store.mapper.FsStoreProductMapper;
+import com.fs.store.service.IFsStoreOrderItemService;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.fs.kingbos.enums.OrderStatusEnum.CANCELLED;
+import static com.fs.kingbos.enums.OrderStatusEnum.NO_DELIVERED;
+
+@Service
+@Slf4j
+public class K9OrderServiceImpl implements K9OrderService {
+    public final static Logger logger = LoggerFactory.getLogger(K9OrderServiceImpl.class);
+    @Autowired
+    FSSysConfig sysConfig;
+    @Autowired
+    private FsStoreOrderMapper fsStoreOrderMapper;
+    @Autowired
+    private IFsStoreOrderItemService storeOrderItemService;
+    @Autowired
+    private FsStoreProductMapper productMapper;
+    @Override
+    public KingbosOrderResponse addOrder(KingbosOrderRequest request) {
+        JSONObject param = JSONUtil.createObj();
+        param.set("key", "OL");
+        param.set("data", request.getData());
+        param.set("d1_data", request.getD1_data());
+        String timeStep = System.currentTimeMillis() + "";
+        logger.info("zyp \n【金博网络订单推送参数】:"+param);
+        String sign = SignUtil.sign(param.toString(),sysConfig.getKingbosSecret(), sysConfig.getKingbosan(), timeStep);
+        String url = UrlUtil.getUrl(sysConfig.getKingbosUrl(),sign, timeStep);
+        String json = param.toString();
+        String result = HttpUtil.post(url, json);
+        logger.info("zyp \n【金博网络订单推送返回】:"+result);
+        KingbosOrderResponse response = JSONUtil.toBean(result, KingbosOrderResponse.class);
+        return response;
+    }
+
+
+    @Override
+    public KingbosOrderResponse refundOrder(KingbosRefundOrderRequest request) {
+        JSONObject param = JSONUtil.createObj();
+        param.set("key", "WR");
+        param.set("data", request.getData());
+        param.set("d1_data", request.getD1_data());
+        String timeStep = System.currentTimeMillis() + "";
+        String sign = SignUtil.sign(param.toString(),sysConfig.getKingbosSecret(), sysConfig.getKingbosan(), timeStep);
+        String url = UrlUtil.getUrl(sysConfig.getKingbosUrl(),sign, timeStep);
+        String result = HttpUtil.post(url, param.toString());
+        logger.info("zyp \n【金博网络退货单】:"+result);
+        KingbosOrderResponse response = JSONUtil.toBean(result, KingbosOrderResponse.class);
+        return response;
+    }
+
+
+    @Override
+    @Transactional
+    public void createOmsOrder(Long orderId,String orderStatus){
+        logger.info("【金博网络订单】开始创建订单,订单ID: {}", orderId);
+        try {
+            // 1. 获取订单信息并验证
+            FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderById(orderId);
+            logger.info("【金博网络订单】订单信息获取成功,订单号: {}", order.getOrderCode());
+
+            // 2. 构建金博订单数据
+            KingbosOrderData data = buildKingbosOrderData(order,orderStatus);
+            logger.info("【金博网络订单】订单数据构建完成,金博订单号: {}", data.getCo_id());
+
+            // 3. 构建订单明细数据
+            List<KingbosOrderD1Data> d1Datas = buildOrderDetailData(order, data.getCdo_id());
+            logger.info("【金博网络订单】订单明细数据构建完成,明细数量: {}", d1Datas.size());
+
+            // 4. 发送订单请求
+            KingbosOrderResponse response = sendOrderRequest(data, d1Datas);
+            if (response.getIsSuccess()){
+                FsStoreOrder order1 = new FsStoreOrder();
+                order1.setId(order.getId());
+                order1.setExtendOrderId(response.getCbilid());
+                fsStoreOrderMapper.updateFsStoreOrder(order1);
+                logger.info("【金博网络订单】订单创建完成,订单ID: {}", orderId);
+            }else {
+                logger.error("【金博网络订单】创建订单失败,订单ID: {}, 错误信息: {}", orderId, response.getErrmsg());
+            }
+        } catch (Exception e) {
+            logger.error("【金博网络订单】创建订单失败,订单ID: {}, 错误信息: {}", orderId, e.getMessage(), e);
+            throw e;
+        }
+    }
+
+
+    private KingbosOrderData buildKingbosOrderData(FsStoreOrder order,String orderStatus) {
+        logger.debug("【金博网络订单】开始构建订单数据,订单号: {}", order.getOrderCode());
+        KingbosOrderData data = new KingbosOrderData();
+        // 设置基础信息
+        data.setCordersource("MALL");
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        data.setDorder_date(sdf.format(order.getCreateTime()));
+//        data.setCshop_buyer_id("zk2025");
+        data.setCplatformtype("99");
+        data.setCshop_id("zk2025");
+        data.setCshop_name("自建商城");
+        String orderSn = "";
+        // 设置订单编号
+        if (orderStatus.equals(NO_DELIVERED.getCode())){
+            orderSn= IdUtil.getSnowflake(0, 0).nextIdStr();
+        }else if (orderStatus.equals(CANCELLED.getCode())){
+            orderSn = order.getExtendOrderId();
+        }
+
+        data.setCso_id(order.getOrderCode());
+        data.setCo_id(orderSn);
+        data.setCdo_id(orderSn);
+
+        // 设置金额信息
+        data.setFpay_amount(order.getPayPrice());
+        data.setFpaid_amount(order.getPayMoney());
+        data.setFfreight(order.getTotalPostage());
+        data.setFfree_amount(order.getCouponPrice());
+        data.setFpostcost(BigDecimal.ZERO);
+
+        // 设置状态和时间
+        data.setCstatus(orderStatus);//未发货
+        data.setDmodified(sdf.format(order.getUpdateTime()));
+
+        // 设置收货信息
+        setReceiverInfo(data, order);
+
+        // 设置仓库信息
+        data.setCwarehouse_code(sysConfig.getCwarehouseCode());
+        data.setCwarehouse_name(sysConfig.getCwarehouseName());
+
+        // 设置货到付款信息
+        if (!order.getPayType().equals("1")) {
+            data.setBis_cod(1);
+            data.setFshouldpaymoney(order.getDeliveryPayMoney());
+        }
+
+        return data;
+    }
+
+    private void setReceiverInfo(KingbosOrderData data, FsStoreOrder order) {
+        logger.debug("【金博网络订单】开始处理收货信息,订单号: {}", order.getOrderCode());
+        String[] address = order.getUserAddress().split(" ");
+        if (address.length < 3) {
+            logger.error("【金博网络订单】收货地址格式不正确,订单号: {}, 地址: {}", order.getOrderCode(), order.getUserAddress());
+            throw new ServiceException("收货地址格式不正确");
+        }
+
+        data.setCreceiver_state(address[0]);
+        data.setCreceiver_city(address[1]);
+        data.setCreceiver_district(address[2]);
+
+        // 处理详细地址
+        String detailAddress = address.length > 3 ?
+            String.join("", Arrays.copyOfRange(address, 3, address.length)) :
+            address[2];
+
+        // 处理特殊字符
+        detailAddress = detailAddress.replace("+", "加")
+                                   .replace("\n", "");
+
+        data.setCreceiver_address(detailAddress);
+        data.setCreceiver_name(order.getRealName());
+        data.setCreceiver_mobile(order.getUserPhone());
+
+    }
+
+    private List<KingbosOrderD1Data> buildOrderDetailData(FsStoreOrder order, String orderId) {
+        logger.debug("【金博网络订单】开始构建订单明细,订单号: {}", order.getOrderCode());
+        FsStoreOrderItem query = new FsStoreOrderItem();
+        query.setOrderId(order.getId());
+        List<FsStoreOrderItem> orderItems = storeOrderItemService.selectFsStoreOrderItemList(query);
+
+        List<KingbosOrderD1Data> d1Datas = orderItems.stream()
+            .map(item -> buildOrderDetailItem(item, orderId))
+            .collect(Collectors.toList());
+
+        logger.debug("【金博网络订单】订单明细构建完成,订单号: {}, 明细数量: {}", order.getOrderCode(), d1Datas.size());
+        return d1Datas;
+    }
+
+    private KingbosOrderD1Data buildOrderDetailItem(FsStoreOrderItem orderItem, String orderId) {
+        FsStoreCartDTO cartDTO = JSONUtil.toBean(orderItem.getJsonInfo(), FsStoreCartDTO.class);
+        BigDecimal quantity = new BigDecimal(orderItem.getNum());
+
+        KingbosOrderD1Data item = new KingbosOrderD1Data();
+        item.setCdo_id(orderId);
+        item.setCo_id(orderId);
+        item.setCsku_id(cartDTO.getBarCode());
+        item.setCgoodsid(cartDTO.getBarCode());
+        item.setCname(cartDTO.getProductName());
+        item.setCshop_sku_id(cartDTO.getSku());
+        item.setIqty(quantity);
+        item.setFprice(cartDTO.getPrice());
+        item.setFamount(quantity.multiply(cartDTO.getPrice()));
+        item.setCordersource("MALL");
+        item.setFpromoamount(BigDecimal.ZERO);
+
+        return item;
+    }
+
+    private KingbosOrderResponse sendOrderRequest(KingbosOrderData data, List<KingbosOrderD1Data> d1Datas) {
+        logger.info("【金博网络订单】开始发送订单请求,金博订单号: {}", data.getCo_id());
+        KingbosOrderRequest request = new KingbosOrderRequest();
+        request.setData(data);
+        request.setD1_data(d1Datas);
+
+        try {
+            KingbosOrderResponse response = this.addOrder(request);
+            logger.info("【金博网络订单】订单请求发送成功,金博订单号: {}, 响应结果: {}", data.getCo_id(), response);
+            return response;
+        } catch (Exception e) {
+            logger.error("【金博网络订单】订单请求发送失败,金博订单号: {}, 错误信息: {}", data.getCo_id(), e.getMessage(), e);
+            throw e;
+        }
+    }
+}

+ 49 - 0
fs-service-system/src/main/java/com/fs/kingbos/service/impl/K9StockServiceImpl.java

@@ -0,0 +1,49 @@
+package com.fs.kingbos.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fs.common.config.FSSysConfig;
+import com.fs.common.exception.ServiceException;
+import com.fs.common.utils.StringUtils;
+import com.fs.common.utils.http.HttpUtils;
+import com.fs.kingbos.domian.KbStockRequest;
+import com.fs.kingbos.domian.KbStockResponse;
+import com.fs.kingbos.service.K9StockService;
+import com.fs.kingbos.util.SignUtil;
+import com.fs.kingbos.util.UrlUtil;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Service
+@Slf4j
+@AllArgsConstructor
+public class K9StockServiceImpl implements K9StockService {
+
+    private final FSSysConfig sysConfig;
+
+    /**
+     * 查看库存
+     * @param request 参数
+     * @return  KbStockResponse
+     * @throws ServiceException 异常
+     */
+    @Override
+    public KbStockResponse getStock(KbStockRequest request) throws ServiceException {
+        // 构造参数
+        String timeStep = System.currentTimeMillis() + "";
+        if (StringUtils.isBlank(request.getStockCode())) {
+            request.setStockCode(sysConfig.getCwarehouseCode());
+        }
+        String json = JSON.toJSONString(request);
+        String sign = SignUtil.sign(json, sysConfig.getKingbosSecret(), sysConfig.getKingbosan(), timeStep);
+        String url = sysConfig.getKingbosUrl().replace("do=k9save", "do=k9view");
+        url = UrlUtil.getUrl(url, sign, timeStep);
+
+        // 发送请求
+        log.info("\n【金博网络】: getStock send request url: {}", url);
+        String result = HttpUtils.doPost(url, json);
+        log.info("\n【金博网络】: getStock res:{}", result);
+        return JSONObject.parseObject(result, KbStockResponse.class);
+    }
+}

+ 12 - 0
fs-service-system/src/main/java/com/fs/kingbos/util/SignUtil.java

@@ -0,0 +1,12 @@
+package com.fs.kingbos.util;
+
+
+import com.fs.ad.yk.utils.Md5Util;
+
+public class SignUtil {
+
+    public static String sign(String data, String secret, String name, String timestamp) {
+        String enValue = "kingbos" + secret + timestamp + name + "zy01" + data;
+        return Md5Util.MD5(enValue);
+    }
+}

+ 26 - 0
fs-service-system/src/main/java/com/fs/kingbos/util/UrlUtil.java

@@ -0,0 +1,26 @@
+package com.fs.kingbos.util;
+
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+
+public class UrlUtil {
+    public static String getUrl(String url, String sign, String timeStep) {
+        String updatedUrl = updateURLParams(url, "timestep", timeStep);
+        updatedUrl = updateURLParams(updatedUrl, "sign", sign);
+        return updatedUrl;
+    }
+
+    public static String updateURLParams(String url, String param, String value) {
+        String encodedValue;
+        try {
+            encodedValue = URLEncoder.encode(value, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            encodedValue = value;
+            e.printStackTrace();
+        }
+
+        return url.replaceAll(param + "=", param + "=" + encodedValue);
+    }
+}

+ 9 - 2
fs-service-system/src/main/java/com/fs/qw/service/impl/QwWatchLogServiceImpl.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.constant.HttpStatus;
 import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.DictUtils;
 import com.fs.company.cache.ICompanyCacheService;
@@ -27,6 +28,8 @@ import com.fs.store.service.cache.IFsUserCacheService;
 import com.fs.store.service.cache.IFsUserCourseCacheService;
 import com.github.pagehelper.PageInfo;
 import com.hc.openapi.tool.util.StringUtils;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.http.util.Asserts;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -174,7 +177,9 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
         // 获取当前公司下的所有销售
         if(param.getCompanyUserId()  == null){
             List<CompanyUser> companyUsers = companyUserMapper.selectCompanyUserByCompanyId(param.getCompanyId());
-
+            if(CollectionUtils.isEmpty(companyUsers)){
+                throw new CustomException("该公司下面没有任何销售!");
+            }
             userIds = companyUsers.stream()
                     .map(CompanyUser::getUserId)
                     .filter(Objects::nonNull)
@@ -276,7 +281,9 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
         List<Long> userIds;
         if(param.getCompanyUserId()  == null){
             List<CompanyUser> companyUsers = companyUserMapper.selectCompanyUserByCompanyId(param.getCompanyId());
-
+            if(CollectionUtils.isEmpty(companyUsers)){
+                throw new CustomException("该公司下面没有任何销售!");
+            }
             userIds = companyUsers.stream()
                     .map(CompanyUser::getUserId)
                     .filter(Objects::nonNull)

+ 3 - 1
fs-service-system/src/main/java/com/fs/sop/service/impl/CompanySopRoleServiceImpl.java

@@ -51,7 +51,9 @@ public class CompanySopRoleServiceImpl extends ServiceImpl<CompanySopRoleMapper,
      */
     @Override
     public List<Company> selectCompanySopRoleList(CompanySopRole companySopRole){
-        List<Company> companyList = companyService.selectCompanyList(new Company());
+        Company company = new Company();
+        company.setIsDel(0);
+        List<Company> companyList = companyService.selectCompanyList(company);
         List<Long> companyIdList = PubFun.listToNewList(companyList, Company::getCompanyId);
         companySopRole.setCompanyIds(companyIdList);
         List<CompanySopRole> roleList = baseMapper.selectCompanySopRoleList(companySopRole);

+ 43 - 0
fs-service-system/src/main/java/com/fs/store/dto/ExpressResultDTO.java

@@ -0,0 +1,43 @@
+package com.fs.store.dto;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+
+
+public class ExpressResultDTO extends HashMap<String, Object> {
+    private static final long serialVersionUID = 1L;
+
+    public ExpressResultDTO() {
+
+    }
+
+    private static String getCurrentTimeString() {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        return LocalDateTime.now().format(formatter);
+    }
+
+    public static ExpressResultDTO success(String EBusinessID) {
+        ExpressResultDTO result = new ExpressResultDTO();
+        result.put("EBusinessID", EBusinessID);
+        result.put("UpdateTime", getCurrentTimeString());
+        result.put("Success", true);
+        result.put("Reason", "");
+        return result;
+    }
+
+    public static ExpressResultDTO error(String EBusinessID, String reason) {
+        ExpressResultDTO result = new ExpressResultDTO();
+        result.put("EBusinessID", EBusinessID);
+        result.put("UpdateTime", getCurrentTimeString());
+        result.put("Success", false);
+        result.put("Reason", reason);
+        return result;
+    }
+
+    @Override
+    public ExpressResultDTO put(String key, Object value) {
+        super.put(key, value);
+        return this;
+    }
+}

+ 10 - 1
fs-service-system/src/main/java/com/fs/store/service/IFsStoreOrderService.java

@@ -13,6 +13,7 @@ import com.fs.company.domain.CompanyUser;
 import com.fs.erp.domain.ErpOrder;
 import com.fs.store.domain.FsStoreOrder;
 import com.fs.store.dto.ExpressNotifyDTO;
+import com.fs.store.dto.ExpressResultDTO;
 import com.fs.store.dto.FsStoreOrderComputeDTO;
 import com.fs.store.dto.StoreOrderExpressExportDTO;
 import com.fs.store.param.*;
@@ -196,10 +197,18 @@ public interface IFsStoreOrderService
 
     int uploadItemJson(FsStoreOrder order);
 
-    void updateDeliveryItem(ExpressNotifyDTO notifyDTO);
+    ExpressResultDTO updateDeliveryItem(ExpressNotifyDTO notifyDTO);
 
     FsStoreOrder selectOrderByUserIdLimit1(Long userId);
 
 
     List<FsStoreOrder> selectFsStoreOrderStatisticsByUserId(List<Long> fsUserIdList);
+
+
+    /**
+     * 完成订单
+     * @param orderId 订单id
+     * @return R
+     */
+    R finishStoreOrder(Long orderId);
 }

+ 3 - 3
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreAfterSalesServiceImpl.java

@@ -198,9 +198,9 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService
         if(order.getStatus()==0){
             return R.error("未支付订单不能申请售后");
         }
-//        if(StringUtils.isEmpty(order.getExtendOrderId())){
-//            return R.error("仓库未生成订单,暂时不能申请退款,请联系客服");
-//        }
+        if(StringUtils.isEmpty(order.getExtendOrderId())){
+            return R.error("仓库未生成订单,暂时不能申请退款,请联系客服");
+        }
         if(order.getStatus()== OrderInfoEnum.STATUS_NE3.getValue()){
             return R.error("已取消订单不能申请售后");
         }

+ 29 - 31
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreCartServiceImpl.java

@@ -1,32 +1,35 @@
 package com.fs.store.service.impl;
 
-import java.util.Date;
-import java.util.List;
-
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONUtil;
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
-import com.fs.erp.domain.ErpGoodsStock;
-import com.fs.erp.dto.ErpGoodsStockQueryRequert;
-import com.fs.erp.dto.ErpGoodsStockQueryResponse;
 import com.fs.erp.service.IErpGoodsService;
+import com.fs.kingbos.domian.KbStockRequest;
+import com.fs.kingbos.domian.KbStockResponse;
+import com.fs.kingbos.service.K9StockService;
+import com.fs.store.domain.FsStoreCart;
 import com.fs.store.domain.FsStoreProductAttrValue;
 import com.fs.store.domain.FsStoreProductGroup;
 import com.fs.store.dto.StoreProductGroupDTO;
-import com.fs.store.mapper.*;
+import com.fs.store.mapper.FsStoreCartMapper;
+import com.fs.store.mapper.FsStoreProductAttrValueMapper;
+import com.fs.store.mapper.FsStoreProductGroupMapper;
+import com.fs.store.mapper.FsStoreProductMapper;
 import com.fs.store.param.FsStoreCartCountParam;
 import com.fs.store.param.FsStoreCartDelParam;
 import com.fs.store.param.FsStoreCartNumParam;
 import com.fs.store.param.FsStoreCartParam;
+import com.fs.store.service.IFsStoreCartService;
 import com.fs.store.vo.FsStoreCartVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.fs.store.domain.FsStoreCart;
-import com.fs.store.service.IFsStoreCartService;
+
+import java.util.Date;
+import java.util.List;
 
 /**
  * 购物车Service业务层处理
@@ -48,6 +51,9 @@ public class FsStoreCartServiceImpl implements IFsStoreCartService
     private FsStoreProductGroupMapper productGroupMapper;
     @Autowired
     IErpGoodsService goodsService;
+    @Autowired
+    private K9StockService k9StockService;
+
     /**
      * 查询购物车
      *
@@ -137,7 +143,7 @@ public class FsStoreCartServiceImpl implements IFsStoreCartService
                     .isBuy(cartParam.getIsBuy())
                     .build();
             storeCart.setCreateTime(new Date());
-            checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
+//            checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
             fsStoreCartMapper.insertFsStoreCart(storeCart);
             return R.ok().put("id",storeCart.getId());
 
@@ -163,7 +169,7 @@ public class FsStoreCartServiceImpl implements IFsStoreCartService
                         .isBuy(0)
                         .build();
                 storeCart.setCreateTime(new Date());
-                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
+//                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
                 fsStoreCartMapper.insertFsStoreCart(storeCart);
                 return R.ok().put("id",storeCart.getId());
             }
@@ -171,7 +177,7 @@ public class FsStoreCartServiceImpl implements IFsStoreCartService
                 storeCart=cart.get(0);
                 storeCart.setCartNum(cartParam.getCartNum() + cart.get(0).getCartNum());
                 storeCart.setUpdateTime(new Date());
-                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
+//                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
                 fsStoreCartMapper.updateFsStoreCart(storeCart);
                 return R.ok().put("id",storeCart.getId());
             }
@@ -193,7 +199,7 @@ public class FsStoreCartServiceImpl implements IFsStoreCartService
     @Override
     public R changeNum(long userId, FsStoreCartNumParam cartParam) {
         FsStoreCart cart=fsStoreCartMapper.selectFsStoreCartById(cartParam.getId());
-        checkProductStock(cart.getProductId(),cart.getProductAttrValueId());
+//        checkProductStock(cart.getProductId(),cart.getProductAttrValueId());
         cart.setCartNum(cartParam.getNumber());
         cart.setUpdateTime(new Date());
         fsStoreCartMapper.updateFsStoreCart(cart);
@@ -206,15 +212,11 @@ public class FsStoreCartServiceImpl implements IFsStoreCartService
         FsStoreProductAttrValue productAttrValue=valueMapper.selectFsStoreProductAttrValueById(productAttrValueId);
         if(StringUtils.isEmpty(productAttrValue.getGroupBarCode())){
             //单品
-            ErpGoodsStockQueryRequert request=new ErpGoodsStockQueryRequert();
-            request.setBarcode(productAttrValue.getBarCode());
-            ErpGoodsStockQueryResponse response=goodsService.getGoodsStock(request);
-            if(response.getStocks()!=null){
-                Integer stocks=0;
-                for(ErpGoodsStock stock:response.getStocks()){
-                    Double goodsStock=Double.parseDouble(stock.getSalable_qty());
-                    stocks+=goodsStock.intValue();
-                }
+            KbStockRequest request = KbStockRequest.builder().goodsCode(productAttrValue.getBarCode()).build();
+            KbStockResponse response = k9StockService.getStock(request);
+            if(response.getSuccess()){
+                int stocks = response.getStock();
+
                 if(stocks<=0){
                     productAttrValue.setStock(0);
                     valueMapper.updateFsStoreProductAttrValue(productAttrValue);
@@ -244,15 +246,11 @@ public class FsStoreCartServiceImpl implements IFsStoreCartService
                 if(productGroupDTOS!=null){
                     for(StoreProductGroupDTO dto:productGroupDTOS){
                         FsStoreProductAttrValue attrValue=valueMapper.selectFsStoreProductAttrValueById(dto.getId());
-                        ErpGoodsStockQueryRequert request=new ErpGoodsStockQueryRequert();
-                        request.setBarcode(attrValue.getBarCode());
-                        ErpGoodsStockQueryResponse response=goodsService.getGoodsStock(request);
-                        if(response.getStocks()!=null){
-                            Integer stocks=0;
-                            for(ErpGoodsStock stock:response.getStocks()){
-                                Double goodsStock=Double.parseDouble(stock.getSalable_qty());
-                                stocks+=goodsStock.intValue();
-                            }
+                        KbStockRequest request = KbStockRequest.builder().goodsCode(attrValue.getBarCode()).build();
+                        KbStockResponse response = k9StockService.getStock(request);
+                        if(response.getSuccess()){
+                            Integer stocks = response.getStock();
+
                             if(stocks<=0){
                                 attrValue.setStock(0);
                                 valueMapper.updateFsStoreProductAttrValue(attrValue);

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 29 - 44
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java


+ 7 - 0
fs-service-system/src/main/resources/application-config.yml

@@ -20,6 +20,13 @@ fsConfig:
   erpWdShopCode: beiliyou2-test
   erpWdBaseUrl: https://api.wangdian.cn/openapi2/
   erpWarehouseCode: beiliyou2-test
+  #金博ERP
+  kingbosan: 陕西中康
+  kingbosSecret: 12CA1038CE8A45D1BA325898A3F2F029
+  kingbosUrl: http://zkyf888.gnway.cc:53868/?an=陕西中康&do=k9save&timestep=&sign=&corgid=zy01
+  corgid: zy01
+  cwarehouseCode: "CK01"
+  cwarehouseName: "合格仓"
   #第三方支付配置
   payOpen: 1
   payPartnerId: 22051909542647100020

+ 3 - 0
fs-service-system/src/main/resources/mapper/course/FsCourseAnswerLogsMapper.xml

@@ -192,6 +192,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="courseId != null">course_id,</if>
             <if test="questionJson != null">question_json,</if>
             <if test="watchLogId != null">watch_log_id,</if>
+            <if test="periodId != null">period_id,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="userId != null">#{userId},</if>
@@ -204,6 +205,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="courseId != null">#{courseId},</if>
             <if test="questionJson != null">#{questionJson},</if>
             <if test="watchLogId != null">#{watchLogId},</if>
+            <if test="periodId != null">#{periodId},</if>
          </trim>
     </insert>
 
@@ -219,6 +221,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="qwUserId != null">qw_user_id = #{qwUserId},</if>
             <if test="courseId != null">course_id = #{courseId},</if>
             <if test="watchLogId != null">watch_log_id = #{watchLogId},</if>
+            <if test="periodId != null">period_id = #{periodId},</if>
         </trim>
         where log_id = #{logId}
     </update>

+ 3 - 0
fs-service-system/src/main/resources/mapper/course/FsCourseRedPacketLogMapper.xml

@@ -110,6 +110,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateTime != null">update_time,</if>
             <if test="watchLogId != null">watch_log_id,</if>
             <if test="remark != null">remark,</if>
+            <if test="periodId != null">period_id,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="courseId != null">#{courseId},</if>
@@ -125,6 +126,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateTime != null">#{updateTime},</if>
             <if test="watchLogId != null">#{watchLogId},</if>
             <if test="remark != null">#{remark},</if>
+            <if test="periodId != null">#{periodId},</if>
          </trim>
     </insert>
 
@@ -144,6 +146,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateTime != null">update_time = #{updateTime},</if>
             <if test="watchLogId != null">watch_log_id = #{watchLogId},</if>
             <if test="remark != null">remark = #{remark},</if>
+            <if test="periodId != null">period_id = #{periodId},</if>
         </trim>
         where log_id = #{logId}
     </update>

+ 3 - 0
fs-service-system/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml

@@ -210,6 +210,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="finishTime != null">finish_time,</if>
             <if test="sendFinishMsg != null">send_finish_msg,</if>
             <if test="campPeriodTime != null">camp_period_time,</if>
+            <if test="periodId != null">period_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="userId != null">#{userId},</if>
@@ -229,6 +230,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="finishTime != null">#{finishTime},</if>
             <if test="sendFinishMsg != null">#{sendFinishMsg},</if>
             <if test="campPeriodTime != null">#{campPeriodTime},</if>
+            <if test="periodId != null">#{periodId},</if>
         </trim>
     </insert>
 
@@ -343,6 +345,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="finishTime != null">finish_time = #{finishTime},</if>
             <if test="sendFinishMsg != null">send_finish_msg = #{sendFinishMsg},</if>
             <if test="lastHeartbeatTime != null">last_heartbeat_time = #{lastHeartbeatTime},</if>
+            <if test="periodId != null">period_id = #{periodId},</if>
         </trim>
         where log_id = #{logId}
     </update>

+ 16 - 2
fs-service-system/src/main/resources/mapper/course/FsUserCoursePeriodDaysMapper.xml

@@ -31,8 +31,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         inner join fs_user_course_video c on a.video_id = c.video_id
         <where>
             <if test="periodId != null "> and period_id = #{periodId}</if>
-            <if test="courseId != null "> and course_id = #{courseId}</if>
-            <if test="videoId != null "> and video_id = #{videoId}</if>
+            <if test="courseId != null "> and a.course_id = #{courseId}</if>
+            <if test="videoId != null "> and a.video_id = #{videoId}</if>
             <if test="videoIds != null and videoIds.size > 0">
                 and a.video_id in
                 <foreach collection="videoIds" open="(" close=")" separator="," item="videoId">
@@ -157,4 +157,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{item.id}
         </foreach>
     </update>
+
+    <update id="startPeriodCourse">
+        update fs_user_course_period_days ucpd
+        set ucpd.status = 1, ucpd.update_time = #{now}
+        where ucpd.status = 0 and ucpd.start_date_time >= #{now}
+    </update>
+
+    <update id="endPeriodCourse">
+        update fs_user_course_period_days ucpd
+        set ucpd.status = 2, ucpd.update_time = #{now}
+        <![CDATA[
+        where ucpd.status = 1 and ucpd.end_date_time < #{now}
+        ]]>
+    </update>
 </mapper>

+ 9 - 0
fs-service-system/src/main/resources/mapper/course/FsUserCoursePeriodMapper.xml

@@ -96,6 +96,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="periodType != null">period_type,</if>
             <if test="periodStartingTime != null">period_starting_time,</if>
             <if test="periodEndTime != null">period_end_time,</if>
+            <if test="viewStartTime != null">view_start_time,</if>
+            <if test="viewEndTime != null">view_end_time,</if>
+            <if test="lastJoinTime != null">last_join_time,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="periodId != null">#{periodId},</if>
@@ -110,6 +113,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="periodType != null">#{periodType},</if>
             <if test="periodStartingTime != null">#{periodStartingTime},</if>
             <if test="periodEndTime != null">#{periodEndTime},</if>
+            <if test="viewStartTime != null">#{viewStartTime},</if>
+            <if test="viewEndTime != null">#{viewEndTime},</if>
+            <if test="lastJoinTime != null">#{lastJoinTime},</if>
          </trim>
     </insert>
 
@@ -127,6 +133,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="periodType != null">period_type = #{periodType},</if>
             <if test="periodStartingTime != null">period_starting_time = #{periodStartingTime},</if>
             <if test="periodEndTime != null">period_end_time = #{periodEndTime},</if>
+            <if test="viewStartTime != null">view_start_time = #{viewStartTime},</if>
+            <if test="viewEndTime != null">view_end_time = #{viewEndTime},</if>
+            <if test="lastJoinTime != null">last_join_time = #{lastJoinTime},</if>
         </trim>
         where period_id = #{periodId}
     </update>

+ 1 - 1
fs-service-system/src/main/resources/mapper/course/FsUserCourseTrainingCampMapper.xml

@@ -10,7 +10,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             ctc.training_camp_id,
             ctc.training_camp_name,
             ctc.order_number,
-            min(if(ctp.period_starting_time > now(), ctp.period_starting_time, null)) as recent_date,
+            min(if(ctp.period_starting_time >= CURDATE(), ctp.period_starting_time, null)) as recent_date,
             count(distinct ctp.period_id) as period_count,
             count(distinct cu.user_id)  as vip_count
         from fs_user_course_training_camp ctc

+ 2 - 1
fs-service-system/src/main/resources/mapper/course/FsUserCourseVideoMapper.xml

@@ -237,7 +237,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             video.STATUS,
             video.course_sort,
             course.course_name,
-            fcpd.period_id
+            fcpd.period_id,
+            fcpd.id
         FROM `fs_user_course_video` video
         left join fs_user_course_period_days fcpd on fcpd.video_id = video.video_id
         left join fs_user_course_period fcp on fcp.period_id = fcpd.period_id

+ 3 - 93
fs-user-app/src/main/java/com/fs/app/controller/PayController.java

@@ -5,7 +5,6 @@ import com.alibaba.fastjson.JSON;
 import com.fs.common.config.FSSysConfig;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.redis.RedisCache;
-import com.fs.common.exception.CustomException;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.erp.service.IErpOrderService;
@@ -14,22 +13,18 @@ import com.fs.pay.pay.domain.OrderCallback;
 import com.fs.pay.pay.domain.OrderResult;
 import com.fs.pay.pay.dto.OrderQueryDTO;
 import com.fs.pay.pay.service.PayService;
-import com.fs.pay.pay.service.impl.PayApiServiceImpl;
 import com.fs.pay.pay.util.PayUtil;
-import com.fs.store.domain.*;
-import com.fs.store.enums.*;
-import com.fs.store.service.*;
 import com.fs.pay.service.dto.PayNotifyDTO;
 import com.fs.pay.service.dto.RefundNotifyDTO;
 import com.fs.pay.service.dto.TradeOrder;
+import com.fs.store.domain.FsStorePayment;
+import com.fs.store.service.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
@@ -86,7 +81,7 @@ public class PayController {
         //验证
         HuiFuResult o = JSON.parseObject(resp_data, HuiFuResult.class);
         logger.info("汇付支付回调:"+o);
-        if(o.getResp_code().equals("00000000")){
+        if(o.getResp_code().equals("00000000") && o.getNotify_type().equals("1")){
             String[] order=o.getReq_seq_id().split("-");
             switch (order[0]) {
                 case "store":
@@ -127,89 +122,4 @@ public class PayController {
 
 
 
-    @ApiOperation("小雨点第三方支付回调")
-    @PostMapping(value="/payNotify")
-    public String payNotify(HttpServletRequest request,PayNotifyDTO dto) throws Exception {
-            if("SUCCESS".equals(dto.getOrderStatus())) {
-                //订单号
-                String tradeNo = dto.getMerchOrderNo();
-                List<TradeOrder> tradeOrders= JSON.parseArray(dto.getTradeOrders(),TradeOrder.class);
-                if(tradeOrders!=null&&tradeOrders.size()>0){
-                    for(TradeOrder tradeOrder:tradeOrders){
-                        String[] order=tradeOrder.getSubMerchOrderNo().split("-");
-                        switch (order[0]) {
-                            case "store":
-                                orderService.payConfirm(1,null,order[1], tradeNo,dto.getBankTransactionId(),dto.getBankSerialNo());
-                                return "success";
-                            case "store_remain":
-                                orderService.payRemainConfirm( order[1], tradeNo,dto.getBankTransactionId(),dto.getBankSerialNo());
-                                return "success";
-                            case "payment":
-                                return storePaymentService.payConfirm(order[1], tradeNo,dto.getBankTransactionId(),dto.getBankSerialNo());
-                        }
-                    }
-                }
-            }
-            return "success";
-    }
-    @ApiOperation("小雨点第三方退款回调")
-    @PostMapping(value="/refundNotify")
-    public String refundNotify(HttpServletRequest request, RefundNotifyDTO dto) throws Exception {
-        if("SUCCESS".equals(dto.getOrderStatus())) {
-            String[] orderIds=dto.getOrigMerchOrderNo().split("-");
-            FsStorePayment storePayment=null;
-            switch (orderIds[0]) {
-                case "store":
-                    storePayment=storePaymentService.selectFsStorePaymentByCode(orderIds[1]);
-                    if(storePayment!=null){
-                        storePayment.setRefundMoney(BigDecimal.valueOf(Double.parseDouble(dto.getAmount())));
-                        storePayment.setStatus(-1);
-                        storePayment.setRefundTime(new Date());
-                        storePaymentService.updateFsStorePayment(storePayment);
-                    }
-                    return "success";
-                case "store_remain":
-                    storePayment=storePaymentService.selectFsStorePaymentByCode(orderIds[1]);
-                    if(storePayment!=null){
-                        storePayment.setRefundMoney(BigDecimal.valueOf(Double.parseDouble(dto.getAmount())));
-                        storePayment.setStatus(-1);
-                        storePayment.setRefundTime(new Date());
-                        storePaymentService.updateFsStorePayment(storePayment);
-                    }
-                    return "success";
-                case "doctor":
-                   return "success";
-                case "payment":
-                    storePaymentService.refund(orderIds[1]);
-                    return "success";
-            }
-            return "success";
-        }
-        return "success";
-    }
-
-
-//    @Transactional
-//    public String paymentOp(String payCode,String tradeNo,String bankTransactionId,String bankSerialNo) {
-//
-//        //更新订单状态
-//        FsStorePayment storePayment=storePaymentService.selectFsStorePaymentByCode(payCode);
-//        if(!storePayment.getStatus().equals(0)){
-//            return "";
-//        }
-//        storePayment.setStatus(1);
-//        storePayment.setPayTime(new Date());
-//        storePayment.setTradeNo(tradeNo);
-//        storePayment.setBankSerialNo(bankSerialNo);
-//        storePayment.setBankTransactionId(bankTransactionId);
-//        storePaymentService.updateFsStorePayment(storePayment);
-//        //增加佣金
-//        if(storePayment.getCompanyId()!=null&&storePayment.getCompanyId()>0){
-//            companyService.addCompanyPaymentMoney(storePayment);
-//        }
-//        return "success";
-//
-//    }
-
-
 }

+ 25 - 59
fs-user-app/src/main/java/com/fs/app/controller/StoreOrderController.java

@@ -2,41 +2,30 @@ package com.fs.app.controller;
 
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
-
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.TypeReference;
 import com.fs.app.annotation.Login;
-import com.fs.common.annotation.Log;
-import com.fs.common.annotation.RepeatSubmit;
-
 import com.fs.common.config.FSSysConfig;
 import com.fs.common.core.domain.R;
-import com.fs.common.enums.BusinessType;
 import com.fs.common.exception.CustomException;
-import com.fs.common.utils.*;
+import com.fs.common.utils.IpUtil;
+import com.fs.common.utils.ParseUtils;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.ip.IpUtils;
+import com.fs.erp.service.IErpOrderService;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuifuCreateOrderResult;
 import com.fs.huifuPay.service.HuiFuService;
-import com.fs.pay.pay.config.PayConfig;
-import com.fs.pay.pay.domain.CreateWxOrderResult;
 import com.fs.pay.pay.domain.OrderResult;
 import com.fs.pay.pay.dto.OrderQueryDTO;
-import com.fs.pay.pay.dto.WxJspayDTO;
 import com.fs.pay.pay.service.PayService;
-import com.fs.pay.pay.service.impl.PayApiServiceImpl;
-import com.fs.pay.service.dto.PayQueryDTO;
-import com.fs.store.domain.*;
-import com.fs.system.domain.SysConfig;
-import com.fs.wx.miniapp.config.WxMaConfiguration;
-import com.fs.wx.miniapp.config.WxMaProperties;
-import com.fs.wx.pay.config.WxPayProperties;
-import com.fs.erp.service.IErpOrderService;
+import com.fs.pay.service.IPayService;
 import com.fs.store.config.StoreConfig;
-
+import com.fs.store.domain.*;
 import com.fs.store.dto.FsStoreOrderComputeDTO;
 import com.fs.store.enums.OrderInfoEnum;
 import com.fs.store.mapper.FsStorePaymentMapper;
@@ -44,26 +33,20 @@ import com.fs.store.param.*;
 import com.fs.store.service.*;
 import com.fs.store.vo.FsMyStoreOrderListQueryVO;
 import com.fs.store.vo.FsStoreOrderItemVO;
-import com.fs.pay.service.IPayService;
-import com.fs.pay.service.dto.CreatePayDTO;
-import com.fs.pay.service.dto.PayDTO;
-import com.fs.pay.service.dto.TradeOrder;
 import com.fs.system.service.ISysConfigService;
-import com.github.binarywang.wxpay.bean.entpay.EntPayResult;
+import com.fs.wx.miniapp.config.WxMaConfiguration;
+import com.fs.wx.miniapp.config.WxMaProperties;
+import com.fs.wx.pay.config.WxPayProperties;
 import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
 import com.github.binarywang.wxpay.config.WxPayConfig;
 import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.EntPayService;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
-import com.google.gson.Gson;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import lombok.Synchronized;
 import me.chanjar.weixin.common.error.WxErrorException;
-import org.apache.catalina.servlets.DefaultServlet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -78,8 +61,6 @@ import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 
-
-
 @Api("商城接口")
 @RestController
 @RequestMapping(value="/app/storeOrder")
@@ -241,7 +222,6 @@ public class StoreOrderController extends  AppBaseController {
     //@Synchronized
     public R pay(HttpServletRequest request, @Validated @RequestBody FsStoreOrderPayParam param)
     {
-        logger.info("zzf \n【pay】:"+param.getOrderId()+"的订单支付类型为"+param.getPayType());
         FsStoreOrder order=orderService.selectFsStoreOrderById(param.getOrderId());
         if(order==null){
             return R.error("订单不存在");
@@ -259,6 +239,7 @@ public class StoreOrderController extends  AppBaseController {
             //已改价处理
             if(order.getIsEditMoney()!=null&&order.getIsEditMoney()==1){
                 //改过价不做处理
+
             }
             else{
                 String config=configService.selectConfigByKey("store.config");
@@ -285,7 +266,6 @@ public class StoreOrderController extends  AppBaseController {
             }
             String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
 //            order.setOrderCode(orderCode);
-            //易宝支付
             if(order.getPayType().equals("1")||order.getPayType().equals("2")){
                 String json = configService.selectConfigByKey("store.pay");
                 FsPayConfig fsPayConfig = JSON.parseObject(json, FsPayConfig.class);
@@ -306,29 +286,6 @@ public class StoreOrderController extends  AppBaseController {
                 storePayment.setOrderId(order.getId());
                 fsStorePaymentMapper.insertFsStorePayment(storePayment);
 
-//                //创建订单
-//                WxJspayDTO p = new WxJspayDTO();
-//                // 使用setter方法为对象赋值
-//                p.setPayMoney(order.getPayMoney().toString());
-//                p.setLowOrderId("store-"+payCode);
-//                p.setBody("商城订单支付");
-//                p.setIsMinipg("1");
-//                p.setReturnUrl(PayConfig.notifyUrl);
-//                p.setOpenId(user.getMaOpenId());
-//                p.setAttach("");
-//                p.setStoreid("0");
-//                CreateWxOrderResult wxOrder = ybPayService.createWxOrder(p);
-//                if(wxOrder.getStatus().equals("100")){
-//                    FsStorePayment ment=new FsStorePayment();
-//                    ment.setPaymentId(storePayment.getPaymentId());
-//                    ment.setTradeNo(wxOrder.getUpOrderId());
-//                    fsStorePaymentMapper.updateFsStorePayment(ment);
-//                    redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
-//                    return R.ok().put("payType",param.getPayType()).put("result",wxOrder.getPay_info());
-//                }
-//                else{
-//                    return R.error(wxOrder.getMessage());
-//                }
                 if (fsPayConfig.getType().equals("hf")){
                     HuiFuCreateOrder o = new HuiFuCreateOrder();
                     o.setTradeType("T_MINIAPP");
@@ -337,7 +294,7 @@ public class StoreOrderController extends  AppBaseController {
                     o.setTransAmt(storePayment.getPayMoney().toString());
                     o.setGoodsDesc("商城订单支付");
                     HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                    if(result.getBank_code()!=null&&result.getBank_code().equals("00000000")){
+                    if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
                         FsStorePayment mt=new FsStorePayment();
                         mt.setPaymentId(storePayment.getPaymentId());
                         mt.setTradeNo(result.getHf_seq_id());
@@ -520,14 +477,17 @@ public class StoreOrderController extends  AppBaseController {
                 o.setGoodsDesc("商城订单尾款支付");
                 HuifuCreateOrderResult result = huiFuService.createOrder(o);
                 //创建订单
-                if(result.getBank_code()!=null&&result.getBank_code().equals("00000000")){
+                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+
                     FsStorePayment mt=new FsStorePayment();
                     mt.setPaymentId(storePayment.getPaymentId());
                     mt.setTradeNo(result.getHf_seq_id());
                     fsStorePaymentMapper.updateFsStorePayment(mt);
                     redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
                     Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
-                    return R.ok().put("result",resultMap);
+                    String s = (String) resultMap.get("package");
+                    resultMap.put("packageValue",s);
+                    return R.ok().put("payType",param.getPayType()).put("result",resultMap);
                 }
                 else{
                     return R.error(result.getResp_desc());
@@ -635,13 +595,16 @@ public class StoreOrderController extends  AppBaseController {
                 o.setTransAmt(storePayment.getPayMoney().toString());
                 o.setGoodsDesc("商城订单支付");
                 HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                if(result.getBank_code()!=null&&result.getBank_code().equals("00000000")){
+                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+
                     FsStorePayment mt=new FsStorePayment();
                     mt.setPaymentId(storePayment.getPaymentId());
                     mt.setTradeNo(result.getHf_seq_id());
                     fsStorePaymentMapper.updateFsStorePayment(mt);
                     redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
                     Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
+                    String s = (String) resultMap.get("package");
+                    resultMap.put("packageValue",s);
                     return R.ok().put("result",resultMap);
                 }
                 else{
@@ -752,13 +715,16 @@ public class StoreOrderController extends  AppBaseController {
                 o.setTransAmt(storePayment.getPayMoney().toString());
                 o.setGoodsDesc("商城订单支付");
                 HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                if(result.getBank_code()!=null&&result.getBank_code().equals("00000000")){
+                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+
                     FsStorePayment mt=new FsStorePayment();
                     mt.setPaymentId(storePayment.getPaymentId());
                     mt.setTradeNo(result.getHf_seq_id());
                     fsStorePaymentMapper.updateFsStorePayment(mt);
                     redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
                     Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
+                    String s = (String) resultMap.get("package");
+                    resultMap.put("packageValue",s);
                     return R.ok().put("result",resultMap);
                 }
                 else{

+ 183 - 102
fs-user-app/src/main/java/com/fs/app/controller/WxUserController.java

@@ -1,43 +1,40 @@
 package com.fs.app.controller;
 
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
+import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import cn.hutool.core.date.DateTime;
-import cn.hutool.core.util.StrUtil;
 import com.fs.app.annotation.Login;
 import com.fs.app.utils.JwtUtils;
 import com.fs.common.core.domain.R;
-import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.CustomException;
-import com.fs.common.utils.OrderUtils;
-import com.fs.store.param.LoginMpWxParam;
 import com.fs.common.utils.IpUtil;
-import com.fs.wx.miniapp.config.WxMaConfiguration;
-import com.fs.wx.miniapp.config.WxMaProperties;
+import com.fs.common.utils.OrderUtils;
 import com.fs.store.domain.FsUser;
+import com.fs.store.param.LoginMpWxParam;
 import com.fs.store.param.LoginWxParam;
 import com.fs.store.service.IFsUserService;
-import com.fs.wx.mp.config.WxMpConfiguration;
+import com.fs.wx.miniapp.config.WxMaConfiguration;
+import com.fs.wx.miniapp.config.WxMaProperties;
 import com.fs.wx.mp.config.WxMpProperties;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.Synchronized;
 import me.chanjar.weixin.common.bean.WxOAuth2UserInfo;
 import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
+import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.mp.api.WxMpService;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.*;
-
-import cn.binarywang.wx.miniapp.api.WxMaService;
-import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
-import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
-import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
-import me.chanjar.weixin.common.error.WxErrorException;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import java.util.Date;
-import java.util.concurrent.TimeUnit;
 
 /**
  * 微信小程序用户接口
@@ -66,103 +63,187 @@ public class WxUserController extends AppBaseController{
      */
     @ApiOperation("登录")
     @PostMapping("/login")
-    public R login( @RequestBody LoginMpWxParam param) {
+    public R login(@RequestBody LoginMpWxParam param) {
         if (StringUtils.isBlank(param.getCode())) {
             return R.error("code不存在");
         }
+
         final WxMaService wxService = WxMaConfiguration.getMaService(maProperties.getConfigs().get(0).getAppid());
         try {
+            // 获取微信会话信息
             WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
-            this.logger.info(session.getSessionKey());
-            this.logger.info(session.getOpenid());
-            // 解密
-            WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
-            FsUser user=userService.selectFsUserByMaOpenId(session.getOpenid());
+            logger.info("获取微信会话信息成功 - openid: {}, sessionKey: {}", session.getOpenid(), session.getSessionKey());
+
+            // 获取手机号信息
+            WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(
+                session.getSessionKey(),
+                param.getEncryptedData(),
+                param.getIv()
+            );
+            logger.info("获取手机号信息成功 - phone: {}", phoneNoInfo.getPhoneNumber());
+
+            // 获取用户IP
             String ip = IpUtil.getRequestIp();
-            if(user==null){
-                //查询手机号是否存在,如果存在,更新
-                FsUser checkPhone=userService.selectFsUserByPhone(phoneNoInfo.getPhoneNumber());
-                if(checkPhone!=null){
-                    if(checkPhone.getMaOpenId()==null){
-                        user=checkPhone;
-                        FsUser userMap=new FsUser();
-                        userMap.setMaOpenId(session.getOpenid());
-                        userMap.setUserId(checkPhone.getUserId());
-                        userMap.setUpdateTime(new DateTime());
-                        userMap.setLastIp(ip);
-                        userService.updateFsUser(userMap);
-                    }
-                    else{
-                        throw new CustomException("此手机号已存在");
-                    }
-                }
-                else{
-                    //写入
-                    user=new FsUser();
-                    if(StringUtils.isNotEmpty(param.getUserCode())){
-                        FsUser tuiUser=userService.selectFsUserByUserCode(param.getUserCode());
-                        if(tuiUser!=null){
-                            user.setIsPromoter(1);
-                            user.setSpreadUserId(tuiUser.getUserId());
-                        }
-                    }
-                    user.setUserCode(OrderUtils.genUserCode());
-                    user.setPhone(phoneNoInfo.getPhoneNumber());
-                    user.setUsername(phoneNoInfo.getPhoneNumber());
-                    user.setNickname("微信用户");
-                    user.setStatus(1);
-                    user.setMaOpenId(session.getOpenid());
-                    user.setLastIp(ip);
-                    user.setIsWeixinAuth(0);
-                    user.setCreateTime(new Date());
-                    userService.insertFsUser(user);
-                }
-           }
-           else{
-               FsUser userMap=new FsUser();
-               userMap.setPhone(phoneNoInfo.getPhoneNumber());
-               userMap.setUserId(user.getUserId());
-               userMap.setUpdateTime(new DateTime());
-               userMap.setLastIp(ip);
-               userService.updateFsUser(userMap);
-           }
-           String token = jwtUtils.generateToken(user.getUserId());
-           return R.ok("登录成功").put("token",token).put("user", user);
+
+            // 查找或创建用户
+            FsUser user = findOrCreateUser(session, phoneNoInfo, ip, param.getUserCode());
+
+            // 生成token
+            String token = jwtUtils.generateToken(user.getUserId());
+
+            // 记录登录日志
+            logger.info("用户登录成功 - userId: {}, phone: {}", user.getUserId(), user.getPhone());
+
+            return R.ok("登录成功")
+                .put("token", token)
+                .put("user", user);
+
         } catch (WxErrorException e) {
-            //this.logger.error(e.getMessage(), e);
-            return R.error("授权失败,"+e.getMessage());
+            logger.error("微信授权失败: {}", e.getMessage(), e);
+            return R.error("授权失败: " + e.getMessage());
+        } catch (CustomException e) {
+            logger.error("业务处理异常: {}", e.getMessage(), e);
+            return R.error(e.getMessage());
+        } catch (Exception e) {
+            logger.error("系统异常: {}", e.getMessage(), e);
+            return R.error("系统异常,请稍后重试");
+        }
+    }
+
+    /**
+     * 查找或创建用户
+     */
+    private FsUser findOrCreateUser(WxMaJscode2SessionResult session,
+                                  WxMaPhoneNumberInfo phoneNoInfo,
+                                  String ip,
+                                  String userCode) {
+        // 优先通过unionid查找用户
+        FsUser user = null;
+        if (session.getUnionid() != null) {
+            user = userService.selectFsUserByUnionid(session.getUnionid());
+            if (user == null) {
+                user = userService.selectFsUserByMaOpenId(session.getOpenid());
+            }
+        } else {
+            user = userService.selectFsUserByMaOpenId(session.getOpenid());
+        }
+
+        if (user == null) {
+            // 检查手机号是否已存在
+            FsUser checkPhone = userService.selectFsUserByPhone(phoneNoInfo.getPhoneNumber());
+            if (checkPhone != null) {
+                if (checkPhone.getMaOpenId() == null) {
+                    // 更新已存在用户的信息
+                    user = updateExistingUser(checkPhone, session, ip);
+                } else {
+                    throw new CustomException("此手机号已被其他微信账号绑定");
+                }
+            } else {
+                // 创建新用户
+                user = createNewUser(session, phoneNoInfo, ip, userCode);
+            }
+        } else {
+            // 更新用户信息
+            updateUserInfo(user, phoneNoInfo, ip);
+        }
+
+        return user;
+    }
+
+    /**
+     * 更新已存在用户的信息
+     */
+    private FsUser updateExistingUser(FsUser existingUser, WxMaJscode2SessionResult session, String ip) {
+        FsUser userMap = new FsUser();
+        userMap.setMaOpenId(session.getOpenid());
+        userMap.setUserId(existingUser.getUserId());
+        userMap.setUpdateTime(new DateTime());
+        userMap.setLastIp(ip);
+        if (session.getUnionid() != null) {
+            userMap.setUnionId(session.getUnionid());
+        }
+        userService.updateFsUser(userMap);
+        return existingUser;
+    }
+
+    /**
+     * 创建新用户
+     */
+    private FsUser createNewUser(WxMaJscode2SessionResult session,
+                               WxMaPhoneNumberInfo phoneNoInfo,
+                               String ip,
+                               String userCode) {
+        FsUser user = new FsUser();
+
+        // 处理推荐关系
+        if (StringUtils.isNotEmpty(userCode)) {
+            FsUser tuiUser = userService.selectFsUserByUserCode(userCode);
+            if (tuiUser != null) {
+                user.setIsPromoter(1);
+                user.setSpreadUserId(tuiUser.getUserId());
+            }
         }
+
+        // 设置用户基本信息
+        user.setUserCode(OrderUtils.genUserCode());
+        user.setPhone(phoneNoInfo.getPhoneNumber());
+        user.setUsername(phoneNoInfo.getPhoneNumber());
+        user.setNickname("微信用户");
+        user.setStatus(1);
+        user.setMaOpenId(session.getOpenid());
+        user.setLastIp(ip);
+        user.setIsWeixinAuth(0);
+        user.setCreateTime(new Date());
+
+        if (session.getUnionid() != null) {
+            user.setUnionId(session.getUnionid());
+        }
+
+        userService.insertFsUser(user);
+        return user;
+    }
+
+    /**
+     * 更新用户信息
+     */
+    private void updateUserInfo(FsUser user, WxMaPhoneNumberInfo phoneNoInfo, String ip) {
+        FsUser userMap = new FsUser();
+        userMap.setPhone(phoneNoInfo.getPhoneNumber());
+        userMap.setUserId(user.getUserId());
+        userMap.setUpdateTime(new DateTime());
+        userMap.setLastIp(ip);
+        userService.updateFsUser(userMap);
     }
 
-//    /**
-//     * <pre>
-//     * 获取微信用户信息
-//     * </pre>
-//     */
-//    @Login
-//    @ApiOperation("获取微信小程序用户信息")
-//    @PostMapping("/getWeixinInfo")
-//    public R getWeixinInfo(@RequestBody LoginMpWxParam param) {
-//        final WxMaService wxService = WxMaConfiguration.getMaService(maProperties.getConfigs().get(0).getAppid());
-//        try {
-//            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
-//            // 用户信息校验
-//            if (!wxService.getUserService().checkUserInfo(session.getSessionKey(), param.getRawData(), param.getSignature())) {
-//                return R.error("user check failed");
-//            }
-//            // 解密用户信息
-//            WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
-//            FsUser user=userService.selectFsUserById(Long.parseLong(getUserId()));
-//            user.setNickname(userInfo.getNickName());
-//            user.setAvatar(userInfo.getAvatarUrl());
-//            user.setIsWeixinAuth(1);
-//            userService.updateFsUser(user);
-//            return R.ok();
-//        } catch (WxErrorException e) {
-//            e.printStackTrace();
-//        }
-//        return R.ok("授权成功");
-//    }
+    /**
+     * <pre>
+     * 获取微信用户信息
+     * </pre>
+     */
+    @Login
+    @ApiOperation("获取微信小程序用户信息")
+    @PostMapping("/getWeixinInfo")
+    public R getWeixinInfo(@RequestBody LoginMpWxParam param) {
+        final WxMaService wxService = WxMaConfiguration.getMaService(maProperties.getConfigs().get(0).getAppid());
+        try {
+            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
+            // 用户信息校验
+            if (!wxService.getUserService().checkUserInfo(session.getSessionKey(), param.getRawData(), param.getSignature())) {
+                return R.error("user check failed");
+            }
+            // 解密用户信息
+            WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
+            FsUser user=userService.selectFsUserById(Long.parseLong(getUserId()));
+            user.setNickname(userInfo.getNickName());
+            user.setAvatar(userInfo.getAvatarUrl());
+            user.setIsWeixinAuth(1);
+            userService.updateFsUser(user);
+            return R.ok();
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+        }
+        return R.ok("授权成功");
+    }
 
     @ApiOperation("小程序登录")
     @PostMapping("/loginByMiniApp")

+ 1 - 1
fs-user-app/src/main/resources/application.yml

@@ -25,7 +25,7 @@ fs:
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为8113
-  port: 8113
+  port: 7014
   servlet:
     # 应用的访问路径
     context-path: /

Vissa filer visades inte eftersom för många filer har ändrats