Browse Source

后台产品管理调整2

hulh 8 years ago
parent
commit
33f402f7b4

+ 18 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/controller/GoodsHistoryController.java

@@ -5,7 +5,10 @@ import com.uas.platform.b2c.prod.commodity.model.GoodsHistory;
 import com.uas.platform.b2c.prod.commodity.service.GoodsHistoryService;
 import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.logging.BufferedLoggerManager;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
@@ -17,7 +20,7 @@ import java.util.List;
  * @version 2017年8月3日11:32:31 yuj 增加注释
  */
 @RestController
-@RequestMapping(value = "/trade/goodsHitory")
+@RequestMapping(value = "/trade/goodsHistory")
 public class GoodsHistoryController {
 
     private final GoodsHistoryService goodsHistoryService;
@@ -55,4 +58,18 @@ public class GoodsHistoryController {
         logger.log("获取上下架历史", "批次号" + batchCode);
         return goodsHistoryService.findDataOfUpAndDown(batchCode);
     }
+
+    /**
+     * 返回该批次号的上下架历史
+     *
+     * @param batchCode 批次号
+     * @return
+     */
+    @RequestMapping(value = "/page/batchCode", method = RequestMethod.GET)
+    public Page<GoodsHistory> getPageByBatchCode(PageParams params, String batchCode) {
+        PageInfo info = new PageInfo(params);
+        logger.log("获取上下架历史", "批次号" + batchCode);
+        return goodsHistoryService.findPageByBatchCode(info, batchCode);
+    }
+
 }

+ 25 - 2
src/main/java/com/uas/platform/b2c/prod/commodity/model/GoodsFilter.java

@@ -27,8 +27,15 @@ public class GoodsFilter {
      */
     private String kindUuid;
 
-//    private Integer saleStatus;
-//    private Integer saleNum;
+    /**
+     * 在售状态
+     */
+    private Integer saleStatus;
+
+    /**
+     * 在售数量
+     */
+    private Integer saleNum;
 
     /**
      * 币别
@@ -139,4 +146,20 @@ public class GoodsFilter {
     public void setHaveImg(Boolean haveImg) {
         this.haveImg = haveImg;
     }
+
+    public Integer getSaleStatus() {
+        return saleStatus;
+    }
+
+    public void setSaleStatus(Integer saleStatus) {
+        this.saleStatus = saleStatus;
+    }
+
+    public Integer getSaleNum() {
+        return saleNum;
+    }
+
+    public void setSaleNum(Integer saleNum) {
+        this.saleNum = saleNum;
+    }
 }

+ 10 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/service/GoodsHistoryService.java

@@ -107,4 +107,14 @@ public interface GoodsHistoryService {
      * @return
      */
     List<GoodsHistory> findDataOfUpAndDown(String batchCode);
+
+    /**
+     * 通过批次号获取批次变更记录(卖家)
+     *
+     * @param info      the info 一页数据
+     * @param batchCode the batch code 批次信息
+     * @return page
+     */
+    Page<GoodsHistory> findPageByBatchCode(final PageInfo info, String batchCode);
+
 }

+ 26 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsHistoryServiceImpl.java

@@ -290,4 +290,30 @@ public class GoodsHistoryServiceImpl implements GoodsHistoryService {
 		List<String> typeList = Arrays.asList("下架商品", "过期下架(存储过程下架)", "发布商品");
 		return goodsHistoryDao.findByBatchCodeInType(batchCode, typeList);
 	}
+
+	@Override
+	public Page<GoodsHistory> findPageByBatchCode(final PageInfo info, String batchCode) {
+		Goods goods = goodsDao.findByBatchCode(batchCode);
+		if (goods == null) {
+			throw new IllegalOperatorException("批次:" + batchCode + "不存在");
+		}
+
+		info.filter("batchCode", batchCode);
+
+		SimpleExpression[] simpArrs = new SimpleExpression[4];
+		simpArrs[0] = new SimpleExpression ("operateType", "上架", Operator.EQ);
+		simpArrs[1] = new SimpleExpression ("operateType", "发布商品", Operator.EQ);
+		simpArrs[2] = new SimpleExpression ("operateType", "下架商品", Operator.EQ);
+		simpArrs[3] = new SimpleExpression ("operateType", "批量下架公司产品", Operator.EQ);
+
+		LogicalExpression logical = new LogicalExpression(simpArrs, Operator.OR);
+		info.expression(logical);
+
+		return goodsHistoryDao.findAll(new Specification<GoodsHistory>() {
+			public Predicate toPredicate(Root<GoodsHistory> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
+				query.where(info.getPredicates(root, query, builder));
+				return null;
+			}
+		}, info);
+	}
 }

+ 1 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsModifyInfoServiceImpl.java

