edit.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. <template>
  2. <div class="company-edit-container">
  3. <!-- 顶部返回 -->
  4. <div class="page-header">
  5. <el-button link @click="handleBack">
  6. <el-icon><ArrowLeft /></el-icon>
  7. <span>返回</span>
  8. </el-button>
  9. <span class="page-title">完善企业信息</span>
  10. </div>
  11. <div class="form-content">
  12. <el-form ref="formRef" :model="form" :rules="rules" label-position="top">
  13. <!-- 工商信息 -->
  14. <div class="section">
  15. <div class="section-title"><i class="title-bar"></i>工商信息</div>
  16. <el-row :gutter="20">
  17. <el-col :span="12">
  18. <el-form-item label="企业名称" prop="companyName">
  19. <el-input v-model="form.companyName" placeholder="请输入" disabled />
  20. </el-form-item>
  21. </el-col>
  22. <el-col :span="12">
  23. <el-form-item label="统一社会信用代码" prop="creditCode">
  24. <el-input v-model="form.creditCode" placeholder="请输入" disabled />
  25. </el-form-item>
  26. </el-col>
  27. </el-row>
  28. <el-row :gutter="20">
  29. <el-col :span="12">
  30. <el-form-item label="法人" prop="legalPerson">
  31. <el-input v-model="form.legalPerson" placeholder="请输入" disabled />
  32. </el-form-item>
  33. </el-col>
  34. <el-col :span="12">
  35. <el-form-item label="注册资本" prop="registeredCapital">
  36. <el-input v-model="form.registeredCapital" placeholder="请输入" disabled />
  37. </el-form-item>
  38. </el-col>
  39. </el-row>
  40. <el-row :gutter="20">
  41. <el-col :span="24">
  42. <el-form-item label="详细地址" prop="detailAddress">
  43. <el-input v-model="form.detailAddress" placeholder="请输入" maxlength="50" show-word-limit disabled />
  44. </el-form-item>
  45. </el-col>
  46. </el-row>
  47. <el-row :gutter="20">
  48. <el-col :span="24">
  49. <el-form-item label="经营范围" prop="businessScope">
  50. <el-input v-model="form.businessScope" type="textarea" :rows="3" placeholder="请输入" maxlength="300" show-word-limit disabled />
  51. </el-form-item>
  52. </el-col>
  53. </el-row>
  54. </div>
  55. <!-- 办公信息 -->
  56. <div class="section">
  57. <div class="section-title"><i class="title-bar"></i>办公信息</div>
  58. <el-row :gutter="20">
  59. <el-col :span="12">
  60. <el-form-item label="主要办公地址">
  61. <el-select v-model="form.officeProvince" placeholder="请选择" style="width: 100%"> </el-select>
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="12">
  65. <el-form-item label=" ">
  66. <el-input v-model="form.officeAddress" placeholder="请输入" />
  67. </el-form-item>
  68. </el-col>
  69. </el-row>
  70. <el-row :gutter="20">
  71. <el-col :span="12">
  72. <el-form-item label="所属行业" prop="industry">
  73. <el-select v-model="form.industry" placeholder="请选择" style="width: 100%">
  74. <el-option label="电力行业" value="电力行业" />
  75. <el-option label="制造业" value="制造业" />
  76. <el-option label="互联网" value="互联网" />
  77. <el-option label="金融业" value="金融业" />
  78. <el-option label="其他" value="其他" />
  79. </el-select>
  80. </el-form-item>
  81. </el-col>
  82. <el-col :span="12">
  83. <el-form-item label="企业规模" prop="scale">
  84. <el-select v-model="form.scale" placeholder="请选择" style="width: 100%">
  85. <el-option label="50人以下" value="50人以下" />
  86. <el-option label="50-200人" value="50-200人" />
  87. <el-option label="200-500人" value="200-500人" />
  88. <el-option label="500-1000人" value="500-1000人" />
  89. <el-option label="1000-5000人" value="1000-5000人" />
  90. <el-option label="5000人以上" value="5000人以上" />
  91. </el-select>
  92. </el-form-item>
  93. </el-col>
  94. </el-row>
  95. <el-row :gutter="20">
  96. <el-col :span="12">
  97. <el-form-item label="联系方式" prop="phone">
  98. <el-input v-model="form.phone" placeholder="请输入" />
  99. </el-form-item>
  100. </el-col>
  101. <el-col :span="12">
  102. <el-form-item label="邮箱" prop="email">
  103. <el-input v-model="form.email" placeholder="请输入" />
  104. </el-form-item>
  105. </el-col>
  106. </el-row>
  107. <el-row :gutter="20">
  108. <el-col :span="24">
  109. <el-form-item label="网址" prop="website">
  110. <el-input v-model="form.website" placeholder="请输入" maxlength="50" show-word-limit />
  111. </el-form-item>
  112. </el-col>
  113. </el-row>
  114. <el-row :gutter="20">
  115. <el-col :span="12">
  116. <el-form-item label="营业执照" prop="businessLicense">
  117. <el-upload
  118. class="upload-box"
  119. action="#"
  120. :auto-upload="false"
  121. :show-file-list="false"
  122. :on-change="(file: any) => handleUpload(file, 'businessLicense')"
  123. >
  124. <div v-if="form.businessLicense" class="upload-preview">
  125. <el-image :src="form.businessLicense" fit="cover" />
  126. </div>
  127. <div v-else class="upload-placeholder">
  128. <el-icon :size="24"><Plus /></el-icon>
  129. <span>上传</span>
  130. </div>
  131. </el-upload>
  132. </el-form-item>
  133. </el-col>
  134. <el-col :span="12">
  135. <el-form-item label="法人身份证" prop="idCard">
  136. <el-upload
  137. class="upload-box"
  138. action="#"
  139. :auto-upload="false"
  140. :show-file-list="false"
  141. :on-change="(file: any) => handleUpload(file, 'idCard')"
  142. >
  143. <div v-if="form.idCard" class="upload-preview">
  144. <el-image :src="form.idCard" fit="cover" />
  145. </div>
  146. <div v-else class="upload-placeholder">
  147. <el-icon :size="24"><Plus /></el-icon>
  148. <span>上传</span>
  149. </div>
  150. </el-upload>
  151. </el-form-item>
  152. </el-col>
  153. </el-row>
  154. </div>
  155. </el-form>
  156. <!-- 底部按钮 -->
  157. <div class="form-footer">
  158. <el-button type="danger" @click="handleSave">保存</el-button>
  159. <el-button @click="handleBack">取消</el-button>
  160. </div>
  161. </div>
  162. </div>
  163. </template>
  164. <script setup lang="ts">
  165. import { ref, reactive, onMounted } from 'vue';
  166. import { useRouter } from 'vue-router';
  167. import { ArrowLeft, Plus } from '@element-plus/icons-vue';
  168. import { ElMessage } from 'element-plus';
  169. import { getEnterpriseInfo, updateEnterpriseInfo } from '@/api/pc/enterprise';
  170. const router = useRouter();
  171. const formRef = ref();
  172. const form = reactive({
  173. companyName: '',
  174. creditCode: '',
  175. legalPerson: '',
  176. registeredCapital: '',
  177. detailAddress: '',
  178. businessScope: '',
  179. officeProvince: '',
  180. officeAddress: '',
  181. industry: '',
  182. scale: '',
  183. phone: '',
  184. email: '',
  185. website: '',
  186. businessLicense: '',
  187. idCard: ''
  188. });
  189. const rules = {
  190. companyName: [{ required: true, message: '请输入企业名称', trigger: 'blur' }],
  191. creditCode: [{ required: true, message: '请输入统一社会信用代码', trigger: 'blur' }]
  192. };
  193. // 加载企业信息
  194. const loadEnterpriseInfo = async () => {
  195. try {
  196. const res = await getEnterpriseInfo();
  197. if (res.code === 200 && res.data) {
  198. const data = res.data;
  199. const businessInfo = data.customerBusinessInfoVo || {};
  200. form.companyName = data.customerName || data.businessCustomerName || '';
  201. form.creditCode = businessInfo.socialCreditCode || '';
  202. form.legalPerson = businessInfo.legalPersonName || '';
  203. form.registeredCapital = businessInfo.registeredCapital || '';
  204. form.detailAddress = businessInfo.businessAddress || '';
  205. form.businessScope = businessInfo.bussinessRange || '';
  206. form.officeAddress = data.address || '';
  207. form.industry = data.industryCategory || '';
  208. form.scale = data.enterpriseScale || '';
  209. form.phone = data.landline || '';
  210. form.email = businessInfo.email || data.fax || '';
  211. form.website = data.url || '';
  212. form.businessLicense = businessInfo.businessLicense || '';
  213. form.idCard = businessInfo.idCard || '';
  214. }
  215. } catch (error) {
  216. console.error('加载企业信息失败:', error);
  217. ElMessage.error('加载企业信息失败');
  218. }
  219. };
  220. onMounted(() => {
  221. loadEnterpriseInfo();
  222. });
  223. const handleBack = () => {
  224. router.push('/enterprise/companyInfo');
  225. };
  226. const handleUpload = (file: any, field: string) => {
  227. const reader = new FileReader();
  228. reader.onload = (e) => {
  229. (form as any)[field] = e.target?.result as string;
  230. };
  231. reader.readAsDataURL(file.raw);
  232. };
  233. const handleSave = async () => {
  234. const valid = await formRef.value?.validate();
  235. if (!valid) return;
  236. try {
  237. await updateEnterpriseInfo(form as any);
  238. ElMessage.success('保存成功');
  239. handleBack();
  240. } catch (error) {
  241. ElMessage.error('保存失败');
  242. }
  243. };
  244. </script>
  245. <style scoped lang="scss">
  246. .company-edit-container {
  247. background: #f5f5f5;
  248. min-height: 100%;
  249. }
  250. .page-header {
  251. background: #fff;
  252. padding: 15px 20px;
  253. display: flex;
  254. align-items: center;
  255. gap: 10px;
  256. border-bottom: 1px solid #eee;
  257. .page-title {
  258. font-size: 16px;
  259. font-weight: bold;
  260. color: #333;
  261. }
  262. }
  263. .form-content {
  264. padding: 20px;
  265. }
  266. .section {
  267. background: #fff;
  268. border-radius: 8px;
  269. padding: 20px;
  270. margin-bottom: 15px;
  271. .section-title {
  272. font-size: 16px;
  273. font-weight: bold;
  274. margin-bottom: 20px;
  275. display: flex;
  276. align-items: center;
  277. gap: 8px;
  278. }
  279. }
  280. .title-bar {
  281. display: inline-block;
  282. width: 3px;
  283. height: 16px;
  284. background: #e60012;
  285. border-radius: 2px;
  286. }
  287. .upload-box {
  288. :deep(.el-upload) {
  289. width: 100px;
  290. height: 100px;
  291. border: 1px dashed #d9d9d9;
  292. border-radius: 6px;
  293. cursor: pointer;
  294. overflow: hidden;
  295. &:hover {
  296. border-color: #e60012;
  297. }
  298. }
  299. .upload-placeholder {
  300. width: 100%;
  301. height: 100%;
  302. display: flex;
  303. flex-direction: column;
  304. align-items: center;
  305. justify-content: center;
  306. color: #999;
  307. font-size: 12px;
  308. gap: 5px;
  309. }
  310. .upload-preview {
  311. width: 100%;
  312. height: 100%;
  313. .el-image {
  314. width: 100%;
  315. height: 100%;
  316. }
  317. }
  318. }
  319. .form-footer {
  320. text-align: center;
  321. padding: 20px;
  322. background: #fff;
  323. border-radius: 8px;
  324. }
  325. </style>