edit.vue 9.9 KB

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