suochencheng 6 лет назад
Родитель
Сommit
8cd6de165b
27 измененных файлов с 3105 добавлено и 134 удалено
  1. 63 0
      src/main/java/com/izouma/awesomeadmin/dao/UserOrderMapper.xml
  2. 33 0
      src/main/java/com/izouma/awesomeadmin/dao/UserPackageMapper.java
  3. 592 0
      src/main/java/com/izouma/awesomeadmin/dao/UserPackageMapper.xml
  4. 85 0
      src/main/java/com/izouma/awesomeadmin/dto/tuniu/Contact.java
  5. 77 0
      src/main/java/com/izouma/awesomeadmin/dto/tuniu/Delivery.java
  6. 55 0
      src/main/java/com/izouma/awesomeadmin/dto/tuniu/EnterCertificate.java
  7. 42 0
      src/main/java/com/izouma/awesomeadmin/dto/tuniu/EnterCertificateTypeInfo.java
  8. 351 0
      src/main/java/com/izouma/awesomeadmin/dto/tuniu/Order.java
  9. 42 0
      src/main/java/com/izouma/awesomeadmin/dto/tuniu/TicketCertInfo.java
  10. 99 0
      src/main/java/com/izouma/awesomeadmin/dto/tuniu/Tourist.java
  11. 126 89
      src/main/java/com/izouma/awesomeadmin/model/ProductInfo.java
  12. 51 0
      src/main/java/com/izouma/awesomeadmin/model/UserOrder.java
  13. 204 0
      src/main/java/com/izouma/awesomeadmin/model/UserPackage.java
  14. 2 0
      src/main/java/com/izouma/awesomeadmin/service/UserOrderService.java
  15. 27 0
      src/main/java/com/izouma/awesomeadmin/service/UserPackageService.java
  16. 39 19
      src/main/java/com/izouma/awesomeadmin/service/impl/ProductInfoServiceImpl.java
  17. 119 1
      src/main/java/com/izouma/awesomeadmin/service/impl/UserOrderServiceImpl.java
  18. 137 0
      src/main/java/com/izouma/awesomeadmin/service/impl/UserPackageServiceImpl.java
  19. 3 1
      src/main/java/com/izouma/awesomeadmin/tuniu/common/URLConfig.java
  20. 29 0
      src/main/java/com/izouma/awesomeadmin/tuniu/util/TicketUtil.java
  21. 14 24
      src/main/java/com/izouma/awesomeadmin/web/TuNiuOpenApiController.java
  22. 13 0
      src/main/java/com/izouma/awesomeadmin/web/UserOrderController.java
  23. 169 0
      src/main/java/com/izouma/awesomeadmin/web/UserPackageController.java
  24. 2 0
      src/main/resources/properties/outsidews.properties
  25. 138 0
      src/main/vue/src/pages/UserPackage.vue
  26. 583 0
      src/main/vue/src/pages/UserPackages.vue
  27. 10 0
      src/main/vue/src/router/index.js

+ 63 - 0
src/main/java/com/izouma/awesomeadmin/dao/UserOrderMapper.xml

@@ -22,6 +22,9 @@
         <result column="deal_price" property="dealPrice" jdbcType="DECIMAL"/>
         <result column="market_code" property="marketCode" jdbcType="VARCHAR"/>
         <result column="coin" property="coin" jdbcType="DECIMAL"/>
+        <result column="type_flag" property="typeFlag" jdbcType="INTEGER"/>
+        <result column="product_id" property="productId" jdbcType="INTEGER"/>
+        <result column="tuniu_order_id" property="tuniuOrderId" jdbcType="VARCHAR"/>
     </resultMap>
     <sql id="Base_Column_List">
         <trim suffixOverrides=",">
@@ -63,6 +66,9 @@
 
             market_code,
             coin,
+            type_flag,
+            product_id,
+            tuniu_order_id,
 
         </trim>
     </sql>
@@ -140,6 +146,15 @@
             <if test="coin!= null">
                 coin,
             </if>
+            <if test="typeFlag!= null">
+                type_flag,
+            </if>
+            <if test="productId!= null">
+                product_id,
+            </if>
+            <if test="tuniuOrderId!= null">
+                tuniu_order_id,
+            </if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="id != null">
@@ -202,6 +217,15 @@
             <if test="coin != null">
                 #{coin,jdbcType=DECIMAL},
             </if>
+            <if test="typeFlag != null">
+                #{typeFlag,jdbcType=INTEGER},
+            </if>
+            <if test="productId != null">
+                #{productId,jdbcType=INTEGER},
+            </if>
+            <if test="tuniuOrderId != null">
+                #{tuniuOrderId,jdbcType=VARCHAR},
+            </if>
         </trim>
     </insert>
     <update id="updateByPrimaryKeySelective" parameterType="com.izouma.awesomeadmin.model.UserOrder">
@@ -267,6 +291,15 @@
             <if test="coin != null">
                 coin= #{coin,jdbcType=DECIMAL},
             </if>
+            <if test="typeFlag != null">
+                type_flag= #{typeFlag,jdbcType=INTEGER},
+            </if>
+            <if test="productId != null">
+                product_id= #{productId,jdbcType=INTEGER},
+            </if>
+            <if test="tuniuOrderId != null">
+                tuniu_order_id= #{tuniuOrderId,jdbcType=VARCHAR},
+            </if>
         </set>
         where
         <if test="id != null and !&quot;&quot;.equals(id)">
@@ -345,6 +378,15 @@
             <if test="record.marketCode != null and !&quot;&quot;.equals(record.marketCode)">
                 and market_code = #{record.marketCode}
             </if>
