consultation-order-panel.component.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <div class="consultation-order-panel">
  2. <!-- 面板头部 -->
  3. <div class="panel-header">
  4. <h1 class="panel-title">创建咨询订单</h1>
  5. <p class="panel-subtitle">填写客户信息和项目需求</p>
  6. </div>
  7. <!-- 可滚动内容区域 -->
  8. <div class="panel-content">
  9. <!-- 客户信息栏 -->
  10. <section class="customer-info-section">
  11. <h2 class="section-title">客户信息</h2>
  12. @if (!selectedCustomer) {
  13. <!-- 客户搜索 -->
  14. <div class="search-container">
  15. <input
  16. type="text"
  17. [(ngModel)]="searchKeyword"
  18. (ngModelChange)="searchCustomer()"
  19. placeholder="输入客户姓名或手机号搜索..."
  20. class="search-input"
  21. autocomplete="off"
  22. />
  23. <button class="search-btn" (click)="searchCustomer()">搜索</button>
  24. </div>
  25. <!-- 搜索结果 -->
  26. @if (searchResults.length > 0) {
  27. <div class="search-results">
  28. @for (customer of searchResults; track customer.id) {
  29. <div class="result-item" (click)="selectCustomer(customer)">
  30. <div class="customer-name">{{ customer.name }}</div>
  31. <div class="customer-info">{{ customer.phone }}</div>
  32. </div>
  33. }
  34. </div>
  35. }
  36. } @else {
  37. <!-- 已选择客户 -->
  38. <div class="selected-customer">
  39. <div class="customer-details">
  40. <div class="customer-name">{{ selectedCustomer.name }}</div>
  41. <div class="customer-phone">{{ selectedCustomer.phone }}</div>
  42. </div>
  43. <button class="clear-btn" (click)="clearSelectedCustomer()">重新选择</button>
  44. </div>
  45. }
  46. </section>
  47. <!-- 新客户表单 -->
  48. @if (!selectedCustomer) {
  49. <section class="new-customer-form">
  50. <h3 class="form-title">新客户信息</h3>
  51. <form [formGroup]="customerForm">
  52. <div class="form-row">
  53. <div class="form-group">
  54. <label for="name">客户姓名 <span class="required">*</span></label>
  55. <input type="text" id="name" formControlName="name" placeholder="请输入客户姓名">
  56. </div>
  57. <div class="form-group">
  58. <label for="phone">手机号码 <span class="required">*</span></label>
  59. <input type="tel" id="phone" formControlName="phone" placeholder="请输入手机号码">
  60. </div>
  61. </div>
  62. <div class="form-row">
  63. <div class="form-group">
  64. <label for="wechat">微信号</label>
  65. <input type="text" id="wechat" formControlName="wechat" placeholder="请输入微信号(选填)">
  66. </div>
  67. <div class="form-group">
  68. <label for="customerType">客户类型</label>
  69. <select id="customerType" formControlName="customerType">
  70. <option value="">请选择客户类型</option>
  71. <option value="新客户">新客户</option>
  72. <option value="老客户">老客户</option>
  73. <option value="转介绍">转介绍</option>
  74. </select>
  75. </div>
  76. </div>
  77. </form>
  78. </section>
  79. }
  80. <!-- 项目需求卡片 -->
  81. <section class="requirements-card">
  82. <div class="card-header" (click)="isRequirementCardExpanded = !isRequirementCardExpanded">
  83. <h3 class="card-title">项目需求</h3>
  84. <span class="toggle-icon" [class.expanded]="isRequirementCardExpanded">▼</span>
  85. </div>
  86. @if (isRequirementCardExpanded) {
  87. <div class="card-content">
  88. <form [formGroup]="requirementForm">
  89. <!-- 基本信息 -->
  90. <div class="form-row">
  91. <div class="form-group">
  92. <label for="decorationType">装修类型 <span class="required">*</span></label>
  93. <select id="decorationType" formControlName="decorationType">
  94. <option value="">请选择装修类型</option>
  95. <option value="全包">全包</option>
  96. <option value="半包">半包</option>
  97. <option value="清包">清包</option>
  98. <option value="软装">软装</option>
  99. </select>
  100. </div>
  101. <div class="form-group">
  102. <label for="downPayment">定金金额 <span class="required">*</span></label>
  103. <input type="number" id="downPayment" formControlName="downPayment" placeholder="请输入定金金额">
  104. </div>
  105. </div>
  106. <div class="form-row">
  107. <div class="form-group">
  108. <label for="firstDraftDate">初稿时间 <span class="required">*</span></label>
  109. <input type="date" id="firstDraftDate" formControlName="firstDraftDate">
  110. </div>
  111. <div class="form-group">
  112. <label for="budget">预算范围 <span class="required">*</span></label>
  113. <input type="text" id="budget" formControlName="budget" placeholder="请输入预算范围">
  114. </div>
  115. </div>
  116. <div class="form-row">
  117. <div class="form-group">
  118. <label for="area">房屋面积 <span class="required">*</span></label>
  119. <input type="number" id="area" formControlName="area" placeholder="请输入房屋面积(平方米)">
  120. </div>
  121. <div class="form-group">
  122. <label for="houseType">房屋类型</label>
  123. <input type="text" id="houseType" formControlName="houseType" placeholder="如:三室两厅">
  124. </div>
  125. </div>
  126. <div class="form-row">
  127. <div class="form-group">
  128. <label for="style">装修风格</label>
  129. <select id="style" formControlName="style">
  130. <option value="">请选择装修风格</option>
  131. @for (style of styleOptions; track style) {
  132. <option [value]="style">{{ style }}</option>
  133. }
  134. </select>
  135. </div>
  136. </div>
  137. <div class="form-row">
  138. <div class="form-group">
  139. <label for="budget">预算 *</label>
  140. <input type="number" id="budget" formControlName="budget" placeholder="请输入预算金额">
  141. </div>
  142. <div class="form-group">
  143. <label for="area">面积 *</label>
  144. <input type="number" id="area" formControlName="area" placeholder="请输入面积(平方米)">
  145. </div>
  146. </div>
  147. <div class="form-row">
  148. <div class="form-group">
  149. <label for="smallImageTime">小图时间</label>
  150. <input type="date" id="smallImageTime" formControlName="smallImageTime">
  151. </div>
  152. <div class="form-group">
  153. <label for="largeImageTime">大图时间</label>
  154. <input type="date" id="largeImageTime" formControlName="largeImageTime">
  155. </div>
  156. </div>
  157. <!-- 详细需求 -->
  158. <div class="form-row">
  159. <div class="form-group">
  160. <label for="spaceRequirements">涉及空间</label>
  161. <textarea
  162. id="spaceRequirements"
  163. formControlName="spaceRequirements"
  164. rows="3"
  165. placeholder="请描述涉及的空间,如:客厅、卧室、厨房等"
  166. ></textarea>
  167. </div>
  168. </div>
  169. <div class="form-row">
  170. <div class="form-group">
  171. <label for="designAngles">设计角度</label>
  172. <textarea
  173. id="designAngles"
  174. formControlName="designAngles"
  175. rows="3"
  176. placeholder="请明确各个空间的展示角度"
  177. ></textarea>
  178. </div>
  179. </div>
  180. <div class="form-row">
  181. <div class="form-group">
  182. <label for="specialAreaHandling">特殊区域处理</label>
  183. <textarea
  184. id="specialAreaHandling"
  185. formControlName="specialAreaHandling"
  186. rows="3"
  187. placeholder="请描述特殊区域的处理要求"
  188. ></textarea>
  189. </div>
  190. </div>
  191. <div class="form-row">
  192. <div class="form-group">
  193. <label for="materialRequirements">材质要求</label>
  194. <textarea
  195. id="materialRequirements"
  196. formControlName="materialRequirements"
  197. rows="3"
  198. placeholder="请描述具体的材质要求"
  199. ></textarea>
  200. </div>
  201. </div>
  202. <div class="form-row">
  203. <div class="form-group">
  204. <label for="lightingRequirements">灯光要求</label>
  205. <textarea
  206. id="lightingRequirements"
  207. formControlName="lightingRequirements"
  208. rows="3"
  209. placeholder="请描述灯光设计要求"
  210. ></textarea>
  211. </div>
  212. </div>
  213. <!-- 偏好标签 -->
  214. <div class="tags-section">
  215. <h4 class="tags-title">偏好标签</h4>
  216. <div class="tags-container">
  217. @for (tag of preferenceTags; track tag) {
  218. <span class="tag">
  219. {{ tag }}
  220. <button type="button" class="remove-tag" (click)="removePreferenceTag(tag)">×</button>
  221. </span>
  222. }
  223. </div>
  224. <div class="tag-input-container">
  225. <input
  226. type="text"
  227. [(ngModel)]="newTag"
  228. placeholder="添加偏好标签"
  229. class="tag-input"
  230. (keyup.enter)="addPreferenceTag(newTag)"
  231. />
  232. <button type="button" class="add-tag-btn" (click)="addPreferenceTag(newTag)">添加</button>
  233. </div>
  234. </div>
  235. </form>
  236. </div>
  237. }
  238. </section>
  239. </div>
  240. <!-- 底部提交区域 -->
  241. <div class="panel-footer">
  242. <button
  243. class="submit-btn"
  244. (click)="submitForm()"
  245. [disabled]="isSubmitting || !isFormValid()"
  246. [class.disabled]="isSubmitting || !isFormValid()"
  247. >
  248. @if (isSubmitting) {
  249. <span>创建中...</span>
  250. } @else {
  251. <span>创建订单</span>
  252. }
  253. </button>
  254. <!-- 表单验证提示 -->
  255. @if (!isFormValid()) {
  256. <div class="validation-hint">
  257. <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
  258. <circle cx="12" cy="12" r="10"></circle>
  259. <line x1="12" y1="8" x2="12" y2="12"></line>
  260. <line x1="12" y1="16" x2="12.01" y2="16"></line>
  261. </svg>
  262. 请填写完整的项目信息
  263. </div>
  264. }
  265. </div>
  266. </div>
  267. <!-- 团队分配弹窗 -->
  268. <app-team-assignment-modal
  269. [isVisible]="showTeamAssignmentModal"
  270. (closeModal)="closeTeamAssignmentModal()"
  271. (confirmAssignment)="confirmTeamAssignment($event)">
  272. </app-team-assignment-modal>