Browse Source

部分需求更新

cz 1 year ago
parent
commit
2d33ebe982
30 changed files with 2717 additions and 349 deletions
  1. 114 95
      src/components/process/SF/Contract.vue
  2. 114 95
      src/components/process/SF/ContractChange.vue
  3. 46 7
      src/components/process/SF/CostControl.vue
  4. 39 39
      src/components/process/SF/Purchase.vue
  5. 26 18
      src/components/product/SelectMaterial.vue
  6. 664 0
      src/views/EHSD/procurement/arrivalRecord/index.vue
  7. 15 0
      src/views/EHSD/procurement/purchasedEHSD/index.vue
  8. 49 8
      src/views/EHSD/productLibrary/companyProduct/index.vue
  9. 89 22
      src/views/EHSD/productLibrary/waitCreateProduct/index.vue
  10. 6 0
      src/views/EHSD/saleContract/accountingSubjects/index.vue
  11. 27 4
      src/views/EHSD/saleContract/collectionRegistration/index.vue
  12. 3 3
      src/views/EHSD/saleContract/contractEHSD/index.vue
  13. 124 29
      src/views/EHSD/saleContract/shipmentRegistration/index.vue
  14. 1 1
      src/views/MES/productionOrder/index.vue
  15. 8 2
      src/views/customer/addCustomer.vue
  16. 2 2
      src/views/customer/contacts/index.vue
  17. 4 4
      src/views/customer/file/index.vue
  18. 3 3
      src/views/customer/highseas/index.vue
  19. 62 5
      src/views/customer/privatesea/index.vue
  20. 34 5
      src/views/finance/fundManage/costControl/index.vue
  21. 3 3
      src/views/finance/fundManage/paymentType/index.vue
  22. 1 1
      src/views/purchaseSales/outAndInWarehouse/manualDelivery/index.vue
  23. 1 1
      src/views/purchaseSales/outAndInWarehouse/record/index.vue
  24. 1 1
      src/views/purchaseSales/outAndInWarehouse/waitingForDelivery/index.vue
  25. 24 1
      src/views/purchaseSales/outAndInWarehouse/waitingForStorage/index.vue
  26. 270 0
      src/views/systemTenant/otherManage/artCopyright/index.vue
  27. 310 0
      src/views/systemTenant/otherManage/contractor/index.vue
  28. 270 0
      src/views/systemTenant/otherManage/patentManage/index.vue
  29. 270 0
      src/views/systemTenant/otherManage/trademarkManage/index.vue
  30. 137 0
      src/views/systemTenant/tenant/userTenant/index.vue

+ 114 - 95
src/components/process/SF/Contract.vue

@@ -35,56 +35,64 @@
       </template>
 
       <template #seller>
-        <div style="width: 100%">
+        <div style="width: 100%;position:relative">
           <el-form-item prop="sellCorporationId" label="卖方信息" class="wid100">
             <el-select v-model="formData.data.sellCorporationId" placeholder="请选择卖方公司" style="width: 100%" @change="sellCorporationIdChange"
                        filterable>
               <el-option v-for="item in corporationList" :key="item.value" :label="item.label" :value="item.value" />
             </el-select>
           </el-form-item>
-          <el-form-item label="地址" class="wid100">
-            <el-row style="width:100%">
-              <el-col :span="8">
-                <el-form-item label="" prop="sellCountryName" label-width="0px" class="margin-b-0 wid100">
-                  <el-input v-model="formData.data.sellCountryName" placeholder="请输入国家" />
-                </el-form-item>
-              </el-col>
-              <el-col :span="8">
-                <el-form-item label="" prop="sellProvinceName" label-width="0px" class="margin-b-0 wid100">
-                  <el-input v-model="formData.data.sellProvinceName" placeholder="请输入省/州" />
-                </el-form-item>
-              </el-col>
-              <el-col :span="8">
-                <el-form-item label="" prop="sellCityName" label-width="0px" class="margin-b-0 wid100">
-                  <el-input v-model="formData.data.sellCityName" placeholder="请输入城市" />
-                </el-form-item>
-              </el-col>
-            </el-row>
-          </el-form-item>
-
-          <el-form-item label="详细地址" prop="sellAddress" class="wid100">
-            <el-input v-model="formData.data.sellAddress" type="textarea">
-            </el-input>
-          </el-form-item>
-
-          <el-form-item label="联系人" class="wid100">
-            <el-row style="width:100%">
-              <el-col :span="8">
-                <el-form-item label="" prop="sellContactName" label-width="0px" class="margin-b-0 wid100">
-                  <el-input v-model="formData.data.sellContactName" placeholder="请输入联系人" />
-                </el-form-item>
-              </el-col>
-              <el-col :span="16">
-                <el-form-item label="" prop="sellContactNumber" label-width="0px" class="margin-b-0 wid100">
-                  <el-input v-model="formData.data.sellContactNumber" placeholder="请输入联系人电话" />
-                </el-form-item>
-              </el-col>
-            </el-row>
-          </el-form-item>
+          <!-- <div style="position:absolute;top:0px;right:-20px;cursor:pointer" @click="isShowOther =!isShowOther">
+            <el-icon v-if="!isShowOther">
+              <ArrowDownBold />
+            </el-icon>
+            <el-icon v-else>
+              <ArrowUpBold />
+            </el-icon>
+          </div> -->
+          <div v-show="isShowOther">
+            <el-form-item label="地址" class="wid100">
+              <el-row style="width:100%">
+                <el-col :span="8">
+                  <el-form-item label="" prop="sellCountryName" label-width="0px" class="margin-b-0 wid100">
+                    <el-input v-model="formData.data.sellCountryName" placeholder="请输入国家" />
+                  </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                  <el-form-item label="" prop="sellProvinceName" label-width="0px" class="margin-b-0 wid100">
+                    <el-input v-model="formData.data.sellProvinceName" placeholder="请输入省/州" />
+                  </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                  <el-form-item label="" prop="sellCityName" label-width="0px" class="margin-b-0 wid100">
+                    <el-input v-model="formData.data.sellCityName" placeholder="请输入城市" />
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </el-form-item>
+            <el-form-item label="详细地址" prop="sellAddress" class="wid100">
+              <el-input v-model="formData.data.sellAddress" type="textarea">
+              </el-input>
+            </el-form-item>
+            <el-form-item label="联系人" class="wid100">
+              <el-row style="width:100%">
+                <el-col :span="8">
+                  <el-form-item label="" prop="sellContactName" label-width="0px" class="margin-b-0 wid100">
+                    <el-input v-model="formData.data.sellContactName" placeholder="请输入联系人" />
+                  </el-form-item>
+                </el-col>
+                <el-col :span="16">
+                  <el-form-item label="" prop="sellContactNumber" label-width="0px" class="margin-b-0 wid100">
+                    <el-input v-model="formData.data.sellContactNumber" placeholder="请输入联系人电话" />
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </el-form-item>
+          </div>
         </div>
       </template>
       <template #buyer>
-        <div style="width: 100%">
+        <div style="width: 100%;position:relative">
           <el-form-item label="买方信息" prop="buyCorporationId" class="wid100">
             <el-select v-model="formData.data.buyCorporationId" filterable remote reserve-keyword placeholder="请输入关键字" remote-show-suffix
                        :remote-method="remoteMethod" :loading="loadingSearch" @input="remoteMethod" style="width: 100%" @change="changeCustomer" v-if="
@@ -96,59 +104,69 @@
             <el-select v-model="formData.data.buyCorporationName" disabled v-else style="width: 100%">
             </el-select>
           </el-form-item>
-          <el-form-item label="地址" class="wid100" required>
-            <el-row style="width: 100%">
-              <el-col :span="6">
-                <el-form-item label="" prop="countryId" class="margin-b-0">
-                  <el-select v-model="formData.data.countryId" placeholder="国家" style="width:100%" filterable
-                             @change="(val) => getCityData(val, '20', true)" :disabled="!isEditList">
-                    <el-option v-for="item in countryData" :label="item.name" :value="item.id">
-                    </el-option>
-                  </el-select>
-                </el-form-item>
-              </el-col>
-              <el-col :span="6">
-                <el-form-item label="" prop="provinceName" class="margin-b-0">
-                  <selectCity placeholder="省/洲" @change="(val) => getCityData(val, '30', true)" addressId="provinceId" addressName="provinceName"
-                              v-model="formData.data" :data="provinceData" :disabled="!isEditList">
-                  </selectCity>
-                </el-form-item>
-              </el-col>
-              <el-col :span="6">
-                <el-form-item label="" prop="cityName" class="margin-b-0">
-                  <selectCity placeholder="城市" addressId="cityId" addressName="cityName" v-model="formData.data" :data="cityData"
-                              :disabled="!isEditList">
-                  </selectCity>
-                </el-form-item>
-              </el-col>
-              <el-col :span="6">
-                <el-form-item label="" prop="buyPostalCode" class="margin-b-0">
-                  <el-input v-model="formData.data.buyPostalCode" placeholder="请输入邮编" :disabled="!isEditList" />
-                </el-form-item>
-              </el-col>
-            </el-row>
-          </el-form-item>
+          <div style="position:absolute;top:0px;right:-20px;cursor:pointer" @click="isShowOther =!isShowOther">
+            <el-icon v-if="!isShowOther">
+              <ArrowDownBold />
+            </el-icon>
+            <el-icon v-else>
+              <ArrowUpBold />
+            </el-icon>
+          </div>
+          <div v-show="isShowOther">
+            <el-form-item label="地址" class="wid100" required>
+              <el-row style="width: 100%">
+                <el-col :span="6">
+                  <el-form-item label="" prop="countryId" class="margin-b-0">
+                    <el-select v-model="formData.data.countryId" placeholder="国家" style="width:100%" filterable
+                               @change="(val) => getCityData(val, '20', true)" :disabled="!isEditList">
+                      <el-option v-for="item in countryData" :label="item.name" :value="item.id">
+                      </el-option>
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="6">
+                  <el-form-item label="" prop="provinceName" class="margin-b-0">
+                    <selectCity placeholder="省/洲" @change="(val) => getCityData(val, '30', true)" addressId="provinceId" addressName="provinceName"
+                                v-model="formData.data" :data="provinceData" :disabled="!isEditList">
+                    </selectCity>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="6">
+                  <el-form-item label="" prop="cityName" class="margin-b-0">
+                    <selectCity placeholder="城市" addressId="cityId" addressName="cityName" v-model="formData.data" :data="cityData"
+                                :disabled="!isEditList">
+                    </selectCity>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="6">
+                  <el-form-item label="" prop="buyPostalCode" class="margin-b-0">
+                    <el-input v-model="formData.data.buyPostalCode" placeholder="请输入邮编" :disabled="!isEditList" />
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </el-form-item>
 
-          <el-form-item label="详细地址" prop="buyAddress" class="wid100">
-            <el-input v-model="formData.data.buyAddress" type="textarea" :disabled="!isEditList">
-            </el-input>
-          </el-form-item>
-          <el-form-item label="联系人" class="wid100" required>
-            <el-row style="width: 100%">
-              <el-col :span="8">
-                <el-form-item label="" prop="buyContactName" label-width="0px" class="margin-b-0 wid100">
-                  <el-autocomplete v-model="formData.data.buyContactName" :fetch-suggestions="querySearchPerson" style="width:100%" clearable
-                                   class="inline-input w-50" placeholder="请输入联系人" @select="handlePerson" :disabled="!isEditList">
-                  </el-autocomplete>
-                </el-form-item>
-              </el-col>
-              <el-col :span="16">
-                <el-form-item label="" prop="buyContactNumber" label-width="0px" class="margin-b-0 wid100">
-                  <el-input v-model="formData.data.buyContactNumber" placeholder="请输入联系人电话" :disabled="!isEditList" />
-                </el-form-item>
-              </el-col>
-            </el-row>
-          </el-form-item>
+            <el-form-item label="详细地址" prop="buyAddress" class="wid100">
+              <el-input v-model="formData.data.buyAddress" type="textarea" :disabled="!isEditList">
+              </el-input>
+            </el-form-item>
+            <el-form-item label="联系人" class="wid100" required>
+              <el-row style="width: 100%">
+                <el-col :span="8">
+                  <el-form-item label="" prop="buyContactName" label-width="0px" class="margin-b-0 wid100">
+                    <el-autocomplete v-model="formData.data.buyContactName" :fetch-suggestions="querySearchPerson" style="width:100%" clearable
+                                     class="inline-input w-50" placeholder="请输入联系人" @select="handlePerson" :disabled="!isEditList">
+                    </el-autocomplete>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="16">
+                  <el-form-item label="" prop="buyContactNumber" label-width="0px" class="margin-b-0 wid100">
+                    <el-input v-model="formData.data.buyContactNumber" placeholder="请输入联系人电话" :disabled="!isEditList" />
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </el-form-item>
+          </div>
         </div>
       </template>
 
@@ -621,6 +639,7 @@ const copyType = ref(1);
 const copyContract = ref(false);
 const indexValue = ref(-1);
 const openSelectMaterial = ref(false);
