Преглед изворни кода

小程序下单接口优化
菜单优化

lk пре 11 часа
родитељ
комит
c39f474ada

+ 0 - 77
java/fs-saas-company/src/main/java/com/fs/company/controller/company/CompanyAuxiliaryController.java

@@ -46,8 +46,6 @@ public class CompanyAuxiliaryController extends BaseController
     @Autowired private ICompanyUserRoleService companyUserRoleService;
     @Autowired private ICompanySmsLogsService companySmsLogsService;
     @Autowired private ICompanyVoiceLogsService companyVoiceLogsService;
-    @Autowired private ICompanyScheduleService companyScheduleService;
-    @Autowired private ICompanyScheduleReportService companyScheduleReportService;
     @Autowired private ICompanyTrafficService companyTrafficService;
     @Autowired private ICompanyTrafficLogService companyTrafficLogService;
     @Autowired private ICompanyRedPacketService companyRedPacketService;
@@ -395,81 +393,6 @@ public class CompanyAuxiliaryController extends BaseController
         return companyUserRoleList();
     }
 
-    // ==========================================
-    // 排班 - ICompanyScheduleService
-    // ==========================================
-
-    @GetMapping("/company/schedule/list")
-    public TableDataInfo companyScheduleList() {
-        List<CompanySchedule> list = companyScheduleService.selectCompanyScheduleList(new CompanySchedule());
-        return getDataTable(list);
-    }
-
-    @GetMapping("/company/schedule/")
-    public TableDataInfo companyScheduleBaseSlash() {
-        return companyScheduleList();
-    }
-
-    @GetMapping("/company/schedule")
-    public TableDataInfo companyScheduleBase() {
-        return companyScheduleList();
-    }
-
-    @GetMapping("/company/schedule/export")
-    public TableDataInfo companyScheduleExport() {
-        return companyScheduleList();
-    }
-
-    @GetMapping("/company/schedule/getTcmScheduleList")
-    public TableDataInfo companyScheduleGetTcmScheduleList() {
-        return companyScheduleList();
-    }
-
-    @GetMapping("/company/index/getCount")
-    public TableDataInfo companyIndexGetCount() {
-        return companyScheduleList();
-    }
-
-    // ==========================================
-    // 排班报表 - ICompanyScheduleReportService
-    // ==========================================
-
-    @GetMapping("/company/scheduleReport/list")
-    public TableDataInfo companyScheduleReportList() {
-        List<CompanyScheduleReport> list = companyScheduleReportService.selectCompanyScheduleReportList(new CompanyScheduleReport());
-        return getDataTable(list);
-    }
-
-    @GetMapping("/company/scheduleReport/")
-    public TableDataInfo companyScheduleReportBaseSlash() {
-        return companyScheduleReportList();
-    }
-
-    @GetMapping("/company/scheduleReport")
-    public TableDataInfo companyScheduleReportBase() {
-        return companyScheduleReportList();
-    }
-
-    @GetMapping("/company/scheduleReport/exportStatistics")
-    public TableDataInfo companyScheduleReportExportStatistics() {
-        return companyScheduleReportList();
-    }
-
-    @GetMapping("/company/scheduleReport/getAllScheduleList")
-    public TableDataInfo companyScheduleReportGetAllScheduleList() {
-        return companyScheduleReportList();
-    }
-
-    @GetMapping("/company/scheduleReport/getScheduleList")
-    public TableDataInfo companyScheduleReportGetScheduleList() {
-        return companyScheduleReportList();
-    }
-
-    @GetMapping("/company/scheduleReport/statistics")
-    public TableDataInfo companyScheduleReportStatistics() {
-        return companyTrafficList();
-    }
-
     // ==========================================
     // 流量 - ICompanyTrafficService
     // ==========================================

+ 1 - 1
java/fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -53,7 +53,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectFsUserVo">
-        select user_id,qw_ext_id,sex,is_buy,`level`,course_ma_open_id,is_push,is_add_qw,source,login_device,is_individuation_push,store_open_id,password,jpush_id, is_vip,vip_start_date,vip_end_date,vip_level,vip_status,nick_name,integral_status, avatar, phone, integral,sign_num, status, tui_user_id, tui_time, tui_user_count, ma_open_id, mp_open_id, union_id, is_del, user_code, remark, create_time, update_time, last_ip, balance,is_weixin_auth,parent_id,qw_user_id,app_id,company_id,company_user_id,is_promoter,now_money,brokerage_price,spread_user_id, spread_time,pay_count, spread_count,user_type from fs_user
+        select user_id,qw_ext_id,sex,is_buy,`level`,course_ma_open_id,is_push,is_add_qw,source,login_device,is_individuation_push,store_open_id,password,jpush_id, is_vip,vip_start_date,vip_end_date,vip_level,vip_status,nick_name,integral_status, avatar, phone, integral,sign_num, status, tui_user_id, tui_time, tui_user_count, ma_open_id, mp_open_id, union_id, is_del, user_code, remark, create_time, update_time, last_ip, balance,is_weixin_auth,parent_id,qw_user_id,app_id,company_id,company_user_id,is_promoter,now_money,brokerage_price,spread_user_id, spread_time,pay_count, spread_count,user_type,is_show from fs_user
     </sql>
 
     <select id="selectFsUserList" resultMap="FsUserResult">

+ 138 - 0
java/fs-user-app/src/main/java/com/fs/app/controller/AddressController.java