+            <if test="record.typeFlag != null and !&quot;&quot;.equals(record.typeFlag)">
+                and type_flag = #{record.typeFlag}
+            </if>
+            <if test="record.productId != null and !&quot;&quot;.equals(record.productId)">
+                and product_id = #{record.productId}
+            </if>
+            <if test="record.tuniuOrderId != null and !&quot;&quot;.equals(record.tuniuOrderId)">
+                and tuniu_order_id = #{record.tuniuOrderId}
+            </if>
             <if test="record.searchKey != null and !&quot;&quot;.equals(record.searchKey)">
                 <trim prefix="and (" suffix=")" prefixOverrides="OR">
                     OR user_id LIKE concat('%',#{record.searchKey},'%')
@@ -479,6 +521,16 @@
             <if test="marketCode != null and !&quot;&quot;.equals(marketCode)">
                 and market_code = #{marketCode}
             </if>
+            <if test="typeFlag != null and !&quot;&quot;.equals(typeFlag)">
+                and type_flag = #{typeFlag}
+            </if>
+            <if test="productId != null and !&quot;&quot;.equals(productId)">
+                and product_id = #{productId}
+            </if>
+
+            <if test="tuniuOrderId != null and !&quot;&quot;.equals(tuniuOrderId)">
+                and tuniu_order_id = #{tuniuOrderId}
+            </if>
             <if test="searchKey != null and !&quot;&quot;.equals(searchKey)">
                 <trim prefix="and (" suffix=")" prefixOverrides="OR">
                     OR user_id LIKE concat('%',#{searchKey},'%')
@@ -610,6 +662,17 @@
                 and market_code = #{marketCode}
             </if>
 
+            <if test="typeFlag != null and !&quot;&quot;.equals(typeFlag)">
+                and type_flag = #{typeFlag}
+            </if>
+            <if test="productId != null and !&quot;&quot;.equals(productId)">
+                and product_id = #{productId}
+            </if>
+
+            <if test="tuniuOrderId != null and !&quot;&quot;.equals(tuniuOrderId)">
+                and tuniu_order_id = #{tuniuOrderId}
+            </if>
+
         </where>
         LIMIT 1
     </select>

+ 33 - 0
src/main/java/com/izouma/awesomeadmin/dao/UserPackageMapper.java

@@ -0,0 +1,33 @@
+package com.izouma.awesomeadmin.dao;
+
+import java.util.*;
+import com.izouma.awesomeadmin.datasource.DataSource;
+import org.springframework.stereotype.Repository;
+import com.izouma.awesomeadmin.model.UserPackage;
+
+
+/**
+*  Dao接口
+*/
+@Repository("com.zoumaframe.dao.UserPackageMapper")
+public interface UserPackageMapper{
+
+    int deleteByPrimaryKey(Integer id);
+
+    int insertSelective(UserPackage record);
+
+    UserPackage selectByPrimaryKey(Integer id);
+
+    int updateByPrimaryKeySelective(UserPackage record);
+
+    List<UserPackage> queryAllUserPackage(UserPackage record);
+
+    List<UserPackage> queryUserPackageByPage(Map<String, Object> parameter);
+
+    int delete(UserPackage record);
+
+    UserPackage queryUserPackage(UserPackage record);
+
+    List<UserPackage> query(UserPackage record);
+}
+

Разница между файлами не показана из-за своего большого размера
+ 592 - 0
src/main/java/com/izouma/awesomeadmin/dao/UserPackageMapper.xml


+ 85 - 0
src/main/java/com/izouma/awesomeadmin/dto/tuniu/Contact.java

@@ -0,0 +1,85 @@
+package com.izouma.awesomeadmin.dto.tuniu;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+
+/**
+ * Contact--取票人信息
+ */
+@JsonAutoDetect
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class Contact {
+
+    private String contactName;//取票人姓名
+
+    /**
+     * 取票人邮箱
+     * <p>
+     * 当“门票详情接口->admissionVoucherCode”=205或302时必传,否则不要传。
+     */
+    private String contactEmail;
+
+    /**
+     * 取票人手机号码(入园凭证会发送到此手机号码上,请务必保证手机号码真实有效)
+     */
+    private String contactTel;
+
+    /**
+     * 证件类型。
+     * <p>
+     * 当“门票详情接口->custInfoLimit”=4、6、7时必传;否则不要传。
+     * <p>
+     * 选项参照“门票详情接口->certificateType”字段。
+     */
+    private Integer psptType;
+
+    /**
+     * 证件号码。
+     * <p>
+     * 当“门票详情接口->custInfoLimit”=4、6、7时必传;否则不要传。
+     */
+    private String psptId;
+
+
+    public String getContactName() {
+        return contactName;
+    }
+
+    public void setContactName(String contactName) {
+        this.contactName = contactName;
+    }
+
+    public String getContactEmail() {
+        return contactEmail;
+    }
+
+    public void setContactEmail(String contactEmail) {
+        this.contactEmail = contactEmail;
+    }
+
+    public String getContactTel() {
+        return contactTel;
+    }
+
+    public void setContactTel(String contactTel) {
+        this.contactTel = contactTel;
+    }
+
+    public Integer getPsptType() {
+        return psptType;
+    }
+
+    public void setPsptType(Integer psptType) {
+        this.psptType = psptType;
+    }
+
+    public String getPsptId() {
+        return psptId;
+    }
+
+    public void setPsptId(String psptId) {
+        this.psptId = psptId;
+    }
+}
+

+ 77 - 0
src/main/java/com/izouma/awesomeadmin/dto/tuniu/Delivery.java

@@ -0,0 +1,77 @@
+package com.izouma.awesomeadmin.dto.tuniu;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+
+/**
+ * Delivery--递送信息
+ */
+@JsonAutoDetect
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class Delivery {
+
+    private Integer deliveryType;//1.配送
+
+
+    /**
+     * 收件人;deliveryType=1时,必填;
+     */
+    private String receiverName;
+
+    /**
+     * 收件电话;deliveryType=1时,必填;
+     */
+    private String telNum;
+
+    /**
+     * 收件地址;deliveryType=1时,必填;
+     */
+    private String deliveryEndAddress;
+
+    /**
+     * 邮编;deliveryType=1时,必填;
+     */
+    private String zipCode;
+
+    public Integer getDeliveryType() {
+        return deliveryType;
+    }
+
+    public void setDeliveryType(Integer deliveryType) {
+        this.deliveryType = deliveryType;
+    }
+
+    public String getReceiverName() {
+        return receiverName;
+    }
+
+    public void setReceiverName(String receiverName) {
+        this.receiverName = receiverName;
+    }
+
+    public String getTelNum() {
+        return telNum;
+    }
+
+    public void setTelNum(String telNum) {
+        this.telNum = telNum;
+    }
+
+    public String getDeliveryEndAddress() {
+        return deliveryEndAddress;
+    }
+
+    public void setDeliveryEndAddress(String deliveryEndAddress) {
+        this.deliveryEndAddress = deliveryEndAddress;
+    }
+
+    public String getZipCode() {
+        return zipCode;
+    }
+
+    public void setZipCode(String zipCode) {
+        this.zipCode = zipCode;
+    }
+}
+

+ 55 - 0
src/main/java/com/izouma/awesomeadmin/dto/tuniu/EnterCertificate.java

@@ -0,0 +1,55 @@
+package com.izouma.awesomeadmin.dto.tuniu;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import java.util.List;
+
+
+/**
+ * EnterCertificate--入园凭证
+ */
+@JsonAutoDetect
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class EnterCertificate {
+
+    /**
+     * 入园方式
+     */
+    private String enterCertificateType;
+
+    /**
+     * 入园凭证文本说明
+     */
+    private String enterCertificateTxt;
+
+    /**
+     * 入园凭证附件
+     */
+    private List<EnterCertificateTypeInfo> enterCertificateTypeInfo;
+
+    public String getEnterCertificateType() {
+        return enterCertificateType;
+    }
+
+    public void setEnterCertificateType(String enterCertificateType) {
+        this.enterCertificateType = enterCertificateType;
+    }
+
+    public String getEnterCertificateTxt() {
+        return enterCertificateTxt;
+    }
+
+    public void setEnterCertificateTxt(String enterCertificateTxt) {
+        this.enterCertificateTxt = enterCertificateTxt;
+    }
+
+    public List<EnterCertificateTypeInfo> getEnterCertificateTypeInfo() {
+        return enterCertificateTypeInfo;
+    }
+
+    public void setEnterCertificateTypeInfo(List<EnterCertificateTypeInfo> enterCertificateTypeInfo) {
+        this.enterCertificateTypeInfo = enterCertificateTypeInfo;
+    }
+}
+

+ 42 - 0
src/main/java/com/izouma/awesomeadmin/dto/tuniu/EnterCertificateTypeInfo.java

@@ -0,0 +1,42 @@
+package com.izouma.awesomeadmin.dto.tuniu;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import java.util.List;
+
+
+/**
+ * EnterCertificateTypeInfo--入园凭证附件
+ */
+@JsonAutoDetect
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class EnterCertificateTypeInfo {
+
+    /**
+     * 资源ID
+     */
+    private Integer resourceId;
+
+    /**
+     * 凭证对象 可能有多个
+     */
+    private List<TicketCertInfo> ticketCertInfos;
+
+    public Integer getResourceId() {
+        return resourceId;
+    }
+
+    public void setResourceId(Integer resourceId) {
+        this.resourceId = resourceId;
+    }
+
+    public List<TicketCertInfo> getTicketCertInfos() {
+        return ticketCertInfos;
+    }
+
+    public void setTicketCertInfos(List<TicketCertInfo> ticketCertInfos) {
+        this.ticketCertInfos = ticketCertInfos;
+    }
+}
+

+ 351 - 0
src/main/java/com/izouma/awesomeadmin/dto/tuniu/Order.java

@@ -0,0 +1,351 @@
+package com.izouma.awesomeadmin.dto.tuniu;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import java.util.List;
+
+
+/**
+ * Order订单信息
+ */
+@JsonAutoDetect
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class Order {
+
+    /**
+     * 分销商订单号。
+     * <p>
+     * 非空时,可防止重复下单。若重复下单,则返回之前已生成的orderId,且isNewFlag=0。
+     */
+    private String sourceOrderId;
+
+    private Integer orderId; //订单Id
+
+    /**
+     * 笛风账号
+     */
+    private String acctId;
+
+    /**
+     * 门票产品ID
+     */
+    private Integer productId;
+
+    /**
+     * 出游日期. “YYYY-MM-DD”。请在前台限制,只有价格日历中存在的团期,才能作为出游日期。
+     */
+    private String startTime;
+
+    /**
+     * 预订数量
+     */
+    private Integer bookNumber;
+
+    /**
+     * 取票人信息
+     */
+    private Contact contact;
+
+    /**
+     * 游客资料列表。“门票详情接口->custInfoLimit“=2、3、6、7时,此字段必填。
+     */
+    private List<Tourist> touristList;
+
+    /**
+     * 配送信息。
+     * <p>
+     * drawtype=1时,必填;否则不要填;
+     */
+    private Delivery delivery;
+
+
+    /**
+     * 使用笛风券金额
+     * <p>
+     * 使用笛风券会自动扣减订单金额,比如预订产品总额100元,使用旅游券10元,则下单后订单金额为90元;
+     * <p>
+     * 假如使用笛风券金额=预订产品总额,则订单金额为0元,并且下单后不需要调用【出票(代扣)接口】,会自动出票,因为这种情况系统认为钱已经付清了;
+     * <p>
+     * 如遇退票、预订失败等情况,已使用的笛风券会自动退回;
+     */
+    private Integer couponValue;
+
+    /**
+     * 取消原因
+     */
+    private String remark;
+
+    /**
+     * 支付方式.1:途牛钱包代扣 3.企业支付宝代扣;
+     */
+    private Integer payType;
+
+    /**
+     * 付款金额。(单位元,不支持小数)
+     * 如果付款金额和订单剩余应付金额不一致,接口不会扣款,会返回false。例如:订单金额500,未付款,剩余应付金额就是500。如果付款金额不是500,接口就会返回false,不会扣款。
+     */
+    private Integer pay;
+
+    /**
+     * 平台标识(10001:PC,20000:m站,30001:app安卓,30002:appIOS,30003:appWindows)(默认是pc)
+     */
+    private String platform;
+
+    /**
+     * 支付开关 0.不可支付,1.可以支付;分销商系统需要控制,当canPay="1"时,才调用【出票(代扣)接口】。
+     */
+    private String canPay;
+
+    /**
+     * 景点ID
+     */
+    private Integer scenicId;
+
+    /**
+     * 景点名称
+     */
+    private String scenicName;
+
+    /**
+     * 订单状态:
+     * <p>
+     * 待确认:订单正在校验/占位;
+     * 待付款:订单在此状态下,同时满足“支付开关canPay=1.可支付”,则可以调用出票代扣接口进行付款;
+     * <p>
+     * 出票中(已确认):付款后出票中到此状态;
+     * 已完成:表示出票成功;
+     * 已取消:订单取消成功,或者退票成功,到此状态;
+     */
+    private String orderStatus;
+
+    /**
+     * 下单时间
+     */
+    private String orderTime;
+
+    /**
+     * 出游日期
+     */
+    private String planDate;
+
+    /**
+     * 总价
+     */
+    private Integer amoutPrice;
+
+    /**
+     * 取票地址
+     */
+    private String pickUpAddress;
+
+    /**
+     * 凭证码(“已完成”状态有值)
+     */
+    private String externalOrderId;
+
+
+    /**
+     * 入园方式及凭证信息
+     */
+    private EnterCertificate enterCertificate;
+
+    /**
+     * 状态详情
+     */
+    private String statusDesc;
+
+
+    public String getSourceOrderId() {
+        return sourceOrderId;
+    }
+
+    public void setSourceOrderId(String sourceOrderId) {
+        this.sourceOrderId = sourceOrderId;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public String getAcctId() {
+        return acctId;
+    }
+
+    public void setAcctId(String acctId) {
+        this.acctId = acctId;
+    }
+
+    public Integer getProductId() {
+        return productId;
+    }
+
+    public void setProductId(Integer productId) {
+        this.productId = productId;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public Integer getBookNumber() {
+        return bookNumber;
+    }
+
+    public void setBookNumber(Integer bookNumber) {
+        this.bookNumber = bookNumber;
+    }
+
+    public Contact getContact() {
+        return contact;
+    }
+
+    public void setContact(Contact contact) {
+        this.contact = contact;
+    }
+
+    public List<Tourist> getTouristList() {
+        return touristList;
+    }
+
+    public void setTouristList(List<Tourist> touristList) {
+        this.touristList = touristList;
+    }
+
+    public Delivery getDelivery() {
+        return delivery;
+    }
+
+    public void setDelivery(Delivery delivery) {
+        this.delivery = delivery;
+    }
+
+    public Integer getCouponValue() {
+        return couponValue;
+    }
+
+    public void setCouponValue(Integer couponValue) {
+        this.couponValue = couponValue;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public Integer getPay() {
+        return pay;
+    }
+
+    public void setPay(Integer pay) {
+        this.pay = pay;
+    }
+
+    public String getPlatform() {
+        return platform;
+    }
+
+    public void setPlatform(String platform) {
+        this.platform = platform;
+    }
+
+    public String getCanPay() {
+        return canPay;
+    }
+
+    public void setCanPay(String canPay) {
+        this.canPay = canPay;
+    }
+
+    public Integer getScenicId() {
+        return scenicId;
+    }
+
+    public void setScenicId(Integer scenicId) {
+        this.scenicId = scenicId;
+    }
+
+    public String getScenicName() {
+        return scenicName;
+    }
+
+    public void setScenicName(String scenicName) {
+        this.scenicName = scenicName;
+    }
+
+    public String getOrderStatus() {
+        return orderStatus;
+    }
+
+    public void setOrderStatus(String orderStatus) {
+        this.orderStatus = orderStatus;
+    }
+
+    public String getOrderTime() {
+        return orderTime;
+    }
+
+    public void setOrderTime(String orderTime) {
+        this.orderTime = orderTime;
+    }
+
+    public String getPlanDate() {
+        return planDate;
+    }
+
+    public void setPlanDate(String planDate) {
+        this.planDate = planDate;
+    }
+
+    public Integer getAmoutPrice() {
+        return amoutPrice;
+    }
+
+    public void setAmoutPrice(Integer amoutPrice) {
+        this.amoutPrice = amoutPrice;
+    }
+
+    public String getPickUpAddress() {
+        return pickUpAddress;
+    }
+
+    public void setPickUpAddress(String pickUpAddress) {
+        this.pickUpAddress = pickUpAddress;
+    }
+
+    public String getExternalOrderId() {
+        return externalOrderId;
+    }
+
+    public void setExternalOrderId(String externalOrderId) {
+        this.externalOrderId = externalOrderId;
+    }
+
+    public EnterCertificate getEnterCertificate() {
+        return enterCertificate;
+    }
+
+    public void setEnterCertificate(EnterCertificate enterCertificate) {
+        this.enterCertificate = enterCertificate;
+    }
+}
+

+ 42 - 0
src/main/java/com/izouma/awesomeadmin/dto/tuniu/TicketCertInfo.java

@@ -0,0 +1,42 @@
+package com.izouma.awesomeadmin.dto.tuniu;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import java.util.List;
+
+
+/**
+ * TicketCertInfo 凭证对象
+ */
+@JsonAutoDetect
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class TicketCertInfo {
+
+    /**
+     * 凭证类型   1.纯文本  2.二维码 3.PDF
+     */
+    private Integer certType;
+
+    /**
+     * 凭证文本或者URL
+     */
+    private List<String> fileUrls;
+
+    public Integer getCertType() {
+        return certType;
+    }
+
+    public void setCertType(Integer certType) {
+        this.certType = certType;
+    }
+
+    public List<String> getFileUrls() {
+        return fileUrls;
+    }
+
+    public void setFileUrls(List<String> fileUrls) {
+        this.fileUrls = fileUrls;
+    }
+}
+

+ 99 - 0
src/main/java/com/izouma/awesomeadmin/dto/tuniu/Tourist.java

@@ -0,0 +1,99 @@
+package com.izouma.awesomeadmin.dto.tuniu;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+
+/**
+ * Tourist--游客信息
+ */
+@JsonAutoDetect
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class Tourist {
+
+    private String name;//游客姓名
+
+    /**
+     * 证件类型:
+     * <p>
+     * 1、二代身份证
+     * <p>
+     * 2、护照
+     * <p>
+     * 3、军官证
+     * <p>
+     * 4、港澳通行证
+     * <p>
+     * 7、台胞证
+     * <p>
+     * 8、回乡证
+     * <p>
+     * 9、户口簿
+     * <p>
+     * 10、出生证明
+     * <p>
+     * 11、台湾通行证
+     * <p>
+     * “门票详情接口->custInfoLimit“=3、6时必传;否则不要传。
+     */
+    private Integer psptType;
+
+    /**
+     * 证件号码
+     * <p>
+     * “门票详情接口->custInfoLimit”=3、6时必填;否则不要传。
+     */
+    private String psptId;
+
+
+    /**
+     * 电话号码
+     */
+    private String tel;
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getPsptType() {
+        return psptType;
+    }
+
+    public void setPsptType(Integer psptType) {
+        this.psptType = psptType;
+    }
+
+    public String getPsptId() {
+        return psptId;
+    }
+
+    public void setPsptId(String psptId) {
+        this.psptId = psptId;
+    }
+
+    public String getTel() {
+        return tel;
+    }
+
+    public void setTel(String tel) {
+        this.tel = tel;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+}
+

+ 126 - 89
src/main/java/com/izouma/awesomeadmin/model/ProductInfo.java

@@ -2,13 +2,15 @@ package com.izouma.awesomeadmin.model;
 
 import java.math.BigDecimal;
 import java.util.*;
+
+import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.fasterxml.jackson.annotation.JsonInclude;
 
 
 @JsonAutoDetect
 @JsonInclude(JsonInclude.Include.NON_NULL)
-public class ProductInfo{
+public class ProductInfo {
     private Integer id;
     private String delFlag;
     private Date updateTime;
@@ -37,241 +39,276 @@ public class ProductInfo{
     private String packageIds;
     private String productIds;
 
-private String idStr;
+    private String idStr;
+
+    private String searchKey;
 
-private String searchKey;
+    /**
+     * and,test_name,like,value;or,remark,=,123
+     */
+    private String advancedQuery;
 
-/**
-* and,test_name,like,value;or,remark,=,123
-*/
-private String advancedQuery;
+    /**
+     * column_name_,desc_;column_name_,asc
+     */
+    private String orderByStr;
 
-/**
-* column_name_,desc_;column_name_,asc
-*/
-private String orderByStr;
+    private JSONObject ticketDetail;
 
-    public Integer getId(){
+    public Integer getId() {
         return this.id;
     }
 
-    public void setId(Integer id){
+    public void setId(Integer id) {
         this.id = id;
     }
-    public String getDelFlag(){
+
+    public String getDelFlag() {
         return this.delFlag;
     }
 
-    public void setDelFlag(String delFlag){
+    public void setDelFlag(String delFlag) {
         this.delFlag = delFlag;
     }
-    public Date getUpdateTime(){
+
+    public Date getUpdateTime() {
         return this.updateTime;
     }
 
-    public void setUpdateTime(Date updateTime){
+    public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
-    public String getUpdateUser(){
+
+    public String getUpdateUser() {
         return this.updateUser;
     }
 
-    public void setUpdateUser(String updateUser){
+    public void setUpdateUser(String updateUser) {
         this.updateUser = updateUser;
     }
-    public Date getCreateTime(){
+
+    public Date getCreateTime() {
         return this.createTime;
     }
 
-    public void setCreateTime(Date createTime){
+    public void setCreateTime(Date createTime) {
         this.createTime = createTime;
     }
-    public String getCreateUser(){
+
+    public String getCreateUser() {
         return this.createUser;
     }
 
-    public void setCreateUser(String createUser){
+    public void setCreateUser(String createUser) {
         this.createUser = createUser;
     }
-    public Integer getTypeFlag(){
+
+    public Integer getTypeFlag() {
         return this.typeFlag;
     }
 
-    public void setTypeFlag(Integer typeFlag){
+    public void setTypeFlag(Integer typeFlag) {
         this.typeFlag = typeFlag;
     }
-    public String getUseScope(){
+
+    public String getUseScope() {
         return this.useScope;
     }
 
-    public void setUseScope(String useScope){
+    public void setUseScope(String useScope) {
         this.useScope = useScope;
     }
-    public Integer getLandmarkId(){
+
+    public Integer getLandmarkId() {
         return this.landmarkId;
     }
 
-    public void setLandmarkId(Integer landmarkId){
+    public void setLandmarkId(Integer landmarkId) {
         this.landmarkId = landmarkId;
     }
-    public String getProductName(){
+
+    public String getProductName() {
         return this.productName;
     }
 
-    public void setProductName(String productName){
+    public void setProductName(String productName) {
         this.productName = productName;
     }
-    public BigDecimal getPrice(){
+
+    public BigDecimal getPrice() {
         return this.price;
     }
 
-    public void setPrice(BigDecimal price){
+    public void setPrice(BigDecimal price) {
         this.price = price;
     }
-    public String getImage(){
+
+    public String getImage() {
         return this.image;
     }
 
-    public void setImage(String image){
+    public void setImage(String image) {
         this.image = image;
     }
-    public String getProductContent(){
+
+    public String getProductContent() {
         return this.productContent;
     }
 
-    public void setProductContent(String productContent){
+    public void setProductContent(String productContent) {
         this.productContent = productContent;
     }
-    public Integer getStockNum(){
+
+    public Integer getStockNum() {
         return this.stockNum;
     }
 
-    public void setStockNum(Integer stockNum){
+    public void setStockNum(Integer stockNum) {
         this.stockNum = stockNum;
     }
-    public Integer getLimitNum(){
+
+    public Integer getLimitNum() {
         return this.limitNum;
     }
 
-    public void setLimitNum(Integer limitNum){
+    public void setLimitNum(Integer limitNum) {
         this.limitNum = limitNum;
     }
-    public Date getLimitDate(){
+
+    public Date getLimitDate() {
         return this.limitDate;
     }
 
-    public void setLimitDate(Date limitDate){
+    public void setLimitDate(Date limitDate) {
         this.limitDate = limitDate;
     }
-    public String getTicketId(){
+
+    public String getTicketId() {
         return this.ticketId;
     }
 
-    public void setTicketId(String ticketId){
+    public void setTicketId(String ticketId) {
         this.ticketId = ticketId;
     }
-    public String getScenicId(){
+
+    public String getScenicId() {
         return this.scenicId;
     }
 
-    public void setScenicId(String scenicId){
+    public void setScenicId(String scenicId) {
         this.scenicId = scenicId;
     }
-    public String getScenicName(){
+
+    public String getScenicName() {
         return this.scenicName;
     }
 
-    public void setScenicName(String scenicName){
+    public void setScenicName(String scenicName) {
         this.scenicName = scenicName;
     }
-    public String getTicketName(){
+
+    public String getTicketName() {
         return this.ticketName;
     }
 
-    public void setTicketName(String ticketName){
+    public void setTicketName(String ticketName) {
         this.ticketName = ticketName;
     }
-    public String getWebPrice(){
+
+    public String getWebPrice() {
         return this.webPrice;
     }
 
-    public void setWebPrice(String webPrice){
+    public void setWebPrice(String webPrice) {
         this.webPrice = webPrice;
     }
-    public String getSalePrice(){
+
+    public String getSalePrice() {
         return this.salePrice;
     }
 
-    public void setSalePrice(String salePrice){
+    public void setSalePrice(String salePrice) {
         this.salePrice = salePrice;
     }
-    public String getPriceLowFlag(){
+
+    public String getPriceLowFlag() {
         return this.priceLowFlag;
     }
 
-    public void setPriceLowFlag(String priceLowFlag){
+    public void setPriceLowFlag(String priceLowFlag) {
         this.priceLowFlag = priceLowFlag;
     }
-    public String getRemark(){
+
+    public String getRemark() {
         return this.remark;
     }
 
-    public void setRemark(String remark){
+    public void setRemark(String remark) {
         this.remark = remark;
     }
-    public String getShelfFlag(){
+
+    public String getShelfFlag() {
         return this.shelfFlag;
     }
 
-    public void setShelfFlag(String shelfFlag){
+    public void setShelfFlag(String shelfFlag) {
         this.shelfFlag = shelfFlag;
     }
-    public String getPackageIds(){
+
+    public String getPackageIds() {
         return this.packageIds;
     }
 
-    public void setPackageIds(String packageIds){
+    public void setPackageIds(String packageIds) {
         this.packageIds = packageIds;
     }
-    public String getProductIds(){
+
+    public String getProductIds() {
         return this.productIds;
     }
 
-    public void setProductIds(String productIds){
+    public void setProductIds(String productIds) {
         this.productIds = productIds;
     }
 
-public String getSearchKey() {
-    return searchKey;
-}
+    public String getSearchKey() {
+        return searchKey;
+    }
 
-public void setSearchKey(String searchKey) {
-    this.searchKey = searchKey;
-}
+    public void setSearchKey(String searchKey) {
+        this.searchKey = searchKey;
+    }
 
-public String getAdvancedQuery() {
-    return advancedQuery;
-}
+    public String getAdvancedQuery() {
+        return advancedQuery;
+    }
 
-public void setAdvancedQuery(String advancedQuery) {
-    this.advancedQuery = advancedQuery;
-}
+    public void setAdvancedQuery(String advancedQuery) {
+        this.advancedQuery = advancedQuery;
+    }
 
-public String getOrderByStr() {
-    return orderByStr;
-}
+    public String getOrderByStr() {
+        return orderByStr;
+    }
 
-public void setOrderByStr(String orderByStr) {
-    this.orderByStr = orderByStr;
-}
+    public void setOrderByStr(String orderByStr) {
+        this.orderByStr = orderByStr;
+    }
 
-public String getIdStr() {
-    return idStr;
-}
+    public String getIdStr() {
+        return idStr;
+    }
 
-public void setIdStr(String idStr) {
-    this.idStr = idStr;
-}
+    public void setIdStr(String idStr) {
+        this.idStr = idStr;
+    }
 
+    public JSONObject getTicketDetail() {
+        return ticketDetail;
+    }
+
+    public void setTicketDetail(JSONObject ticketDetail) {
+        this.ticketDetail = ticketDetail;
+    }
 }
 

+ 51 - 0
src/main/java/com/izouma/awesomeadmin/model/UserOrder.java

@@ -3,8 +3,10 @@ package com.izouma.awesomeadmin.model;
 import java.math.BigDecimal;
 import java.util.*;
 
+import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.izouma.awesomeadmin.dto.tuniu.Order;
 
 
 @JsonAutoDetect
@@ -31,6 +33,12 @@ public class UserOrder {
     private String marketCode;
     private BigDecimal coin;
 
+    private Integer typeFlag;//类型,0为导航包,1为商品
+
+    private Integer productId;//商品Id
+
+    private String tuniuOrderId;//途牛订单Id;
+
     private String idStr;
 
     private String searchKey;
@@ -45,6 +53,9 @@ public class UserOrder {
      */
     private String orderByStr;
 
+    private Order tuniuOrder;
+    private JSONObject tuniuOrderJson;
+
     public Integer getId() {
         return this.id;
     }
@@ -236,5 +247,45 @@ public class UserOrder {
     public void setCoin(BigDecimal coin) {
         this.coin = coin;
     }
+
+    public Integer getTypeFlag() {
+        return typeFlag;
+    }
+
+    public void setTypeFlag(Integer typeFlag) {
+        this.typeFlag = typeFlag;
+    }
+
+    public Integer getProductId() {
+        return productId;
+    }
+
+    public void setProductId(Integer productId) {
+        this.productId = productId;
+    }
+
+    public String getTuniuOrderId() {
+        return tuniuOrderId;
+    }
+
+    public void setTuniuOrderId(String tuniuOrderId) {
+        this.tuniuOrderId = tuniuOrderId;
+    }
+
+    public Order getTuniuOrder() {
+        return tuniuOrder;
+    }
+
+    public void setTuniuOrder(Order tuniuOrder) {
+        this.tuniuOrder = tuniuOrder;
+    }
+
+    public JSONObject getTuniuOrderJson() {
+        return tuniuOrderJson;
+    }
+
+    public void setTuniuOrderJson(JSONObject tuniuOrderJson) {
+        this.tuniuOrderJson = tuniuOrderJson;
+    }
 }
 

+ 204 - 0
src/main/java/com/izouma/awesomeadmin/model/UserPackage.java

@@ -0,0 +1,204 @@
+package com.izouma.awesomeadmin.model;
+
+import java.util.*;
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+
+@JsonAutoDetect
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class UserPackage{
+    private Integer id;
+    private String delFlag;
+    private Date updateTime;
+    private String updateUser;
+    private Date createTime;
+    private String createUser;
+    private Integer typeFlag;
+    private String name;
+    private String orderId;
+    private String tuniuOrderId;
+    private String productId;
+    private String checkCode;
+    private Integer statusFlag;
+    private Date limitTime;
+    private String userId;
+    private String landMarkId;
+    private String showFlag;
+    private Date checkTime;
+
+private String idStr;
+
+private String searchKey;
+
+/**
+* and,test_name,like,value;or,remark,=,123
+*/
+private String advancedQuery;
+
+/**
+* column_name_,desc_;column_name_,asc
+*/
+private String orderByStr;
+
+    public Integer getId(){
+        return this.id;
+    }
+
+    public void setId(Integer id){
+        this.id = id;
+    }
+    public String getDelFlag(){
+        return this.delFlag;
+    }
+
+    public void setDelFlag(String delFlag){
+        this.delFlag = delFlag;
+    }
+    public Date getUpdateTime(){
+        return this.updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime){
+        this.updateTime = updateTime;
+    }
+    public String getUpdateUser(){
+        return this.updateUser;
+    }
+
+    public void setUpdateUser(String updateUser){
+        this.updateUser = updateUser;
+    }
+    public Date getCreateTime(){
+        return this.createTime;
+    }
+
+    public void setCreateTime(Date createTime){
+        this.createTime = createTime;
+    }
+    public String getCreateUser(){
+        return this.createUser;
+    }
+
+    public void setCreateUser(String createUser){
+        this.createUser = createUser;
+    }
+    public Integer getTypeFlag(){
+        return this.typeFlag;
+    }
+
+    public void setTypeFlag(Integer typeFlag){
+        this.typeFlag = typeFlag;
+    }
+    public String getName(){
+        return this.name;
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public String getOrderId(){
+        return this.orderId;
+    }
+
+    public void setOrderId(String orderId){
+        this.orderId = orderId;
+    }
+    public String getTuniuOrderId(){
+        return this.tuniuOrderId;
+    }
+
+    public void setTuniuOrderId(String tuniuOrderId){
+        this.tuniuOrderId = tuniuOrderId;
+    }
+    public String getProductId(){
+        return this.productId;
+    }
+
+    public void setProductId(String productId){
+        this.productId = productId;
+    }
+    public String getCheckCode(){
+        return this.checkCode;
+    }
+
+    public void setCheckCode(String checkCode){
+        this.checkCode = checkCode;
+    }
+    public Integer getStatusFlag(){
+        return this.statusFlag;
+    }
+
+    public void setStatusFlag(Integer statusFlag){
+        this.statusFlag = statusFlag;
+    }
+    public Date getLimitTime(){
+        return this.limitTime;
+    }
+
+    public void setLimitTime(Date limitTime){
+        this.limitTime = limitTime;
+    }
+    public String getUserId(){
+        return this.userId;
+    }
+
+    public void setUserId(String userId){
+        this.userId = userId;
+    }
+    public String getLandMarkId(){
+        return this.landMarkId;
+    }
+
+    public void setLandMarkId(String landMarkId){
+        this.landMarkId = landMarkId;
+    }
+    public String getShowFlag(){
+        return this.showFlag;
+    }
+
+    public void setShowFlag(String showFlag){
+        this.showFlag = showFlag;
+    }
+    public Date getCheckTime(){
+        return this.checkTime;
+    }
+
+    public void setCheckTime(Date checkTime){
+        this.checkTime = checkTime;
+    }
+
+public String getSearchKey() {
+    return searchKey;
+}
+
+public void setSearchKey(String searchKey) {
+    this.searchKey = searchKey;
+}
+
+public String getAdvancedQuery() {
+    return advancedQuery;
+}
+
+public void setAdvancedQuery(String advancedQuery) {
+    this.advancedQuery = advancedQuery;
+}
+
+public String getOrderByStr() {
+    return orderByStr;
+}
+
+public void setOrderByStr(String orderByStr) {
+    this.orderByStr = orderByStr;
+}
+
+public String getIdStr() {
+    return idStr;
+}
+
+public void setIdStr(String idStr) {
+    this.idStr = idStr;
+}
+
+}
+

+ 2 - 0
src/main/java/com/izouma/awesomeadmin/service/UserOrderService.java

@@ -31,5 +31,7 @@ public interface UserOrderService {
     Result payOrder(String orderId, double coin, double point, double cash, int payMode);
 
     void alipaySuccess(String tradeNo, String tradeStatus);
+
+    Result productCreateUserOrder(UserOrder record);
 }
 

+ 27 - 0
src/main/java/com/izouma/awesomeadmin/service/UserPackageService.java

@@ -0,0 +1,27 @@
+package com.izouma.awesomeadmin.service;
+
+import java.util.*;
+import com.izouma.awesomeadmin.dto.Page;
+import com.izouma.awesomeadmin.model.UserPackage;
+
+
+/**
+*  service接口类
+*/
+public interface UserPackageService{
+
+    List<UserPackage> getUserPackageList(UserPackage record);
+
+    List<UserPackage> getUserPackageByPage(Page page, UserPackage record);
+
+    UserPackage getUserPackageById(String id);
+
+    UserPackage getUserPackage(UserPackage record);
+
+    boolean createUserPackage(UserPackage record);
+
+    boolean deleteUserPackage(UserPackage record);
+
+    boolean updateUserPackage(UserPackage record);
+}
+

+ 39 - 19
src/main/java/com/izouma/awesomeadmin/service/impl/ProductInfoServiceImpl.java

@@ -1,6 +1,9 @@
 package com.izouma.awesomeadmin.service.impl;
 
 import java.util.*;
+
+import com.alibaba.fastjson.JSONObject;
+import com.izouma.awesomeadmin.tuniu.util.TicketUtil;
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -11,10 +14,10 @@ import com.izouma.awesomeadmin.service.ProductInfoService;
 import com.izouma.awesomeadmin.dao.ProductInfoMapper;
 
 /**
-*  service接口实现类
-*/
+ * service接口实现类
+ */
 @Service
-public class ProductInfoServiceImpl implements ProductInfoService{
+public class ProductInfoServiceImpl implements ProductInfoService {
 
     private static Logger logger = Logger.getLogger(ProductInfoServiceImpl.class);
 
@@ -27,26 +30,27 @@ public class ProductInfoServiceImpl implements ProductInfoService{
         logger.info("getProductInfoList");
         try {
 
-        return productInfoMapper.queryAllProductInfo(record);
+            return productInfoMapper.queryAllProductInfo(record);
         } catch (Exception e) {
-        logger.error("getProductInfoList", e);
+            logger.error("getProductInfoList", e);
         }
 
         return null;
     }
+
     @Override
     public List<ProductInfo> getProductInfoByPage(Page page, ProductInfo record) {
 
         logger.info("getProductInfoByPage");
         try {
 
-        Map<String, Object> parameter = new HashMap<String, Object>();
-        parameter.put("record", record);
-        parameter.put(AppConstant.PAGE, page);
+            Map<String, Object> parameter = new HashMap<String, Object>();
+            parameter.put("record", record);
+            parameter.put(AppConstant.PAGE, page);
 
-        return productInfoMapper.queryProductInfoByPage(parameter);
+            return productInfoMapper.queryProductInfoByPage(parameter);
         } catch (Exception e) {
-        logger.error("getProductInfoByPage", e);
+            logger.error("getProductInfoByPage", e);
         }
 
         return null;
@@ -60,7 +64,7 @@ public class ProductInfoServiceImpl implements ProductInfoService{
 
             return productInfoMapper.selectByPrimaryKey(Integer.valueOf(id));
         } catch (Exception e) {
-        logger.error("getProductInfoById", e);
+            logger.error("getProductInfoById", e);
         }
 
         return null;
@@ -71,10 +75,26 @@ public class ProductInfoServiceImpl implements ProductInfoService{
 
         logger.info("getProductInfo");
         try {
+            ProductInfo productInfo = productInfoMapper.queryProductInfo(record);
+            if (AppConstant.ProductType.TICKET == productInfo.getTypeFlag()) {
+
+                // 请求的接口地址
+                String url = "Ticket/detail";
+                // 设置请求的参数
+                Map<String, Object> params = new HashMap<>();
+                params.put("productId", productInfo.getTicketId()); //
 
-            return productInfoMapper.queryProductInfo(record);
+                String result = TicketUtil.getResult(url, params);
+
+                JSONObject resultJson = JSONObject.parseObject(result);
+                if (resultJson.getBoolean("success")) {
+                    productInfo.setTicketDetail(resultJson.getJSONObject("data"));
+                }
+
+            }
+            return productInfo;
         } catch (Exception e) {
-        logger.error("getProductInfo", e);
+            logger.error("getProductInfo", e);
         }
 
         return null;
@@ -89,7 +109,7 @@ public class ProductInfoServiceImpl implements ProductInfoService{
             int updates = productInfoMapper.insertSelective(record);
 
             if (updates > 0) {
-                 return true;
+                return true;
             }
         } catch (Exception e) {
             logger.error("createProductInfo", e);
@@ -104,13 +124,13 @@ public class ProductInfoServiceImpl implements ProductInfoService{
         logger.info("deleteProductInfo");
         try {
 
-             int updates = productInfoMapper.delete(record);
+            int updates = productInfoMapper.delete(record);
 
             if (updates > 0) {
-                 return true;
+                return true;
             }
         } catch (Exception e) {
-             logger.error("deleteProductInfo", e);
+            logger.error("deleteProductInfo", e);
         }
 
         return false;
@@ -125,10 +145,10 @@ public class ProductInfoServiceImpl implements ProductInfoService{
             int updates = productInfoMapper.updateByPrimaryKeySelective(record);
 
             if (updates > 0) {
-                 return true;
+                return true;
             }
         } catch (Exception e) {
-             logger.error("updateProductInfo", e);
+            logger.error("updateProductInfo", e);
         }
 
         return false;

+ 119 - 1
src/main/java/com/izouma/awesomeadmin/service/impl/UserOrderServiceImpl.java

@@ -3,11 +3,17 @@ package com.izouma.awesomeadmin.service.impl;
 import java.math.BigDecimal;
 import java.util.*;
 
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.Gson;
 import com.izouma.awesomeadmin.dao.AlipayTempMapper;
 import com.izouma.awesomeadmin.dao.NavigationPackageMapper;
 import com.izouma.awesomeadmin.dto.Result;
+import com.izouma.awesomeadmin.dto.tuniu.Order;
 import com.izouma.awesomeadmin.model.*;
 import com.izouma.awesomeadmin.service.*;
+import com.izouma.awesomeadmin.tuniu.util.TicketUtil;
+import com.izouma.awesomeadmin.util.PropertiesFileLoader;
+import org.apache.commons.beanutils.BeanMap;
 import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -30,6 +36,9 @@ public class UserOrderServiceImpl implements UserOrderService {
     @Autowired
     private NavigationPackageMapper navigationPackageMapper;
 
+    @Autowired
+    private ProductInfoService productInfoService;
+
     @Autowired
     private UserInfoService userInfoService;
 
@@ -97,8 +106,21 @@ public class UserOrderServiceImpl implements UserOrderService {
 
         logger.info("getUserOrder");
         try {
+            UserOrder userOrder = userOrderMapper.queryUserOrder(record);
+
+            if (StringUtils.isNotBlank(userOrder.getTuniuOrderId())) {
+
+                String result = TicketUtil.orderDetail(userOrder.getTuniuOrderId());
+
+                JSONObject resultJson = JSONObject.parseObject(result);
+                if (resultJson.getBoolean("success")) {
+                    JSONObject data = resultJson.getJSONObject("data");
+                    JSONObject orderInfoJson = data.getJSONObject("orderInfo");
+                    userOrder.setTuniuOrder(JSONObject.toJavaObject(orderInfoJson, Order.class));
+                }
+            }
 
-            return userOrderMapper.queryUserOrder(record);
+            return userOrder;
         } catch (Exception e) {
             logger.error("getUserOrder", e);
         }
@@ -170,6 +192,102 @@ public class UserOrderServiceImpl implements UserOrderService {
         return new Result(false, "下单失败");
     }
 
+    @Override
+    public Result productCreateUserOrder(UserOrder record) {
+
+        logger.info("productCreateUserOrder");
+        try {
+
+            record.setTypeFlag(1);
+
+            if (record.getUserId() != null && record.getProductId() != null) {//用户和商品Id都必须存在
+
+                ProductInfo productInfo = new ProductInfo();
+                productInfo.setId(record.getProductId());
+
+                productInfo = productInfoService.getProductInfo(productInfo);
+
+                if (productInfo == null || !"Y".equals(productInfo.getShelfFlag())) {
+                    return new Result(false, "商品未上线或不存在");
+                }
+
+                record.setLankMarkId(productInfo.getLandmarkId());
+
+                BigDecimal totlePrice = productInfo.getPrice();
+                record.setTotlePrice(totlePrice);
+                BigDecimal dealPrice = totlePrice;
+
+                //推广码进行折扣或减价
+                if (StringUtils.isNotEmpty(record.getMarketCode())) {
+                    MarketCode marketCode = new MarketCode();
+                    marketCode.setCode(record.getMarketCode());
+                    marketCode = marketCodeService.getMarketCode(marketCode);
+                    if (marketCode == null) {
+                        return new Result(false, "推广码不存在");
+                    }
+
+                    if (marketCode.getMarketType() == null) {
+                        return new Result(false, "推广码无效");
+                    }
+
+                    MarketType marketType = marketCode.getMarketType();
+
+                    if (AppConstant.MarketType.REDUCTION == marketType.getTypeFlag()) { //减免
+
+                        dealPrice = totlePrice.subtract(marketType.getMoney());
+
+                    } else if (AppConstant.MarketType.DISCOUNT == marketType.getTypeFlag()) {//折扣
+                        dealPrice = totlePrice.multiply(marketType.getMoney().divide(BigDecimal.valueOf(100)));
+                    }
+
+
+                }
+
+                record.setDealPrice(dealPrice);
+
+                if (AppConstant.ProductType.TICKET == productInfo.getTypeFlag()) {
+                    // 请求的接口地址
+                    String url = "Ticket/createOrderNew";
+                    // 设置请求的参数
+                    Map<String, Object> params = new HashMap<>();
+
+                    params.put("acctId", PropertiesFileLoader.getProperties("tuniu_acctId"));
+                    params.put("productId", productInfo.getTicketId());
+                    params.put("startTime", record.getTuniuOrder().getStartTime());
+                    params.put("bookNumber", record.getTuniuOrder().getBookNumber());
+                    params.put("contact", record.getTuniuOrder().getContact());
+                    params.put("touristList", record.getTuniuOrder().getTouristList());
+
+
+                    String result = TicketUtil.getResult(url, params);
+
+                    JSONObject resultJson = JSONObject.parseObject(result);
+                    if (resultJson.getBoolean("success")) {
+                        productInfo.setTicketDetail(resultJson.getJSONObject("data"));
+                        record.setTuniuOrderId(resultJson.getJSONObject("data").getInteger("orderId").toString());
+                    } else {
+
+                        return new Result(false, result);
+                    }
+
+                }
+
+
+                int updates = userOrderMapper.insertSelective(record);
+
+                if (updates > 0) {
+                    return new Result(true, record.getId());
+                }
+            }
+
+
+        } catch (Exception e) {
+            logger.error("productCreateUserOrder", e);
+        }
+
+        return new Result(false, "下单失败");
+    }
+
     @Override
     public boolean deleteUserOrder(UserOrder record) {
 

+ 137 - 0
src/main/java/com/izouma/awesomeadmin/service/impl/UserPackageServiceImpl.java

@@ -0,0 +1,137 @@
+package com.izouma.awesomeadmin.service.impl;
+
+import java.util.*;
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.izouma.awesomeadmin.constant.AppConstant;
+import com.izouma.awesomeadmin.dto.Page;
+import com.izouma.awesomeadmin.model.UserPackage;
+import com.izouma.awesomeadmin.service.UserPackageService;
+import com.izouma.awesomeadmin.dao.UserPackageMapper;
+
+/**
+*  service接口实现类
+*/
+@Service
+public class UserPackageServiceImpl implements UserPackageService{
+
+    private static Logger logger = Logger.getLogger(UserPackageServiceImpl.class);
+
+    @Autowired
+    private UserPackageMapper userPackageMapper;
+
+    @Override
+    public List<UserPackage> getUserPackageList(UserPackage record) {
+
+        logger.info("getUserPackageList");
+        try {
+
+        return userPackageMapper.queryAllUserPackage(record);
+        } catch (Exception e) {
+        logger.error("getUserPackageList", e);
+        }
+
+        return null;
+    }
+    @Override
+    public List<UserPackage> getUserPackageByPage(Page page, UserPackage record) {
+
+        logger.info("getUserPackageByPage");
+        try {
+
+        Map<String, Object> parameter = new HashMap<String, Object>();
+        parameter.put("record", record);
+        parameter.put(AppConstant.PAGE, page);
+
+        return userPackageMapper.queryUserPackageByPage(parameter);
+        } catch (Exception e) {
+        logger.error("getUserPackageByPage", e);
+        }
+
+        return null;
+    }
+
+    @Override
+    public UserPackage getUserPackageById(String id) {
+
+        logger.info("getUserPackageyId");
+        try {
+
+            return userPackageMapper.selectByPrimaryKey(Integer.valueOf(id));
+        } catch (Exception e) {
+        logger.error("getUserPackageById", e);
+        }
+
+        return null;
+    }
+
+    @Override
+    public UserPackage getUserPackage(UserPackage record) {
+
+        logger.info("getUserPackage");
+        try {
+
+            return userPackageMapper.queryUserPackage(record);
+        } catch (Exception e) {
+        logger.error("getUserPackage", e);
+        }
+
+        return null;
+    }
+
+    @Override
+    public boolean createUserPackage(UserPackage record) {
+
+        logger.info("createUserPackage");
+        try {
+
+            int updates = userPackageMapper.insertSelective(record);
+
+            if (updates > 0) {
+                 return true;
+            }
+        } catch (Exception e) {
+            logger.error("createUserPackage", e);
+        }
+
+        return false;
+    }
+
+    @Override
+    public boolean deleteUserPackage(UserPackage record) {
+
+        logger.info("deleteUserPackage");
+        try {
+
+             int updates = userPackageMapper.delete(record);
+
+            if (updates > 0) {
+                 return true;
+            }
+        } catch (Exception e) {
+             logger.error("deleteUserPackage", e);
+        }
+
+        return false;
+    }
+
+    @Override
+    public boolean updateUserPackage(UserPackage record) {
+
+        logger.info("updateUserPackage");
+        try {
+
+            int updates = userPackageMapper.updateByPrimaryKeySelective(record);
+
+            if (updates > 0) {
+                 return true;
+            }
+        } catch (Exception e) {
+             logger.error("updateUserPackage", e);
+        }
+
+        return false;
+    }
+}
+

+ 3 - 1
src/main/java/com/izouma/awesomeadmin/tuniu/common/URLConfig.java

@@ -1,7 +1,9 @@
 package com.izouma.awesomeadmin.tuniu.common;
 
+import com.izouma.awesomeadmin.util.PropertiesFileLoader;
+
 public class URLConfig {
 
-    public final static String URL = "https://doptest-api.dfyoo.com/";
+    public final static String URL = PropertiesFileLoader.getProperties("tuniu_api_url");
     //public final static String URL = "http://172.31.2.45:8080/";
 }

+ 29 - 0
src/main/java/com/izouma/awesomeadmin/tuniu/util/TicketUtil.java

@@ -0,0 +1,29 @@
+package com.izouma.awesomeadmin.tuniu.util;
+
+import com.izouma.awesomeadmin.tuniu.common.SendHttpRequest;
+import com.izouma.awesomeadmin.tuniu.common.URLConfig;
+import com.izouma.awesomeadmin.util.PropertiesFileLoader;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class TicketUtil {
+
+    public static String getResult(String url, Map<String, Object> params) {
+        String apiKey = PropertiesFileLoader.getProperties("tuniu_app_key");
+        String secretKey = PropertiesFileLoader.getProperties("tuniu_app_secret_key");
+        return SendHttpRequest.sendPostConn(URLConfig.URL + url, params, apiKey, secretKey);
+    }
+
+    public static String orderDetail(String orderId) {
+        // 请求的接口地址
+        String url = "Ticket/orderDetail";
+
+        // 设置请求的参数
+        Map<String, Object> params = new HashMap<>();
+        params.put("orderId", orderId); //
+        params.put("acctId", PropertiesFileLoader.getProperties("tuniu_acctId")); //
+        return TicketUtil.getResult(url, params);
+    }
+
+}

+ 14 - 24
src/main/java/com/izouma/awesomeadmin/web/TuNiuOpenApiController.java

@@ -1,33 +1,16 @@
 package com.izouma.awesomeadmin.web;
 
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import com.izouma.awesomeadmin.constant.AppConstant;
-import com.izouma.awesomeadmin.dto.Page;
 import com.izouma.awesomeadmin.dto.Result;
-import com.izouma.awesomeadmin.model.UserUpdateLog;
-import com.izouma.awesomeadmin.model.VuforiaImageInfo;
-import com.izouma.awesomeadmin.model.VuforiaTarget;
-import com.izouma.awesomeadmin.service.UserUpdateLogService;
-import com.izouma.awesomeadmin.service.VuforiaImageInfoService;
-import com.izouma.awesomeadmin.tuniu.common.SendHttpRequest;
-import com.izouma.awesomeadmin.tuniu.common.URLConfig;
-import com.izouma.awesomeadmin.util.ExportExcelUtil;
+import com.izouma.awesomeadmin.tuniu.util.TicketUtil;
 import com.izouma.awesomeadmin.util.PropertiesFileLoader;
-import org.apache.shiro.authz.annotation.RequiresAuthentication;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -38,9 +21,6 @@ import java.util.Map;
 public class TuNiuOpenApiController {
 
 
-    String apiKey = PropertiesFileLoader.getProperties("tuniu_app_key");
-    String secretKey = PropertiesFileLoader.getProperties("tuniu_app_secret_key");
-
     /**
      * 景点列表查询
      *
@@ -61,7 +41,7 @@ public class TuNiuOpenApiController {
         params.put("pageSize", pageSize != null ? pageSize : 10); //分页大小
         params.put("key", key); //查询关键字,城市或者景点名称
 
-        String result = SendHttpRequest.sendPostConn(URLConfig.URL + url, params, apiKey, secretKey);
+        String result = TicketUtil.getResult(url, params);
 
 
         return new Result(true, JSONObject.parseObject(result));
@@ -84,7 +64,7 @@ public class TuNiuOpenApiController {
         Map<String, Object> params = new HashMap<>();
         params.put("scenicId", scenicId); //
 
-        String result = SendHttpRequest.sendPostConn(URLConfig.URL + url, params, apiKey, secretKey);
+        String result = TicketUtil.getResult(url, params);
 
 
         return new Result(true, JSONObject.parseObject(result));
@@ -101,7 +81,17 @@ public class TuNiuOpenApiController {
         Map<String, Object> params = new HashMap<>();
         params.put("productId", productId); //
 
-        String result = SendHttpRequest.sendPostConn(URLConfig.URL + url, params, apiKey, secretKey);
+        String result = TicketUtil.getResult(url, params);
+
+        return new Result(true, JSONObject.parseObject(result));
+    }
+
+    @RequestMapping(value = "/orderDetail", method = RequestMethod.GET)
+    @ResponseBody
+    public Result orderDetail(@RequestParam(value = "orderId") Integer orderId) {
+
+
+        String result = TicketUtil.orderDetail(orderId.toString());
 
         return new Result(true, JSONObject.parseObject(result));
     }

+ 13 - 0
src/main/java/com/izouma/awesomeadmin/web/UserOrderController.java

@@ -83,6 +83,19 @@ public class UserOrderController {
         return userOrderService.createUserOrder(record);
     }
 
+    /**
+     * 商品类型提交订单
+     *
+     * @param record
+     * @return
+     */
+    @RequestMapping(value = "/productSave", method = RequestMethod.POST)
+    @ResponseBody
+    public Result productSave(@RequestBody UserOrder record) {
+        return userOrderService.productCreateUserOrder(record);
+    }
+
+
     /**
      * <p>更新信息。</p>
      */

+ 169 - 0
src/main/java/com/izouma/awesomeadmin/web/UserPackageController.java

@@ -0,0 +1,169 @@
+package com.izouma.awesomeadmin.web;
+
+import java.util.*;
+
+import com.izouma.awesomeadmin.util.ExportExcelUtil;
+import org.apache.commons.lang.StringUtils;
+import org.apache.shiro.authz.annotation.RequiresAuthentication;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import com.izouma.awesomeadmin.constant.AppConstant;
+import com.izouma.awesomeadmin.dto.Page;
+import com.izouma.awesomeadmin.dto.Result;
+import com.izouma.awesomeadmin.model.UserPackage;
+import com.izouma.awesomeadmin.service.UserPackageService;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+*  controller类
+*/
+@Controller
+@RequestMapping("/userPackage")
+public class UserPackageController {
+
+    @Autowired
+    private UserPackageService userPackageService;
+
+    /**
+    * <p>获取全部记录。</p>
+    */
+    @RequiresAuthentication
+    @RequestMapping(value = "/all", method = RequestMethod.GET)
+    @ResponseBody
+    public Result all(UserPackage record) {
+        List<UserPackage> pp = userPackageService.getUserPackageList(record);
+        return new Result(true, pp);
+    }
+
+    /**
+    * <p>根据Id。</p>
+    */
+    @RequestMapping(value = "/getUserPackage", method = RequestMethod.GET)
+    @ResponseBody
+    public Result getUserPackage(@RequestParam(required = false, value = "id") String id) {
+        UserPackage data = userPackageService.getUserPackageById(id);
+        return new Result(true, data);
+    }
+
+    /**
+    * <p>根据条件获取。</p>
+    */
+    @RequestMapping(value = "/getOne", method = RequestMethod.GET)
+    @ResponseBody
+    public Result getOne(UserPackage record) {
+        UserPackage data = userPackageService.getUserPackage(record);
+        return new Result(true, data);
+    }
+
+
+    /**
+    * <p>分页查询。</p>
+    */
+    @RequestMapping(value = "/page", method = RequestMethod.GET)
+    @ResponseBody
+    public Result page(Page page, UserPackage record) {
+        Map<String, Object> result = new HashMap<>();
+
+        List<UserPackage> pp =userPackageService.getUserPackageByPage(page, record);
+
+        result.put(AppConstant.PAGE, page);
+        result.put("pp", pp);
+        return new Result(true, result);
+    }
+
+
+    /**
+    * <p>保存。</p>
+    */
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    @ResponseBody
+    public Result save(UserPackage record) {
+        boolean num = userPackageService.createUserPackage(record);
+        if (num) {
+        return new Result(true, record.getId());
+        }
+        return new Result(false, "保存异常");
+    }
+
+    /**
+    * <p>更新信息。</p>
+    */
+    @RequestMapping(value = "/update", method = RequestMethod.POST)
+    @ResponseBody
+    public Result updateUserPackage(UserPackage record) {
+        boolean num = userPackageService.updateUserPackage(record);
+        if (num) {
+        return new Result(true, "保存成功");
+        }
+        return new Result(false, "保存异常");
+    }
+
+    /**
+    * <p>删除。</p>
+    */
+    @RequestMapping(value = "/del", method = RequestMethod.POST)
+    @ResponseBody
+    public Result deleteUserPackage(UserPackage record) {
+
+        boolean num = userPackageService.deleteUserPackage(record);
+        if (num) {
+        return new Result(true, "删除成功");
+        }
+        return new Result(false, "删除异常");
+    }
+
+    /**
+    * 导出Excel
+    * @param request
+    * @param response
+    * @param record
+    * @throws Exception
+    */
+    @RequestMapping(value = "/exportExcel", method = RequestMethod.GET)
+    @ResponseBody
+    public void exportExcel(HttpServletRequest request, HttpServletResponse response, UserPackage record) throws Exception {
+
+    List<UserPackage> userPackages = userPackageService.getUserPackageList(record);
+
+
+        String sheetName = "user_package";
+        String titleName = "用户背包数据表";
+        String fileName = "用户背包表";
+        int columnNumber = 18;
+        int[] columnWidth = { 20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20,  20 };
+        String[] columnName = {  "id" ,   "删除标识" ,   "更新时间" ,   "更新人" ,   "创建时间" ,   "创建人" ,   "类型" ,   "名称" ,   "订单Id" ,   "途牛订单" ,   "商品Id" ,   "验证码" ,   "状态" ,   "有效期" ,   "用户" ,   "地标Id" ,   "显示" ,   "核销时间"  };
+        String[][] dataList = new String[userPackages.size()][18];
+
+        for (int i = 0; i < userPackages.size(); i++) {
+
+                        dataList[i][0] = String.valueOf(userPackages.get(i).getId());
+                        dataList[i][1] = String.valueOf(userPackages.get(i).getDelFlag());
+                        dataList[i][2] = String.valueOf(userPackages.get(i).getUpdateTime());
+                        dataList[i][3] = String.valueOf(userPackages.get(i).getUpdateUser());
+                        dataList[i][4] = String.valueOf(userPackages.get(i).getCreateTime());
+                        dataList[i][5] = String.valueOf(userPackages.get(i).getCreateUser());
+                        dataList[i][6] = String.valueOf(userPackages.get(i).getTypeFlag());
+                        dataList[i][7] = String.valueOf(userPackages.get(i).getName());
+                        dataList[i][8] = String.valueOf(userPackages.get(i).getOrderId());
+                        dataList[i][9] = String.valueOf(userPackages.get(i).getTuniuOrderId());
+                        dataList[i][10] = String.valueOf(userPackages.get(i).getProductId());
+                        dataList[i][11] = String.valueOf(userPackages.get(i).getCheckCode());
+                        dataList[i][12] = String.valueOf(userPackages.get(i).getStatusFlag());
+                        dataList[i][13] = String.valueOf(userPackages.get(i).getLimitTime());
+                        dataList[i][14] = String.valueOf(userPackages.get(i).getUserId());
+                        dataList[i][15] = String.valueOf(userPackages.get(i).getLandMarkId());
+                        dataList[i][16] = String.valueOf(userPackages.get(i).getShowFlag());
+                        dataList[i][17] = String.valueOf(userPackages.get(i).getCheckTime());
+                    }
+
+
+        ExportExcelUtil.ExportWithResponse(sheetName, titleName, fileName,
+        columnNumber, columnWidth, columnName, dataList, response);
+
+
+        }
+    }
+

+ 2 - 0
src/main/resources/properties/outsidews.properties

@@ -41,4 +41,6 @@ agpay_wx_appid=wx2421b1c4370ec43b
 #途牛笛风
 tuniu_app_key=tickettest
 tuniu_app_secret_key=aaaaaaaa
+tuniu_api_url=https://doptest-api.dfyoo.com/
+tuniu_acctId=100012
 

+ 138 - 0
src/main/vue/src/pages/UserPackage.vue

@@ -0,0 +1,138 @@
+<template>
+    <div>
+        <el-form :model="formData" :rules="rules" ref="form" label-width="80px" label-position="right" size="small"
+                 style="max-width: 500px;">
+                                                                                                                                                                                                                                    <el-form-item prop="typeFlag" label="类型">
+                <el-input v-model="formData.typeFlag" :disabled="'typeFlag'==subColumn"></el-input>
+            </el-form-item>
+                                                                                                                                                                                                                                                                                                                            <el-form-item prop="name" label="名称">
+                <el-input v-model="formData.name" :disabled="'name'==subColumn"></el-input>
+            </el-form-item>
+                                                                                                                                                                                                                                                                                                                            <el-form-item prop="orderId" label="订单Id">
+                <el-input v-model="formData.orderId" :disabled="'orderId'==subColumn"></el-input>
+            </el-form-item>
+                                                                                                                                                                                                                                                                                                                            <el-form-item prop="tuniuOrderId" label="途牛订单">
+                <el-input v-model="formData.tuniuOrderId" :disabled="'tuniuOrderId'==subColumn"></el-input>
+            </el-form-item>
+                                                                                                                                                                                                                                                                                                                            <el-form-item prop="productId" label="商品Id">
+                <el-input v-model="formData.productId" :disabled="'productId'==subColumn"></el-input>
+            </el-form-item>
+                                                                                                                                                                                                                                                                                                                            <el-form-item prop="checkCode" label="验证码">
+                <el-input v-model="formData.checkCode" :disabled="'checkCode'==subColumn"></el-input>
+            </el-form-item>
+                                                                                                                                                                                                                                                                                                                            <el-form-item prop="statusFlag" label="状态">
+                <el-input v-model="formData.statusFlag" :disabled="'statusFlag'==subColumn"></el-input>
+            </el-form-item>
+                                                                                                                                                                                                                                                                                                                            <el-form-item prop="limitTime" label="有效期">
+                <el-input v-model="formData.limitTime" :disabled="'limitTime'==subColumn"></el-input>
+            </el-form-item>
+                                                                                                                                                                                                                                                                                                                            <el-form-item prop="userId" label="用户">
+                <el-input v-model="formData.userId" :disabled="'userId'==subColumn"></el-input>
+            </el-form-item>
+                                                                                                                                                                                                                                                                                                                            <el-form-item prop="landMarkId" label="地标Id">
+                <el-input v-model="formData.landMarkId" :disabled="'landMarkId'==subColumn"></el-input>
+            </el-form-item>
+                                                                                                                                                                                                                                                                                                                            <el-form-item prop="showFlag" label="显示">
+                <el-input v-model="formData.showFlag" :disabled="'showFlag'==subColumn"></el-input>
+            </el-form-item>
+                                                                                                                                                                                                                                                                                                                            <el-form-item prop="checkTime" label="核销时间">
+                <el-input v-model="formData.checkTime" :disabled="'checkTime'==subColumn"></el-input>
+            </el-form-item>
+                                                                                                                                                                                                                                                                                        <el-form-item>
+                <el-button @click="onSave" :loading="$store.state.fetchingData" type="primary">保存</el-button>
+                <el-button @click="onDelete" v-if="formData.id" type="danger">删除</el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+    import formValidator from '../formValidator'
+
+    export default {
+        created() {
+            if (this.$route.query.column) {
+                this.subColumn = this.$route.query.column.split(',')[1];
+                this.subValue = this.$route.query.column.split(',')[0];
+            }
+
+            if (this.$route.query.id) {
+                this.$http.get({
+                    url: '/userPackage/getOne',
+                    data: {
+                        id: this.$route.query.id
+                    }
+                }).then(res => {
+                    if (res.success) {
+
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
+                        this.formData = res.data;
+
+                    if (this.$route.query.column) {
+                        this.formData[this.subColumn] = this.subValue;
+                    }
+                    }
+                })
+            }else {
+                if (this.$route.query.column) {
+                    this.formData[this.subColumn] = this.subValue;
+                }
+            }
+
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            },
+        data() {
+            return {
+                saving: false,
+                formData: {},
+                rules: {
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            },
+                                                                                                                                                            subColumn: '',
+            subValue: '',
+        }
+        },
+        methods: {
+            onSave() {
+                this.$refs.form.validate((valid) => {
+                    if (valid) {
+                        this.submit();
+                    } else {
+                        return false;
+                    }
+                });
+            },
+            submit() {
+                var data = JSON.parse(JSON.stringify(this.formData));
+                this.$http.post({
+                    url: this.formData.id ? '/userPackage/update' : '/userPackage/save',
+                    data: data
+                }).then(res => {
+                    if (res.success) {
+                        this.$message.success('成功');
+                        this.$router.go(-1);
+                    } else {
+                        this.$message.warning('失败')
+                    }
+                });
+            },
+            onDelete() {
+                this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' }).then(() => {
+                    return this.$http.post({
+                    url: '/userPackage/del',
+                    data: { id: this.formData.id }
+                    })
+                }).then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                }).catch(action => {
+                    if (action === 'cancel') {
+                        this.$message.info('删除取消');
+                    } else {
+                        this.$message.error('删除失败');
+                    }
+                })
+            },
+        }
+    }
+</script>
+<style lang="less" scoped>
+</style>

+ 583 - 0
src/main/vue/src/pages/UserPackages.vue

@@ -0,0 +1,583 @@
+<template>
+    <div>
+        <div class="filters-container">
+        
+            <el-input placeholder="关键字" size="small" v-model="filter1" clearable class="filter-item"></el-input>
+            <el-button @click="searchData" type="primary" size="small" icon="el-icon-search" class="filter-item">搜索
+            </el-button>
+            <el-button @click="showAdvancedQueryDialog = !showAdvancedQueryDialog" type="primary" size="small"
+                       icon="el-icon-search" class="filter-item">高级查询
+            </el-button>
+            <el-button @click="showTableSortDialog = !showTableSortDialog" type="primary" size="small"
+                       icon="el-icon-sort" class="filter-item">排序
+            </el-button>
+            <el-button @click="$router.push({path:'/userPackage',query:{column:$route.query.column}})" type="primary"
+                       size="small" icon="el-icon-edit"
+                       class="filter-item">添加
+            </el-button>
+            <el-button @click="exportExcel" type="primary" size="small" icon="el-icon-share" class="filter-item">导出EXCEL
+            </el-button>
+            <el-dropdown trigger="click" size="medium" class="table-column-filter">
+                <span>
+                  筛选数据<i class="el-icon-arrow-down el-icon--right"></i>
+                </span>
+                <el-dropdown-menu slot="dropdown" class="table-column-filter-wrapper">
+                    <el-checkbox v-for="item in tableColumns" :key="item.value" v-model="item.show">{{item.label}}
+                    </el-checkbox>
+                </el-dropdown-menu>
+            </el-dropdown>
+        </div>
+        <el-table
+                :data="tableData"
+                :height="tableHeight"
+                row-key="id"
+                ref="table">
+            <el-table-column
+                    v-if="multipleMode"
+                    align="center"
+                    type="selection"
+                    width="50">
+            </el-table-column>
+            <el-table-column
+                    type="index"
+                    min-width="50"
+                    align="center">
+            </el-table-column>
+                                                                                                                                                                                                    
+                                            <el-table-column
+                                v-if="isColumnShow('typeFlag')"
+                                prop="typeFlag"
+                                label="类型"
+                                min-width="100">
+                        </el-table-column>
+                                                                
+                                            <el-table-column
+                                v-if="isColumnShow('name')"
+                                prop="name"
+                                label="名称"
+                                min-width="100">
+                        </el-table-column>
+                                                                
+                                            <el-table-column
+                                v-if="isColumnShow('orderId')"
+                                prop="orderId"
+                                label="订单Id"
+                                min-width="100">
+                        </el-table-column>
+                                                                
+                                            <el-table-column
+                                v-if="isColumnShow('tuniuOrderId')"
+                                prop="tuniuOrderId"
+                                label="途牛订单"
+                                min-width="100">
+                        </el-table-column>
+                                                                
+                                            <el-table-column
+                                v-if="isColumnShow('productId')"
+                                prop="productId"
+                                label="商品Id"
+                                min-width="100">
+                        </el-table-column>
+                                                                
+                                            <el-table-column
+                                v-if="isColumnShow('checkCode')"
+                                prop="checkCode"
+                                label="验证码"
+                                min-width="100">
+                        </el-table-column>
+                                                                
+                                            <el-table-column
+                                v-if="isColumnShow('statusFlag')"
+                                prop="statusFlag"
+                                label="状态"
+                                min-width="100">
+                        </el-table-column>
+                                                                
+                                            <el-table-column
+                                v-if="isColumnShow('limitTime')"
+                                prop="limitTime"
+                                label="有效期"
+                                min-width="100">
+                        </el-table-column>
+                                                                
+                                            <el-table-column
+                                v-if="isColumnShow('userId')"
+                                prop="userId"
+                                label="用户"
+                                min-width="100">
+                        </el-table-column>
+                                                                
+                                            <el-table-column
+                                v-if="isColumnShow('landMarkId')"
+                                prop="landMarkId"
+                                label="地标Id"
+                                min-width="100">
+                        </el-table-column>
+                                                                
+                                            <el-table-column
+                                v-if="isColumnShow('showFlag')"
+                                prop="showFlag"
+                                label="显示"
+                                min-width="100">
+                        </el-table-column>
+                                                                
+                                            <el-table-column
+                                v-if="isColumnShow('checkTime')"
+                                prop="checkTime"
+                                label="核销时间"
+                                min-width="100">
+                        </el-table-column>
+                                                            <el-table-column
+                    label="操作"
+                    align="center"
+                    fixed="right"
+                    min-width="150"
+            >
+                <template slot-scope="scope">
+                            <el-button @click="editRow(scope.row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(scope.row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <div class="multiple-mode-wrapper" v-if="0">
+                <el-button size="small" v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button size="small" @click="operation1">批量操作1</el-button>
+                    <el-button size="small" @click="operation2">批量操作2</el-button>
+                    <el-button size="small" @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div>
+            <el-pagination
+                    background
+                    @size-change="pageSizeChange"
+                    @current-change="currentPageChange"
+                    :current-page="currentPage"
+                    :page-sizes="[10, 20, 30, 40, 50]"
+                    :page-size="pageSize"
+                    layout="total, sizes, prev, pager, next, jumper"
+                    :total="totalNumber">
+            </el-pagination>
+        </div>
+        <el-dialog title="高级查询" :visible.sync="showAdvancedQueryDialog">
+            <el-button @click="addField" type="text" icon="el-icon-plus">添加</el-button>
+            <el-table :data="advancedQueryFields">
+
+                <el-table-column prop="link" label="链接符" align="center">
+                    <template slot-scope="{row}">
+                        <el-select placeholder="链接" size="small" v-model="row.link" class="filter-item">
+                            <el-option label="AND" value="AND">
+                            </el-option>
+                            <el-option label="OR" value="OR">
+                            </el-option>
+                        </el-select>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="name" label="字段" align="center">
+                    <template slot-scope="{row}">
+                        <el-select v-model="row.name">
+
+                            <el-option v-for="item in advancedQueryColumns" :label="item.label" :value="item.value"
+                                       :key="item.value"></el-option>
+                        </el-select>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="searchMethod" label="搜索方式" width="150" align="center">
+                    <template slot-scope="{row}">
+                        <el-select v-model="row.searchMethod">
+                            <el-option v-for="item in searchMethods" :label="item" :value="item"
+                                       :key="item"></el-option>
+                        </el-select>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="value" label="参数" align="center">
+                    <template slot-scope="{row}">
+                        <el-input v-model="row.value"></el-input>
+                    </template>
+                </el-table-column>
+                <el-table-column width="60" align="center">
+                    <template slot-scope="{ row, column, $index }">
+                        <el-button @click="removeField($index)" size="small" type="text">删除</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+
+            <span slot="footer" class="dialog-footer">
+
+                <el-button @click="advancedQuery" :loading="$store.state.fetchingData">确定</el-button>
+            </span>
+        </el-dialog>
+
+        <el-dialog title="排序" :visible.sync="showTableSortDialog">
+            <el-button @click="addSortField" type="text" icon="el-icon-plus">添加</el-button>
+            <el-table :data="tableSortFields">
+
+                <el-table-column prop="name" label="字段" align="center">
+                    <template slot-scope="{row}">
+                        <el-select v-model="row.name">
+
+                            <el-option v-for="item in advancedQueryColumns" :label="item.label" :value="item.value"
+                                       :key="item.value"></el-option>
+                        </el-select>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="order" label="排序" align="center">
+                    <template slot-scope="{row}">
+                        <el-select v-model="row.order">
+                            <el-option label="降序" value="desc">
+                            </el-option>
+                            <el-option label="升序" value="asc">
+                            </el-option>
+                        </el-select>
+                    </template>
+                </el-table-column>
+                <el-table-column width="60" align="center">
+                    <template slot-scope="{ row, column, $index }">
+                        <el-button @click="removeSortField($index)" size="small" type="text">删除</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+
+            <span slot="footer" class="dialog-footer">
+
+                <el-button @click="tableSortQuery" :loading="$store.state.fetchingData">确定</el-button>
+            </span>
+        </el-dialog>
+
+        <el-dialog title="查看图片" :visible.sync="imageDialogVisible" size="small">
+            <img width="100%" :src="imgSrc" alt="">
+        </el-dialog>
+
+    </div>
+</template>
+<script>
+    import {mapState} from 'vuex'
+    import {format} from 'date-fns'
+    import zh from 'date-fns/locale/zh_cn'
+
+    export default {
+        created() {
+            this.getData();
+        },
+        data() {
+            return {
+                totalNumber: 0,
+                totalPage: 10,
+                currentPage: 1,
+                pageSize: 20,
+                tableData: [],
+                filter1: '',
+                filter2: '',
+                tableColumns: [
+                                                                                                                                                                                                                                                                                                                                                {
+                                label: '类型',
+                                value: 'typeFlag',
+                                show: true
+                            },
+                                                                                                {
+                                label: '名称',
+                                value: 'name',
+                                show: true
+                            },
+                                                                                                {
+                                label: '订单Id',
+                                value: 'orderId',
+                                show: true
+                            },
+                                                                                                {
+                                label: '途牛订单',
+                                value: 'tuniuOrderId',
+                                show: true
+                            },
+                                                                                                {
+                                label: '商品Id',
+                                value: 'productId',
+                                show: true
+                            },
+                                                                                                {
+                                label: '验证码',
+                                value: 'checkCode',
+                                show: true
+                            },
+                                                                                                {
+                                label: '状态',
+                                value: 'statusFlag',
+                                show: true
+                            },
+                                                                                                {
+                                label: '有效期',
+                                value: 'limitTime',
+                                show: true
+                            },
+                                                                                                {
+                                label: '用户',
+                                value: 'userId',
+                                show: true
+                            },
+                                                                                                {
+                                label: '地标Id',
+                                value: 'landMarkId',
+                                show: true
+                            },
+                                                                                                {
+                                label: '显示',
+                                value: 'showFlag',
+                                show: true
+                            },
+                                                                                                {
+                                label: '核销时间',
+                                value: 'checkTime',
+                                show: true
+                            },
+                                                            ],
+                multipleMode: false,
+                showAdvancedQueryDialog: false,
+                advancedQueryFields: [],
+                showTableSortDialog: false,
+                tableSortFields: [],
+                searchMethods: ['=', '!=', '>', '>=', '<', '<=', 'like'],
+                advancedQueryColumns: [
+                                                                                                                                                                                                                                                                                                                                                {
+                                label: '类型',
+                                value: 'type_flag'
+                            },
+                                                                                                {
+                                label: '名称',
+                                value: 'name'
+                            },
+                                                                                                {
+                                label: '订单Id',
+                                value: 'order_id'
+                            },
+                                                                                                {
+                                label: '途牛订单',
+                                value: 'tuniu_order_id'
+                            },
+                                                                                                {
+                                label: '商品Id',
+                                value: 'product_id'
+                            },
+                                                                                                {
+                                label: '验证码',
+                                value: 'check_code'
+                            },
+                                                                                                {
+                                label: '状态',
+                                value: 'status_flag'
+                            },
+                                                                                                {
+                                label: '有效期',
+                                value: 'limit_time'
+                            },
+                                                                                                {
+                                label: '用户',
+                                value: 'user_id'
+                            },
+                                                                                                {
+                                label: '地标Id',
+                                value: 'land_mark_id'
+                            },
+                                                                                                {
+                                label: '显示',
+                                value: 'show_flag'
+                            },
+                                                                                                {
+                                label: '核销时间',
+                                value: 'check_time'
+                            },
+                                                            ],
+                advancedQuerySearchKey: '',
+                orderByStr: '',
+                imgSrc: '',
+                imageDialogVisible: false,
+            }
+        },
+        computed: {
+            ...mapState(['tableHeight']),
+            selection() {
+                return this.$refs.table.selection.map(i => i.id);
+            }
+        },
+        methods: {
+            pageSizeChange(size) {
+                this.currentPage = 1;
+                this.pageSize = size;
+                this.getData();
+            },
+            currentPageChange(page) {
+                this.currentPage = page;
+                this.getData();
+            },
+            getData() {
+
+                var data = {
+                    currentPage: this.currentPage,
+                    pageNumber: this.pageSize,
+                    searchKey: this.filter1,
+                    advancedQuery: this.advancedQuerySearchKey,
+                    orderByStr: this.orderByStr,
+                }
+
+                if (this.$route.query.column) {
+                    var tempColumn = this.$route.query.column;
+                    data[tempColumn.split(',')[1]] = tempColumn.split(',')[0];
+                }
+
+                this.$http.get({
+                    url: '/userPackage/page',
+                    data: data
+                }).then(res => {
+                    if (res.success) {
+                        this.totalNumber = res.data.page.totalNumber;
+                        this.tableData = res.data.pp;
+                    }
+                })
+            },
+            isColumnShow(column) {
+                var row = this.tableColumns.find(i => i.value === column);
+                return row ? row.show : false;
+            },
+            toggleMultipleMode(multipleMode) {
+                this.multipleMode = multipleMode;
+                if (!multipleMode) {
+                    this.$refs.table.clearSelection();
+                }
+            },
+            editRow(row) {
+                this.$router.push({
+                    path: '/userPackage',
+                    query: {
+                        id: row.id,
+                        column: this.$route.query.column,
+                    }
+                })
+            },
+            operation1() {
+                this.$notify({
+                    title: '提示',
+                    message: this.selection
+                });
+            },
+            operation2() {
+                this.$message('操作2');
+            },
+            addField() {
+                this.advancedQueryFields.push({
+                    link: 'AND',
+                    name: '',
+                    searchMethod: '=',
+                    value: '',
+                });
+            },
+            removeField(i) {
+                if (this.advancedQueryFields.length > 0) {
+                    this.advancedQueryFields.splice(i, 1);
+                }
+            },
+            advancedQuery() {
+
+                this.advancedQuerySearchKey = '';
+
+                if (this.advancedQueryFields.length > 0) {
+
+                    var templist = [];
+
+                    this.advancedQueryFields.forEach(item => {
+                        if (item.link && item.name && item.searchMethod && item.value) {
+                            var tempItem = item.link + '_,' + item.name + '_,' + item.searchMethod + '_,' + item.value;
+                            templist.push(tempItem);
+                        }
+                    })
+
+                    if (templist.length > 0) {
+
+                        this.advancedQuerySearchKey = templist.join('_;');
+                    }
+                }
+
+                this.getData();
+                this.showAdvancedQueryDialog = false;
+            },
+            addSortField() {
+                this.tableSortFields.push({
+                    name: '',
+                    order: 'asc',
+                });
+            },
+            removeSortField(i) {
+                if (this.tableSortFields.length > 0) {
+                    this.tableSortFields.splice(i, 1);
+                }
+            },
+            tableSortQuery() {
+
+                this.orderByStr = '';
+
+                if (this.tableSortFields.length > 0) {
+
+                    var templist = [];
+
+                    this.tableSortFields.forEach(item => {
+                        if (item.name && item.order) {
+                            var tempItem = item.name + '_,' + item.order;
+                            templist.push(tempItem);
+                        }
+                    })
+
+                    if (templist.length > 0) {
+
+                        this.orderByStr = templist.join('_;');
+                    }
+                }
+
+                this.getData();
+                this.showTableSortDialog = false;
+            },
+            exportExcel() {
+                window.location.href = this.$baseUrl + "/userPackage/exportExcel?searchKey="
+                        + this.filter1 + "&advancedQuery=" + this.advancedQuerySearchKey+"&orderByStr=" + this.orderByStr;
+            },
+            searchData() {
+                this.currentPage = 1;
+                this.getData();
+            },
+            deleteRow(row) {
+                this.$alert('删除将无法恢复,确认要删除么?', '警告', {type: 'error'}).then(() => {
+                    return this.$http.post({
+                        url: '/userPackage/del',
+                        data: {id: row.id}
+                    })
+                }).then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                }).catch(action => {
+                    if (action === 'cancel') {
+                        this.$message.info('删除取消');
+                    } else {
+                        this.$message.error('删除失败');
+                    }
+                })
+            },
+            DateTimeFormatter(row, column, cellValue) {
+                if (cellValue) {
+                    return format(cellValue, 'YYYY/MM/DD HH:mm', {locale: zh})
+                }
+
+            },
+            DateFormatter(row, column, cellValue) {
+                if (cellValue) {
+                    return format(cellValue, 'YYYY/MM/DD', {locale: zh})
+                }
+
+            },
+            showImg(img) {
+                this.imgSrc = img;
+                this.imageDialogVisible = true;
+            },
+
+        }
+    }
+</script>
+<style lang="less" scoped>
+
+</style>

+ 10 - 0
src/main/vue/src/router/index.js

@@ -684,6 +684,16 @@ const router = new Router({
                     path: '/productInfos',
                     name: 'ProductInfos',
                     component: () => import('../pages/ProductInfos')
+                },
+                {
+                    path: '/userPackage',
+                    name: 'UserPackage',
+                    component: () => import('../pages/UserPackage')
+                },
+                {
+                    path: '/userPackages',
+                    name: 'UserPackages',
+                    component: () => import('../pages/UserPackages')
                 }
                 /**INSERT_LOCATION**/
             ]

Некоторые файлы не были показаны из-за большого количества измененных файлов