Эх сурвалжийг харах

Merge branch 'stage' of http://36.137.93.232:3000/hf/byte-sailing-new into stage

lxf 1 жил өмнө
parent
commit
9cf433d65b

+ 532 - 3
src/assets/icons/iconfont/demo_index.html

@@ -55,6 +55,144 @@
           <ul class="icon_lists dib-box">
           
             <li class="dib">
+              <span class="icon iconfont">&#xe8e4;</span>
+                <div class="name">btn_penren</div>
+                <div class="code-name">&amp;#xe8e4;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe8e5;</span>
+                <div class="name">btn_下拉22</div>
+                <div class="code-name">&amp;#xe8e5;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe8e6;</span>
+                <div class="name">btn_jiagong</div>
+                <div class="code-name">&amp;#xe8e6;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe8e7;</span>
+                <div class="name">btn_shouqi22</div>
+                <div class="code-name">&amp;#xe8e7;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe8df;</span>
+                <div class="name">iconx_goutong</div>
+                <div class="code-name">&amp;#xe8df;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe8e0;</span>
+                <div class="name">iconx_waimaoerp</div>
+                <div class="code-name">&amp;#xe8e0;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe8e1;</span>
+                <div class="name">iconm_xitonggl</div>
+                <div class="code-name">&amp;#xe8e1;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe8e2;</span>
+                <div class="name">iconm_goutong</div>
+                <div class="code-name">&amp;#xe8e2;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe8e3;</span>
+                <div class="name">iconm_waimaoerp</div>
+                <div class="code-name">&amp;#xe8e3;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe8de;</span>
+                <div class="name">iconx_xitonggl</div>
+                <div class="code-name">&amp;#xe8de;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe8da;</span>
+                <div class="name">btn_mine</div>
+                <div class="code-name">&amp;#xe8da;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe8db;</span>
+                <div class="name">btn_xiaox</div>
+                <div class="code-name">&amp;#xe8db;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe8dc;</span>
+                <div class="name">btn_gongz</div>
+                <div class="code-name">&amp;#xe8dc;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe8dd;</span>
+                <div class="name">btn_wulw</div>
+                <div class="code-name">&amp;#xe8dd;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe8d6;</span>
+                <div class="name">btn_mine_gray</div>
+                <div class="code-name">&amp;#xe8d6;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe8d7;</span>
+                <div class="name">btn_shengc_gray</div>
+                <div class="code-name">&amp;#xe8d7;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe8d8;</span>
+                <div class="name">btn_kanban_gray</div>
+                <div class="code-name">&amp;#xe8d8;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe8d9;</span>
+                <div class="name">btn_shebei_blue</div>
+                <div class="code-name">&amp;#xe8d9;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6aa;</span>
+                <div class="name">icon_tdgl</div>
+                <div class="code-name">&amp;#xe6aa;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6ac;</span>
+                <div class="name">icon_yhgl</div>
+                <div class="code-name">&amp;#xe6ac;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6ae;</span>
+                <div class="name">icon_ddgl_2</div>
+                <div class="code-name">&amp;#xe6ae;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6af;</span>
+                <div class="name">icon_ddgl_1</div>
+                <div class="code-name">&amp;#xe6af;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6b1;</span>
+                <div class="name">icon_ddgl</div>
+                <div class="code-name">&amp;#xe6b1;</div>
+              </li>
+          
+            <li class="dib">
               <span class="icon iconfont">&#xe8d2;</span>
                 <div class="name">iconm_gongncd</div>
                 <div class="code-name">&amp;#xe8d2;</div>
@@ -2958,9 +3096,9 @@
 <pre><code class="language-css"
 >@font-face {
   font-family: 'iconfont';
-  src: url('iconfont.woff2?t=1687672153417') format('woff2'),
-       url('iconfont.woff?t=1687672153417') format('woff'),
-       url('iconfont.ttf?t=1687672153417') format('truetype');
+  src: url('iconfont.woff2?t=1690168598112') format('woff2'),
+       url('iconfont.woff?t=1690168598112') format('woff'),
+       url('iconfont.ttf?t=1690168598112') format('truetype');
 }
 </code></pre>
           <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@@ -2987,6 +3125,213 @@
         <ul class="icon_lists dib-box">
           
           <li class="dib">
+            <span class="icon iconfont icon-btn_penren"></span>
+            <div class="name">
+              btn_penren
+            </div>
+            <div class="code-name">.icon-btn_penren
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-btn_xiala22"></span>
+            <div class="name">
+              btn_下拉22
+            </div>
+            <div class="code-name">.icon-btn_xiala22
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-btn_jiagong"></span>
+            <div class="name">
+              btn_jiagong
+            </div>
+            <div class="code-name">.icon-btn_jiagong
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-btn_shouqi22"></span>
+            <div class="name">
+              btn_shouqi22
+            </div>
+            <div class="code-name">.icon-btn_shouqi22
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-iconx_goutong"></span>
+            <div class="name">
+              iconx_goutong
+            </div>
+            <div class="code-name">.icon-iconx_goutong
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-iconx_waimaoerp"></span>
+            <div class="name">
+              iconx_waimaoerp
+            </div>
+            <div class="code-name">.icon-iconx_waimaoerp
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-iconm_xitonggl"></span>
+            <div class="name">
+              iconm_xitonggl
+            </div>
+            <div class="code-name">.icon-iconm_xitonggl
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-iconm_goutong"></span>
+            <div class="name">
+              iconm_goutong
+            </div>
+            <div class="code-name">.icon-iconm_goutong
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-iconm_waimaoerp"></span>
+            <div class="name">
+              iconm_waimaoerp
+            </div>
+            <div class="code-name">.icon-iconm_waimaoerp
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-iconx_xitonggl"></span>
+            <div class="name">
+              iconx_xitonggl
+            </div>
+            <div class="code-name">.icon-iconx_xitonggl
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-btn_mine"></span>
+            <div class="name">
+              btn_mine
+            </div>
+            <div class="code-name">.icon-btn_mine
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-btn_xiaox"></span>
+            <div class="name">
+              btn_xiaox
+            </div>
+            <div class="code-name">.icon-btn_xiaox
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-btn_gongz"></span>
+            <div class="name">
+              btn_gongz
+            </div>
+            <div class="code-name">.icon-btn_gongz
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-btn_wulw"></span>
+            <div class="name">
+              btn_wulw
+            </div>
+            <div class="code-name">.icon-btn_wulw
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-btn_mine_gray1"></span>
+            <div class="name">
+              btn_mine_gray
+            </div>
+            <div class="code-name">.icon-btn_mine_gray1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-btn_shengc_gray1"></span>
+            <div class="name">
+              btn_shengc_gray
+            </div>
+            <div class="code-name">.icon-btn_shengc_gray1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-btn_kanban_gray1"></span>
+            <div class="name">
+              btn_kanban_gray
+            </div>
+            <div class="code-name">.icon-btn_kanban_gray1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-btn_shebei_blue1"></span>
+            <div class="name">
+              btn_shebei_blue
+            </div>
+            <div class="code-name">.icon-btn_shebei_blue1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-icon_tdgl"></span>
+            <div class="name">
+              icon_tdgl
+            </div>
+            <div class="code-name">.icon-icon_tdgl
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-icon_yhgl"></span>
+            <div class="name">
+              icon_yhgl
+            </div>
+            <div class="code-name">.icon-icon_yhgl
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-icon_ddgl_2"></span>
+            <div class="name">
+              icon_ddgl_2
+            </div>
+            <div class="code-name">.icon-icon_ddgl_2
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-icon_ddgl_1"></span>
+            <div class="name">
+              icon_ddgl_1
+            </div>
+            <div class="code-name">.icon-icon_ddgl_1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-icon_ddgl"></span>
+            <div class="name">
+              icon_ddgl
+            </div>
+            <div class="code-name">.icon-icon_ddgl
+            </div>
+          </li>
+          
+          <li class="dib">
             <span class="icon iconfont icon-iconm_gongncd"></span>
             <div class="name">
               iconm_gongncd
@@ -7344,6 +7689,190 @@
           
             <li class="dib">
                 <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-btn_penren"></use>
+                </svg>
+                <div class="name">btn_penren</div>
+                <div class="code-name">#icon-btn_penren</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-btn_xiala22"></use>
+                </svg>
+                <div class="name">btn_下拉22</div>
+                <div class="code-name">#icon-btn_xiala22</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-btn_jiagong"></use>
+                </svg>
+                <div class="name">btn_jiagong</div>
+                <div class="code-name">#icon-btn_jiagong</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-btn_shouqi22"></use>
+                </svg>
+                <div class="name">btn_shouqi22</div>
+                <div class="code-name">#icon-btn_shouqi22</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-iconx_goutong"></use>
+                </svg>
+                <div class="name">iconx_goutong</div>
+                <div class="code-name">#icon-iconx_goutong</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-iconx_waimaoerp"></use>
+                </svg>
+                <div class="name">iconx_waimaoerp</div>
+                <div class="code-name">#icon-iconx_waimaoerp</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-iconm_xitonggl"></use>
+                </svg>
+                <div class="name">iconm_xitonggl</div>
+                <div class="code-name">#icon-iconm_xitonggl</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-iconm_goutong"></use>
+                </svg>
+                <div class="name">iconm_goutong</div>
+                <div class="code-name">#icon-iconm_goutong</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-iconm_waimaoerp"></use>
+                </svg>
+                <div class="name">iconm_waimaoerp</div>
+                <div class="code-name">#icon-iconm_waimaoerp</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-iconx_xitonggl"></use>
+                </svg>
+                <div class="name">iconx_xitonggl</div>
+                <div class="code-name">#icon-iconx_xitonggl</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-btn_mine"></use>
+                </svg>
+                <div class="name">btn_mine</div>
+                <div class="code-name">#icon-btn_mine</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-btn_xiaox"></use>
+                </svg>
+                <div class="name">btn_xiaox</div>
+                <div class="code-name">#icon-btn_xiaox</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-btn_gongz"></use>
+                </svg>
+                <div class="name">btn_gongz</div>
+                <div class="code-name">#icon-btn_gongz</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-btn_wulw"></use>
+                </svg>
+                <div class="name">btn_wulw</div>
+                <div class="code-name">#icon-btn_wulw</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-btn_mine_gray1"></use>
+                </svg>
+                <div class="name">btn_mine_gray</div>
+                <div class="code-name">#icon-btn_mine_gray1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-btn_shengc_gray1"></use>
+                </svg>
+                <div class="name">btn_shengc_gray</div>
+                <div class="code-name">#icon-btn_shengc_gray1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-btn_kanban_gray1"></use>
+                </svg>
+                <div class="name">btn_kanban_gray</div>
+                <div class="code-name">#icon-btn_kanban_gray1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-btn_shebei_blue1"></use>
+                </svg>
+                <div class="name">btn_shebei_blue</div>
+                <div class="code-name">#icon-btn_shebei_blue1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-icon_tdgl"></use>
+                </svg>
+                <div class="name">icon_tdgl</div>
+                <div class="code-name">#icon-icon_tdgl</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-icon_yhgl"></use>
+                </svg>
+                <div class="name">icon_yhgl</div>
+                <div class="code-name">#icon-icon_yhgl</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-icon_ddgl_2"></use>
+                </svg>
+                <div class="name">icon_ddgl_2</div>
+                <div class="code-name">#icon-icon_ddgl_2</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-icon_ddgl_1"></use>
+                </svg>
+                <div class="name">icon_ddgl_1</div>
+                <div class="code-name">#icon-icon_ddgl_1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-icon_ddgl"></use>
+                </svg>
+                <div class="name">icon_ddgl</div>
+                <div class="code-name">#icon-icon_ddgl</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
                   <use xlink:href="#icon-iconm_gongncd"></use>
                 </svg>
                 <div class="name">iconm_gongncd</div>

+ 95 - 3
src/assets/icons/iconfont/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 3933484 */
-  src: url('iconfont.woff2?t=1687672153417') format('woff2'),
-       url('iconfont.woff?t=1687672153417') format('woff'),
-       url('iconfont.ttf?t=1687672153417') format('truetype');
+  src: url('iconfont.woff2?t=1690168598112') format('woff2'),
+       url('iconfont.woff?t=1690168598112') format('woff'),
+       url('iconfont.ttf?t=1690168598112') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,98 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-btn_penren:before {
+  content: "\e8e4";
+}
+
+.icon-btn_xiala22:before {
+  content: "\e8e5";
+}
+
+.icon-btn_jiagong:before {
+  content: "\e8e6";
+}
+
+.icon-btn_shouqi22:before {
+  content: "\e8e7";
+}
+
+.icon-iconx_goutong:before {
+  content: "\e8df";
+}
+
+.icon-iconx_waimaoerp:before {
+  content: "\e8e0";
+}
+
+.icon-iconm_xitonggl:before {
+  content: "\e8e1";
+}
+
+.icon-iconm_goutong:before {
+  content: "\e8e2";
+}
+
+.icon-iconm_waimaoerp:before {
+  content: "\e8e3";
+}
+
+.icon-iconx_xitonggl:before {
+  content: "\e8de";
+}
+
+.icon-btn_mine:before {
+  content: "\e8da";
+}
+
+.icon-btn_xiaox:before {
+  content: "\e8db";
+}
+
+.icon-btn_gongz:before {
+  content: "\e8dc";
+}
+
+.icon-btn_wulw:before {
+  content: "\e8dd";
+}
+
+.icon-btn_mine_gray1:before {
+  content: "\e8d6";
+}
+
+.icon-btn_shengc_gray1:before {
+  content: "\e8d7";
+}
+
+.icon-btn_kanban_gray1:before {
+  content: "\e8d8";
+}
+
+.icon-btn_shebei_blue1:before {
+  content: "\e8d9";
+}
+
+.icon-icon_tdgl:before {
+  content: "\e6aa";
+}
+
+.icon-icon_yhgl:before {
+  content: "\e6ac";
+}
+
+.icon-icon_ddgl_2:before {
+  content: "\e6ae";
+}
+
+.icon-icon_ddgl_1:before {
+  content: "\e6af";
+}
+
+.icon-icon_ddgl:before {
+  content: "\e6b1";
+}
+
 .icon-iconm_gongncd:before {
   content: "\e8d2";
 }

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
src/assets/icons/iconfont/iconfont.js