+const isShowOther = ref(false);
 const formData = reactive({
   data: {
     contractType: "2",
@@ -1212,13 +1231,13 @@ const formConfig = computed(() => {
     },
     {
       type: "title",
-      title: "订单模板",
+      title: "合同条款",
       haveLine: true,
     },
     {
       type: "select",
       prop: "contractTemplateId",
-      label: "订单模板",
+      label: "合同条款",
       data: templateList.value,
       itemWidth: 50,
       fn: (val) => {

+ 114 - 95
src/components/process/SF/ContractChange.vue

@@ -35,56 +35,64 @@
       </template>
 
       <template #seller>
-        <div style="width: 100%">
+        <div style="width: 100%;position:relative">
           <el-form-item prop="sellCorporationId" label="卖方信息" class="wid100">
             <el-select v-model="formData.data.sellCorporationId" placeholder="请选择卖方公司" style="width: 100%" @change="sellCorporationIdChange"
                        filterable>
               <el-option v-for="item in corporationList" :key="item.value" :label="item.label" :value="item.value" />
             </el-select>
           </el-form-item>
-          <el-form-item label="地址" class="wid100">
-            <el-row style="width:100%">
-              <el-col :span="8">
-                <el-form-item label="" prop="sellCountryName" label-width="0px" class="margin-b-0 wid100">
-                  <el-input v-model="formData.data.sellCountryName" placeholder="请输入国家" />
-                </el-form-item>
-              </el-col>
-              <el-col :span="8">
-                <el-form-item label="" prop="sellProvinceName" label-width="0px" class="margin-b-0 wid100">
-                  <el-input v-model="formData.data.sellProvinceName" placeholder="请输入省/州" />
-                </el-form-item>
-              </el-col>
-              <el-col :span="8">
-                <el-form-item label="" prop="sellCityName" label-width="0px" class="margin-b-0 wid100">
-                  <el-input v-model="formData.data.sellCityName" placeholder="请输入城市" />
-                </el-form-item>
-              </el-col>
-            </el-row>
-          </el-form-item>
-
-          <el-form-item label="详细地址" prop="sellAddress" class="wid100">
-            <el-input v-model="formData.data.sellAddress" type="textarea">
-            </el-input>
-          </el-form-item>
-
-          <el-form-item label="联系人" class="wid100">
-            <el-row style="width:100%">
-              <el-col :span="8">
-                <el-form-item label="" prop="sellContactName" label-width="0px" class="margin-b-0 wid100">
-                  <el-input v-model="formData.data.sellContactName" placeholder="请输入联系人" />
-                </el-form-item>
-              </el-col>
-              <el-col :span="16">
-                <el-form-item label="" prop="sellContactNumber" label-width="0px" class="margin-b-0 wid100">
-                  <el-input v-model="formData.data.sellContactNumber" placeholder="请输入联系人电话" />
-                </el-form-item>
-              </el-col>
-            </el-row>
-          </el-form-item>
+          <!-- <div style="position:absolute;top:0px;right:-20px;cursor:pointer" @click="isShowOther =!isShowOther">
+            <el-icon v-if="!isShowOther">
+              <ArrowDownBold />
+            </el-icon>
+            <el-icon v-else>
+              <ArrowUpBold />
+            </el-icon>
+          </div> -->
+          <div v-show="isShowOther">
+            <el-form-item label="地址" class="wid100">
+              <el-row style="width:100%">
+                <el-col :span="8">
+                  <el-form-item label="" prop="sellCountryName" label-width="0px" class="margin-b-0 wid100">
+                    <el-input v-model="formData.data.sellCountryName" placeholder="请输入国家" />
+                  </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                  <el-form-item label="" prop="sellProvinceName" label-width="0px" class="margin-b-0 wid100">
+                    <el-input v-model="formData.data.sellProvinceName" placeholder="请输入省/州" />
+                  </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                  <el-form-item label="" prop="sellCityName" label-width="0px" class="margin-b-0 wid100">
+                    <el-input v-model="formData.data.sellCityName" placeholder="请输入城市" />
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </el-form-item>
+            <el-form-item label="详细地址" prop="sellAddress" class="wid100">
+              <el-input v-model="formData.data.sellAddress" type="textarea">
+              </el-input>
+            </el-form-item>
+            <el-form-item label="联系人" class="wid100">
+              <el-row style="width:100%">
+                <el-col :span="8">
+                  <el-form-item label="" prop="sellContactName" label-width="0px" class="margin-b-0 wid100">
+                    <el-input v-model="formData.data.sellContactName" placeholder="请输入联系人" />
+                  </el-form-item>
+                </el-col>
+                <el-col :span="16">
+                  <el-form-item label="" prop="sellContactNumber" label-width="0px" class="margin-b-0 wid100">
+                    <el-input v-model="formData.data.sellContactNumber" placeholder="请输入联系人电话" />
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </el-form-item>
+          </div>
         </div>
       </template>
       <template #buyer>
-        <div style="width: 100%">
+        <div style="width: 100%;position:relative">
           <el-form-item label="买方信息" prop="buyCorporationId" class="wid100">
             <el-select v-model="formData.data.buyCorporationId" filterable remote reserve-keyword placeholder="请输入关键字" remote-show-suffix
                        :remote-method="remoteMethod" :loading="loadingSearch" @input="remoteMethod" style="width: 100%" @change="changeCustomer" v-if="
@@ -96,59 +104,69 @@
             <el-select v-model="formData.data.buyCorporationName" disabled v-else style="width: 100%">
             </el-select>
           </el-form-item>
-          <el-form-item label="地址" class="wid100" required>
-            <el-row style="width: 100%">
-              <el-col :span="6">
-                <el-form-item label="" prop="countryId" class="margin-b-0">
-                  <el-select v-model="formData.data.countryId" placeholder="国家" style="width:100%" filterable
-                             @change="(val) => getCityData(val, '20', true)" :disabled="!isEditList">
-                    <el-option v-for="item in countryData" :label="item.name" :value="item.id">
-                    </el-option>
-                  </el-select>
-                </el-form-item>
-              </el-col>
-              <el-col :span="6">
-                <el-form-item label="" prop="provinceName" class="margin-b-0">
-                  <selectCity placeholder="省/洲" @change="(val) => getCityData(val, '30', true)" addressId="provinceId" addressName="provinceName"
-                              v-model="formData.data" :data="provinceData" :disabled="!isEditList">
-                  </selectCity>
-                </el-form-item>
-              </el-col>
-              <el-col :span="6">
-                <el-form-item label="" prop="cityName" class="margin-b-0">
-                  <selectCity placeholder="城市" addressId="cityId" addressName="cityName" v-model="formData.data" :data="cityData"
-                              :disabled="!isEditList">
-                  </selectCity>
-                </el-form-item>
-              </el-col>
-              <el-col :span="6">
-                <el-form-item label="" prop="buyPostalCode" class="margin-b-0">
-                  <el-input v-model="formData.data.buyPostalCode" placeholder="请输入邮编" :disabled="!isEditList" />
-                </el-form-item>
-              </el-col>
-            </el-row>
-          </el-form-item>
+          <div style="position:absolute;top:0px;right:-20px;cursor:pointer" @click="isShowOther =!isShowOther">
+            <el-icon v-if="!isShowOther">
+              <ArrowDownBold />
+            </el-icon>
+            <el-icon v-else>
+              <ArrowUpBold />
+            </el-icon>
+          </div>
+          <div v-show="isShowOther">
+            <el-form-item label="地址" class="wid100" required>
+              <el-row style="width: 100%">
+                <el-col :span="6">
+                  <el-form-item label="" prop="countryId" class="margin-b-0">
+                    <el-select v-model="formData.data.countryId" placeholder="国家" style="width:100%" filterable
+                               @change="(val) => getCityData(val, '20', true)" :disabled="!isEditList">
+                      <el-option v-for="item in countryData" :label="item.name" :value="item.id">
+                      </el-option>
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="6">
+                  <el-form-item label="" prop="provinceName" class="margin-b-0">
+                    <selectCity placeholder="省/洲" @change="(val) => getCityData(val, '30', true)" addressId="provinceId" addressName="provinceName"
+                                v-model="formData.data" :data="provinceData" :disabled="!isEditList">
+                    </selectCity>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="6">
+                  <el-form-item label="" prop="cityName" class="margin-b-0">
+                    <selectCity placeholder="城市" addressId="cityId" addressName="cityName" v-model="formData.data" :data="cityData"
+                                :disabled="!isEditList">
+                    </selectCity>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="6">
+                  <el-form-item label="" prop="buyPostalCode" class="margin-b-0">
+                    <el-input v-model="formData.data.buyPostalCode" placeholder="请输入邮编" :disabled="!isEditList" />
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </el-form-item>
 
-          <el-form-item label="详细地址" prop="buyAddress" class="wid100">
-            <el-input v-model="formData.data.buyAddress" type="textarea" :disabled="!isEditList">
-            </el-input>
-          </el-form-item>
-          <el-form-item label="联系人" class="wid100" required>
-            <el-row style="width: 100%">
-              <el-col :span="8">
-                <el-form-item label="" prop="buyContactName" label-width="0px" class="margin-b-0 wid100">
-                  <el-autocomplete v-model="formData.data.buyContactName" :fetch-suggestions="querySearchPerson" style="width:100%" clearable
-                                   class="inline-input w-50" placeholder="请输入联系人" @select="handlePerson" :disabled="!isEditList">
-                  </el-autocomplete>
-                </el-form-item>
-              </el-col>
-              <el-col :span="16">
-                <el-form-item label="" prop="buyContactNumber" label-width="0px" class="margin-b-0 wid100">
-                  <el-input v-model="formData.data.buyContactNumber" placeholder="请输入联系人电话" :disabled="!isEditList" />
-                </el-form-item>
-              </el-col>
-            </el-row>
-          </el-form-item>
+            <el-form-item label="详细地址" prop="buyAddress" class="wid100">
+              <el-input v-model="formData.data.buyAddress" type="textarea" :disabled="!isEditList">
+              </el-input>
+            </el-form-item>
+            <el-form-item label="联系人" class="wid100" required>
+              <el-row style="width: 100%">
+                <el-col :span="8">
+                  <el-form-item label="" prop="buyContactName" label-width="0px" class="margin-b-0 wid100">
+                    <el-autocomplete v-model="formData.data.buyContactName" :fetch-suggestions="querySearchPerson" style="width:100%" clearable
+                                     class="inline-input w-50" placeholder="请输入联系人" @select="handlePerson" :disabled="!isEditList">
+                    </el-autocomplete>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="16">
+                  <el-form-item label="" prop="buyContactNumber" label-width="0px" class="margin-b-0 wid100">
+                    <el-input v-model="formData.data.buyContactNumber" placeholder="请输入联系人电话" :disabled="!isEditList" />
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </el-form-item>
+          </div>
         </div>
       </template>
 
@@ -621,6 +639,7 @@ const copyType = ref(1);
 const copyContract = ref(false);
 const indexValue = ref(-1);
 const openSelectMaterial = ref(false);
+const isShowOther = ref(false);
 const formData = reactive({
   data: {
     contractType: "2",
@@ -1212,13 +1231,13 @@ const formConfig = computed(() => {
     },
     {
       type: "title",
-      title: "订单模板",
+      title: "合同条款",
       haveLine: true,
     },
     {
       type: "select",
       prop: "contractTemplateId",
-      label: "订单模板",
+      label: "合同条款",
       data: templateList.value,
       itemWidth: 50,
       fn: (val) => {

+ 46 - 7
src/components/process/SF/CostControl.vue

@@ -95,7 +95,7 @@
                 <el-form-item :prop="'costControlDetailList.' + $index + '.currentPrepaidTax'" :rules="rules.currentPrepaidTax" :inline-message="true"
                               class="margin-b-0">
                   <el-input-number onmousewheel="return false;" v-model="row.currentPrepaidTax" placeholder="请输入" style="width: 100%" :precision="2"
-                                   :controls="false" :min="0" />
+                                   :controls="false" :min="0" @change="(val)=>handleChangeMoney(val,$index,'currentPrepaidTax')" />
                 </el-form-item>
               </template>
             </el-table-column>
@@ -104,7 +104,7 @@
                 <el-form-item :prop="'costControlDetailList.' + $index + '.currentPrepaid'" :rules="rules.currentPrepaid" :inline-message="true"
                               class="margin-b-0">
                   <el-input-number onmousewheel="return false;" v-model="row.currentPrepaid" placeholder="请输入" style="width: 100%" :precision="2"
-                                   :controls="false" :min="0" />
+                                   :controls="false" :min="0" @change="(val)=>handleChangeMoney(val,$index,'currentPrepaid')" />
                 </el-form-item>
               </template>
             </el-table-column>
@@ -642,6 +642,18 @@ const formConfig = computed(() => {
               };
             });
           });
+
+        if (
+          currentCostTypeData.value &&
+          currentCostTypeData.value.name.indexOf("快递") != -1
+        ) {
+          for (let i = 0; i < formData.data.costControlDetailList.length; i++) {
+            const row = formData.data.costControlDetailList[i];
+            row.currentPayable =
+              val == "1" ? row.currentPrepaidTax : row.currentPrepaid;
+            handleGetRemark(i);
+          }
+        }
       },
       isShow: isShowAtt("isPublicTransfer", "mainObj"),
     },
@@ -983,6 +995,17 @@ const changeCostType = (val) => {
   }
 };
 
+const handleChangeMoney = (val, index, att) => {
+  let row = formData.data.costControlDetailList[index];
+  if (formData.data.isPublicTransfer) {
+    if (formData.data.isPublicTransfer == "1") {
+      row.currentPayable = row.currentPrepaidTax;
+    } else if (formData.data.isPublicTransfer == "0") {
+      row.currentPayable = row.currentPrepaid;
+    }
+    handleGetRemark(index);
+  }
+};
 const changeSelectData = (val, index, type) => {
   // type 1:快递公司 2:店铺  3:供应商  4:收款单位
   let current = null;
@@ -1076,7 +1099,7 @@ const getDict = () => {
         value: item.id,
       };
     });
-    if (res.rows && res.rows.length > 0) {
+    if (res.rows && res.rows.length > 0 && !route.query.businessId) {
       formData.data.costType = res.rows[0].id;
       changeCostType(formData.data.costType);
     }
@@ -1325,7 +1348,8 @@ const disabledFn = (date) => {
   // 当前日期
   let current = moment(date).format("YYYY-MM");
   // 禁用已选日期和比当前日期小的
-  return moment(current).add(1, "month").isBefore(moment());
+  // return moment(current).add(1, "month").isBefore(moment());
+  return moment(current).isAfter(moment());
 };
 
 const handleSubmit = async (isStag = false) => {
@@ -1381,9 +1405,17 @@ const getCheckBoxMap = (val) => {
 
 const getAllData = (businessId) => {
   proxy.post("/costControl/detail", { id: businessId }).then(async (res) => {
-    formData.data = res;
+    if (res && res.costControlDetailList && res.costControlDetailList.length) {
+      res.costControlDetailList.map((x) => {
+        x.fileList = [];
+        x.invoiceFileList = [];
+      });
+    }
+    for (const key in res) {
+      formData.data[key] = res[key];
+    }
     getDeptData(formData.data.companyId);
-    changeCostType(formData.data.costType);
+    getCheckBoxMap(formData.data.costType);
     if (
       formData.data.costControlDetailList &&
       formData.data.costControlDetailList.length > 0
@@ -1411,7 +1443,7 @@ const getAllData = (businessId) => {
                 };
               });
             ele.invoiceFileList = productAllFile[ele.id]
-              .filter((item) => item.businessType == "0")
+              .filter((item) => item.businessType == "10")
               .map((item) => {
                 return {
                   ...item,
@@ -1437,6 +1469,13 @@ onMounted(() => {
   if (route.query && route.query.businessId && route.query.processType) {
     let businessId = route.query.businessId;
     getAllData(businessId);
+  } else if (
+    route.query &&
+    route.query.businessId &&
+    !route.query.processType
+  ) {
+    let businessId = route.query.businessId;
+    getAllData(businessId);
   }
 });
 </script>

+ 39 - 39
src/components/process/SF/Purchase.vue

@@ -496,25 +496,25 @@ const formConfig = computed(() => {
       label: "",
       itemWidth: 50,
     },
-    {
-      type: "title",
-      title: "付款信息",
-      haveLine: true,
-    },
-    {
-      type: "select",
-      prop: "paymentMethod",
-      label: "付款方式",
-      data: fundsPaymentMethod.value,
-      itemWidth: 25,
-    },
-    {
-      type: "select",
-      prop: "invoiceType",
-      label: "发票类型",
-      data: invoiceType.value,
-      itemWidth: 25,
-    },
+    // {
+    //   type: "title",
+    //   title: "付款信息",
+    //   haveLine: true,
+    // },
+    // {
+    //   type: "select",
+    //   prop: "paymentMethod",
+    //   label: "付款方式",
+    //   data: fundsPaymentMethod.value,
+    //   itemWidth: 25,
+    // },
+    // {
+    //   type: "select",
+    //   prop: "invoiceType",
+    //   label: "发票类型",
+    //   data: invoiceType.value,
+    //   itemWidth: 25,
+    // },
     {
       type: "title",
       title: "交付信息",
@@ -528,24 +528,24 @@ const formConfig = computed(() => {
     //   data: deliveryType.value,
     //   itemWidth: 50,
     // },
-    {
-      type: "select",
-      prop: "deliveryType",
-      label: "交货类型",
-      border: true,
-      data: deliveryType.value,
-      itemWidth: 33.33,
-      fn: () => {
-        changeAddress();
-      },
-    },
-    {
-      type: "input",
-      prop: "address",
-      itemType: "text",
-      label: "详细地址",
-      itemWidth: 33.33,
-    },
+    // {
+    //   type: "select",
+    //   prop: "deliveryType",
+    //   label: "交货类型",
+    //   border: true,
+    //   data: deliveryType.value,
+    //   itemWidth: 33.33,
+    //   fn: () => {
+    //     changeAddress();
+    //   },
+    // },
+    // {
+    //   type: "input",
+    //   prop: "address",
+    //   itemType: "text",
+    //   label: "详细地址",
+    //   itemWidth: 33.33,
+    // },
     {
       type: "date",
       itemType: "date",
@@ -655,13 +655,13 @@ const formConfig = computed(() => {
     },
     {
       type: "title",
-      title: "订单模板",
+      title: "合同条款",
       haveLine: true,
     },
     {
       type: "select",
       prop: "contractTemplateId",
-      label: "订单模板",
+      label: "合同条款",
       data: templateList.value,
       itemWidth: 50,
       fn: (val) => {

+ 26 - 18
src/components/product/SelectMaterial.vue

@@ -345,8 +345,32 @@ const config = computed(() => {
       attrs: {
         label: "物料名称",
         slot: "name",
-        "min-width": 300,
+        "min-width": 200,
+      },
+    },
+    {
+      attrs: {
+        label: "颜色",
+        prop: "color",
+        width: 150,
+      },
+    },
+    {
+      attrs: {
+        label: "尺寸",
+        slot: "size",
+        width: 130,
+      },
+    },
+    {
+      attrs: {
+        label: "单位",
+        prop: "unit",
+        width: 80,
       },
+      // render(val) {
+      //   return proxy.dictKeyValue(val, materialUnitData.value);
+      // },
     },
     {
       attrs: {
@@ -369,23 +393,7 @@ const config = computed(() => {
     //     width: 120,
     //   },
     // },
-    {
-      attrs: {
-        label: "单位",
-        prop: "unit",
-        width: 80,
-      },
-      // render(val) {
-      //   return proxy.dictKeyValue(val, materialUnitData.value);
-      // },
-    },
-    {
-      attrs: {
-        label: "尺寸",
-        slot: "size",
-        width: 130,
-      },
-    },
+
     {
       attrs: {
         label: "净重",

+ 664 - 0
src/views/EHSD/procurement/arrivalRecord/index.vue

@@ -0,0 +1,664 @@
+<template>
+  <div class="pageIndexClass">
+    <div class="content">
+      <byTable :source="sourceList.data" :pagination="sourceList.pagination" :config="config" :loading="loading" :selectConfig="selectConfig"
+               highlight-current-row :action-list="[
+      
+        ]" @get-list="getList">
+
+        <template #pic="{item}">
+          <div style="width: 100%">
+            <img v-if="item.fileUrl" :src="item.fileUrl" class="pic" @click="openImg(item.fileUrl)" />
+          </div>
+        </template>
+
+      </byTable>
+    </div>
+
+    <el-dialog title="其他入库" v-if="dialogVisible" v-model="dialogVisible" width="1200" v-loading="loadingDialog">
+      <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="submit">
+        <template #details>
+          <div style="width: 100%">
+            <el-button type="primary" @click="openProduct = true" :disabled="['100','103'].includes(formData.data.type)">添加明细</el-button>
+            <el-table :data="formData.data.list" style="width: 100%; margin-top: 16px">
+              <el-table-column label="图片" width="70" align="center">
+                <template #default="{ row, $index }">
+                  <div style="width: 100%">
+                    <img v-if="row.fileUrl" :src="row.fileUrl" class="pic" @click="handleClickFile(row.fileUrl)" />
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column prop="productCode" label="编码" width="160" />
+              <el-table-column prop="productName" label="名称" min-width="220" />
+              <el-table-column label="规格尺寸 (cm)" min-width="160">
+                <template #default="{ row, $index }">
+                  <div style="width: 100%">
+                    {{row.productLength}} * {{row.productWidth}} * {{row.productHeight}}
+                  </div>
+                </template>
+              </el-table-column>
+              <!-- <el-table-column prop="productUnit" label="单位" width="100" :formatter="
+                  (row) => dictKeyValue(row.productUnit, materialUnitData)
+                " /> -->
+              <el-table-column label="入库数量" width="140">
+                <template #default="{ row, $index }">
+                  <div style="width: 100%">
+                    <el-form-item :prop="'list.' + $index + '.quantity'" :rules="rules.quantity" :inline-message="true" class="margin-b-0">
+                      <el-input-number v-model="row.quantity" placeholder="请输入数量" style="width: 100%" :precision="0" :controls="false" :min="1"
+                                       onmousewheel="return false;" :disabled="['100','103'].includes(formData.data.type)" />
+                    </el-form-item>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column align="center" label="操作" width="80" fixed="right" v-if="!['100','103'].includes(formData.data.type)">
+                <template #default="{ row, $index }">
+                  <el-button type="primary" link @click="handleDelete($index)">删除</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </div>
+        </template>
+      </byForm>
+      <template #footer>
+        <el-button @click="dialogVisible = false" size="default">取 消</el-button>
+        <el-button type="primary" @click="submitForm()" size="default">确 定</el-button>
+      </template>
+    </el-dialog>
+
+    <el-dialog v-if="openProduct" v-model="openProduct" title="商品选择" width="90%" append-to-body>
+      <SelectAllGood @selectGood="selectGood"></SelectAllGood>
+      <!-- <SelectMaterial @selectMaterial="selectMaterial"></SelectMaterial> -->
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { computed, ref } from "vue";
+import byTable from "@/components/byTable/index";
+import byForm from "@/components/byForm/index";
+import { ElMessage } from "element-plus";
+import SelectAllGood from "@/components/product/SelectAllGood";
+// import SelectMaterial from "@/components/product/SelectMaterial.vue";
+const { proxy } = getCurrentInstance();
+const warehouseList = ref([]);
+const warehouseListOne = ref([]);
+const materialUnitData = computed(
+  () => proxy.useUserStore().allDict["material_unit"]
+);
+const inBoundReason = ref([
+  {
+    label: "借用归还",
+    value: "100",
+  },
+  {
+    label: "退料入库",
+    value: "101",
+  },
+  {
+    label: "废料入库",
+    value: "102",
+  },
+  {
+    label: "丢件寻回",
+    value: "103",
+  },
+  {
+    label: "超领归还",
+    value: "108",
+  },
+  {
+    label: "错领归还",
+    value: "109",
+  },
+  {
+    label: "其他入库",
+    value: "110",
+  },
+]);
+const produceOrder = ref([]);
+const lendData = ref([]);
+const lendDataOne = ref([]);
+const sourceList = ref({
+  data: [],
+  pagination: {
+    total: 0,
+    pageNum: 1,
+    pageSize: 10,
+    keyword: "",
+    warehouseId: "",
+    type: "",
+    opType: "1",
+  },
+});
+const loading = ref(false);
+const selectConfig = computed(() => {
+  return [
+    // {
+    //   label: "业务公司",
+    //   prop: "companyId",
+    //   data: proxy.useUserStore().allDict["list_company_data"],
+    // },
+    // {
+    //   label: "仓库名称",
+    //   prop: "warehouseId",
+    //   data: warehouseList.value,
+    // },
+    // {
+    //   label: "入库原因",
+    //   prop: "type",
+    //   data: inBoundReason.value,
+    // },
+  ];
+});
+const config = computed(() => {
+  return [
+    {
+      attrs: {
+        label: "业务公司",
+        prop: "companyName",
+        width: 110,
+        fixed: "left",
+      },
+    },
+    {
+      attrs: {
+        label: "采购单号",
+        prop: "code",
+        width: 120,
+        fixed: "left",
+      },
+    },
+
+    {
+      attrs: {
+        label: "供应商",
+        prop: "warehouseName",
+        width: 150,
+        fixed: "left",
+      },
+    },
+    {
+      attrs: {
+        label: "到货日期",
+        prop: "productCustomCode",
+        width: 100,
+      },
+    },
+    {
+      attrs: {
+        label: "商品图片",
+        slot: "pic",
+        align: "center",
+        width: 80,
+      },
+    },
+    {
+      attrs: {
+        label: "商品编码",
+        prop: "productCustomCode",
+        width: 160,
+      },
+    },
+    {
+      attrs: {
+        label: "商品名称",
+        prop: "productName",
+        "min-width": 220,
+      },
+    },
+    {
+      attrs: {
+        label: "规格尺寸 (cm)",
+        slot: "size",
+        width: 130,
+      },
+    },
+    {
+      attrs: {
+        label: "到货数量",
+        prop: "productCustomCode",
+        width: 100,
+      },
+    },
+    {
+      attrs: {
+        label: "实际入库数量",
+        prop: "productCustomCode",
+        width: 110,
+      },
+    },
+    {
+      attrs: {
+        label: "入库状态",
+        prop: "productCustomCode",
+        width: 100,
+      },
+    },
+    {
+      attrs: {
+        label: "账期",
+        prop: "productCustomCode",
+        width: 100,
+      },
+    },
+  ];
+});
+const getDict = () => {
+  proxy.post("/warehouse/page", { pageNum: 1, pageSize: 999 }).then((res) => {
+    if (res.rows && res.rows.length > 0) {
+      warehouseList.value = res.rows.map((item) => {
+        return {
+          label: item.name,
+          value: item.id,
+        };
+      });
+    }
+  });
+
+  proxy
+    .post("produceOrder/page", {
+      pageNum: 1,
+      pageSize: 9999,
+      neProduceStatus: "10,99",
+    })
+    .then((res) => {
+      produceOrder.value = res.rows.map((x) => ({
+        label: x.code,
+        value: x.id,
+      }));
+      produceOrder.value.unshift({
+        label: "无",
+        value: -1,
+      });
+    });
+
+  proxy
+    .post("/stockJournal/page", {
+      pageNum: 1,
+      pageSize: 9999,
+      isRestitution: 0,
+      type: "3",
+    })
+    .then((res) => {
+      lendData.value = res.rows.map((x) => ({
+        label:
+          x.code +
+          " " +
+          x.expectRestitutionTime.slice(0, 10) +
+          " " +
+          x.exWarehousePerson +
+          " " +
+          x.remarks,
+        value: x.id,
+      }));
+    });
+
+  proxy
+    .post("/reportLossesDetails/page", {
+      pageNum: 1,
+      pageSize: 9999,
+      type: "2",
+    })
+    .then((res) => {
+      lendDataOne.value = res.rows.map((x) => ({
+        ...x,
+        label:
+          // x.code +
+          // " " +
+          x.repoTime.slice(0, 10) + " " + x.respUserName + " 数量" + x.quantity,
+        value: x.id,
+      }));
+    });
+};
+const getList = async (req) => {
+  sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
+  loading.value = true;
+  proxy
+    .post("/stockJournalDetails/page", sourceList.value.pagination)
+    .then((res) => {
+      sourceList.value.data = res.rows;
+      sourceList.value.pagination.total = res.total;
+      setTimeout(() => {
+        loading.value = false;
+      }, 200);
+
+      const productIdList = res.rows.map((x) => x.productId);
+      // 请求文件数据并回显
+      if (productIdList.length > 0) {
+        proxy.getFileData({
+          businessIdList: productIdList,
+          data: sourceList.value.data,
+          att: "productId",
+          businessType: "0",
+          fileAtt: "fileList",
+          filePathAtt: "fileUrl",
+        });
+      }
+    });
+};
+getDict();
+getList();
+const dialogVisible = ref(false);
+const loadingDialog = ref(false);
+const submit = ref(null);
+const openProduct = ref(false);
+const formOption = reactive({
+  inline: true,
+  labelWidth: 100,
+  itemWidth: 100,
+  rules: [],
+});
+const formData = reactive({
+  data: {},
+});
+const formConfig = computed(() => {
+  return [
+    {
+      type: "title1",
+      title: "基本信息",
+    },
+    {
+      type: "treeSelect",
+      prop: "companyId",
+      label: "业务公司",
+      data: proxy.useUserStore().allDict["tree_company_data"],
+      propsTreeLabel: "deptName",
+      propsTreeValue: "deptId",
+      itemWidth: 50,
+      fn: (val) => {
+        proxy
+          .post("/warehouse/page", {
+            pageNum: 1,
+            pageSize: 999,
+            companyId: val,
+          })
+          .then((res) => {
+            if (res.rows && res.rows.length > 0) {
+              warehouseListOne.value = res.rows.map((item) => {
+                return {
+                  label: item.name,
+                  value: item.id,
+                };
+              });
+            }
+          });
+      },
+    },
+    {
+      type: "select",
+      prop: "warehouseId",
+      label: "仓库名称",
+      required: true,
+      data: warehouseListOne.value,
+      itemWidth: 50,
+    },
+    {
+      type: "input",
+      prop: "exWarehousePerson",
+      label: "申请入库人",
+      itemWidth: 50,
+    },
+    {
+      type: "select",
+      prop: "type",
+      label: "入库原因",
+      required: true,
+      data: inBoundReason.value,
+      fn: (val) => {
+        formData.data.list = [];
+        if (["101", "102", "108", "109", "110"].includes(val)) {
+          formData.data.borrowId = "";
+          formData.data.loseId = "";
+        } else if (val == "103") {
+          formData.data.borrowId = "";
+          formData.data.prodOrderId = "";
+        } else {
+          formData.data.loseId = "";
+          formData.data.prodOrderId = "";
+        }
+      },
+      itemWidth: 50,
+    },
+    {
+      type: "select",
+      prop: "prodOrderId",
+      label: "生产订单",
+      data: produceOrder.value,
+      filterable: true,
+      itemWidth: 50,
+      isShow: ["101", "102", "108", "109", "110"].includes(formData.data.type),
+    },
+    {
+      type: "select",
+      prop: "borrowId",
+      label: "借出单",
+      data: lendData.value,
+      filterable: true,
+      itemWidth: 50,
+      isShow: formData.data.type == "100",
+      fn: (val) => {
+        if (val) {
+          proxy.post("/stockJournal/detail", { id: val }).then((res) => {
+            if (res.list && res.list.length < 1) {
+              return;
+            }
+            let ids = res.list.map((x) => x.productId);
+            formData.data.list = res.list.map((x) => ({
+              fileUrl: "",
+              productCode: x.productCode,
+              productId: x.productId,
+              productName: x.productName,
+              productLength: x.productLength,
+              productWidth: x.productWidth,
+              productHeight: x.productHeight,
+              quantity: x.quantity,
+            }));
+            proxy.getFileData({
+              businessIdList: ids,
+              data: formData.data.list,
+              att: "productId",
+              businessType: "0",
+              fileAtt: "fileList",
+              filePathAtt: "fileUrl",
+            });
+          });
+        }
+      },
+    },
+    {
+      type: "select",
+      prop: "loseId",
+      label: "丢件单",
+      data: lendDataOne.value,
+      filterable: true,
+      itemWidth: 50,
+      isShow: formData.data.type == "103",
+      fn: (val) => {
+        const current = lendDataOne.value.find((x) => x.value == val);
+        if (current && current.materialId) {
+          let ids = [current.materialId];
+          formData.data.list = [
+            {
+              fileUrl: "",
+              productCode: current.materialCode,
+              productId: current.materialId,
+              productName: current.materialName,
+              productLength: current.materialLength,
+              productWidth: current.materialWidth,
+              productHeight: current.materialHeight,
+              quantity: current.quantity,
+            },
+          ];
+          proxy.getFileData({
+            businessIdList: ids,
+            data: formData.data.list,
+            att: "productId",
+            businessType: "0",
+            fileAtt: "fileList",
+            filePathAtt: "fileUrl",
+          });
+        }
+      },
+    },
+    {
+      type: "input",
+      itemType: "textarea",
+      prop: "remarks",
+      label: "备注",
+      itemWidth: 100,
+    },
+    {
+      type: "slot",
+      slotName: "details",
+      label: "入库明细",
+    },
+  ];
+});
+const rules = ref({
+  companyId: [{ required: true, message: "请选择业务公司", trigger: "change" }],
+  warehouseId: [{ required: true, message: "请选择仓库", trigger: "change" }],
+  exWarehousePerson: [
+    { required: true, message: "请输入领料人", trigger: "blur" },
+  ],
+  type: [{ required: true, message: "请选择入库原因", trigger: "change" }],
+  prodOrderId: [
+    { required: true, message: "请选择生产订单", trigger: "change" },
+  ],
+  borrowId: [
+    { required: true, message: "请选择借用出库单", trigger: "change" },
+  ],
+  loseId: [{ required: true, message: "请选择丢件单", trigger: "change" }],
+  quantity: [{ required: true, message: "请输入入库数量", trigger: "blur" }],
+  remarks: [{ required: true, message: "请输入备注", trigger: "blur" }],
+});
+const openModal = () => {
+  getDict();
+  formData.data = {
+    type: "",
+    list: [],
+  };
+  loadingDialog.value = false;
+  dialogVisible.value = true;
+};
+const pushGoods = (goods) => {
+  if (goods && goods.length > 0) {
+    let afterFiltering = [];
+    if (formData.data.list && formData.data.list.length > 0) {
+      afterFiltering = goods.filter((item) => {
+        let data = formData.data.list.filter(
+          (itemProduct) => itemProduct.productId === item.id
+        );
+        if (data && data.length > 0) {
+          return false;
+        }
+        return true;
+      });
+    } else {
+      afterFiltering = goods;
+    }
+    formData.data.list = formData.data.list.concat(
+      afterFiltering.map((item) => {
+        return {
+          productCode: item.code,
+          productId: item.id,
+          productName: item.name,
+          productSpec: item.spec,
+          productUnit: item.unit,
+          quantity: undefined,
+        };
+      })
+    );
+    ElMessage({
+      message: "添加成功!",
+      type: "success",
+    });
+    openProduct.value = false;
+  } else {
+    ElMessage("请选择至少一件产品");
+  }
+};
+const selectMaterial = (row) => {
+  let flag = formData.data.list.some((x) => x.productId == row.id);
+  if (!flag) {
+    formData.data.list.push({
+      productCode: row.customCode,
+      productId: row.id,
+      productName: row.name,
+      productSpec: row.spec,
+      productUnit: row.unit,
+      quantity: null,
+    });
+    proxy.msgTip("选择成功");
+  } else {
+    proxy.msgTip("该物料已选择", 2);
+  }
+};
+
+const selectGood = (row) => {
+  let fileUrl = "";
+  if (row.fileList && row.fileList.length > 0) {
+    fileUrl = row.fileList[0].fileUrl;
+  }
+  formData.data.list.push({
+    fileUrl: fileUrl,
+    productCode: row.customCode,
+    productId: row.id,
+    productName: row.name,
+    productLength: row["length"],
+    productWidth: row.width,
+    productHeight: row.height,
+    quantity: null,
+  });
+  proxy.msgTip("选择成功");
+};
+const submitForm = () => {
+  submit.value.handleSubmit(() => {
+    if (!(formData.data.list.length > 0)) {
+      return proxy.msgTip("请添加入库明细");
+    }
+    loadingDialog.value = true;
+    proxy.post("/stock/add", formData.data).then(
+      () => {
+        ElMessage({
+          message: "提交成功",
+          type: "success",
+        });
+        dialogVisible.value = false;
+        getList();
+      },
+      (err) => {
+        console.log(err);
+        loadingDialog.value = false;
+      }
+    );
+  });
+};
+const handleDelete = (index) => {
+  formData.data.list.splice(index, 1);
+};
+const acquireSelectList = () => {
+  let data = [];
+  if (formData.data.list && formData.data.list.length > 0) {
+    data = formData.data.list.map((item) => {
+      return {
+        id: item.productId,
+        name: item.productName,
+      };
+    });
+  }
+  return data;
+};
+
+const handleClickFile = (fileUrl) => {
+  window.open(fileUrl, "_blank");
+};
+</script>
+
+<style lang="scss" scoped>
+.tenant {
+  padding: 20px;
+}
+::v-deep(.el-input-number .el-input__inner) {
+  text-align: left;
+}
+</style>

+ 15 - 0
src/views/EHSD/procurement/purchasedEHSD/index.vue

@@ -133,6 +133,21 @@
               </el-table-column>
               <!-- <el-table-column label="采购数量" prop="purchaseQuantity" width="100" /> -->
               <el-table-column label="到货数量" prop="quantity" width="100" />
+              <el-table-column label="实际入库数量" prop="quantity" width="110" />
+              <el-table-column label="入库状态" prop="quantity" width="100" />
+              <el-table-column label="账期" width="150">
+                <template #default="{ row, $index }">
+                  <div style="width: 100%">
+                    <el-form-item :prop="'arrivalDetailListOne.' + $index + '.accountPeriod'" :rules="rules.accountPeriod" :inline-message="true"
+                                  class="margin-b-0">
+                      <el-date-picker v-model="row.accountPeriod" type="month" placeholder="请选择" style="width: 100%" value-format="YYYY-MM"
+                                      :disabled-date="disabledFn" :clearable="false" />
+
+                    </el-form-item>
+                  </div>
+                </template>
+              </el-table-column>
+
             </el-table>
           </div>
         </el-tab-pane>

+ 49 - 8
src/views/EHSD/productLibrary/companyProduct/index.vue

@@ -46,7 +46,7 @@
       </byTable>
     </div>
 
-    <el-dialog :title="modalType == 'add' ? '添加产品' : '编辑产品'" v-model="dialogVisible" width="80%" destroy-on-close>
+    <el-dialog :title="modalType == 'add' ? '添加产品' : '编辑产品'" v-model="dialogVisible" width="90%" destroy-on-close>
       <div class="public_height_dialog">
         <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="formDom" v-loading="submitLoading">
           <template #nameEnglish>
@@ -70,12 +70,12 @@
 
           <template #rawMaterialIdSlot>
             <div style="width:100%;display:flex">
-              <div style="width:calc(100% - 105px)">
+              <div style="width:calc(100% - 65px)">
                 <el-form-item label="原材料" prop="rawMaterialId" class="margin-b-0">
                   <el-input disabled v-model="formData.data.rawMaterialIdLabel" placeholder="请选择"></el-input>
                 </el-form-item>
               </div>
-              <el-button type="primary" style="width:88px;margin-left:15px" @click="openSelectRawMaterial = true" plain>选择</el-button>
+              <el-button type="primary" style="width:50px;margin-left:15px" @click="openSelectRawMaterial = true" plain>选择</el-button>
             </div>
           </template>
 
@@ -130,6 +130,14 @@
               <el-table :data="formData.data.productBomDetailList" style="width: 100%; margin-top: 16px">
                 <el-table-column prop="materialName" label="物料名称" />
                 <el-table-column prop="materialCode" label="物料编码" />
+                <el-table-column label="规格尺寸 (cm)" width="140">
+                  <template #default="{ row, $index }">
+                    <div style="width: 100%" v-if="row.materialLength&&row.materialWidth && row.materialHeight">
+                      {{row.materialLength}}*{{row.materialWidth}}*{{row.materialHeight}}
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="materialColor" label="颜色" width="170" />
                 <el-table-column label="数量" width="150">
                   <template #default="{ row, $index }">
                     <div style="width: 100%">
@@ -351,7 +359,15 @@
                     <el-table :data="formData.bomData.productBomDetailList" style="width: 100%;">
                       <el-table-column prop="materialName" label="物料名称" min-width="130" />
                       <el-table-column prop="materialCode" label="物料编码" width="150" />
-                      <el-table-column label="数量" width="150">
+                      <el-table-column label="规格尺寸 (cm)" width="140">
+                        <template #default="{ row, $index }">
+                          <div style="width: 100%" v-if="row.materialLength&&row.materialWidth && row.materialHeight">
+                            {{row.materialLength}}*{{row.materialWidth}}*{{row.materialHeight}}
+                          </div>
+                        </template>
+                      </el-table-column>
+                      <el-table-column prop="materialColor" label="颜色" width="150" />
+                      <el-table-column label="数量" width="100">
                         <template #default="{ row, $index }">
                           <div style="width: 100%">
                             <el-form-item :prop="'productBomDetailList.' + $index + '.quantity'" :rules="bomRules.quantity" :inline-message="true"
@@ -912,7 +928,21 @@ const formConfig = computed(() => {
       type: "slot",
       slotName: "rawMaterialIdSlot",
       label: "",
-      itemWidth: 50,
+      itemWidth: 33.33,
+      disabled: true,
+    },
+    {
+      type: "input",
+      prop: "rawMaterialSize",
+      label: "原材料尺寸",
+      itemWidth: 33.33,
+      disabled: true,
+    },
+    {
+      type: "input",
+      prop: "rawMaterialColor",
+      label: "原材料颜色",
+      itemWidth: 33.33,
       disabled: true,
     },
 
@@ -950,7 +980,7 @@ const formConfig = computed(() => {
       slotName: "color",
       prop: "",
       label: "",
-      itemWidth: 50,
+      itemWidth: 33.33,
       disabled: false,
     },
     {
@@ -958,7 +988,7 @@ const formConfig = computed(() => {
       slotName: "size",
       prop: "",
       label: "",
-      itemWidth: 50,
+      itemWidth: 33.33,
       disabled: false,
     },
     // {
@@ -998,7 +1028,7 @@ const formConfig = computed(() => {
       precision: 2,
       min: 0,
       controls: false,
-      itemWidth: 50,
+      itemWidth: 33.33,
     },
     // {
     //   type: "input",
@@ -1218,6 +1248,7 @@ const getDtl = (row) => {
     formData.data = res;
     formData.data.rawMaterialIdLabel =
       res.rawMaterialName + "," + res.rawMaterialCode;
+    formData.data.rawMaterialSize = `${res.rawMaterialLength}*${res.rawMaterialWidth}*${res.rawMaterialHeight}`;
     formData.data.productBomDetailList =
       formData.data.productBomDetailList.filter((x) => x.type == 2);
 
@@ -1423,6 +1454,10 @@ const selectMaterial = (row) => {
         type: 2,
         materialName: row.name,
         materialCode: row.customCode,
+        materialLength: row["length"],
+        materialWidth: row.width,
+        materialHeight: row.height,
+        materialColor: row.color,
         materialId: row.id,
         quantity: null,
       });
@@ -1439,6 +1474,10 @@ const selectMaterial = (row) => {
         type: 2,
         materialName: row.name,
         materialCode: row.customCode,
+        materialLength: row["length"],
+        materialWidth: row.width,
+        materialHeight: row.height,
+        materialColor: row.color,
         materialId: row.id,
         quantity: null,
       });
@@ -1599,6 +1638,8 @@ const openSelectRawMaterial = ref(false);
 const selectRawMaterial = (row) => {
   formData.data.rawMaterialId = row.id;
   formData.data.rawMaterialIdLabel = row.name + "," + row.customCode;
+  formData.data.rawMaterialSize = `${row["length"]}*${row.width}*${row.height}`;
+  formData.data.rawMaterialColor = row.color;
   openSelectRawMaterial.value = false;
 };
 </script>

+ 89 - 22
src/views/EHSD/productLibrary/waitCreateProduct/index.vue

@@ -25,7 +25,7 @@
       </template>
     </byTable>
 
-    <el-dialog :title="modalType == 'add' ? '添加产品' : '编辑产品'" v-model="dialogVisible" width="80%" destroy-on-close>
+    <el-dialog :title="modalType == 'add' ? '添加产品' : '编辑产品'" v-model="dialogVisible" width="90%" destroy-on-close>
       <div class="public_height_dialog">
         <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="formDom" v-loading="submitLoading">
           <template #nameEnglish>
@@ -47,6 +47,17 @@
             </div>
           </template>
 
+          <template #rawMaterialIdSlot>
+            <div style="width:100%;display:flex">
+              <div style="width:calc(100% - 65px)">
+                <el-form-item label="原材料" prop="rawMaterialId" class="margin-b-0">
+                  <el-input disabled v-model="formData.data.rawMaterialIdLabel" placeholder="请选择"></el-input>
+                </el-form-item>
+              </div>
+              <el-button type="primary" style="width:50px;margin-left:15px" @click="openSelectRawMaterial = true" plain>选择</el-button>
+            </div>
+          </template>
+
           <template #color>
             <div style="width: 100%">
               <el-form-item label="颜色" class="margin-b-0 wid100">
@@ -98,6 +109,14 @@
               <el-table :data="formData.data.productBomDetailList" style="width: 100%; margin-top: 16px">
                 <el-table-column prop="productName" label="物料名称" />
                 <el-table-column prop="productCode" label="物料编码" />
+                <el-table-column label="规格尺寸 (cm)" width="140">
+                  <template #default="{ row, $index }">
+                    <div style="width: 100%" v-if="row.materialLength&&row.materialWidth && row.materialHeight">
+                      {{row.materialLength}}*{{row.materialWidth}}*{{row.materialHeight}}
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="materialColor" label="颜色" width="170" />
                 <el-table-column label="数量" width="150">
                   <template #default="{ row, $index }">
                     <div style="width: 100%">
@@ -256,6 +275,13 @@
       </template>
     </el-dialog>
 
+    <el-dialog :title="'原材料选择'" v-model="openSelectRawMaterial" width="90%" destroy-on-close>
+      <SelectMaterial :ancestors="100" @selectMaterial="selectRawMaterial"></SelectMaterial>
+      <template #footer>
+        <el-button @click="openSelectRawMaterial = false" size="defualt" v-debounce>取 消</el-button>
+      </template>
+    </el-dialog>
+
   </div>
 </template>
 
@@ -711,25 +737,46 @@ const formConfig = computed(() => {
       type: "title1",
       title: "主材",
     },
+    // {
+    //   type: "select",
+    //   prop: "rawMaterialId",
+    //   label: "原材料",
+    //   itemWidth: 50,
+    //   data: rawMaterialData.value,
+    //   filterable: true,
+    //   disabled: false,
+    //   fn: (val) => {
+    //     // let current = rawMaterialData.value.find((x) => x.value == val);
+    //     // if (current) {
+    //     //   formData.data.price = Number(
+    //     //     parseFloat(
+    //     //       current["length"] * current.width * current.price
+    //     //     ).toFixed(2)
+    //     //   );
+    //     // }
+    //     // getPriceData();
+    //   },
+    // },
+    {
+      type: "slot",
+      slotName: "rawMaterialIdSlot",
+      label: "",
+      itemWidth: 33.33,
+      disabled: true,
+    },
     {
-      type: "select",
-      prop: "rawMaterialId",
-      label: "原材料",
-      itemWidth: 50,
-      data: rawMaterialData.value,
-      filterable: true,
-      disabled: false,
-      fn: (val) => {
-        // let current = rawMaterialData.value.find((x) => x.value == val);
-        // if (current) {
-        //   formData.data.price = Number(
-        //     parseFloat(
-        //       current["length"] * current.width * current.price
-        //     ).toFixed(2)
-        //   );
-        // }
-        // getPriceData();
-      },
+      type: "input",
+      prop: "rawMaterialSize",
+      label: "原材料尺寸",
+      itemWidth: 33.33,
+      disabled: true,
+    },
+    {
+      type: "input",
+      prop: "rawMaterialColor",
+      label: "原材料颜色",
+      itemWidth: 33.33,
+      disabled: true,
     },
 
     // {
@@ -766,7 +813,7 @@ const formConfig = computed(() => {
       slotName: "color",
       prop: "",
       label: "",
-      itemWidth: 50,
+      itemWidth: 33.33,
       disabled: false,
     },
     {
@@ -774,7 +821,7 @@ const formConfig = computed(() => {
       slotName: "size",
       prop: "",
       label: "",
-      itemWidth: 50,
+      itemWidth: 33.33,
       disabled: false,
     },
     // {
@@ -814,7 +861,7 @@ const formConfig = computed(() => {
       precision: 2,
       min: 0,
       controls: false,
-      itemWidth: 50,
+      itemWidth: 33.33,
     },
     // {
     //   type: "input",
@@ -1008,6 +1055,7 @@ const getTechnologyData = () => {
     technologyData.value = res.rows;
   });
 };
+
 const getDtl = (row) => {
   modalType.value = "add";
   formData.data = {
@@ -1034,6 +1082,8 @@ const getDtl = (row) => {
     productBomDetailList:
       row.quotationProductBomList.filter((x) => x.type == 2) || [],
     productCustomInfoList: row.quotationProductCustomInfoList || [],
+    rawMaterialIdLabel: res.rawMaterialName + "," + res.rawMaterialCode,
+    rawMaterialSize: `${res.rawMaterialLength}*${res.rawMaterialWidth}*${res.rawMaterialHeight}`,
   };
   if (
     formData.data.productCustomInfoList &&
@@ -1099,6 +1149,10 @@ const selectMaterial = (row) => {
         type: 2,
         materialName: row.name,
         materialCode: row.customCode,
+        materialLength: row["length"],
+        materialWidth: row.width,
+        materialHeight: row.height,
+        materialColor: row.color,
         materialId: row.id,
         quantity: null,
       });
@@ -1115,6 +1169,10 @@ const selectMaterial = (row) => {
         type: 2,
         materialName: row.name,
         materialCode: row.customCode,
+        materialLength: row["length"],
+        materialWidth: row.width,
+        materialHeight: row.height,
+        materialColor: row.color,
         materialId: row.id,
         quantity: null,
       });
@@ -1206,6 +1264,15 @@ const handleClickUpload = async (att, flag) => {
   a.click();
   document.body.removeChild(a);
 };
+
+const openSelectRawMaterial = ref(false);
+const selectRawMaterial = (row) => {
+  formData.data.rawMaterialId = row.id;
+  formData.data.rawMaterialIdLabel = row.name + "," + row.customCode;
+  formData.data.rawMaterialSize = `${row["length"]}*${row.width}*${row.height}`;
+  formData.data.rawMaterialColor = row.color;
+  openSelectRawMaterial.value = false;
+};
 </script>
 
 <style lang="scss" scoped>

+ 6 - 0
src/views/EHSD/saleContract/accountingSubjects/index.vue

@@ -179,6 +179,11 @@ const formConfig = computed(() => {
       prop: "subjectsName",
       label: "名称",
     },
+    {
+      type: "input",
+      prop: "subjectsCode",
+      label: "代码",
+    },
     // {
     //   type: "select",
     //   label: "收付款类型",
@@ -219,6 +224,7 @@ const formConfig = computed(() => {
 });
 const rules = ref({
   subjectsName: [{ required: true, message: "请输入名称", trigger: "blur" }],
+  subjectsCode: [{ required: true, message: "请输入代码", trigger: "blur" }],
   sort: [{ required: true, message: "请输入科目排序", trigger: "blur" }],
   paymentTypeId: [
     { required: true, message: "请选择收费款类型", trigger: "change" },

+ 27 - 4
src/views/EHSD/saleContract/collectionRegistration/index.vue

@@ -395,16 +395,17 @@ const formConfig = computed(() => {
     },
     {
       type: "input",
-      prop: "accountOpening",
-      label: "付款账号",
+      prop: "openingBank",
+      label: "付款开户行",
       itemWidth: 33.33,
     },
     {
       type: "input",
-      prop: "openingBank",
-      label: "付款开户行",
+      prop: "accountOpening",
+      label: "付款账号",
       itemWidth: 33.33,
     },
+
     {
       type: "title1",
       title: "收款信息",
@@ -638,11 +639,33 @@ const handleSelectContrct = (row) => {
     contractTotal: row.amount,
     sumContractNotClaimMoney: row.unsettledAmount,
   });
+  if (
+    formData.data.claimContractList &&
+    formData.data.claimContractList.length == 1
+  ) {
+    formData.data.openingBank = row.paymentAccountBank;
+    formData.data.name = row.paymentAccountName;
+    formData.data.accountOpening = row.paymentAccountNumber;
+    formData.data.accountManagementId = row.shroffAccountId;
+    changeShroffAccount(formData.data.accountManagementId);
+  }
   return proxy.msgTip("选择成功", 1);
 };
 
 const handleRemove = (index) => {
   formData.data.claimContractList.splice(index, 1);
+  if (
+    formData.data.claimContractList &&
+    formData.data.claimContractList.length == 0
+  ) {
+    formData.data.openingBank = "";
+    formData.data.name = "";
+    formData.data.accountOpening = "";
+    formData.data.accountManagementId = "";
+    formData.data.myAccountName = "";
+    formData.data.myAccountOpening = "";
+    formData.data.myOpeningBank = "";
+  }
   return proxy.msgTip("删除成功", 1);
 };
 </script>

+ 3 - 3
src/views/EHSD/saleContract/contractEHSD/index.vue

@@ -316,9 +316,9 @@
       </template>
     </el-dialog>
 
-    <el-dialog :title="'发货申请'" v-model="salesOutBoundDialog" width="80%" destroy-on-close>
+    <el-dialog :title="'出库申请'" v-model="salesOutBoundDialog" width="80%" destroy-on-close>
       <el-tabs v-model="activeName" type="card" class="demo-tabs">
-        <el-tab-pane label="发货申请" name="1">
+        <el-tab-pane label="出库申请" name="1">
         </el-tab-pane>
         <el-tab-pane label="出库记录" name="2">
         </el-tab-pane>
@@ -1066,7 +1066,7 @@ const config = computed(() => {
           row.status == 30
             ? {
                 attrs: {
-                  label: "发货申请",
+                  label: "出库申请",
                   type: "primary",
                   text: true,
                 },

+ 124 - 29
src/views/EHSD/saleContract/shipmentRegistration/index.vue

@@ -18,9 +18,48 @@
 
       </byTable>
     </div>
-    <el-dialog :title="modalType == 'add' ? '添加客户联系人' : '装车登记'" v-model="dialogVisible" width="50%" destroy-on-close>
+    <el-dialog :title="modalType == 'add' ? '装车登记' : '装车登记'" v-model="dialogVisible" width="70%" destroy-on-close>
       <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="formDom" v-loading="submitLoading">
-
+        <template #commodity>
+          <div style="width: 100%">
+            <el-table :data="formData.data.outboundRecordList" style="width: 100%;">
+              <el-table-column label="商品图片" width="80">
+                <template #default="{ row }">
+                  <div v-if="row.fileUrl">
+                    <img :src="row.fileUrl" class="pic" @click="openImg(row.fileUrl)" />
+                  </div>
+                  <div v-else></div>
+                </template>
+              </el-table-column>
+              <el-table-column prop="productName" label="商品名称" min-width="150" />
+              <el-table-column prop="productCode" label="商品编码" width="200" />
+              <el-table-column label="规格尺寸 (cm)" width="130">
+                <template #default="{ row, $index }">
+                  <div style="width: 100%">
+                    {{row.productLength}} * {{row.productWidth}} * {{row.productHeight}}
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column prop="productColor" label="颜色" width="150" />
+              <!-- <el-table-column prop="productFrontalTexture" label="纹路" width="130"
+                             :formatter="(row) => dictKeyValue(row.productFrontalTexture, frontLinesData)" /> -->
+              <el-table-column prop="productNetWeight" label="净重" width="100" />
+              <el-table-column prop="productUnit" label="单位" width="100" />
+              <!-- <el-table-column label="订单数量" width="100" prop="orderQuantity" />
+            <el-table-column label="单价" width="100" prop="price" />
+            <el-table-column label="已发货数量" width="100" prop="saleOutboundQuantity" fixed="right" /> -->
+              <el-table-column prop="truckQuantity" label="装车数量" width="140" fixed="right">
+                <template #default="{ row, $index }">
+                  <el-form-item :prop="'outboundRecordList.' + $index + '.truckQuantity'" :rules="rules.truckQuantity" :inline-message="true"
+                                class="margin-b-0">
+                    <el-input-number onmousewheel="return false;" v-model="row.truckQuantity" placeholder="请输入" style="width: 100%" :precision="0"
+                                     :controls="false" :min="0" />
+                  </el-form-item>
+                </template>
+              </el-table-column>
+            </el-table>
+          </div>
+        </template>
       </byForm>
       <template #footer>
         <el-button @click="dialogVisible = false" size="defualt" v-debounce>取 消</el-button>
@@ -132,19 +171,17 @@ const config = computed(() => {
       },
       renderHTML(row) {
         return [
-          row.truckDate == null
-            ? {
-                attrs: {
-                  label: "装车登记",
-                  type: "primary",
-                  text: true,
-                },
-                el: "button",
-                click() {
-                  getDtl(row);
-                },
-              }
-            : {},
+          {
+            attrs: {
+              label: "装车登记",
+              type: "primary",
+              text: true,
+            },
+            el: "button",
+            click() {
+              getDtl(row);
+            },
+          },
           // {
           //   attrs: {
           //     label: "删除",
@@ -185,10 +222,14 @@ const formDom = ref(null);
 const formConfig = computed(() => {
   return [
     {
+      type: "title1",
+      title: "基本信息",
+    },
+    {
       type: "select",
       label: "出货开单员",
       prop: "billUserId",
-      itemWidth: 100,
+      itemWidth: 50,
       data: userList.value,
       clearable: false,
     },
@@ -197,7 +238,15 @@ const formConfig = computed(() => {
       itemType: "date",
       prop: "truckDate",
       label: "出货装车日期",
+      itemWidth: 50,
+    },
+    {
+      type: "input",
+      prop: "truckRemark",
+      label: "备注",
+      required: true,
       itemWidth: 100,
+      itemType: "textarea",
     },
     {
       type: "upload",
@@ -205,7 +254,7 @@ const formConfig = computed(() => {
       accept: "",
       prop: "fileList",
       label: "出货单图片",
-      itemWidth: 100,
+      itemWidth: 50,
     },
     {
       type: "upload",
@@ -213,15 +262,17 @@ const formConfig = computed(() => {
       accept: "",
       prop: "truckFileList",
       label: "出货装车图片",
-      itemWidth: 100,
+      itemWidth: 50,
     },
+
     {
-      type: "input",
-      prop: "truckRemark",
-      label: "备注",
-      required: true,
-      itemWidth: 100,
-      itemType: "textarea",
+      type: "title1",
+      title: "出货明细",
+    },
+    {
+      type: "slot",
+      slotName: "commodity",
+      label: "",
     },
   ];
 });
@@ -238,6 +289,9 @@ const rules = ref({
     { required: true, message: "请上传出货装车图片", trigger: "blur" },
   ],
   truckRemark: [{ required: true, message: "请输入备注", trigger: "blur" }],
+  truckQuantity: [
+    { required: true, message: "请输入装车数量", trigger: "blur" },
+  ],
 });
 
 const getDict = () => {
@@ -302,15 +356,56 @@ const getDtl = (row) => {
     billUserId: "",
     truckDate: "",
     truckRemark: "",
+    ...row,
     fileList: [],
     truckFileList: [],
   };
   dialogVisible.value = true;
-  // proxy.post("/customerUser/detail", { id: row.id }).then((res) => {
-  //   res.isKp = res.isKp + "";
-  //   formData.data = res;
-  //   dialogVisible.value = true;
-  // });
+  proxy
+    .post("/fileInfo/getList", { businessIdList: [row.id] })
+    .then((fileObj) => {
+      if (fileObj[row.id] && fileObj[row.id].length > 0) {
+        formData.data.fileList = fileObj[row.id]
+          .filter((x) => x.businessType == "0")
+          .map((item) => {
+            return {
+              ...item,
+              name: item.fileName,
+              url: item.fileUrl,
+            };
+          });
+        formData.data.truckFileList = fileObj[row.id]
+          .filter((x) => x.businessType == "1")
+          .map((item) => {
+            return {
+              ...item,
+              name: item.fileName,
+              url: item.fileUrl,
+            };
+          });
+      } else {
+        formData.data.fileList = [];
+        formData.data.truckFileList = [];
+      }
+    });
+
+  proxy.post("/contractOutboundInfo/detail", { id: row.id }).then((res) => {
+    formData.data.outboundRecordList = res.outboundRecordList;
+    if (
+      formData.data.outboundRecordList &&
+      formData.data.outboundRecordList.length > 0
+    ) {
+      let productIds = formData.data.outboundRecordList.map((x) => x.productId);
+      proxy.getFileData({
+        businessIdList: productIds,
+        data: formData.data.outboundRecordList,
+        att: "productId",
+        businessType: "0",
+        fileAtt: "fileList",
+        filePathAtt: "fileUrl",
+      });
+    }
+  });
 };
 
 getList();

+ 1 - 1
src/views/MES/productionOrder/index.vue

@@ -596,7 +596,7 @@ const config = computed(() => {
           // row.produceStatus == 2
           //   ? {
           //       attrs: {
-          //         label: "发货申请",
+          //         label: "出库申请",
           //         type: "primary",
           //         text: true,
           //       },

+ 8 - 2
src/views/customer/addCustomer.vue

@@ -485,7 +485,7 @@ const formConfig = computed(() => {
       type: "slot",
       slotName: "name",
       prop: "name",
-      label: "公司/客户主体",
+      label: "客户名称",
     },
     {
       type: "input",
@@ -502,7 +502,7 @@ const formConfig = computed(() => {
     // {
     //   type: "input",
     //   prop: "mainPart",
-    //   label: "公司/客户主体",
+    //   label: "客户名称",
     //   itemWidth: 50,
     //   itemType: "text",
     // },
@@ -812,6 +812,7 @@ const formConfig = computed(() => {
       prop: "lastFollowTime",
       label: "客情时间",
       itemWidth: 25,
+      placeholder: " ",
       disabled: true,
       isShow: modalType.value == "detail",
     },
@@ -821,6 +822,7 @@ const formConfig = computed(() => {
       label: "跟进次数",
       itemWidth: 25,
       itemType: "text",
+      placeholder: " ",
       disabled: true,
       isShow: modalType.value == "detail",
     },
@@ -830,6 +832,7 @@ const formConfig = computed(() => {
       prop: "lastSaleDate",
       label: "最近下单时间",
       itemWidth: 25,
+      placeholder: " ",
       disabled: true,
       isShow: modalType.value == "detail",
     },
@@ -839,6 +842,7 @@ const formConfig = computed(() => {
       label: "下单距离天数",
       itemWidth: 25,
       itemType: "text",
+      placeholder: " ",
       disabled: true,
       isShow: modalType.value == "detail",
     },
@@ -848,6 +852,7 @@ const formConfig = computed(() => {
       label: "下单次数",
       itemWidth: 25,
       itemType: "text",
+      placeholder: " ",
       disabled: true,
       isShow: modalType.value == "detail",
     },
@@ -869,6 +874,7 @@ const formConfig = computed(() => {
       min: 0,
       controls: false,
       itemWidth: 25,
+      placeholder: " ",
       disabled: true,
       isShow: modalType.value == "detail",
     },

+ 2 - 2
src/views/customer/contacts/index.vue

@@ -23,7 +23,7 @@
         <template #customerId>
           <div style="width:100%;display:flex">
             <div style="width:calc(100% - 105px)">
-              <el-form-item label="公司/客户主体" prop="customerName" class="margin-b-0">
+              <el-form-item label="客户名称" prop="customerName" class="margin-b-0">
                 <el-input disabled v-model="formData.data.customerName" placeholder="请选择"></el-input>
               </el-form-item>
             </div>
@@ -86,7 +86,7 @@ const config = computed(() => {
   return [
     {
       attrs: {
-        label: "公司/客户主体",
+        label: "客户名称",
         prop: "customerName",
         width: 200,
         fixed: "left",

+ 4 - 4
src/views/customer/file/index.vue

@@ -220,7 +220,7 @@
       </template>
     </el-dialog>
 
-    <el-dialog title="分配" v-if="openAllocation" v-model="openAllocation" width="500">
+    <el-dialog title="转交" v-if="openAllocation" v-model="openAllocation" width="500">
       <byForm :formConfig="formConfigAllocation" :formOption="formOption" v-model="formAllocation.data" :rules="rulesAllocation" ref="allocation">
       </byForm>
       <template #footer>
@@ -520,7 +520,7 @@ const config = computed(() => {
     },
     {
       attrs: {
-        label: "公司/客户主体",
+        label: "客户名称",
         slot: "name",
         fixed: "left",
         width: 160,
@@ -607,7 +607,7 @@ const config = computed(() => {
           : [
               {
                 attrs: {
-                  label: "分配",
+                  label: "转交",
                   type: "primary",
                   text: true,
                 },
@@ -1217,7 +1217,7 @@ const formSearchConfig = computed(() => {
     {
       type: "input",
       prop: "name",
-      label: "公司/客户主体",
+      label: "客户名称",
       itemType: "text",
     },
     {

+ 3 - 3
src/views/customer/highseas/index.vue

@@ -461,7 +461,7 @@ const config = computed(() => {
     },
     {
       attrs: {
-        label: "公司/客户主体",
+        label: "客户名称",
         slot: "name",
         fixed: "left",
         width: 160,
@@ -613,7 +613,7 @@ const formConfig = computed(() => {
     {
       type: "input",
       prop: "name",
-      label: "公司/客户主体",
+      label: "客户名称",
       required: true,
       itemWidth: 100,
       itemType: "text",
@@ -1220,7 +1220,7 @@ const formSearchConfig = computed(() => {
     {
       type: "input",
       prop: "name",
-      label: "公司/客户主体",
+      label: "客户名称",
       itemType: "text",
     },
     {

+ 62 - 5
src/views/customer/privatesea/index.vue

@@ -279,6 +279,15 @@
       </template>
     </el-dialog>
 
+    <el-dialog title="转交" v-if="openAllocation" v-model="openAllocation" width="500">
+      <byForm :formConfig="formConfigAllocation" :formOption="formOption" v-model="formAllocation.data" :rules="rulesAllocation" ref="allocation">
+      </byForm>
+      <template #footer>
+        <el-button @click="openAllocation = false" size="default">取 消</el-button>
+        <el-button type="primary" @click="submitAllocation()" size="default">确 定</el-button>
+      </template>
+    </el-dialog>
+
     <el-dialog title="高级检索" v-if="openSearch" v-model="openSearch" width="600" :before-close="cancelSearch">
       <byForm :formConfig="formSearchConfig" :formOption="formOption" v-model="sourceList.pagination">
         <template #address>
@@ -461,7 +470,7 @@ const config = computed(() => {
     },
     {
       attrs: {
-        label: "公司/客户主体",
+        label: "客户名称",
         slot: "name",
         fixed: "left",
         width: 160,
@@ -556,13 +565,28 @@ const config = computed(() => {
           },
           {
             attrs: {
-              label: "退回公海",
+              label: "转交",
               type: "primary",
               text: true,
             },
             el: "button",
             click() {
-              ElMessageBox.confirm("是否确定将该客户退回公海?", "提示", {
+              formAllocation.data = {
+                id: row.id,
+                userId: row.userId,
+              };
+              openAllocation.value = true;
+            },
+          },
+          {
+            attrs: {
+              label: "放弃客户",
+              type: "primary",
+              text: true,
+            },
+            el: "button",
+            click() {
+              ElMessageBox.confirm("是否确定将该客户放弃?", "提示", {
                 confirmButtonText: "确定",
                 cancelButtonText: "取消",
                 type: "warning",
@@ -613,7 +637,7 @@ const formConfig = computed(() => {
     {
       type: "input",
       prop: "name",
-      label: "公司/客户主体",
+      label: "客户名称",
       required: true,
       itemWidth: 100,
       itemType: "text",
@@ -1220,7 +1244,7 @@ const formSearchConfig = computed(() => {
     {
       type: "input",
       prop: "name",
-      label: "公司/客户主体",
+      label: "客户名称",
       itemType: "text",
     },
     {
@@ -1329,6 +1353,39 @@ const refreshList = () => {
   dialogVisible.value = false;
   getList();
 };
+const openAllocation = ref(false);
+const allocation = ref(null);
+const formAllocation = reactive({
+  data: {},
+});
+const formConfigAllocation = computed(() => {
+  return [
+    {
+      type: "select",
+      label: "业务员",
+      prop: "userId",
+      itemWidth: 100,
+      data: userList.value,
+      clearable: true,
+    },
+  ];
+});
+const rulesAllocation = ref({
+  userId: [{ required: true, message: "请选择业务员", trigger: "change" }],
+});
+const submitAllocation = () => {
+  allocation.value.handleSubmit(() => {
+    proxy.post("/customer/CustomerAllocation", formAllocation.data).then(() => {
+      ElMessage({
+        message: "分配成功",
+        type: "success",
+      });
+      openAllocation.value = false;
+      getList();
+      obtainStatisticalData();
+    });
+  });
+};
 </script>
 
 <style lang="scss" scoped>

+ 34 - 5
src/views/finance/fundManage/costControl/index.vue

@@ -8,6 +8,11 @@
             action: () => openModal('add'),
           },
         ]" @get-list="getList">
+        <template #code="{ item }">
+          <div style="width: 100%">
+            <span class="el-click" @click="handleClickCode(item)">{{item.code}}</span>
+          </div>
+        </template>
       </byTable>
     </div>
 
@@ -59,6 +64,7 @@ import byTable from "@/components/byTable/index";
 import byForm from "@/components/byForm/index";
 import useUserStore from "@/store/modules/user";
 import { ElMessage, ElMessageBox } from "element-plus";
+import $bus from "@/bus/index.js";
 
 const { proxy } = getCurrentInstance();
 const accountCurrency = ref([]);
@@ -143,7 +149,7 @@ const config = computed(() => {
         fixed: "left",
       },
       render(val) {
-        return proxy.dictKeyValue(val, tradeTypeData.value);
+        return proxy.dictValueLabel(val, tradeTypeData.value);
       },
     },
     {
@@ -163,7 +169,7 @@ const config = computed(() => {
     {
       attrs: {
         label: "流水号",
-        prop: "code",
+        slot: "code",
         width: 150,
       },
     },
@@ -232,7 +238,7 @@ const config = computed(() => {
     },
     {
       attrs: {
-        label: "订单状态",
+        label: "审批状态",
         prop: "status",
         width: 100,
         fixed: "right",
@@ -267,7 +273,7 @@ const config = computed(() => {
             ? {
                 attrs: {
                   label: "删除",
-                  type: "primary",
+                  type: "danger",
                   text: true,
                 },
                 el: "button",
@@ -587,11 +593,34 @@ const update = (row) => {
     query: {
       flowKey: "cost_control_flow",
       flowName: "费控流程",
-      businessId: row.costType,
+      businessId: row.id,
       random: proxy.random(),
     },
   });
 };
+
+const handleClickCode = (row) => {
+  proxy.$router.push({
+    path: "/platform_manage/process/processApproval",
+    query: {
+      flowKey: "cost_control_flow",
+      id: row.flowId,
+      processType: 20,
+      businessId: row.id,
+    },
+  });
+};
+
+onMounted(() => {
+  $bus.on("refreshTableData", () => {
+    getList();
+  });
+});
+
+onBeforeUnmount(() => {
+  // 取消订阅特定事件
+  $bus.off("refreshTableData");
+});
 </script>
 
 <style lang="scss" scoped>

+ 3 - 3
src/views/finance/fundManage/paymentType/index.vue

@@ -250,9 +250,9 @@ const formConfig = computed(() => {
 const rules = ref({
   name: [{ required: true, message: "请输入名称", trigger: "blur" }],
   tradeType: [{ required: true, message: "请选择收支类型", trigger: "change" }],
-  accountSubjectsId: [
-    { required: true, message: "请选择记账科目", trigger: "change" },
-  ],
+  // accountSubjectsId: [
+  //   { required: true, message: "请选择记账科目", trigger: "change" },
+  // ],
   sort: [{ required: true, message: "请输入排序", trigger: "blur" }],
 });
 

+ 1 - 1
src/views/purchaseSales/outAndInWarehouse/manualDelivery/index.vue

@@ -97,7 +97,7 @@ const outBoundReason = ref([
     value: "1",
   },
   {
-    label: "发货申请",
+    label: "出库申请",
     value: "2",
   },
   {

+ 1 - 1
src/views/purchaseSales/outAndInWarehouse/record/index.vue

@@ -108,7 +108,7 @@ const typeList = ref([
     value: "1",
   },
   {
-    label: "发货申请",
+    label: "出库申请",
     value: "2",
   },
   {

+ 1 - 1
src/views/purchaseSales/outAndInWarehouse/waitingForDelivery/index.vue

@@ -134,7 +134,7 @@ const businessType = ref([
     value: "1",
   },
   {
-    label: "发货申请",
+    label: "出库申请",
     value: "2",
   },
   {

+ 24 - 1
src/views/purchaseSales/outAndInWarehouse/waitingForStorage/index.vue

@@ -304,7 +304,7 @@ const config = computed(() => {
     {
       attrs: {
         label: "操作",
-        width: "80",
+        width: "140",
         align: "center",
       },
       renderHTML(row) {
@@ -322,6 +322,29 @@ const config = computed(() => {
                 },
               }
             : {},
+          {
+            attrs: {
+              label: "结束入库",
+              type: "primary",
+              text: true,
+            },
+            el: "button",
+            click() {
+              proxy
+                .msgConfirm()
+                .then((res) => {
+                  proxy
+                    .post("/contract/delete", {
+                      id: row.id,
+                    })
+                    .then((res) => {
+                      proxy.msgTip("操作成功", 1);
+                      getList();
+                    });
+                })
+                .catch((err) => {});
+            },
+          },
         ];
       },
     },

+ 270 - 0
src/views/systemTenant/otherManage/artCopyright/index.vue

@@ -0,0 +1,270 @@
+<template>
+  <div class="pageIndexClass">
+    <div>
+      <byTable :source="sourceList.data" :pagination="sourceList.pagination" :config="config" :loading="loading" highlight-current-row
+               :selectConfig="selectConfig" :action-list="[
+              {
+                text: '添加',
+                action: () => openModal('add'),
+                disabled: false,
+              },
+        ]" @get-list="getList">
+
+        <template #name="{ item }">
+          <div>
+            <span class="el-click">{{ item.name }}</span>
+          </div>
+        </template>
+
+      </byTable>
+    </div>
+    <el-dialog :title="modalType == 'add' ? '添加' : '编辑'" v-model="dialogVisible" width="500px" destroy-on-close>
+      <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="formDom" v-loading="submitLoading">
+      </byForm>
+      <template #footer>
+        <el-button @click="dialogVisible = false" size="defualt" v-debounce>取 消</el-button>
+        <el-button type="primary" @click="submitForm()" size="defualt" v-debounce :loading="submitLoading">
+          确 定
+        </el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import byTable from "@/components/byTable/index";
+import byForm from "@/components/byForm/index";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const submitLoading = ref(false);
+const sourceList = ref({
+  data: [],
+  pagination: {
+    total: 3,
+    pageNum: 1,
+    pageSize: 10,
+    keyword: "",
+  },
+});
+const treeData = ref([]);
+const dialogVisible = ref(false);
+const modalType = ref("add");
+const selectConfig = computed(() => []);
+const config = computed(() => {
+  return [
+    {
+      attrs: {
+        label: "业务公司",
+        prop: "companyName",
+      },
+    },
+    {
+      attrs: {
+        label: "编号",
+        prop: "code",
+      },
+    },
+    {
+      attrs: {
+        label: "名称",
+        prop: "name",
+      },
+    },
+    {
+      attrs: {
+        label: "开户行",
+        prop: "accountBank",
+      },
+    },
+    {
+      attrs: {
+        label: "开户名",
+        prop: "accountName",
+      },
+    },
+    {
+      attrs: {
+        label: "账号",
+        prop: "accountNumber",
+      },
+    },
+    {
+      attrs: {
+        label: "操作",
+        width: "120",
+        align: "center",
+        fixed: "right",
+      },
+      renderHTML(row) {
+        return [
+          {
+            attrs: {
+              label: "修改",
+              type: "primary",
+              text: true,
+            },
+            el: "button",
+            click() {
+              getDtl(row);
+            },
+          },
+          {
+            attrs: {
+              label: "删除",
+              type: "danger",
+              text: true,
+            },
+            el: "button",
+            click() {
+              proxy
+                .msgConfirm()
+                .then((res) => {
+                  proxy
+                    .post("/shopInfo/delete", {
+                      id: row.id,
+                    })
+                    .then((res) => {
+                      proxy.msgTip("删除成功", 1);
+                      getList();
+                    });
+                })
+                .catch((err) => {});
+            },
+          },
+        ];
+      },
+    },
+  ];
+});
+const formData = reactive({
+  data: {},
+});
+const formOption = reactive({
+  inline: true,
+  labelWidth: 100,
+  itemWidth: 100,
+});
+const formDom = ref(null);
+const formConfig = computed(() => {
+  return [
+    {
+      type: "treeSelect",
+      prop: "deptId",
+      label: "业务公司",
+      data: treeData.value,
+      propsTreeLabel: "deptName",
+      propsTreeValue: "deptId",
+      itemWidth: 100,
+      disabled: false,
+    },
+    {
+      type: "input",
+      prop: "name",
+      label: "名称",
+      itemWidth: 100,
+      disabled: false,
+    },
+    {
+      type: "input",
+      prop: "code",
+      label: "版权号",
+      itemWidth: 100,
+      disabled: false,
+    },
+    {
+      type: "input",
+      prop: "accountBank",
+      label: "开户行",
+      placeholder: "请输入开户行",
+      itemWidth: 100,
+    },
+    {
+      type: "input",
+      prop: "accountName",
+      label: "开户名",
+      placeholder: "请输入开户名",
+      itemWidth: 100,
+    },
+    {
+      type: "input",
+      prop: "accountNumber",
+      label: "账号",
+      placeholder: "请输入账号",
+      itemWidth: 100,
+    },
+  ];
+});
+const rules = ref({
+  deptId: [{ required: true, message: "请选择业务公司", trigger: "change" }],
+  name: [{ required: true, message: "请输入名称", trigger: "blur" }],
+  code: [{ required: true, message: "请输入编号", trigger: "blur" }],
+});
+
+const getDeptData = () => {
+  proxy
+    .get("/tenantDept/list", {
+      pageNum: 1,
+      pageSize: 9999,
+      keyword: "",
+      tenantId: proxy.useUserStore().user.tenantId,
+    })
+    .then((res) => {
+      treeData.value = proxy.handleTree(res.data, "deptId");
+    });
+};
+getDeptData();
+
+const getList = async (req) => {
+  sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
+  loading.value = true;
+  proxy.post("/shopInfo/page", sourceList.value.pagination).then((res) => {
+    sourceList.value.data = res.rows;
+    sourceList.value.pagination.total = res.total;
+    setTimeout(() => {
+      loading.value = false;
+    }, 200);
+  });
+};
+
+const openModal = () => {
+  dialogVisible.value = true;
+  modalType.value = "add";
+  formData.data = {
+    definition: "2",
+    fileList: [],
+  };
+};
+
+const submitForm = () => {
+  formDom.value.handleSubmit((valid) => {
+    submitLoading.value = true;
+    proxy.post("/shopInfo/" + modalType.value, formData.data).then(
+      (res) => {
+        proxy.msgTip("操作成功", 1);
+        dialogVisible.value = false;
+        submitLoading.value = false;
+        getList();
+      },
+      (err) => {
+        submitLoading.value = false;
+      }
+    );
+  });
+};
+
+const getDtl = (row) => {
+  modalType.value = "edit";
+  proxy.post("/shopInfo/detail", { id: row.id }).then((res) => {
+    formData.data = res;
+    dialogVisible.value = true;
+  });
+};
+
+getList();
+</script>
+
+<style lang="scss" scoped>
+.content {
+  padding: 20px;
+}
+</style>

+ 310 - 0
src/views/systemTenant/otherManage/contractor/index.vue

@@ -0,0 +1,310 @@
+<template>
+  <div class="pageIndexClass">
+    <div class="content">
+      <byTable :source="sourceList.data" :pagination="sourceList.pagination" :config="config" :loading="loading" highlight-current-row :action-list="[
+          {
+            text: '添加',
+            action: () => openModal('add'),
+          },
+        ]" @get-list="getList">
+      </byTable>
+    </div>
+
+    <el-dialog :title="modalType == 'add' ? '添加' : '编辑'" v-if="dialogVisible" v-model="dialogVisible" width="60%">
+      <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="submit" v-loading="loadingDialog">
+
+      </byForm>
+      <template #footer>
+        <el-button @click="dialogVisible = false" size="default">取 消</el-button>
+        <el-button type="primary" @click="submitForm()" size="default">确 定</el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { computed, ref } from "vue";
+import byTable from "@/components/byTable/index";
+import byForm from "@/components/byForm/index";
+import useUserStore from "@/store/modules/user";
+import { ElMessage, ElMessageBox } from "element-plus";
+
+const { proxy } = getCurrentInstance();
+const accountCurrency = ref([]);
+const typeData = ref([
+  {
+    label: "收入",
+    value: "10",
+  },
+  {
+    label: "支出",
+    value: "20",
+  },
+]);
+const sourceList = ref({
+  data: [],
+  pagination: {
+    total: 0,
+    pageNum: 1,
+    pageSize: 10,
+    keyword: "",
+  },
+});
+const loading = ref(false);
+const config = computed(() => {
+  return [
+    {
+      attrs: {
+        label: "承包商",
+        prop: "name",
+      },
+    },
+
+    {
+      attrs: {
+        label: "税点",
+        prop: "taxPoints",
+      },
+    },
+    {
+      attrs: {
+        label: "开户行",
+        prop: "accountBank",
+      },
+    },
+    {
+      attrs: {
+        label: "开户名",
+        prop: "accountName",
+      },
+    },
+    {
+      attrs: {
+        label: "账号",
+        prop: "accountNumber",
+      },
+    },
+    {
+      attrs: {
+        label: "操作",
+        width: "120",
+        align: "center",
+      },
+      renderHTML(row) {
+        return [
+          {
+            attrs: {
+              label: "修改",
+              type: "primary",
+              text: true,
+            },
+            el: "button",
+            click() {
+              update(row);
+            },
+          },
+          {
+            attrs: {
+              label: "删除",
+              type: "danger",
+              text: true,
+            },
+            el: "button",
+            click() {
+              proxy
+                .msgConfirm()
+                .then((res) => {
+                  proxy
+                    .post("/logisticsCompanyInfo/delete", {
+                      id: row.id,
+                    })
+                    .then((res) => {
+                      proxy.msgTip("操作成功", 1);
+                      getList();
+                    });
+                })
+                .catch((err) => {});
+            },
+          },
+        ];
+      },
+    },
+  ];
+});
+const corporationList = ref([]);
+
+const getList = async (req) => {
+  sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
+  loading.value = true;
+  proxy
+    .post("/logisticsCompanyInfo/page", sourceList.value.pagination)
+    .then((res) => {
+      sourceList.value.data = res.rows;
+      sourceList.value.pagination.total = res.total;
+      setTimeout(() => {
+        loading.value = false;
+      }, 200);
+    });
+};
+getList();
+const modalType = ref("add");
+const dialogVisible = ref(false);
+const loadingDialog = ref(false);
+const submit = ref(null);
+const formOption = reactive({
+  inline: true,
+  labelWidth: 100,
+  itemWidth: 100,
+  rules: [],
+});
+const formConfig = computed(() => {
+  return [
+    {
+      type: "title1",
+      title: "基本信息",
+    },
+    {
+      type: "input",
+      prop: "name",
+      label: "承包商",
+      required: true,
+      itemWidth: 50,
+      itemType: "text",
+    },
+    {
+      type: "number",
+      prop: "taxPoints",
+      label: "税点",
+      precision: 2,
+      min: 0,
+      max: 100,
+      controls: false,
+      itemWidth: 50,
+    },
+    {
+      type: "input",
+      prop: "accountBank",
+      label: "开户行",
+      itemWidth: 50,
+      itemType: "text",
+    },
+    {
+      type: "input",
+      prop: "accountName",
+      label: "开户名",
+      itemWidth: 50,
+      itemType: "text",
+    },
+    {
+      type: "input",
+      prop: "accountNumber",
+      label: "账号",
+      itemWidth: 50,
+      itemType: "text",
+    },
+  ];
+});
+const rules = ref({
+  name: [{ required: true, message: "请输入承包商", trigger: "blur" }],
+  taxPoints: [{ required: true, message: "请输入税点", trigger: "blur" }],
+  accountBank: [{ required: true, message: "请输入开户行", trigger: "blur" }],
+  accountName: [{ required: true, message: "请输入开户名", trigger: "blur" }],
+  accountNumber: [{ required: true, message: "请输入账号", trigger: "blur" }],
+});
+const formData = reactive({
+  data: {
+    accountRemainderList: [{ currency: "", remainder: undefined }],
+  },
+});
+const openModal = (val) => {
+  modalType.value = val;
+  formData.data = {
+    accountRemainderList: [{ currency: "", remainder: undefined }],
+  };
+  loadingDialog.value = false;
+  dialogVisible.value = true;
+};
+const clickBalance = () => {
+  if (
+    formData.data.accountRemainderList &&
+    formData.data.accountRemainderList.length > 0
+  ) {
+    formData.data.accountRemainderList.push({
+      currency: "",
+      remainder: undefined,
+    });
+  } else {
+    formData.data.accountRemainderList = [
+      { currency: "", remainder: undefined },
+    ];
+  }
+};
+const handleRemove = (index) => {
+  formData.data.accountRemainderList.splice(index, 1);
+};
+const isRepeat = (arr) => {
+  var hash = {};
+  for (var i in arr) {
+    if (hash[arr[i].currency]) return true;
+    hash[arr[i].currency] = true;
+  }
+  return false;
+};
+const submitForm = () => {
+  submit.value.handleSubmit(() => {
+    loadingDialog.value = true;
+    proxy.post("/logisticsCompanyInfo/" + modalType.value, formData.data).then(
+      () => {
+        proxy.msgTip("操作成功", 1);
+        dialogVisible.value = false;
+        getList();
+      },
+      (err) => {
+        console.log(err);
+        loadingDialog.value = false;
+      }
+    );
+    // if (
+    //   formData.data.accountRemainderList &&
+    //   formData.data.accountRemainderList.length > 0
+    // ) {
+    //   if (isRepeat(formData.data.accountRemainderList)) {
+    //     return ElMessage("请勿重复添加货币余额");
+    //   } else {
+    //     loadingDialog.value = true;
+    //     proxy.post("/accountManagement/" + modalType.value, formData.data).then(
+    //       () => {
+    //         ElMessage({
+    //           message: modalType.value == "add" ? "添加成功" : "编辑成功",
+    //           type: "success",
+    //         });
+    //         dialogVisible.value = false;
+    //         getList();
+    //       },
+    //       (err) => {
+    //         console.log(err);
+    //         loadingDialog.value = false;
+    //       }
+    //     );
+    //   }
+    // } else {
+    //   return ElMessage("请添加至少一条类型余额");
+    // }
+  });
+};
+const update = (row) => {
+  loadingDialog.value = false;
+  modalType.value = "edit";
+  formData.data = proxy.deepClone(row);
+  dialogVisible.value = true;
+};
+</script>
+
+<style lang="scss" scoped>
+.tenant {
+  padding: 20px;
+}
+::v-deep(.el-input-number .el-input__inner) {
+  text-align: left;
+}
+</style>

+ 270 - 0
src/views/systemTenant/otherManage/patentManage/index.vue

@@ -0,0 +1,270 @@
+<template>
+  <div class="pageIndexClass">
+    <div>
+      <byTable :source="sourceList.data" :pagination="sourceList.pagination" :config="config" :loading="loading" highlight-current-row
+               :selectConfig="selectConfig" :action-list="[
+              {
+                text: '添加专利',
+                action: () => openModal('add'),
+                disabled: false,
+              },
+        ]" @get-list="getList">
+
+        <template #name="{ item }">
+          <div>
+            <span class="el-click">{{ item.name }}</span>
+          </div>
+        </template>
+
+      </byTable>
+    </div>
+    <el-dialog :title="modalType == 'add' ? '添加专利' : '编辑专利'" v-model="dialogVisible" width="500px" destroy-on-close>
+      <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="formDom" v-loading="submitLoading">
+      </byForm>
+      <template #footer>
+        <el-button @click="dialogVisible = false" size="defualt" v-debounce>取 消</el-button>
+        <el-button type="primary" @click="submitForm()" size="defualt" v-debounce :loading="submitLoading">
+          确 定
+        </el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import byTable from "@/components/byTable/index";
+import byForm from "@/components/byForm/index";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const submitLoading = ref(false);
+const sourceList = ref({
+  data: [],
+  pagination: {
+    total: 3,
+    pageNum: 1,
+    pageSize: 10,
+    keyword: "",
+  },
+});
+const treeData = ref([]);
+const dialogVisible = ref(false);
+const modalType = ref("add");
+const selectConfig = computed(() => []);
+const config = computed(() => {
+  return [
+    {
+      attrs: {
+        label: "业务公司",
+        prop: "companyName",
+      },
+    },
+    {
+      attrs: {
+        label: "专利编号",
+        prop: "code",
+      },
+    },
+    {
+      attrs: {
+        label: "专利名称",
+        prop: "name",
+      },
+    },
+    {
+      attrs: {
+        label: "开户行",
+        prop: "accountBank",
+      },
+    },
+    {
+      attrs: {
+        label: "开户名",
+        prop: "accountName",
+      },
+    },
+    {
+      attrs: {
+        label: "账号",
+        prop: "accountNumber",
+      },
+    },
+    {
+      attrs: {
+        label: "操作",
+        width: "120",
+        align: "center",
+        fixed: "right",
+      },
+      renderHTML(row) {
+        return [
+          {
+            attrs: {
+              label: "修改",
+              type: "primary",
+              text: true,
+            },
+            el: "button",
+            click() {
+              getDtl(row);
+            },
+          },
+          {
+            attrs: {
+              label: "删除",
+              type: "danger",
+              text: true,
+            },
+            el: "button",
+            click() {
+              proxy
+                .msgConfirm()
+                .then((res) => {
+                  proxy
+                    .post("/shopInfo/delete", {
+                      id: row.id,
+                    })
+                    .then((res) => {
+                      proxy.msgTip("删除成功", 1);
+                      getList();
+                    });
+                })
+                .catch((err) => {});
+            },
+          },
+        ];
+      },
+    },
+  ];
+});
+const formData = reactive({
+  data: {},
+});
+const formOption = reactive({
+  inline: true,
+  labelWidth: 100,
+  itemWidth: 100,
+});
+const formDom = ref(null);
+const formConfig = computed(() => {
+  return [
+    {
+      type: "treeSelect",
+      prop: "deptId",
+      label: "业务公司",
+      data: treeData.value,
+      propsTreeLabel: "deptName",
+      propsTreeValue: "deptId",
+      itemWidth: 100,
+      disabled: false,
+    },
+    {
+      type: "input",
+      prop: "name",
+      label: "专利名称",
+      itemWidth: 100,
+      disabled: false,
+    },
+    {
+      type: "input",
+      prop: "code",
+      label: "专利号",
+      itemWidth: 100,
+      disabled: false,
+    },
+    {
+      type: "input",
+      prop: "accountBank",
+      label: "开户行",
+      placeholder: "请输入开户行",
+      itemWidth: 100,
+    },
+    {
+      type: "input",
+      prop: "accountName",
+      label: "开户名",
+      placeholder: "请输入开户名",
+      itemWidth: 100,
+    },
+    {
+      type: "input",
+      prop: "accountNumber",
+      label: "账号",
+      placeholder: "请输入账号",
+      itemWidth: 100,
+    },
+  ];
+});
+const rules = ref({
+  deptId: [{ required: true, message: "请选择业务公司", trigger: "change" }],
+  name: [{ required: true, message: "请输入专利名称", trigger: "blur" }],
+  code: [{ required: true, message: "请输入专利编号", trigger: "blur" }],
+});
+
+const getDeptData = () => {
+  proxy
+    .get("/tenantDept/list", {
+      pageNum: 1,
+      pageSize: 9999,
+      keyword: "",
+      tenantId: proxy.useUserStore().user.tenantId,
+    })
+    .then((res) => {
+      treeData.value = proxy.handleTree(res.data, "deptId");
+    });
+};
+getDeptData();
+
+const getList = async (req) => {
+  sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
+  loading.value = true;
+  proxy.post("/shopInfo/page", sourceList.value.pagination).then((res) => {
+    sourceList.value.data = res.rows;
+    sourceList.value.pagination.total = res.total;
+    setTimeout(() => {
+      loading.value = false;
+    }, 200);
+  });
+};
+
+const openModal = () => {
+  dialogVisible.value = true;
+  modalType.value = "add";
+  formData.data = {
+    definition: "2",
+    fileList: [],
+  };
+};
+
+const submitForm = () => {
+  formDom.value.handleSubmit((valid) => {
+    submitLoading.value = true;
+    proxy.post("/shopInfo/" + modalType.value, formData.data).then(
+      (res) => {
+        proxy.msgTip("操作成功", 1);
+        dialogVisible.value = false;
+        submitLoading.value = false;
+        getList();
+      },
+      (err) => {
+        submitLoading.value = false;
+      }
+    );
+  });
+};
+
+const getDtl = (row) => {
+  modalType.value = "edit";
+  proxy.post("/shopInfo/detail", { id: row.id }).then((res) => {
+    formData.data = res;
+    dialogVisible.value = true;
+  });
+};
+
+getList();
+</script>
+
+<style lang="scss" scoped>
+.content {
+  padding: 20px;
+}
+</style>

+ 270 - 0
src/views/systemTenant/otherManage/trademarkManage/index.vue

@@ -0,0 +1,270 @@
+<template>
+  <div class="pageIndexClass">
+    <div>
+      <byTable :source="sourceList.data" :pagination="sourceList.pagination" :config="config" :loading="loading" highlight-current-row
+               :selectConfig="selectConfig" :action-list="[
+              {
+                text: '添加商标',
+                action: () => openModal('add'),
+                disabled: false,
+              },
+        ]" @get-list="getList">
+
+        <template #name="{ item }">
+          <div>
+            <span class="el-click">{{ item.name }}</span>
+          </div>
+        </template>
+
+      </byTable>
+    </div>
+    <el-dialog :title="modalType == 'add' ? '添加商标' : '编辑商标'" v-model="dialogVisible" width="500px" destroy-on-close>
+      <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="formDom" v-loading="submitLoading">
+      </byForm>
+      <template #footer>
+        <el-button @click="dialogVisible = false" size="defualt" v-debounce>取 消</el-button>
+        <el-button type="primary" @click="submitForm()" size="defualt" v-debounce :loading="submitLoading">
+          确 定
+        </el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import byTable from "@/components/byTable/index";
+import byForm from "@/components/byForm/index";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const submitLoading = ref(false);
+const sourceList = ref({
+  data: [],
+  pagination: {
+    total: 3,
+    pageNum: 1,
+    pageSize: 10,
+    keyword: "",
+  },
+});
+const treeData = ref([]);
+const dialogVisible = ref(false);
+const modalType = ref("add");
+const selectConfig = computed(() => []);
+const config = computed(() => {
+  return [
+    {
+      attrs: {
+        label: "业务公司",
+        prop: "companyName",
+      },
+    },
+    {
+      attrs: {
+        label: "商标编号",
+        prop: "code",
+      },
+    },
+    {
+      attrs: {
+        label: "商标名称",
+        prop: "name",
+      },
+    },
+    {
+      attrs: {
+        label: "开户行",
+        prop: "accountBank",
+      },
+    },
+    {
+      attrs: {
+        label: "开户名",
+        prop: "accountName",
+      },
+    },
+    {
+      attrs: {
+        label: "账号",
+        prop: "accountNumber",
+      },
+    },
+    {
+      attrs: {
+        label: "操作",
+        width: "120",
+        align: "center",
+        fixed: "right",
+      },
+      renderHTML(row) {
+        return [
+          {
+            attrs: {
+              label: "修改",
+              type: "primary",
+              text: true,
+            },
+            el: "button",
+            click() {
+              getDtl(row);
+            },
+          },
+          {
+            attrs: {
+              label: "删除",
+              type: "danger",
+              text: true,
+            },
+            el: "button",
+            click() {
+              proxy
+                .msgConfirm()
+                .then((res) => {
+                  proxy
+                    .post("/shopInfo/delete", {
+                      id: row.id,
+                    })
+                    .then((res) => {
+                      proxy.msgTip("删除成功", 1);
+                      getList();
+                    });
+                })
+                .catch((err) => {});
+            },
+          },
+        ];
+      },
+    },
+  ];
+});
+const formData = reactive({
+  data: {},
+});
+const formOption = reactive({
+  inline: true,
+  labelWidth: 100,
+  itemWidth: 100,
+});
+const formDom = ref(null);
+const formConfig = computed(() => {
+  return [
+    {
+      type: "treeSelect",
+      prop: "deptId",
+      label: "业务公司",
+      data: treeData.value,
+      propsTreeLabel: "deptName",
+      propsTreeValue: "deptId",
+      itemWidth: 100,
+      disabled: false,
+    },
+    {
+      type: "input",
+      prop: "name",
+      label: "商标名称",
+      itemWidth: 100,
+      disabled: false,
+    },
+    {
+      type: "input",
+      prop: "code",
+      label: "商标号",
+      itemWidth: 100,
+      disabled: false,
+    },
+    {
+      type: "input",
+      prop: "accountBank",
+      label: "开户行",
+      placeholder: "请输入开户行",
+      itemWidth: 100,
+    },
+    {
+      type: "input",
+      prop: "accountName",
+      label: "开户名",
+      placeholder: "请输入开户名",
+      itemWidth: 100,
+    },
+    {
+      type: "input",
+      prop: "accountNumber",
+      label: "账号",
+      placeholder: "请输入账号",
+      itemWidth: 100,
+    },
+  ];
+});
+const rules = ref({
+  deptId: [{ required: true, message: "请选择业务公司", trigger: "change" }],
+  name: [{ required: true, message: "请输入商标名称", trigger: "blur" }],
+  code: [{ required: true, message: "请输入商标编号", trigger: "blur" }],
+});
+
+const getDeptData = () => {
+  proxy
+    .get("/tenantDept/list", {
+      pageNum: 1,
+      pageSize: 9999,
+      keyword: "",
+      tenantId: proxy.useUserStore().user.tenantId,
+    })
+    .then((res) => {
+      treeData.value = proxy.handleTree(res.data, "deptId");
+    });
+};
+getDeptData();
+
+const getList = async (req) => {
+  sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
+  loading.value = true;
+  proxy.post("/shopInfo/page", sourceList.value.pagination).then((res) => {
+    sourceList.value.data = res.rows;
+    sourceList.value.pagination.total = res.total;
+    setTimeout(() => {
+      loading.value = false;
+    }, 200);
+  });
+};
+
+const openModal = () => {
+  dialogVisible.value = true;
+  modalType.value = "add";
+  formData.data = {
+    definition: "2",
+    fileList: [],
+  };
+};
+
+const submitForm = () => {
+  formDom.value.handleSubmit((valid) => {
+    submitLoading.value = true;
+    proxy.post("/shopInfo/" + modalType.value, formData.data).then(
+      (res) => {
+        proxy.msgTip("操作成功", 1);
+        dialogVisible.value = false;
+        submitLoading.value = false;
+        getList();
+      },
+      (err) => {
+        submitLoading.value = false;
+      }
+    );
+  });
+};
+
+const getDtl = (row) => {
+  modalType.value = "edit";
+  proxy.post("/shopInfo/detail", { id: row.id }).then((res) => {
+    formData.data = res;
+    dialogVisible.value = true;
+  });
+};
+
+getList();
+</script>
+
+<style lang="scss" scoped>
+.content {
+  padding: 20px;
+}
+</style>

+ 137 - 0
src/views/systemTenant/tenant/userTenant/index.vue

@@ -51,6 +51,15 @@
           <el-input style="width: 200px; margin-right: 10px" v-model="formData.data.password" @change="changePassword" placeholder="密码"></el-input>
           <span style="color: #409eff; cursor: pointer" @click="newPassword">随机生成</span>
         </template>
+
+        <template #purchaseScope>
+          <div style="width:100%">
+            <el-tree :data="productTreeData" show-checkbox node-key="id" :default-checked-keys="formData.data.purchaseRangeOne"
+                     :props="defaultPropsOne" ref="productTree">
+            </el-tree>
+          </div>
+        </template>
+
       </byForm>
       <template #footer>
         <el-button @click="dialogVisible = false" size="default">取 消</el-button>
@@ -84,6 +93,10 @@ const defaultProps = {
   label: "deptName",
   disabled: "disabled",
 };
+const defaultPropsOne = {
+  children: "children",
+  label: "name",
+};
 const deptList = ref([]);
 const sourceList = ref({
   data: [],
@@ -247,8 +260,11 @@ const modalType = ref("add");
 const dialogVisible = ref(false);
 const loadingDialog = ref(false);
 const roleData = ref([]);
+const productTree = ref(null);
+const productTreeData = ref([]);
 const companyData = ref([]);
 const submit = ref(null);
+const isShowPurchaseAtt = ref(false);
 const formOption = reactive({
   inline: true,
   labelWidth: 100,
@@ -270,6 +286,7 @@ const formConfig = computed(() => {
       type: "input",
       prop: "nickName",
       label: "姓名",
+      // itemWidth:50
     },
     {
       type: "input",
@@ -306,6 +323,9 @@ const formConfig = computed(() => {
       prop: "roleIds",
       multiple: true,
       data: roleData.value,
+      fn: (val) => {
+        changeRoleId(val);
+      },
     },
     {
       type: "input",
@@ -332,6 +352,13 @@ const formConfig = computed(() => {
       data: companyData.value,
     },
     {
+      type: "select",
+      label: "业务员等级",
+      prop: "saleLv",
+      multiple: false,
+      data: roleData.value,
+    },
+    {
       type: "input",
       prop: "accountBank",
       label: "开户行",
@@ -352,6 +379,14 @@ const formConfig = computed(() => {
       placeholder: "请输入账号",
       itemWidth: 100,
     },
+    {
+      type: "slot",
+      slotName: "purchaseScope",
+      label: "采购范围",
+      // placeholder: "请输入账号",
+      itemWidth: 100,
+      isShow: isShowPurchaseAtt.value,
+    },
   ];
 });
 const rules = ref({
@@ -364,6 +399,36 @@ const rules = ref({
     { required: true, message: "请选择关联公司", trigger: "change" },
   ],
 });
+
+const changeRoleId = (val) => {
+  if (val && val.length > 0) {
+    for (let i = 0; i < roleData.value.length; i++) {
+      const role = roleData.value[i];
+      for (let j = 0; j < val.length; j++) {
+        const roleId = val[j];
+        if (role.id == roleId) {
+          if (role.label.indexOf("采购") != -1) {
+            isShowPurchaseAtt.value = true;
+            return;
+          }
+        }
+      }
+    }
+    isShowPurchaseAtt.value = false;
+  } else {
+    isShowPurchaseAtt.value = false;
+  }
+};
+
+const arrayRecursion = (arr, definition) => {
+  arr.forEach((item) => {
+    item.definition = definition;
+    if (item.children && item.children.length > 0) {
+      arrayRecursion(item.children, definition);
+    }
+  });
+  return arr;
+};
 const getUserList = () => {
   proxy
     .get(
@@ -394,6 +459,57 @@ const getUserList = () => {
         value: x.deptId,
       }));
     });
+
+  // proxy
+  //   .post("/productClassify/tree", {
+  //     parentId: "",
+  //     name: "",
+  //     definition: "",
+  //   })
+  //   .then((res) => {
+  //     productTreeData.value = res;
+  //   });
+  Promise.all([
+    proxy.post("/productClassify/tree", {
+      parentId: "",
+      name: "",
+      definition: "1",
+    }),
+    proxy.post("/productClassify/tree", {
+      parentId: "",
+      name: "",
+      definition: "2",
+    }),
+  ]).then((res) => {
+    if (res && res.length > 1) {
+      res[1].forEach((x) => {
+        x.id = x.id + "";
+      });
+      productTreeData.value = [
+        {
+          id: "-999",
+          name: "全部",
+          parentId: "",
+          children: [
+            {
+              id: "-9",
+              definition: "2",
+              name: "物料",
+              parentId: "-999",
+              children: arrayRecursion(res[1], "2"),
+            },
+            {
+              id: "-99",
+              definition: "1",
+              name: "产品",
+              parentId: "-999",
+              children: arrayRecursion(res[0], "1"),
+            },
+          ],
+        },
+      ];
+    }
+  });
 };
 getUserList();
 const openModal = () => {
@@ -402,6 +518,8 @@ const openModal = () => {
     userType: 1,
     tenantId: proxy.useUserStore().user.tenantId,
     companySet: [],
+    purchaseRange: [],
+    purchaseRangeOne: [],
   };
   loadingDialog.value = false;
   dialogVisible.value = true;
@@ -452,6 +570,12 @@ const handleDeptIdChange = (val) => {
     findCompanyType(current.parentId);
   }
 };
+
+const noRepeat = (arr) => {
+  var newArr = [...new Set(arr)];
+  return newArr;
+};
+
 const submitForm = () => {
   submit.value.handleSubmit(() => {
     if (formData.data.password && formData.data.password.length < 5) {
@@ -461,6 +585,12 @@ const submitForm = () => {
     if (formData.data.companySet && formData.data.companySet.length > 0) {
       formData.data.companySet = formData.data.companySet.join(",");
     }
+    let data = noRepeat(
+      productTree.value
+        .getHalfCheckedKeys()
+        .concat(productTree.value.getCheckedKeys())
+    );
+    formData.data.purchaseRange = data.join(",");
     proxy.post("/tenantUser", formData.data, method).then(() => {
       if (formData.data.password && formData.data.userId) {
         proxy
@@ -506,6 +636,13 @@ const getDtl = (row) => {
   dialogVisible.value = true;
   proxy.get(`/tenantUser/${row.userId}`).then((res) => {
     formData.data = { ...row, userType: 1, roleIds: res.roleIds };
+    if (res.data && res.data.purchaseRange) {
+      formData.data.purchaseRange = [];
+      formData.data.purchaseRangeOne = res.data.purchaseRange.split(",");
+    } else {
+      formData.data.purchaseRangeOne = [];
+    }
+    changeRoleId(res.roleIds);
     let companySetData = formData.data.companySet
       ? formData.data.companySet
       : "";