@@ -0,0 +1,138 @@
+package com.fs.app.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.fs.app.annotation.Login;
+import com.fs.app.utils.CityTreeUtil;
+import com.fs.app.vo.CityVO;
+import com.fs.common.core.domain.R;
+import com.fs.hisStore.domain.FsCityScrm;
+import com.fs.hisStore.domain.FsUserAddressScrm;
+import com.fs.hisStore.param.FsAddressParseParam;
+import com.fs.hisStore.param.FsUserAddressAddEditParam;
+import com.fs.hisStore.service.IFsCityScrmService;
+import com.fs.hisStore.service.IFsExpressScrmService;
+import com.fs.hisStore.service.IFsUserAddressScrmService;
+import com.google.common.collect.Lists;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.Cacheable;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import java.util.List;
+
+import static com.fs.framework.datasource.DynamicDataSourceContextHolder.log;
+
+@Api("地址接口")
+@RestController
+@RequestMapping(value = "/app/address")
+public class AddressController extends AppBaseController {
+
+    @Autowired
+    private IFsCityScrmService cityService;
+
+    @Autowired
+    private IFsUserAddressScrmService addressService;
+
+    @Autowired
+    private IFsExpressScrmService expressService;
+
+    @Login
+    @ApiOperation("获取城市数据")
+    @GetMapping("/getCitys")
+    @Cacheable("cityData")
+    public R getCitys(HttpServletRequest request) {
+        List<FsCityScrm> list = cityService.selectFsCitys();
+        List<CityVO> cityVOS = Lists.newArrayList();
+        for (FsCityScrm city : list) {
+            CityVO cityVO = new CityVO();
+            cityVO.setV(city.getCityId());
+            cityVO.setN(city.getCityName());
+            cityVO.setPid(city.getParentId());
+            cityVOS.add(cityVO);
+        }
+        return R.ok().put("data", CityTreeUtil.list2TreeConverter(cityVOS, "0"));
+    }
+
+    @Login
+    @GetMapping("/getAddressList")
+    public R getAddressList(HttpServletRequest request) {
+        try {
+            FsUserAddressScrm map = new FsUserAddressScrm();
+            map.setUserId(Long.parseLong(getUserId()));
+            map.setIsDel(0);
+            List<FsUserAddressScrm> list = addressService.selectFsUserAddressList(map);
+            return R.ok().put("data", list);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return R.error("操作异常");
+        }
+    }
+
+    @Login
+    @ApiOperation("地址解析")
+    @PostMapping("/parseAddress")
+    public R parseAddress(@RequestBody FsAddressParseParam param) {
+        return expressService.parseAddress(param.getContent());
+    }
+
+    @Login
+    @ApiOperation("添加地址")
+    @PostMapping("/addAddress")
+    public R addAddress(@Valid @RequestBody FsUserAddressAddEditParam address, HttpServletRequest request) {
+        Integer count = addressService.selectFsUserAddressCountsByUserId(Long.parseLong(getUserId()));
+        if (count > 20) {
+            return R.error("最多可创建20个地址");
+        }
+        address.setUserId(Long.parseLong(getUserId()));
+        if (address.getIsDefault() == 1) {
+            addressService.clearIsDefalut(Long.parseLong(getUserId()));
+        }
+        address.setPhone(address.getPhone().trim());
+        FsUserAddressScrm userAddress = new FsUserAddressScrm();
+        BeanUtil.copyProperties(address, userAddress);
+        addressService.insertFsUserAddress(userAddress);
+        return R.ok("操作成功").put("addressId", userAddress.getId());
+    }
+
+    @Login
+    @GetMapping("/getAddressById")
+    public R getAddressById(@RequestParam("id") Long id, HttpServletRequest request) {
+        FsUserAddressScrm address = addressService.selectFsUserAddressById(id);
+        if (!address.getUserId().equals(Long.parseLong(getUserId()))) {
+            return R.error("非法操作");
+        }
+        return R.ok().put("data", address);
+    }
+
+    @Login
+    @ApiOperation("删除地址")
+    @PostMapping("/delAddress")
+    public R delAddress(@RequestBody FsUserAddressAddEditParam address, HttpServletRequest request) {
+        addressService.deleteFsUserAddressById(address.getId());
+        return R.ok("操作成功");
+    }
+
+    @Login
+    @ApiOperation("编辑地址")
+    @PostMapping("/editAddress")
+    public R editAddress(@Valid @RequestBody FsUserAddressAddEditParam address, HttpServletRequest request) {
+        if (address.getIsDefault() == 1) {
+            addressService.clearIsDefalut(Long.parseLong(getUserId()));
+        }
+        FsUserAddressScrm userAddress = new FsUserAddressScrm();
+        BeanUtil.copyProperties(address, userAddress);
+        addressService.updateFsUserAddress(userAddress);
+        return R.ok("操作成功");
+    }
+
+    @Login
+    @ApiOperation("删除所有地址")
+    @PostMapping("/delAllAddress")
+    public R delAllAddress(HttpServletRequest request) {
+        addressService.delAllAddress(Long.parseLong(getUserId()));
+        return R.ok("操作成功");
+    }
+}

+ 12 - 0
java/fs-user-app/src/main/java/com/fs/app/controller/AdvController.java

@@ -6,14 +6,18 @@ import com.fs.app.utils.JwtUtils;
 import com.fs.common.core.domain.R;
 import com.fs.his.domain.FsAdv;
 import com.fs.his.service.IFsAdvService;
+import com.fs.hisStore.service.IFsAdvScrmService;
+import com.fs.hisStore.vo.FsAdvListQueryVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 
 
@@ -25,6 +29,8 @@ public class AdvController {
     JwtUtils jwtUtils;
 	@Autowired
 	private IFsAdvService advService;
+	@Autowired
+	private IFsAdvScrmService advScrmService;
 
 //	@Cacheable(value="getAdvList", key="#map")
 	@ApiOperation("获取首页广告位")
@@ -42,5 +48,11 @@ public class AdvController {
 		return R.ok().put("data",list);
 	}
 
+	@ApiOperation("获取广告")
+	@GetMapping("/getAdv")
+	public R getAdv(@RequestParam(value = "advType") Integer advType, HttpServletRequest request) {
+		List<FsAdvListQueryVO> advList = advScrmService.selectFsAdvListQuery(advType);
+		return R.ok().put("data", advList);
+	}
 
 }

+ 41 - 2
java/fs-user-app/src/main/java/com/fs/app/controller/ArticleController.java

@@ -1,11 +1,11 @@
 package com.fs.app.controller;
 
 
+import com.fs.app.annotation.Login;
 import com.fs.app.utils.JwtUtils;
 import com.fs.common.core.domain.R;
 import com.fs.his.domain.FsArticle;
 import com.fs.his.domain.FsArticleCate;
-import com.fs.his.domain.FsDepartment;
 import com.fs.his.param.BaseParam;
 import com.fs.his.param.FsArticleListUParam;
 import com.fs.his.service.IFsArticleCateService;
@@ -14,6 +14,12 @@ import com.fs.his.service.IFsDepartmentService;
 import com.fs.his.service.IFsDoctorArticleService;
 import com.fs.his.vo.FsArticleListUVO;
 import com.fs.his.vo.FsDoctorListUVO;
+import com.fs.hisStore.service.IFsArticleCateScrmService;
+import com.fs.hisStore.service.IFsArticleScrmService;
+import com.fs.hisStore.service.IFsArticleViewsScrmService;
+import com.fs.hisStore.vo.FsArticleCateListQueryVO;
+import com.fs.hisStore.vo.FsArticleViewListQueryVO;
+import com.fs.hisStore.domain.FsArticleScrm;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
@@ -21,6 +27,7 @@ import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
@@ -34,7 +41,7 @@ import java.util.Map;
 @Api("文章接口")
 @RestController
 @RequestMapping(value="/app/article")
