add-edit.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. <template>
  2. <div class="add-edit-box">
  3. <div class="mb-20 baC-fff sys-radius-10 box-sizing-border pd-15-10 flex-justify-space">
  4. <div class="fs-20 fw-600 p-15 ">{{fromData.id?'编辑合同模板':'新增合同模板'}}</div>
  5. <div class="align-items-center">
  6. <el-button type="primary" icon="el-icon-back" @click="close()">返回</el-button>
  7. <el-button type="warning" icon="el-icon-close" @click="close()">取消</el-button>
  8. <el-button type="success" icon="el-icon-check" @click="save()">保存</el-button>
  9. </div>
  10. </div>
  11. <div class="baC-fff sys-radius-10 box-sizing-border pd-26-24">
  12. <div class="align-items-center mb-20">
  13. <div class="fs-16">合同名称:</div>
  14. <el-input
  15. class="input-w-280 mr-10"
  16. placeholder="请输入合同名称"
  17. prefix-icon="el-icon-edit"
  18. v-model="fromData.name">
  19. </el-input>
  20. </div>
  21. <div class="align-items-center mb-20">
  22. <div class="fs-16">合同文件:</div>
  23. <div class="up-box">
  24. <el-upload
  25. accept=".doc,.docx"
  26. action="#"
  27. :limit="2"
  28. :file-list="fileList"
  29. :http-request="reportFileHttpRequest"
  30. :before-upload="beforeUpload"
  31. :before-remove='beforeRemove'
  32. >
  33. <el-button type="success" icon="el-icon-folder-add">上传合同模板</el-button>
  34. <div slot="tip" class="el-upload__tip">只能上传doc文件</div>
  35. </el-upload>
  36. </div>
  37. </div>
  38. <div class="display-flex ">
  39. <div class="w-50">
  40. <el-button class="mb-20" type="success" icon="el-icon-circle-plus-outline" @click="add(1)">添加签署区域关键词</el-button>
  41. <div class="align-items-center mb-20" v-for="(item,i) in signList" :key="i">
  42. <div class="fs-16">签署区域关键词:</div>
  43. <el-input
  44. class="input-w-264 mr-10"
  45. placeholder="请输入签署区域关键词"
  46. prefix-icon="el-icon-edit"
  47. v-model="item.val"
  48. >
  49. </el-input>
  50. <el-button type="danger" icon="el-icon-delete" @click="del(1,item,i)">删除</el-button>
  51. </div>
  52. </div>
  53. <div class="w-50">
  54. <el-button class="mb-20" type="success" icon="el-icon-circle-plus-outline" @click="add(2)">添加合同可替换变量词</el-button>
  55. <div class="align-items-center mb-20" v-for="(item,i) in textList" :key="i">
  56. <el-input
  57. class="input-w-264 mr-10"
  58. placeholder="请输入变量词标题"
  59. prefix-icon="el-icon-edit"
  60. v-model="item.name"
  61. >
  62. </el-input>
  63. <div class="fs-16">:</div>
  64. <el-input
  65. class="input-w-264 mr-10"
  66. placeholder="请输入合同可替换变量词"
  67. prefix-icon="el-icon-edit"
  68. v-model="item.key"
  69. >
  70. </el-input>
  71. <el-button type="danger" icon="el-icon-delete" @click="del(2,item,i)">删除</el-button>
  72. </div>
  73. </div>
  74. </div>
  75. </div>
  76. </div>
  77. </template>
  78. <script>
  79. import {
  80. GetSts
  81. } from '@/api/conmmon.js'
  82. import oss from "ali-oss"
  83. import {contractInfo,contractSave} from '@/api/contract.js';
  84. export default {
  85. data(){
  86. return{
  87. fromData:{
  88. id:"",
  89. name:"",
  90. sign_party:[],
  91. texts:[],
  92. file_url:'',
  93. },
  94. aliOss: "",
  95. fileList:[],
  96. signList:[],
  97. textList:[],
  98. isAJAX:false,
  99. }
  100. },
  101. mounted() {
  102. this.setNewOss();
  103. let id = this.$route.query.id;
  104. if(id){
  105. this.fromData.id = id;
  106. this.getInfo();
  107. }
  108. },
  109. methods:{
  110. async setNewOss() {
  111. let obj = await GetSts()
  112. obj = obj.data
  113. let client = new oss({
  114. region: "oss-cn-chengdu",
  115. accessKeyId: obj.AccessKeyId,
  116. accessKeySecret: obj.AccessKeySecret,
  117. stsToken: obj.SecurityToken,
  118. refreshSTSToken: async () => {
  119. let obj = await GetSts()
  120. obj = obj.data
  121. return {
  122. accessKeyId: obj.accessKeyId,
  123. accessKeySecret: obj.accessKeySecret,
  124. stsToken: obj.stsToken,
  125. }
  126. },
  127. refreshSTSTokenInterval: 900000,
  128. bucket: "cqzhw",
  129. })
  130. this.aliOss = client
  131. },
  132. getInfo(){
  133. contractInfo({id:this.fromData.id}).then((res)=>{
  134. if(res.code == 1){
  135. this.fromData = res.data;
  136. if(this.fromData.sign_party.length > 0){
  137. this.fromData.sign_party.forEach((v)=>{
  138. let obj = {val:v};
  139. this.signList.push(obj)
  140. })
  141. }
  142. if(this.fromData.texts.length > 0){
  143. // this.fromData.texts.forEach((v)=>{
  144. // let obj = {val:v};
  145. // this.textList.push(obj)
  146. // })
  147. this.textList = this.fromData.texts
  148. }
  149. this.fileList = [];
  150. let obj = {
  151. name:res.data.name,
  152. url:res.data.file,
  153. };
  154. this.fileList.push(obj);
  155. this.fromData.file_url = res.data.contracts_file;
  156. }
  157. })
  158. },
  159. close(){
  160. this.$router.go(-1)
  161. },
  162. save(){
  163. if(this.isAJAX){
  164. return
  165. }
  166. this.isAJAX = true;
  167. this.fromData.sign_party = [];
  168. this.fromData.texts = [];
  169. this.signList.forEach((v)=>{
  170. this.fromData.sign_party.push(v.val)
  171. })
  172. // this.textList.forEach((v)=>{
  173. // this.fromData.texts.push(v.val)
  174. // })
  175. this.fromData.texts = this.textList;
  176. contractSave(this.fromData).then((res)=>{
  177. this.isAJAX = false
  178. if(res.code == 1){
  179. this.$message.success(res.msg);
  180. this.$router.replace({path:'/template/list'})
  181. }else{
  182. this.$message.error(res.msg);
  183. }
  184. })
  185. },
  186. add(type){
  187. if(type == 1){
  188. let obj = {val:""};
  189. this.signList.push(obj);
  190. }else{
  191. let obj = {name:"",key:""};
  192. this.textList.push(obj);
  193. }
  194. },
  195. del(type,item,i){
  196. if(type == 1){
  197. this.signList.splice(i, 1);
  198. }else{
  199. this.textList.splice(i, 1);
  200. }
  201. },
  202. beforeUpload(file){
  203. if(this.fileList.length > 0){
  204. this.fileList = [];
  205. this.fromData.file_url = '';
  206. }
  207. // ||file.type === 'application/pdf'
  208. let isWord = file.type === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' ||file.type === 'application/msword';
  209. if (!isWord) {
  210. this.$message.error('只能上传.doc、.docx格式的Word文件!');
  211. return false;
  212. }
  213. return true;
  214. },
  215. reportFileHttpRequest(e){
  216. this.aliOss.put(e.file.name, e.file).then((res)=>{
  217. if(res){
  218. this.$message.success('上传成功,可保存')
  219. let obj = {
  220. name:res.name,
  221. url:res.url,
  222. };
  223. this.fileList.push(obj);
  224. if(res.url[4] == 's'){
  225. this.fromData.file = res.url;
  226. }else{
  227. let a = res.url.substring(0, 4);
  228. let b = res.url.substring(4);
  229. let s = 's';
  230. this.fromData.file_url = a+s+b;
  231. }
  232. }else{
  233. this.$message.error('上传失败,请重新上传')
  234. }
  235. })
  236. },
  237. beforeRemove(file, fileList){
  238. this.fileList = fileList;
  239. this.fromData.file_url = '';
  240. },
  241. },
  242. }
  243. </script>
  244. <style scoped lang="scss">
  245. .add-edit-box{
  246. .up-box{
  247. width: 500px;
  248. }
  249. }
  250. </style>