huangx %!s(int64=7) %!d(string=hai) anos
pai
achega
08150d9002
Modificáronse 59 ficheiros con 2149 adicións e 120 borrados
  1. 0 1
      .gitignore
  2. 1 1
      README.md
  3. 50 1
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/dto/ListReqDTO.java
  4. 2 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/FundinouttypeMapper.java
  5. 28 3
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/FundinouttypeServiceImpl.java
  6. 3 0
      applications/document/document-server/src/main/resources/application.yml
  7. 11 0
      applications/document/document-server/src/main/resources/mapper/FundinouttypeMapper.xml
  8. 3 0
      applications/money/money-server/src/main/resources/application.yml
  9. 10 2
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/controller/SaleReportController.java
  10. 2 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/SaleListMapper.java
  11. 2 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/SaleProfitViewMapper.java
  12. 2 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/SalerecViewMapper.java
  13. 6 4
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/SaleReportService.java
  14. 7 2
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/ProdInOutServiceImpl.java
  15. 74 17
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleReportServiceImpl.java
  16. 7 2
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleServiceImpl.java
  17. 12 0
      applications/sale/sale-server/src/main/resources/mapper/SaleListMapper.xml
  18. 12 0
      applications/sale/sale-server/src/main/resources/mapper/SaleProfitViewMapper.xml
  19. 12 0
      applications/sale/sale-server/src/main/resources/mapper/SalerecViewMapper.xml
  20. 4 0
      frontend/saas-portal-web/Dockerfile
  21. 41 0
      frontend/saas-portal-web/build/build.js
  22. 54 0
      frontend/saas-portal-web/build/check-versions.js
  23. BIN=BIN
      frontend/saas-portal-web/build/logo.png
  24. 101 0
      frontend/saas-portal-web/build/utils.js
  25. 22 0
      frontend/saas-portal-web/build/vue-loader.conf.js
  26. 83 0
      frontend/saas-portal-web/build/webpack.base.conf.js
  27. 95 0
      frontend/saas-portal-web/build/webpack.dev.conf.js
  28. 149 0
      frontend/saas-portal-web/build/webpack.prod.conf.js
  29. 4 4
      frontend/saas-portal-web/config/env.js
  30. 20 0
      frontend/saas-portal-web/runtime/nginx/default.conf
  31. 2 2
      frontend/saas-portal-web/src/components/conenter/company.vue
  32. 10 2
      frontend/saas-portal-web/src/components/conenter/enterprise.vue
  33. 87 2
      frontend/saas-portal-web/src/components/conenter/home.vue
  34. 122 3
      frontend/saas-portal-web/src/components/conenter/sanjiliandong.vue
  35. 40 2
      frontend/saas-web/app/view/core/base/GridPanel.js
  36. 1 0
      frontend/saas-web/app/view/document/product/BasePanel.js
  37. 1 0
      frontend/saas-web/app/view/document/vendor/BasePanel.js
  38. 0 1
      frontend/saas-web/app/view/money/fundtransfer/QueryPanel.js
  39. 1 2
      frontend/saas-web/app/view/money/othreceipts/QueryPanel.js
  40. 2 8
      frontend/saas-web/app/view/money/othspendings/QueryPanel.js
  41. 0 5
      frontend/saas-web/app/view/money/payBalance/QueryPanel.js
  42. 3 4
      frontend/saas-web/app/view/money/recBalance/QueryPanel.js
  43. 15 12
      frontend/saas-web/app/view/purchase/purchase/QueryPanel.js
  44. 1 1
      frontend/saas-web/app/view/purchase/purchaseIn/FormPanel.js
  45. 0 1
      frontend/saas-web/app/view/purchase/purchaseIn/QueryPanel.js
  46. 1 1
      frontend/saas-web/app/view/purchase/purchaseOut/FormPanel.js
  47. 0 5
      frontend/saas-web/app/view/purchase/purchaseOut/QueryPanel.js
  48. 0 1
      frontend/saas-web/app/view/sale/sale/QueryPanel.js
  49. 1 1
      frontend/saas-web/app/view/sale/saleIn/FormPanel.js
  50. 1 1
      frontend/saas-web/app/view/sale/saleIn/QueryPanel.js
  51. 1 1
      frontend/saas-web/app/view/sale/saleOut/FormPanel.js
  52. 1 1
      frontend/saas-web/app/view/sale/saleOut/QueryPanel.js
  53. 1 1
      frontend/saas-web/app/view/stock/appropriationInOut/QueryPanel.js
  54. 0 1
      frontend/saas-web/app/view/stock/make/QueryPanel.js
  55. 1 1
      frontend/saas-web/app/view/stock/otherIn/QueryPanel.js
  56. 2 2
      frontend/saas-web/app/view/stock/otherOut/QueryPanel.js
  57. 59 21
      frontend/saas-web/app/view/sys/guide/FormPanel.js
  58. 2 1
      frontend/saas-web/index.html
  59. 977 0
      frontend/saas-web/resources/othcss/imagehover.css

+ 0 - 1
.gitignore

@@ -29,7 +29,6 @@ applications/**/build/
 base-servers/**/build/
 framework/**/build/
 frontend/saas-web/build/
-frontend/saas-portal-web/build/
 nbbuild/
 dist/
 node_modules/

+ 1 - 1
README.md

@@ -107,7 +107,7 @@
 
 > 构建
 