-public class ArticleController {
+public class ArticleController extends AppBaseController {
 	@Autowired
     JwtUtils jwtUtils;
 	@Autowired
@@ -43,6 +50,15 @@ public class ArticleController {
 	@Autowired
 	private IFsArticleCateService articleCateService;
 
+	@Autowired
+	private IFsArticleCateScrmService articleCateScrmService;
+
+	@Autowired
+	private IFsArticleScrmService articleScrmService;
+
+	@Autowired
+	private IFsArticleViewsScrmService viewsService;
+
 	@Cacheable(value="getArticleCateList", key = "#status != null ? #status : 'getArticleCateList'")
 	@ApiOperation("获取文章分类列表")
 	@GetMapping("/getArticleCateList")
@@ -76,4 +92,27 @@ public class ArticleController {
 		return R.ok().put("data",article);
 	}
 
+	@ApiOperation("获取文章分类")
+	@GetMapping("/getArticleCate")
+	public R getArticleCate(HttpServletRequest request) {
+		List<FsArticleCateListQueryVO> cates = articleCateScrmService.selectFsArticleCateListQuery();
+		return R.ok().put("data", cates);
+	}
+
+	@Login
+	@ApiOperation("更新阅读数")
+	@PostMapping("/updateView")
+	public R updateView(@RequestParam("articleId") Long articleId) {
+		viewsService.updateView(articleId, Long.parseLong(getUserId()));
+		return R.ok();
+	}
+
+	@ApiOperation("获取文章详情")
+	@GetMapping("/getArticleByArticleId")
+	public R getArticleByArticleId(@RequestParam("articleId") Integer articleId) {
+		FsArticleScrm article = articleScrmService.selectFsArticleById(articleId);
+		List<FsArticleViewListQueryVO> viewsList = viewsService.selectFsArticleViewsTopByArticleId(articleId);
+		return R.ok().put("data", article).put("views", viewsList);
+	}
+
 }

+ 12 - 0
java/fs-user-app/src/main/java/com/fs/app/controller/CommonController.java

@@ -51,6 +51,7 @@ import com.fs.his.service.*;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.hisStore.config.StoreConfig;
 import com.fs.hisStore.enums.SysConfigEnum;
+import com.fs.hisStore.service.IFsWechatTemplateScrmService;
 import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
 import com.fs.qw.domain.FsAppContactWay;
@@ -139,6 +140,9 @@ public class CommonController {
 	@Autowired
 	private IFsAdvSemService advSemService;
 
+	@Autowired
+	private IFsWechatTemplateScrmService wechatTemplateService;
+
 	@Autowired
 	private IQwAppContactWayService qwAppContactWayService;
 	@Autowired
@@ -746,4 +750,12 @@ public class CommonController {
 		data.put("businessUrl", businessDomain);
 		return R.ok().put("data", data);
 	}
+
+	@ApiOperation("获取微信模板")
+	@GetMapping("/getWeixinOrderTemps")
+	@Cacheable(value = "orderTemps")
+	public R getWeixinOrderTemps() {
+		List<String> temp = wechatTemplateService.selectFsWechatTemplateIdsByKeys("delivery_success,finish_success,cancel_success");
+		return R.ok().put("temp", temp);
+	}
 }

+ 39 - 2
java/fs-user-app/src/main/java/com/fs/app/controller/CouponController.java

@@ -3,13 +3,12 @@ package com.fs.app.controller;
 
 import cn.hutool.Hutool;
 import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.IdUtil;
 import com.fs.app.annotation.Login;
-import com.fs.common.annotation.Log;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
-import com.fs.common.enums.BusinessType;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.his.domain.FsCoupon;
@@ -17,6 +16,9 @@ import com.fs.his.param.*;
 import com.fs.his.service.IFsCouponService;
 import com.fs.his.service.IFsUserCouponService;
 import com.fs.his.vo.FsCouponListUVO;
+import com.fs.hisStore.domain.FsStoreCouponUserScrm;
+import com.fs.hisStore.param.FsCouponUserEnableParam;
+import com.fs.hisStore.service.IFsStoreCouponUserScrmService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
@@ -29,6 +31,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 
 @Api("优惠券接口")
@@ -48,6 +51,9 @@ public class CouponController extends  AppBaseController {
     @Autowired
     private ICompanyUserService companyUserService;
 
+    @Autowired
+    private IFsStoreCouponUserScrmService fsStoreCouponUserService;
+
     @ApiOperation("获取优惠券列表")
     @GetMapping("/getCouponList")
     public R getCouponList(FsCouponListUParam param)
@@ -113,5 +119,36 @@ public class CouponController extends  AppBaseController {
         return toAjax(fsUserCouponService.sendFsUserCoupon(fsUserCoupon));
     }
 
+    @Login
+    @ApiOperation("获取我的优惠券列表")
+    @GetMapping("/getMyCouponList")
+    public R getMyCouponList(HttpServletRequest request) {
+        try {
+            FsStoreCouponUserScrm map = new FsStoreCouponUserScrm();
+            map.setIsDel(0);
+            map.setStatus(0);
+            map.setUserId(Long.parseLong(getUserId()));
+//            map.setExcludeExpired(true);
+            List<FsStoreCouponUserScrm> list = fsStoreCouponUserService.selectFsStoreCouponUserList(map);
+            return R.ok().put("data", list);
+        } catch (Exception e) {
+            return R.error("操作异常");
+        }
+    }
+
+    @Login
+    @ApiOperation("获取我的可用优惠券列表")
+    @GetMapping("/getMyEnableCouponList")
+    public R getMyEnableCouponList(FsCouponUserEnableParam param, HttpServletRequest request) {
+        try {
+            param.setUserId(Long.parseLong(getUserId()));
+            List<FsStoreCouponUserScrm> list = fsStoreCouponUserService.selectFsStoreCouponUserListByEnable(param);
+            list = list.stream().filter(s -> (s.getCouponPrice().compareTo(param.getUseMinPrice()) == -1)).collect(Collectors.toList());
+            list = list.stream().filter(s -> (s.getUseMinPrice().compareTo(param.getUseMinPrice()) == -1)).collect(Collectors.toList());
+            return R.ok().put("data", list);
+        } catch (Exception e) {
+            return R.error("操作异常");
+        }
+    }
 
 }

+ 192 - 0
java/fs-user-app/src/main/java/com/fs/app/controller/ProductController.java

@@ -3,18 +3,43 @@ package com.fs.app.controller;
 import com.fs.app.annotation.Login;
 import com.fs.common.core.domain.R;
 import com.fs.common.param.BaseQueryParam;
+import com.fs.common.utils.StringUtils;
+import com.fs.hisStore.domain.FsStoreProductAttrScrm;
+import com.fs.hisStore.domain.FsStoreProductAttrValueScrm;
+import com.fs.hisStore.domain.FsStoreProductCategoryScrm;
+import com.fs.hisStore.domain.FsStoreProductPurchaseLimitScrm;
+import com.fs.hisStore.domain.FsStoreProductRelationScrm;
+import com.fs.hisStore.domain.FsStoreScrm;
+import com.fs.hisStore.param.FsStoreCartCountParam;
+import com.fs.hisStore.param.FsStoreCartDelParam;
+import com.fs.hisStore.param.FsStoreCartParam;
+import com.fs.hisStore.param.FsStoreProductQueryParam;
+import com.fs.hisStore.service.IFsStoreCartScrmService;
+import com.fs.hisStore.service.IFsStoreProductAttrScrmService;
+import com.fs.hisStore.service.IFsStoreProductAttrValueScrmService;
+import com.fs.hisStore.service.IFsStoreProductCategoryScrmService;
+import com.fs.hisStore.service.IFsStoreProductPurchaseLimitScrmService;
+import com.fs.hisStore.service.IFsStoreProductRelationScrmService;
 import com.fs.hisStore.service.IFsStoreProductScrmService;
+import com.fs.hisStore.service.IFsStoreScrmService;
+import com.fs.hisStore.vo.FsStoreCartVO;
 import com.fs.hisStore.vo.FsStoreProductListQueryVO;
+import com.fs.hisStore.vo.FsStoreProductQueryVO;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
+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.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -30,6 +55,27 @@ public class ProductController extends AppBaseController {
 	@Autowired
 	private IFsStoreProductScrmService productService;
 
+	@Autowired
+	private IFsStoreCartScrmService cartService;
+
+	@Autowired
+	private IFsStoreScrmService storeScrmService;
+
+	@Autowired
+	private IFsStoreProductAttrScrmService attrService;
+
+	@Autowired
+	private IFsStoreProductAttrValueScrmService attrValueService;
+
+	@Autowired
+	private IFsStoreProductRelationScrmService productRelationService;
+
+	@Autowired
+	private IFsStoreProductPurchaseLimitScrmService purchaseLimitService;
+
+	@Autowired
+	private IFsStoreProductCategoryScrmService categoryService;
+
 	@ApiOperation("获取推荐商品数据")
 	@GetMapping("/getTuiProducts")
 	public R getTuiProducts(BaseQueryParam param, HttpServletRequest request) {
@@ -38,4 +84,150 @@ public class ProductController extends AppBaseController {
 		PageInfo<FsStoreProductListQueryVO> listPageInfo = new PageInfo<>(list);
 		return R.ok().put("data", listPageInfo);
 	}
+
+	@Login
+	@ApiOperation("获取商品购物车数量")
+	@GetMapping("/getCartCount")
+	public R getCartCount(FsStoreCartCountParam param) {
+		param.setUserId(Long.parseLong(getUserId()));
+		Integer count = cartService.selectFsStoreCartCount(param);
+		return R.ok().put("data", count);
+	}
+
+	@ApiOperation("获取商品详情")
+	@GetMapping("/getProductDetails")
+	public R getProductDetails(@RequestParam(value = "productId") Long productId, String storeId) {
+		FsStoreProductQueryVO product = productService.selectFsStoreProductByIdQuery(productId, storeId);
+		if (product == null) {
+			return R.error("商品不存在或已下架");
+		}
+		FsStoreScrm fsStoreScrm = null;
+		if (StringUtils.isNotEmpty(product.getStoreId())) {
+			fsStoreScrm = storeScrmService.selectFsStoreByStoreId(Long.parseLong(product.getStoreId()));
+		}
+		List<FsStoreProductAttrScrm> productAttr = attrService.selectFsStoreProductAttrByProductId(product.getProductId());
+		List<FsStoreProductAttrValueScrm> productValues = attrValueService.selectFsStoreProductAttrValueByProductId(product.getProductId());
+
+		String userId = getUserId();
+		if (userId != null) {
+			FsStoreProductRelationScrm productRelation = new FsStoreProductRelationScrm();
+			productRelation.setIsDel(0);
+			productRelation.setUserId(Long.parseLong(userId));
+			productRelation.setProductId(product.getProductId());
+			productRelation.setType("foot");
+			List<FsStoreProductRelationScrm> productRelations = productRelationService.selectFsStoreProductRelationList(productRelation);
+			if (productRelations != null && productRelations.size() > 0) {
+				FsStoreProductRelationScrm relation = productRelations.get(0);
+				relation.setUpdateTime(new Date());
+				productRelationService.updateFsStoreProductRelation(relation);
+			} else {
+				FsStoreProductRelationScrm relation = new FsStoreProductRelationScrm();
+				relation.setUserId(Long.parseLong(userId));
+				relation.setIsDel(0);
+				relation.setProductId(product.getProductId());
+				relation.setType("foot");
+				relation.setCreateTime(new Date());
+				relation.setUpdateTime(new Date());
+				productRelationService.insertFsStoreProductRelation(relation);
+			}
+		}
+
+		Integer remainingPurchaseLimit = null;
+		Integer purchasedNum = 0;
+		if (product.getPurchaseLimit() != null && product.getPurchaseLimit() > 0) {
+			if (userId != null) {
+				FsStoreProductPurchaseLimitScrm purchaseLimit = purchaseLimitService.selectByProductIdAndUserId(
+						product.getProductId(), Long.parseLong(userId));
+				if (purchaseLimit != null) {
+					purchasedNum = purchaseLimit.getNum();
+				}
+				remainingPurchaseLimit = product.getPurchaseLimit() - purchasedNum;
+				if (remainingPurchaseLimit < 0) {
+					remainingPurchaseLimit = 0;
+				}
+			} else {
+				remainingPurchaseLimit = product.getPurchaseLimit();
+			}
+		}
+
+		return R.ok().put("product", product)
+				.put("productAttr", productAttr)
+				.put("productValues", productValues)
+				.put("store", fsStoreScrm)
+				.put("remainingPurchaseLimit", remainingPurchaseLimit)
+				.put("purchasedNum", purchasedNum);
+	}
+
+	@Login
+	@ApiOperation("获取购物车列表")
+	@GetMapping("/getCarts")
+	public R getCarts(HttpServletRequest request) {
+		List<FsStoreCartVO> carts = cartService.selectFsStoreCartListByUid(Long.parseLong(getUserId()));
+		return R.ok().put("carts", carts);
+	}
+
+	@ApiOperation("获取喜欢商品数据")
+	@GetMapping("/getGoodsProducts")
+	public R getGoodsProducts(BaseQueryParam param, HttpServletRequest request) {
+		PageHelper.startPage(param.getPage(), param.getPageSize());
+		List<FsStoreProductListQueryVO> list = productService.selectFsStoreProductGoodListQuery(param);
+		PageInfo<FsStoreProductListQueryVO> listPageInfo = new PageInfo<>(list);
+		return R.ok().put("data", listPageInfo);
+	}
+
+	@ApiOperation("获取分类")
+	@GetMapping("/getProductCate")
+	public R getProductCate(@RequestParam(name = "storeId", required = false) Long storeId) {
+		try {
+			FsStoreProductCategoryScrm param = new FsStoreProductCategoryScrm();
+			param.setIsShow(1);
+			param.setIsDel(0);
+			param.setStoreId(storeId);
+			List<FsStoreProductCategoryScrm> list = categoryService.selectFsStoreProductCategoryListQuery(param);
+			return R.ok().put("data", list);
+		} catch (Exception e) {
+			return R.error("操作异常");
+		}
+	}
+
+	@Login
+	@ApiOperation("添加购物车")
+	@PostMapping("/addCart")
+	public R addCart(@Validated @RequestBody FsStoreCartParam cartParam, HttpServletRequest request) {
+		return cartService.addCart(Long.parseLong(getUserId()), cartParam);
+	}
+
+	@ApiOperation("获取子分类")
+	@GetMapping("/getProductCateByPid")
+	public R getProductCateByPid(@RequestParam(value = "pid") Long pid,
+			@RequestParam(value = "storeId", required = false) Long storeId) {
+		try {
+			FsStoreProductCategoryScrm param = new FsStoreProductCategoryScrm();
+			param.setIsShow(1);
+			param.setIsDel(0);
+			param.setPid(pid);
+			param.setStoreId(storeId);
+			List<FsStoreProductCategoryScrm> list = categoryService.selectFsStoreProductCategoryListQuery(param);
+			return R.ok().put("data", list);
+		} catch (Exception e) {
+			return R.error("操作异常");
+		}
+	}
+
+	@ApiOperation("获取商品列表")
+	@GetMapping("/getProducts")
+	public R getProducts(FsStoreProductQueryParam param, HttpServletRequest request) {
+		PageHelper.startPage(param.getPage(), param.getPageSize());
+		param.setIsDisplay(1);
+		List<FsStoreProductListQueryVO> productList = productService.selectFsStoreProductListQuery(param);
+		PageInfo<FsStoreProductListQueryVO> listPageInfo = new PageInfo<>(productList);
+		return R.ok().put("data", listPageInfo);
+	}
+
+	@Login
+	@ApiOperation("删除购物车")
+	@PostMapping("/delCart")
+	public R delCart(@Validated @RequestBody FsStoreCartDelParam cartParam, HttpServletRequest request) {
+		return cartService.delCart(Long.parseLong(getUserId()), cartParam);
+	}
 }

+ 53 - 0
java/fs-user-app/src/main/java/com/fs/app/controller/SignController.java

@@ -0,0 +1,53 @@
+package com.fs.app.controller;
+
+import com.fs.app.annotation.Login;
+import com.fs.common.core.domain.R;
+import com.fs.hisStore.domain.FsUserScrm;
+import com.fs.hisStore.service.IFsUserScrmService;
+import com.fs.hisStore.service.IFsUserSignScrmService;
+import com.fs.system.service.ISysConfigService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Api("签到接口")
+@RestController
+@RequestMapping(value = "/app/sign")
+public class SignController extends AppBaseController {
+
+    @Autowired
+    private IFsUserScrmService userService;
+
+    @Autowired
+    private ISysConfigService configService;
+
+    @Autowired
+    private IFsUserSignScrmService signService;
+
+    @Login
+    @ApiOperation("获取用户签到记录")
+    @GetMapping("/getUserSign")
+    public R getUserSign(HttpServletRequest request) {
+        FsUserScrm user = userService.selectFsUserById(Long.parseLong(getUserId()));
+        String json = configService.selectConfigByKey("his.sign");
+        Long signNum = signService.getSign(user);
+        Boolean isDaySign = signService.isDaySign(user);
+        return R.ok().put("isDaySign", isDaySign).put("signNum", signNum)
+                .put("integral", user.getIntegral().intValue()).put("sign", json);
+    }
+
+    @Login
+    @ApiOperation("签到")
+    @PostMapping("/sign")
+    public R sign(HttpServletRequest request) {
+        FsUserScrm user = userService.selectFsUserById(Long.parseLong(getUserId()));
+        Long integral = signService.sign(user);
+        return R.ok("签到获得" + integral + "积分");
+    }
+}

+ 170 - 226
java/fs-user-app/src/main/java/com/fs/app/controller/StoreOrderController.java

@@ -1,281 +1,225 @@
 package com.fs.app.controller;
 
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONUtil;
 import com.fs.app.annotation.Login;
-
-import com.fs.common.utils.CloudHostUtils;
-import com.fs.his.dto.ExpressInfoDTO;
-import com.fs.his.param.BillListParam;
-import com.fs.app.param.FsStoreOrderExpressParam;
-import com.fs.app.param.FsStoreOrderFinishParam;
-import com.fs.his.vo.FsStoreOrderBillLogVo;
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
-
+import com.fs.common.exception.ServiceException;
 import com.fs.common.utils.ParseUtils;
-import com.fs.his.domain.*;
-import com.fs.his.param.*;
-import com.fs.his.service.*;
-import com.fs.his.vo.FsStoreOrderItemListUVO;
-import com.fs.his.vo.FsStoreOrderListUVO;
-import com.fs.ybPay.service.IPayService;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
+import com.fs.hisStore.domain.FsStoreProductPackageScrm;
+import com.fs.hisStore.dto.FsStoreOrderComputeDTO;
+import com.fs.hisStore.param.FsMyStoreOrderQueryParam;
+import com.fs.hisStore.param.FsStoreConfirmOrderParam;
+import com.fs.hisStore.param.FsStoreOrderCancelParam;
+import com.fs.hisStore.param.FsStoreOrderComputedParam;
+import com.fs.hisStore.param.FsStoreOrderCreateParam;
+import com.fs.hisStore.param.FsStoreOrderPayParam;
+import com.fs.hisStore.service.IFsStoreOrderScrmService;
+import com.fs.hisStore.service.IFsStoreProductPackageScrmService;
+import com.fs.hisStore.vo.FsMyStoreOrderListQueryVO;
+import com.fs.store.config.StoreConfig;
+import com.fs.system.service.ISysConfigService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiResponse;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+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.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.Calendar;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
 
+import static com.fs.hisStore.constants.UserAppsLockConstant.LOCK_KEY_CANCEL;
+import static com.fs.hisStore.constants.UserAppsLockConstant.LOCK_KEY_EDIT_PAY_TYPE;
+import static com.fs.hisStore.constants.UserAppsLockConstant.LOCK_KEY_PAY;
 
 @Api("商城接口")
 @RestController
-@RequestMapping(value="/app/storeOrder")
-public class StoreOrderController extends  AppBaseController {
+@RequestMapping(value = "/app/storeOrder")
+public class StoreOrderController extends AppBaseController {
 
-    @Autowired
-    private IFsExpressService expressService;
-    @Autowired
-    IPayService payService;
-    @Autowired
-    private IFsStoreOrderService orderService;
+    Logger logger = LoggerFactory.getLogger(getClass());
 
     @Autowired
-    private IFsStoreOrderItemService orderItemService;
+    private RedissonClient redissonClient;
 
     @Autowired
-    private IFsStorePaymentService storePaymentService;
-    @Autowired
-    private IFsUserService userService;
-    @Autowired
-    private IFsUserAddressService userAddressService;
-    @Autowired
-    private IFsUserCouponService userCouponService;
+    private IFsStoreOrderScrmService orderService;
+
     @Autowired
-    private IFsCouponService couponService;
+    private IFsStoreProductPackageScrmService productPackageService;
+
     @Autowired
-    private IFsStoreOrderBillLogService orderBillLogService;
+    private ISysConfigService configService;
+
     @Login
-    @ApiOperation("获取我的订单列表")
-    @GetMapping("/getMyStoreOrderList")
-        public R getMyStoreOrderList(FsStoreOrderListUParam param, HttpServletRequest request){
-        PageHelper.startPage(param.getPageNum(), param.getPageSize());
-        param.setUserId(Long.parseLong(getUserId()));
-        List<FsStoreOrderListUVO> list=orderService.selectFsStoreOrderListUVO(param);
-        PageInfo<FsStoreOrderListUVO> listPageInfo=new PageInfo<>(list);
-        return R.ok().put("data",listPageInfo);
+    @ApiOperation("确认订单")
+    @PostMapping("/confirm")
+    public R confirm(@Validated @RequestBody FsStoreConfirmOrderParam param, HttpServletRequest request) {
+        return orderService.confirmOrder(Long.parseLong(getUserId()), param);
     }
 
     @Login
-    @ApiOperation("获取我的订单详情")
-    @GetMapping("/getMyStoreOrderById")
-    public R getMyStoreOrderById(@RequestParam("orderId") Long orderId, HttpServletRequest request){
-        FsStoreOrder order=orderService.selectFsStoreOrderByOrderId(orderId);
-        order.setUserPhone(ParseUtils.parsePhone(order.getUserPhone()));
-        order.setUserAddress(ParseUtils.parseIdCard(order.getUserAddress()));
-        List<FsStoreOrderItemListUVO> list=orderItemService.selectFsStoreOrderItemListUVOByOrderId(orderId);
-        Calendar calendar = Calendar.getInstance();
-        calendar.setTime(order.getCreateTime());
-//        String json=configService.selectConfigByKey("his.store");
-//        StoreConfig config=JSONUtil.toBean(json,StoreConfig.class);
-//        calendar.add(Calendar.MINUTE,config.getUnPayTime());
-        SimpleDateFormat format = new   SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        String payLimitTime = format.format(calendar.getTime() );
-        //处理是否可以申请售后
-        Integer isAfterSales=0;
-//        if(order.getStatus().equals(FsStoreOrderStatusEnum.STATUS_4.getValue())) {
-//            //已完成订单
-//            isAfterSales=1;
-//            if (order.getFinishTime() != null) {
-////                if (config.getStoreAfterSalesDay() != null && config.getStoreAfterSalesDay() > 0) {
-////                    //判断完成时间是否超过指定时间
-////                    Calendar calendarAfterSales = new GregorianCalendar();
-////                    calendarAfterSales.setTime(order.getFinishTime());
-////                    calendarAfterSales.add(calendarAfterSales.DATE, config.getStoreAfterSalesDay()); //把日期往后增加一天,整数  往后推,负数往前移动
-////                    if (calendarAfterSales.getTime().getTime() < new Date().getTime()) {
-////                        isAfterSales = 0;
-////                    }
-////                }
-//            }
-//        }
-//        else if(order.getStatus()==2||order.getStatus()==3){
-//            isAfterSales=1;
-//        }
-        return R.ok().put("order",order).put("items",list).put("payLimitTime",payLimitTime);
+    @ApiOperation("计算订单金额")
+    @PostMapping("/computed")
+    public R computed(@Validated @RequestBody FsStoreOrderComputedParam param, HttpServletRequest request) {
+        try {
+            FsStoreOrderComputeDTO dto = orderService.computedOrder(Long.parseLong(getUserId()), param);
+            return R.ok().put("data", dto);
+        } catch (ServiceException e) {
+            if ("偏远地区暂不可购买".equals(e.getMessage())) {
+                return R.error("偏远地区暂不可购买");
+            }
+            throw e;
+        }
     }
 
     @Login
-    @ApiOperation("获取订单")
+    @ApiOperation("创建订单")
+    @PostMapping("/create")
+    public R create(@Validated @RequestBody FsStoreOrderCreateParam param, HttpServletRequest request) {
+        return orderService.createOrder(Long.parseLong(getUserId()), param);
+    }
+
+    @Login
+    @ApiOperation("获取订单详情")
     @GetMapping("/getStoreOrderById")
-    public R getStoreOrderById(@RequestParam("orderId") Long orderId, HttpServletRequest request){
-        FsStoreOrder order=orderService.selectFsStoreOrderByOrderId(orderId);
-//        if(!order.getUserId().equals(Long.parseLong(getUserId()))){
-//            return R.error("非法操作");
-//        }
+    public R getStoreOrderById(@RequestParam("orderId") Long orderId, HttpServletRequest request) {
+        FsStoreOrderScrm order = orderService.selectFsStoreOrderById(orderId);
         order.setUserPhone(ParseUtils.parsePhone(order.getUserPhone()));
         order.setUserAddress(ParseUtils.parseIdCard(order.getUserAddress()));
-        List<FsStoreOrderItemListUVO> list=orderItemService.selectFsStoreOrderItemListUVOByOrderId(orderId);
-
-//        String json=configService.selectConfigByKey("his.store");
-//        StoreConfig config=JSONUtil.toBean(json,StoreConfig.class);
+        String json = configService.selectConfigByKey("his.store");
+        StoreConfig config = JSONUtil.toBean(json, StoreConfig.class);
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(order.getCreateTime());
-//        calendar.add(Calendar.MINUTE,config.getUnPayTime());
-        SimpleDateFormat format = new   SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        String payLimitTime = format.format(calendar.getTime() );
-        return R.ok().put("order",order).put("payLimitTime",payLimitTime).put("items",list);
-    }
-
-
-    @Login
-    @ApiOperation("计算订单")
-    @PostMapping("/compute")
-    public R compute(@Validated @RequestBody FsStoreOrderComputeParam param, HttpServletRequest request){
-        return orderService.computeOrder(param);
-
+        calendar.add(Calendar.MINUTE, config.getUnPayTime());
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String payLimitTime = format.format(calendar.getTime());
+        FsStoreProductPackageScrm productPackage = null;
+        if (order.getIsPackage() != null && order.getIsPackage() == 1) {
+            productPackage = productPackageService.selectFsStoreProductPackageById(order.getPackageId());
+        }
+        return R.ok().put("order", order).put("productPackage", productPackage).put("payLimitTime", payLimitTime);
     }
 
     @Login
-    @ApiOperation("支付")
-    @PostMapping("/pay")
-    public R pay(HttpServletRequest request, @Validated @RequestBody FsStoreOrderPayParam param)
-    {
+    @ApiOperation("获取我的订单列表")
+    @GetMapping("/getMyStoreOrderList")
+    public R getMyStoreOrderList(FsMyStoreOrderQueryParam param, HttpServletRequest request) {
+        PageHelper.startPage(param.getPage(), param.getPageSize());
         param.setUserId(Long.parseLong(getUserId()));
-        return orderService.payOrder(param);
+        List<FsMyStoreOrderListQueryVO> list = orderService.selectFsMyStoreOrderListVO(param);
+        PageInfo<FsMyStoreOrderListQueryVO> listPageInfo = new PageInfo<>(list);
+        return R.ok().put("data", listPageInfo);
+    }
+
+    @Login
+    @ApiOperation("修改支付类型")
+    @PostMapping("/editPayType")
+    public R editPayType(HttpServletRequest request, @Validated @RequestBody FsStoreOrderPayParam param) {
+        Long orderId = param.getOrderId();
+        logger.info("开始处理修改支付类型请求, 订单号: {}, 新支付类型: {}", orderId, param.getPayType());
+        RLock lock = redissonClient.getLock(String.format(LOCK_KEY_EDIT_PAY_TYPE, orderId));
+        R result = null;
+        try {
+            boolean locked = lock.tryLock(100, 10000, TimeUnit.MILLISECONDS);
+            if (!locked) {
+                logger.warn("订单支付类型正在修改中,获取锁失败, 订单号: {}", orderId);
+                return R.error("订单正在处理中,请勿重复提交");
+            }
+            result = orderService.editPayType(param);
+        } catch (InterruptedException e) {
+            logger.error("获取修改支付类型锁的过程被中断, 订单号: {}", orderId, e);
+            Thread.currentThread().interrupt();
+            return R.error("修改支付类型处理被中断,请稍后重试");
+        } catch (Throwable e) {
+            logger.error("修改支付类型过程中发生异常, 订单号: {}", orderId, e);
+            throw e;
+        } finally {
+            if (lock != null && lock.isHeldByCurrentThread()) {
+                lock.unlock();
+                logger.debug("修改支付类型锁已释放, 订单号: {}", orderId);
+            }
+        }
+        return result;
     }
 
-
-
-
     @Login
     @ApiOperation("支付")
-    @PostMapping("/payment")
-    public R payment(HttpServletRequest request, @Validated @RequestBody FsStoreOrderDoPayParam param)
-    {
-        param.setUserId(Long.parseLong(getUserId()));
-        return orderService.payment(param);
-    }
-    @Login
-    @ApiOperation("支付宝支付")
-    @PostMapping("/zfbPayment")
-    public R zfbPayment(HttpServletRequest request, @Validated @RequestBody FsStoreOrderDoPayParam param)
-    {
-        param.setUserId(Long.parseLong(getUserId()));
-        return orderService.zfbPayment(param);
+    @PostMapping("/pay")
+    public R pay(HttpServletRequest request, @Validated @RequestBody FsStoreOrderPayParam param) {
+        Long orderId = param.getOrderId();
+        logger.info("开始处理支付请求, 订单号: {}, 支付类型: {}", orderId, param.getPayType());
+        RLock lock = redissonClient.getLock(String.format(LOCK_KEY_PAY, orderId));
+        R result = null;
+        try {
+            boolean locked = lock.tryLock(100, 30000, TimeUnit.MILLISECONDS);
+            if (!locked) {
+                logger.warn("订单正在处理中,获取锁失败, 订单号: {}", orderId);
+                return R.error("订单正在处理中,请勿重复提交");
+            }
+            result = orderService.pay(param, request);
+        } catch (InterruptedException e) {
+            logger.error("获取支付锁的过程被中断, 订单号: {}", orderId, e);
+            Thread.currentThread().interrupt();
+            return R.error("支付处理被中断,请稍后重试");
+        } catch (Throwable e) {
+            logger.error("支付过程中发生异常, 订单号: {}", orderId, e);
+            throw e;
+        } finally {
+            if (lock.isHeldByCurrentThread()) {
+                lock.unlock();
+                logger.debug("支付锁已释放, 订单号: {}", orderId);
+            }
+        }
+        return result;
     }
 
     @Login
     @ApiOperation("取消订单")
     @PostMapping("/cancelOrder")
-    public R cancelOrder(@Validated @RequestBody FsStoreOrderCancelParam param, HttpServletRequest request){
-        FsStoreOrder order=orderService.selectFsStoreOrderByOrderId(param.getOrderId());
-        if (ObjectUtil.isNull(order)) {
-            throw new CustomException("订单不存在");
-        }
-        return orderService.cancelOrder(param.getOrderId());
-
-    }
-    @Login
-    @ApiOperation("快递信息")
-    @PostMapping("/getExpress")
-    public R getExpress(@Validated @RequestBody FsStoreOrderExpressParam param, HttpServletRequest request){
-        FsStoreOrder order=orderService.selectFsStoreOrderByOrderId(param.getOrderId());
-        if (ObjectUtil.isNull(order)) {
-            throw new CustomException("订单不存在");
+    public R cancelOrder(@Validated @RequestBody FsStoreOrderCancelParam param, HttpServletRequest request) {
+        Long orderId = param.getOrderId();
+        logger.info("开始处理取消订单请求, 订单号: {}", orderId);
+        RLock lock = redissonClient.getLock(String.format(LOCK_KEY_CANCEL, orderId));
+        R result = null;
+        try {
+            boolean locked = lock.tryLock(100, 30000, TimeUnit.MILLISECONDS);
+            if (!locked) {
+                throw new CustomException("订单正在处理中,请勿重复提交");
+            }
+            FsStoreOrderScrm order = orderService.selectFsStoreOrderById(orderId);
+            if (ObjectUtil.isNull(order)) {
+                throw new CustomException("订单不存在");
+            }
+            if (order.getStatus() != 0) {
+                throw new CustomException("非法操作");
+            }
+            orderService.cancelOrder(orderId);
+            result = R.ok("操作成功");
+        } catch (Exception e) {
+            logger.error("取消订单失败, 订单号: {}", orderId, e);
+            throw new CustomException("取消订单过程中发生错误");
+        } finally {
+            if (lock.isHeldByCurrentThread()) {
+                lock.unlock();
+            }
         }
-        if (order.getStatus() <3) {
-            throw new CustomException("未发货订单不能查询");
-        }
-        if (CloudHostUtils.hasCloudHostName("金牛明医")){
-            ExpressInfoDTO dto = orderService.getDfExpressInfoDTO(order);
-            dto.setShipperName(order.getDeliveryName());
-            return R.ok().put("data", dto).put("express",expressService.selectFsExpressByName(order.getDeliveryName())).put("deliverySn", order.getDeliverySn());
-        } else {
-            return orderService.getExpress(order);
-        }
-    }
-
-    @Login
-    @ApiOperation("完成订单")
-    @PostMapping("/finishOrder")
-    public R finishOrder(@Validated @RequestBody FsStoreOrderFinishParam param, HttpServletRequest request){
-        return orderService.finishOrder(param.getOrderId());
+        return result;
     }
-
-
-    @Login
-    @ApiOperation("获取销售订单列表")
-    @GetMapping("/getCompanyUserStoreOrderList")
-    public R getCompanyUserStoreOrderList(FsStoreOrderListUParam param, HttpServletRequest request){
-        PageHelper.startPage(param.getPageNum(), param.getPageSize());
-        param.setCompanyUserId(getCompanyUserId());
-        List<FsStoreOrderListUVO> list=orderService.selectFsStoreOrderListUVO(param);
-        PageInfo<FsStoreOrderListUVO> listPageInfo=new PageInfo<>(list);
-        return R.ok().put("data",listPageInfo);
-    }
-
-
-    @Login
-    @ApiOperation("获取订单")
-    @GetMapping("/getCompanyUserStoreOrderById")
-    public R getCompanyUserStoreOrderById(@RequestParam("orderId") Long orderId, HttpServletRequest request){
-        FsStoreOrder order=orderService.selectFsStoreOrderByOrderId(orderId);
-//        if(!order.getCompanyUserId().equals(getCompanyUserId())){
-//            return R.error("非法操作");
-//        }
-        order.setUserPhone(ParseUtils.parsePhone(order.getUserPhone()));
-        order.setUserAddress(ParseUtils.parseIdCard(order.getUserAddress()));
-        List<FsStoreOrderItemListUVO> list=orderItemService.selectFsStoreOrderItemListUVOByOrderId(orderId);
-
-//        String json=configService.selectConfigByKey("his.store");
-//        StoreConfig config=JSONUtil.toBean(json,StoreConfig.class);
-        Calendar calendar = Calendar.getInstance();
-        calendar.setTime(order.getCreateTime());
-//        calendar.add(Calendar.MINUTE,config.getUnPayTime());
-        SimpleDateFormat format = new   SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        String payLimitTime = format.format(calendar.getTime() );
-        return R.ok().put("order",order).put("payLimitTime",payLimitTime).put("items",list);
-    }
-
-
-
-
-    @Login
-    @ApiOperation("开票")
-    @PostMapping("/bill")
-    public R bill(@RequestBody OrderBillParam param){
-        param.setUserId(Long.parseLong(getUserId()));
-        return orderBillLogService.bill(param);
-    }
-    @Login
-    @ApiOperation("开票历史")
-    @GetMapping("/billList")
-    @ApiResponse(code = 200, message = "", responseContainer = "List", response = FsStoreOrderBillLogVo.class)
-    public R billList(BillListParam param){
-        PageHelper.startPage(param.getPageNum(), param.getPageSize());
-        param.setUserId(Long.parseLong(getUserId()));
-        PageInfo<FsStoreOrderBillLogVo> listPageInfo= orderBillLogService.billList(param);
-        return R.ok().put("data",listPageInfo);
-    }
-    @Login
-    @ApiOperation("开票详情")
-    @GetMapping("/billInfo")
-    @ApiResponse(code = 200, message = "", response = FsStoreOrderBillLog.class)
-    public R billList(Long id){
-        return R.ok().put("data", orderBillLogService.getById(id));
-    }
-
-    @Login
-    @ApiOperation("开票冲红")
-    @GetMapping("/billBack")
-    public R billBack(Long id){
-        return orderBillLogService.billBack(id);
-    }
-
-
 }

+ 17 - 0
java/fs-user-app/src/main/java/com/fs/app/controller/UserController.java

@@ -22,6 +22,9 @@ import com.fs.his.service.IFsDoctorService;
 import com.fs.his.service.IFsPackageService;
 import com.fs.his.service.IFsUserCouponService;
 import com.fs.his.service.IFsUserService;
+import com.fs.hisStore.param.FsStoreProductRelationQueryParam;
+import com.fs.hisStore.service.IFsStoreProductRelationScrmService;
+import com.fs.hisStore.vo.FsStoreProductRelationQueryVO;
 import com.fs.his.utils.PhoneUtil;
 import com.fs.his.vo.FsUserCouponCountUVO;
 import com.fs.his.vo.FsUserCouponListUVO;
@@ -78,6 +81,9 @@ public class UserController extends  AppBaseController {
     @Autowired
     private IFsUserCourseVideoService courseVideoService;
 
+    @Autowired
+    private IFsStoreProductRelationScrmService productRelationScrmService;
+
 
     @Autowired
     private IFsUserService fsUserService;
@@ -365,4 +371,15 @@ public class UserController extends  AppBaseController {
     public R removeUser(){
         return userService.removeUser(Long.parseLong(getUserId()));
     }
+
+    @Login
+    @ApiOperation("获取商品足迹")
+    @GetMapping("/getProductFoots")
+    public R getProductFoots(FsStoreProductRelationQueryParam param, HttpServletRequest request) {
+        PageHelper.startPage(param.getPage(), param.getPageSize());
+        param.setUserId(Long.parseLong(getUserId()));
+        List<FsStoreProductRelationQueryVO> list = productRelationScrmService.selectFsStoreProductRelationListVOQuery(param);
+        PageInfo<FsStoreProductRelationQueryVO> listPageInfo = new PageInfo<>(list);
+        return R.ok().put("data", listPageInfo);
+    }
 }