addActivity.vue 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132
  1. <template>
  2. <div class="container-addAct">
  3. <el-card class="card-top">
  4. <div class="top-box">
  5. <div>
  6. <el-select
  7. placeholder="请选择行业"
  8. :disabled="!isShowSelect"
  9. @change="clearTopIndustry"
  10. @clear="clearTopIndustry"
  11. clearable
  12. v-model="optionFormregion"
  13. style="width: 360px; margin-right: 30px"
  14. >
  15. <el-option v-for="item in chartPermissionList" :label="item.PermissionName" :key="item.PermissionName" :value="item.PermissionName"></el-option>
  16. </el-select>
  17. <el-select placeholder="请选择活动类型" :disabled="!isShowSelect" clearable v-model="cactivityType" @change="activityTypeDetail" style="width: 360px">
  18. <el-option v-for="item in cactivityTypeList" :label="item.ActivityTypeName" :key="item.ActivityTypeId" :value="item.ActivityTypeId"></el-option>
  19. </el-select>
  20. </div>
  21. <div>
  22. <el-button v-if="isShowSelect" type="primary" @click="templateBtn">活动内容输入模板</el-button>
  23. </div>
  24. </div>
  25. </el-card>
  26. <el-card style="margin-top: 30px">
  27. <froala id="froala-editor" ref="froalaEditor" :tag="'textarea'" :config="froalaConfig" v-model="content"></froala>
  28. <div style="margin-top: 25px" v-if="optionFormregion">
  29. <template v-if="cactivityType == 1">
  30. <el-radio style="margin: 0 0 20px 30px" v-model="subjectRadio" label="1">单主题标签:</el-radio>
  31. <el-radio v-model="subjectRadio" label="2">多主题标签:</el-radio>
  32. </template>
  33. <div style="display: flex; align-items: center">
  34. <span style="width: 98px; flex-shrink: 0">
  35. 主题标签:
  36. <el-tooltip placement="top-start">
  37. <div slot="content">
  38. 1、小程序内默认显示产业名称,也可勾选【小程序内显示标的名称】更改显示<br />2、若该活动暂无相关联产业,请联系内容组添加,或勾选并填写【临时标签】用于小程序内展示<br />
  39. 3、选择产业和关联标的后,即完成对活动的标签定义;可同时勾选并填写【临时标签】,小程序内将显示临时标签名称
  40. </div>
  41. <i class="el-icon-info" />
  42. </el-tooltip>
  43. </span>
  44. <el-cascader
  45. key="multipleTrue"
  46. style="margin-right: 10px"
  47. v-model="industryCascade"
  48. :disabled="selectDisabled"
  49. @change="propertyChange"
  50. placeholder="请选择产业名称"
  51. :show-all-levels="false"
  52. :options="industryArr"
  53. :props="{ ...defaultProps, multiple: true }"
  54. filterable
  55. >
  56. </el-cascader>
  57. <template v-if="isShowAddIcon">
  58. <img v-if="!optionFormregion.includes('策略') && !selectDisabled" src="~@/assets/img/set_m/add_ico.png" style="margin: 0 30px 0 0" @click="addIndustryDlg = true" />
  59. <img v-if="!optionFormregion.includes('策略') && selectDisabled" src="~@/assets/img/set_m/slide.png" style="margin: 0 30px 0 0" />
  60. </template>
  61. <el-select v-model="markValue" :disabled="selectDisabled" @focus="markSelectFocus" multiple placeholder="请选择关联标的">
  62. <el-option v-for="item in markOptions" :key="item.IndustrialSubjectId" :value="item.IndustrialSubjectId" :label="item.SubjectName"> </el-option>
  63. </el-select>
  64. <template v-if="isShowAddIcon">
  65. <img v-if="!optionFormregion.includes('策略') && !selectDisabled" src="~@/assets/img/set_m/add_ico.png" style="margin: 0 10px" @click="isAddMarketDlg" />
  66. <img v-if="!optionFormregion.includes('策略') && selectDisabled" src="~@/assets/img/set_m/slide.png" style="margin: 0 10px" />
  67. </template>
  68. <el-checkbox style="margin-left: 20px" v-model="isMark">小程序内显示标的名称</el-checkbox>
  69. <div style="display: flex; align-items: center; margin-left: 40px">
  70. <el-checkbox v-model="radioTemporary">临时标签</el-checkbox>
  71. <el-input style="width: 350px; margin: 0 20px" v-model="valTemporary" @focus="radioTemporary = true" placeholder="请输入标签名称" type="text"></el-input>
  72. <div class="editsty" style="flex-shrink: 0" @click="dialogVisibleSubject = true">查询标的</div>
  73. </div>
  74. </div>
  75. <!-- 复选 模块 -->
  76. <div style="margin-top: 20px">
  77. <research-deduct ref="researchSelect" :cactivityType="cactivityType" :optionFormregion="optionFormregion" />
  78. </div>
  79. <div style="margin: 20px 0 0 98px" class="add-delete" v-for="(item, index) in addSubjectLabel" :key="index">
  80. <template v-if="subjectRadio == 2">
  81. <el-cascader
  82. v-model="item.IndustrialManagementIdS"
  83. :disabled="item.forbidden"
  84. @change="propertyChange"
  85. placeholder="请选择产业名称"
  86. :show-all-levels="false"
  87. :options="industryArr"
  88. :props="{ ...defaultProps, multiple: true }"
  89. filterable
  90. >
  91. </el-cascader>
  92. <el-select style="margin: 0 10px" v-model="item.IndustrialSubjectIdS" :disabled="item.forbidden" @focus="markSelectFocusAdd(index, item)" multiple placeholder="请选择关联标的">
  93. <el-option v-for="val in item.markOptions" :key="val.IndustrialSubjectId" :value="val.IndustrialSubjectId" :label="val.SubjectName"> </el-option>
  94. </el-select>
  95. <el-checkbox style="margin: 0 0 0 10px" v-model="item.isMark">小程序内显示标的名称</el-checkbox>
  96. <div style="display: flex; align-items: center; margin-left: 40px">
  97. <el-checkbox v-model="item.temporary" @change="temporaryChangeHandler(item)">临时标签</el-checkbox>
  98. <el-input
  99. style="width: 350px; margin: 0 20px"
  100. v-model="item.temporaryText"
  101. @focus="
  102. item.forbidden = true;
  103. item.temporary = true;
  104. "
  105. placeholder="请输入标签名称"
  106. type="text"
  107. ></el-input>
  108. </div>
  109. <img @click="deleteSubject(index, item)" src="~@/assets/img/icons/delete-Item.png" />
  110. <el-checkbox style="margin-left: 30px" v-model="item.subscribe">可预约纪要</el-checkbox>
  111. </template>
  112. </div>
  113. <div style="margin: 20px 0 0 30px; display: flex; align-items: center" v-if="subjectRadio == 2">
  114. <img @click="addLabelClick" class="editsty" src="~@/assets/img/set_m/add_ico.png" style="margin: 0 10px" />
  115. <span @click="addLabelClick" class="editsty"> 添加主题标签</span>
  116. </div>
  117. </div>
  118. <div style="margin-top: 15px" v-if="showType !== '1' && showType !== '9' && subjectRadio != 2">
  119. <div class="radio-input" style="margin-bottom: 15px; height: 35px">
  120. <span style="width: 98px"> 参会人数限制: </span>
  121. <template v-if="showType != 3">
  122. <el-radio v-model="radio" label="1">不限制</el-radio>
  123. <el-radio v-model="radio" label="2">限制</el-radio>
  124. </template>
  125. <el-input placeholder="输入人数上限" v-if="radio == 2 || showType !== '2'" class="astrict-inpt" onkeyup="value=value.replace(/[^\d]/g,'')" v-model="astrict" />
  126. </div>
  127. <div v-if="radio == 2 || showType !== '2'">
  128. <div class="checkbox-box">
  129. <span style="width: 98px; flex-shrink: 0">
  130. 活动可见:
  131. <el-tooltip :content="checkboxTooltip('活动可见')" placement="top-start">
  132. <i class="el-icon-info" />
  133. </el-tooltip>
  134. </span>
  135. <div>
  136. <div class="is-visible">
  137. <el-radio-group v-model="radioVisibleActivity">
  138. <el-radio :label="1">仅本组客户可见</el-radio>
  139. <el-radio :label="2">全部客户可见</el-radio>
  140. </el-radio-group>
  141. <el-checkbox v-model="decisionChecked">仅决策人可见</el-checkbox>
  142. </div>
  143. <div style="display: flex">
  144. <span style="width: 70px; flex-shrink: 0" class="text-right"> 套餐类型: </span>
  145. <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange" :disabled="checkAllIs">
  146. 全选
  147. <el-tooltip :content="checkboxTooltip('全选')" placement="top-start">
  148. <i class="el-icon-info" />
  149. </el-tooltip>
  150. </el-checkbox>
  151. <el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange">
  152. <el-checkbox v-for="item in cities" :label="item.CustomerTypeId" :key="item.CustomerTypeId" :disabled="forbidden.includes(String(item.CustomerTypeId))">
  153. {{ item.CustomerName }}
  154. <el-tooltip :content="item.Explain" placement="top-start" v-if="item.Explain">
  155. <i class="el-icon-info" />
  156. </el-tooltip>
  157. </el-checkbox>
  158. </el-checkbox-group>
  159. </div>
  160. <div class="checkbox-box" style="margin-top: 20px">
  161. <span class="text-right"> 管理规模: </span>
  162. <el-checkbox-group v-model="checkScaleList">
  163. <el-checkbox :disabled="scaleIsDisabled.includes('3')" label="3">100亿以上</el-checkbox>
  164. <el-checkbox :disabled="scaleIsDisabled.includes('2')" label="2">50~100亿</el-checkbox>
  165. </el-checkbox-group>
  166. </div>
  167. </div>
  168. </div>
  169. </div>
  170. </div>
  171. <template v-if="activeIsState == 3">
  172. <div class="audio-content">
  173. <span class="text">会议音频:</span>
  174. <el-button v-if="addEditVideo.length > 0" size="small" type="primary" @click="errorUpload">上传会议音频</el-button>
  175. <el-upload
  176. v-else
  177. class="upload-demo"
  178. action=""
  179. :http-request="handleUploadAudio"
  180. accept="audio/*"
  181. :on-remove="handleRemoveAudio"
  182. :before-remove="beforeRemoveAudio"
  183. :limit="1"
  184. :file-list="fileListAudio"
  185. >
  186. <el-button size="small" type="primary">上传会议音频</el-button>
  187. </el-upload>
  188. </div>
  189. <div class="audio-content" style="margin-top: 10px">
  190. <span class="text">会议视频:</span>
  191. <el-button v-if="fileListAudio.length" size="small" type="primary" @click="errorUpload">上传会议视频</el-button>
  192. <el-upload
  193. v-else
  194. class="upload-demo"
  195. action=""
  196. accept=".mp4"
  197. :http-request="handleUpload"
  198. :before-upload="handelBeforeUploadVideo"
  199. :before-remove="beforeRemoveAudio"
  200. :on-remove="handleRemoveVideo"
  201. :file-list="addEditVideo"
  202. :disabled="startUpload"
  203. :limit="1"
  204. >
  205. <el-button size="small" type="primary" :loading="startUpload">上传会议视频</el-button>
  206. </el-upload>
  207. <el-progress type="circle" :percentage="percentage" width="40" style="margin-left: 10px" v-if="startUpload"></el-progress>
  208. </div>
  209. <div class="audio-content cover-content" style="margin-top: 10px">
  210. <span class="text" style="width: 70px; text-align: right">封面:</span>
  211. <div class="img-content">
  212. <img src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/micro_roadshow_audio_share_yy.png" alt="" />
  213. <div class="modify">修改</div>
  214. </div>
  215. </div>
  216. </template>
  217. <div style="text-align: center; margin-top: 30px">
  218. <el-button type="primary" @click="submitForm('保存')">保存</el-button>
  219. <el-button v-if="isShow" type="primary" @click="submitForm('发布')">发布</el-button>
  220. <el-button @click="cancelBtn">取消</el-button>
  221. </div>
  222. </el-card>
  223. <el-dialog
  224. v-dialogDrag
  225. :close-on-click-modal="false"
  226. :modal-append-to-body="false"
  227. center
  228. :title="activityTypeName"
  229. :visible.sync="dialogVisible"
  230. customClass="customWidth"
  231. :before-close="handleClose"
  232. >
  233. <div id="dialog" v-html="copyText"></div>
  234. <div style="margin-bottom: 60px">
  235. <div class="content-template" v-if="activityTypeName == '公司调研电话会'">
  236. <div @click="contentTemplate('1')" :class="contentTemplateTitle == '1' ? 'active' : ''">进门财经模板</div>
  237. <div @click="contentTemplate('2')" :class="contentTemplateTitle == '2' ? 'active' : ''">zoom模板</div>
  238. </div>
  239. <div v-html="templatePText" v-if="contentTemplateTitle == '1'"></div>
  240. <div v-html="ZoomTemplateP" v-else></div>
  241. <p v-if="cactivityType == 1" class="no-cv" style="color: #f00">注:多个活动同时输入时,请用分割线隔开</p>
  242. <p v-else class="no-cv" style="color: #f00">注:每次只能输入一场活动信息{{ cactivityType == 6 ? ",多篇相关报告时,用分号“;”隔开" : "" }}</p>
  243. </div>
  244. <span slot="footer" class="dialog-footer">
  245. <el-button @click="dialogVisible = false">取消</el-button>
  246. <el-button id="copy_text" type="primary" v-if="contentTemplateTitle == '1'" :data-clipboard-text="copyTxt" @click="handleCopyFun">复制模版</el-button>
  247. <el-button id="copy_text" type="primary" v-else :data-clipboard-text="zoomTemplate" @click="handleCopyFun">复制模版</el-button>
  248. </span>
  249. </el-dialog>
  250. <add-industry-mark
  251. :optionFormregion="optionFormregion.includes('研选') ? '研选' : optionFormregion"
  252. :addIndustryDlg.sync="addIndustryDlg"
  253. :addMarkDlg.sync="addMarkDlg"
  254. @commitIndustryDlg="commitIndustryDlg"
  255. @commitMarkDlg="commitMarkDlg"
  256. :addMarkUpVal="addMarkUpVal"
  257. :source="3"
  258. />
  259. <el-dialog v-dialogDrag :close-on-click-modal="false" :modal-append-to-body="false" center title="查询标的" :visible.sync="dialogVisibleSubject" width="500px" :before-close="handleCloseSubject">
  260. <div>
  261. <el-select style="width: 100%" v-model="addSubjectName" remote :remote-method="remoteMethod" clearable filterable @change="searchInfo" placeholder="请输入标的名称">
  262. <el-option v-for="item in addSubjectOptions" :key="item.IndustrialSubjectId" :label="item.SubjectName" :value="item.SubjectName"> </el-option>
  263. </el-select>
  264. </div>
  265. <p class="subject-text" v-if="isShowSubject">暂无数据</p>
  266. <template v-else>
  267. <p class="subject-text" v-for="(item, index) in nameSubjectOptions" :key="index">{{ item.Name }} : {{ item.value }}</p>
  268. </template>
  269. <p style="padding-bottom: 50px"></p>
  270. </el-dialog>
  271. </div>
  272. </template>
  273. <script>
  274. import { raiInterface, customInterence, getOSSSign, resourceVoiceupload } from "@/api/api.js";
  275. import VueFroala from "vue-froala-wysiwyg";
  276. import Clipboard from "clipboard";
  277. import AddIndustryMark from "../../components/addIndustryMark.vue";
  278. import richTextMixins from "../../components/apply/RichTextMixins";
  279. import MD5 from "js-md5";
  280. import ResearchDeduct from "./addComopnents/ResearchDeduct.vue";
  281. export default {
  282. name: "",
  283. components: { AddIndustryMark, ResearchDeduct },
  284. props: {},
  285. data() {
  286. return {
  287. cactivityType: "",
  288. content: "", //内容
  289. optionFormregion: "", //行业选择
  290. radio: "1", //单选按钮
  291. isOptionRef: false,
  292. chartPermissionList: [], //行业的数组
  293. cactivityTypeList: [], //活动类型
  294. dialogVisible: false, //弹框
  295. astrict: "", //人数限制
  296. copyTxt: "1", //复制的模版
  297. templatePText: "",
  298. checkedCities: [], //
  299. checkedCitiesTwo: "",
  300. cities: [], //
  301. isIndeterminate: false, //是否
  302. checkAll: false,
  303. showType: "9",
  304. activityTypeName: "纪要内容模板",
  305. isShow: true,
  306. isShowSelect: true,
  307. forbidden: [],
  308. checkAllIs: false,
  309. contentTemplateTitle: "1",
  310. zoomTemplate: "",
  311. zoomTemplateP: "",
  312. industryArr: [], //所有的行业
  313. industryCascade: "", //所有行业及联的选择
  314. markValue: "", //添加标的
  315. markOptions: [], ///添加标的的数组
  316. addMarkUpVal: {
  317. industrialName: "",
  318. industrialId: "",
  319. }, //弹框里的
  320. radioTemporary: false, //临时标签
  321. valTemporary: "", //临时标签的输入框
  322. selectDisabled: false, //临时标签的输入后全部禁用
  323. defaultProps: {
  324. label: "PermissionName",
  325. children: "List",
  326. value: "ChartPermissionId",
  327. },
  328. addIndustryDlg: false,
  329. addMarkDlg: false,
  330. subjectRadio: "1",
  331. addSubjectLabel: [],
  332. dialogVisibleSubject: false,
  333. addSubjectName: "",
  334. addSubjectOptions: "",
  335. nameSubjectOptions: [],
  336. isShowSubject: false,
  337. ListSubject: [],
  338. checkScaleList: [], //选择规模
  339. scaleIsDisabled: "", //选择规模 禁用
  340. isMark: false,
  341. radioVisibleActivity: 2,
  342. decisionChecked: false,
  343. fileListAudio: [],
  344. baseApi: process.env.API_ROOT,
  345. activeIsState: "",
  346. addEditVideo: [],
  347. startUpload: false, //开始上传
  348. percentage: 0,
  349. isShowAddIcon: true, //主题标签的添加的iocn 是否显示
  350. };
  351. },
  352. computed: {},
  353. mixins: [richTextMixins],
  354. watch: {
  355. radio: {
  356. handler(newVal) {
  357. if (newVal == 1) {
  358. this.astrict = "";
  359. }
  360. if (this.$route.query.id) return;
  361. this.isCheckAllType(this.cactivityType == 3 && newVal == 2 ? true : false);
  362. },
  363. },
  364. radioTemporary() {
  365. if (this.radioTemporary) {
  366. this.selectDisabled = true;
  367. } else {
  368. this.valTemporary = "";
  369. this.selectDisabled = false;
  370. }
  371. },
  372. subjectRadio() {
  373. this.addSubjectLabel = [];
  374. },
  375. cactivityType: {
  376. handler(newval) {
  377. if (this.$route.query.id) return;
  378. this.isCheckAllType(newval === 4 ? true : false);
  379. },
  380. },
  381. },
  382. created() {},
  383. mounted() {
  384. this.chartPermission();
  385. this.getActivityType();
  386. this.customerTypelist();
  387. this.getIndustry();
  388. if (this.$route.query.id) {
  389. this.getDetail();
  390. }
  391. if (this.$route.query.isShow == 1) {
  392. this.isShow = false;
  393. }
  394. if (this.$route.query.isShow >= 0) {
  395. this.isShowSelect = false;
  396. }
  397. },
  398. methods: {
  399. async handleUploadAudio(e) {
  400. const loading = this.$loading({
  401. lock: true,
  402. text: "上传音频中...",
  403. spinner: "el-icon-loading",
  404. background: "rgba(0, 0, 0, 0.7)",
  405. });
  406. let form = new FormData();
  407. form.append("file", e.file);
  408. const res = await resourceVoiceupload(form);
  409. if (res.Ret === 200) {
  410. let obj = {
  411. name: res.Data.ResourceName,
  412. url: res.Data.ResourceUrl,
  413. PlaySeconds: res.Data.PlaySeconds,
  414. };
  415. this.fileListAudio = [obj];
  416. loading.close();
  417. }
  418. },
  419. //删除新增的主题标签
  420. deleteSubject(index, item) {
  421. this.addSubjectLabel.splice(index, 1);
  422. },
  423. markSelectFocusAdd(index, item) {
  424. item.markOptions = [];
  425. item.IndustrialSubjectIdS = [];
  426. let arr = [];
  427. arr = item.IndustrialManagementIdS.map((key) => {
  428. return key[1];
  429. });
  430. raiInterface
  431. .getindustrialSubjectlistIds({
  432. IndustrialManagementIdStr: arr.join(","),
  433. })
  434. .then((res) => {
  435. if (res.Ret === 200) {
  436. item.markOptions = res.Data.List || [];
  437. }
  438. });
  439. },
  440. addLabelClick() {
  441. if (this.addSubjectLabel.length) {
  442. let index = this.addSubjectLabel.length - 1;
  443. this.addSubjectLabel.push({
  444. IndustrialManagementIdS: this.addSubjectLabel[index].IndustrialManagementIdS,
  445. IndustrialSubjectIdS: this.addSubjectLabel[index].IndustrialSubjectIdS,
  446. markOptions: this.addSubjectLabel[index].markOptions,
  447. isMark: this.addSubjectLabel[index].isMark,
  448. forbidden: this.addSubjectLabel[index].forbidden,
  449. temporary: this.addSubjectLabel[index].temporary,
  450. temporaryText: this.addSubjectLabel[index].temporaryText,
  451. subscribe: this.addSubjectLabel[index].subscribe,
  452. });
  453. } else {
  454. this.addSubjectLabel = [
  455. {
  456. IndustrialManagementIdS: this.industryCascade,
  457. IndustrialSubjectIdS: this.markValue,
  458. markOptions: this.markOptions,
  459. isMark: this.isMark,
  460. forbidden: this.selectDisabled,
  461. temporary: this.radioTemporary,
  462. temporaryText: this.valTemporary,
  463. subscribe: this.$refs.researchSelect.isCanAppointmentMinutes,
  464. },
  465. ];
  466. }
  467. },
  468. propertyChange() {
  469. if (this.subjectRadio == 2) return;
  470. this.markOptions = [];
  471. this.markValue = "";
  472. },
  473. //添加后的 临时标签
  474. temporaryChangeHandler(item) {
  475. item.forbidden = item.temporary;
  476. !item.forbidden ? (item.temporaryText = "") : "";
  477. },
  478. //编辑进来的详情
  479. getDetail() {
  480. raiInterface.activityDetail({ ActivityId: Number(this.$route.query.id) }).then((res) => {
  481. if (res.Ret !== 200) return;
  482. const { Data } = res;
  483. this.activeIsState = Data.ActiveState;
  484. this.cactivityType = Data.ActivityTypeId;
  485. this.optionFormregion = Data.ChartPermissionName;
  486. this.checkedCities = Data.CustomerTypeIds ? Data.CustomerTypeIds.split(",").map((item) => Number(item)) : [];
  487. this.astrict = Data.LimitPeopleNum == "0" ? "" : Data.LimitPeopleNum;
  488. this.showType = Data.ShowType;
  489. this.content = Data.Body;
  490. this.checkScaleList = Data.Scale ? Data.Scale.split(",") : [];
  491. this.scaleIsDisabled = Data.Scale;
  492. this.radioVisibleActivity = Data.VisibleRange > 0 ? Data.VisibleRange : 1;
  493. this.decisionChecked = Data.IsMakerShow == 1 ? true : false;
  494. let checkedCount = Data.CustomerTypeIds ? Data.CustomerTypeIds.split(",").length : "";
  495. this.checkAll = checkedCount === this.cities.length;
  496. this.isIndeterminate = checkedCount > 0 && checkedCount < this.cities.length;
  497. this.isMark = Data.IsShowSubjectName == 1 ? true : false;
  498. this.valTemporary = Data.TemporaryLabel;
  499. this.radioTemporary = this.valTemporary ? true : false;
  500. // 复选框模块
  501. this.$nextTick(() => {
  502. let RefPage = this.$refs.researchSelect;
  503. RefPage.isCanAppointmentMinutes = Data.IsCanAppointmentMinutes == 1 ? true : false;
  504. RefPage.isYidongConduct = Data.IsYidongConduct == 1 ? true : false;
  505. RefPage.isExternalLabel = Data.IsExternalLabel == 1 ? true : false;
  506. RefPage.isCanOutboundCall = Data.IsCanOutboundCall == 1 ? true : false;
  507. RefPage.isDeduct = Data.IsResearchPoints == 1 ? true : false;
  508. RefPage.provideEmail = Data.IsNeedEmail == 1 ? true : false;
  509. RefPage.isBClass = Data.IsBClass == 1 ? true : false;
  510. RefPage.SiginupDeadline = Data.SiginupDeadline;
  511. RefPage.PointsSet = Data.PointsSet;
  512. RefPage.institutionName = Data.PointsSet.CompanyName;
  513. });
  514. this.addEditVideo = Data.VideoDetail
  515. ? [Data.VideoDetail].map((item) => {
  516. return { name: item.VideoName, PlaySeconds: item.VideoDuration, url: item.VideoUrl };
  517. })
  518. : [];
  519. this.fileListAudio = Data.VoiceList
  520. ? Data.VoiceList.map((item) => {
  521. return { name: item.Name, PlaySeconds: item.PlaySeconds, url: item.Url };
  522. })
  523. : [];
  524. if (Data.PublishStatus == 1) {
  525. this.forbidden = Data.CustomerTypeIds ? Data.CustomerTypeIds.split(",") : [];
  526. this.checkAllIs = this.forbidden.length >= 1;
  527. }
  528. if (this.astrict > 0 && this.showType == 2) {
  529. this.radio = "2";
  530. }
  531. this.valTemporary = res.Data.TemporaryLabel;
  532. this.radioTemporary = this.valTemporary ? true : false;
  533. this.industryCascade = res.Data.ListIndustrial ? res.Data.ListIndustrial.map((item) => [item.ChartPermissionId, item.IndustrialManagementId]) : "";
  534. this.markValue = res.Data.ListSubject ? res.Data.ListSubject.map((item) => item.IndustrialSubjectId) : "";
  535. if (this.markValue) {
  536. this.markSelectFocus();
  537. }
  538. });
  539. },
  540. //提交发布活保存前的校验
  541. submitForm(type) {
  542. if (this.checkedCities) {
  543. this.checkedCitiesTwo = this.checkedCities.join(",");
  544. }
  545. if (!this.radioTemporary && !this.industryCascade.length) return this.$message.error("请选择产业!");
  546. if (this.radioTemporary && !this.valTemporary) return this.$message.error("请输入临时标签!");
  547. let arr = [];
  548. if (this.industryCascade.length) {
  549. arr = this.industryCascade.map((item) => {
  550. return item[1];
  551. });
  552. }
  553. if (this.showType == "3" || this.radio == "2") {
  554. if (!this.astrict) return this.$message.error("请在输入框输入人数上限!");
  555. }
  556. if (!this.cactivityType || !this.optionFormregion) return this.$message.error("请选择行业或活动类型");
  557. if (this.subjectRadio == 2) {
  558. let labelArr = this.addSubjectLabel.map((item) => {
  559. let labelArrList = [];
  560. item.IndustrialManagementIdS.forEach((val) => {
  561. labelArrList.push(val[1]);
  562. });
  563. return {
  564. IndustrialManagementIdS: labelArrList.join(","),
  565. IndustrialSubjectIdS: item.IndustrialSubjectIdS.join(","),
  566. IsShowSubjectName: item.isMark ? 1 : 0,
  567. TemporaryLabel: item.temporary ? item.temporaryText : "",
  568. IsCanAppointmentMinutes: item.subscribe ? 1 : 0,
  569. };
  570. });
  571. this.ListSubject = [
  572. {
  573. IndustrialManagementIdS: arr.length ? arr.join(",") : "",
  574. IndustrialSubjectIdS: this.markValue.length ? this.markValue.join(",") : "",
  575. IsShowSubjectName: this.isMark ? 1 : 0,
  576. TemporaryLabel: this.radioTemporary ? this.valTemporary : "",
  577. IsCanAppointmentMinutes: this.$refs.researchSelect.isCanAppointmentMinutes ? 1 : 0,
  578. },
  579. ...labelArr,
  580. ];
  581. } else {
  582. this.ListSubject = [
  583. {
  584. IndustrialManagementIdS: arr.length ? arr.join(",") : "",
  585. IndustrialSubjectIdS: this.markValue.length ? this.markValue.join(",") : "",
  586. IsShowSubjectName: this.isMark ? 1 : 0,
  587. TemporaryLabel: this.radioTemporary ? this.valTemporary : "",
  588. IsCanAppointmentMinutes: this.$refs.researchSelect.isCanAppointmentMinutes ? 1 : 0,
  589. },
  590. ];
  591. }
  592. let VoiceList = this.fileListAudio.map((item) => {
  593. return {
  594. Name: item.name,
  595. PlaySeconds: item.PlaySeconds.toString(),
  596. Url: item.url,
  597. };
  598. });
  599. let VideoDetail = this.addEditVideo.map((item) => {
  600. return {
  601. VideoName: item.name,
  602. VideoDuration: item.PlaySeconds.toString(),
  603. VideoUrl: item.url,
  604. };
  605. });
  606. this.saveTheRelease(type, arr, VoiceList, VideoDetail[0]);
  607. },
  608. //保存或发布
  609. async saveTheRelease(type, arr, VoiceList, VideoDetail) {
  610. let RefPage = this.$refs.researchSelect;
  611. let PointsSet = RefPage.PointsSet;
  612. const res = await raiInterface.preserveAndPublishAdd({
  613. DoType: type == "发布" ? 1 : 0,
  614. ActivityId: Number(this.$route.query.id) || 0,
  615. ActivityTypeId: Number(this.cactivityType),
  616. Body: this.content,
  617. PermissionName: this.optionFormregion,
  618. CustomerTypeIds: this.checkedCitiesTwo,
  619. IsAllCustomerType:this.checkAll?1:0,
  620. LimitPeopleNum: Number(this.astrict) || 0,
  621. IndustrialManagementIdS: arr.length ? arr.join(",") : "",
  622. IndustrialSubjectIdS: this.markValue.length ? this.markValue.join(",") : "",
  623. List: this.ListSubject,
  624. Scale: this.checkScaleList.length ? this.checkScaleList.join(",") : "",
  625. LabelType: Number(this.subjectRadio),
  626. IsShowSubjectName: this.isMark ? 1 : 0,
  627. IsMakerShow: this.decisionChecked ? 1 : 0,
  628. VisibleRange: this.radioVisibleActivity,
  629. VoiceList,
  630. VideoDetail,
  631. IsYidongConduct: RefPage.isYidongConduct ? 1 : 0,
  632. IsExternalLabel: RefPage.isExternalLabel ? 1 : 0,
  633. IsCanOutboundCall: RefPage.isCanOutboundCall ? 1 : 0,
  634. IsResearchPoints: RefPage.isDeduct ? 1 : 0,
  635. IsNeedEmail: RefPage.provideEmail ? 1 : 0,
  636. IsBClass: RefPage.isBClass ? 1 : 0,
  637. SiginupDeadline: RefPage.SiginupDeadline,
  638. PointsSet,
  639. });
  640. if (res.Ret !== 200) return;
  641. this.$message.success("操作成功!");
  642. this.$router.back();
  643. },
  644. //获取行业
  645. chartPermission() {
  646. raiInterface.chartPermissionList().then((res) => {
  647. if (res.Ret === 200) {
  648. this.chartPermissionList = res.Data.List;
  649. }
  650. });
  651. },
  652. //获取活动类型
  653. getActivityType() {
  654. raiInterface.getActivityType().then((res) => {
  655. if (res.Ret === 200) {
  656. this.isShowAddIcon = res.Data.IsShowAddIcon;
  657. this.cactivityTypeList = res.Data.List;
  658. }
  659. });
  660. },
  661. //获取活动类型详情
  662. activityTypeDetail(e) {
  663. this.radio = "1"; //单选按钮
  664. this.astrict = ""; //人数限制
  665. this.contentTemplateTitle = "1";
  666. this.subjectRadio = "1";
  667. this.checkedCities = [];
  668. this.$refs.researchSelect.isBClass = false;
  669. this.radioVisibleActivity = this.cactivityType == 7 ? 1 : 2;
  670. if (!this.cactivityType) return;
  671. raiInterface
  672. .activityTypeDetail({
  673. ActivityTypeId: this.cactivityType - 0,
  674. })
  675. .then((res) => {
  676. if (res.Ret === 200) {
  677. this.copyTxt = res.Data.Template;
  678. this.templatePText = res.Data.TemplateP;
  679. this.zoomTemplate = res.Data.ZoomTemplate;
  680. this.ZoomTemplateP = res.Data.ZoomTemplateP;
  681. this.showType = res.Data.ShowType;
  682. this.activityTypeName = res.Data.ActivityTypeName;
  683. }
  684. });
  685. },
  686. // 操作:点击了复制按钮
  687. handleCopyFun() {
  688. let clipboard = new Clipboard("#copy_text");
  689. clipboard.on("success", (e) => {
  690. this.$message({
  691. type: "success",
  692. message: "复制成功!",
  693. });
  694. this.dialogVisible = false;
  695. clipboard.destroy(); // 释放内存
  696. });
  697. clipboard.on("error", (e) => {
  698. // 不支持复制
  699. this.$Message.info("该浏览器不支持自动复制");
  700. clipboard.destroy(); // 释放内存
  701. });
  702. },
  703. //点击了复制模版
  704. templateBtn() {
  705. if (!this.cactivityType) return this.$message.error("请选择活动类型");
  706. this.dialogVisible = true;
  707. },
  708. //获取多选的客户列表
  709. customerTypelist() {
  710. raiInterface.customerTypelist().then((res) => {
  711. if (res.Ret === 200) {
  712. this.cities = res.Data.List;
  713. }
  714. });
  715. },
  716. // 子组件来的事件 产业
  717. commitIndustryDlg(data, type = "") {
  718. this.getIndustry();
  719. this.industryCascade.push([Number(data.ChartPermissionId), Number(data.NewId)]);
  720. },
  721. // 子组件来的事件 标的
  722. commitMarkDlg(data) {
  723. let arr = this.industryCascade.flat(Infinity);
  724. raiInterface
  725. .getindustrialSubjectlistIds({
  726. IndustrialManagementIdStr: arr[1],
  727. })
  728. .then((res) => {
  729. if (res.Ret === 200) {
  730. this.markOptions = res.Data.List || [];
  731. }
  732. });
  733. this.markValue = data.split(",").map((item) => Number(item));
  734. },
  735. /* 获取全部的行业 */
  736. getIndustry() {
  737. raiInterface.getListIndustrial().then((res) => {
  738. if (res.Ret === 200) {
  739. this.industryArr = res.Data.List || [];
  740. }
  741. });
  742. },
  743. //top 行业清除的事件
  744. clearTopIndustry() {
  745. this.industryCascade = [];
  746. this.radioTemporary = false;
  747. this.valTemporary = "";
  748. this.markValue = "";
  749. this.radioVisibleActivity = 2;
  750. },
  751. //添加标的的点击事件
  752. isAddMarketDlg() {
  753. let arr = this.industryCascade.flat(Infinity);
  754. this.industryArr.forEach((item) => {
  755. if (item.ChartPermissionId == arr[0]) {
  756. this.addMarkUpVal.industrialId = arr[1];
  757. item.List.forEach((key) => {
  758. if (key.ChartPermissionId == arr[1]) {
  759. this.addMarkUpVal.industrialName = key.PermissionName;
  760. }
  761. });
  762. }
  763. });
  764. if (this.industryCascade.length == 1) {
  765. this.addMarkDlg = true;
  766. } else if (this.industryCascade.length > 1) {
  767. this.$message.error("已选多个产业,无法添加标的");
  768. } else {
  769. this.$message.error("请先选择产业");
  770. }
  771. },
  772. //点击添加标的的下拉选择框
  773. markSelectFocus() {
  774. if (!this.industryCascade.length) {
  775. this.$message.error("请先选择产业");
  776. } else {
  777. let arr = [];
  778. arr = this.industryCascade.map((item) => {
  779. return item[1];
  780. });
  781. raiInterface
  782. .getindustrialSubjectlistIds({
  783. IndustrialManagementIdStr: arr.join(","),
  784. })
  785. .then((res) => {
  786. if (res.Ret === 200) {
  787. this.markOptions = res.Data.List || [];
  788. }
  789. });
  790. }
  791. },
  792. handleCheckAllChange(val) {
  793. if (val) {
  794. let newCodeList = this.cities.map((item) => item.CustomerTypeId);
  795. this.checkedCities = newCodeList;
  796. } else {
  797. this.checkedCities = [];
  798. }
  799. this.checkedCitiesTwo = this.checkedCities.join(",");
  800. this.isIndeterminate = false;
  801. },
  802. handleCheckedCitiesChange(value) {
  803. let checkedCount = value.length;
  804. this.checkAll = checkedCount === this.cities.length;
  805. this.isIndeterminate = checkedCount > 0 && checkedCount < this.cities.length;
  806. },
  807. cancelBtn() {
  808. this.$router.back();
  809. },
  810. contentTemplate(type) {
  811. this.contentTemplateTitle = type;
  812. },
  813. handleCloseSubject() {
  814. this.nameSubjectOptions = [];
  815. this.addSubjectName = "";
  816. this.addSubjectOptions = [];
  817. this.dialogVisibleSubject = false;
  818. },
  819. async remoteMethod(query) {
  820. if (query !== "") {
  821. const res = await raiInterface.industrialSubjectSearch({
  822. KeyWord: query,
  823. });
  824. if (res.Ret === 200) {
  825. this.addSubjectOptions = res.Data.List || [];
  826. }
  827. }
  828. },
  829. async searchInfo(val) {
  830. if (val !== "") {
  831. const res = await raiInterface.industrialSubjectSearchInfo({
  832. KeyWord: val,
  833. });
  834. if (res.Ret === 200) {
  835. this.isShowSubject = res.Data.List ? false : true;
  836. let arrList = [];
  837. arrList = res.Data.List
  838. ? res.Data.List.map((item) => {
  839. let arr = [];
  840. item.List.forEach((key) => {
  841. arr.push(key.Name);
  842. });
  843. return {
  844. ...item,
  845. value: arr.join(","),
  846. };
  847. })
  848. : [];
  849. this.nameSubjectOptions = arrList;
  850. }
  851. } else {
  852. this.nameSubjectOptions = [];
  853. }
  854. },
  855. //套餐类型的 提升文本
  856. checkboxTooltip(val) {
  857. let str = "";
  858. switch (val) {
  859. case "全选":
  860. str = "所有客户均可看到该活动(冻结、流失客户也可看到,但会提示无权限参会)";
  861. break;
  862. case "活动可见":
  863. str = "套餐类型和管理规模两项下,均有勾选时,只要满足其中之一的条件,客户就可见此活动。例如:勾选了大套餐客户和100亿以上,则大套餐客户和100亿以上规模的客户都可以看到此活动";
  864. break;
  865. }
  866. return str;
  867. },
  868. //删除上传
  869. handleRemoveAudio(file, fileList) {
  870. this.fileListAudio = [];
  871. },
  872. //删除上传前得确认
  873. beforeRemoveAudio(file, fileList) {
  874. return this.$confirm(`确定移除 ${file.name}?`);
  875. },
  876. //删除视频的上传
  877. handleRemoveVideo(file, fileList) {
  878. this.addEditVideo = [];
  879. },
  880. //获取视频时长的promise
  881. handleGetDuration(file) {
  882. return new Promise((resolve, reject) => {
  883. const fileUrl = URL.createObjectURL(file);
  884. const audioEl = new Audio(fileUrl);
  885. audioEl.addEventListener("loadedmetadata", (e) => {
  886. resolve(audioEl.duration);
  887. });
  888. });
  889. },
  890. //上传视频判断格式
  891. handelBeforeUploadVideo(e) {
  892. if (e.type != "video/mp4") {
  893. this.$message.warning("上传失败,上传视频格式不正确");
  894. return false;
  895. }
  896. },
  897. // 上传视频
  898. async handleUpload(e) {
  899. const duration = await this.handleGetDuration(e.file);
  900. this.addEditVideo.push({
  901. name: e.file.name,
  902. PlaySeconds: duration + "",
  903. url: "",
  904. });
  905. const res = await getOSSSign();
  906. if (res.Ret === 200) {
  907. let accessKeyId = res.Data.AccessKeyId;
  908. let accessKeySecret = res.Data.AccessKeySecret;
  909. let stsToken = res.Data.SecurityToken;
  910. this.handleUploadToOSS(e.file, accessKeyId, accessKeySecret, stsToken);
  911. }
  912. },
  913. //上传到阿里云
  914. async handleUploadToOSS(file, accessKeyId, accessKeySecret, stsToken) {
  915. this.startUpload = true;
  916. const ALOSSINS = new OSS({
  917. // yourRegion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  918. region: "oss-cn-shanghai",
  919. // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
  920. accessKeyId: accessKeyId,
  921. accessKeySecret: accessKeySecret,
  922. // 从STS服务获取的安全令牌(SecurityToken)。
  923. stsToken: stsToken,
  924. // 填写Bucket名称,例如examplebucket。
  925. bucket: "hzchart",
  926. endpoint: "hzstatic.hzinsights.com",
  927. cname: true,
  928. timeout: 600000,
  929. });
  930. // 生成文件名
  931. const t = new Date().getTime().toString();
  932. const temName = `static/yb/video/${MD5(t)}.${file.name.split(".")[1]}`;
  933. console.log(temName);
  934. const options = {
  935. // 获取分片上传进度、断点和返回值。
  936. progress: (p, cpt, res) => {
  937. console.log(p);
  938. this.percentage = parseInt(p * 100);
  939. },
  940. // 设置并发上传的分片数量。
  941. parallel: 10,
  942. // 设置分片大小。默认值为1 MB,最小值为100 KB。
  943. partSize: 1024 * 1024 * 10, // 10MB
  944. };
  945. try {
  946. const res = await ALOSSINS.multipartUpload(temName, file, { ...options });
  947. console.log("上传结果", res);
  948. if (res.res.status === 200) {
  949. let VideoUrl = "https://hzstatic.hzinsights.com/" + res.name;
  950. this.addEditVideo[0].url = VideoUrl;
  951. this.startUpload = false;
  952. this.percentage = 0;
  953. }
  954. } catch (error) {
  955. this.$message.warning("上传失败,请刷新重试");
  956. this.startUpload = false;
  957. this.percentage = 0;
  958. }
  959. },
  960. errorUpload() {
  961. this.$message.error("音频文件和视频文件,仅支•持•上•传一个");
  962. },
  963. // 公司线下调研 调研电话会 的选择
  964. isCheckAllType(newval) {
  965. if (newval) {
  966. let newCodeList = [];
  967. this.cities.forEach((item) => {
  968. if (![5, 6, 7].includes(item.CustomerTypeId)) {
  969. newCodeList.push(item.CustomerTypeId);
  970. }
  971. });
  972. this.checkedCities = newCodeList;
  973. this.checkedCitiesTwo = this.checkedCities.join(",");
  974. this.isIndeterminate = true;
  975. this.checkAll = false;
  976. } else {
  977. this.checkedCities = [];
  978. this.checkedCitiesTwo = "";
  979. this.checkAll = false;
  980. }
  981. },
  982. },
  983. };
  984. </script>
  985. <style lang="scss">
  986. .container-addAct {
  987. .content-template {
  988. display: flex;
  989. div {
  990. margin-right: 20px;
  991. padding-bottom: 4px;
  992. }
  993. .active {
  994. border-bottom: 4px solid #409eff;
  995. }
  996. margin-bottom: 20px;
  997. }
  998. .customWidth {
  999. width: 550px !important;
  1000. }
  1001. .top-box {
  1002. display: flex;
  1003. justify-content: space-between;
  1004. }
  1005. .fr-second-toolbar {
  1006. display: none;
  1007. }
  1008. #dialog {
  1009. -webkit-touch-callout: none;
  1010. -webkit-user-select: none;
  1011. -khtml-user-select: none;
  1012. -moz-user-select: none;
  1013. -ms-user-select: none;
  1014. user-select: none;
  1015. color: #333;
  1016. font-size: 14px;
  1017. div {
  1018. margin-bottom: 40px;
  1019. }
  1020. }
  1021. .no-cv {
  1022. margin-top: 30px;
  1023. -webkit-user-select: none;
  1024. -khtml-user-select: none;
  1025. -moz-user-select: none;
  1026. -ms-user-select: none;
  1027. user-select: none;
  1028. }
  1029. .text-right {
  1030. display: inline-block;
  1031. text-align: right;
  1032. }
  1033. .radio-input {
  1034. display: flex;
  1035. align-items: center;
  1036. .el-input__inner {
  1037. box-sizing: border-box;
  1038. line-height: 30px;
  1039. width: 112px;
  1040. height: 28px !important;
  1041. background: #ffffff;
  1042. border: 1px solid #aab4cc;
  1043. border-radius: 4px;
  1044. }
  1045. }
  1046. .astrict-inpt {
  1047. box-sizing: border-box;
  1048. line-height: 30px;
  1049. width: 112px;
  1050. height: 28px !important;
  1051. background: #ffffff;
  1052. input {
  1053. padding: 10px;
  1054. }
  1055. }
  1056. .checkbox-box {
  1057. display: flex;
  1058. margin-bottom: 10px;
  1059. .el-checkbox {
  1060. margin-left: 5px;
  1061. margin-right: 30px;
  1062. }
  1063. }
  1064. .subject-text {
  1065. padding-top: 20px;
  1066. }
  1067. .is-visible {
  1068. margin-bottom: 20px;
  1069. .el-checkbox {
  1070. margin-left: 20px;
  1071. }
  1072. }
  1073. .audio-content {
  1074. display: flex;
  1075. align-items: center;
  1076. .test {
  1077. flex-shrink: 0;
  1078. }
  1079. .upload-demo {
  1080. display: flex;
  1081. .el-upload-list {
  1082. margin-left: 20px;
  1083. }
  1084. }
  1085. }
  1086. .cover-content {
  1087. align-items: stretch;
  1088. vertical-align: bottom;
  1089. .img-content {
  1090. position: relative;
  1091. height: 200px;
  1092. width: 200px;
  1093. border: 1px solid #ccc;
  1094. img {
  1095. width: 100%;
  1096. height: 100%;
  1097. }
  1098. }
  1099. .modify {
  1100. position: absolute;
  1101. bottom: 0;
  1102. right: -50px;
  1103. height: 20px;
  1104. cursor: pointer;
  1105. color: #409eff;
  1106. }
  1107. }
  1108. .el-upload-list__item.is-success.focusing .el-icon-close-tip {
  1109. display: none !important;
  1110. }
  1111. }
  1112. .fr-visible {
  1113. display: none !important;
  1114. }
  1115. .add-delete {
  1116. display: flex;
  1117. align-items: center;
  1118. img {
  1119. width: 18px;
  1120. }
  1121. }
  1122. </style>