Demand.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. <template>
  2. <div class="customer-info">
  3. <n-form require-mark-placement="left" label-width="auto" ref="formRef" :model="formData" :rules="rules">
  4. <!-- <n-form-item v-show="rowType === '1' && language === 'zh-CN'" > -->
  5. <div class="info-tips" v-if="rowType === '1' && language === 'zh-CN'">
  6. 注明: 此报告为付费报告,客户可在购买前免费索取样本,样本中不包含关键数据点,仅供客户具体了解报告详细框架和细节。
  7. </div>
  8. <!-- </n-form-item> -->
  9. <n-form-item label="版本" label-placement="left" v-if="rowType === '1' && language === 'zh-CN'" path="version">
  10. <!-- <n-input :defaultValue="rowRegion === '0'?'中国':'全球与中国'" readonly/> -->
  11. <n-radio-group bame="version" v-model:value="formData.version" :style="{'width':'100%'}">
  12. <div class="customer-info-china">
  13. <n-radio value="0">中国</n-radio>
  14. <label>中国版本主要关注中国本土市场</label>
  15. </div>
  16. <div class="customer-info-global">
  17. <n-radio value="1">全球与中国</n-radio>
  18. <label class="global-title">全球及中国版本主要关注全球市场</label>
  19. </div>
  20. </n-radio-group>
  21. </n-form-item>
  22. <n-form-item :label="t('report.demand.companyName')" label-placement="left" path="companyName">
  23. <n-input :placeholder="t('report.demand.companyNameTip')" v-model:value="formData.companyName" />
  24. </n-form-item>
  25. <n-form-item :label="t('report.demand.address')" label-placement="left" path="addr">
  26. <n-input :placeholder="t('report.demand.addressTip')" v-model:value="formData.addr" />
  27. </n-form-item>
  28. <n-form-item :label="t('report.demand.email')" label-placement="left" path="email">
  29. <n-input :placeholder="t('report.demand.emailTip')" v-model:value="formData.email" />
  30. </n-form-item>
  31. <n-form-item :label="t('report.demand.phone')" label-placement="left" path="contact" :show-require-mark="language === 'zh-CN'">
  32. <n-input :placeholder="t('report.demand.phoneTip')" v-model:value="formData.contact" />
  33. </n-form-item>
  34. <n-form-item :label="t('report.demand.person')" label-placement="left" path="name">
  35. <n-input :placeholder="t('report.demand.personTip')" v-model:value="formData.name" />
  36. </n-form-item>
  37. <n-form-item :label="t('report.demand.desc')" label-placement="left" path="demand">
  38. <n-input type="textarea" :placeholder="t('report.demand.descTip')" v-model:value="formData.demand" />
  39. </n-form-item>
  40. <div class="form-item-btn">
  41. <n-button @click="handleClose">{{t('report.demand.cancel')}}</n-button>
  42. <n-button type="primary" @click="handleSubmit">{{t('report.demand.submit')}}</n-button>
  43. </div>
  44. </n-form>
  45. </div>
  46. </template>
  47. <script setup>
  48. //import { useLocaleStoreWithOut } from '@/store';
  49. import {
  50. // NForm,
  51. // NFormItem,
  52. // NInput,
  53. // NButton,
  54. // FormRules,
  55. createDiscreteApi,
  56. // NRadio,
  57. // NRadioGroup,
  58. } from "naive-ui";
  59. import { ref, reactive, onMounted } from "vue";
  60. import { useI18n } from "#imports";
  61. import { useUserStore } from "@/store/user";
  62. const userStore = useUserStore();
  63. const language = ref();
  64. onMounted(() => (language.value = userStore.getLang));
  65. const { t } = useI18n();
  66. const emit = defineEmits(["closeDialog"]);
  67. const prop = defineProps({
  68. rowId: {
  69. type: String,
  70. default: "",
  71. },
  72. rowPrice: {
  73. type: String,
  74. default: null,
  75. },
  76. rowType: {
  77. type: String,
  78. default: null,
  79. },
  80. rowRegion: {
  81. type: String,
  82. default: null,
  83. },
  84. });
  85. const message = createDiscreteApi(["message"]);
  86. const formRef = ref();
  87. const formData = reactive({
  88. name: "", // 姓名
  89. contact: "", // 联系方式
  90. email: "", // 邮箱
  91. companyName: "", // 名称
  92. demand: "", // 需求
  93. reportId: "", // 报告id
  94. reportPrice: "", // 报告单价
  95. addr: "", // 联系地址
  96. type: "", //类型,1.样本,2.定制
  97. version: "", //
  98. });
  99. const rules = {
  100. version: [
  101. {
  102. required: true,
  103. trigger: ["input", "blur"],
  104. validator (rule, value) {
  105. if (!value) {
  106. return new Error("请选择版本");
  107. }
  108. return true;
  109. },
  110. },
  111. ],
  112. companyName: [
  113. {
  114. required: true,
  115. trigger: ["input", "blur"],
  116. validator (rule, value) {
  117. if (!value) {
  118. return new Error(t("report.demand.companyNameTip"));
  119. }
  120. return true;
  121. },
  122. },
  123. ],
  124. // addr: [{
  125. // required: true,
  126. // trigger: ['input','blur'],
  127. // validator(rule: FormItemRule, value: string){
  128. // if(!value){
  129. // return new Error(t('report.demand.addressTip'));
  130. // }
  131. // return true;
  132. // }
  133. // }],
  134. email: [
  135. {
  136. required: true,
  137. trigger: ["blur"],
  138. validator (rule, value) {
  139. if (!value) {
  140. return new Error(t("report.demand.emailTip"));
  141. } else if (!isEmail(value)) {
  142. return new Error(t("report.demand.emailFormat"));
  143. }
  144. return true;
  145. },
  146. },
  147. ],
  148. contact: [
  149. {
  150. required: true,
  151. trigger: ["blur"],
  152. validator (rule, value) {
  153. if (!value && language.value == "zh-CN") {
  154. return new Error(t("report.demand.phoneTip"));
  155. } else if (!isPhoneNumber(value) && language.value === "zh-CN") {
  156. return new Error(t("report.demand.phoneFormat"));
  157. }
  158. return true;
  159. },
  160. },
  161. ],
  162. name: [
  163. {
  164. required: true,
  165. trigger: ["blur", "input"],
  166. validator (rule, value) {
  167. if (!value) {
  168. return new Error(t("report.demand.personTip"));
  169. }
  170. return true;
  171. },
  172. },
  173. ],
  174. demand: [
  175. {
  176. required: true,
  177. trigger: ["input", "blur"],
  178. validator (rule, value) {
  179. if (!value) {
  180. return new Error(t("report.demand.descTip"));
  181. }
  182. return true;
  183. },
  184. },
  185. ],
  186. };
  187. // const rules = {
  188. // companyName: {
  189. // required: true,
  190. // message: '请输入公司名称',
  191. // trigger: ['input','blur']
  192. // }
  193. // }
  194. // 提交
  195. function handleSubmit () {
  196. formRef.value?.validate(async (errors) => {
  197. if (!errors) {
  198. formData.reportId = prop.rowId;
  199. formData.reportPrice = prop.rowPrice;
  200. formData.type = prop.rowType;
  201. await customerInfoSave(formData);
  202. emit("closeDialog");
  203. message.message.success(t("report.demand.success"));
  204. }
  205. });
  206. }
  207. // 关闭
  208. function handleClose () {
  209. emit("closeDialog");
  210. }
  211. </script>
  212. <style lang="scss" scoped>
  213. .customer-info {
  214. padding-top: 20px;
  215. .info-tips {
  216. padding-bottom: 20px;
  217. color: #f00;
  218. }
  219. .customer-info-china,
  220. .customer-info-global {
  221. display: flex;
  222. justify-content: space-between;
  223. }
  224. .customer-info-china {
  225. padding-bottom: 20px;
  226. }
  227. }
  228. .form-item-btn {
  229. display: flex;
  230. justify-content: center;
  231. button:nth-child(1) {
  232. margin-right: 60px;
  233. }
  234. }
  235. </style>