xsh_1997 il y a 6 jours
Parent
commit
0f6cceabeb

+ 4 - 22
ruoyi-ui/src/api/dataModel/pasture.js

@@ -17,28 +17,10 @@ export function getPasture(id) {
17 17
   })
18 18
 }
19 19
 
20
-/** 新增 */
21
-export function addPasture(data) {
20
+/** 从第三方同步 */
21
+export function syncPasture() {
22 22
   return request({
23
-    url: "/dataModel/pasture",
24
-    method: "post",
25
-    data
26
-  })
27
-}
28
-
29
-/** 修改 */
30
-export function updatePasture(data) {
31
-  return request({
32
-    url: "/dataModel/pasture",
33
-    method: "put",
34
-    data
35
-  })
36
-}
37
-
38
-/** 删除(逻辑删除) */
39
-export function delPasture(ids) {
40
-  return request({
41
-    url: "/dataModel/pasture/" + ids,
42
-    method: "delete"
23
+    url: "/dataModel/pasture/sync",
24
+    method: "post"
43 25
   })
44 26
 }

+ 27 - 49
ruoyi-ui/src/lang/bo/dataModel.js

@@ -94,60 +94,38 @@ export default {
94 94
     viewUpdateTime: "རྩོམ་སྒྲིག་དུས་ཚོད།"
95 95
   },
96 96
   pasture: {
97
-    queryKeyword: "རྩྭ་ཁང་མིང་།",
97
+    queryKeyword: "ཞིང་ཁང་མིང་།",
98 98
     queryKeywordPh: "མིང་འཚོལ་རོགས།",
99
-    queryPastureNature: "རང་བཞིན།",
100
-    queryBizStatus: "གནས་བབ།",
101
-    colPastureName: "རྩྭ་ཁང་མིང་།",
102
-    colPastureNature: "རང་བཞིན།",
103
-    colIdCardNo: "ཐོབ་ཐང་།",
104
-    colRegion: "ས་ཁུལ།",
105
-    colDetailAddress: "ཁ་བྱང་།",
99
+    queryFarmType: "ཞིང་ཁང་རིགས།",
100
+    colPastureName: "ཞིང་ཁང་མིང་།",
101
+    colFarmType: "ཞིང་ཁང་རིགས།",
102
+    colCounty: "རྫོང་ཁག",
103
+    colTown: "ཤང་གྲོང་།",
106 104
     colPersonInCharge: "འགན་འཛིན།",
107
-    colContactPhone: "འབྲེལ་ཁ།",
108
-    colBizStatus: "གནས་བབ།",
109
-    formPastureName: "རྩྭ་ཁང་མིང་།",
110
-    formPastureNature: "རང་བཞིན།",
111
-    formIdCardNo: "ཐོབ་ཐང་།",
112
-    formRegion: "ས་ཁུལ།",
105
+    colContactPhone: "འབྲེལ་གཏུག",
106
+    formPastureName: "ཞིང་ཁང་མིང་།",
107
+    formFarmType: "ཞིང་ཁང་རིགས།",
108
+    formIntroduction: "ངོ་སྤྲོད།",
109
+    formLongitude: "གཞུང་ཚད།",
110
+    formLatitude: "འཕྲེད་ཚད།",
113 111
     formDetailAddress: "ཁ་བྱང་།",
114 112
     formPersonInCharge: "འགན་འཛིན།",
115
-    formContactPhone: "འབྲེལ་ཁ།",
116
-    formBizStatus: "གནས་བབ།",
117
-    formPhoto: "པར་རིས།",
113
+    formContactPhone: "འབྲེལ་གཏུག་ཁ་པར།",
114
+    formCounty: "རྫོང་ཁག",
115
+    formTown: "ཤང་གྲོང་།",
116
+    formFloorArea: "ས་ཁོངས་ཆེ་ཆུང་།",
117
+    formScaleBreeding: "འཕྲུལ་སྐྱོད་ཆེ་ཆུང་།",
118
+    formBreedSpecies: "འཕྲུལ་རིགས།",
119
+    formDataSource: "གཞི་གྲངས་ཁུངས།",
120
+    formLastSyncTime: "མཉམ་སྒྲིག་དུས་ཚོད།",
118 121
     formRemark: "ཟིན་བྲིས།",
119
-    phPastureName: "མིང་1-10",
120
-    phIdCardIndividual: "ཐོབ་ཐང་18",
121
-    phIdCardEnterprise: "ཚོགས་པ་ཨང་18",
122
-    phDetailAddress: "50ཡན་མི་ཆོག",
123
-    phPersonInCharge: "10ཡན་མི་ཆོག",
124
-    phContactPhone: "ཁ་པར་11",
125
-    phRemark: "འདེམས་ཆོག",
126
-    tipPhoto: "jpg/png 10MB",
127
-    nature1: "མི་སྒེར།",
128
-    nature2: "ཁེ་ལས།",
129
-    bizStatus1: "སྤྱིར་བཏང་།",
130
-    bizStatus2: "བཀག་སྡོད།",
131
-    bizStatus3: "ཐོབ་ཐོང་།",
132
-    ruleNameRequired: "མིང་འབྲི་རོགས།",
133
-    ruleNameLen: "མིང་1-10",
134
-    ruleNatureRequired: "རང་བཞིན་འདེམས་རོགས།",
135
-    ruleIdCardRequired: "ཨང་གྲངས་འབྲི་རོགས།",
136
-    ruleIdCardInvalid: "ཐོབ་ཐང་ཕྱི་མིན།",
137
-    ruleUsccInvalid: "ཚོགས་པ་ཨང་ཕྱི་མིན།",
138
-    ruleRegionRequired: "རྫོང་བར་འདེམས་རོགས།",
139
-    rulePhoneRequired: "ཁ་པར་འབྲི་རོགས།",
140
-    rulePhoneInvalid: "ཁ་པར་ཕྱི་མིན།",
141
-    ruleBizStatusRequired: "གནས་བབ་འདེམས་རོགས།",
142
-    ruleDetailLen: "ཁ་བྱང་50ལས་མི་ཆོག",
143
-    rulePersonLen: "འགན་འཛིན་10ལས་མི་ཆོག",
144
-    dialogAdd: "[གསར་སྣོན]རྩྭ་ཁང་།",
145
-    dialogEdit: "[རྩོམ་སྒྲིག]རྩྭ་ཁང་།",
146
-    confirmDelete: "ཐོ་གཞུང་འདི་སུབ་རྒྱུ་གཏན་ཁེལ་ལམ?",
147
-    confirmDeleteBatch: "ཐོ་གཞུང་འདི་སུབ་རྒྱུ་གཏན་ཁེལ་ལམ?",
148
-    viewCreateBy: "གསར་སྣོན་མཁན།",
149
-    viewUpdateBy: "རྩོམ་སྒྲིག་མཁན།",
150
-    viewUpdateTime: "རྩོམ་སྒྲིག་དུས་ཚོད།"
122
+    farmType1: "མི་སྒེར།",
123
+    farmType2: "ཁེ་ལས།",
124
+    dataSourceThirdParty: "ཕྱི་རོལ་མཉམ་སྒྲིག",
125
+    btnSync: "མཉམ་སྒྲིག",
126
+    syncSummary: "མཉམ་སྒྲིག་ཟིན:གསར་{insert} རྩོམ་{update} ཕམ་{fail}",
127
+    syncTimeHint: "གཞི་གྲངས་མཇུག:{time}",
128
+    emptyList: "གཞི་གྲངས་མེད།"
151 129
   },
152 130
   grasslandUsage: {
153 131
     queryKeyword: "རྩྭ་ཁང་མིང་།",

+ 27 - 49
ruoyi-ui/src/lang/zh/dataModel.js

@@ -94,60 +94,38 @@ export default {
94 94
     viewUpdateTime: "修改时间"
95 95
   },
96 96
   pasture: {
97
-    queryKeyword: "牧场名称",
98
-    queryKeywordPh: "请输入牧场名称关键字",
99
-    queryPastureNature: "牧场性质",
100
-    queryBizStatus: "经营状态",
101
-    colPastureName: "牧场名称",
102
-    colPastureNature: "牧场性质",
103
-    colIdCardNo: "身份证号",
104
-    colRegion: "所属区域",
105
-    colDetailAddress: "详细地址",
97
+    queryKeyword: "农场名称",
98
+    queryKeywordPh: "请输入农场名称关键字",
99
+    queryFarmType: "农场类型",
100
+    colPastureName: "农场名称",
101
+    colFarmType: "农场类型",
102
+    colCounty: "区县",
103
+    colTown: "乡镇",
106 104
     colPersonInCharge: "负责人",
107 105
     colContactPhone: "联系方式",
108
-    colBizStatus: "经营状态",
109
-    formPastureName: "牧场名称",
110
-    formPastureNature: "牧场性质",
111
-    formIdCardNo: "身份证号",
112
-    formRegion: "所属区域",
106
+    formPastureName: "农场名称",
107
+    formFarmType: "农场类型",
108
+    formIntroduction: "农场简介",
109
+    formLongitude: "经度",
110
+    formLatitude: "纬度",
113 111
     formDetailAddress: "详细地址",
114 112
     formPersonInCharge: "负责人",
115
-    formContactPhone: "联系方式",
116
-    formBizStatus: "经营状态",
117
-    formPhoto: "照片",
113
+    formContactPhone: "联系电话",
114
+    formCounty: "区县",
115
+    formTown: "乡镇",
116
+    formFloorArea: "占地面积",
117
+    formScaleBreeding: "养殖规模",
118
+    formBreedSpecies: "养殖品种",
119
+    formDataSource: "数据来源",
120
+    formLastSyncTime: "最近同步时间",
118 121
     formRemark: "备注",
119
-    phPastureName: "请输入牧场名称(1~10字)",
120
-    phIdCardIndividual: "请输入18位身份证号",
121
-    phIdCardEnterprise: "请输入18位主体识别号",
122
-    phDetailAddress: "选填,不超过50字",
123
-    phPersonInCharge: "选填,不超过10字",
124
-    phContactPhone: "请输入11位手机号",
125
-    phRemark: "选填",
126
-    tipPhoto: "支持 jpg/jpeg/png,单张不超过 10MB",
127
-    nature1: "个体",
128
-    nature2: "企业",
129
-    bizStatus1: "正常",
130
-    bizStatus2: "停业",
131
-    bizStatus3: "注销",
132
-    ruleNameRequired: "请输入牧场名称",
133
-    ruleNameLen: "牧场名称长度为 1~10 个字符",
134
-    ruleNatureRequired: "请选择牧场性质",
135
-    ruleIdCardRequired: "请输入证件号码",
136
-    ruleIdCardInvalid: "身份证号格式不正确",
137
-    ruleUsccInvalid: "主体识别号格式不正确",
138
-    ruleRegionRequired: "请选择至县级所属区域",
139
-    rulePhoneRequired: "请输入联系方式",
140
-    rulePhoneInvalid: "手机号格式不正确",
141
-    ruleBizStatusRequired: "请选择经营状态",
142
-    ruleDetailLen: "详细地址不能超过 50 个字符",
143
-    rulePersonLen: "负责人不能超过 10 个字符",
144
-    dialogAdd: "[新增]牧场",
145
-    dialogEdit: "[编辑]牧场",
146
-    confirmDelete: "是否确认删除这条数据?",
147
-    confirmDeleteBatch: "是否确认删除这条数据?",
148
-    viewCreateBy: "创建人",
149
-    viewUpdateBy: "修改人",
150
-    viewUpdateTime: "修改时间"
122
+    farmType1: "个体",
123
+    farmType2: "企业",
124
+    dataSourceThirdParty: "第三方同步",
125
+    btnSync: "同步",
126
+    syncSummary: "同步完成:新增 {insert} 条,更新 {update} 条,失败 {fail} 条",
127
+    syncTimeHint: "数据截至:{time}",
128
+    emptyList: "暂无牧场数据"
151 129
   },
152 130
   grasslandUsage: {
153 131
     queryKeyword: "草场名称",

+ 135 - 528
ruoyi-ui/src/views/dataModel/pasture/index.vue

@@ -12,95 +12,62 @@
12 12
             @keyup.enter.native="handleQuery"
13 13
           />
14 14
         </el-form-item>
15
-        <el-form-item prop="pastureNature">
16
-          <template slot="label">{{ dmT("queryPastureNature") }}</template>
17
-          <el-select v-model="queryParams.pastureNature" :placeholder="dmCommon('pleaseSelect')" clearable style="width: 120px">
18
-            <el-option v-for="item in pastureNatureOptions" :key="item.value" :label="item.label" :value="item.value" />
19
-          </el-select>
20
-        </el-form-item>
21
-        <el-form-item prop="bizStatus">
22
-          <template slot="label">{{ dmT("queryBizStatus") }}</template>
23
-          <el-select v-model="queryParams.bizStatus" :placeholder="dmCommon('pleaseSelect')" clearable style="width: 120px">
24
-            <el-option v-for="item in bizStatusOptions" :key="item.value" :label="item.label" :value="item.value" />
15
+        <el-form-item prop="farmType">
16
+          <template slot="label">{{ dmT("queryFarmType") }}</template>
17
+          <el-select v-model="queryParams.farmType" :placeholder="dmCommon('pleaseSelect')" clearable style="width: 120px">
18
+            <el-option v-for="item in farmTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
25 19
           </el-select>
26 20
         </el-form-item>
27 21
         <el-form-item>
28 22
           <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">{{ dmCommon("search") }}</el-button>
29 23
           <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">{{ dmCommon("reset") }}</el-button>
30 24
           <el-button
31
-            v-hasPermi="['dataModel:pasture:add']"
32
-            type="primary"
33
-            plain
34
-            icon="el-icon-plus"
35
-            size="mini"
36
-            @click="handleAdd"
37
-          >{{ dmCommon("add") }}</el-button>
38
-          <el-button
39
-            v-hasPermi="['dataModel:pasture:remove']"
40
-            type="danger"
41
-            plain
42
-            icon="el-icon-delete"
43
-            size="mini"
44
-            :disabled="!ids.length"
45
-            @click="handleDeleteBatch"
46
-          >{{ dmCommon("delete") }}</el-button>
47
-          <!-- 导出功能暂未开放
48
-          <el-button
49
-            v-hasPermi="['dataModel:pasture:export']"
25
+            v-hasPermi="['dataModel:pasture:sync']"
50 26
             type="warning"
51 27
             plain
52
-            icon="el-icon-download"
28
+            icon="el-icon-refresh"
53 29
             size="mini"
54
-            @click="handleExport"
55
-          >{{ dmCommon("export") }}</el-button>
56
-          -->
30
+            :loading="syncing"
31
+            @click="handleSync"
32
+          >{{ dmT("btnSync") }}</el-button>
57 33
         </el-form-item>
58 34
       </el-form>
35
+      <div v-if="lastSyncHint" class="pasture-sync-hint">{{ lastSyncHint }}</div>
59 36
     </el-card>
60 37
 
61 38
     <br />
62 39
 
63 40
     <el-card shadow="never">
64
-      <el-table v-loading="loading" :data="tableList" border @selection-change="handleSelectionChange">
65
-        <el-table-column type="selection" width="50" align="center" fixed="left" />
66
-        <el-table-column :label="dmT('colPastureName')" prop="pastureName" align="center" min-width="100" fixed="left" :show-overflow-tooltip="true" />
67
-        <el-table-column :label="dmT('colPastureNature')" align="center" width="80">
41
+      <el-table v-loading="loading" :data="tableList" border>
42
+        <template slot="empty">
43
+          <span>{{ dmT("emptyList") }}</span>
44
+        </template>
45
+        <el-table-column :label="dmT('colPastureName')" prop="pastureName" align="center" min-width="120" :show-overflow-tooltip="true" />
46
+        <el-table-column :label="dmT('colFarmType')" align="center" width="90">
68 47
           <template slot-scope="scope">
69
-            <span>{{ pastureNatureLabel(scope.row.pastureNature) }}</span>
48
+            <span>{{ farmTypeLabel(scope.row.farmType) }}</span>
70 49
           </template>
71 50
         </el-table-column>
72
-        <el-table-column :label="dmT('colIdCardNo')" align="center" min-width="140" :show-overflow-tooltip="true">
51
+        <el-table-column :label="dmT('colCounty')" prop="county" align="center" min-width="100" :show-overflow-tooltip="true" />
52
+        <el-table-column :label="dmT('colTown')" prop="town" align="center" min-width="100" :show-overflow-tooltip="true" />
53
+        <el-table-column :label="dmT('colPersonInCharge')" align="center" width="90" :show-overflow-tooltip="true">
73 54
           <template slot-scope="scope">
74
-            <span>{{ maskIdCard(scope.row.idCardNo) }}</span>
55
+            <span>{{ maskPerson(scope.row.personInCharge) }}</span>
75 56
           </template>
76 57
         </el-table-column>
77
-        <el-table-column :label="dmT('colRegion')" align="center" min-width="160" :show-overflow-tooltip="true">
78
-          <template slot-scope="scope">
79
-            <span>{{ formatRegion(scope.row) }}</span>
80
-          </template>
81
-        </el-table-column>
82
-        <el-table-column :label="dmT('colDetailAddress')" prop="detailAddress" align="center" min-width="120" :show-overflow-tooltip="true" />
83
-        <el-table-column :label="dmT('colPersonInCharge')" prop="personInCharge" align="center" width="90" :show-overflow-tooltip="true" />
84 58
         <el-table-column :label="dmT('colContactPhone')" align="center" width="120">
85 59
           <template slot-scope="scope">
86 60
             <span>{{ maskPhone(scope.row.contactPhone) }}</span>
87 61
           </template>
88 62
         </el-table-column>
89
-        <el-table-column :label="dmT('colBizStatus')" align="center" width="80">
90
-          <template slot-scope="scope">
91
-            <span>{{ bizStatusLabel(scope.row.bizStatus) }}</span>
92
-          </template>
93
-        </el-table-column>
94 63
         <el-table-column :label="dmCommon('colCreate')" align="center" width="160">
95 64
           <template slot-scope="scope">
96 65
             <span>{{ scope.row.createTime ? parseTime(scope.row.createTime) : $t("dataModel.status.dash") }}</span>
97 66
           </template>
98 67
         </el-table-column>
99
-        <el-table-column :label="dmCommon('colOp')" align="center" class-name="small-padding fixed-width" width="180" fixed="right">
68
+        <el-table-column :label="dmCommon('colOp')" align="center" class-name="small-padding fixed-width" width="80" fixed="right">
100 69
           <template slot-scope="scope">
101 70
             <el-button v-hasPermi="['dataModel:pasture:query']" type="text" size="mini" @click="handleView(scope.row)">{{ dmCommon("view") }}</el-button>
102
-            <el-button v-hasPermi="['dataModel:pasture:edit']" type="text" size="mini" @click="handleEdit(scope.row)">{{ dmCommon("edit") }}</el-button>
103
-            <el-button v-hasPermi="['dataModel:pasture:remove']" type="text" size="mini" @click="handleDelete(scope.row)">{{ dmCommon("delete") }}</el-button>
104 71
           </template>
105 72
         </el-table-column>
106 73
       </el-table>
@@ -113,182 +80,92 @@
113 80
       />
114 81
     </el-card>
115 82
 
116
-    <el-dialog :title="dialogTitle" :visible.sync="open" width="900px" append-to-body @close="cancel">
117
-      <el-form :key="formKey" ref="form" :model="form" label-width="130px">
83
+    <el-dialog :title="dmCommon('viewTitle')" :visible.sync="viewOpen" width="900px" append-to-body>
84
+      <el-form label-width="130px" size="small">
118 85
         <el-row :gutter="16">
119 86
           <el-col :span="12">
120
-            <el-form-item prop="pastureName" :rules="formRules.pastureName">
121
-              <template slot="label">{{ dmT("formPastureName") }}</template>
122
-              <el-input v-model="form.pastureName" :placeholder="dmT('phPastureName')" maxlength="10" show-word-limit />
123
-            </el-form-item>
124
-          </el-col>
125
-          <el-col :span="12">
126
-            <el-form-item prop="pastureNature" :rules="formRules.pastureNature">
127
-              <template slot="label">{{ dmT("formPastureNature") }}</template>
128
-              <el-select v-model="form.pastureNature" :placeholder="dmCommon('pleaseSelect')" style="width: 100%" @change="handleNatureChange">
129
-                <el-option v-for="item in pastureNatureOptions" :key="item.value" :label="item.label" :value="item.value" />
130
-              </el-select>
131
-            </el-form-item>
132
-          </el-col>
133
-          <el-col :span="12">
134
-            <el-form-item prop="idCardNo" :rules="formRules.idCardNo">
135
-              <template slot="label">{{ dmT("formIdCardNo") }}</template>
136
-              <el-input v-model="form.idCardNo" :placeholder="idCardPlaceholder" maxlength="18" />
87
+            <el-form-item :label="dmT('formPastureName')">
88
+              <span>{{ viewRow.pastureName || dash }}</span>
137 89
             </el-form-item>
138 90
           </el-col>
139 91
           <el-col :span="12">
140
-            <el-form-item prop="regionCodes" :rules="formRules.regionCodes">
141
-              <template slot="label">{{ dmT("formRegion") }}</template>
142
-              <region-cascader
143
-                :province-code.sync="form.provinceCode"
144
-                :province-name.sync="form.provinceName"
145
-                :city-code.sync="form.cityCode"
146
-                :city-name.sync="form.cityName"
147
-                :county-code.sync="form.countyCode"
148
-                :county-name.sync="form.countyName"
149
-                :placeholder="dmCommon('pleaseSelect')"
150
-                @change="handleRegionChange"
151
-              />
92
+            <el-form-item :label="dmT('formFarmType')">
93
+              <span>{{ farmTypeLabel(viewRow.farmType) }}</span>
152 94
             </el-form-item>
153 95
           </el-col>
154 96
           <el-col :span="24">
155
-            <el-form-item prop="detailAddress" :rules="formRules.detailAddress">
156
-              <template slot="label">{{ dmT("formDetailAddress") }}</template>
157
-              <el-input v-model="form.detailAddress" :placeholder="dmT('phDetailAddress')" maxlength="50" show-word-limit />
158
-            </el-form-item>
159
-          </el-col>
160
-          <el-col :span="12">
161
-            <el-form-item prop="personInCharge" :rules="formRules.personInCharge">
162
-              <template slot="label">{{ dmT("formPersonInCharge") }}</template>
163
-              <el-input v-model="form.personInCharge" :placeholder="dmT('phPersonInCharge')" maxlength="10" show-word-limit />
97
+            <el-form-item :label="dmT('formIntroduction')">
98
+              <span class="pasture-view-text">{{ viewRow.introduction || dash }}</span>
164 99
             </el-form-item>
165 100
           </el-col>
166 101
           <el-col :span="12">
167
-            <el-form-item prop="contactPhone" :rules="formRules.contactPhone">
168
-              <template slot="label">{{ dmT("formContactPhone") }}</template>
169
-              <el-input v-model="form.contactPhone" :placeholder="dmT('phContactPhone')" maxlength="11" />
102
+            <el-form-item :label="dmT('formLongitude')">
103
+              <span>{{ formatCoord(viewRow.longitude) }}</span>
170 104
             </el-form-item>
171 105
           </el-col>
172 106
           <el-col :span="12">
173
-            <el-form-item prop="bizStatus" :rules="formRules.bizStatus">
174
-              <template slot="label">{{ dmT("formBizStatus") }}</template>
175
-              <el-select v-model="form.bizStatus" :placeholder="dmCommon('pleaseSelect')" style="width: 100%">
176
-                <el-option v-for="item in bizStatusOptions" :key="item.value" :label="item.label" :value="item.value" />
177
-              </el-select>
178
-            </el-form-item>
179
-          </el-col>
180
-          <el-col :span="24">
181
-            <el-form-item prop="photoFilePath">
182
-              <template slot="label">{{ dmT("formPhoto") }}</template>
183
-              <el-upload
184
-                list-type="picture-card"
185
-                :class="{ hide: hidePhotoUpload }"
186
-                :action="uploadAction"
187
-                :headers="uploadHeaders"
188
-                :before-upload="beforePhotoUpload"
189
-                :on-success="handlePhotoUploadSuccess"
190
-                :on-error="handleUploadError"
191
-                :on-remove="handlePhotoRemove"
192
-                :limit="1"
193
-                :file-list="photoFileList"
194
-              >
195
-                <i class="el-icon-plus" />
196
-              </el-upload>
197
-              <div class="el-upload__tip">{{ dmT("tipPhoto") }}</div>
107
+            <el-form-item :label="dmT('formLatitude')">
108
+              <span>{{ formatCoord(viewRow.latitude) }}</span>
198 109
             </el-form-item>
199 110
           </el-col>
200 111
           <el-col :span="24">
201
-            <el-form-item prop="remark" :rules="formRules.remark">
202
-              <template slot="label">{{ dmT("formRemark") }}</template>
203
-              <el-input v-model="form.remark" type="textarea" :rows="2" :placeholder="dmT('phRemark')" maxlength="100" show-word-limit />
204
-            </el-form-item>
205
-          </el-col>
206
-        </el-row>
207
-      </el-form>
208
-      <div slot="footer" class="dialog-footer">
209
-        <el-button type="primary" @click="submitForm">{{ dmCommon("ok") }}</el-button>
210
-        <el-button @click="cancel">{{ dmCommon("cancel") }}</el-button>
211
-      </div>
212
-    </el-dialog>
213
-
214
-    <el-dialog :title="dmCommon('viewTitle')" :visible.sync="viewOpen" width="900px" append-to-body>
215
-      <el-form label-width="130px" size="small">
216
-        <el-row :gutter="16">
217
-          <el-col :span="12">
218
-            <el-form-item :label="dmT('formPastureName')">
219
-              <span>{{ viewRow.pastureName || $t("dataModel.status.dash") }}</span>
220
-            </el-form-item>
221
-          </el-col>
222
-          <el-col :span="12">
223
-            <el-form-item :label="dmT('formPastureNature')">
224
-              <span>{{ pastureNatureLabel(viewRow.pastureNature) }}</span>
112
+            <el-form-item :label="dmT('formDetailAddress')">
113
+              <span>{{ viewRow.detailAddress || dash }}</span>
225 114
             </el-form-item>
226 115
           </el-col>
227 116
           <el-col :span="12">
228
-            <el-form-item :label="dmT('formIdCardNo')">
229
-              <span>{{ viewRow.idCardNo || $t("dataModel.status.dash") }}</span>
117
+            <el-form-item :label="dmT('formPersonInCharge')">
118
+              <span>{{ viewRow.personInCharge || dash }}</span>
230 119
             </el-form-item>
231 120
           </el-col>
232 121
           <el-col :span="12">
233
-            <el-form-item :label="dmT('formRegion')">
234
-              <span>{{ formatRegion(viewRow) }}</span>
235
-            </el-form-item>
236
-          </el-col>
237
-          <el-col :span="24">
238
-            <el-form-item :label="dmT('formDetailAddress')">
239
-              <span>{{ viewRow.detailAddress || $t("dataModel.status.dash") }}</span>
122
+            <el-form-item :label="dmT('formContactPhone')">
123
+              <span>{{ viewRow.contactPhone || dash }}</span>
240 124
             </el-form-item>
241 125
           </el-col>
242 126
           <el-col :span="12">
243
-            <el-form-item :label="dmT('formPersonInCharge')">
244
-              <span>{{ viewRow.personInCharge || $t("dataModel.status.dash") }}</span>
127
+            <el-form-item :label="dmT('formCounty')">
128
+              <span>{{ viewRow.county || dash }}</span>
245 129
             </el-form-item>
246 130
           </el-col>
247 131
           <el-col :span="12">
248
-            <el-form-item :label="dmT('formContactPhone')">
249
-              <span>{{ viewRow.contactPhone || $t("dataModel.status.dash") }}</span>
132
+            <el-form-item :label="dmT('formTown')">
133
+              <span>{{ viewRow.town || dash }}</span>
250 134
             </el-form-item>
251 135
           </el-col>
252 136
           <el-col :span="12">
253
-            <el-form-item :label="dmT('formBizStatus')">
254
-              <span>{{ bizStatusLabel(viewRow.bizStatus) }}</span>
137
+            <el-form-item :label="dmT('formFloorArea')">
138
+              <span>{{ viewRow.floorArea || dash }}</span>
255 139
             </el-form-item>
256 140
           </el-col>
257 141
           <el-col :span="12">
258
-            <el-form-item :label="dmT('formPhoto')">
259
-              <el-image
260
-                v-if="viewRow.photoFileUrl"
261
-                :src="viewPhotoUrl"
262
-                style="width: 80px; height: 80px"
263
-                fit="cover"
264
-                :preview-src-list="[viewPhotoUrl]"
265
-              />
266
-              <span v-else>{{ $t("dataModel.status.dash") }}</span>
142
+            <el-form-item :label="dmT('formScaleBreeding')">
143
+              <span>{{ viewRow.scaleBreeding || dash }}</span>
267 144
             </el-form-item>
268 145
           </el-col>
269 146
           <el-col :span="24">
270
-            <el-form-item :label="dmT('formRemark')">
271
-              <span>{{ viewRow.remark || $t("dataModel.status.dash") }}</span>
147
+            <el-form-item :label="dmT('formBreedSpecies')">
148
+              <span>{{ viewRow.breedSpecies || dash }}</span>
272 149
             </el-form-item>
273 150
           </el-col>
274 151
           <el-col :span="12">
275
-            <el-form-item :label="dmT('viewCreateBy')">
276
-              <span>{{ viewRow.createBy || $t("dataModel.status.dash") }}</span>
152
+            <el-form-item :label="dmCommon('colCreate')">
153
+              <span>{{ viewRow.createTime ? parseTime(viewRow.createTime) : dash }}</span>
277 154
             </el-form-item>
278 155
           </el-col>
279 156
           <el-col :span="12">
280
-            <el-form-item :label="dmCommon('colCreate')">
281
-              <span>{{ viewRow.createTime ? parseTime(viewRow.createTime) : $t("dataModel.status.dash") }}</span>
157
+            <el-form-item :label="dmT('formDataSource')">
158
+              <span>{{ dataSourceLabel(viewRow.dataSource) }}</span>
282 159
             </el-form-item>
283 160
           </el-col>
284 161
           <el-col :span="12">
285
-            <el-form-item :label="dmT('viewUpdateBy')">
286
-              <span>{{ viewRow.updateBy || $t("dataModel.status.dash") }}</span>
162
+            <el-form-item :label="dmT('formLastSyncTime')">
163
+              <span>{{ viewRow.lastSyncTime ? parseTime(viewRow.lastSyncTime) : dash }}</span>
287 164
             </el-form-item>
288 165
           </el-col>
289
-          <el-col :span="12">
290
-            <el-form-item :label="dmT('viewUpdateTime')">
291
-              <span>{{ viewRow.updateTime ? parseTime(viewRow.updateTime) : $t("dataModel.status.dash") }}</span>
166
+          <el-col :span="24">
167
+            <el-form-item :label="dmT('formRemark')">
168
+              <span class="pasture-view-text">{{ viewRow.remark || dash }}</span>
292 169
             </el-form-item>
293 170
           </el-col>
294 171
         </el-row>
@@ -301,249 +178,91 @@
301 178
 </template>
302 179
 
303 180
 <script>
304
-import { getToken } from "@/utils/auth"
305 181
 import dataModelLocaleMixin from "@/mixins/dataModelLocaleMixin"
306
-import RegionCascader from "@/components/RegionCascader/index.vue"
307
-import {
308
-  listPasture,
309
-  getPasture,
310
-  addPasture,
311
-  updatePasture,
312
-  delPasture
313
-} from "@/api/dataModel/pasture"
314
-
315
-const ID_CARD_REG = /^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/
316
-const USCC_REG = /^[0-9A-Z]{18}$/
317
-const PHONE_REG = /^1[3-9]\d{9}$/
182
+import { listPasture, getPasture, syncPasture } from "@/api/dataModel/pasture"
318 183
 
319 184
 export default {
320 185
   name: "Pasture",
321
-  components: { RegionCascader },
322 186
   mixins: [dataModelLocaleMixin],
323 187
   data() {
324 188
     return {
325 189
       dmNs: "pasture",
326 190
       loading: false,
327
-      open: false,
191
+      syncing: false,
328 192
       viewOpen: false,
329 193
       viewRow: {},
330
-      dialogEdit: false,
331
-      formKey: 0,
194
+      lastSyncHint: "",
332 195
       total: 0,
333 196
       tableList: [],
334
-      ids: [],
335 197
       queryParams: {
336 198
         pageNum: 1,
337 199
         pageSize: 20,
338 200
         keyword: undefined,
339
-        pastureNature: undefined,
340
-        bizStatus: undefined
341
-      },
342
-      form: {}
201
+        farmType: undefined
202
+      }
343 203
     }
344 204
   },
345 205
   computed: {
346
-    dialogTitle() {
347
-      return this.dialogEdit ? this.dmT("dialogEdit") : this.dmT("dialogAdd")
348
-    },
349
-    pastureNatureOptions() {
350
-      return [1, 2].map((v) => ({ value: v, label: this.dmT("nature" + v) }))
351
-    },
352
-    bizStatusOptions() {
353
-      return [1, 2, 3].map((v) => ({ value: v, label: this.dmT("bizStatus" + v) }))
354
-    },
355
-    idCardPlaceholder() {
356
-      return this.form.pastureNature === 2 ? this.dmT("phIdCardEnterprise") : this.dmT("phIdCardIndividual")
357
-    },
358
-    uploadAction() {
359
-      return process.env.VUE_APP_BASE_API + "/common/upload"
360
-    },
361
-    uploadHeaders() {
362
-      return { Authorization: "Bearer " + getToken() }
363
-    },
364
-    photoFileList() {
365
-      if (!this.form.photoFileUrl && !this.form.photoFilePath) {
366
-        return []
367
-      }
368
-      const url = this.resolvePhotoUrl(this.form.photoFileUrl, this.form.photoFilePath)
369
-      return [{ name: this.form.photoFilePath || "photo", url: url }]
370
-    },
371
-    hidePhotoUpload() {
372
-      return !!(this.form.photoFilePath || this.form.photoFileUrl)
373
-    },
374
-    viewPhotoUrl() {
375
-      return this.resolvePhotoUrl(this.viewRow.photoFileUrl, this.viewRow.photoFilePath)
376
-    },
377
-    formRules() {
378
-      return {
379
-        pastureName: [
380
-          { required: true, message: this.dmT("ruleNameRequired"), trigger: "blur" },
381
-          { min: 1, max: 10, message: this.dmT("ruleNameLen"), trigger: "blur" }
382
-        ],
383
-        pastureNature: [{ required: true, message: this.dmT("ruleNatureRequired"), trigger: "change" }],
384
-        idCardNo: [
385
-          { required: true, message: this.dmT("ruleIdCardRequired"), trigger: "blur" },
386
-          { validator: this.validateIdCardNo, trigger: "blur" }
387
-        ],
388
-        regionCodes: [
389
-          { required: true, message: this.dmT("ruleRegionRequired"), trigger: "change" },
390
-          { validator: this.validateRegion, trigger: "change" }
391
-        ],
392
-        detailAddress: [{ max: 50, message: this.dmT("ruleDetailLen"), trigger: "blur" }],
393
-        personInCharge: [{ max: 10, message: this.dmT("rulePersonLen"), trigger: "blur" }],
394
-        contactPhone: [
395
-          { required: true, message: this.dmT("rulePhoneRequired"), trigger: "blur" },
396
-          { validator: this.validatePhone, trigger: "blur" }
397
-        ],
398
-        bizStatus: [{ required: true, message: this.dmT("ruleBizStatusRequired"), trigger: "change" }],
399
-        remark: [{ max: 100, message: this.dmCommon("ruleLen100"), trigger: "blur" }]
400
-      }
206
+    dash() {
207
+      return this.$t("dataModel.status.dash")
208
+    },
209
+    farmTypeOptions() {
210
+      return [
211
+        { value: "1", label: this.dmT("farmType1") },
212
+        { value: "2", label: this.dmT("farmType2") }
213
+      ]
401 214
     }
402 215
   },
403 216
   created() {
404 217
     this.getList()
405 218
   },
406 219
   methods: {
407
-    pastureNatureLabel(v) {
220
+    farmTypeLabel(v) {
408 221
       if (v == null || v === "") {
409
-        return this.$t("dataModel.status.dash")
222
+        return this.dash
410 223
       }
411
-      return this.dmT("nature" + v) || v
412
-    },
413
-    bizStatusLabel(v) {
414
-      if (v == null || v === "") {
415
-        return this.$t("dataModel.status.dash")
224
+      const key = String(v)
225
+      if (key === "1") {
226
+        return this.dmT("farmType1")
416 227
       }
417
-      return this.dmT("bizStatus" + v) || v
418
-    },
419
-    formatRegion(row) {
420
-      if (!row) {
421
-        return this.$t("dataModel.status.dash")
228
+      if (key === "2") {
229
+        return this.dmT("farmType2")
422 230
       }
423
-      const parts = [row.provinceName, row.cityName, row.countyName].filter(Boolean)
424
-      return parts.length ? parts.join("") : this.$t("dataModel.status.dash")
231
+      return key
425 232
     },
426
-    maskIdCard(val) {
427
-      if (!val || val.length < 8) {
428
-        return val || this.$t("dataModel.status.dash")
233
+    dataSourceLabel(v) {
234
+      if (!v) {
235
+        return this.dash
429 236
       }
430
-      return val.slice(0, 4) + "**********" + val.slice(-4)
431
-    },
432
-    maskPhone(val) {
433
-      if (!val || val.length < 7) {
434
-        return val || this.$t("dataModel.status.dash")
237
+      if (v === "third_party") {
238
+        return this.dmT("dataSourceThirdParty")
435 239
       }
436
-      return val.slice(0, 3) + "****" + val.slice(-4)
240
+      return v
437 241
     },
438
-    resolvePhotoUrl(url, path) {
439
-      if (url) {
440
-        if (url.indexOf("http") === 0) {
441
-          return url
442
-        }
443
-        return process.env.VUE_APP_BASE_API + url
444
-      }
445
-      if (path) {
446
-        return process.env.VUE_APP_BASE_API + path
242
+    formatCoord(val) {
243
+      if (val == null || val === "") {
244
+        return this.dash
447 245
       }
448
-      return ""
246
+      return String(val)
449 247
     },
450
-    validateIdCardNo(rule, value, callback) {
451
-      if (!value) {
452
-        callback()
453
-        return
248
+    maskPerson(val) {
249
+      if (!val) {
250
+        return this.dash
454 251
       }
455
-      const v = String(value).trim().toUpperCase()
456
-      const nature = this.form.pastureNature
457
-      if (nature === 2) {
458
-        if (!USCC_REG.test(v)) {
459
-          callback(new Error(this.dmT("ruleUsccInvalid")))
460
-          return
461
-        }
462
-      } else if (!ID_CARD_REG.test(v)) {
463
-        callback(new Error(this.dmT("ruleIdCardInvalid")))
464
-        return
252
+      const s = String(val)
253
+      if (s.length <= 1) {
254
+        return s
465 255
       }
466
-      callback()
467
-    },
468
-    validatePhone(rule, value, callback) {
469
-      if (!value) {
470
-        callback()
471
-        return
472
-      }
473
-      if (!PHONE_REG.test(value)) {
474
-        callback(new Error(this.dmT("rulePhoneInvalid")))
475
-        return
476
-      }
477
-      callback()
478
-    },
479
-    syncRegionCodes() {
480
-      const { provinceCode, cityCode, countyCode } = this.form
481
-      this.form.regionCodes =
482
-        provinceCode && cityCode && countyCode ? [provinceCode, cityCode, countyCode] : []
483
-    },
484
-    handleRegionChange() {
485
-      this.syncRegionCodes()
486
-      this.$nextTick(() => {
487
-        if (this.$refs.form) {
488
-          this.$refs.form.validateField("regionCodes")
489
-        }
490
-      })
491
-    },
492
-    validateRegion(rule, value, callback) {
493
-      this.syncRegionCodes()
494
-      if (!this.form.provinceCode || !this.form.cityCode || !this.form.countyCode) {
495
-        callback(new Error(this.dmT("ruleRegionRequired")))
496
-        return
497
-      }
498
-      callback()
499
-    },
500
-    handleNatureChange() {
501
-      this.form.idCardNo = undefined
502
-      this.$nextTick(() => {
503
-        if (this.$refs.form) {
504
-          this.$refs.form.clearValidate("idCardNo")
505
-        }
506
-      })
507
-    },
508
-    extOf(fileName) {
509
-      if (!fileName || fileName.lastIndexOf(".") < 0) {
510
-        return ""
256
+      if (s.length === 2) {
257
+        return `${s[0]}*`
511 258
       }
512
-      return fileName.slice(fileName.lastIndexOf(".") + 1).toLowerCase()
259
+      return `${s[0]}*${s.slice(-1)}`
513 260
     },
514
-    beforePhotoUpload(file) {
515
-      const ext = this.extOf(file.name)
516
-      if (!["jpg", "jpeg", "png"].includes(ext)) {
517
-        this.$modal.msgError(this.dmT("tipPhoto"))
518
-        return false
519
-      }
520
-      if (file.name.includes(",")) {
521
-        this.$modal.msgError("文件名不能包含英文逗号")
522
-        return false
523
-      }
524
-      if (file.size / 1024 / 1024 >= 10) {
525
-        this.$modal.msgError(this.dmT("tipPhoto"))
526
-        return false
527
-      }
528
-      this.$modal.loading("正在上传图片,请稍候...")
529
-      return true
530
-    },
531
-    handlePhotoUploadSuccess(res) {
532
-      this.$modal.closeLoading()
533
-      if (res.code === 200) {
534
-        this.form.photoFileUrl = res.url
535
-        this.form.photoFilePath = res.fileName
536
-      } else {
537
-        this.$modal.msgError(res.msg || "上传失败")
261
+    maskPhone(val) {
262
+      if (!val || val.length < 7) {
263
+        return val || this.dash
538 264
       }
539
-    },
540
-    handleUploadError() {
541
-      this.$modal.closeLoading()
542
-      this.$modal.msgError("上传失败,请重试")
543
-    },
544
-    handlePhotoRemove() {
545
-      this.form.photoFileUrl = undefined
546
-      this.form.photoFilePath = undefined
265
+      return val.slice(0, 3) + "****" + val.slice(-4)
547 266
     },
548 267
     getList() {
549 268
       this.loading = true
@@ -562,168 +281,56 @@ export default {
562 281
     },
563 282
     resetQuery() {
564 283
       this.queryParams.keyword = undefined
565
-      this.queryParams.pastureNature = undefined
566
-      this.queryParams.bizStatus = undefined
284
+      this.queryParams.farmType = undefined
567 285
       this.resetForm("queryForm")
568 286
       this.handleQuery()
569 287
     },
570
-    handleSelectionChange(selection) {
571
-      this.ids = selection.map((item) => item.id)
572
-    },
573
-    resetFormModel() {
574
-      this.form = {
575
-        id: undefined,
576
-        pastureName: undefined,
577
-        pastureNature: undefined,
578
-        idCardNo: undefined,
579
-        provinceCode: undefined,
580
-        provinceName: undefined,
581
-        cityCode: undefined,
582
-        cityName: undefined,
583
-        countyCode: undefined,
584
-        countyName: undefined,
585
-        regionCodes: [],
586
-        detailAddress: undefined,
587
-        personInCharge: undefined,
588
-        contactPhone: undefined,
589
-        bizStatus: 1,
590
-        photoFileUrl: undefined,
591
-        photoFilePath: undefined,
592
-        remark: undefined
593
-      }
594
-    },
595
-    handleAdd() {
596
-      this.formKey += 1
597
-      this.resetFormModel()
598
-      this.dialogEdit = false
599
-      this.open = true
600
-      this.$nextTick(() => this.resetForm("form"))
601
-    },
602
-    handleEdit(row) {
603
-      getPasture(row.id).then((res) => {
604
-        const data = res.data || {}
605
-        this.formKey += 1
606
-        this.dialogEdit = true
607
-        this.form = {
608
-          id: data.id,
609
-          pastureName: data.pastureName,
610
-          pastureNature: data.pastureNature,
611
-          idCardNo: data.idCardNo,
612
-          provinceCode: data.provinceCode,
613
-          provinceName: data.provinceName,
614
-          cityCode: data.cityCode,
615
-          cityName: data.cityName,
616
-          countyCode: data.countyCode,
617
-          countyName: data.countyName,
618
-          regionCodes:
619
-            data.provinceCode && data.cityCode && data.countyCode
620
-              ? [data.provinceCode, data.cityCode, data.countyCode]
621
-              : [],
622
-          detailAddress: data.detailAddress,
623
-          personInCharge: data.personInCharge,
624
-          contactPhone: data.contactPhone,
625
-          bizStatus: data.bizStatus != null ? data.bizStatus : 1,
626
-          photoFileUrl: data.photoFileUrl,
627
-          photoFilePath: data.photoFilePath,
628
-          remark: data.remark
629
-        }
630
-        this.open = true
631
-        this.$nextTick(() => {
632
-          if (this.$refs.form) {
633
-            this.$refs.form.clearValidate()
634
-          }
635
-        })
636
-      })
637
-    },
638 288
     handleView(row) {
639 289
       getPasture(row.id).then((res) => {
640 290
         this.viewRow = res.data || {}
641 291
         this.viewOpen = true
642 292
       })
643 293
     },
644
-    handleDelete(row) {
645
-      this.$modal
646
-        .confirm(this.$t("dataModel.pasture.confirmDelete", { id: row.id }))
647
-        .then(() => delPasture(row.id))
648
-        .then(() => {
649
-          this.$modal.msgSuccess(this.dmCommon("msgDelOk"))
650
-          this.getList()
651
-        })
652
-        .catch(() => {})
653
-    },
654
-    handleDeleteBatch() {
655
-      if (!this.ids.length) {
294
+    handleSync() {
295
+      if (this.syncing) {
656 296
         return
657 297
       }
658
-      this.$modal
659
-        .confirm(this.dmT("confirmDeleteBatch"))
660
-        .then(() => delPasture(this.ids.join(",")))
661
-        .then(() => {
662
-          this.$modal.msgSuccess(this.dmCommon("msgDelOk"))
298
+      this.syncing = true
299
+      syncPasture()
300
+        .then((res) => {
301
+          const data = res.data || {}
302
+          this.$modal.msgSuccess(
303
+            this.dmT("syncSummary", {
304
+              insert: data.insertCount != null ? data.insertCount : 0,
305
+              update: data.updateCount != null ? data.updateCount : 0,
306
+              fail: data.failCount != null ? data.failCount : 0
307
+            })
308
+          )
309
+          if (data.failCount > 0 && data.failMessages && data.failMessages.length) {
310
+            this.$modal.msgWarning(data.failMessages.join(";"))
311
+          }
312
+          if (data.syncTime) {
313
+            this.lastSyncHint = this.dmT("syncTimeHint", { time: this.parseTime(data.syncTime) })
314
+          }
663 315
           this.getList()
664 316
         })
665
-        .catch(() => {})
666
-    },
667
-    handleExport() {
668
-      this.download(
669
-        "dataModel/pasture/export",
670
-        { ...this.queryParams },
671
-        `pasture_${new Date().getTime()}.xlsx`
672
-      )
673
-    },
674
-    buildPayload() {
675
-      return {
676
-        pastureName: this.form.pastureName,
677
-        pastureNature: this.form.pastureNature,
678
-        idCardNo: this.form.idCardNo ? String(this.form.idCardNo).trim().toUpperCase() : undefined,
679
-        provinceCode: this.form.provinceCode,
680
-        provinceName: this.form.provinceName,
681
-        cityCode: this.form.cityCode,
682
-        cityName: this.form.cityName,
683
-        countyCode: this.form.countyCode,
684
-        countyName: this.form.countyName,
685
-        detailAddress: this.form.detailAddress || undefined,
686
-        personInCharge: this.form.personInCharge || undefined,
687
-        contactPhone: this.form.contactPhone,
688
-        bizStatus: this.form.bizStatus,
689
-        photoFileUrl: this.form.photoFileUrl || undefined,
690
-        photoFilePath: this.form.photoFilePath || undefined,
691
-        remark: this.form.remark || undefined
692
-      }
693
-    },
694
-    submitForm() {
695
-      this.syncRegionCodes()
696
-      this.$refs.form.validate((valid) => {
697
-        if (!valid) {
698
-          return
699
-        }
700
-        const payload = this.buildPayload()
701
-        if (this.dialogEdit) {
702
-          payload.id = this.form.id
703
-          updatePasture(payload).then(() => {
704
-            this.$modal.msgSuccess(this.dmCommon("msgModOk"))
705
-            this.open = false
706
-            this.getList()
707
-          })
708
-        } else {
709
-          addPasture(payload).then(() => {
710
-            this.$modal.msgSuccess(this.dmCommon("msgAddOk"))
711
-            this.open = false
712
-            this.getList()
713
-          })
714
-        }
715
-      })
716
-    },
717
-    cancel() {
718
-      this.open = false
719
-      this.resetFormModel()
317
+        .finally(() => {
318
+          this.syncing = false
319
+        })
720 320
     }
721 321
   }
722 322
 }
723 323
 </script>
724 324
 
725 325
 <style scoped>
726
-::v-deep.hide .el-upload--picture-card {
727
-  display: none;
326
+.pasture-sync-hint {
327
+  margin-top: 8px;
328
+  font-size: 12px;
329
+  color: #909399;
330
+}
331
+
332
+.pasture-view-text {
333
+  white-space: pre-wrap;
334
+  word-break: break-word;
728 335
 }
729 336
 </style>