@@ -79,7 +79,7 @@ public class GoodsModifyInfoServiceImpl implements GoodsModifyInfoService {
         goods.setAuditedTime(new Date());
         if (!pass) {
             // 不通过下架该商品
-
+            goodsService.offShelfGoodsByProvider(goods.getBatchCode(), message);
         }
         goodsDao.save(goods);
     }

+ 28 - 2
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java

@@ -2524,9 +2524,12 @@ public class GoodsServiceImpl implements GoodsService {
         if (goods == null) {
             return new ResultMap(CodeType.NOT_EXiST.code(), "对应的批次号" + batchCode + "不存在,请刷新界面再操作");
         }
-        if (!goods.getEnUU().equals(enUU)) {
-            return new ResultMap(CodeType.NOT_PERMIT.code(), "您提交的批次号不属于您当前登陆公司");
+        if (Status.AVAILABLE.value() == goods.getStatus() || Status.UNAVAILABLE.value() == goods.getStatus()) {
+            return new ResultMap(CodeType.NOT_EXiST.code(), "对应的批次号" + batchCode + "已下架,不要重复下架");
         }
+//        if (!goods.getEnUU().equals(enUU)) {
+//            return new ResultMap(CodeType.NOT_PERMIT.code(), "您提交的批次号不属于您当前登陆公司");
+//        }
         if (goods.getSourceId() != null) {
             return new ResultMap(CodeType.NOT_PERMIT.code(), "批次号" + batchCode + "来自接口,b2c不能进行操作");
         }
@@ -3706,5 +3709,28 @@ public class GoodsServiceImpl implements GoodsService {
             info.expression(PredicateUtils.isNotNull("audited"));
             info.expression(PredicateUtils.eq("audited", goodsFilter.getAudited(), true));
         }
+        if (goodsFilter.getSaleStatus() != null || goodsFilter.getSaleNum() != null) {
+            Set<Integer> statusSet = new HashSet<>();
+            if (goodsFilter.getSaleStatus() != null) {
+                // 已上架状态
+                if (Status.AVAILABLE.value() == goodsFilter.getSaleStatus()) {
+                    statusSet.add(Status.AVAILABLE.value());
+                    statusSet.add(Status.UNAVAILABLE.value());
+                } else {
+                    statusSet.add(goodsFilter.getSaleStatus());
+                }
+            }
+            if (goodsFilter.getSaleNum() != null) {
+                statusSet.add(goodsFilter.getSaleNum());
+            }
+            if (CollectionUtils.isNotEmpty(statusSet)) {
+                SimpleExpression[] statusExpression = new SimpleExpression[statusSet.size()];
+                int i = 0;
+                for (Integer status : statusSet) {
+                    statusExpression[i++] = PredicateUtils.eq("status", status, true);
+                }
+                info.expression(PredicateUtils.or((CriterionExpression[]) statusExpression));
+            }
+        }
 	}
 }

+ 33 - 7
src/main/webapp/resources/js/admin/controllers/product/productManageCtrl.js

