edit.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. <template>
  2. <div class="app-container">
  3. <el-form
  4. ref="formLabelAlign"
  5. label-width="120px"
  6. :model="formLabelAlign"
  7. :rules="rules"
  8. >
  9. <el-form-item label="服务商名称:" prop="name">
  10. <el-input v-model="formLabelAlign.name" placeholder="请输入服务商名称" />
  11. </el-form-item>
  12. <el-form-item label="服务商级别:" prop="serviceLevel">
  13. <el-select v-model="formLabelAlign.serviceLevel" placeholder="请选择服务商级别">
  14. <el-option
  15. v-for="i in serviceLevel"
  16. :key="i.id"
  17. :label="i.value"
  18. :value="i.id"
  19. />
  20. </el-select>
  21. </el-form-item>
  22. <el-form-item label="服务商地区:" prop="area">
  23. <el-cascader
  24. ref="cascader"
  25. :key="areaKey"
  26. v-model="formLabelAlign.area"
  27. :class="{ display: cascaderDisplay }"
  28. clearable
  29. :props="cascaderProps"
  30. style="width: 100%"
  31. :placeholder="cascaderPlaceholder"
  32. @change="handleChange"
  33. />
  34. </el-form-item>
  35. <el-form-item label="服务商类型:" prop="serviceCategory">
  36. <el-select v-model="formLabelAlign.serviceCategory" placeholder="服务商类型">
  37. <el-option
  38. v-for="i in serviceCategoryList"
  39. :key="i.id"
  40. :label="i.value"
  41. :value="i.id"
  42. />
  43. </el-select>
  44. </el-form-item>
  45. <el-form-item label="联系人:" prop="linkMan">
  46. <el-input v-model="formLabelAlign.linkMan" placeholder="请输入联系人" />
  47. </el-form-item>
  48. <el-form-item label="联系电话:" prop="mobile">
  49. <el-input
  50. v-model="formLabelAlign.mobile"
  51. placeholder="请输入联系电话"
  52. :maxlength="11"
  53. oninput="value=value.replace(/[^\d]/g, '')"
  54. />
  55. </el-form-item>
  56. <el-form-item label="简介图:" prop="textRelateds">
  57. <image-upload
  58. :limit="6"
  59. :image-list="textRelateds"
  60. @success="handleImageSuccess($event, 'textRelateds')"
  61. @remove="handleImageRemove($event, 'textRelateds')"
  62. />
  63. </el-form-item>
  64. <el-form-item label="简介:" prop="text">
  65. <el-input
  66. v-model="formLabelAlign.text"
  67. type="textarea"
  68. :autosize="{ minRows: 8, maxRows: 10 }"
  69. placeholder="请输入内容"
  70. />
  71. </el-form-item>
  72. <el-form-item v-if="id" label="资格证书:">
  73. <el-image style="width: 200px;" :src="qualificationImage" :preview-src-list="[qualificationImage]" />
  74. </el-form-item>
  75. <el-form-item label="资料上传:" prop="infoRelateds">
  76. <file-upload
  77. :list="infoList"
  78. :limit="20"
  79. :tip="'支持上传pdf、docx、 pptx文件格式'"
  80. :before-upload="beforeUpload"
  81. :is-check="false"
  82. @success="uploadSuccess($event, 'infoRelateds')"
  83. @change="uploadChange($event, 'infoRelateds')"
  84. @remove="handleRemove($event, 'infoRelateds')"
  85. />
  86. </el-form-item>
  87. <div v-if="!id">
  88. <el-form-item label="合同:">
  89. (由于是添加新服务商,必须添加合同,后续可去合同列表编辑及添加)
  90. </el-form-item>
  91. <el-form-item label="合同编号:" prop="contract.contractId">
  92. <el-input v-model="formLabelAlign.contract.contractId" />
  93. </el-form-item>
  94. <el-form-item label="合同起始日期:" prop="contract.contractStartDate">
  95. <el-date-picker
  96. v-model="formLabelAlign.contract.contractStartDate"
  97. type="date"
  98. value-format="yyyy-MM-dd"
  99. placeholder="选择日期"
  100. />
  101. </el-form-item>
  102. <el-form-item label="合同截止日期:" prop="contract.contractEndDate">
  103. <el-date-picker
  104. v-model="formLabelAlign.contract.contractEndDate"
  105. type="date"
  106. placeholder="选择日期"
  107. value-format="yyyy-MM-dd"
  108. />
  109. </el-form-item>
  110. <el-form-item label="上传合同:" prop="contract.contractRelateds">
  111. <file-upload
  112. :limit="20"
  113. :is-check="false"
  114. :file-list="contractList"
  115. :tip="'支持上传pdf、docx、 pptx文件格式'"
  116. @success="contractUploadSuccess($event)"
  117. @remove="contractHandleRemove($event)"
  118. />
  119. </el-form-item>
  120. </div>
  121. <el-form-item>
  122. <el-button type="primary" @click="submitForm('formLabelAlign')">保存</el-button>
  123. <el-button @click="$router.back()">返回</el-button>
  124. </el-form-item>
  125. </el-form>
  126. </div>
  127. </template>
  128. <script>
  129. import ImageUpload from '@/components/UploadImage/index.vue'
  130. import FileUpload from '../components/UploadFile.vue'
  131. import {
  132. getAddress,
  133. addProvider,
  134. getProviderDetail
  135. } from '@/api/serviceSettlement/service'
  136. import serviceMixin from '../mixin/index'
  137. import { mapGetters } from 'vuex'
  138. export default {
  139. components: {
  140. ImageUpload,
  141. FileUpload
  142. },
  143. mixins: [serviceMixin],
  144. data() {
  145. return {
  146. formLabelAlign: {
  147. address: '',
  148. infoRelateds: [],
  149. area: [],
  150. textRelateds: [],
  151. contract: {
  152. contractRelateds: []
  153. }
  154. },
  155. qualificationImage: '',
  156. infoList: [],
  157. contractList: [],
  158. textRelateds: [],
  159. areaKey: 0,
  160. rules: {
  161. name: [
  162. { required: true, message: '请输入服务商名称', trigger: 'blur' },
  163. { max: 50, message: '长度最多50个汉字', trigger: 'blur' }
  164. ],
  165. area: [{ required: true, message: '请选择地址', trigger: 'change' }],
  166. serviceLevel: [
  167. { required: true, message: '请选择服务商级别', trigger: 'change' }
  168. ],
  169. mobile: [{ required: true, message: '请输入联系电话', trigger: 'blur' }],
  170. linkMan: [{ required: true, message: '请输入联系人', trigger: 'blur' }],
  171. text: [{ required: true, message: '请输入简介', trigger: 'blur' }],
  172. serviceCategory: [
  173. { required: true, message: '请选择服务商类型', trigger: 'change' }
  174. ],
  175. textRelateds: [{ required: true, message: '请上传简介图', trigger: 'change' }],
  176. contract: {
  177. contractId: [{ required: true, message: '请输入合同编号', trigger: 'blur' }],
  178. contractStartDate: [
  179. { required: true, message: '请选择合同起始时间', trigger: 'change' }
  180. ],
  181. contractEndDate: [
  182. { required: true, message: '请选择合同结束时间', trigger: 'change' }
  183. ],
  184. contractRelateds: [
  185. { required: true, message: '请上传合同文件', trigger: 'change' }
  186. ]
  187. },
  188. infoRelateds: [
  189. { required: true, message: '请上传资料文件', trigger: 'change' }
  190. ]
  191. }
  192. }
  193. },
  194. computed: {
  195. ...mapGetters(['userId', 'username', 'fullName', 'phone']),
  196. id() {
  197. return this.$route.query.id || false
  198. },
  199. cascaderPlaceholder() {
  200. return this.cascaderDisplay ? this.formLabelAlign.address : '请选择所在区域'
  201. },
  202. cascaderDisplay() {
  203. return this.formLabelAlign.area.length > 0
  204. },
  205. // 级联选择器
  206. cascaderProps() {
  207. return {
  208. lazy: true,
  209. lazyLoad: async(node, resolve) => {
  210. const { level, data } = node
  211. console.log(node)
  212. const result = await getAddress({ parentId: data?.vId || 0, type: level })
  213. const nodes = result.data.map((item) => ({
  214. value: item.name,
  215. label: item.name,
  216. leaf: level >= 1,
  217. vId: item.id
  218. }))
  219. resolve(nodes)
  220. }
  221. }
  222. }
  223. },
  224. mounted() {
  225. if (this.id) {
  226. this.getInfo()
  227. }
  228. },
  229. methods: {
  230. async getInfo() {
  231. const { data } = await getProviderDetail({ providersId: this.id })
  232. this.formLabelAlign = data
  233. this.infoList = data.infoRelateds.map((e, i) => ({ name: e.fileName, response: { data: e.image }}))
  234. this.textRelateds = data.textRelateds.map((e, i) => ({ uid: i, url: e.image }))
  235. this.formLabelAlign.area = data.address.split('/').map(e => e.trim())
  236. this.qualificationImage = data.qualificationImage
  237. setTimeout(() => {
  238. this.areaKey = Math.random() * 1000
  239. }, 500)
  240. },
  241. // 地区选择
  242. handleChange($event) {
  243. console.log($event)
  244. this.formLabelAlign.address = $event.join(' / ')
  245. },
  246. // 合同上传
  247. contractUploadSuccess($event) {
  248. this.formLabelAlign.contract.contractRelateds = $event.fileList.map(e => ({ image: e.response?.data || '', fileName: e.name }))
  249. },
  250. contractHandleRemove($event) {
  251. this.formLabelAlign.contract.contractRelateds = $event.fileList.map(e => ({ image: e.response?.data || '', fileName: e.name }))
  252. },
  253. submitForm(form) {
  254. console.log(this.formLabelAlign)
  255. this.$refs[form].validate(async(valid) => {
  256. if (valid) {
  257. try {
  258. delete this.formLabelAlign.area
  259. const form = Object.assign(this.formLabelAlign, { createBy: this.fullName })
  260. await addProvider(form)
  261. this.$message({ type: 'success', message: '添加成功' })
  262. this.$router.back()
  263. } catch (e) {
  264. console.warn(e)
  265. }
  266. }
  267. })
  268. },
  269. beforeUpload(file) {
  270. console.log(file)
  271. if (file.size / 1024 / 1024 < 50) {
  272. return true
  273. } else {
  274. this.$message({
  275. type: 'error',
  276. message: '文件大小限制在50M以内'
  277. })
  278. return false
  279. }
  280. },
  281. handleImageRemove($event, name) {
  282. console.log($event, name)
  283. this.formLabelAlign[name] = $event.fileList.map(e => ({
  284. image: e.url
  285. }))
  286. },
  287. handleImageSuccess($event, name) {
  288. console.log($event)
  289. this.formLabelAlign[name] = $event.fileList.map(e => ({
  290. image: e.response ? e.response.data : e.url
  291. }))
  292. }
  293. }
  294. }
  295. </script>
  296. <style lang="scss" scoped>
  297. ::v-deep .el-input,
  298. ::v-deep .el-textarea__inner {
  299. width: 500px;
  300. }
  301. ::v-deep .el-form {
  302. width: 650px;
  303. margin: 0 auto;
  304. }
  305. </style>