-* [jenkins](http://192.168.253.3:8080/job/saas) **账号** admin **密码** select123***
+* [jenkins](http://192.168.0.181:8080/job/saas) **账号** admin **密码** select123***
 
 > 日志
 

+ 50 - 1
applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/dto/ListReqDTO.java

@@ -18,6 +18,55 @@ public class ListReqDTO implements Serializable {
      */
     private String mode;
 
+    private String calculateFields;
+
+    //将列拼成查询语句,直接查询出数据的格式为json
+    public String getCalculateFieldsSql() {
+        try {
+            JSONArray jsonArray = JSONArray.parseArray(this.calculateFields);
+            if (null != jsonArray && jsonArray.size() > 0) {
+                StringBuilder fieldsSql = new StringBuilder();
+                StringBuilder fieldSql = null;
+                Object field = null;
+                Object operation = null;
+                String sql = null;
+                for (int i = 0; i < jsonArray.size(); i++) {
+                    JSONObject obj = (JSONObject) jsonArray.get(i);
+                    field = obj.get("field");
+                    operation = obj.get("operation");
+                    if (null != field && null != operation && !"".equals(field) && !"".equals(operation)) {
+                        fieldSql = new StringBuilder("'{");
+                        fieldSql.append("\"" + field + "\":'");
+                        fieldSql.append(",");
+                        fieldSql.append(operation + "(" + field + ")");
+                        fieldSql.append(",");
+                        fieldSql.append("',\"operation\":\"" + operation + "\"");
+                        fieldSql.append("}'");
+                    }
+                    if (null != fieldSql) {
+                        fieldsSql.append(fieldSql + ",\",\",");
+                    }
+                }
+                if (fieldsSql.length() > 0) {
+                    sql = "concat('['," + fieldsSql.substring(0, fieldsSql.length() - 5) + ",']')";
+                }
+                return sql;
+            }
+            return null;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    public String getCalculateFields() {
+        return calculateFields;
+    }
+
+    public void setCalculateFields(String calculateFields) {
+        this.calculateFields = calculateFields;
+    }
+
     public String getCondition() {
         return condition;
     }
@@ -87,7 +136,7 @@ public class ListReqDTO implements Serializable {
         }catch (Exception e){
             return null;
         }
-
     }
+
 }
 

+ 2 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/FundinouttypeMapper.java

@@ -7,6 +7,7 @@ import com.usoftchina.saas.document.entities.Fundinouttype;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 public interface FundinouttypeMapper extends CommonBaseMapper<Fundinouttype> {
     int deleteByPrimaryKey(Long ft_id);
@@ -26,4 +27,5 @@ public interface FundinouttypeMapper extends CommonBaseMapper<Fundinouttype> {
     List<ComboDTO> getCombo(@Param("companyId") Long companyId,@Param("condition") String condition);
 
     List<Fundinouttype> selectAll(@Param("companyId") Long companyId);
+    void check(Map<String, Object> map);
 }

+ 28 - 3
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/FundinouttypeServiceImpl.java

@@ -13,15 +13,20 @@ import com.usoftchina.saas.document.service.FundinouttypeService;
 import com.usoftchina.saas.exception.BizException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @Service
 public class FundinouttypeServiceImpl extends CommonBaseServiceImpl<FundinouttypeMapper, Fundinouttype> implements FundinouttypeService {
 
     @Autowired
     private MessageLogService messageLogService;
+    @Autowired
+    private FundinouttypeMapper fundinouttypeMapper;
 
     /**
      * 保存/更新
@@ -63,10 +68,30 @@ public class FundinouttypeServiceImpl extends CommonBaseServiceImpl<Fundinouttyp
      */
     @Override
     public boolean removeByPrimaryKey(Long id){
+        Fundinouttype fundinouttype = getMapper().selectByPrimaryKey(id);
+        String kind = fundinouttype.getFt_kind();
+        int v_id = 0;
+        if ("收入".equals(kind)){
+            v_id = 1;
+        }else {
+            v_id = 0;
+        }
         if(id != null && id > 0){
-            getMapper().deleteByPrimaryKey(id);
-            //记录LOG
-            messageLogService.delete(generateMsgObj(id));
+            Map<String, Object> map = new HashMap<String, Object>();
+            map.put("v_id",v_id);
+            map.put("v_code", fundinouttype.getFt_name());
+            map.put("v_type","fund");
+            map.put("v_companyid",BaseContextHolder.getCompanyId());
+            map.put("v_res","");
+            fundinouttypeMapper.check(map);
+            Object result =  map.get("v_res");
+            if(!StringUtils.isEmpty(result)){
+                throw new BizException(BizExceptionCode.USING_EXISTS.getCode(),result.toString());
+            }else {
+                getMapper().deleteByPrimaryKey(id);
+                //记录LOG
+                messageLogService.delete(generateMsgObj(id));
+            }
         }
         return true;
     }

+ 3 - 0
applications/document/document-server/src/main/resources/application.yml

@@ -20,6 +20,9 @@ spring:
       connection-timeout: 30000
   messages:
     basename: i18n/messages
+  redis:
+    host: 192.168.253.12
+    port: 6379
   rabbitmq:
     host: 192.168.0.176
     port: 5672

+ 11 - 0
applications/document/document-server/src/main/resources/mapper/FundinouttypeMapper.xml

@@ -167,4 +167,15 @@
           </if>
         </where>
     </select>
+
+  <select id="check" parameterMap="checkParamMap" statementType="CALLABLE">
+        CALL SP_LIMITBASE(?, ?, ?, ?,?)
+    </select>
+  <parameterMap id="checkParamMap" type="java.util.Map">
+    <parameter property="v_type" jdbcType="VARCHAR" mode="IN" />
+    <parameter property="v_id" jdbcType="INTEGER" mode="IN" />
+    <parameter property="v_code" jdbcType="VARCHAR" mode="IN" />
+    <parameter property="v_companyid" jdbcType="INTEGER" mode="IN" />
+    <parameter property="v_res" jdbcType="VARCHAR" mode="OUT" />
+  </parameterMap>
 </mapper>

+ 3 - 0
applications/money/money-server/src/main/resources/application.yml

@@ -18,6 +18,9 @@ spring:
       connection-timeout: 30000
   messages:
     basename: i18n/messages
+  redis:
+    host: 192.168.253.12
+    port: 6379
   rabbitmq:
     host: 192.168.0.176
     port: 5672

+ 10 - 2
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/controller/SaleReportController.java

@@ -10,6 +10,8 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Map;
+
 /**
  * @author: guq
  * @create: 2018-11-09 11:23
@@ -23,13 +25,19 @@ public class SaleReportController {
 
     @GetMapping("/saleProfit")
     public Result SaleProfit(PageRequest page, ListReqDTO req) {
-        PageInfo listData = saleReportService.getSaleProfitData(page, req);
+        Map<String, Object> listData = saleReportService.getSaleProfitData(page, req);
         return Result.success(listData);
     }
 
     @GetMapping("/saleRec")
     public Result SaleRec(PageRequest page, ListReqDTO req) {
-        PageInfo listData = saleReportService.getSaleRecData(page, req);
+        Map<String, Object> listData = saleReportService.getSaleRecData(page, req);
+        return Result.success(listData);
+    }
+
+    @GetMapping("/saleDetail")
+    public Result saleDetail(PageRequest page, ListReqDTO req) {
+        Map<String, Object> listData = saleReportService.getSaleDetail(page, req);
         return Result.success(listData);
     }
 

+ 2 - 0
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/SaleListMapper.java

@@ -12,4 +12,6 @@ public interface SaleListMapper {
 
     List<SaleList> selectSaleByCondition(@Param("con") String con, @Param("companyId") Long companyId);
 
+    String selectCalculateFields(@Param("fields") String fields, @Param("con") String con, @Param("companyId") Long companyId);
+
 }

+ 2 - 0
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/SaleProfitViewMapper.java

@@ -8,4 +8,6 @@ import java.util.List;
 public interface SaleProfitViewMapper {
 
     List<SaleProfitView> selectByCondition(@Param("con") String con, @Param("companyId") Long companyId);
+
+    String selectCalculateFields(@Param("fields") String fields, @Param("con") String con, @Param("companyId") Long companyId);
 }

+ 2 - 0
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/SalerecViewMapper.java

@@ -8,4 +8,6 @@ import java.util.List;
 public interface SalerecViewMapper {
 
     List<SalerecView> selectByCondition(@Param("con") String con, @Param("companyId") Long companyId);
+
+    String selectCalculateFields(@Param("fields") String fields, @Param("con") String con, @Param("companyId") Long companyId);
 }

+ 6 - 4
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/SaleReportService.java

@@ -1,12 +1,14 @@
 package com.usoftchina.saas.sale.service;
 
-import com.github.pagehelper.PageInfo;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
 import com.usoftchina.saas.page.PageRequest;
-import com.usoftchina.saas.sale.po.report.SalerecView;
+
+import java.util.Map;
 
 public interface SaleReportService {
-    PageInfo getSaleProfitData(PageRequest page, ListReqDTO req);
+    Map<String, Object> getSaleProfitData(PageRequest page, ListReqDTO req);
+
+    Map<String, Object> getSaleRecData(PageRequest page, ListReqDTO req);
 
-    PageInfo getSaleRecData(PageRequest page, ListReqDTO req);
+    Map<String, Object> getSaleDetail(PageRequest page, ListReqDTO req);
 }

+ 7 - 2
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/ProdInOutServiceImpl.java

@@ -381,6 +381,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         double pdYqty=0;
         double pdSendPrice = 0.0;
         double pdTaxrate = 0.0;
+        DocBaseDTO baseDTO = new DocBaseDTO();
         ProdInOut sourcePi = checkAndReturnOrder(id);
         List<ProdIODetail> sourceDetails =prodIODetailMapper.selectByFK(id);
         if (null == sourcePi || StringUtils.isEmpty(sourcePi.getPi_inoutno()) || sourceDetails.size() == 0) {
@@ -481,8 +482,12 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         setTotal(targetPi);
 
         //日志记录
-        DocBaseDTO baseDTO = new DocBaseDTO(id, sourcePi.getPi_inoutno(), BillCodeSeq.SALEIN.getCaller());
-        messageLogService.customizeLog(baseDTO, Operation.TURNPRODOUTRETURN);
+        DocBaseDTO log = new DocBaseDTO(id, sourcePi.getPi_inoutno(), BillCodeSeq.SALEIN.getCaller());
+        messageLogService.customizeLog(log, Operation.TURNPRODOUTRETURN);
+
+        baseDTO.setId(pi_id);
+        baseDTO.setCode(piInoutno);
+        baseDTO.setName(BillCodeSeq.SALEIN.getName());
         return baseDTO;
 
     }

+ 74 - 17
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleReportServiceImpl.java

@@ -1,18 +1,23 @@
 package com.usoftchina.saas.sale.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
 import com.usoftchina.saas.context.BaseContextHolder;
 import com.usoftchina.saas.page.PageDefault;
 import com.usoftchina.saas.page.PageRequest;
+import com.usoftchina.saas.sale.mapper.SaleListMapper;
 import com.usoftchina.saas.sale.mapper.SaleProfitViewMapper;
 import com.usoftchina.saas.sale.mapper.SalerecViewMapper;
 import com.usoftchina.saas.sale.service.SaleReportService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author: guq
@@ -25,38 +30,90 @@ public class SaleReportServiceImpl implements SaleReportService{
     private SaleProfitViewMapper saleProfitViewMapper;
     @Autowired
     private SalerecViewMapper salerecViewMapper;
+    @Autowired
+    private SaleListMapper saleListMapper;
 
     @Override
-    public PageInfo getSaleProfitData(PageRequest page, ListReqDTO req) {
-        return getListDATA(page, req, "SaleProfit");
+    public Map<String, Object> getSaleProfitData(@PageDefault(size = 10) PageRequest page, ListReqDTO req) {
+        PageHelper.startPage(page.getNumber(), page.getSize());
+        Map<String, Object> map = new HashMap<String, Object>();
+        List list = null;
+        Long companyId = BaseContextHolder.getCompanyId();
+        String con = req.getFinalCondition();
+        String calculateFieldsSql = req.getCalculateFieldsSql();
+        JSONArray arr = null;
+        if (null == con) {
+            con = "1=1";
+        }
+        list = saleProfitViewMapper.selectByCondition(con, companyId);
+        //取分页信息
+        PageInfo pageInfo = new PageInfo(list);
+        //取对应计算数据
+        if (!StringUtils.isEmpty(calculateFieldsSql)) {
+            String res = saleProfitViewMapper.selectCalculateFields(calculateFieldsSql, con, companyId);
+            try {
+                arr = JSONArray.parseArray(res);
+            } catch (Exception e) {
+            }
+        }
+        map.put("list", pageInfo);
+        map.put("calculate", arr);
+        return map;
     }
 
     @Override
-    public PageInfo getSaleRecData(PageRequest page, ListReqDTO req) {
-        return getListDATA(page, req, "SaleRec");
-    }
-
-    private PageInfo getListDATA(@PageDefault(size = 10) PageRequest page, ListReqDTO req, String type) {
+    public Map<String, Object> getSaleRecData(@PageDefault(size = 10) PageRequest page, ListReqDTO req) {
         PageHelper.startPage(page.getNumber(), page.getSize());
-        //查询数据
-        List lists = getListByType(req, type);
+        Map<String, Object> map = new HashMap<String, Object>();
+        List list = null;
+        Long companyId = BaseContextHolder.getCompanyId();
+        String con = req.getFinalCondition();
+        String calculateFieldsSql = req.getCalculateFieldsSql();
+        JSONArray arr = null;
+        if (null == con) {
+            con = "1=1";
+        }
+        list = salerecViewMapper.selectByCondition(con, companyId);
         //取分页信息
-        PageInfo pageInfo = new PageInfo(lists);
-        return pageInfo;
+        PageInfo pageInfo = new PageInfo(list);
+        //取对应计算数据
+        if (!StringUtils.isEmpty(calculateFieldsSql)) {
+            String res = salerecViewMapper.selectCalculateFields(calculateFieldsSql, con, companyId);
+            try {
+                arr = JSONArray.parseArray(res);
+            } catch (Exception e) {
+            }
+        }
+        map.put("list", pageInfo);
+        map.put("calculate", arr);
+        return map;
     }
 
-    private List getListByType(ListReqDTO req, String type) {
+    @Override
+    public Map<String, Object> getSaleDetail(@PageDefault(size = 10) PageRequest page, ListReqDTO req) {
+        PageHelper.startPage(page.getNumber(), page.getSize());
+        Map<String, Object> map = new HashMap<String, Object>();
         List list = null;
         Long companyId = BaseContextHolder.getCompanyId();
         String con = req.getFinalCondition();
+        String calculateFieldsSql = req.getCalculateFieldsSql();
+        JSONArray arr = null;
         if (null == con) {
             con = "1=1";
         }
-        if ("SaleProfit".equals(type)) {
-            list = saleProfitViewMapper.selectByCondition(con, companyId);
-        } else if ("SaleRec".equals(type)){
-            list = salerecViewMapper.selectByCondition(con, companyId);
+        list = saleListMapper.selectSaleListByCondition(con, companyId);
+        //取分页信息
+        PageInfo pageInfo = new PageInfo(list);
+        //取对应计算数据
+        if (!StringUtils.isEmpty(calculateFieldsSql)) {
+            String res = saleListMapper.selectCalculateFields(calculateFieldsSql, con, companyId);
+            try {
+                arr = JSONArray.parseArray(res);
+            } catch (Exception e) {
+            }
         }
-        return list;
+        map.put("list", pageInfo);
+        map.put("calculate", arr);
+        return map;
     }
 }

+ 7 - 2
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleServiceImpl.java

@@ -414,6 +414,7 @@ public class SaleServiceImpl implements SaleService{
         Integer count = 0;
         double pdQty = 0;
         double pdYqty = 0;
+        DocBaseDTO baseDTO = new DocBaseDTO();
         Long companyId = BaseContextHolder.getCompanyId();
         Sale sale = saleMapper.selectByPrimaryKey(id);
         List<SaleDetail> details = saledetailMapper.selectByFK(id);
@@ -502,8 +503,12 @@ public class SaleServiceImpl implements SaleService{
         prodIODetailMapper.updatePDSaleOut(pi_id);
         prodInOutMapper.updatePiTotal(pi_id);
         //日志记录
-        DocBaseDTO baseDTO = new DocBaseDTO(id, sale.getSa_code(), BillCodeSeq.SALEOUT.getCaller());
-        messageLogService.customizeLog(baseDTO, Operation.TURNPRODOUT);
+        DocBaseDTO log = new DocBaseDTO(id, sale.getSa_code(), BillCodeSeq.SALEOUT.getCaller());
+        messageLogService.customizeLog(log, Operation.TURNPRODOUT);
+
+        baseDTO.setId(pi_id);
+        baseDTO.setCode(pi_inoutno);
+        baseDTO.setName(BillCodeSeq.SALEOUT.getName());
         return baseDTO;
     }
 

+ 12 - 0
applications/sale/sale-server/src/main/resources/mapper/SaleListMapper.xml

@@ -108,4 +108,16 @@
         order by sa_id desc
     </select>
 
+    <select id="selectCalculateFields" resultType="string">
+        select  ${fields}  from sale left join saledetail on sa_id=sd_said left join product
+        on sd_prodid = pr_id and sale.companyId = product.companyid
+        <where>
+            <if test="con != null">
+                ${con}
+            </if>
+            <if test="companyId != null">
+                and   sale.companyId = #{companyId}
+            </if>
+        </where>
+    </select>
 </mapper>

+ 12 - 0
applications/sale/sale-server/src/main/resources/mapper/SaleProfitViewMapper.xml

@@ -39,4 +39,16 @@
     </where>
     order by sa_date desc
   </select>
+
+  <select id="selectCalculateFields" resultType="string">
+    select   ${fields}  from Sale_Profit_View
+    <where>
+      <if test="con != null">
+        ${con}
+      </if>
+      <if test="companyId != null">
+        and  companyId = #{companyId}
+      </if>
+    </where>
+  </select>
  </mapper>

+ 12 - 0
applications/sale/sale-server/src/main/resources/mapper/SalerecViewMapper.xml

@@ -29,4 +29,16 @@
     </where>
     order by rb_date desc
   </select>
+
+  <select id="selectCalculateFields" resultType="string">
+    select   ${fields}  from Salerec_View
+    <where>
+      <if test="con != null">
+        ${con}
+      </if>
+      <if test="companyId != null">
+        and  companyId = #{companyId}
+      </if>
+    </where>
+  </select>
 </mapper>

+ 4 - 0
frontend/saas-portal-web/Dockerfile

@@ -0,0 +1,4 @@
+FROM hub.c.163.com/library/nginx
+MAINTAINER USOFTCHINA <yingp@usoftchina.com>
+RUN rm /etc/nginx/conf.d/default.conf
+ADD runtime/nginx/default.conf /etc/nginx/conf.d/

+ 41 - 0
frontend/saas-portal-web/build/build.js

@@ -0,0 +1,41 @@
+'use strict'
+require('./check-versions')()
+
+process.env.NODE_ENV = 'production'
+
+const ora = require('ora')
+const rm = require('rimraf')
+const path = require('path')
+const chalk = require('chalk')
+const webpack = require('webpack')
+const config = require('../config')
+const webpackConfig = require('./webpack.prod.conf')
+
+const spinner = ora('building for production...')
+spinner.start()
+
+rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
+  if (err) throw err
+  webpack(webpackConfig, (err, stats) => {
+    spinner.stop()
+    if (err) throw err
+    process.stdout.write(stats.toString({
+      colors: true,
+      modules: false,
+      children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
+      chunks: false,
+      chunkModules: false
+    }) + '\n\n')
+
+    if (stats.hasErrors()) {
+      console.log(chalk.red('  Build failed with errors.\n'))
+      process.exit(1)
+    }
+
+    console.log(chalk.cyan('  Build complete.\n'))
+    console.log(chalk.yellow(
+      '  Tip: built files are meant to be served over an HTTP server.\n' +
+      '  Opening index.html over file:// won\'t work.\n'
+    ))
+  })
+})

+ 54 - 0
frontend/saas-portal-web/build/check-versions.js

@@ -0,0 +1,54 @@
+'use strict'
+const chalk = require('chalk')
+const semver = require('semver')
+const packageConfig = require('../package.json')
+const shell = require('shelljs')
+
+function exec (cmd) {
+  return require('child_process').execSync(cmd).toString().trim()
+}
+
+const versionRequirements = [
+  {
+    name: 'node',
+    currentVersion: semver.clean(process.version),
+    versionRequirement: packageConfig.engines.node
+  }
+]
+
+if (shell.which('npm')) {
+  versionRequirements.push({
+    name: 'npm',
+    currentVersion: exec('npm --version'),
+    versionRequirement: packageConfig.engines.npm
+  })
+}
+
+module.exports = function () {
+  const warnings = []
+
+  for (let i = 0; i < versionRequirements.length; i++) {
+    const mod = versionRequirements[i]
+
+    if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
+      warnings.push(mod.name + ': ' +
+        chalk.red(mod.currentVersion) + ' should be ' +
+        chalk.green(mod.versionRequirement)
+      )
+    }
+  }
+
+  if (warnings.length) {
+    console.log('')
+    console.log(chalk.yellow('To use this template, you must update following to modules:'))
+    console.log()
+
+    for (let i = 0; i < warnings.length; i++) {
+      const warning = warnings[i]
+      console.log('  ' + warning)
+    }
+
+    console.log()
+    process.exit(1)
+  }
+}

BIN=BIN
frontend/saas-portal-web/build/logo.png


+ 101 - 0
frontend/saas-portal-web/build/utils.js

@@ -0,0 +1,101 @@
+'use strict'
+const path = require('path')
+const config = require('../config')
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const packageConfig = require('../package.json')
+
+exports.assetsPath = function (_path) {
+  const assetsSubDirectory = process.env.NODE_ENV === 'production'
+    ? config.build.assetsSubDirectory
+    : config.dev.assetsSubDirectory
+
+  return path.posix.join(assetsSubDirectory, _path)
+}
+
+exports.cssLoaders = function (options) {
+  options = options || {}
+
+  const cssLoader = {
+    loader: 'css-loader',
+    options: {
+      sourceMap: options.sourceMap
+    }
+  }
+
+  const postcssLoader = {
+    loader: 'postcss-loader',
+    options: {
+      sourceMap: options.sourceMap
+    }
+  }
+
+  // generate loader string to be used with extract text plugin
+  function generateLoaders (loader, loaderOptions) {
+    const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
+
+    if (loader) {
+      loaders.push({
+        loader: loader + '-loader',
+        options: Object.assign({}, loaderOptions, {
+          sourceMap: options.sourceMap
+        })
+      })
+    }
+
+    // Extract CSS when that option is specified
+    // (which is the case during production build)
+    if (options.extract) {
+      return ExtractTextPlugin.extract({
+        use: loaders,
+        fallback: 'vue-style-loader'
+      })
+    } else {
+      return ['vue-style-loader'].concat(loaders)
+    }
+  }
+
+  // https://vue-loader.vuejs.org/en/configurations/extract-css.html
+  return {
+    css: generateLoaders(),
+    postcss: generateLoaders(),
+    less: generateLoaders('less'),
+    sass: generateLoaders('sass', { indentedSyntax: true }),
+    scss: generateLoaders('sass'),
+    stylus: generateLoaders('stylus'),
+    styl: generateLoaders('stylus')
+  }
+}
+
+// Generate loaders for standalone style files (outside of .vue)
+exports.styleLoaders = function (options) {
+  const output = []
+  const loaders = exports.cssLoaders(options)
+
+  for (const extension in loaders) {
+    const loader = loaders[extension]
+    output.push({
+      test: new RegExp('\\.' + extension + '$'),
+      use: loader
+    })
+  }
+
+  return output
+}
+
+exports.createNotifierCallback = () => {
+  const notifier = require('node-notifier')
+
+  return (severity, errors) => {
+    if (severity !== 'error') return
+
+    const error = errors[0]
+    const filename = error.file && error.file.split('!').pop()
+
+    notifier.notify({
+      title: packageConfig.name,
+      message: severity + ': ' + error.name,
+      subtitle: filename || '',
+      icon: path.join(__dirname, 'logo.png')
+    })
+  }
+}

+ 22 - 0
frontend/saas-portal-web/build/vue-loader.conf.js

@@ -0,0 +1,22 @@
+'use strict'
+const utils = require('./utils')
+const config = require('../config')
+const isProduction = process.env.NODE_ENV === 'production'
+const sourceMapEnabled = isProduction
+  ? config.build.productionSourceMap
+  : config.dev.cssSourceMap
+
+module.exports = {
+  loaders: utils.cssLoaders({
+    sourceMap: sourceMapEnabled,
+    extract: isProduction
+  }),
+  cssSourceMap: sourceMapEnabled,
+  cacheBusting: config.dev.cacheBusting,
+  transformToRequire: {
+    video: ['src', 'poster'],
+    source: 'src',
+    img: 'src',
+    image: 'xlink:href'
+  }
+}

+ 83 - 0
frontend/saas-portal-web/build/webpack.base.conf.js

@@ -0,0 +1,83 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const config = require('../config')
+const vueLoaderConfig = require('./vue-loader.conf')
+
+function resolve (dir) {
+  return path.join(__dirname, '..', dir)
+}
+
+
+
+module.exports = {
+  context: path.resolve(__dirname, '../'),
+  entry: {
+    app: './src/main.js',
+    env: './config/env.js'
+  },
+  output: {
+    path: config.build.assetsRoot,
+    filename: '[name].js',
+    publicPath: process.env.NODE_ENV === 'production'
+      ? config.build.assetsPublicPath
+      : config.dev.assetsPublicPath
+  },
+  resolve: {
+    extensions: ['.js', '.vue', '.json'],
+    alias: {
+      'vue$': 'vue/dist/vue.esm.js',
+      '@': resolve('src'),
+    }
+  },
+  module: {
+    rules: [
+      {
+        test: /\.vue$/,
+        loader: 'vue-loader',
+        options: vueLoaderConfig
+      },
+      {
+        test: /\.js$/,
+        loader: 'babel-loader',
+        include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
+      },
+      {
+        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('img/[name].[hash:7].[ext]')
+        }
+      },
+      {
+        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('media/[name].[hash:7].[ext]')
+        }
+      },
+      {
+        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
+        }
+      }
+    ]
+  },
+  node: {
+    // prevent webpack from injecting useless setImmediate polyfill because Vue
+    // source contains it (although only uses it if it's native).
+    setImmediate: false,
+    // prevent webpack from injecting mocks to Node native modules
+    // that does not make sense for the client
+    dgram: 'empty',
+    fs: 'empty',
+    net: 'empty',
+    tls: 'empty',
+    child_process: 'empty'
+  }
+}

+ 95 - 0
frontend/saas-portal-web/build/webpack.dev.conf.js

@@ -0,0 +1,95 @@
+'use strict'
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const path = require('path')
+const baseWebpackConfig = require('./webpack.base.conf')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
+const portfinder = require('portfinder')
+
+const HOST = process.env.HOST
+const PORT = process.env.PORT && Number(process.env.PORT)
+
+const devWebpackConfig = merge(baseWebpackConfig, {
+  module: {
+    rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
+  },
+  // cheap-module-eval-source-map is faster for development
+  devtool: config.dev.devtool,
+
+  // these devServer options should be customized in /config/index.js
+  devServer: {
+    clientLogLevel: 'warning',
+    historyApiFallback: {
+      rewrites: [
+        { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
+      ],
+    },
+    hot: true,
+    contentBase: false, // since we use CopyWebpackPlugin.
+    compress: true,
+    host: HOST || config.dev.host,
+    port: PORT || config.dev.port,
+    open: config.dev.autoOpenBrowser,
+    overlay: config.dev.errorOverlay
+      ? { warnings: false, errors: true }
+      : false,
+    publicPath: config.dev.assetsPublicPath,
+    proxy: config.dev.proxyTable,
+    quiet: true, // necessary for FriendlyErrorsPlugin
+    watchOptions: {
+      poll: config.dev.poll,
+    }
+  },
+  plugins: [
+    new webpack.DefinePlugin({
+      'process.env': require('../config/dev.env')
+    }),
+    new webpack.HotModuleReplacementPlugin(),
+    new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
+    new webpack.NoEmitOnErrorsPlugin(),
+    // https://github.com/ampedandwired/html-webpack-plugin
+    new HtmlWebpackPlugin({
+      filename: 'index.html',
+      template: 'index.html',
+      inject: true
+    }),
+    // copy custom static assets
+    new CopyWebpackPlugin([
+      {
+        from: path.resolve(__dirname, '../static'),
+        to: config.dev.assetsSubDirectory,
+        ignore: ['.*']
+      }
+    ])
+  ]
+})
+
+module.exports = new Promise((resolve, reject) => {
+  portfinder.basePort = process.env.PORT || config.dev.port
+  portfinder.getPort((err, port) => {
+    if (err) {
+      reject(err)
+    } else {
+      // publish the new Port, necessary for e2e tests
+      process.env.PORT = port
+      // add port to devServer config
+      devWebpackConfig.devServer.port = port
+
+      // Add FriendlyErrorsPlugin
+      devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
+        compilationSuccessInfo: {
+          messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
+        },
+        onErrors: config.dev.notifyOnErrors
+        ? utils.createNotifierCallback()
+        : undefined
+      }))
+
+      resolve(devWebpackConfig)
+    }
+  })
+})

+ 149 - 0
frontend/saas-portal-web/build/webpack.prod.conf.js

@@ -0,0 +1,149 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const baseWebpackConfig = require('./webpack.base.conf')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
+const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
+
+const env = process.env.NODE_ENV === 'testing'
+  ? require('../config/test.env')
+  : require('../config/prod.env')
+
+const webpackConfig = merge(baseWebpackConfig, {
+  module: {
+    rules: utils.styleLoaders({
+      sourceMap: config.build.productionSourceMap,
+      extract: true,
+      usePostCSS: true
+    })
+  },
+  devtool: config.build.productionSourceMap ? config.build.devtool : false,
+  output: {
+    path: config.build.assetsRoot,
+    filename: utils.assetsPath('js/[name].[chunkhash].js'),
+    chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
+  },
+  plugins: [
+    // http://vuejs.github.io/vue-loader/en/workflow/production.html
+    new webpack.DefinePlugin({
+      'process.env': env
+    }),
+    new UglifyJsPlugin({
+      uglifyOptions: {
+        compress: {
+          warnings: false
+        }
+      },
+      sourceMap: config.build.productionSourceMap,
+      parallel: true
+    }),
+    // extract css into its own file
+    new ExtractTextPlugin({
+      filename: utils.assetsPath('css/[name].[contenthash].css'),
+      // Setting the following option to `false` will not extract CSS from codesplit chunks.
+      // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
+      // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, 
+      // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
+      allChunks: true,
+    }),
+    // Compress extracted CSS. We are using this plugin so that possible
+    // duplicated CSS from different components can be deduped.
+    new OptimizeCSSPlugin({
+      cssProcessorOptions: config.build.productionSourceMap
+        ? { safe: true, map: { inline: false } }
+        : { safe: true }
+    }),
+    // generate dist index.html with correct asset hash for caching.
+    // you can customize output by editing /index.html
+    // see https://github.com/ampedandwired/html-webpack-plugin
+    new HtmlWebpackPlugin({
+      filename: process.env.NODE_ENV === 'testing'
+        ? 'index.html'
+        : config.build.index,
+      template: 'index.html',
+      inject: true,
+      minify: {
+        removeComments: true,
+        collapseWhitespace: true,
+        removeAttributeQuotes: true
+        // more options:
+        // https://github.com/kangax/html-minifier#options-quick-reference
+      },
+      // necessary to consistently work with multiple chunks via CommonsChunkPlugin
+      chunksSortMode: 'dependency'
+    }),
+    // keep module.id stable when vendor modules does not change
+    new webpack.HashedModuleIdsPlugin(),
+    // enable scope hoisting
+    new webpack.optimize.ModuleConcatenationPlugin(),
+    // split vendor js into its own file
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'vendor',
+      minChunks (module) {
+        // any required modules inside node_modules are extracted to vendor
+        return (
+          module.resource &&
+          /\.js$/.test(module.resource) &&
+          module.resource.indexOf(
+            path.join(__dirname, '../node_modules')
+          ) === 0
+        )
+      }
+    }),
+    // extract webpack runtime and module manifest to its own file in order to
+    // prevent vendor hash from being updated whenever app bundle is updated
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'manifest',
+      minChunks: Infinity
+    }),
+    // This instance extracts shared chunks from code splitted chunks and bundles them
+    // in a separate chunk, similar to the vendor chunk
+    // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'app',
+      async: 'vendor-async',
+      children: true,
+      minChunks: 3
+    }),
+
+    // copy custom static assets
+    new CopyWebpackPlugin([
+      {
+        from: path.resolve(__dirname, '../static'),
+        to: config.build.assetsSubDirectory,
+        ignore: ['.*']
+      }
+    ])
+  ]
+})
+
+if (config.build.productionGzip) {
+  const CompressionWebpackPlugin = require('compression-webpack-plugin')
+
+  webpackConfig.plugins.push(
+    new CompressionWebpackPlugin({
+      asset: '[path].gz[query]',
+      algorithm: 'gzip',
+      test: new RegExp(
+        '\\.(' +
+        config.build.productionGzipExtensions.join('|') +
+        ')$'
+      ),
+      threshold: 10240,
+      minRatio: 0.8
+    })
+  )
+}
+
+if (config.build.bundleAnalyzerReport) {
+  const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
+  webpackConfig.plugins.push(new BundleAnalyzerPlugin())
+}
+
+module.exports = webpackConfig

+ 4 - 4
frontend/saas-portal-web/config/env.js

@@ -7,8 +7,8 @@ if (process.env.NODE_ENV == 'production') {
         },
         server: {
             // 后端接口网关
-            // baseUrl: 'http://192.168.0.181:8560',
-            baseUrl: 'http://192.168.253.58:8560',
+            baseUrl: 'http://192.168.0.181:8560',
+            // baseUrl: 'http://192.168.253.58:8560',
             // 账户中心接口
             ssoUrl: 'http://192.168.253.12:32323'
         }
@@ -23,8 +23,8 @@ if (process.env.NODE_ENV == 'production') {
         },
         server: {
             // 后端接口网关
-            // baseUrl: 'http://192.168.0.181:8560',
-            baseUrl: 'http://192.168.253.58:8560',
+            baseUrl: 'http://192.168.0.181:8560',
+            // baseUrl: 'http://192.168.253.58:8560',
             // 账户中心接口
             ssoUrl: 'http://192.168.253.12:32323'
         }

+ 20 - 0
frontend/saas-portal-web/runtime/nginx/default.conf

@@ -0,0 +1,20 @@
+server {
+    listen       80;
+    server_name  localhost;
+
+    charset utf-8;
+
+    location / {
+        root   /usr/share/nginx/html;
+        index  index.html index.htm;
+    }
+
+    #error_page  404              /404.html;
+
+    # redirect server error pages to the static page /50x.html
+    #
+    error_page   500 502 503 504  /50x.html;
+    location = /50x.html {
+        root   html;
+    }
+}

+ 2 - 2
frontend/saas-portal-web/src/components/conenter/company.vue

@@ -107,8 +107,8 @@
             //没有内容也要有一定的高度
             boxheight(){
                 let H = $(".gs-qiyebox").height();
-                if (H <= 300) {
-                    $(".gs-qiyebox").css("height",'300px')
+                if (H <= 500) {
+                    $(".gs-qiyebox").css("height",'500px')
                 } else {
                     $(".gs-qiyebox").css("height",'')
                 }

+ 10 - 2
frontend/saas-portal-web/src/components/conenter/enterprise.vue

@@ -24,10 +24,10 @@
                     <li><a href="#"><span>功能</span></a></li>
                     <li><a href="#"><span>帮助中心</span></a></li>
                     <li><a href="#"><span>联系我们</span></a></li>
-                    <li class="login">
+                    <!-- <li class="login">
                         <span class="btn1"><img src="../../../static/img/assets/denglu3x.png" alt="">登录  &nbsp;</span>
                         <span class="register"><img src="../../../static/img/assets/zhuce3x.png" alt="">注册</span>
-                    </li>
+                    </li> -->
                 </ul>
             </div>
         </div>
@@ -72,6 +72,7 @@
                     </div>
                 </div>
     <!-- 安全信息----------------------------------------------------------------------------- -->
+                <!-- <sjld></sjld> -->
                 <div :class="{gsqiye:nowindex == 2}">
                     <div class="gs-anquanxinxi">
                         <div class="over aq-title"><span class="left">登录密码</span><button class="right dianji">更换密码</button></div>
@@ -109,12 +110,19 @@
             return{
                 nowindex: 0,//tab切换
                 tianjiaqiye: true,//添加企业切换
+                mydata: this.$route.query.mydata,
                 tab: [
                     {name: '企业信息'},
                     {name: '个人信息'},
                     {name: '安全信息'},
                     ],
             }
+        },
+        mounted(){
+            console.log(this.mydata)
+        },
+        components: {
+            
         },
         methods: {
             // tab切换

+ 87 - 2
frontend/saas-portal-web/src/components/conenter/home.vue

@@ -302,7 +302,7 @@
 			}
 		},
 		mounted(){
-			
+			this.zdtoken();
 		},
 		updated(){
 
@@ -417,7 +417,7 @@
 							if (!account.companyId) {
 								// 登录成功跳转到企业设置
 								console.log("跳转前");
-								me.$router.push({path:'/enterprise'});
+								me.$router.push({path:'/enterprise',query: {mydata :account}});
 								console.log("跳转后"); 
 							} else {
 								//如果开通过sass直接跳转到sass页面
@@ -445,6 +445,91 @@
 				$('#box').css('display','none');
 				$(".zhezhao").css("display","none")
 			},
+			zdtoken(){
+				var Store = (function(){
+					var storeKey = 'app-state', store = window.localStorage;
+					return {
+						get: function(key, defaultValue) {
+							var value = store.getItem(storeKey + '-' + key);
+							return value === undefined? defaultValue : JSON.parse(value);
+						},
+						set: function(key, value) {
+							store.setItem(storeKey + '-' + key, JSON.stringify(value));
+						}
+					};
+				})();
+				var Session = (function(){
+					var key = 'session';
+					return {
+						load: function() {
+							return Store.get(key);
+						},
+						loadData: function(data) {
+							data.span = data.timestamp - new Date().getTime();
+							Store.set(key, data);
+						},
+						isValid: function() {
+							var token = this.load();
+							return token && token.timestamp + token.expire * 1000 > new Date().getTime() + token.span;
+						},
+						get: function(prop) {
+							var token = this.load();
+							return token ? token[prop] : null;
+						},
+						set: function(prop, value) {
+							var token = this.load();
+							if (token) {
+								token[prop] = value;
+								Store.set(key, token);
+							}
+						}
+					}
+				})();
+				var setUserProfile = function(account) {
+					if (account) {
+						$(".login").css("display","none");
+						// 显示用户信息
+						$("#user-info").text(account.realname || account.username);
+						$(".profile").css("display","block")
+					} else {
+						$(".login").css("display","block");
+						$(".profile").css("display","none")
+					}
+				};
+				// 已经登录过从Store取出信息
+				setUserProfile(Session.get('account'));
+				// socket
+				var listenOnCallback = function(clientId, resolve) {
+					var socket = new SockJS(env.server.baseUrl + "/ws");
+					var stompClient = Stomp.over(socket);
+					stompClient.connect({}, function(frame) {
+						stompClient.subscribe('/clients/' + clientId + '/sso/callback', function(message){
+							stompClient.disconnect(function(){
+								resolve(JSON.parse(message.body));
+							});
+						});
+					});
+				};
+				// 系统页面token
+				var Frontend = (function(){
+					var frame;
+					return {
+						init: function() {
+							$('body').append('<iframe id="frontend" hidden src="' + 
+								env.frontend.baseUrl + '/set-token.html"></iframe>');
+							frame = window.frames[window.frames.length - 1];
+						},
+						set: function(session, callback) {
+							window.addEventListener('message', callback, false);
+							frame.postMessage(JSON.stringify(session), '*');
+						},
+						redirect: function() {
+							window.location.href = env.frontend.baseUrl;
+						}
+					};
+				})();
+				Frontend.init();
+			}
 		}
     }
 </script>

+ 122 - 3
frontend/saas-portal-web/src/components/conenter/sanjiliandong.vue

@@ -58,7 +58,7 @@
     </div>
 </template>
 <script>
-    import submitB from "../submitB"; 
+    // import submitB from "../submitB"; 
     // 提交否决弹窗import {aprAudApi} from "../../js/server.js";  
     export default {    
         data() {      
@@ -178,5 +178,124 @@
                         //  let data = {                
                             //   "opinionResultCode": 'D',                
                             //   "opinionTxt": this.lastAprOpinion.opinionTxt,                
-                            //   "rejectReasonCode": [this.lastAprOpinion.rejectReasonCode]                // };                // this.$MyFetch.post(`${aprAudApi.taskDetail.submitOper}/${this.$route.params.id}`, data)                // .then((data = {}) => {                //   console.log(data, '提交表格数据');                // })                // .catch(err => {                //   console.log('提交失败', err.code);                // });                // this.$options.methods.close_();              } else {                this.submitdata();                // let data = {                //   "opinionResultCode": 'P',                //   "opinionTxt": this.lastAprOpinion.opinionTxt,                //   "rejectReasonCode": [this.lastAprOpinion.rejectReasonCode]                // };                // this.$MyFetch.post(`${aprAudApi.taskDetail.submitOper}/${this.$route.params.id}`, data)                // .then((data = {}) => {                //   console.log(data, '提交表格数据');                // })                // .catch(err => {                //   console.log('提交失败', err.code);                // });                this.alertSubmitB = true;              }        console.log(this.submitResults);      },      close_submitB() {        this.alertSubmitB = false;      }    },    created() {       this.$MyFetch.get(`${aprAudApi.taskDetail.submitPage}/${this.$route.params.id}`)        .then((data = {}) => {          this.lastAprOpinion = data.lastAprOpinion;          // console.log(data, '进来就有');        })        .catch(err => {          console.log(err);        });        this.getTreeValue();    },    components: {      submitB    }  };</script>
-<style lang="less" scoped>  .submit{    .dialog-box{      font-size: 14px;      line-height: 20px;      width: 946px;      height: 706px;      .el-button {          width: 200px;          height: 40px;        }      .black_font{        color: #151515;      }      .gray_font{        color: #999999;      }      .dialog-box__top{        box-shadow: 0 1px 6px 0 rgba(239,239,239,0.74);        .title{          font-weight: bold;        }      }      .dialog-box__content{        max-height: 470px;        overflow: auto;        margin: 30px;        .dialog-box__content_title{          border-bottom: 1px solid #E5E5E5;          > div {            float: left;            margin: 0 80px 20px 0;            .margin_right{              margin-right: 10px;            }          }        }        .blue_boder{            border: 1px solid #538BF1;            margin-right: 10px;          }        .product-content-title{          font-size: 14px;          color: #333333;          text-align: left;          line-height: 50px;          .product-content-title_deny{            border: 1px solid #E9E9E9;            box-shadow: 0 2px 6px 0 rgba(0,0,0,0.08);            border-radius: 4px;            padding: 10px;            .negation{              margin-right: 500px;            }            .cause{              .form__select{                width: 846px;              }            }          }        }        > textarea {          border: 1px solid #E5E5E5;          border-radius: 4px;          resize: none;          width: 850px;          height: 102px;        }      }    }  }</style>
+                            //   "rejectReasonCode": [this.lastAprOpinion.rejectReasonCode]               
+                            // };                
+                            // this.$MyFetch.post(`${aprAudApi.taskDetail.submitOper}/${this.$route.params.id}`, data)                
+                            // .then((data = {}) => {                
+                                //   console.log(data, '提交表格数据');                
+                                // })                
+                            // .catch(err => {                
+                                //   console.log('提交失败', err.code);                
+                                // });                
+                                // this.$options.methods.close_();              
+                                // } else {                
+                                //     this.submitdata();                
+                                // let data = {                
+                                    //   "opinionResultCode": 'P',                
+                                    //   "opinionTxt": this.lastAprOpinion.opinionTxt,                
+                                    //   "rejectReasonCode": [this.lastAprOpinion.rejectReasonCode]                
+                                    // };                
+                                    // this.$MyFetch.post(`${aprAudApi.taskDetail.submitOper}/${this.$route.params.id}`, data)                
+                                    // .then((data = {}) => {                
+                                        //   console.log(data, '提交表格数据');                
+                                        // })                
+                                        // .catch(err => {                
+                                            //   console.log('提交失败', err.code);                
+                                            // });                
+                                            this.alertSubmitB = true;              
+                                            }        
+                                            console.log(this.submitResults);      
+                                            },      
+                                            close_submitB() {        
+                                                this.alertSubmitB = false;      
+                                                }    
+                                            },    
+                                            created() {       
+                                                this.$MyFetch.get(`${aprAudApi.taskDetail.submitPage}/${this.$route.params.id}`)        
+                                                .then((data = {}) => {          
+                                                    this.lastAprOpinion = data.lastAprOpinion;          
+                                                    // console.log(data, '进来就有');        
+                                                    })        
+                                                    .catch(err => {          
+                                                        console.log(err);        
+                                                    });        
+                                                    this.getTreeValue();    
+                                                    },    
+                                                    components: {      
+                                                        submitB    
+                                                        }  
+                                                    };
+</script>
+
+<style lang="less" scoped>  
+.submit{    
+    .dialog-box{      
+        font-size: 14px;      
+        line-height: 20px;      
+        width: 946px;      
+        height: 706px;      
+        .el-button {          
+            width: 200px;          
+            height: 40px;        
+        }      
+        .black_font{        
+            color: #151515;      
+        }      
+        .gray_font{        
+            color: #999999;      
+        }      
+        .dialog-box__top{       
+             box-shadow: 0 1px 6px 0 rgba(239,239,239,0.74);        
+             .title{          
+                 font-weight: bold;  
+            }      
+        }     
+        .dialog-box__content{        
+            max-height: 470px;       
+            overflow: auto;        
+            margin: 30px;        
+        .dialog-box__content_title{          
+            border-bottom: 1px solid #E5E5E5;          
+            > div {            
+                float: left;            
+                margin: 0 80px 20px 0;            
+        .margin_right{   
+            margin-right: 10px;            
+            }          
+        }       
+        }       
+        .blue_boder{            
+            border: 1px solid #538BF1;            
+            margin-right: 10px;          
+        }        
+        .product-content-title{          
+            font-size: 14px;          
+            color: #333333;         
+            text-align: left;          
+            line-height: 50px;          
+            .product-content-title_deny{            
+                border: 1px solid #E9E9E9;            
+                box-shadow: 0 2px 6px 0 rgba(0,0,0,0.08);            
+                border-radius: 4px;            
+                padding: 10px;            
+            .negation{             
+                margin-right: 500px;            
+            }            
+            .cause{              
+                .form__select{                
+                    width: 846px;              
+                }            
+            }          
+            }        
+            }        
+            > textarea {          
+                border: 1px solid #E5E5E5;          
+                border-radius: 4px;          
+                resize: none;          
+                width: 850px;          
+                height: 102px;        
+            }      
+            }    
+            }  
+            }
+</style>

+ 40 - 2
frontend/saas-web/app/view/core/base/GridPanel.js

@@ -9,6 +9,13 @@ Ext.define('saas.view.core.base.GridPanel', {
         ignoreRightMouseSelection : false
     },
 
+    requires: [
+        'Ext.grid.plugin.Exporter'
+    ],
+    plugins: {
+        gridexporter: true
+    },
+
     cls:'core-base-gridpanel',
     
     dataUrl: '',
@@ -58,8 +65,8 @@ Ext.define('saas.view.core.base.GridPanel', {
                             condition = "";
                         }
                         Ext.apply(store.proxy.extraParams, {
-                            number: op._page,
-                            size: store.pageSize,
+                            number: store.exportNumber?store.exportNumber:op._page,
+                            size: store.exportPageSize?store.exportPageSize:store.pageSize,
                             condition: JSON.stringify(condition)
                         });
                     }
@@ -155,6 +162,37 @@ Ext.define('saas.view.core.base.GridPanel', {
         this.ownerCt.ownerCt.store.load();
     },
 
+    onExport:function(me){
+        var grid = me.ownerCt.ownerCt;
+        //导出接口权限设置
+        var url = '/api/commons/'+grid.ownerCt.caller+'/export';
+        saas.util.BaseUtil.request({
+            url: url,
+            params: '',
+            method: 'GET',
+        })
+        .then(function(localJson) {
+            if(localJson.success){
+                grid.store.exportPageSize = 5000;
+                grid.store.exportNumber = 1;
+                grid.store.load(function(records, operation, success) {
+                    grid.saveDocumentAs({
+                        type: 'xlsx',
+                        title: grid.ownerCt._title + '列表',
+                        fileName: grid.ownerCt._title + '列表.xlsx'
+                    });
+                    grid.store.exportPageSize = null;
+                    grid.store.exportNumber = null;
+                    grid.store.load(function(records, operation, success) {
+                    });
+                });
+            }
+        })
+        .catch(function(res) {
+            saas.util.BaseUtil.showErrorToast('导出失败: ' + res.message);
+        });
+    },
+
     onVastDeal:function(url,type){
         var form = this.ownerCt;
         var grid = this;

+ 1 - 0
frontend/saas-web/app/view/document/product/BasePanel.js

@@ -57,6 +57,7 @@ Ext.define('saas.view.document.product.BasePanel', {
     }],
 
     //字段属性
+    caller:'Product',
     _formXtype:'document-product-formpanel',
     _title:'物料资料',
     _deleteUrl:'/api/document/product/delete/',

+ 1 - 0
frontend/saas-web/app/view/document/vendor/BasePanel.js

@@ -50,6 +50,7 @@ Ext.define('saas.view.document.vendor.BasePanel', {
     }],
 
     //字段属性
+    caller:'Vendor',
     _formXtype:'document-vendor-formpanel',
     _title:'供应商资料',
     _deleteUrl:'/api/document/vendor/delete/',

+ 0 - 1
frontend/saas-web/app/view/money/fundtransfer/QueryPanel.js

@@ -10,7 +10,6 @@ Ext.define('saas.view.money.fundtransfer.QueryPanel', {
     queryFormItems: [{
         xtype: 'textfield',
         name:'ft_code',
-        fieldLabel: '单号',
         emptyText:'请输入单号'
     },{
         xtype : "condatefield",

+ 1 - 2
frontend/saas-web/app/view/money/othreceipts/QueryPanel.js

@@ -10,8 +10,7 @@ Ext.define('saas.view.money.othreceipts.QueryPanel', {
     queryFormItems: [ {
         xtype: 'textfield',
         name: 'or_code',
-        fieldLabel: '单号/客户/账号',
-        emptyText:'请输入单号/客户/账号',
+        emptyText:'请输入单号或客户或账号',
         labelWidth: 100,
         getCondition: function(value) {
            return  ' (or_code like\'%' + value + '%\'' 

+ 2 - 8
frontend/saas-web/app/view/money/othspendings/QueryPanel.js

@@ -19,9 +19,7 @@ Ext.define('saas.view.money.othspendings.QueryPanel', {
     },{
         xtype: 'textfield',
         name: 'os_code',
-        fieldLabel: '单号/客户/账号',
-        emptyText:'请输入单号/客户/账号',
-        labelWidth: 100,
+        emptyText:'请输入单号或客户或账号',
         getCondition: function(value) {
             if(value == 'ALL') {
                 return '1=1';
@@ -100,12 +98,8 @@ Ext.define('saas.view.money.othspendings.QueryPanel', {
             dataIndex: 'os_date',
             xtype: 'datecolumn',
             width: 110
-        },{
-            text: '审核状态',
-            dataIndex: 'os_status',
-            width: 90
         }, {
-            text: '供应商',
+            text: '供应商名称',
             dataIndex: 'os_vendname',
             width:250
         },{

+ 0 - 5
frontend/saas-web/app/view/money/payBalance/QueryPanel.js

@@ -18,7 +18,6 @@ Ext.define('saas.view.money.paybalance.QueryPanel', {
     }, {
         xtype: 'textfield',
         name: 'pb_code',
-        fieldLabel: '单号/供应商',
         emptyText :'请输入单号或供应商',
         getCondition: function(value) {
             if(value == 'ALL') {
@@ -111,10 +110,6 @@ Ext.define('saas.view.money.paybalance.QueryPanel', {
             text: '付款人',
             dataIndex: 'pb_manname',
             width: 110
-        }, {
-            text: '单据状态',
-            dataIndex: 'pb_status',
-            width: 90
         }, {
             text: '备注',
             dataIndex: 'pb_remark',

+ 3 - 4
frontend/saas-web/app/view/money/recBalance/QueryPanel.js

@@ -10,8 +10,7 @@ Ext.define('saas.view.money.recBalance.QueryPanel', {
     queryFormItems: [{
         xtype: 'textfield',
         name: 'rb_code',
-        fieldLabel: '单号/客户',
-        emptyText :'请输入单号或者客户',
+        emptyText :'请输入单号或客户',
         getCondition: function(value) {
             if(value == 'ALL') {
                 return '1=1';
@@ -71,7 +70,7 @@ Ext.define('saas.view.money.recBalance.QueryPanel', {
             xtype: 'numbercolumn',
             hidden: true
         }, {
-            text: '款单号',
+            text: '款单号',
             dataIndex: 'rb_code',
             width: 150
         }, {
@@ -84,7 +83,7 @@ Ext.define('saas.view.money.recBalance.QueryPanel', {
             dataIndex: 'rb_custname',
             width: 250,
         },{
-            text: '款金额',
+            text: '款金额',
             xtype: 'numbercolumn',
             dataIndex: 'rd_amount',
             width: 120,

+ 15 - 12
frontend/saas-web/app/view/purchase/purchase/QueryPanel.js

@@ -18,7 +18,6 @@ Ext.define('saas.view.purchase.purchase.QueryPanel', {
     }, {
         xtype: 'textfield',
         name: 'pu_code',
-        fieldLabel: '单号/供应商',
         emptyText:'请输入单号或供应商',
         getCondition: function(value) {
             return  ' (pu_code like\'%' + value + '%\' or pu_vendcode like \'%'+value+'%\' or pu_vendname like \'%'+value+'%\') ';
@@ -95,6 +94,11 @@ Ext.define('saas.view.purchase.purchase.QueryPanel', {
             text: '采购单号',
             dataIndex: 'pu_code',
             width: 150
+        },{
+            text: '单据日期',
+            dataIndex: 'pu_date',
+            xtype: 'datecolumn',
+            width: 110
         },{
             text: '供应商名称',
             dataIndex: 'pu_vendname',
@@ -113,12 +117,7 @@ Ext.define('saas.view.purchase.purchase.QueryPanel', {
             dataIndex: 'pu_acceptstatus',
             width: 90
         },{
-            text: '单据日期',
-            dataIndex: 'pu_date',
-            xtype: 'datecolumn',
-            width: 110
-        },{
-            text: '制单人',
+            text: '录入人',
             dataIndex: 'creatorName',
             width: 110
         },{
@@ -129,6 +128,10 @@ Ext.define('saas.view.purchase.purchase.QueryPanel', {
             text: '关联销售单',
             dataIndex: 'pu_salecode',
             width: 150
+        },{
+            text: '备注',
+            dataIndex: 'pu_remark',
+            width: 250
         }],
         relativeColumn: [
         {
@@ -140,6 +143,11 @@ Ext.define('saas.view.purchase.purchase.QueryPanel', {
             text: '采购单号',
             dataIndex: 'pu_code',
             width: 150
+        }, {
+            text: '单据日期',
+            dataIndex: 'pu_date',
+            xtype: 'datecolumn',
+            width: 110
         },{
             text: '供应商名称',
             dataIndex: 'pu_vendname',
@@ -152,11 +160,6 @@ Ext.define('saas.view.purchase.purchase.QueryPanel', {
             text: '业务状态',
             dataIndex: 'pu_acceptstatus',
             width: 90
-        }, {
-            text: '单据日期',
-            dataIndex: 'pu_date',
-            xtype: 'datecolumn',
-            width: 110
         }, {
             text: '序号',
             dataIndex: 'pd_detno',

+ 1 - 1
frontend/saas-web/app/view/purchase/purchaseIn/FormPanel.js

@@ -323,7 +323,7 @@ Ext.define('saas.view.purchase.purchaseIn.FormPanel', {
                 text : "采购序号",
                 dataIndex : "pd_orderdetno", 
                 xtype : "numbercolumn",
-                width : 80.0,
+                width : 110.0,
                 format: '0',
                 renderer: function(v) {
                     return v ? v : null;

+ 0 - 1
frontend/saas-web/app/view/purchase/purchaseIn/QueryPanel.js

@@ -15,7 +15,6 @@ Ext.define('saas.view.purchase.purchaseIn.QueryPanel', {
     },{
         xtype: 'textfield',
         name: 'pi_inoutno',
-        fieldLabel: '单号/供应商',
         emptyText:'请输入单号或供应商',
         getCondition: function(value) {
             return  ' (pi_inoutno like\'%' + value + '%\' or pi_vendcode like \'%'+value+'%\' or pi_vendname like \'%'+value+'%\') ';

+ 1 - 1
frontend/saas-web/app/view/purchase/purchaseOut/FormPanel.js

@@ -310,7 +310,7 @@ Ext.define('saas.view.purchase.purchaseOut.FormPanel', {
                 text : "采购序号", 
                 dataIndex : "pd_orderdetno", 
                 xtype : "numbercolumn", 
-                width : 80.0,
+                width : 110.0,
                 renderer: function(v) {
                     return Ext.util.Format.number(v, '0');
                 }

+ 0 - 5
frontend/saas-web/app/view/purchase/purchaseOut/QueryPanel.js

@@ -18,7 +18,6 @@ Ext.define('saas.view.purchase.purchaseOut.QueryPanel', {
     },{
         xtype: 'textfield',
         name: 'pi_inoutno',
-        fieldLabel: '单号/供应商',
         emptyText:'请输入单号或供应商',
         getCondition: function(value) {
             return  ' (pi_inoutno like\'%' + value + '%\' or pi_vendcode like \'%'+value+'%\' or pi_vendname like \'%'+value+'%\') ';
@@ -108,10 +107,6 @@ Ext.define('saas.view.purchase.purchaseOut.QueryPanel', {
             text: '总金额',
             dataIndex: 'pi_total',
             width: 110
-        },{
-            text: '审核状态',
-            dataIndex: 'pi_status',
-            width: 120
         },{
             text: '单据状态',
             dataIndex: 'pi_status',

+ 0 - 1
frontend/saas-web/app/view/sale/sale/QueryPanel.js

@@ -18,7 +18,6 @@ Ext.define('saas.view.sale.sale.QueryPanel', {
     },{
         xtype: 'textfield',
         name: 'sa_code',
-        fieldLabel: '单号/客户',
         emptyText:'请输入单号或客户',
         getCondition: function(value) {
            return  ' (sa_code like\'%' + value + '%\' or sa_custcode like \'%'+value+'%\' or sa_custname like \'%'+value+'%\') ';

+ 1 - 1
frontend/saas-web/app/view/sale/saleIn/FormPanel.js

@@ -254,7 +254,7 @@ Ext.define('saas.view.sale.saleIn.FormPanel', {
                 text : "销售序号", 
                 dataIndex : "pd_orderdetno", 
                 xtype : "numbercolumn",
-                width: 80,
+                width: 110.0,
                 format: '0',
                 renderer: function(v) {
                     return v ? v : null;

+ 1 - 1
frontend/saas-web/app/view/sale/saleIn/QueryPanel.js

@@ -14,8 +14,8 @@ Ext.define('saas.view.sale.saleIn.QueryPanel', {
     },{
         xtype: 'textfield',
         name: 'pi_inoutno',
-        fieldLabel: '单号/客户',
         emptyText:'请输入单号或客户或关联单号',
+        labelWidth:100,
         getCondition: function(value) {
             return  ' (pi_inoutno like\'%' + value + '%\' or pi_custcode like \'%'+value+'%\' or pi_custname like \'%'+value+'%\' or pi_sacode like \'%'+value+'%\') ';
         }

+ 1 - 1
frontend/saas-web/app/view/sale/saleOut/FormPanel.js

@@ -261,7 +261,7 @@ Ext.define('saas.view.sale.saleout.FormPanel', {
                 text : "销售序号", 
                 dataIndex : "pd_orderdetno", 
                 xtype : "numbercolumn",
-                width : 80.0,
+                width : 110.0,
                 format: '0',
                 renderer: function(v) {
                     return v ? v : null;

+ 1 - 1
frontend/saas-web/app/view/sale/saleOut/QueryPanel.js

@@ -15,8 +15,8 @@ Ext.define('saas.view.sale.saleout.QueryPanel', {
     },{
         xtype: 'textfield',
         name: 'pi_inoutno',
-        fieldLabel: '单号/客户',
         emptyText:'请输入单号或客户或关联单号',
+        labelWidth:100,
         getCondition: function(value) {
             return  ' (pi_inoutno like\'%' + value + '%\' or pi_custcode like \'%'+value+'%\' or pi_custname like \'%'+value+'%\' or pi_iocode like \'%'+value+'%\') ';
         }

+ 1 - 1
frontend/saas-web/app/view/stock/appropriationInOut/QueryPanel.js

@@ -16,7 +16,7 @@ Ext.define('saas.view.stock.appropriationInOut.QueryPanel', {
     },{
         xtype: 'textfield',
         name: 'pi_inoutno',
-        fieldLabel: '单号/物料',
+        emptyText:'请输入单号或物料',
         showDetail: true,
         getCondition: function(value) {
             if(value == 'ALL') {

+ 0 - 1
frontend/saas-web/app/view/stock/make/QueryPanel.js

@@ -22,7 +22,6 @@ Ext.define('saas.view.stock.make.QueryPanel', {
     },{
         xtype: 'textfield',
         name: 'ma_prodcode',
-        fieldLabel: '产品',
         emptyText :'请输入产品名称或编号',
         getCondition: function(value) {
             if(value == 'ALL') {

+ 1 - 1
frontend/saas-web/app/view/stock/otherIn/QueryPanel.js

@@ -16,7 +16,7 @@ Ext.define('saas.view.stock.otherIn.QueryPanel', {
     },{
         xtype: 'textfield',
         name: 'pi_inoutno',
-        fieldLabel: '单号/供应商',
+        emptyText:'请输入单号或供应商',
         getCondition: function(value) {
             if(value == 'ALL') {
                 return '1=1';

+ 2 - 2
frontend/saas-web/app/view/stock/otherOut/QueryPanel.js

@@ -16,7 +16,7 @@ Ext.define('saas.view.stock.otherOut.QueryPanel', {
     }, {
         xtype: 'textfield',
         name: 'pi_inoutno',
-        fieldLabel: '单号/供应商',
+        emptyText:'请输入单号或客户',
         getCondition: function(value) {
             if(value == 'ALL') {
                 return '1=1';
@@ -81,7 +81,7 @@ Ext.define('saas.view.stock.otherOut.QueryPanel', {
             hidden:true,
             xtype: 'numbercolumn'
         }, {
-            text: '其它库单号',
+            text: '其它库单号',
             dataIndex: 'pi_inoutno',
             width: 150
         },{

+ 59 - 21
frontend/saas-web/app/view/sys/guide/FormPanel.js

@@ -59,31 +59,50 @@ Ext.define('saas.view.sys.guide.FormPanel', {
                 '<tpl for=".">',
 				'<div class="x-guide-panel" align ="center">',
                     '<div class="x-guide-item" align ="center" >',
+
+                        '<figure style="margin: 0 185px 0 180px;cursor: pointer;" align="center" class="imghvr-zoom-out" onClick="showInformation(\'baseSet\')">',
                         '<img class="',
-                        '<tpl if="!baseSet">x-guide-mask </tpl>',
-                        '" src="resources/images/guide/baseSet.png" style="margin:0 185px 0 0;" align ="center" width="135" height="90" alt="基础设置" onClick="showInformation(\'baseSet\')" >',
+                            '<tpl if="!baseSet">x-guide-mask </tpl>',
+                            '" src="resources/images/guide/baseSet.png" style="background: #d5efff;" align ="center" width="135" height="90" alt="基础设置"  >',
+                        '<figcaption>',
+                        '公司信息、权限和账户管理',
+                        '</figcaption>',
+                        '</figure>',
+                        
+                        '<figure style="margin:0 185px 0 0;cursor: pointer;" align="center" class="imghvr-zoom-out" onClick="showInformation(\'warehouse\')">',
                         '<img class="',
                         '<tpl if="!warehouse">x-guide-mask </tpl>',
-                        '"src="resources/images/guide/warehouse.png" style="margin:0 185px 0 0;" align ="center" width="135" height="90" alt="仓库资料" onClick="showInformation(\'warehouse\')" >',
+                        '"src="resources/images/guide/warehouse.png" style="background: #d5efff;" align ="center" width="135" height="90" alt="仓库资料"  >',
+                        '<figcaption>',
+                        '仓库信息管理',
+                        '</figcaption>',
+                        '</figure>',
+
+                        '<figure style="margin:0 185px 0 0;cursor: pointer;" align="center" class="imghvr-zoom-out" onClick="showInformation(\'product\')">',
                         '<img class="',
                         '<tpl if="!product">x-guide-mask </tpl>',
-                        '"src="resources/images/guide/product.png" align ="center" width="135" height="90" alt="物料资料" onClick="showInformation(\'product\')" >',
+                        '"src="resources/images/guide/product.png" style="background: #d5efff;" align ="center" width="135" height="90" alt="物料资料"  >',
+                        '<figcaption>',
+                        '物料信息管理',
+                        '</figcaption>',
+                        '</figure>',
+
                     '</div>',
                     '<div class="x-guide-item" align ="center">',
                         '<img class="',
                         '<tpl if="!baseSet">x-guide-mask </tpl>',
-                        '"src="resources/images/guide/1.png" style="margin: -20px 290px 0 0;" align ="center" width="32" height="32" onClick="showInformation(\'baseSet\')" >',
+                        '"src="resources/images/guide/1.png" style="cursor: pointer;position: absolute;margin: -16px 290px 0 -339px;z-index: 100;" align ="center" width="32" height="32" onClick="showInformation(\'baseSet\')" >',
                         '<img class="',
                         '<tpl if="!warehouse">x-guide-mask </tpl>',
-                        '"src="resources/images/guide/2.png" style="margin: -20px 290px 0 0;" align ="center" width="32" height="32" onClick="showInformation(\'warehouse\')" >',
+                        '"src="resources/images/guide/2.png" style="cursor: pointer;position: absolute;margin: -16px 0 0 -16px;z-index: 100;" align ="center" width="32" height="32" onClick="showInformation(\'warehouse\')" >',
                         '<img class="',
                         '<tpl if="!product">x-guide-mask </tpl>',
-                        '"src="resources/images/guide/3.png" style="margin: -20px 0px 0 0;" align ="center" width="32" height="32" onClick="showInformation(\'product\')" >',
+                        '"src="resources/images/guide/3.png" style="cursor: pointer;position: absolute;margin: -16px 0 0 305px;z-index: 100;" align ="center" width="32" height="32" onClick="showInformation(\'product\')" >',
                     '</div>',
-                    '<div class="x-guide-item" align ="center">',
-                        '<span  style="margin:0 270px 0px 0;" align ="center" onClick="showInformation(\'baseSet\')" >基础设置</span>',
-                        '<span  style="margin:0 270px 0px 0;" align ="center" onClick="showInformation(\'warehouse\')" >仓库资料</span>',
-                        '<span  style="margin:0 0px 0px 0;" align ="center"  onClick="showInformation(\'product\')" >物料资料</span>',
+                    '<div class="x-guide-item" style="margin-top: 20px;" align ="center">',
+                        '<span  style="margin:0 270px 0px 0;cursor: pointer;" align ="center" onClick="showInformation(\'baseSet\')" >基础设置</span>',
+                        '<span  style="margin:0 270px 0px 0;cursor: pointer;" align ="center" onClick="showInformation(\'warehouse\')" >仓库资料</span>',
+                        '<span  style="margin:0 0px 0px 0;cursor: pointer;" align ="center"  onClick="showInformation(\'product\')" >物料资料</span>',
                     '</div>',
                     '<div class="x-guide-item" align ="center">',
                         '<img class="',
@@ -99,31 +118,50 @@ Ext.define('saas.view.sys.guide.FormPanel', {
                         '<div class="x-guide-line"  height="1"  style="border:1px solid #E4F7FF;margin: -9px 0 0 0;width: 654px !important;" align ="center"></div>',
                     '</div>',
                     '<div class="x-guide-item" align ="center">',
+
+                        '<figure style="margin: 40px 185px 0 182px;cursor: pointer;" align="center" class="imghvr-zoom-out" onClick="showInformation(\'customer\')">',
                         '<img class="',
                         '<tpl if="!customer">x-guide-mask </tpl>',
-                        '"src="resources/images/guide/customer.png" style="margin:50px 185px 0 0;" align ="center" width="135" height="90" alt="客户资料" onClick="showInformation(\'customer\')" >',
+                        '"src="resources/images/guide/customer.png" style="background: #ffffff;" align ="center" width="135" height="90" alt="客户资料"  >',
+                        '<figcaption>',
+                        '客户信息管理',
+                        '</figcaption>',
+                        '</figure>',
+
+                        '<figure style="margin: 0px 185px 0 0px;cursor: pointer;" align="center" class="imghvr-zoom-out" onClick="showInformation(\'vendor\')">',
                         '<img class="',
                         '<tpl if="!vendor">x-guide-mask </tpl>',
-                        '"src="resources/images/guide/vendor.png" style="margin:50px 185px 0 0;" align ="center" width="135" height="90" alt="供应商资料" onClick="showInformation(\'vendor\')" >',
+                        '"src="resources/images/guide/vendor.png" style="background: #ffffff;" align ="center" width="135" height="90" alt="供应商资料"  >',
+                        '<figcaption>',
+                        '供应商信息管理',
+                        '</figcaption>',
+                        '</figure>',
+
+                        '<figure style="margin: 0 185px 0 0px;cursor: pointer;" align="center" class="imghvr-zoom-out" onClick="showInformation(\'begin\',\'{begin}\')">',
                         '<img class="',
                         '<tpl if="!begin">x-guide-mask </tpl>',
-                        '" src="resources/images/guide/begin.png" style="margin:50px 0 0 0;" align ="center" width="135" height="90" alt="开始使用" onClick="showInformation(\'begin\',\'{begin}\')" >',
+                        '" src="resources/images/guide/begin.png" style="background: #ffffff;" align ="center" width="135" height="90" alt="开始使用"  >',
+                        '<figcaption>',
+                        '开启云进销存',
+                        '</figcaption>',
+                        '</figure>',
+
                     '</div>',
                     '<div class="x-guide-item" align ="center">',
                         '<img class="',
                         '<tpl if="!customer">x-guide-mask </tpl>',
-                        '" src="resources/images/guide/4.png" style="margin: -20px 290px 0 0;" align ="center" width="32" height="32" onClick="showInformation(\'customer\')" >',
+                        '" src="resources/images/guide/4.png" style="cursor: pointer;position: absolute;margin: -16px 290px 0 -339px;z-index: 100;" align ="center" width="32" height="32" onClick="showInformation(\'customer\')" >',
                         '<img class="',
                         '<tpl if="!vendor">x-guide-mask </tpl>',
-                        '" src="resources/images/guide/5.png" style="margin: -20px 290px 0 0;" align ="center" width="32" height="32"  onClick="showInformation(\'vendor\')">',
+                        '" src="resources/images/guide/5.png" style="cursor: pointer;position: absolute;margin: -16px 0 0 -16px;z-index: 100;" align ="center" width="32" height="32"  onClick="showInformation(\'vendor\')">',
                         '<img class="',
                         '<tpl if="!begin">x-guide-mask </tpl>',
-                        '" src="resources/images/guide/6.png" style="margin: -20px 0px 0 0;" align ="center" width="32" height="32" onClick="showInformation(\'begin\',\'{begin}\')" >',
+                        '" src="resources/images/guide/6.png" style="cursor: pointer;position: absolute;margin: -16px 0 0 305px;z-index: 100;" align ="center" width="32" height="32" onClick="showInformation(\'begin\',\'{begin}\')" >',
                     '</div>',
-                    '<div class="x-guide-item" align ="center">',
-                        '<span  style="margin:0 265px 100px 0;" align ="center"  onClick="showInformation(\'customer\')" >客户资料</span>',
-                        '<span  style="margin:0 265px 100px 0;" align ="center" onClick="showInformation(\'vendor\')" >供应商资料</span>',
-                        '<span  style="margin:0 0px 100px 0;" align ="center" onClick="showInformation(\'begin\',\'{begin}\')"  >开始使用</span>',
+                    '<div class="x-guide-item" style="margin-top: 20px;" align ="center">',
+                        '<span  style="margin:0 265px 100px 0;cursor: pointer;" align ="center"  onClick="showInformation(\'customer\')" >客户资料</span>',
+                        '<span  style="margin:0 265px 100px 0;cursor: pointer;" align ="center" onClick="showInformation(\'vendor\')" >供应商资料</span>',
+                        '<span  style="margin:0 0px 100px 0;cursor: pointer;" align ="center" onClick="showInformation(\'begin\',\'{begin}\')"  >开始使用</span>',
                     '</div>',
                     '<div class="x-guide-item" align ="center">',
                         '<img class="',

+ 2 - 1
frontend/saas-web/index.html

@@ -7,10 +7,11 @@
 
     <title>云进销存 - 优企云服</title>
     <link rel="icon" href="/resources/images/favicon.png" type="image/x-icon">
+    <!-- 图片动画效果样式导入 -->
+    <link type="text/css" rel="stylesheet" href="/resources/othcss/imagehover.css" />
 
     <!-- The line below must be kept intact for Sencha Cmd to build your application -->
     <script id="microloader" data-app="a20e1670-7932-41f6-8e9c-55b77cba3f26" type="text/javascript" src="bootstrap.js"></script>
-
 </head>
 <body class="launching"></body>
 </html>

+ 977 - 0
frontend/saas-web/resources/othcss/imagehover.css

@@ -0,0 +1,977 @@
+/*
+ * ImageHover.css - http://www.imagehover.io
+ * Version 1.0
+ * Author: Ciarán Walsh
+
+ * Made available under a MIT License:
+ * http://www.opensource.org/licenses/mit-license.php
+
+ */
+[class^='imghvr-'],
+[class*=' imghvr-'] {
+  position: relative;
+  display: inline-block;
+  margin: 0px;
+  max-width: 100%;
+  background-color: rgb(52, 186, 246);
+  color: #fff;
+  overflow: hidden;
+  -webkit-backface-visibility: hidden;
+  backface-visibility: hidden;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-transform: translateZ(0);
+  transform: translateZ(0);
+}
+[class^='imghvr-'] > img,
+[class*=' imghvr-'] > img {
+  vertical-align: top;
+  max-width: 100%;
+}
+[class^='imghvr-'] figcaption,
+[class*=' imghvr-'] figcaption {
+  background-color: inherit;
+  padding: 30px 20px 10px 20px;
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+}
+[class^='imghvr-'] h3,
+[class*=' imghvr-'] h3,
+[class^='imghvr-'] p,
+[class*=' imghvr-'] p {
+  margin: 0;
+  padding: 0;
+  color: #fff;
+}
+[class^='imghvr-'] a,
+[class*=' imghvr-'] a {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  z-index: 1;
+}
+[class^='imghvr-'],
+[class*=' imghvr-'],
+[class^='imghvr-']:before,
+[class^='imghvr-']:after,
+[class*=' imghvr-']:before,
+[class*=' imghvr-']:after,
+[class^='imghvr-'] *,
+[class*=' imghvr-'] *,
+[class^='imghvr-'] *:before,
+[class^='imghvr-'] *:after,
+[class*=' imghvr-'] *:before,
+[class*=' imghvr-'] *:after {
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-transition: all 0.35s ease;
+  transition: all 0.35s ease;
+}
+/* imghvr-fade
+   ----------------------------- */
+.imghvr-fade figcaption {
+  opacity: 0;
+}
+.imghvr-fade:hover > img {
+  opacity: 0;
+}
+.imghvr-fade:hover figcaption {
+  opacity: 1;
+}
+/* imghvr-push-*
+   ----------------------------- */
+[class^='imghvr-push-']:hover figcaption,
+[class*=' imghvr-push-']:hover figcaption {
+  -webkit-transform: translate(0, 0);
+  transform: translate(0, 0);
+}
+/* imghvr-push-up
+   ----------------------------- */
+.imghvr-push-up figcaption {
+  -webkit-transform: translateY(100%);
+  transform: translateY(100%);
+}
+.imghvr-push-up:hover > img {
+  -webkit-transform: translateY(-100%);
+  transform: translateY(-100%);
+}
+/* imghvr-push-down
+   ----------------------------- */
+.imghvr-push-down figcaption {
+  -webkit-transform: translateY(-100%);
+  transform: translateY(-100%);
+}
+.imghvr-push-down:hover > img {
+  -webkit-transform: translateY(100%);
+  transform: translateY(100%);
+}
+/* imghvr-push-left
+   ----------------------------- */
+.imghvr-push-left figcaption {
+  -webkit-transform: translateX(100%);
+  transform: translateX(100%);
+}
+.imghvr-push-left:hover > img {
+  -webkit-transform: translateX(-100%);
+  transform: translateX(-100%);
+}
+/* imghvr-push--right
+   ----------------------------- */
+.imghvr-push-right figcaption {
+  -webkit-transform: translateX(-100%);
+  transform: translateX(-100%);
+}
+.imghvr-push-right:hover > img {
+  -webkit-transform: translateX(100%);
+  transform: translateX(100%);
+}
+/* imghvr-slide-*
+   ----------------------------- */
+[class^='imghvr-slide-']:hover figcaption,
+[class*=' imghvr-slide-']:hover figcaption {
+  -webkit-transform: translate(0, 0);
+  transform: translate(0, 0);
+}
+/* imghvr-slide-up
+   ----------------------------- */
+.imghvr-slide-up figcaption {
+  -webkit-transform: translateY(100%);
+  transform: translateY(100%);
+  background-color: inherit;
+}
+/* imghvr-slide-down
+   ----------------------------- */
+.imghvr-slide-down figcaption {
+  -webkit-transform: translateY(-100%);
+  transform: translateY(-100%);
+  background-color: inherit;
+}
+/* imghvr-slide-left
+   ----------------------------- */
+.imghvr-slide-left figcaption {
+  -webkit-transform: translateX(100%);
+  transform: translateX(100%);
+  background-color: inherit;
+}
+/* imghvr-slide-right
+   ----------------------------- */
+.imghvr-slide-right figcaption {
+  -webkit-transform: translateX(-100%);
+  transform: translateX(-100%);
+}
+/* imghvr-reveal-*
+   ----------------------------- */
+[class^='imghvr-reveal-']:before,
+[class*=' imghvr-reveal-']:before {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  content: '';
+  background-color: inherit;
+}
+[class^='imghvr-reveal-'] figcaption,
+[class*=' imghvr-reveal-'] figcaption {
+  opacity: 0;
+}
+[class^='imghvr-reveal-']:hover:before,
+[class*=' imghvr-reveal-']:hover:before {
+  -webkit-transform: translate(0, 0);
+  transform: translate(0, 0);
+}
+[class^='imghvr-reveal-']:hover figcaption,
+[class*=' imghvr-reveal-']:hover figcaption {
+  opacity: 1;
+  -webkit-transition-delay: 0.2s;
+  transition-delay: 0.2s;
+}
+/* imghvr-reveal-up
+   ----------------------------- */
+.imghvr-reveal-up:before {
+  -webkit-transform: translateY(100%);
+  transform: translateY(100%);
+}
+/* imghvr-reveal-down
+   ----------------------------- */
+.imghvr-reveal-down:before {
+  -webkit-transform: translateY(-100%);
+  transform: translateY(-100%);
+}
+/* imghvr-reveal-left
+   ----------------------------- */
+.imghvr-reveal-left:before {
+  -webkit-transform: translateX(100%);
+  transform: translateX(100%);
+}
+/* imghvr-reveal-right
+   ----------------------------- */
+.imghvr-reveal-right:before {
+  -webkit-transform: translateX(-100%);
+  transform: translateX(-100%);
+}
+/* imghvr-hinge-*
+   ----------------------------- */
+[class^='imghvr-hinge-'],
+[class*=' imghvr-hinge-'] {
+  -webkit-perspective: 50em;
+  perspective: 50em;
+}
+[class^='imghvr-hinge-'] figcaption,
+[class*=' imghvr-hinge-'] figcaption {
+  opacity: 0;
+  z-index: 1;
+}
+[class^='imghvr-hinge-']:hover img,
+[class*=' imghvr-hinge-']:hover img {
+  opacity: 0;
+}
+[class^='imghvr-hinge-']:hover figcaption,
+[class*=' imghvr-hinge-']:hover figcaption {
+  opacity: 1;
+  -webkit-transition-delay: 0.2s;
+  transition-delay: 0.2s;
+}
+/* imghvr-hinge-up
+   ----------------------------- */
+.imghvr-hinge-up img {
+  -webkit-transform-origin: 50% 0%;
+  -ms-transform-origin: 50% 0%;
+  transform-origin: 50% 0%;
+}
+.imghvr-hinge-up figcaption {
+  -webkit-transform: rotateX(90deg);
+  transform: rotateX(90deg);
+  -webkit-transform-origin: 50% 100%;
+  -ms-transform-origin: 50% 100%;
+  transform-origin: 50% 100%;
+}
+.imghvr-hinge-up:hover > img {
+  -webkit-transform: rotateX(-90deg);
+  transform: rotateX(-90deg);
+}
+.imghvr-hinge-up:hover figcaption {
+  -webkit-transform: rotateX(0deg);
+  transform: rotateX(0deg);
+}
+/* imghvr-hinge-down
+   ----------------------------- */
+.imghvr-hinge-down img {
+  -webkit-transform-origin: 50% 100%;
+  -ms-transform-origin: 50% 100%;
+  transform-origin: 50% 100%;
+}
+.imghvr-hinge-down figcaption {
+  -webkit-transform: rotateX(-90deg);
+  transform: rotateX(-90deg);
+  -webkit-transform-origin: 50% -50%;
+  -ms-transform-origin: 50% -50%;
+  transform-origin: 50% -50%;
+}
+.imghvr-hinge-down:hover > img {
+  -webkit-transform: rotateX(90deg);
+  transform: rotateX(90deg);
+  opacity: 0;
+}
+.imghvr-hinge-down:hover figcaption {
+  -webkit-transform: rotateX(0deg);
+  transform: rotateX(0deg);
+}
+/* imghvr-hinge-left
+   ----------------------------- */
+.imghvr-hinge-left img {
+  -webkit-transform-origin: 0% 50%;
+  -ms-transform-origin: 0% 50%;
+  transform-origin: 0% 50%;
+}
+.imghvr-hinge-left figcaption {
+  -webkit-transform: rotateY(-90deg);
+  transform: rotateY(-90deg);
+  -webkit-transform-origin: 100% 50%;
+  -ms-transform-origin: 100% 50%;
+  transform-origin: 100% 50%;
+}
+.imghvr-hinge-left:hover > img {
+  -webkit-transform: rotateY(90deg);
+  transform: rotateY(90deg);
+}
+.imghvr-hinge-left:hover figcaption {
+  -webkit-transform: rotateY(0deg);
+  transform: rotateY(0deg);
+}
+/* imghvr-hinge-right
+   ----------------------------- */
+.imghvr-hinge-right img {
+  -webkit-transform-origin: 100% 50%;
+  -ms-transform-origin: 100% 50%;
+  transform-origin: 100% 50%;
+}
+.imghvr-hinge-right figcaption {
+  -webkit-transform: rotateY(90deg);
+  transform: rotateY(90deg);
+  -webkit-transform-origin: 0 50%;
+  -ms-transform-origin: 0 50%;
+  transform-origin: 0 50%;
+}
+.imghvr-hinge-right:hover > img {
+  -webkit-transform: rotateY(-90deg);
+  transform: rotateY(-90deg);
+}
+.imghvr-hinge-right:hover figcaption {
+  -webkit-transform: rotateY(0deg);
+  transform: rotateY(0deg);
+}
+/* imghvr-flip-*
+   ----------------------------- */
+[class^='imghvr-flip-'],
+[class*=' imghvr-flip-'] {
+  -webkit-perspective: 50em;
+  perspective: 50em;
+}
+[class^='imghvr-flip-'] img,
+[class*=' imghvr-flip-'] img {
+  backface-visibility: hidden;
+}
+[class^='imghvr-flip-'] figcaption,
+[class*=' imghvr-flip-'] figcaption {
+  opacity: 0;
+}
+[class^='imghvr-flip-']:hover > img,
+[class*=' imghvr-flip-']:hover > img {
+  opacity: 0;
+}
+[class^='imghvr-flip-']:hover figcaption,
+[class*=' imghvr-flip-']:hover figcaption {
+  opacity: 1;
+  -webkit-transition-delay: 0.15s;
+  transition-delay: 0.15s;
+}
+/* imghvr-flip-horiz
+   ----------------------------- */
+.imghvr-flip-horiz figcaption {
+  -webkit-transform: rotateX(90deg);
+  transform: rotateX(90deg);
+  -webkit-transform-origin: 0% 50%;
+  -ms-transform-origin: 0% 50%;
+  transform-origin: 0% 50%;
+}
+.imghvr-flip-horiz:hover img {
+  -webkit-transform: rotateX(-180deg);
+  transform: rotateX(-180deg);
+}
+.imghvr-flip-horiz:hover figcaption {
+  -webkit-transform: rotateX(0deg);
+  transform: rotateX(0deg);
+}
+/* imghvr-flip-vert
+   ----------------------------- */
+.imghvr-flip-vert figcaption {
+  -webkit-transform: rotateY(90deg);
+  transform: rotateY(90deg);
+  -webkit-transform-origin: 50% 0%;
+  -ms-transform-origin: 50% 0%;
+  transform-origin: 50% 0%;
+}
+.imghvr-flip-vert:hover > img {
+  -webkit-transform: rotateY(-180deg);
+  transform: rotateY(-180deg);
+}
+.imghvr-flip-vert:hover figcaption {
+  -webkit-transform: rotateY(0deg);
+  transform: rotateY(0deg);
+}
+/* imghvr-flip-diag-1
+   ----------------------------- */
+.imghvr-flip-diag-1 figcaption {
+  -webkit-transform: rotate3d(1, -1, 0, 100deg);
+  transform: rotate3d(1, -1, 0, 100deg);
+}
+.imghvr-flip-diag-1:hover > img {
+  -webkit-transform: rotate3d(-1, 1, 0, 100deg);
+  transform: rotate3d(-1, 1, 0, 100deg);
+}
+.imghvr-flip-diag-1:hover figcaption {
+  -webkit-transform: rotate3d(0, 0, 0, 0deg);
+  transform: rotate3d(0, 0, 0, 0deg);
+}
+/* imghvr-flip-diag-2
+   ----------------------------- */
+.imghvr-flip-diag-2 figcaption {
+  -webkit-transform: rotate3d(1, 1, 0, 100deg);
+  transform: rotate3d(1, 1, 0, 100deg);
+}
+.imghvr-flip-diag-2:hover > img {
+  -webkit-transform: rotate3d(-1, -1, 0, 100deg);
+  transform: rotate3d(-1, -1, 0, 100deg);
+}
+.imghvr-flip-diag-2:hover figcaption {
+  -webkit-transform: rotate3d(0, 0, 0, 0deg);
+  transform: rotate3d(0, 0, 0, 0deg);
+}
+/* imghvr-shutter-out-*
+   ----------------------------- */
+[class^='imghvr-shutter-out-']:before,
+[class*=' imghvr-shutter-out-']:before {
+  background: inherit;
+  position: absolute;
+  content: '';
+  -webkit-transition-delay: 0.1s;
+  transition-delay: 0.1s;
+}
+[class^='imghvr-shutter-out-'] figcaption,
+[class*=' imghvr-shutter-out-'] figcaption {
+  opacity: 0;
+  -webkit-transition-delay: 0s;
+  transition-delay: 0s;
+}
+[class^='imghvr-shutter-out-']:hover:before,
+[class*=' imghvr-shutter-out-']:hover:before {
+  -webkit-transition-delay: 0s;
+  transition-delay: 0s;
+}
+[class^='imghvr-shutter-out-']:hover figcaption,
+[class*=' imghvr-shutter-out-']:hover figcaption {
+  opacity: 1;
+  -webkit-transition-delay: 0.1s;
+  transition-delay: 0.1s;
+}
+/* imghvr-shutter-out-horiz
+   ----------------------------- */
+.imghvr-shutter-out-horiz:before {
+  left: 50%;
+  right: 50%;
+  top: 0;
+  bottom: 0;
+}
+.imghvr-shutter-out-horiz:hover:before {
+  left: 0;
+  right: 0;
+}
+/* imghvr-shutter-out-vert
+   ----------------------------- */
+.imghvr-shutter-out-vert:before {
+  top: 50%;
+  bottom: 50%;
+  left: 0;
+  right: 0;
+}
+.imghvr-shutter-out-vert:hover:before {
+  top: 0;
+  bottom: 0;
+}
+/* imghvr-shutter-out-diag-1
+   ----------------------------- */
+.imghvr-shutter-out-diag-1:before {
+  top: 50%;
+  bottom: 50%;
+  left: -35%;
+  right: -35%;
+  -webkit-transform: rotate(45deg);
+  transform: rotate(45deg);
+}
+.imghvr-shutter-out-diag-1:hover:before {
+  top: -35%;
+  bottom: -35%;
+}
+/* imghvr-shutter-out-diag-2
+   ----------------------------- */
+.imghvr-shutter-out-diag-2:before {
+  top: 50%;
+  bottom: 50%;
+  left: -35%;
+  right: -35%;
+  -webkit-transform: rotate(-45deg);
+  transform: rotate(-45deg);
+}
+.imghvr-shutter-out-diag-2:hover:before {
+  top: -35%;
+  bottom: -35%;
+}
+/* imghvr-shutter-in-*
+   ----------------------------- */
+[class^='imghvr-shutter-in-']:after,
+[class*=' imghvr-shutter-in-']:after,
+[class^='imghvr-shutter-in-']:before,
+[class*=' imghvr-shutter-in-']:before {
+  background: inherit;
+  position: absolute;
+  content: '';
+}
+[class^='imghvr-shutter-in-']:after,
+[class*=' imghvr-shutter-in-']:after {
+  top: 0;
+  left: 0;
+}
+[class^='imghvr-shutter-in-']:before,
+[class*=' imghvr-shutter-in-']:before {
+  right: 0;
+  bottom: 0;
+}
+[class^='imghvr-shutter-in-'] figcaption,
+[class*=' imghvr-shutter-in-'] figcaption {
+  opacity: 0;
+  z-index: 1;
+}
+[class^='imghvr-shutter-in-']:hover figcaption,
+[class*=' imghvr-shutter-in-']:hover figcaption {
+  opacity: 1;
+  -webkit-transition-delay: 0.2s;
+  transition-delay: 0.2s;
+}
+/* imghvr-shutter-in-horiz
+   ----------------------------- */
+.imghvr-shutter-in-horiz:after,
+.imghvr-shutter-in-horiz:before {
+  width: 0;
+  height: 100%;
+}
+.imghvr-shutter-in-horiz:hover:after,
+.imghvr-shutter-in-horiz:hover:before {
+  width: 50%;
+}
+/* imghvr-shutter-in-vert
+   ----------------------------- */
+.imghvr-shutter-in-vert:after,
+.imghvr-shutter-in-vert:before {
+  height: 0;
+  width: 100%;
+}
+.imghvr-shutter-in-vert:hover:after,
+.imghvr-shutter-in-vert:hover:before {
+  height: 50%;
+}
+/* imghvr-shutter-in-out-horiz
+   ----------------------------- */
+.imghvr-shutter-in-out-horiz:after,
+.imghvr-shutter-in-out-horiz:before {
+  width: 0;
+  height: 100%;
+}
+.imghvr-shutter-in-out-horiz:hover:after,
+.imghvr-shutter-in-out-horiz:hover:before {
+  width: 100%;
+}
+/* imghvr-shutter-in-out-vert
+   ----------------------------- */
+.imghvr-shutter-in-out-vert:after,
+.imghvr-shutter-in-out-vert:before {
+  height: 0;
+  width: 100%;
+}
+.imghvr-shutter-in-out-vert:hover:after,
+.imghvr-shutter-in-out-vert:hover:before {
+  height: 100%;
+}
+/* imghvr-shutter-in-out-diag-1
+   ----------------------------- */
+.imghvr-shutter-in-out-diag-1:after,
+.imghvr-shutter-in-out-diag-1:before {
+  width: 200%;
+  height: 200%;
+  -webkit-transition: all 0.6s ease;
+  transition: all 0.6s ease;
+}
+.imghvr-shutter-in-out-diag-1:after {
+  -webkit-transform: skew(-45deg) translateX(-150%);
+  transform: skew(-45deg) translateX(-150%);
+}
+.imghvr-shutter-in-out-diag-1:before {
+  -webkit-transform: skew(-45deg) translateX(150%);
+  transform: skew(-45deg) translateX(150%);
+}
+.imghvr-shutter-in-out-diag-1:hover:after {
+  -webkit-transform: skew(-45deg) translateX(-50%);
+  transform: skew(-45deg) translateX(-50%);
+}
+.imghvr-shutter-in-out-diag-1:hover:before {
+  -webkit-transform: skew(-45deg) translateX(50%);
+  transform: skew(-45deg) translateX(50%);
+}
+/* imghvr-shutter-in-out-diag-2
+   ----------------------------- */
+.imghvr-shutter-in-out-diag-2:after,
+.imghvr-shutter-in-out-diag-2:before {
+  width: 200%;
+  height: 200%;
+  -webkit-transition: all 0.6s ease;
+  transition: all 0.6s ease;
+}
+.imghvr-shutter-in-out-diag-2:after {
+  -webkit-transform: skew(45deg) translateX(-100%);
+  transform: skew(45deg) translateX(-100%);
+}
+.imghvr-shutter-in-out-diag-2:before {
+  -webkit-transform: skew(45deg) translateX(100%);
+  transform: skew(45deg) translateX(100%);
+}
+.imghvr-shutter-in-out-diag-2:hover:after {
+  -webkit-transform: skew(45deg) translateX(0%);
+  transform: skew(45deg) translateX(0%);
+}
+.imghvr-shutter-in-out-diag-2:hover:before {
+  -webkit-transform: skew(45deg) translateX(0%);
+  transform: skew(45deg) translateX(0%);
+}
+/* imghvr-fold*
+   ----------------------------- */
+[class^='imghvr-fold'],
+[class*=' imghvr-fold'] {
+  -webkit-perspective: 50em;
+  perspective: 50em;
+}
+[class^='imghvr-fold'] img,
+[class*=' imghvr-fold'] img {
+  -webkit-transform-origin: 50% 0%;
+  -ms-transform-origin: 50% 0%;
+  transform-origin: 50% 0%;
+}
+[class^='imghvr-fold'] figcaption,
+[class*=' imghvr-fold'] figcaption {
+  z-index: 1;
+  opacity: 0;
+}
+[class^='imghvr-fold']:hover > img,
+[class*=' imghvr-fold']:hover > img {
+  opacity: 0;
+  -webkit-transition-delay: 0;
+  transition-delay: 0;
+}
+[class^='imghvr-fold']:hover figcaption,
+[class*=' imghvr-fold']:hover figcaption {
+  -webkit-transform: rotateX(0deg) translate3d(0, 0%, 0) scale(1);
+  transform: rotateX(0deg) translate3d(0, 0%, 0) scale(1);
+  opacity: 1;
+  -webkit-transition-delay: 0.2s;
+  transition-delay: 0.2s;
+}
+/* imghvr-fold-up
+   ----------------------------- */
+.imghvr-fold-up > img {
+  -webkit-transform-origin: 50% 0%;
+  -ms-transform-origin: 50% 0%;
+  transform-origin: 50% 0%;
+}
+.imghvr-fold-up figcaption {
+  -webkit-transform: rotateX(-90deg) translate3d(0%, -50%, 0) scale(0.6);
+  transform: rotateX(-90deg) translate3d(0%, -50%, 0) scale(0.6);
+  -webkit-transform-origin: 50% 100%;
+  -ms-transform-origin: 50% 100%;
+  transform-origin: 50% 100%;
+}
+.imghvr-fold-up:hover > img {
+  -webkit-transform: rotateX(90deg) scale(0.6) translateY(50%);
+  transform: rotateX(90deg) scale(0.6) translateY(50%);
+}
+/* imghvr-fold-down
+   ----------------------------- */
+.imghvr-fold-down > img {
+  -webkit-transform-origin: 50% 100%;
+  -ms-transform-origin: 50% 100%;
+  transform-origin: 50% 100%;
+}
+.imghvr-fold-down figcaption {
+  -webkit-transform: rotateX(90deg) translate3d(0%, 50%, 0) scale(0.6);
+  transform: rotateX(90deg) translate3d(0%, 50%, 0) scale(0.6);
+  -webkit-transform-origin: 50% 0%;
+  -ms-transform-origin: 50% 0%;
+  transform-origin: 50% 0%;
+}
+.imghvr-fold-down:hover > img {
+  -webkit-transform: rotateX(-90deg) scale(0.6) translateY(-50%);
+  transform: rotateX(-90deg) scale(0.6) translateY(-50%);
+}
+/* imghvr-fold-left
+   ----------------------------- */
+.imghvr-fold-left > img {
+  -webkit-transform-origin: 0% 50%;
+  -ms-transform-origin: 0% 50%;
+  transform-origin: 0% 50%;
+}
+.imghvr-fold-left figcaption {
+  -webkit-transform: rotateY(90deg) translate3d(-50%, 0%, 0) scale(0.6);
+  transform: rotateY(90deg) translate3d(-50%, 0%, 0) scale(0.6);
+  -webkit-transform-origin: 100% 50%;
+  -ms-transform-origin: 100% 50%;
+  transform-origin: 100% 50%;
+}
+.imghvr-fold-left:hover > img {
+  -webkit-transform: rotateY(-90deg) scale(0.6) translateX(50%);
+  transform: rotateY(-90deg) scale(0.6) translateX(50%);
+}
+/* imghvr-fold-right
+   ----------------------------- */
+.imghvr-fold-right {
+  -webkit-perspective: 50em;
+  perspective: 50em;
+}
+.imghvr-fold-right > img {
+  -webkit-transform-origin: 100% 50%;
+  -ms-transform-origin: 100% 50%;
+  transform-origin: 100% 50%;
+}
+.imghvr-fold-right figcaption {
+  -webkit-transform: rotateY(-90deg) translate3d(50%, 0%, 0) scale(0.6);
+  transform: rotateY(-90deg) translate3d(50%, 0%, 0) scale(0.6);
+  -webkit-transform-origin: 0 50%;
+  -ms-transform-origin: 0 50%;
+  transform-origin: 0 50%;
+}
+.imghvr-fold-right:hover > img {
+  -webkit-transform: rotateY(90deg) scale(0.6) translateX(-50%);
+  transform: rotateY(90deg) scale(0.6) translateX(-50%);
+}
+/* imghvr-zoom-in
+   ----------------------------- */
+.imghvr-zoom-in figcaption {
+  opacity: 0;
+  -webkit-transform: scale(0.5);
+  transform: scale(0.5);
+}
+.imghvr-zoom-in:hover figcaption {
+  -webkit-transform: scale(1);
+  transform: scale(1);
+  opacity: 1;
+}
+/* imghvr-zoom-out*
+   ----------------------------- */
+[class^='imghvr-zoom-out'] figcaption,
+[class*=' imghvr-zoom-out'] figcaption {
+  -webkit-transform: scale(0.5);
+  transform: scale(0.5);
+  -webkit-transform-origin: 50% 50%;
+  -ms-transform-origin: 50% 50%;
+  transform-origin: 50% 50%;
+  opacity: 0;
+}
+[class^='imghvr-zoom-out']:hover figcaption,
+[class*=' imghvr-zoom-out']:hover figcaption,
+[class^='imghvr-zoom-out'].hover figcaption,
+[class*=' imghvr-zoom-out'].hover figcaption {
+  -webkit-transform: scale(1);
+  transform: scale(1);
+  opacity: 1;
+  -webkit-transition-delay: 0.3s;
+  transition-delay: 0.3s;
+}
+/* imghvr-zoom-out
+   ----------------------------- */
+.imghvr-zoom-out:hover > img {
+  -webkit-transform: scale(0.5);
+  transform: scale(0.5);
+  opacity: 0;
+}
+/* imghvr-zoom-out-up
+   ----------------------------- */
+.imghvr-zoom-out-up:hover > img,
+.imghvr-zoom-out-up.hover > img {
+  -webkit-animation: imghvr-zoom-out-up 0.4s linear;
+  animation: imghvr-zoom-out-up 0.4s linear;
+  -webkit-animation-iteration-count: 1;
+  animation-iteration-count: 1;
+  -webkit-animation-fill-mode: forwards;
+  animation-fill-mode: forwards;
+}
+@-webkit-keyframes imghvr-zoom-out-up {
+  50% {
+    -webkit-transform: scale(0.8) translateY(0%);
+    transform: scale(0.8) translateY(0%);
+    opacity: 0.5;
+  }
+  100% {
+    -webkit-transform: scale(0.8) translateY(-150%);
+    transform: scale(0.8) translateY(-150%);
+    opacity: 0.5;
+  }
+}
+@keyframes imghvr-zoom-out-up {
+  50% {
+    -webkit-transform: scale(0.8) translateY(0%);
+    transform: scale(0.8) translateY(0%);
+    opacity: 0.5;
+  }
+  100% {
+    -webkit-transform: scale(0.8) translateY(-150%);
+    transform: scale(0.8) translateY(-150%);
+    opacity: 0.5;
+  }
+}
+/* imghvr-zoom-out-down
+   ----------------------------- */
+.imghvr-zoom-out-down:hover > img,
+.imghvr-zoom-out-down.hover > img {
+  -webkit-animation: imghvr-zoom-out-down 0.4s linear;
+  animation: imghvr-zoom-out-down 0.4s linear;
+  -webkit-animation-iteration-count: 1;
+  animation-iteration-count: 1;
+  -webkit-animation-fill-mode: forwards;
+  animation-fill-mode: forwards;
+}
+@-webkit-keyframes imghvr-zoom-out-down {
+  50% {
+    -webkit-transform: scale(0.8) translateY(0%);
+    transform: scale(0.8) translateY(0%);
+    opacity: 0.5;
+  }
+  100% {
+    -webkit-transform: scale(0.8) translateY(150%);
+    transform: scale(0.8) translateY(150%);
+    opacity: 0.5;
+  }
+}
+@keyframes imghvr-zoom-out-down {
+  50% {
+    -webkit-transform: scale(0.8) translateY(0%);
+    transform: scale(0.8) translateY(0%);
+    opacity: 0.5;
+  }
+  100% {
+    -webkit-transform: scale(0.8) translateY(150%);
+    transform: scale(0.8) translateY(150%);
+    opacity: 0.5;
+  }
+}
+/* imghvr-zoom-out-left
+   ----------------------------- */
+.imghvr-zoom-out-left:hover > img,
+.imghvr-zoom-out-left.hover > img {
+  -webkit-animation: imghvr-zoom-out-left 0.4s linear;
+  animation: imghvr-zoom-out-left 0.4s linear;
+  -webkit-animation-iteration-count: 1;
+  animation-iteration-count: 1;
+  -webkit-animation-fill-mode: forwards;
+  animation-fill-mode: forwards;
+}
+@-webkit-keyframes imghvr-zoom-out-left {
+  50% {
+    -webkit-transform: scale(0.8) translateX(0%);
+    transform: scale(0.8) translateX(0%);
+    opacity: 0.5;
+  }
+  100% {
+    -webkit-transform: scale(0.8) translateX(-150%);
+    transform: scale(0.8) translateX(-150%);
+    opacity: 0.5;
+  }
+}
+@keyframes imghvr-zoom-out-left {
+  50% {
+    -webkit-transform: scale(0.8) translateX(0%);
+    transform: scale(0.8) translateX(0%);
+    opacity: 0.5;
+  }
+  100% {
+    -webkit-transform: scale(0.8) translateX(-150%);
+    transform: scale(0.8) translateX(-150%);
+    opacity: 0.5;
+  }
+}
+/* imghvr-zoom-out-right
+   ----------------------------- */
+.imghvr-zoom-out-right:hover > img,
+.imghvr-zoom-out-right.hover > img {
+  -webkit-animation: imghvr-zoom-out-right 0.4s linear;
+  animation: imghvr-zoom-out-right 0.4s linear;
+  -webkit-animation-iteration-count: 1;
+  animation-iteration-count: 1;
+  -webkit-animation-fill-mode: forwards;
+  animation-fill-mode: forwards;
+}
+@-webkit-keyframes imghvr-zoom-out-right {
+  50% {
+    -webkit-transform: scale(0.8) translateX(0%);
+    transform: scale(0.8) translateX(0%);
+    opacity: 0.5;
+  }
+  100% {
+    -webkit-transform: scale(0.8) translateX(150%);
+    transform: scale(0.8) translateX(150%);
+    opacity: 0.5;
+  }
+}
+@keyframes imghvr-zoom-out-right {
+  50% {
+    -webkit-transform: scale(0.8) translateX(0%);
+    transform: scale(0.8) translateX(0%);
+    opacity: 0.5;
+  }
+  100% {
+    -webkit-transform: scale(0.8) translateX(150%);
+    transform: scale(0.8) translateX(150%);
+    opacity: 0.5;
+  }
+}
+/* imghvr-zoom-out-flip-horiz
+   ----------------------------- */
+.imghvr-zoom-out-flip-horiz {
+  -webkit-perspective: 50em;
+  perspective: 50em;
+}
+.imghvr-zoom-out-flip-horiz figcaption {
+  opacity: 0;
+  -webkit-transform: rotateX(90deg) translateY(-100%) scale(0.5);
+  transform: rotateX(90deg) translateY(-100%) scale(0.5);
+}
+.imghvr-zoom-out-flip-horiz:hover > img,
+.imghvr-zoom-out-flip-horiz.hover > img {
+  -webkit-transform: rotateX(-100deg) translateY(50%) scale(0.5);
+  transform: rotateX(-100deg) translateY(50%) scale(0.5);
+  opacity: 0;
+  -webkit-transition-delay: 0;
+  transition-delay: 0;
+}
+.imghvr-zoom-out-flip-horiz:hover figcaption,
+.imghvr-zoom-out-flip-horiz.hover figcaption {
+  -webkit-transform: rotateX(0deg) translateY(0%) scale(1);
+  transform: rotateX(0deg) translateY(0%) scale(1);
+  opacity: 1;
+  -webkit-transition-delay: 0.3s;
+  transition-delay: 0.3s;
+}
+/* imghvr-zoom-out-flip-vert
+   ----------------------------- */
+.imghvr-zoom-out-flip-vert {
+  -webkit-perspective: 50em;
+  perspective: 50em;
+}
+.imghvr-zoom-out-flip-vert figcaption {
+  opacity: 0;
+  -webkit-transform: rotateY(90deg) translate(50%, 0px) scale(0.5);
+  transform: rotateY(90deg) translate(50%, 0px) scale(0.5);
+}
+.imghvr-zoom-out-flip-vert:hover > img,
+.imghvr-zoom-out-flip-vert.hover > img {
+  -webkit-transform: rotateY(-100deg) translateX(50%) scale(0.5);
+  transform: rotateY(-100deg) translateX(50%) scale(0.5);
+  opacity: 0;
+  -webkit-transition-delay: 0;
+  transition-delay: 0;
+}
+.imghvr-zoom-out-flip-vert:hover figcaption,
+.imghvr-zoom-out-flip-vert.hover figcaption {
+  -webkit-transform: rotateY(0deg) translate(0px, 0px) scale(1);
+  transform: rotateY(0deg) translate(0px, 0px) scale(1);
+  opacity: 1;
+  -webkit-transition-delay: 0.3s;
+  transition-delay: 0.3s;
+}
+/* imghvr-blur
+   ----------------------------- */
+.imghvr-blur figcaption {
+  opacity: 0;
+}
+.imghvr-blur:hover > img {
+  -webkit-filter: blur(30px);
+  filter: blur(30px);
+  -webkit-transform: scale(1.2);
+  transform: scale(1.2);
+  opacity: 0;
+}
+.imghvr-blur:hover figcaption {
+  opacity: 1;
+  -webkit-transition-delay: 0.2s;
+  transition-delay: 0.2s;
+}