@@ -230,13 +230,13 @@ define(['app/app'], function(app) {
 
         };
         // 日志点击事件
-        $scope.journalProduct = function (data) {
+        $scope.journalProduct = function (goods) {
             var modalInstance = $modal.open({
                 templateUrl: 'static/view/admin/modal/manage/journal_modal.html',
                 controller: 'journalCtrl',
                 resolve: {
-                    account: function () {
-                        return angular.copy(data);
+                    goods: function () {
+                        return angular.copy(goods);
                     }
                 }
             });
@@ -258,8 +258,8 @@ define(['app/app'], function(app) {
                     }
                 }
             });
-            modalInstance.result.then(function (account) {
-
+            modalInstance.result.then(function () {
+                $scope.manageTableParams.reload();
             }, function () {
 
             })
@@ -283,6 +283,7 @@ define(['app/app'], function(app) {
         }
 
     }]);
+
     app.register.controller('exportProductCtrl', ['$scope', '$modalInstance', 'account', function($scope, $modalInstance, account) {
         $scope.cancel = function () {
             $modalInstance.dismiss();
@@ -391,7 +392,7 @@ define(['app/app'], function(app) {
 
     }]);
 
-    app.register.controller('journalCtrl', ['$scope', 'account', '$modalInstance', function($scope, account, $modalInstance) {
+    app.register.controller('journalCtrl', ['$scope', 'goods', 'toaster', 'ngTableParams', 'BaseService', 'GoodsHistory', '$modalInstance', function($scope, goods, toaster, ngTableParams, BaseService, GoodsHistory, $modalInstance) {
         $scope.tabs = 'basic';
 
         // 日期选择框部分
@@ -420,6 +421,31 @@ define(['app/app'], function(app) {
             }
         };
 
+        $scope.historyStatus = {
+            '上架' : '上架',
+            '发布商品' : '上架',
+            '下架商品' : '下架',
+            '批量下架公司产品' : '下架'
+        };
+
+        // 获取分页Goods数据
+        $scope.historyTableParams = new ngTableParams({
+            page: 1,
+            count: 3
+        }, {
+            total: 0,
+            getData: function ($defer, params) {
+                var param = BaseService.parseParams(params.url());
+                param.batchCode = goods.batchCode;
+                GoodsHistory.findDataOfUpAndDown(param, function (data) {
+                    $scope.historyList = data.content;
+                    params.total(data.totalElements);
+                    $defer.resolve(data.content);
+                }, function () {
+                    toaster.pop('error', '获取数据失败')
+                })
+            }
+        });
 
         $scope.cancel = function () {
             $modalInstance.dismiss();
@@ -484,7 +510,7 @@ define(['app/app'], function(app) {
             Goods.offShelfGoodsByProvider({batchCodes:batchs, downMsg:$scope.errorMsg}, {}, function(map){
                 if (map.success) {
                     toaster.pop('success', '下架成功');
-                    $scope.batchStatus = false;
+                    $modalInstance.close();
                 } else {
                     toaster.pop('error', map.message);
                 }

+ 88 - 2
src/main/webapp/resources/js/admin/controllers/product/productManageDetailCtrl.js

@@ -1,6 +1,6 @@
 define(['app/app'], function(app) {
     'use strict';
-    app.register.controller('productManageDetailCtrl', ['$scope', '$stateParams', 'Goods', function ($scope, $stateParams, Goods) {
+    app.register.controller('productManageDetailCtrl', ['$scope', '$stateParams', 'Goods', '$modal', function ($scope, $stateParams, Goods, $modal) {
         $scope.goodId = $stateParams.id;
         var initGoods = function () {
             Goods.findOneById({goodsId:$scope.goodId}, function (data) {
@@ -30,5 +30,91 @@ define(['app/app'], function(app) {
             613 : '新品未上架'
         };
 
-    }])
+        // 下架事件
+        $scope.soldOutProduct = function (batchArray) {
+            var modalInstance = $modal.open({
+                templateUrl: 'static/view/admin/modal/manage/ManageSoldOut.html',
+                controller: 'soleOutCtrl',
+                resolve: {
+                    batchArray: function () {
+                        return angular.copy(batchArray);
+                    }
+                }
+            });
+            modalInstance.result.then(function () {
+                $scope.manageTableParams.reload();
+            }, function () {
+
+            })
+        };
+
+    }]);
+    app.register.controller('soleOutCtrl', ['$scope', 'batchArray', 'Goods', 'toaster', '$modalInstance', function($scope, batchArray, Goods, toaster, $modalInstance) {
+        $scope.errorMsg = '';
+        $scope.otherMessage = '';
+        $scope.errorArray = ['价格异常', '图片违规', '基本信息有误', '短缺货'];
+
+        var countLength = function (string) {
+            return string.replace(/[^\x00-\xff]/g, '**').length;
+        };
+
+        var cutOutString = function (str, length) {
+            for (var i = 1; i <= str.length; i++) {
+                if (countLength(str.substr(0, i)) > length){
+                    str = str.substr(0, i-1);
+                    break;
+                }
+            }
+            return str;
+        };
+
+        $scope.inputMessage = function () {
+            if ($scope.otherMessage) {
+                $scope.otherMessage = cutOutString($scope.otherMessage, 30);
+            }
+        };
+
+        $scope.cancel = function () {
+            $modalInstance.dismiss();
+        };
+
+        $scope.changeType = function (type) {
+            $scope.errorType = type;
+        };
+
+        $scope.ensureDown = function () {
+            if (!$scope.errorType) {
+                toaster.pop("info", "您尚未选择下架原因");
+                return;
+            }
+            if ($scope.errorType == 5) {
+                if (!$scope.otherMessage || countLength($scope.otherMessage) < 2) {
+                    toaster.pop("info", "原因至少要填写2个字");
+                    return;
+                }
+            }
+            if ($scope.errorType == 5) {
+                $scope.errorMsg = $scope.otherMessage;
+            } else {
+                $scope.errorMsg = $scope.errorArray[$scope.errorType - 1];
+            }
+
+            if (!$scope.errorMsg || $scope.errorMsg.length == 0) {
+                toaster.pop("info", "您尚未选择下架原因");
+                return;
+            }
+            var batchs = batchArray.join(",");
+            Goods.offShelfGoodsByProvider({batchCodes:batchs, downMsg:$scope.errorMsg}, {}, function(map){
+                if (map.success) {
+                    toaster.pop('success', '下架成功');
+                    $modalInstance.close();
+                } else {
+                    toaster.pop('error', map.message);
+                }
+            }, function() {
+                toaster.pop('error', '下架失败');
+            });
+        };
+
+    }]);
 });

+ 7 - 0
src/main/webapp/resources/js/common/query/goods.js

@@ -297,5 +297,12 @@ define([ 'ngResource' ], function() {
 				method: 'PUT'
 			}
 		})
+	}]).factory('GoodsHistory', ['$resource', function ($resource) {
+		return $resource('trade/goodsHistory', {}, {
+			findDataOfUpAndDown: {
+				url: 'trade/goodsHistory/page/batchCode',
+				method: 'GET'
+			}
+		})
 	}]);
 });

+ 6 - 18
src/main/webapp/resources/view/admin/modal/manage/journal_modal.html

@@ -251,7 +251,7 @@
             </tr>
             </tbody>
         </table>
-        <table ng-if="tabs==='smt'">
+        <table ng-if="tabs==='smt'" ng-table="historyTableParams">
             <thead>
             <tr>
                 <th>时间</th>
@@ -261,23 +261,11 @@
             </tr>
             </thead>
             <tbody>
-            <tr>
-                <td>2017-07-02 21.21.21</td>
-                <td>张三</td>
-                <td>上架</td>
-                <td>图处有酷管家</td>
-            </tr>
-            <tr>
-                <td>2017-07-02 21.21.21</td>
-                <td>张三</td>
-                <td>上架</td>
-                <td>图处有酷管家</td>
-            </tr>
-            <tr>
-                <td>2017-07-02 21.21.21</td>
-                <td>张三</td>
-                <td>上架</td>
-                <td>图处有酷管家</td>
+            <tr ng-repeat="history in historyList">
+                <td ng-bind="history.operateDate | date: 'yyyy-MM-dd HH:mm:ss'">2017-07-02 21.21.21</td>
+                <td ng-bind="history.operater.userName">张三</td>
+                <td ng-bind="historyStatus[history.operateType]">上架</td>
+                <td ng-bind="history.downMsg || '-'">图处有酷管家</td>
             </tr>
             </tbody>
         </table>

+ 9 - 9
src/main/webapp/resources/view/admin/product/productManage.html

@@ -18,11 +18,11 @@
                     <div class="form-group form-group-sm">
                         <label class="control-label">
                             在售状态:
-                            <select name="" id="1" class="form-control width88">
+                            <select name="" id="1" class="form-control width88" ng-model="goodsFilter.saleStatus">
                                 <option value="">全部</option>
-                                <option value="">已上架</option>
-                                <option value="">新品未上架</option>
-                                <option value="">已下架</option>
+                                <option value="601">已上架</option>
+                                <option value="613">新品未上架</option>
+                                <option value="612">已下架</option>
                             </select>
                         </label>
                     </div>
@@ -87,10 +87,10 @@
                     <div class="form-group form-group-sm">
                         <label class="control-label">
                             在售数量:
-                            <select name="" id="6" class="form-control width88">
+                            <select name="" id="6" class="form-control width88" ng-model="goodsFilter.saleNum">
                                 <option value="">全部</option>
-                                <option value="">有货</option>
-                                <option value="">不足起订量</option>
+                                <option value="601">有货</option>
+                                <option value="602">不足起订量</option>
                             </select>
                         </label>
                     </div>
@@ -186,8 +186,8 @@
                        <a href="admin#/manage/{{list.id}}">详情</a>
                        <a ng-if="list.audited == 0" ng-click="auditProduct(list)">审核</a>
                        <br/>
-                       <a ng-click="journalProduct()" style="margin-left:-1px;">日志</a>
-                       <a ng-click="soldOutProduct(list.batchCode)">下架</a>
+                       <a ng-click="journalProduct(list)" style="margin-left:-1px;">日志</a>
+                       <a ng-if="list.status == 601 || list.status == 602" ng-click="soldOutProduct([list.batchCode])">下架</a>
                    </td>
                    <td ng-if="titleInShow['商家ID']">
                        <span ng-bind="list.enUU || '-'">商家ID</span>

+ 1 - 1
src/main/webapp/resources/view/admin/product/productManageDetail.html

@@ -6,7 +6,7 @@
             </div>
             <div class="top-right pull-right">
                 <span>在售状态:<em ng-bind="saleStatus[goods.status]">新品未上架</em></span>
-                <button class="btn">下架</button>
+                <button class="btn" ng-if="goods.status == 601 || goods.status == 602" ng-click="soldOutProduct([goods.batchCode])">下架</button>
                 <button class="btn">查看日志</button>
             </div>
         </div>