+ 161 - 0
src/assets/icons/iconfont/iconfont.json

@@ -6,6 +6,167 @@
   "description": "",
   "glyphs": [
     {
+      "icon_id": "36562143",
+      "name": "btn_penren",
+      "font_class": "btn_penren",
+      "unicode": "e8e4",
+      "unicode_decimal": 59620
+    },
+    {
+      "icon_id": "36562142",
+      "name": "btn_下拉22",
+      "font_class": "btn_xiala22",
+      "unicode": "e8e5",
+      "unicode_decimal": 59621
+    },
+    {
+      "icon_id": "36562141",
+      "name": "btn_jiagong",
+      "font_class": "btn_jiagong",
+      "unicode": "e8e6",
+      "unicode_decimal": 59622
+    },
+    {
+      "icon_id": "36562140",
+      "name": "btn_shouqi22",
+      "font_class": "btn_shouqi22",
+      "unicode": "e8e7",
+      "unicode_decimal": 59623
+    },
+    {
+      "icon_id": "36521213",
+      "name": "iconx_goutong",
+      "font_class": "iconx_goutong",
+      "unicode": "e8df",
+      "unicode_decimal": 59615
+    },
+    {
+      "icon_id": "36521214",
+      "name": "iconx_waimaoerp",
+      "font_class": "iconx_waimaoerp",
+      "unicode": "e8e0",
+      "unicode_decimal": 59616
+    },
+    {
+      "icon_id": "36521215",
+      "name": "iconm_xitonggl",
+      "font_class": "iconm_xitonggl",
+      "unicode": "e8e1",
+      "unicode_decimal": 59617
+    },
+    {
+      "icon_id": "36521212",
+      "name": "iconm_goutong",
+      "font_class": "iconm_goutong",
+      "unicode": "e8e2",
+      "unicode_decimal": 59618
+    },
+    {
+      "icon_id": "36521211",
+      "name": "iconm_waimaoerp",
+      "font_class": "iconm_waimaoerp",
+      "unicode": "e8e3",
+      "unicode_decimal": 59619
+    },
+    {
+      "icon_id": "36521216",
+      "name": "iconx_xitonggl",
+      "font_class": "iconx_xitonggl",
+      "unicode": "e8de",
+      "unicode_decimal": 59614
+    },
+    {
+      "icon_id": "36469149",
+      "name": "btn_mine",
+      "font_class": "btn_mine",
+      "unicode": "e8da",
+      "unicode_decimal": 59610
+    },
+    {
+      "icon_id": "36469150",
+      "name": "btn_xiaox",
+      "font_class": "btn_xiaox",
+      "unicode": "e8db",
+      "unicode_decimal": 59611
+    },
+    {
+      "icon_id": "36469151",
+      "name": "btn_gongz",
+      "font_class": "btn_gongz",
+      "unicode": "e8dc",
+      "unicode_decimal": 59612
+    },
+    {
+      "icon_id": "36469152",
+      "name": "btn_wulw",
+      "font_class": "btn_wulw",
+      "unicode": "e8dd",
+      "unicode_decimal": 59613
+    },
+    {
+      "icon_id": "34869433",
+      "name": "btn_mine_gray",
+      "font_class": "btn_mine_gray1",
+      "unicode": "e8d6",
+      "unicode_decimal": 59606
+    },
+    {
+      "icon_id": "34869434",
+      "name": "btn_shengc_gray",
+      "font_class": "btn_shengc_gray1",
+      "unicode": "e8d7",
+      "unicode_decimal": 59607
+    },
+    {
+      "icon_id": "34869435",
+      "name": "btn_kanban_gray",
+      "font_class": "btn_kanban_gray1",
+      "unicode": "e8d8",
+      "unicode_decimal": 59608
+    },
+    {
+      "icon_id": "34869436",
+      "name": "btn_shebei_blue",
+      "font_class": "btn_shebei_blue1",
+      "unicode": "e8d9",
+      "unicode_decimal": 59609
+    },
+    {
+      "icon_id": "29656290",
+      "name": "icon_tdgl",
+      "font_class": "icon_tdgl",
+      "unicode": "e6aa",
+      "unicode_decimal": 59050
+    },
+    {
+      "icon_id": "29656292",
+      "name": "icon_yhgl",
+      "font_class": "icon_yhgl",
+      "unicode": "e6ac",
+      "unicode_decimal": 59052
+    },
+    {
+      "icon_id": "29656294",
+      "name": "icon_ddgl_2",
+      "font_class": "icon_ddgl_2",
+      "unicode": "e6ae",
+      "unicode_decimal": 59054
+    },
+    {
+      "icon_id": "29656295",
+      "name": "icon_ddgl_1",
+      "font_class": "icon_ddgl_1",
+      "unicode": "e6af",
+      "unicode_decimal": 59055
+    },
+    {
+      "icon_id": "29656300",
+      "name": "icon_ddgl",
+      "font_class": "icon_ddgl",
+      "unicode": "e6b1",
+      "unicode_decimal": 59057
+    },
+    {
       "icon_id": "36123929",
       "name": "iconm_gongncd",
       "font_class": "iconm_gongncd",

BIN
src/assets/icons/iconfont/iconfont.ttf


BIN
src/assets/icons/iconfont/iconfont.woff


BIN
src/assets/icons/iconfont/iconfont.woff2


+ 202 - 35
src/components/PDF/contractPDF.vue

@@ -1,14 +1,30 @@
 <template>
   <div>
     <div id="printMe">
-      <div id="pdfDom" style="width: 800px; padding: 16px; font-size: 12px !important">
+      <div
+        id="pdfDom"
+        style="width: 800px; padding: 16px; font-size: 12px !important"
+      >
         <div style="font-size: 18px; text-align: center">
           {{ printDetails.sellCorporationNameEn }}
         </div>
         <div style="text-align: center">
-          {{ printDetails.sellDetailedAddress }},{{ printDetails.sellCityName }},{{ printDetails.sellProvinceName }},{{ printDetails.sellCountryName }}
+          {{ printDetails.sellDetailedAddress }},{{
+            printDetails.sellCityName
+          }},{{ printDetails.sellProvinceName }},{{
+            printDetails.sellCountryName
+          }}
+        </div>
+        <div
+          style="
+            font-size: 14px;
+            color: #409eff;
+            text-align: center;
+            padding-top: 16px;
+          "
+        >
+          PROFORMA INVOICE
         </div>
-        <div style="font-size: 14px; color: #409eff; text-align: center; padding-top: 16px">PROFORMA INVOICE</div>
         <div style="padding-top: 8px">
           <div>PI NO. : {{ printDetails.contractCode }}</div>
           <div>PI DATE: {{ printDetails.createTimeEn }}</div>
@@ -18,7 +34,11 @@
             <div style="color: #409eff">VENDOR:</div>
             <div>{{ printDetails.sellCorporationNameEn }}</div>
             <div style="padding: 16px 0">
-              {{ printDetails.sellDetailedAddress }},{{ printDetails.sellCityName }},{{ printDetails.sellProvinceName }},{{ printDetails.sellCountryName }}
+              {{ printDetails.sellDetailedAddress }},{{
+                printDetails.sellCityName
+              }},{{ printDetails.sellProvinceName }},{{
+                printDetails.sellCountryName
+              }}
             </div>
             <div>CONTACT: {{ printDetails.sellContactName }}</div>
             <div>TEL.: {{ printDetails.sellContactNumber }}</div>
@@ -26,21 +46,47 @@
           <div style="width: 50%">
             <div style="color: #409eff">BUYER:</div>
             <div>{{ printDetails.buyCorporationName }}</div>
+            <div style="padding-top: 16px">
+              <span style="color: #409eff">TAX NUMBER:</span
+              ><span>{{ printDetails.taxNumber }}</span>
+            </div>
             <div style="padding: 16px 0">
-              {{ printDetails.buyDetailedAddress }},{{ printDetails.buyCityName }},{{ printDetails.buyProvinceName }},{{ printDetails.buyCountryName }}
+              {{ printDetails.buyDetailedAddress }},{{
+                printDetails.buyCityName
+              }},{{ printDetails.buyProvinceName }},{{
+                printDetails.buyCountryName
+              }}
+            </div>
+            <div>
+              <span style="color: #409eff">POST CODE:</span>
+              <span>{{ printDetails.buyPostalCode }}</span>
+            </div>
+            <div style="padding-top: 16px">
+              CONTACT: {{ printDetails.buyContactName }}
             </div>
-            <div>CONTACT: {{ printDetails.buyContactName }}</div>
             <div>TEL.: {{ printDetails.buyContactNumber }}</div>
           </div>
         </div>
         <div style="height: 16px"></div>
         <div style="border: 1px solid black">
           <div style="display: flex; width: 100%">
-            <div style="width: 33%; border-bottom: 1px solid black; border-right: 1px solid black">
+            <div
+              style="
+                width: 33%;
+                border-bottom: 1px solid black;
+                border-right: 1px solid black;
+              "
+            >
               <div style="color: #409eff">COUNTRY OF ORIGIN:</div>
               <div>{{ printDetails.sellCountryName }}</div>
             </div>
-            <div style="width: 34%; border-bottom: 1px solid black; border-right: 1px solid black">
+            <div
+              style="
+                width: 34%;
+                border-bottom: 1px solid black;
+                border-right: 1px solid black;
+              "
+            >
               <div style="color: #409eff">COUNTRY OF DESTINATION:</div>
               <div>{{ printDetails.buyCountryName }}</div>
             </div>
@@ -50,13 +96,25 @@
             </div>
           </div>
           <div style="display: flex; width: 100%">
-            <div style="width: 33%; border-bottom: 1px solid black; border-right: 1px solid black">
+            <div
+              style="
+                width: 33%;
+                border-bottom: 1px solid black;
+                border-right: 1px solid black;
+              "
+            >
               <div style="color: #409eff">TERMS OF DELIVERY:</div>
               <div>
                 {{ dictValueLabel(printDetails.tradeMethods, tradeMethods) }}
               </div>
             </div>
-            <div style="width: 34%; border-bottom: 1px solid black; border-right: 1px solid black">
+            <div
+              style="
+                width: 34%;
+                border-bottom: 1px solid black;
+                border-right: 1px solid black;
+              "
+            >
               <div style="color: #409eff">CURRENCY:</div>
               <div>
                 {{ printDetails.currency }}
@@ -65,7 +123,9 @@
             <div style="width: 33%; border-bottom: 1px solid black">
               <div style="color: #409eff">EXPORT BY/VIA:</div>
               <div>
-                {{ dictValueLabel(printDetails.transportMethod, shippingMethod) }}
+                {{
+                  dictValueLabel(printDetails.transportMethod, shippingMethod)
+                }}
               </div>
             </div>
           </div>
@@ -82,19 +142,47 @@
         </div>
         <div style="height: 16px"></div>
         <div class="baseRow" style="display: flex; color: #409eff">
-          <div class="contentRow" style="width: 50px; text-align: center">NO.</div>
-          <div class="contentRow" style="width: calc(100% - 450px); text-align: center">COMMODITY, SPECIFICATION</div>
-          <div class="contentRow" style="width: 100px; text-align: center">UNIT</div>
-          <div class="contentRow" style="width: 100px; text-align: center">QUANTITY</div>
-          <div class="contentRow" style="width: 100px; text-align: center">UNIT PRICE</div>
-          <div class="contentRow" style="width: 100px; text-align: center">TOTAL PRICE</div>
+          <div class="contentRow" style="width: 50px; text-align: center">
+            NO.
+          </div>
+          <div
+            class="contentRow"
+            style="width: calc(100% - 450px); text-align: center"
+          >
+            COMMODITY, SPECIFICATION
+          </div>
+          <div class="contentRow" style="width: 100px; text-align: center">
+            UNIT
+          </div>
+          <div class="contentRow" style="width: 100px; text-align: center">
+            QUANTITY
+          </div>
+          <div class="contentRow" style="width: 100px; text-align: center">
+            UNIT PRICE
+          </div>
+          <div class="contentRow" style="width: 100px; text-align: center">
+            TOTAL PRICE
+          </div>
         </div>
-        <div v-if="printDetails.productInfoList && printDetails.productInfoList.length > 0">
-          <div class="baseRow" style="display: flex" v-for="(item, index) in printDetails.productInfoList" :key="item.productId">
+        <div
+          v-if="
+            printDetails.productInfoList &&
+            printDetails.productInfoList.length > 0
+          "
+        >
+          <div
+            class="baseRow"
+            style="display: flex"
+            v-for="(item, index) in printDetails.productInfoList"
+            :key="item.productId"
+          >
             <div class="contentRow" style="width: 50px; text-align: center">
               {{ index + 1 }}
             </div>
-            <div class="contentRow" style="width: calc(100% - 450px); text-align: center">
+            <div
+              class="contentRow"
+              style="width: calc(100% - 450px); text-align: center"
+            >
               {{ item.productName }}
             </div>
             <div class="contentRow" style="width: 100px; text-align: center">
@@ -112,12 +200,23 @@
           </div>
         </div>
         <div class="baseRow" style="display: flex; color: #409eff">
-          <div class="contentRow" style="width: calc(100% - 400px); text-align: center">SUBTOTAL:</div>
-          <div class="contentRow" style="width: 100px; text-align: center"></div>
+          <div
+            class="contentRow"
+            style="width: calc(100% - 400px); text-align: center"
+          >
+            SUBTOTAL:
+          </div>
+          <div
+            class="contentRow"
+            style="width: 100px; text-align: center"
+          ></div>
           <div class="contentRow" style="width: 100px; text-align: center">
             {{ statistics("productQuantity", 0) }}
           </div>
-          <div class="contentRow" style="width: 100px; text-align: center"></div>
+          <div
+            class="contentRow"
+            style="width: 100px; text-align: center"
+          ></div>
           <div class="contentRow" style="width: 100px; text-align: center">
             {{ statistics("amount", 2) }}
           </div>
@@ -129,20 +228,38 @@
             </div>
           </div> -->
         <div class="baseRow" style="display: flex">
-          <div class="contentRow" style="width: calc(100% - 100px); text-align: right; color: #409eff">FREIGHT COST:</div>
+          <div
+            class="contentRow"
+            style="width: calc(100% - 100px); text-align: right; color: #409eff"
+          >
+            FREIGHT COST:
+          </div>
           <div class="contentRow" style="width: 100px; text-align: center">
             {{ statisticsTwo("amount", 2) }}
           </div>
         </div>
         <div class="baseRow" style="display: flex">
-          <div class="contentRow" style="width: calc(100% - 100px); text-align: right; color: #409eff">TOTAL PRICE:</div>
+          <div
+            class="contentRow"
+            style="width: calc(100% - 100px); text-align: right; color: #409eff"
+          >
+            TOTAL PRICE:
+          </div>
           <div class="contentRow" style="width: 100px; text-align: center">
             {{ printDetails.totalAmount }}
           </div>
         </div>
-        <div class="baseRow" style="display: flex; border-bottom: 1px solid black">
+        <div
+          class="baseRow"
+          style="display: flex; border-bottom: 1px solid black"
+        >
           <div class="contentRow" style="width: 100%">
-            {{ translateIntoEnglish(printDetails.totalAmount, printDetails.currency) }}
+            {{
+              translateIntoEnglish(
+                printDetails.totalAmount,
+                printDetails.currency
+              )
+            }}
           </div>
         </div>
         <div style="height: 16px"></div>
@@ -151,22 +268,66 @@
         </div>
         <div class="baseRow" style="border-bottom: 1px solid black">
           <div class="contentRow" style="width: 100%">
-            <div style="line-height: 24px; padding-left: 4px; word-break: break-all; word-wrap: break-word">
+            <div
+              style="
+                line-height: 24px;
+                padding-left: 4px;
+                word-break: break-all;
+                word-wrap: break-word;
+              "
+            >
               Beneficiary Name: {{ printDetails.beneficiaryName }}
             </div>
-            <div style="line-height: 24px; padding-left: 4px; word-break: break-all; word-wrap: break-word">
+            <div
+              style="
+                line-height: 24px;
+                padding-left: 4px;
+                word-break: break-all;
+                word-wrap: break-word;
+              "
+            >
               Beneficiary Bank: {{ printDetails.beneficiaryBank }}
             </div>
-            <div style="line-height: 24px; padding-left: 4px; word-break: break-all; word-wrap: break-word">
+            <div
+              style="
+                line-height: 24px;
+                padding-left: 4px;
+                word-break: break-all;
+                word-wrap: break-word;
+              "
+            >
               Beneficiary Bank Address:
               {{ printDetails.beneficiaryBankAddress }}
             </div>
-            <div style="line-height: 24px; padding-left: 4px; word-break: break-all; word-wrap: break-word">
+            <div
+              style="
+                line-height: 24px;
+                padding-left: 4px;
+                word-break: break-all;
+                word-wrap: break-word;
+              "
+            >
               Beneficiary Account Number:
               {{ printDetails.beneficiaryAccountNumber }}
             </div>
-            <div style="line-height: 24px; padding-left: 4px; word-break: break-all; word-wrap: break-word">Swift Code: {{ printDetails.swiftCode }}</div>
-            <div style="line-height: 24px; padding-left: 4px; word-break: break-all; word-wrap: break-word">
+            <div
+              style="
+                line-height: 24px;
+                padding-left: 4px;
+                word-break: break-all;
+                word-wrap: break-word;
+              "
+            >
+              Swift Code: {{ printDetails.swiftCode }}
+            </div>
+            <div
+              style="
+                line-height: 24px;
+                padding-left: 4px;
+                word-break: break-all;
+                word-wrap: break-word;
+              "
+            >
               Beneficiary Address: {{ printDetails.beneficiaryAddress }}
             </div>
           </div>
@@ -202,7 +363,10 @@ const getPdfData = (query) => {
 };
 const statistics = (label, index) => {
   let num = 0;
-  if (printDetails.value.productInfoList && printDetails.value.productInfoList.length > 0) {
+  if (
+    printDetails.value.productInfoList &&
+    printDetails.value.productInfoList.length > 0
+  ) {
     printDetails.value.productInfoList.map((item) => {
       if (item[label]) {
         num = parseFloat(Number(num) + Number(item[label])).toFixed(index);
@@ -213,7 +377,10 @@ const statistics = (label, index) => {
 };
 const statisticsTwo = (label, index) => {
   let num = 0;
-  if (printDetails.value.contractProjectList && printDetails.value.contractProjectList.length > 0) {
+  if (
+    printDetails.value.contractProjectList &&
+    printDetails.value.contractProjectList.length > 0
+  ) {
     printDetails.value.contractProjectList.map((item) => {
       if (item[label]) {
         num = parseFloat(Number(num) + Number(item[label])).toFixed(index);

+ 1 - 1
src/components/byTable/demo.vue

@@ -521,7 +521,7 @@ const getList = async (res) => {
 	console.log(sourceList.value)
 	console.log({ ...sourceList.value.pagination, ...res })
 	loading.value = true
-	proxy.get('/system/role/list?pageNum=1&pageSize=10').then((message) => {
+	proxy.post('flowExample/getToBeProcessedPage').then((message) => {
 		console.log(message)
 		sourceList.value.data = message.rows
 		setTimeout(() => {

+ 7 - 8
src/components/byTable/index.vue

@@ -33,11 +33,9 @@
     </div>
     <div class="more-btn">
       <span @click="isMore = !isMore" v-if="statWarpHeight > 200">
-        {{ isMore ? "收起" : "展开" }}
-        <i
-          class="el-icon-arrow-down"
-          :class="isMore ? 'el-icon-arrow-up' : ''"
-        ></i>
+        <i v-if="!isMore" class="iconfont icon-btn_xiala22"></i>
+        <i v-else class="iconfont icon-btn_shouqi22"></i>
+        
       </span>
     </div>
     <ul id="statWarp">
@@ -595,13 +593,14 @@ export default defineComponent({
   .more-btn {
     position: absolute;
     right: 0;
-    top: 0;
-    width: 40px;
-    height: 30px;
+    bottom: 0;
+    left: 0;
+    height: 40px;
     cursor: pointer;
     font-size: 12px;
     line-height: 30px;
     text-align: center;
+    background: linear-gradient(180deg, rgba(255,255,255,0) 0%, rgba(255,255,255,0.8) 100%);
   }
   .title {
     height: 60px;

+ 22 - 6
src/components/notice/index.vue

@@ -61,9 +61,9 @@
 							业务<span v-if="pushInfoReq.whetherFlow === 0">({{pushInfoReq.total}})</span>
 						</li>
 					</ul>
-					<!-- <div class="more">查看更多&gt;</div> -->
+					<div class="more" @click="toDealWith({businessType:'hisMsg'})">查看更多&gt;</div>
 				</div>
-				<el-table :data="noticeData" style="width: 100%">
+				<el-table :data="noticeData" style="width: 100%" @row-click="rowClick">
 					<el-table-column prop="title" label="标题内容" width="250">
 						<template #default="scope">
 							<el-tooltip
@@ -72,7 +72,7 @@
 								:content="scope.row.title"
 								placement="top"
 							>
-								<div class="noticeData-title" @click="toDealWith(scope.row)">{{ scope.row.title }}</div>
+								<div class="noticeData-title">{{ scope.row.title }}</div>
 							</el-tooltip>
 							
 						</template>
@@ -84,7 +84,7 @@
 					</el-table-column>
 					<el-table-column prop="address" label="操作">
 						<template #default="scope">
-							<span style="cursor: pointer" @click="readFn(scope)">确认已读</span>
+							<span style="cursor: pointer" @click.stop="readFn(scope)">确认已读</span>
 						</template>
 					</el-table-column>
 				</el-table>
@@ -128,12 +128,18 @@ const moreFn = () => {
 	noticeTableModal.value = true
 }
 
+const rowClick = (row) => {
+	commonRead([row.id])
+	toDealWith(row)
+}
+
 const toDealWith = (item) => {
 	
 	let urlConfig = {
 		"0":'DealWith',
 		"5":'Claim',
-		"6":"Abnormal"
+		"6":"Abnormal",
+		'hisMsg':'HisMsg'
 	}
 	proxy.$router.push({
 		name:urlConfig[item.businessType],
@@ -172,6 +178,7 @@ const commonRead = (ids,type) => {
 		if(type == 'confirm'){
 			data.value[index].isRead = true
 		}else{
+			
 			getPushInfo()
 		}
 	})
@@ -258,9 +265,18 @@ const getPushInfo = () => {
 	proxy.post('/pushInfo/page',pushInfoReq.value).then(res=>{
 		noticeData.value = res.rows
 		pushInfoReq.value.total = res.total
-		console.log(pushInfoReq)
 		setTimeout(() => {
 			loading.value = false
+			proxy.post('/pushInfo/page',{
+				pageNum: 1,
+				pageSize: 5,
+				pushRead: 0,
+				type: '',
+				total:0,
+				whetherFlow:'',
+			}).then(res=>{
+				emit('changeNum',res.total * 1)
+			})
 		}, 500);
 	})
 }

+ 239 - 64
src/components/process/PurchasePayment.vue

@@ -1,9 +1,21 @@
 <template>
   <div style="width: 100%; padding: 0px 15px">
-    <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="submit">
+    <byForm
+      :formConfig="formConfig"
+      :formOption="formOption"
+      v-model="formData.data"
+      :rules="rules"
+      ref="submit"
+    >
       <template #deadline>
         <div style="width: 100%">
-          <el-date-picker v-model="formData.data.deadline" type="date" placeholder="请选择付款期限" value-format="YYYY-MM-DD" style="width: 100%" />
+          <el-date-picker
+            v-model="formData.data.deadline"
+            type="date"
+            placeholder="请选择付款期限"
+            value-format="YYYY-MM-DD"
+            style="width: 100%"
+          />
         </div>
       </template>
       <template #receiptsNum>
@@ -15,7 +27,8 @@
             :min="0"
             :precision="0"
             :controls="false"
-            style="width: 100%" />
+            style="width: 100%"
+          />
         </div>
       </template>
       <template #rate>
@@ -28,7 +41,8 @@
             :max="100"
             :precision="2"
             :controls="false"
-            style="width: 100%" />
+            style="width: 100%"
+          />
         </div>
       </template>
       <template #fileList>
@@ -39,7 +53,8 @@
             multiple
             :data="uploadData"
             :before-upload="uploadFile"
-            :on-preview="onPreviewFile">
+            :on-preview="onPreviewFile"
+          >
             <el-button>选择</el-button>
           </el-upload>
         </div>
@@ -47,26 +62,59 @@
       <template #payDetailList>
         <div style="width: 100%">
           <el-button type="primary" @click="clickAdd()">添加行</el-button>
-          <el-table :data="formData.data.payDetailList" style="width: 100%; margin-top: 16px">
+          <el-table
+            :data="formData.data.payDetailList"
+            style="width: 100%; margin-top: 16px"
+          >
             <el-table-column label="采购合同" width="220">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
-                  <el-form-item :prop="'payDetailList.' + $index + '.purchaseId'" :rules="rules.purchaseId" :inline-message="true">
-                    <el-select v-model="row.purchaseId" placeholder="请选择采购合同" style="width: 100%" @change="changePurchaseId(row, true)">
-                      <el-option v-for="item in contractList" :key="item.value" :label="item.label" :value="item.value" />
+                  <el-form-item
+                    :prop="'payDetailList.' + $index + '.purchaseId'"
+                    :rules="rules.purchaseId"
+                    :inline-message="true"
+                  >
+                    <el-select
+                      v-model="row.purchaseId"
+                      placeholder="请选择采购合同"
+                      style="width: 100%"
+                      @change="changePurchaseId(row, true)"
+                    >
+                      <el-option
+                        v-for="item in contractList"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                      />
                     </el-select>
                   </el-form-item>
                 </div>
               </template>
             </el-table-column>
             <el-table-column prop="amount" label="合同金额" width="140" />
-            <el-table-column prop="sumPayMoney" label="已付款金额" width="140" />
-            <el-table-column prop="sumInvoiceMoney" label="已收发票金额" width="140" />
+            <el-table-column
+              prop="sumPayMoney"
+              label="已付款金额"
+              width="140"
+            />
+            <el-table-column
+              prop="sumInvoiceMoney"
+              label="已收发票金额"
+              width="140"
+            />
             <el-table-column label="款项说明">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
-                  <el-form-item :prop="'payDetailList.' + $index + '.remark'" :rules="rules.remark" :inline-message="true">
-                    <el-input v-model="row.remark" placeholder="请输入款项说明" style="width: 100%" />
+                  <el-form-item
+                    :prop="'payDetailList.' + $index + '.remark'"
+                    :rules="rules.remark"
+                    :inline-message="true"
+                  >
+                    <el-input
+                      v-model="row.remark"
+                      placeholder="请输入款项说明"
+                      style="width: 100%"
+                    />
                   </el-form-item>
                 </div>
               </template>
@@ -74,7 +122,11 @@
             <el-table-column label="付款金额" width="180">
               <template #default="{ row, $index }">
                 <div style="width: 100%">
-                  <el-form-item :prop="'payDetailList.' + $index + '.money'" :rules="rules.money" :inline-message="true">
+                  <el-form-item
+                    :prop="'payDetailList.' + $index + '.money'"
+                    :rules="rules.money"
+                    :inline-message="true"
+                  >
                     <el-input-number
                       onmousewheel="return false;"
                       v-model="row.money"
@@ -84,14 +136,17 @@
                       :controls="false"
                       :min="0"
                       :disabled="row.id"
-                      @change="changeMoney()" />
+                      @change="changeMoney()"
+                    />
                   </el-form-item>
                 </div>
               </template>
             </el-table-column>
             <el-table-column label="操作" width="80">
               <template #default="{ row, $index }">
-                <el-button type="primary" link @click="handleRemove($index)">删除</el-button>
+                <el-button type="primary" link @click="handleRemove($index)"
+                  >删除</el-button
+                >
               </template>
             </el-table-column>
           </el-table>
@@ -140,7 +195,9 @@ const judgeStatus = () => {
     return true;
   }
   if (props.queryData.recordList && props.queryData.recordList.length > 0) {
-    let data = props.queryData.recordList.filter((item) => item.status === 2 && item.nodeType !== 1);
+    let data = props.queryData.recordList.filter(
+      (item) => item.status === 2 && item.nodeType !== 1
+    );
     if (data && data.length > 0) {
       return true;
     }
@@ -164,13 +221,22 @@ const formConfig = computed(() => {
     },
     {
       type: "select",
+      label: "归属公司",
+      prop: "corporationId",
+      data: companyData.value,
+      itemWidth: 33,
+      style: "width: 100%",
+    },
+    {
+      type: "select",
       label: "供应商",
       prop: "supplyId",
       data: supplierList.value,
       fn: (val) => {
         changeSupply(val);
       },
-      style: "width: 100%",
+      itemWidth: 35,
+      style: "width: 94%",
     },
     {
       type: "slot",
@@ -235,7 +301,8 @@ const formConfig = computed(() => {
       slotName: "rate",
       label: "税率 (%)",
       itemWidth: 34,
-      isShow: formData.data.invoiceType == "1" || formData.data.invoiceType == "2",
+      isShow:
+        formData.data.invoiceType == "1" || formData.data.invoiceType == "2",
     },
     {
       type: "slot",
@@ -314,20 +381,40 @@ const formConfig = computed(() => {
 });
 const rules = ref({
   supplyId: [{ required: true, message: "请选择供应商", trigger: "change" }],
-  invoiceType: [{ required: true, message: "请选择发票类型", trigger: "change" }],
+  invoiceType: [
+    { required: true, message: "请选择发票类型", trigger: "change" },
+  ],
   payType: [{ required: true, message: "请选择付款方式", trigger: "change" }],
   // accountManagementId: [{ required: true, message: "请选择付款账户", trigger: "change" }],
-  purchaseId: [{ required: true, message: "请选择采购合同", trigger: "change" }],
+  purchaseId: [
+    { required: true, message: "请选择采购合同", trigger: "change" },
+  ],
   money: [{ required: true, message: "请输入付款金额", trigger: "blur" }],
   name: [{ required: true, message: "请输入户名", trigger: "blur" }],
-  advanceCode: [{ required: true, message: "请选择预付款单号", trigger: "change" }],
+  advanceCode: [
+    { required: true, message: "请选择预付款单号", trigger: "change" },
+  ],
   type: [{ required: true, message: "请选择付款类型", trigger: "change" }],
   rate: [{ required: true, message: "请输入税率", trigger: "blur" }],
+  corporationId: [
+    { required: true, message: "请选择归属公司", trigger: "change" },
+  ],
 });
 const fileList = ref([]);
 const uploadData = ref({});
+const companyData = ref([]);
 const getDict = () => {
   proxy
+    .post("/corporation/page", { pageNum: 1, pageSize: 9999 })
+    .then((res) => {
+      companyData.value = res.rows.map((x) => ({
+        ...x,
+        label: x.name,
+        value: x.id,
+      }));
+    });
+
+  proxy
     .post("/dictTenantData/page", {
       pageNum: 1,
       pageSize: 999,
@@ -378,28 +465,32 @@ const getDict = () => {
         });
       }
     });
-  proxy.post("/supplierInfo/page", { pageNum: 1, pageSize: 999 }).then((res) => {
-    if (res.rows && res.rows.length > 0) {
-      supplierList.value = res.rows.map((item) => {
+  proxy
+    .post("/supplierInfo/page", { pageNum: 1, pageSize: 999 })
+    .then((res) => {
+      if (res.rows && res.rows.length > 0) {
+        supplierList.value = res.rows.map((item) => {
+          return {
+            label: item.name,
+            value: item.id,
+          };
+        });
+      }
+    });
+  proxy
+    .post("/accountManagement/page", { pageNum: 1, pageSize: 999 })
+    .then((res) => {
+      accountList.value = res.rows.map((item) => {
         return {
-          label: item.name,
+          bankName: item.name,
+          accountOpening: item.accountOpening,
+          openingBank: item.openingBank,
+          interbankNumber: item.interbankNumber,
+          label: item.alias,
           value: item.id,
         };
       });
-    }
-  });
-  proxy.post("/accountManagement/page", { pageNum: 1, pageSize: 999 }).then((res) => {
-    accountList.value = res.rows.map((item) => {
-      return {
-        bankName: item.name,
-        accountOpening: item.accountOpening,
-        openingBank: item.openingBank,
-        interbankNumber: item.interbankNumber,
-        label: item.alias,
-        value: item.id,
-      };
     });
-  });
 };
 getDict();
 const uploadFile = async (file) => {
@@ -415,21 +506,23 @@ const onPreviewFile = (file) => {
 };
 const changeSupply = async (val) => {
   if (val) {
-    await proxy.get("/purchase/getListBySupplyId", { supplyId: val }).then((res) => {
-      if (res.data && res.data.length > 0) {
-        contractList.value = res.data.map((item) => {
-          return {
-            value: item.id,
-            label: item.code,
-            amount: item.amount,
-            sumPayMoney: item.sumPayMoney,
-            sumInvoiceMoney: item.sumInvoiceMoney,
-          };
-        });
-      } else {
-        contractList.value = [];
-      }
-    });
+    await proxy
+      .get("/purchase/getListBySupplyId", { supplyId: val })
+      .then((res) => {
+        if (res.data && res.data.length > 0) {
+          contractList.value = res.data.map((item) => {
+            return {
+              value: item.id,
+              label: item.code,
+              amount: item.amount,
+              sumPayMoney: item.sumPayMoney,
+              sumInvoiceMoney: item.sumInvoiceMoney,
+            };
+          });
+        } else {
+          contractList.value = [];
+        }
+      });
   } else {
     contractList.value = [];
   }
@@ -444,7 +537,9 @@ const clickAdd = () => {
       remark: "",
     });
   } else {
-    formData.data.payDetailList = [{ purchaseId: "", money: undefined, remark: "" }];
+    formData.data.payDetailList = [
+      { purchaseId: "", money: undefined, remark: "" },
+    ];
   }
 };
 const handleRemove = (index) => {
@@ -481,7 +576,9 @@ const changeMoney = () => {
   let money = 0;
   for (let i = 0; i < formData.data.payDetailList.length; i++) {
     if (formData.data.payDetailList[i].money) {
-      money = parseFloat(Number(money) + Number(formData.data.payDetailList[i].money)).toFixed(2);
+      money = parseFloat(
+        Number(money) + Number(formData.data.payDetailList[i].money)
+      ).toFixed(2);
     }
   }
   formData.data.amount = money;
@@ -515,7 +612,10 @@ watch(
   props.queryData,
   () => {
     formOption.disabled = judgeStatus();
-    if (props.queryData && ["10", "20", "30"].includes(route.query.processType)) {
+    if (
+      props.queryData &&
+      ["10", "20", "30"].includes(route.query.processType)
+    ) {
       for (var text in props.queryData) {
         formData.data[text] = props.queryData[text];
       }
@@ -530,7 +630,11 @@ watch(
       } else {
         fileList.value = [];
       }
-      if (route.query.processType !== "30" && formData.data.payDetailList && formData.data.payDetailList.length) {
+      if (
+        route.query.processType !== "30" &&
+        formData.data.payDetailList &&
+        formData.data.payDetailList.length
+      ) {
         let ids = formData.data.payDetailList.map((item) => item.purchaseId);
         if (ids && ids.length > 0) {
           proxy.post("/purchase/getListInId", ids).then((res) => {
@@ -563,21 +667,31 @@ onMounted(async () => {
       if (ids && ids.length > 0) {
         for (let i = 0; i < ids.length; i++) {
           if (contractList.value && contractList.value.length > 0) {
-            let data = contractList.value.filter((item) => item.value === ids[i]);
+            let data = contractList.value.filter(
+              (item) => item.value === ids[i]
+            );
             if (data && data.length > 0) {
-              if (formData.data.payDetailList && formData.data.payDetailList.length > 0) {
+              if (
+                formData.data.payDetailList &&
+                formData.data.payDetailList.length > 0
+              ) {
                 formData.data.payDetailList.push({
                   purchaseId: ids[i],
                   money: undefined,
                   remark: "",
                 });
               } else {
-                formData.data.payDetailList = [{ purchaseId: ids[i], money: undefined, remark: "" }];
+                formData.data.payDetailList = [
+                  { purchaseId: ids[i], money: undefined, remark: "" },
+                ];
               }
             }
           }
         }
-        if (formData.data.payDetailList && formData.data.payDetailList.length > 0) {
+        if (
+          formData.data.payDetailList &&
+          formData.data.payDetailList.length > 0
+        ) {
           for (let i = 0; i < formData.data.payDetailList.length; i++) {
             changePurchaseId(formData.data.payDetailList[i]);
           }
@@ -587,6 +701,23 @@ onMounted(async () => {
     }
   }
 });
+// 判断当前用户有无销售合同页面权限
+const isHave = ref(false);
+if (
+  useUserStore().permissions &&
+  useUserStore().permissions.includes("contract")
+) {
+  isHave.value = true;
+}
+// 判断当前用户有无采购合同页面权限
+const isHavePurchase = ref(false);
+if (
+  useUserStore().permissions &&
+  useUserStore().permissions.includes("alreadyPurchase")
+) {
+  isHavePurchase.value = true;
+}
+
 const getFormData = () => {
   return proxy.deepClone(formData.data);
 };
@@ -615,7 +746,9 @@ const getDecisionAids = () => {
     purchaseIdList: [],
   };
   if (formData.data.payDetailList && formData.data.payDetailList.length > 0) {
-    data.purchaseIdList = formData.data.payDetailList.map((item) => item.purchaseId);
+    data.purchaseIdList = formData.data.payDetailList.map(
+      (item) => item.purchaseId
+    );
   }
   proxy.post("/contract/payDecisionAid", data).then((res) => {
     if (res.contractList && res.contractList.length > 0) {
@@ -626,7 +759,9 @@ const getDecisionAids = () => {
             value: item.code,
             style: {
               color: "#0084FF",
+              cursor: isHave.value ? "pointer" : "revert",
             },
+            fn: isHave.value ? handlePushRoute : () => {},
             id: item.id,
             num: 1,
           },
@@ -645,6 +780,17 @@ const getDecisionAids = () => {
       auxiliaryData.value[1].data = res.purchaseInfoList.map((item) => {
         return [
           {
+            label: "合同编号",
+            value: item.purchaseCode,
+            style: {
+              color: "#0084FF",
+              cursor: isHavePurchase.value ? "pointer" : "revert",
+            },
+            fn: isHavePurchase.value ? handlePushRouteOne : () => {},
+            id: item.purchaseId,
+            num: 1,
+          },
+          {
             label: "物品编码",
             value: item.productCode,
             id: item.productId,
@@ -673,10 +819,23 @@ const getDecisionAids = () => {
       auxiliaryData.value[2].data = res.purchaseInfoList.map((item) => {
         let odds = 0;
         if (item.invoiceQuantity && item.qualifiedCount) {
-          odds = parseFloat((Number(item.qualifiedCount) / Number(item.invoiceQuantity)) * 100).toFixed(2);
+          odds = parseFloat(
+            (Number(item.qualifiedCount) / Number(item.invoiceQuantity)) * 100
+          ).toFixed(2);
         }
         return [
           {
+            label: "合同编号",
+            value: item.purchaseCode,
+            style: {
+              color: "#0084FF",
+              cursor: isHavePurchase.value ? "pointer" : "revert",
+            },
+            fn: isHavePurchase.value ? handlePushRouteOne : () => {},
+            id: item.purchaseId,
+            num: 1,
+          },
+          {
             label: "物品编码",
             value: item.productCode,
             id: item.productId,
@@ -713,6 +872,22 @@ const getDecisionAids = () => {
     emit("auxiliaryChange", list);
   });
 };
+const handlePushRoute = (row) => {
+  proxy.$router.push({
+    name: "Contract",
+    query: {
+      code: row.value,
+    },
+  });
+};
+const handlePushRouteOne = (row) => {
+  proxy.$router.push({
+    name: "AlreadyPurchase",
+    query: {
+      code: row.value,
+    },
+  });
+};
 </script>
 
 <style lang="scss" scoped>

+ 6 - 1
src/components/product/treeList.vue

@@ -31,7 +31,7 @@
         <template #default="{ node, data }">
           <div class="custom-tree-node">
             <div style="flex: 1">{{ node.label}}</div>
-            <div style="float: right; width: 71px; margin-left: 10px" v-if="activeNode == data.id">
+            <div class="icon-warp" style="float: right; width: 71px; margin-left: 10px" v-show="activeNode == data.id">
               <el-icon :size="17" @click.stop="() => edit(node, data)">
                 <Edit />
               </el-icon>
@@ -261,6 +261,11 @@ const handleMouseOver = (data) => {
   font-size: 14px;
   padding-right: 8px;
 }
+.custom-tree-node:hover{
+  .icon-warp{
+    display:block!important;
+  }
+}
 .treeList {
   display: block;
   height: 100%;

+ 8 - 0
src/views/customer/file/index.vue

@@ -1036,6 +1036,14 @@ const formConfig = computed(() => {
       itemType: "text",
     },
     {
+      type: "input",
+      prop: "dutyParagraph",
+      label: "客户税号",
+      required: true,
+      itemWidth: 100,
+      itemType: "text",
+    },
+    {
       type: "select",
       label: "客户来源",
       prop: "source",

+ 8 - 0
src/views/customer/highseas/index.vue

@@ -941,6 +941,14 @@ const formConfig = computed(() => {
       itemType: "text",
     },
     {
+      type: "input",
+      prop: "dutyParagraph",
+      label: "客户税号",
+      required: true,
+      itemWidth: 100,
+      itemType: "text",
+    },
+    {
       type: "select",
       label: "客户来源",
       prop: "source",

+ 8 - 0
src/views/customer/privatesea/index.vue

@@ -942,6 +942,14 @@ const formConfig = computed(() => {
       itemType: "text",
     },
     {
+      type: "input",
+      prop: "dutyParagraph",
+      label: "客户税号",
+      required: true,
+      itemWidth: 100,
+      itemType: "text",
+    },
+    {
       type: "select",
       label: "客户来源",
       prop: "source",

+ 0 - 1
src/views/dataBoard/board/customerAnalysis/index.vue

@@ -166,7 +166,6 @@
 
 <script setup>
 import * as echarts from "echarts";
-
 import TitleInfo from "@/components/TitleInfo/index.vue";
 const titleList = ["客户来源统计", "类型统计", "趋势分析"];
 const { proxy } = getCurrentInstance();

+ 634 - 0
src/views/dataBoard/board/employeeAnalysis/index.vue

@@ -0,0 +1,634 @@
+<template>
+  <div class="tenant">
+    <div class="query bck">
+      <el-form :inline="true" :model="queryForm">
+        <el-form-item label="查看用户">
+          <el-select
+            v-model="selectUser"
+            multiple
+            placeholder="请选择用户"
+            @change="changeUser"
+          >
+            <el-option
+              v-for="item in userList"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+              :disabled="item.value !== 'all' && selectUser.includes('all')"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="日期">
+          <el-date-picker
+            v-model="queryForm.timeArr"
+            type="daterange"
+            unlink-panels
+            range-separator="-"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            value-format="YYYY-MM-DD"
+            @change="onQuery"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button @click="clickBtn(1)" :class="{ btnBck: selectBtn === 1 }"
+            >近30天</el-button
+          >
+          <el-button @click="clickBtn(2)" :class="{ btnBck: selectBtn === 2 }"
+            >本月</el-button
+          >
+          <el-button @click="clickBtn(3)" :class="{ btnBck: selectBtn === 3 }"
+            >上月</el-button
+          >
+          <el-button @click="clickBtn(4)" :class="{ btnBck: selectBtn === 4 }"
+            >近一年</el-button
+          >
+          <el-button @click="clickBtn(5)" :class="{ btnBck: selectBtn === 5 }"
+            >去年</el-button
+          >
+          <el-button @click="clickBtn(6)" :class="{ btnBck: selectBtn === 6 }"
+            >今年</el-button
+          >
+        </el-form-item>
+      </el-form>
+    </div>
+    <div v-loading="loading">
+      <div style="display: flex; margin-top: 15px">
+        <div class="bck">
+          <TitleInfo :content="titleList[0]"></TitleInfo>
+          <div class="one-row" style="margin-top: 15px">
+            <div class="one-row-item first" style="margin-right: 15px">
+              <div class="label">存量客户(人)</div>
+              <div class="value">
+                {{ allData.customerSituation.customerCount }}
+              </div>
+            </div>
+            <div class="one-row-item other" style="margin-right: 15px">
+              <div class="label">新增客户(人)</div>
+              <div class="value">
+                {{ allData.customerSituation.customerAddCount }}
+              </div>
+            </div>
+            <div class="one-row-item other" style="margin-right: 15px">
+              <div class="label">报价客户(人)</div>
+              <div class="value">
+                {{ allData.customerSituation.saleQuotationCustomerCount }}
+              </div>
+            </div>
+            <div class="one-row-item other">
+              <div class="label">成交客户(人)</div>
+              <div class="value">
+                {{ allData.customerSituation.contractCustomerCount }}
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="bck" style="margin-left: 20px">
+          <TitleInfo :content="titleList[1]"></TitleInfo>
+          <div class="one-row" style="margin-top: 15px">
+            <div class="one-row-item first" style="margin-right: 15px">
+              <div class="label">存量产品</div>
+              <div class="value">
+                {{ allData.productSituation.productCount }}
+              </div>
+            </div>
+            <div class="one-row-item other">
+              <div class="label">新增产品</div>
+              <div class="value">
+                {{ allData.productSituation.productAddCount }}
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="bck" style="margin-left: 20px">
+          <TitleInfo :content="titleList[2]"></TitleInfo>
+          <div class="one-row" style="margin-top: 15px">
+            <div class="one-row-item first" style="margin-right: 15px">
+              <div class="label">发件</div>
+              <div class="value">{{ allData.commMail.sentMailCount }}</div>
+            </div>
+            <div class="one-row-item other">
+              <div class="label">收件</div>
+              <div class="value">{{ allData.commMail.receiveMailCount }}</div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div style="margin-top: 15px">
+        <div class="bck">
+          <TitleInfo :content="titleList[3]"></TitleInfo>
+          <div class="two-row" style="margin-top: 15px">
+            <div class="two-row-item first" style="margin-right: 15px">
+              <div class="label">报价</div>
+              <div class="value">
+                <div style="margin-right: 15px">
+                  <div class="child-value">
+                    {{ allData.saleSituation.quotationAddStatistics.count }}
+                  </div>
+                  <div class="text">订单数</div>
+                </div>
+                <div>
+                  <div class="child-value color-blue">
+                    CNY
+                    {{
+                      moneyFormat(
+                        allData.saleSituation.quotationAddStatistics.sumAmount,
+                        2
+                      )
+                    }}
+                  </div>
+                  <div class="text">金额</div>
+                </div>
+              </div>
+            </div>
+            <div class="two-row-item other" style="margin-right: 15px">
+              <div class="label">成交</div>
+              <div class="value">
+                <div style="margin-right: 15px">
+                  <div class="child-value">
+                    {{ allData.saleSituation.contractAddStatistics.count }}
+                  </div>
+                  <div class="text">订单数</div>
+                </div>
+                <div>
+                  <div class="child-value color-blue">
+                    CNY
+                    {{
+                      moneyFormat(
+                        allData.saleSituation.contractAddStatistics.sumAmount,
+                        2
+                      )
+                    }}
+                  </div>
+                  <div class="text">金额</div>
+                </div>
+              </div>
+            </div>
+            <div class="two-row-item other" style="margin-right: 15px">
+              <div class="label">到账</div>
+              <div class="value">
+                <div style="margin-right: 15px">
+                  <div class="child-value">
+                    {{ allData.saleSituation.claimAddStatistics.count }}
+                  </div>
+                  <div class="text">笔</div>
+                </div>
+                <div>
+                  <div class="child-value color-blue">
+                    CNY
+                    {{
+                      moneyFormat(
+                        allData.saleSituation.claimAddStatistics.sumAmount,
+                        2
+                      )
+                    }}
+                  </div>
+                  <div class="text">金额</div>
+                </div>
+              </div>
+            </div>
+            <div class="two-row-item other">
+              <div class="label">创建单证</div>
+              <div class="value">
+                <div style="margin-right: 15px">
+                  <div class="child-value">
+                    {{ allData.saleSituation.documentsCount }}
+                  </div>
+                  <div class="text">套</div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div style="margin-top: 15px">
+        <div class="bck">
+          <TitleInfo :content="titleList[4]"></TitleInfo>
+          <div class="two-row" style="margin-top: 15px">
+            <div class="two-row-item first" style="margin-right: 15px">
+              <div class="label">报价</div>
+              <div class="value">
+                <div style="margin-right: 15px">
+                  <div class="child-value">
+                    {{ allData.saleAddSituation.quotationAddStatistics.count }}
+                  </div>
+                  <div class="text">订单数</div>
+                </div>
+                <div>
+                  <div class="child-value color-blue">
+                    CNY
+                    {{
+                      moneyFormat(
+                        allData.saleAddSituation.quotationAddStatistics
+                          .sumAmount,
+                        2
+                      )
+                    }}
+                  </div>
+                  <div class="text">金额</div>
+                </div>
+              </div>
+            </div>
+            <div class="two-row-item other" style="margin-right: 15px">
+              <div class="label">成交</div>
+              <div class="value">
+                <div style="margin-right: 15px">
+                  <div class="child-value">
+                    {{ allData.saleAddSituation.contractAddStatistics.count }}
+                  </div>
+                  <div class="text">订单数</div>
+                </div>
+                <div>
+                  <div class="child-value color-blue">
+                    CNY
+                    {{
+                      moneyFormat(
+                        allData.saleAddSituation.contractAddStatistics
+                          .sumAmount,
+                        2
+                      )
+                    }}
+                  </div>
+                  <div class="text">金额</div>
+                </div>
+              </div>
+            </div>
+            <div class="two-row-item other" style="margin-right: 15px">
+              <div class="label">到账</div>
+              <div class="value">
+                <div style="margin-right: 15px">
+                  <div class="child-value">
+                    {{ allData.saleAddSituation.claimAddStatistics.count }}
+                  </div>
+                  <div class="text">笔</div>
+                </div>
+                <div>
+                  <div class="child-value color-blue">
+                    CNY
+                    {{
+                      moneyFormat(
+                        allData.saleAddSituation.claimAddStatistics.sumAmount,
+                        2
+                      )
+                    }}
+                  </div>
+                  <div class="text">金额</div>
+                </div>
+              </div>
+            </div>
+            <div class="two-row-item other">
+              <div class="label">创建单证</div>
+              <div class="value">
+                <div style="margin-right: 15px">
+                  <div class="child-value">
+                    {{ allData.saleAddSituation.documentsCount }}
+                  </div>
+                  <div class="text">套</div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <div style="display: flex; margin-top: 15px">
+        <div class="bck">
+          <TitleInfo :content="titleList[5]"></TitleInfo>
+          <div class="two-row" style="margin-top: 15px">
+            <div class="two-row-item first" style="margin-right: 15px">
+              <div class="label">待采购</div>
+              <div class="value">
+                <div style="margin-right: 15px">
+                  <div class="child-value">
+                    {{
+                      allData.purchaseStatistics.waitPurchaseStatistics
+                        .contractProductCount
+                    }}
+                  </div>
+                  <div class="text">交接单</div>
+                </div>
+                <div>
+                  <div class="child-value color-blue">
+                    {{
+                      allData.purchaseStatistics.waitPurchaseStatistics
+                        .subscribeDetailCount
+                    }}
+                  </div>
+                  <div class="text">申购</div>
+                </div>
+              </div>
+            </div>
+            <div class="two-row-item other" style="margin-right: 15px">
+              <div class="label">采购订单</div>
+              <div class="value">
+                <div style="margin-right: 15px">
+                  <div class="child-value">
+                    {{ allData.purchaseStatistics.purchaseOrder.purchaseCount }}
+                  </div>
+                  <div class="text">订单数</div>
+                </div>
+                <div style="margin-right: 15px">
+                  <div class="child-value color-blue">
+                    CNY
+                    {{
+                      moneyFormat(
+                        allData.purchaseStatistics.purchaseOrder.purchaseAmount,
+                        2
+                      )
+                    }}
+                  </div>
+                  <div class="text">金额</div>
+                </div>
+                <div>
+                  <div class="child-value color-blue">
+                    CNY
+                    {{
+                      moneyFormat(
+                        allData.purchaseStatistics.purchaseOrder
+                          .purchasePayAmount,
+                        2
+                      )
+                    }}
+                  </div>
+                  <div class="text">已付款</div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <!-- <div class="bck" style="margin-left: 20px">
+          <TitleInfo :content="titleList[6]"></TitleInfo>
+          <div class="one-row" style="margin-top: 15px">
+            <div class="one-row-item first" style="margin-right: 15px">
+              <div class="label">发起</div>
+              <div class="value">
+                {{ allData.flowStatistics.flowExampleCount }}
+              </div>
+            </div>
+            <div class="one-row-item other">
+              <div class="label">待处理</div>
+              <div class="value">
+                {{ allData.flowStatistics.waitFlowExampleCount }}
+              </div>
+            </div>
+          </div>
+        </div> -->
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import TitleInfo from "@/components/TitleInfo/index.vue";
+import useUserStore from "@/store/modules/user";
+import moment from "moment";
+
+const titleList = [
+  "客户情况",
+  "产品情况",
+  "往来邮件",
+  "销售行为(存量客户)",
+  "销售行为(新增客户)",
+  "采购行为",
+  "流程统计",
+];
+const userList = ref([]);
+const selectUser = ref(["all"]);
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const queryForm = reactive({
+  userIds: [],
+  beginTime: "",
+  endTime: "",
+  timeArr: "",
+});
+const allData = ref({
+  customerSituation: {},
+  productSituation: {},
+  commMail: {},
+  flowStatistics: {},
+  saleSituation: {
+    quotationAddStatistics: {},
+    contractAddStatistics: {},
+    claimAddStatistics: {},
+  },
+  saleAddSituation: {
+    quotationAddStatistics: {},
+    contractAddStatistics: {},
+    claimAddStatistics: {},
+  },
+  purchaseStatistics: {
+    waitPurchaseStatistics: {},
+    purchaseOrder: {},
+  },
+});
+const getData = () => {
+  loading.value = true;
+  proxy.post("/employeeAnalysis/info", queryForm).then((res) => {
+    allData.value = res;
+    loading.value = false;
+  });
+};
+const getDict = () => {
+  proxy
+    .get("/tenantUser/list", {
+      pageNum: 1,
+      pageSize: 10000,
+      tenantId: useUserStore().user.tenantId,
+    })
+    .then((res) => {
+      userList.value = res.rows.map((item) => {
+        return {
+          label: item.nickName,
+          value: item.userId,
+        };
+      });
+      userList.value.unshift({
+        label: "全部",
+        value: "all",
+      });
+    });
+};
+
+const onQuery = () => {
+  if (queryForm.timeArr.length > 1) {
+    queryForm.beginTime = queryForm.timeArr[0];
+    queryForm.endTime = queryForm.timeArr[1];
+  } else {
+    queryForm.beginTime = "";
+    queryForm.endTime = "";
+  }
+  getData();
+};
+
+const changeUser = (val) => {
+  selectUser.value = val.includes("all") ? ["all"] : val;
+  queryForm.userIds = val.includes("all") ? [] : val;
+  onQuery();
+};
+
+const selectBtn = ref(1);
+const clickBtn = (val) => {
+  selectBtn.value = val;
+  let today = new Date();
+  let startDate = null;
+  let endDate = null;
+  let year = null;
+  let month = null;
+  switch (val) {
+    case 1:
+      startDate = new Date(today);
+      startDate.setDate(today.getDate() - 29);
+      endDate = new Date(today);
+      break;
+    case 2:
+      year = today.getFullYear();
+      month = today.getMonth();
+      startDate = new Date(year, month, 1);
+      endDate = new Date(year, month + 1, 0);
+      break;
+    case 3:
+      year = today.getFullYear();
+      month = today.getMonth() - 1;
+      startDate = new Date(year, month, 1);
+      endDate = new Date(year, month + 1, 0);
+      break;
+    case 4:
+      year = today.getFullYear();
+      startDate = new Date(year - 1, today.getMonth(), today.getDate());
+      endDate = new Date(year, today.getMonth(), today.getDate());
+      break;
+    case 5:
+      year = today.getFullYear();
+      startDate = new Date(year - 1, 0, 1);
+      endDate = new Date(year, 11, 31);
+      break;
+    case 6:
+      year = today.getFullYear();
+      startDate = new Date(year, 0, 1);
+      endDate = new Date(year, 11, 31);
+      break;
+    default:
+      startDate = new Date(today);
+      startDate.setDate(today.getDate() - 29);
+      endDate = new Date(today);
+      break;
+  }
+  queryForm.timeArr = [
+    moment(startDate).format("yyyy-MM-DD"),
+    moment(endDate).format("yyyy-MM-DD"),
+  ];
+  onQuery();
+};
+
+getDict();
+clickBtn(1);
+</script>
+
+<style lang="scss" scoped>
+.tenant {
+  padding: 20px;
+}
+.bck {
+  background-color: #fff;
+  padding: 15px;
+}
+.one-row {
+  display: flex;
+  .one-row-item {
+    min-width: 160px;
+    padding: 15px;
+    border-radius: 10px;
+    .label {
+      margin-bottom: 10px;
+      font-size: 14px;
+      color: #333333;
+    }
+    .value {
+      font-size: 24px;
+      font-weight: 700;
+    }
+  }
+
+  .first {
+    background: #fff1e1;
+    .value {
+      color: #333333;
+    }
+    .label::before {
+      content: "";
+      display: inline-block;
+      width: 10px;
+      height: 10px;
+      background: #ff9315;
+      border-radius: 50%;
+      margin-right: 10px;
+    }
+  }
+
+  .other {
+    background: #eff6ff;
+    .value {
+      color: #333333;
+    }
+    .label::before {
+      content: "";
+      display: inline-block;
+      width: 10px;
+      height: 10px;
+      background: #0084ff;
+      border-radius: 50%;
+      margin-right: 10px;
+    }
+  }
+}
+.two-row {
+  display: flex;
+  .two-row-item {
+    min-width: 320px;
+    padding: 15px;
+    border-radius: 10px;
+    .label {
+      margin-bottom: 10px;
+      font-size: 14px;
+      font-weight: 700;
+      color: #333333;
+    }
+    .value {
+      display: flex;
+      font-size: 14px;
+      justify-content: space-between;
+      padding-right: 30px;
+      .child-value {
+        font-size: 16px;
+        font-weight: 700;
+      }
+      .text {
+        // color: #333333;
+        font-size: 14px;
+        margin-top: 10px;
+      }
+    }
+  }
+  .first {
+    background: #fff1e1;
+    // .child-value {
+    //   color: #333333;
+    // }
+  }
+  .other {
+    background: #eff6ff;
+    // .child-value {
+    //   color: #0084ff;
+    // }
+  }
+  .color-blue {
+    color: #0084ff;
+  }
+}
+.btnBck {
+  background: #0084ff;
+  color: #fff;
+}
+</style>

+ 8 - 8
src/views/index.vue

@@ -32,11 +32,11 @@
 					我的待审批
 				</div>
 				<el-table :data="toBeProcessedData.rows" style="width: 100%">
-					<el-table-column prop="flowName" label="流程类型" />
+					<el-table-column prop="flowName" label="流程类型" width="100" />
 					<el-table-column prop="title" label="流程标题" />
-					<el-table-column prop="createUserName" label="发起人" />
-					<el-table-column prop="createTime" label="发起时间" />
-					<el-table-column fixed="right" label="操作" width="120">
+					<el-table-column prop="createUserName" label="发起人"  width="100"/>
+					<el-table-column prop="createTime" label="发起时间" width="160" />
+					<el-table-column fixed="right" label="操作" width="60">
 						<template #default="scope">
 							<el-button
 								link
@@ -60,11 +60,11 @@
 					我的发起(未结束)
 				</div>
 				<el-table :data="haveInitiatedData.rows" style="width: 100%">
-					<el-table-column prop="flowName" label="流程类型" />
+					<el-table-column prop="flowName" label="流程类型"  width="100"/>
 					<el-table-column prop="title" label="流程标题" />
-					<el-table-column prop="createUserName" label="审批人" />
-					<el-table-column prop="createTime" label="发起时间" />
-					<el-table-column fixed="right" label="操作" width="120">
+					<el-table-column prop="createUserName" label="审批人" width="100" />
+					<el-table-column prop="createTime" label="发起时间"  width="160"/>
+					<el-table-column fixed="right" label="操作" width="60">
 						<template #default="scope">
 							<el-button
 								link

+ 1 - 1
src/views/process/processApproval/auxiliary.vue

@@ -9,7 +9,7 @@
 							<div 
 								class="value" 
 								:class="n.fn ? 'color-bl' : ''" 
-								@click="n.fn ? n.fn() : ''"
+								@click="n.fn ? n.fn(n) : ''"
 								:style="n.style || ''">
 								{{n.value}}
 							</div>

+ 1 - 0
src/views/process/processConfig/index.vue

@@ -211,6 +211,7 @@ let versionList = ref([])
 
 const getVersionList = (row) => {
 	formData.flowName = row.flowName
+	formData.version = row.id
 	versionVisible.value = true
 	proxy.post('/flowDefinition/getVersionList',{
 		flowKey:row.flowKey,

+ 4 - 0
src/views/purchaseManage/purchaseManage/alreadyPurchase/index.vue

@@ -338,6 +338,7 @@ import byTable from "@/components/byTable/index";
 import byForm from "@/components/byForm/index";
 import { NumberToChinese } from "@/utils/util.js";
 import PurchasePDF from "@/components/PDF/purchasePDF.vue";
+const route = useRoute();
 
 const loading = ref(false);
 const submitLoading = ref(false);
@@ -854,6 +855,9 @@ const handleArrival = (row) => {
 
 getDict();
 getHeaderData();
+if (route.query.code) {
+  sourceList.value.pagination.keyword = route.query.code;
+}
 getList();
 
 const start = () => {

+ 743 - 0
src/views/salesMange/salesMange/afterSales/index.vue

@@ -0,0 +1,743 @@
+<template>
+  <div class="tenant">
+    <!-- <Banner /> -->
+    <div class="content">
+      <byTable
+        :source="sourceList.data"
+        :pagination="sourceList.pagination"
+        :config="config"
+        :loading="loading"
+        highlight-current-row
+        :selectConfig="selectConfig"
+        :table-events="{
+          //element talbe事件都能传
+        }"
+        :action-list="[
+          {
+            text: '添加售后',
+            disabled: false,
+            action: () => clickAdd(),
+          },
+        ]"
+        @get-list="getList"
+      >
+        <template #code="{ item }">
+          <div
+            style="cursor: pointer; color: #409eff"
+            @click="handleClickCode(item)"
+          >
+            {{ item.code }}
+          </div>
+        </template>
+      </byTable>
+    </div>
+
+    <el-dialog title="添加售后" v-model="dialogVisible" width="50%">
+      <byForm
+        :formConfig="formConfig"
+        :formOption="formOption"
+        v-model="formData.data"
+        :rules="rules"
+        ref="formDom"
+        v-loading="submitLoading"
+      >
+        <template #details>
+          <div style="width: 100%">
+            <el-button type="primary" plain @click="openProduct = true">
+              添加商品
+            </el-button>
+            <el-table
+              :data="formData.data.subscribeDetailList"
+              style="margin-top: 10px"
+            >
+              <el-table-column prop="code" label="产品编码" />
+              <el-table-column prop="name" label="产品名称" min-width="150" />
+              <el-table-column prop="spec" label="规格型号" />
+              <el-table-column
+                prop="unit"
+                label="单位"
+                :formatter="(row) => dictValueLabel(row.unit, productUnit)"
+              />
+              <el-table-column prop="count" label="售后数量" min-width="150">
+                <template #default="{ row, $index }">
+                  <el-form-item
+                    :prop="'subscribeDetailList.' + $index + '.count'"
+                    :rules="rules.count"
+                    :inline-message="true"
+                  >
+                    <el-input-number
+                      onmousewheel="return false;"
+                      v-model="row.count"
+                      :precision="4"
+                      :controls="false"
+                      :min="1"
+                    />
+                  </el-form-item>
+                </template>
+              </el-table-column>
+              <el-table-column prop="remark" label="备注" min-width="150">
+                <template #default="{ row, $index }">
+                  <el-form-item
+                    :prop="'subscribeDetailList.' + $index + '.remark'"
+                    :rules="rules.remark"
+                    :inline-message="true"
+                  >
+                    <el-input v-model="row.remark" placeholder="请输入" />
+                  </el-form-item>
+                </template>
+              </el-table-column>
+              <el-table-column prop="zip" label="操作" width="100">
+                <template #default="{ $index }">
+                  <el-button type="primary" link @click="handleRemove($index)"
+                    >删除</el-button
+                  >
+                </template>
+              </el-table-column>
+            </el-table>
+          </div>
+        </template>
+      </byForm>
+      <template #footer>
+        <el-button @click="dialogVisible = false" size="large">取 消</el-button>
+        <el-button
+          type="primary"
+          @click="submitForm()"
+          size="large"
+          :loading="submitLoading"
+        >
+          确 定
+        </el-button>
+      </template>
+    </el-dialog>
+
+    <el-dialog
+      title="售后跟进"
+      v-model="openFollow"
+      width="500"
+      destroy-on-close
+    >
+      <byForm
+        :formConfig="formConfigAFollow"
+        :formOption="formOption"
+        v-model="formData.followData"
+        :rules="followRules"
+        ref="followDom"
+        v-loading="submitLoading"
+      >
+        <template #fileSlot>
+          <div style="width: 100%">
+            <el-upload
+              v-model:fileList="fileList"
+              action="https://winfaster.obs.cn-south-1.myhuaweicloud.com"
+              :data="uploadData"
+              multiple
+              :before-upload="uploadFile"
+              :on-preview="onPreviewFile"
+            >
+              <el-button type="primary">文件上传</el-button>
+            </el-upload>
+          </div>
+        </template>
+      </byForm>
+      <template #footer>
+        <el-button @click="openFollow = false" size="large">取 消</el-button>
+        <el-button
+          type="primary"
+          @click="submitFollow()"
+          size="large"
+          :loading="submitLoading"
+          >确 定</el-button
+        >
+      </template>
+    </el-dialog>
+
+    <el-dialog
+      title="跟进记录"
+      v-model="openRecord"
+      width="500"
+      destroy-on-close
+    >
+      <div>
+        <div style="padding-top: 16px">
+          <div>
+            <el-timeline>
+              <el-timeline-item
+                v-for="(record, index) in recordList"
+                :key="index"
+                :timestamp="record.date"
+                hide-timestamp
+              >
+                <div>
+                  <div
+                    style="
+                      padding: 0 0 8px 0;
+                      display: flex;
+                      justify-content: space-between;
+                    "
+                  >
+                    <span>{{
+                      dictValueLabel(record.createUser, userList)
+                    }}</span>
+                    <span>{{ record.date }}</span>
+                  </div>
+                  <div v-if="record.type == '30'">
+                    <div
+                      style="word-wrap: break-word; margin: 8px 0"
+                      v-html="getStyle(record.content)"
+                      v-if="record.content"
+                    ></div>
+                    <div v-else>跟进记录:</div>
+                  </div>
+                  <div v-else>
+                    <div style="word-wrap: break-word; margin: 8px 0">
+                      {{ getContent(record) }}
+                    </div>
+                  </div>
+                  <div
+                    style="margin: 8px 0; display: flex"
+                    v-if="record.fileList && record.fileList.length > 0"
+                  >
+                    <div style="width: 36px">附件:</div>
+                    <div style="width: calc(100% - 36px)">
+                      <div
+                        v-for="(file, index) in record.fileList"
+                        :key="index"
+                      >
+                        <a
+                          style="color: #409eff; cursor: pointer"
+                          @click="openFile(file.fileUrl)"
+                          >{{ file.fileName }}</a
+                        >
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </el-timeline-item>
+            </el-timeline>
+          </div>
+        </div>
+      </div>
+      <template #footer>
+        <el-button @click="openRecord = false" size="large">关 闭</el-button>
+      </template>
+    </el-dialog>
+
+    <el-dialog
+      v-if="openProduct"
+      v-model="openProduct"
+      title="选择商品"
+      width="70%"
+      append-to-body
+    >
+      <SelectGoods
+        :selectList="acquireSelectList()"
+        @cancel="openProduct = false"
+        @pushGoods="pushGoods"
+      ></SelectGoods>
+    </el-dialog>
+  </div>
+</template>
+  
+<script setup>
+import { ElMessage, ElMessageBox } from "element-plus";
+import byTable from "@/components/byTable/index";
+import byForm from "@/components/byForm/index";
+import SelectGoods from "@/components/product/SelectGoods";
+import { computed } from "vue";
+const { proxy } = getCurrentInstance();
+const fileList = ref([]);
+const uploadData = ref({});
+const loading = ref(false);
+const submitLoading = ref(false);
+const sourceList = ref({
+  data: [],
+  pagination: {
+    total: 3,
+    pageNum: 1,
+    pageSize: 10,
+  },
+});
+const dialogVisible = ref(false);
+const openProduct = ref(false);
+const openFollow = ref(false);
+const openRecord = ref(false);
+const modalType = ref("add");
+const rules = ref({
+  name: [{ required: true, message: "请输入供应商名称", trigger: "blur" }],
+  qualifiedCount: [
+    { required: true, message: "请输入质检合格数量", trigger: "blur" },
+  ],
+  noQualifiedCount: [
+    { required: true, message: "请输入质检不合格数量", trigger: "blur" },
+  ],
+});
+const customerData = ref([]);
+const productUnit = ref([]);
+const productType = ref([]);
+const recordList = ref([]);
+const selectConfig = computed(() => [
+  {
+    label: "客户名称",
+    prop: "status",
+    data: customerData.value,
+  },
+  {
+    label: "售后类型",
+    prop: "status",
+    data: customerData.value,
+  },
+  {
+    label: "售后状态",
+    prop: "status",
+    data: customerData.value,
+  },
+]);
+const config = computed(() => {
+  return [
+    {
+      attrs: {
+        label: "客户名称",
+        prop: "code",
+        slot: "code",
+      },
+    },
+    {
+      attrs: {
+        label: "销售合同编号",
+        prop: "supplyName",
+        slot: "code",
+
+        width: 150,
+      },
+    },
+    {
+      attrs: {
+        label: "售后类型",
+        prop: "productDefinition",
+        width: 100,
+      },
+      render(type) {
+        return type == 1 ? "产品" : "物料";
+      },
+    },
+
+    {
+      attrs: {
+        label: "产品编码",
+        prop: "productCode",
+        width: 150,
+      },
+    },
+    {
+      attrs: {
+        label: "产品名称",
+        prop: "productName",
+      },
+    },
+    {
+      attrs: {
+        label: "规格型号",
+        prop: "productSpec",
+      },
+    },
+    {
+      attrs: {
+        label: "单位",
+        prop: "productUnit",
+        width: 80,
+      },
+      render(unit) {
+        return proxy.dictValueLabel(unit, productUnit.value);
+      },
+    },
+    {
+      attrs: {
+        label: "数量",
+        prop: "count",
+        width: 100,
+      },
+    },
+    {
+      attrs: {
+        label: "售后状态",
+        prop: "qualifiedCount",
+        slot: "code",
+        width: 100,
+      },
+    },
+    {
+      attrs: {
+        label: "售后说明",
+        prop: "noQualifiedCount",
+      },
+    },
+    {
+      attrs: {
+        label: "操作",
+        width: "150",
+        align: "center",
+        fixed: "right",
+      },
+      renderHTML(row) {
+        return [
+          {
+            attrs: {
+              label: "跟进",
+              type: "primary",
+              text: true,
+              disabled: false,
+            },
+            el: "button",
+            click() {
+              modalType.value = "add";
+              formData.followData = {};
+              openFollow.value = true;
+            },
+          },
+          {
+            attrs: {
+              label: "关闭",
+              type: "primary",
+              text: true,
+              disabled: false,
+            },
+            el: "button",
+            click() {},
+          },
+          {
+            attrs: {
+              label: "退货",
+              type: "primary",
+              text: true,
+              disabled: false,
+            },
+            el: "button",
+            click() {},
+          },
+          {
+            attrs: {
+              label: "换货",
+              type: "primary",
+              text: true,
+              disabled: false,
+            },
+            el: "button",
+            click() {},
+          },
+          {
+            attrs: {
+              label: "退款",
+              type: "primary",
+              text: true,
+              disabled: false,
+            },
+            el: "button",
+            click() {},
+          },
+          {
+            attrs: {
+              label: "发起采购",
+              type: "primary",
+              text: true,
+              disabled: false,
+            },
+            el: "button",
+            click() {},
+          },
+        ];
+      },
+    },
+  ];
+});
+
+const formData = reactive({
+  data: {},
+  followData: {},
+});
+const formOption = reactive({
+  inline: true,
+  labelWidth: 100,
+  itemWidth: 100,
+  rules: [],
+});
+const formConfig = computed(() => {
+  return [
+    {
+      type: "select",
+      prop: "customerId",
+      label: "客户名称",
+      required: true,
+      itemWidth: 100,
+      data: customerData.value,
+      style: {
+        width: "50%",
+      },
+      disabled: false,
+    },
+    {
+      type: "select",
+      prop: "customerId",
+      label: "销售合同",
+      required: true,
+      itemWidth: 100,
+      multiple: true,
+      data: customerData.value,
+      style: {
+        width: "50%",
+      },
+      disabled: false,
+    },
+    {
+      type: "select",
+      prop: "customerId",
+      label: "售后类型",
+      required: true,
+      itemWidth: 100,
+      multiple: true,
+      data: customerData.value,
+      style: {
+        width: "30%",
+      },
+      disabled: false,
+    },
+    {
+      type: "input",
+      itemType: "textarea",
+      prop: "customerId",
+      label: "售后说明",
+      required: true,
+      itemWidth: 100,
+      style: {
+        width: "50%",
+      },
+    },
+    {
+      type: "title",
+      title: "产品明细",
+    },
+    {
+      type: "slot",
+      slotName: "details",
+    },
+  ];
+});
+const formConfigAFollow = computed(() => {
+  return [
+    {
+      type: "date",
+      itemType: "datetime",
+      label: "跟进时间",
+      prop: "date",
+      itemWidth: 100,
+    },
+    {
+      type: "select",
+
+      label: "跟进人",
+      prop: "aa",
+      itemWidth: 100,
+      data: [],
+    },
+    {
+      type: "input",
+      itemType: "textarea",
+      label: "跟进记录",
+      prop: "content",
+      itemWidth: 100,
+    },
+    {
+      type: "slot",
+      label: "上传附件",
+      prop: "fileList",
+      slotName: "fileSlot",
+    },
+  ];
+});
+const formDom = ref(null);
+const getList = async (req) => {
+  sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
+  loading.value = true;
+  proxy
+    .post("/arrivalDetail/page", sourceList.value.pagination)
+    .then((message) => {
+      message.rows.forEach((x) => {
+        if (x.status < 20) {
+          x.isCheck = true;
+        } else {
+          x.isCheck = false;
+        }
+      });
+      sourceList.value.data = message.rows;
+      sourceList.value.pagination.total = message.total;
+      setTimeout(() => {
+        loading.value = false;
+      }, 200);
+    });
+};
+
+const submitForm = () => {
+  formDom.value.validate((valid) => {
+    const list = formData.data.qualityDetailList;
+    for (let i = 0; i < list.length; i++) {
+      const e = list[i];
+      delete e.id;
+      if (!(e.qualifiedCount + e.noQualifiedCount > 0)) {
+        return ElMessage({
+          message: "质检数量不能为0!",
+          type: "info",
+        });
+      }
+      if (
+        e.qualifiedCount + e.noQualifiedCount + Number(e.sumQualityCount) >
+        Number(e.count)
+      ) {
+        return ElMessage({
+          message: "质检数量不能大于到货数量!",
+          type: "info",
+        });
+      }
+    }
+    submitLoading.value = true;
+    proxy.post("/quality/" + modalType.value, formData.data).then(
+      (res) => {
+        ElMessage({
+          message: "质检成功",
+          type: "success",
+        });
+        dialogVisible.value = false;
+        submitLoading.value = false;
+        getList();
+      },
+      (err) => {
+        submitLoading.value = false;
+      }
+    );
+  });
+};
+
+const getDtl = (row) => {
+  modalType.value = "edit";
+  dialogVisible.value = true;
+
+  // proxy.post("/productionProcesses/detail", { id: row.id }).then((res) => {
+  //   fileList.value = [
+  //     {
+  //       id: "",
+  //       fileName: res.fileName,
+  //       path: "",
+  //     },
+  //   ];
+  //   formData.data = res;
+  //   dialogVisible.value = true;
+  // });
+};
+const getDict = () => {
+  proxy.post("/customer/page", { pageNum: 1, pageSize: 9999 }).then((res) => {
+    customerData.value = res.rows.map((x) => ({
+      ...x,
+      label: x.name,
+      value: x.id,
+    }));
+  });
+
+  proxy.getDictOne(["unit", "product_type"]).then((res) => {
+    productUnit.value = res["unit"].map((x) => ({
+      label: x.dictValue,
+      value: x.dictKey,
+    }));
+    productType.value = res["product_type"].map((x) => ({
+      label: x.dictValue,
+      value: x.dictKey,
+    }));
+  });
+};
+getDict();
+getList();
+const clickAdd = (type) => {
+  modalType.value = "add";
+  formData.data = {};
+  dialogVisible.value = true;
+};
+
+const acquireSelectList = () => {
+  let data = [];
+  if (
+    formData.data.subscribeDetailList &&
+    formData.data.subscribeDetailList.length > 0
+  ) {
+    data = formData.data.subscribeDetailList.map((item) => {
+      return {
+        id: item.bussinessId,
+        name: item.productName,
+      };
+    });
+  }
+  return data;
+};
+
+const pushGoods = (goods) => {
+  if (goods && goods.length > 0) {
+    let afterFiltering = [];
+    if (
+      formData.data.subscribeDetailList &&
+      formData.data.subscribeDetailList.length > 0
+    ) {
+      afterFiltering = goods.filter((item) => {
+        let data = formData.data.subscribeDetailList.filter(
+          (itemProduct) => itemProduct.bussinessId === item.id
+        );
+        if (data && data.length > 0) {
+          return false;
+        }
+        return true;
+      });
+    } else {
+      afterFiltering = goods;
+    }
+    const arr = afterFiltering.map((x) => ({
+      goodType: x.goodType,
+      code: x.code,
+      name: x.name,
+      spec: x.spec,
+      unit: x.unit,
+      bussinessId: x.id,
+      count: "",
+      remark: "",
+    }));
+    formData.data.subscribeDetailList =
+      formData.data.subscribeDetailList.concat(arr);
+    openProduct.value = false;
+    return ElMessage({
+      message: "添加成功!",
+      type: "success",
+    });
+  } else {
+    ElMessage("请选择至少一件物品");
+  }
+};
+const handleRemove = (index) => {
+  formData.data.subscribeDetailList.splice(index, 1);
+  return ElMessage({
+    message: "删除成功!",
+    type: "success",
+  });
+};
+
+const uploadFile = async (file) => {
+  const res = await proxy.post("/fileInfo/getSing", { fileName: file.name });
+  uploadData.value = res.uploadBody;
+  file.id = res.id;
+  file.fileName = res.fileName;
+  file.fileUrl = res.fileUrl;
+  return true;
+};
+const onPreviewFile = (file) => {
+  window.open(file.raw.fileUrl, "_blank");
+};
+</script>
+  
+<style lang="scss" scoped>
+.tenant {
+  padding: 20px;
+}
+</style>

+ 335 - 0
src/views/system/msg/hisMsg.vue

@@ -0,0 +1,335 @@
+<template>
+	<div class="tenant">
+		<div class="content">
+			<byTable
+				:source="sourceList.data"
+				:pagination="sourceList.pagination"
+				:config="config"
+				:loading="loading"
+				:selectConfig="selectConfig"
+				highlight-current-row
+				
+				@get-list="getList"
+			>
+			</byTable>
+		</div>
+
+		<el-dialog
+			:title="modalType == 'add' ? '新增' : '编辑'"
+			v-if="dialogVisible"
+			v-model="dialogVisible"
+			width="500"
+			v-loading="loadingOperation"
+		>
+			<byForm
+				:formConfig="formConfig"
+				:formOption="formOption"
+				v-model="formData.data"
+				:rules="rules"
+				ref="submit"
+			>
+			</byForm>
+			<template #footer>
+				<el-button @click="dialogVisible = false" size="large"
+					>取 消</el-button
+				>
+				<el-button type="primary" @click="submitForm()" size="large"
+					>确 定</el-button
+				>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script setup>
+import { ElMessage, ElMessageBox } from 'element-plus'
+import byTable from '@/components/byTable/index'
+import byForm from '@/components/byForm/index'
+import { computed, ref } from 'vue'
+import Editor from '@/components/Editor/index.vue'
+
+const { proxy } = getCurrentInstance()
+const loading = ref(false)
+const companyList = ref({})
+const sourceList = ref({
+	data: [],
+	pagination: {
+		total: 0,
+		pageNum: 1,
+		pageSize: 10,
+		corporationId: '',
+		keyword: '',
+	},
+})
+const selectConfig = computed(() => {
+	return [
+        // {
+		// 	label: '消息类型',
+		// 	prop: 'status',
+		// 	data: [
+		// 		{
+		// 			label: '已发送',
+		// 			value: '1',
+		// 		},
+        //         {
+        //             label: '未发送',
+        //             value: '0',
+        //         },
+		// 	],
+		// },
+		// {
+		// 	label: '消息类型',
+		// 	prop: 'type',
+		// 	data: [
+		// 		{
+		// 			label: '系统公告',
+		// 			value: '1',
+		// 		},
+		// 	],
+		// },
+	]
+})
+const config = computed(() => {
+	return [
+		{
+			attrs: {
+				label: '消息类型',
+				prop: 'type',
+                width: '200',
+			},
+			render(type) {
+				return '消息提醒'
+			},
+		},
+		{
+			attrs: {
+				label: '消息内容',
+				prop: 'title',
+			},
+		},
+		{
+			attrs: {
+				label: '发送时间',
+				prop: 'createTime',
+                width: '200',
+			},
+		},
+		// {
+		// 	attrs: {
+		// 		label: '消息状态',
+		// 		prop: 'status',
+		// 	},
+        //     render(status) {
+		// 		return status == 1 ? '已发送' : '未发送'
+		// 	},
+		// },
+		// {
+		// 	attrs: {
+		// 		label: '操作',
+		// 		width: '120',
+		// 		align: 'center',
+		// 	},
+		// 	renderHTML(row) {
+		// 		return [
+		// 			row.status == 0 ? {
+		// 				attrs: {
+		// 					label: '发送',
+		// 					type: 'primary',
+		// 					text: true,
+		// 				},
+		// 				el: 'button',
+		// 				click() {
+		// 					ElMessageBox.confirm(
+		// 						'你确定发送此条信息?',
+		// 						'提示',
+		// 						{
+		// 							confirmButtonText: '确定',
+		// 							cancelButtonText: '取消',
+		// 							type: 'warning',
+		// 						}
+		// 					).then(() => {
+		// 						proxy
+		// 							.post('/sendMeg/edit', {
+		// 								...row,
+        //                                 status:1,
+		// 							})
+		// 							.then(() => {
+		// 								ElMessage({
+		// 									message: '发送成功',
+		// 									type: 'success',
+		// 								})
+		// 								getList()
+		// 							})
+		// 					})
+		// 				},
+		// 			} : {},
+		// 			{
+		// 				attrs: {
+		// 					label: '删除',
+		// 					type: 'primary',
+		// 					text: true,
+		// 				},
+		// 				el: 'button',
+		// 				click() {
+		// 					ElMessageBox.confirm(
+		// 						'此操作将永久删除该数据, 是否继续?',
+		// 						'提示',
+		// 						{
+		// 							confirmButtonText: '确定',
+		// 							cancelButtonText: '取消',
+		// 							type: 'warning',
+		// 						}
+		// 					).then(() => {
+		// 						proxy
+		// 							.post('/sendMeg/delete', {
+		// 								id: row.id,
+		// 							})
+		// 							.then(() => {
+		// 								ElMessage({
+		// 									message: '删除成功',
+		// 									type: 'success',
+		// 								})
+		// 								getList()
+		// 							})
+		// 					})
+		// 				},
+		// 			},
+		// 		]
+		// 	},
+		// },
+	]
+})
+const getDict = () => {
+	proxy
+		.post('/corporation/page', { pageNum: 1, pageSize: 999 })
+		.then((res) => {
+			companyList.value = res.rows.map((item) => {
+				return {
+					label: item.name,
+					value: item.id,
+				}
+			})
+		})
+}
+const getList = async (req) => {
+	sourceList.value.pagination = { ...sourceList.value.pagination, ...req }
+	loading.value = true
+	proxy.post('/pushInfo/page', sourceList.value.pagination).then((res) => {
+		sourceList.value.data = res.rows
+		sourceList.value.pagination.total = res.total
+		setTimeout(() => {
+			loading.value = false
+		}, 200)
+	})
+}
+getDict()
+getList()
+const modalType = ref('add')
+const dialogVisible = ref(false)
+const loadingOperation = ref(false)
+const submit = ref(null)
+const formData = reactive({
+	data: {
+		countryId: '44',
+	},
+})
+const formOption = reactive({
+	inline: true,
+	labelWidth: 100,
+	itemWidth: 100,
+	rules: [],
+})
+const formConfig = computed(() => {
+	return [
+		// {
+		// 	label: '基础信息',
+		// },
+		// {
+		// 	type: 'select',
+		// 	prop: 'type',
+		// 	label: '消息类型',
+        //     data: [
+		// 		{
+		// 			label: '系统公告',
+		// 			value: '1',
+		// 		},
+		// 	],
+		// },
+		{
+			type: 'input',
+			prop: 'title',
+			label: '标题',
+			itemType: 'text',
+			placeholder: '请输入标题',
+		},
+        {
+            type: 'input',
+            prop: 'content',
+            label: '正文',
+            itemType: 'textarea',
+            placeholder: '请输入正文',
+        },
+        
+        {
+            type: 'date',
+            prop: 'sendTime',
+            label: '发送时间',
+            placeholder: '请选择发送时间',
+            itemType: 'date',
+        },
+		{
+            type: 'date',
+            prop: 'endTime',
+            label: '结束时间',
+            placeholder: '请选择结束时间',
+            itemType: 'date',
+        },
+
+	]
+})
+let rules = ref({
+	sendTime: [
+		{ required: true, message: '请选择时间', trigger: 'blur' },
+	],
+	type: [
+		{ required: true, message: '请选择类型', trigger: 'change' },
+	],
+    title: [
+        { required: true, message: '请输入标题', trigger: 'blur' },
+    ],
+    content: [
+        { required: true, message: '请输入正文', trigger: 'blur' },
+    ],
+})
+const openModal = () => {
+	modalType.value = 'add'
+	formData.data = {}
+	loadingOperation.value = false
+	dialogVisible.value = true
+}
+const submitForm = () => {
+	submit.value.handleSubmit(() => {
+		loadingOperation.value = true
+		proxy.post('/pushAnnouncement/' + modalType.value, formData.data).then(
+			() => {
+				ElMessage({
+					message: modalType.value == 'add' ? '添加成功' : '编辑成功',
+					type: 'success',
+				})
+				dialogVisible.value = false
+				getList()
+			},
+			(err) => {
+				console.log(err)
+				loadingOperation.value = false
+			}
+		)
+	})
+}
+</script>
+
+<style lang="scss" scoped>
+.tenant {
+	padding: 20px;
+}
+</style>

+ 273 - 0
src/views/system/userJoin/index.vue

@@ -0,0 +1,273 @@
+<template>
+	<div class="tenant">
+		<div class="content">
+			<byTable
+				:source="sourceList.data"
+				:pagination="sourceList.pagination"
+				:config="config"
+				:loading="loading"
+				:selectConfig="selectConfig"
+				highlight-current-row
+				:action-list="[
+					{
+						text: '添加交接',
+						action: () => openModal(),
+					},
+				]"
+				@get-list="getList"
+			>
+			</byTable>
+		</div>
+
+		<el-dialog
+			:title="modalType == 'add' ? '新增' : '编辑'"
+			v-if="dialogVisible"
+			v-model="dialogVisible"
+			width="500"
+			v-loading="loadingOperation"
+		>
+			<byForm
+				:formConfig="formConfig"
+				:formOption="formOption"
+				v-model="formData.data"
+				:rules="rules"
+				ref="submit"
+			>
+			</byForm>
+			<template #footer>
+				<el-button @click="dialogVisible = false" size="large"
+					>取 消</el-button
+				>
+				<el-button type="primary" @click="submitForm()" size="large"
+					>确 定</el-button
+				>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script setup>
+import { ElMessage, ElMessageBox } from 'element-plus'
+import byTable from '@/components/byTable/index'
+import byForm from '@/components/byForm/index'
+import { computed, ref } from 'vue'
+import Editor from '@/components/Editor/index.vue'
+import useUserStore from "@/store/modules/user";
+const { proxy } = getCurrentInstance()
+const loading = ref(false)
+const companyList = ref({})
+const sourceList = ref({
+	data: [],
+	pagination: {
+		total: 0,
+		pageNum: 1,
+		pageSize: 10,
+		corporationId: '',
+		keyword: '',
+	},
+})
+const selectConfig = computed(() => {
+	return [
+	]
+})
+const config = computed(() => {
+	return [
+		{
+			attrs: {
+				label: '交接人',
+				prop: 'handoverPersonName',
+			},
+		},
+		{
+			attrs: {
+				label: '接收人',
+				prop: 'recipientName',
+			},
+		},
+		{
+			attrs: {
+				label: '交接时间',
+				prop: 'createTime',
+			},
+		},
+		{
+			attrs: {
+				label: '交接原因',
+				prop: 'reason',
+			},
+		},
+		{
+			attrs: {
+				label: '交接内容',
+				prop: 'content',
+			},
+			render(content) {
+				const a = content.split(',').map((item) => {
+					return contentObj[item]
+				})
+				return a.join(',')
+			},
+		},
+        {
+			attrs: {
+				label: '备注',
+				prop: 'remark',
+			},
+		},
+	]
+})
+const contentObj = {
+	1: '客户信息',
+}
+const getDict = () => {
+	proxy
+		.post('/corporation/page', { pageNum: 1, pageSize: 999 })
+		.then((res) => {
+			companyList.value = res.rows.map((item) => {
+				return {
+					label: item.name,
+					value: item.id,
+				}
+			})
+		})
+}
+const getList = async (req) => {
+	sourceList.value.pagination = { ...sourceList.value.pagination, ...req }
+	loading.value = true
+	proxy.post('/employeeHandover/page', sourceList.value.pagination).then((res) => {
+		sourceList.value.data = res.rows
+		sourceList.value.pagination.total = res.total
+		setTimeout(() => {
+			loading.value = false
+		}, 200)
+	})
+}
+getDict()
+getList()
+const modalType = ref('add')
+const dialogVisible = ref(false)
+const loadingOperation = ref(false)
+const submit = ref(null)
+const formData = reactive({
+	data: {
+		countryId: '44',
+	},
+})
+const formOption = reactive({
+	inline: true,
+	labelWidth: 100,
+	itemWidth: 100,
+	rules: [],
+})
+const formConfig = computed(() => {
+	return [
+		{
+			label: '交接信息',
+		},
+		{
+			type: 'select',
+			prop: 'handoverPersonId',
+			label: '交接人',
+            data: [],
+            itemWidth: '50',
+		},
+        {
+			type: 'select',
+			prop: 'recipientId',
+			label: '接收人',
+            data: [],
+            itemWidth: '50',
+		},
+        {
+            type: 'input',
+            prop: 'reason',
+            label: '交接原因',
+            itemType: 'textarea',
+            placeholder: '请输入交接原因',
+        },
+        {
+			type: 'checkbox',
+			prop: 'content',
+			label: '交接内容',
+            data: [{
+                label: '客户信息',
+                value: '1',
+            }],
+		},
+        {
+            type: 'input',
+            prop: 'remark',
+            label: '备注',
+            itemType: 'textarea',
+            placeholder: '请输入备注',
+        },
+
+	]
+})
+let rules = ref({
+	handoverPersonId: [
+		{ required: true, message: '请选择交接人', trigger: 'blur' },
+	],
+	recipientId: [
+		{ required: true, message: '请选择接收人', trigger: 'change' },
+	],
+    reason: [
+        { required: true, message: '请输入交接原因', trigger: 'blur' },
+    ],
+    content: [
+        { required: true, message: '请输入交接内容', trigger: 'blur' },
+    ],
+})
+const openModal = () => {
+	modalType.value = 'add'
+	formData.data = {}
+	loadingOperation.value = false
+	dialogVisible.value = true
+}
+const submitForm = () => {
+	submit.value.handleSubmit(() => {
+		loadingOperation.value = true
+		proxy.post('/employeeHandover/add', {...formData.data,content:formData.data.content.join(',')}).then(
+			() => {
+				ElMessage({
+					message: modalType.value == 'add' ? '添加成功' : '添加成功',
+					type: 'success',
+				})
+				dialogVisible.value = false
+				getList()
+			},
+			(err) => {
+				console.log(err)
+				loadingOperation.value = false
+			}
+		)
+	})
+}
+let  userList = ref([])
+const getUser = () => {
+  proxy
+    .get("/tenantUser/list", {
+      pageNum: 1,
+      pageSize: 999,
+      tenantId: useUserStore().user.tenantId,
+    })
+    .then((res) => {
+        console.log(formConfig);
+        res.rows = res.rows.map((item) => {
+            return {
+                label: item.nickName,
+                value: item.userId,
+            };
+        });
+        formConfig.value[1].data = res.rows
+        formConfig.value[2].data = res.rows
+    });
+};
+getUser()
+</script>
+
+<style lang="scss" scoped>
+.tenant {
+	padding: 20px;
+}
+</style>

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно