Browse Source

Bom求购

liusw 8 years ago
parent
commit
56e7b2b5f2

+ 38 - 0
src/main/java/com/uas/platform/b2c/trade/seek/controller/SeekPurchaseController.java

@@ -1,6 +1,7 @@
 package com.uas.platform.b2c.trade.seek.controller;
 
 import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.common.base.model.FileUpload;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
@@ -8,16 +9,24 @@ import com.uas.platform.b2c.trade.seek.model.SeekPurchase;
 import com.uas.platform.b2c.trade.seek.model.SeekPurchaseGoods;
 import com.uas.platform.b2c.trade.seek.service.SeekPurchaseService;
 import com.uas.platform.b2c.trade.support.ResultMap;
+import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.List;
 import java.util.Map;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
+import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -126,4 +135,33 @@ public class SeekPurchaseController {
     public List<Goods> getMallGoodsList(Long spId) {
         return seekPurchaseService.getMallGoodsList(spId);
     }
+
+    /**
+     * 导入bom
+     * @param uploadItem
+     * @return
+     */
+    @RequestMapping(value = "/importBom", method = RequestMethod.POST)
+    public ResultMap importBom(FileUpload uploadItem) {
+        String fileName = uploadItem.getFile().getOriginalFilename();
+        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
+        String bomName = fileName.substring(0, fileName.lastIndexOf("."));
+        InputStream is = null;
+        Workbook workbook = null;
+        try {
+            is = uploadItem.getFile().getInputStream();
+            if ("xls".equals(suffix)) {
+                workbook = new HSSFWorkbook(is);
+            } else if ("xlsx".equals(suffix)) {
+                workbook = new XSSFWorkbook(is);
+            } else {
+                throw new IllegalOperatorException("文件格式不正确!请上传.xls或.xlsx格式的文件");
+            }
+            User user = SystemSession.getUser();
+            seekPurchaseService.importBom(workbook, bomName, user);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
 }

+ 19 - 0
src/main/java/com/uas/platform/b2c/trade/seek/dao/SeekPurchaseByBatchDao.java

@@ -0,0 +1,19 @@
+package com.uas.platform.b2c.trade.seek.dao;
+
+import com.uas.platform.b2c.trade.seek.model.SeekPurchaseByBatch;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 求购业务Dao
+ *
+ * @author liusw
+ * @version 2017/12/12 16:48
+ */
+@Repository
+public interface SeekPurchaseByBatchDao extends JpaSpecificationExecutor<SeekPurchaseByBatch>,
+        JpaRepository<SeekPurchaseByBatch, Long> {
+
+}
+

+ 14 - 0
src/main/java/com/uas/platform/b2c/trade/seek/model/SeekPurchaseBom.java

@@ -56,6 +56,12 @@ public class SeekPurchaseBom {
     @Column(name = "bom_enuu")
     private Long enuu;
 
+    /**
+     * 状态
+     */
+    @Column(name = "bom_status")
+    private Integer status;
+
     public Long getId() {
         return id;
     }
@@ -103,4 +109,12 @@ public class SeekPurchaseBom {
     public void setEnuu(Long enuu) {
         this.enuu = enuu;
     }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
 }

+ 199 - 0
src/main/java/com/uas/platform/b2c/trade/seek/model/SeekPurchaseByBatch.java

@@ -0,0 +1,199 @@
+package com.uas.platform.b2c.trade.seek.model;
+
+import com.uas.platform.b2c.core.utils.RegexConstant;
+import com.uas.platform.b2c.core.utils.StringUtilB2C;
+import com.uas.platform.b2c.prod.commodity.constant.ErrorInfoConstant;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import org.springframework.util.StringUtils;
+
+/**
+ * Bom求购临时类
+ *
+ * @author liusw
+ * @version 2017/12/12 16:45
+ */
+@Entity(name = "trade.seekPurchaseByBatch")
+@Table(name = "trade$seekPurchaseByBatch")
+public class SeekPurchaseByBatch {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @Id
+    @GeneratedValue
+    @Column(name = "sp_id")
+    private Long id;
+
+
+    /**
+     * 求购型号
+     */
+    @Column(name = "sp_code")
+    private String code;
+
+    /**
+     * 求购品牌
+     */
+    @Column(name = "sp_brand")
+    private String brand;
+
+    /**
+     * 求购截止时间
+     */
+    @Column(name = "sp_deadline")
+    private String deadline;
+
+    /**
+     * 求购产品生产日期
+     */
+    @Column(name = "sp_producedate")
+    private String produceDate;
+
+    /**
+     * 求购 封装类型
+     */
+    @Column(name = "sp_encapsulation")
+    private String encapsulation;
+
+    /**
+     * 求购数量
+     */
+    @Column(name = "sp_amount")
+    private Integer amount;
+
+    /**
+     * 求购单价预算
+     */
+    @Column(name = "sp_unitPrice")
+    private Double unitPrice;
+
+    /**
+     * 求购币别
+     */
+    @Column(name = "sp_currency")
+    private String currency;
+
+    /**
+     * 求购产品类目
+     */
+    @Column(name = "sp_kind")
+    private String kind;
+
+    /**
+     * 求购发布时间
+     */
+    @Column(name = "sp_releaseDate")
+    private Date releaseDate;
+
+    /**
+     * Bom清单id
+     */
+    @Column(name = "bom_id")
+    private Long bomId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getBrand() {
+        return brand;
+    }
+
+    public void setBrand(String brand) {
+        this.brand = brand;
+    }
+
+    public String getDeadline() {
+        return deadline;
+    }
+
+    public void setDeadline(String deadline) {
+        this.deadline = deadline;
+    }
+
+    public String getProduceDate() {
+        return produceDate;
+    }
+
+    public void setProduceDate(String produceDate) {
+        this.produceDate = produceDate;
+    }
+
+    public String getEncapsulation() {
+        return encapsulation;
+    }
+
+    public void setEncapsulation(String encapsulation) {
+        this.encapsulation = encapsulation;
+    }
+
+    public Integer getAmount() {
+        return amount;
+    }
+
+    public void setAmount(Integer amount) {
+        this.amount = amount;
+    }
+
+    public Double getUnitPrice() {
+        return unitPrice;
+    }
+
+    public void setUnitPrice(Double unitPrice) {
+        this.unitPrice = unitPrice;
+    }
+
+    public String getCurrency() {
+        return currency;
+    }
+
+    public void setCurrency(String currency) {
+        this.currency = currency;
+    }
+
+    public String getKind() {
+        return kind;
+    }
+
+    public void setKind(String kind) {
+        this.kind = kind;
+    }
+
+    public Date getReleaseDate() {
+        return releaseDate;
+    }
+
+    public void setReleaseDate(Date releaseDate) {
+        this.releaseDate = releaseDate;
+    }
+
+    public Long getBomId() {
+        return bomId;
+    }
+
+    public void setBomId(Long bomId) {
+        this.bomId = bomId;
+    }
+}

+ 12 - 0
src/main/java/com/uas/platform/b2c/trade/seek/service/SeekPurchaseService.java

@@ -8,6 +8,7 @@ import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.model.PageInfo;
 import java.util.List;
 import java.util.Map;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.data.domain.Page;
 
 /**
@@ -78,4 +79,15 @@ public interface SeekPurchaseService {
      * @param purchaseQuantity
      * @return     */
     SeekPurchase confirmSeekPurchase(Long spId, Double purchaseQuantity);
+
+    /**
+     * 导入bom
+     * @param workbook
+     * @param bomName
+     * @param user
+     * @return
+     */
+    ResultMap importBom(Workbook workbook, String bomName, User user);
+
+    ResultMap confirmBom(Long bomId, User user);
 }

+ 179 - 0
src/main/java/com/uas/platform/b2c/trade/seek/service/impl/SeekPurchaseServiceImpl.java

@@ -1,34 +1,54 @@
 package com.uas.platform.b2c.trade.seek.service.impl;
 
 import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.core.utils.StringUtilB2C;
+import com.uas.platform.b2c.prod.commodity.constant.UploadConstant;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
+import com.uas.platform.b2c.prod.commodity.model.ReleaseProductByBatch;
 import com.uas.platform.b2c.prod.product.brand.dao.BrandDao;
 import com.uas.platform.b2c.prod.product.brand.modal.Brand;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentDao;
 import com.uas.platform.b2c.prod.product.component.modal.Component;
+import com.uas.platform.b2c.trade.seek.dao.SeekPurchaseBomDao;
+import com.uas.platform.b2c.trade.seek.dao.SeekPurchaseByBatchDao;
 import com.uas.platform.b2c.trade.seek.dao.SeekPurchaseDao;
 import com.uas.platform.b2c.trade.seek.dao.SeekPurchaseGoodsDao;
 import com.uas.platform.b2c.trade.seek.dao.SeekPurchaseOfferDao;
 import com.uas.platform.b2c.trade.seek.model.SeekPurchase;
+import com.uas.platform.b2c.trade.seek.model.SeekPurchaseBom;
+import com.uas.platform.b2c.trade.seek.model.SeekPurchaseByBatch;
 import com.uas.platform.b2c.trade.seek.model.SeekPurchaseGoods;
 import com.uas.platform.b2c.trade.seek.model.SeekPurchaseOffer;
 import com.uas.platform.b2c.trade.seek.service.SeekPurchaseService;
 import com.uas.platform.b2c.trade.seek.status.Status;
 import com.uas.platform.b2c.trade.support.CodeType;
 import com.uas.platform.b2c.trade.support.ResultMap;
+import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.persistence.criteria.CriterionExpression.Operator;
 import com.uas.platform.core.persistence.criteria.LogicalExpression;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
+import java.math.BigDecimal;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import org.apache.poi.hssf.usermodel.HSSFCell;
+import org.apache.poi.hssf.usermodel.HSSFDateUtil;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Sort.Direction;
@@ -68,6 +88,12 @@ public class SeekPurchaseServiceImpl implements SeekPurchaseService {
     @Autowired
     private SeekPurchaseGoodsDao seekPurchaseGoodsDao;
 
+    @Autowired
+    private SeekPurchaseBomDao seekPurchaseBomDao;
+
+    @Autowired
+    private SeekPurchaseByBatchDao seekPurchaseByBatchDao;
+
     @Override
     public Page<SeekPurchase> getSeekPageInfo(final PageInfo pageInfo, String keyWord) {
         // 关键字
@@ -246,4 +272,157 @@ public class SeekPurchaseServiceImpl implements SeekPurchaseService {
         seekPurchase.setBoughtAmount(boughtAmount);
         return seekPurchasedao.save(seekPurchase);
     }
+
+    @Override
+    public ResultMap importBom(Workbook workbook, String bomName, User user) {
+        // 获取第一个工作表
+        Sheet sheet = workbook.getSheetAt(0);
+        int colNum = sheet.getRow(0).getPhysicalNumberOfCells();
+        int rowNum = sheet.getLastRowNum();
+        if (rowNum > 500) {
+            throw new IllegalOperatorException("您上传的信息超过500条,请拆分成2000以再在上传");
+        }
+        // 插入Bom求购中
+        SeekPurchaseBom seekPurchaseBom = new SeekPurchaseBom();
+        seekPurchaseBom.setReleaseDate(new Date(System.currentTimeMillis()));
+        seekPurchaseBom.setEnuu(user.getEnterprise().getUu());
+        seekPurchaseBom.setUu(user.getUserUU());
+        seekPurchaseBom.setName(bomName);
+        seekPurchaseBom.setStatus(0);
+        seekPurchaseBom = seekPurchaseBomDao.save(seekPurchaseBom);
+        // 创造唯一标识
+        //String batch = createNumberService.getTimeNumber("product$goods", 8, rowNum);
+        // 获取第一行的信息
+        Row headerRow = sheet.getRow(0);
+        int total = 0;
+        int blankNum = 0;
+        if (headerRow != null) {
+            // 验证是否为商城模板
+            List<SeekPurchaseByBatch> seekPurchaseByBatchList = new ArrayList<>();
+            for (int r = 2; r <= rowNum; r++) {
+                Row row = sheet.getRow(r);
+                if (row != null) {
+                    SeekPurchaseByBatch seekPurchaseByBatch = new SeekPurchaseByBatch();
+                    blankNum = convertValueToSeekPurchase(row, seekPurchaseByBatch, r);
+                    seekPurchaseByBatch.setBomId(seekPurchaseBom.getId());
+                    seekPurchaseByBatchList.add(seekPurchaseByBatch);
+                }
+            }
+            seekPurchaseByBatchDao.save(seekPurchaseByBatchList);
+        }
+        return ResultMap.success(seekPurchaseBom.getId());
+    }
+
+    private int convertValueToSeekPurchase(Row row, SeekPurchaseByBatch seekPurchaseByBatch, int rowNum) {
+        // 统计为空的个数
+        int result = 0;
+        Object codeValue = readWorkBookCell(row.getCell(0), Cell.CELL_TYPE_STRING,
+                rowNum, 0);
+        if (StringUtils.isEmpty(codeValue)) {
+            result += 1;
+        }
+        seekPurchaseByBatch.setCode(StringUtilB2C.replaceLineBreak(StringUtilB2C.getStr(codeValue)));
+
+        Object brandValue = readWorkBookCell(row.getCell(1), Cell.CELL_TYPE_STRING,
+                rowNum, 1);
+        if (StringUtils.isEmpty(brandValue)) {
+            result += 1;
+        }
+        seekPurchaseByBatch.setBrand(StringUtilB2C.replaceLineBreak(StringUtilB2C.getStr(brandValue)));
+
+        Object deadlineValue = readWorkBookCell(row.getCell(2), Cell.CELL_TYPE_STRING,
+                rowNum, 2);
+        if (StringUtils.isEmpty(deadlineValue)) {
+            result += 1;
+        }
+        seekPurchaseByBatch.setDeadline(StringUtilB2C.replaceLineBreak(StringUtilB2C.getStr(deadlineValue)));
+
+        Object amountValue = readWorkBookCell(row.getCell(3), Cell.CELL_TYPE_STRING,
+                rowNum, 3);
+        if (!StringUtils.isEmpty(amountValue)) {
+            Integer amount = Integer.valueOf(StringUtilB2C.replaceLineBreak(StringUtilB2C.getStr(deadlineValue)));
+            seekPurchaseByBatch.setAmount(amount);
+        }
+
+        Object currencyValue = readWorkBookCell(row.getCell(4), Cell.CELL_TYPE_STRING,
+                rowNum, 4);
+        if (!StringUtils.isEmpty(currencyValue)) {
+            String currency = StringUtilB2C.replaceLineBreak(StringUtilB2C.getStr(currencyValue));
+            seekPurchaseByBatch.setCurrency(currency);
+        }
+
+        Object unitPriceValue = readWorkBookCell(row.getCell(5), Cell.CELL_TYPE_STRING,
+                rowNum, 5);
+        if (!StringUtils.isEmpty(unitPriceValue)) {
+            Double unitPrice = Double.valueOf(StringUtilB2C.replaceLineBreak(StringUtilB2C.getStr(unitPriceValue)));
+            seekPurchaseByBatch.setUnitPrice(unitPrice);
+        }
+
+        Object encapsulationValue = readWorkBookCell(row.getCell(7), Cell.CELL_TYPE_STRING,
+                rowNum, 7);
+        if (!StringUtils.isEmpty(encapsulationValue)) {
+            String encapsulation = StringUtilB2C.replaceLineBreak(StringUtilB2C.getStr(encapsulationValue));
+            seekPurchaseByBatch.setEncapsulation(encapsulation);
+        }
+
+        Object produceDateValue = readWorkBookCell(row.getCell(8), Cell.CELL_TYPE_STRING,
+                rowNum, 8);
+        if (!StringUtils.isEmpty(produceDateValue)) {
+            String produceDate = StringUtilB2C.replaceLineBreak(StringUtilB2C.getStr(produceDateValue));
+            seekPurchaseByBatch.setProduceDate(produceDate);
+        }
+        return result;
+    }
+
+    private Object readWorkBookCell(Cell cell, int cellType, int r, int n) {
+        Object obj = null;
+        try {
+            if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK) {
+                switch (cellType) {
+                    case Cell.CELL_TYPE_STRING :
+                        cell.setCellType(HSSFCell.CELL_TYPE_STRING);
+                        String str = cell.getStringCellValue().trim();
+                        if (str.indexOf("\u00A0") > 0) {
+                            str= str.replaceAll("\u00A0", "");
+                        }
+                        str = StringUtilB2C.replaceTabAndLineBreak(str);
+                        obj = str.trim();
+                        break;
+                    case Cell.CELL_TYPE_NUMERIC :
+                        cell.setCellType(Cell.CELL_TYPE_NUMERIC);
+                        obj = cell.getNumericCellValue();
+                        if (obj != null) {
+                            if (obj.toString().indexOf("E") > 0) {
+                                BigDecimal b = new BigDecimal(obj.toString());
+                                obj = b.toPlainString();
+                            }
+                        }
+                        break;
+                    default :
+                        if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
+                            String productTime = cell.getStringCellValue();
+                            Pattern p = Pattern.compile("\\s*|\t|\r|\n");
+                            Matcher m = p.matcher(productTime);
+                            String time = m.replaceAll("");
+                            if (time.indexOf("\u00A0") > 0){
+                                time= time.replaceAll("\u00A0", "");
+                            }
+                            DateFormat format1 = new SimpleDateFormat("yyyy/MM/dd");
+                            obj = format1.parse(time);
+                        } else if (HSSFDateUtil.isCellDateFormatted(cell)) {
+                            obj = cell.getDateCellValue();
+                        }
+                        break;
+                }
+            }
+        } catch (Exception e) {
+            throw new IllegalOperatorException("读取表格中" + r + "行" + (n + 1) + "列的内容错误,有可能是该单元格的格式不正确");
+        }
+        return obj;
+    }
+
+    @Override
+    public ResultMap confirmBom(Long bomId, User user) {
+        return null;
+    }
 }

+ 21 - 2
src/main/webapp/resources/js/usercenter/controllers/forstore/seek_purchase_ctrl.js

@@ -6,9 +6,9 @@ define(['app/app'], function (app) {
   'use strict';
   app.register.controller('seekPurchaseCtrl',
       ['$scope', '$rootScope', 'seekPurchase', 'toaster', 'BaseService',
-        'ngTableParams', 'Order', 'SessionService', '$filter',
+        'ngTableParams', 'Order', 'SessionService', '$filter', '$upload',
         function ($scope, $rootScope, seekPurchase, toaster, BaseService,
-            ngTableParams, Order, SessionService, $filter) {
+            ngTableParams, Order, SessionService, $filter, $upload) {
           $rootScope.active = 'seek_purchase';
           document.title = '我的求购-优软商城';
           var enIdFilter = $filter('EncryptionFilter');
@@ -586,5 +586,24 @@ define(['app/app'], function (app) {
             }
           }
 
+          // 上传Excel批量发布(大量)
+          $scope.upload = function() {
+            if(($scope.bomFiles == null) || ($scope.bomFiles.length == 0)) {
+              return ;
+            }
+            var file = $scope.bomFiles[0];
+            if(!file) {
+              toaster.pop('info', '请选择需要上传的文件');
+              return;
+            }
+            $upload.upload({
+              url: 'seek/importBom',
+              file: file,
+              method: 'POST'
+            }).success(function(data) {
+
+            }).error(function(response) {
+            });
+          };
         }]);
 });

+ 6 - 0
src/main/webapp/resources/view/usercenter/forstore/seekPurchase.html

@@ -521,6 +521,12 @@
                 </div>
             </div>
         </div>
+        <div class="upload-content">
+            <input type="text" name="txt" id="upload_text" />
+            <i>选择文件</i>
+            <input type="file" id="uploadCommodity" ng-file-select="" ng-change="selectFile()" accept="*.xls,*.xlsx" ng-model="bomFiles" ng-multiple="false" class="upload01" />
+            <a href="javascript:void(0)" ng-click="upload()" class="blue-bg" style="margin-left: 18px;">确认上传</a>
+        </div>
         <table ng-table="seekPurchaseTableParams">
             <thead>
             <tr>