diff --git a/FunGame.Server/Controllers/DataRequestController.cs b/FunGame.Server/Controllers/DataRequestController.cs index 1e4e839..6d6de3a 100644 --- a/FunGame.Server/Controllers/DataRequestController.cs +++ b/FunGame.Server/Controllers/DataRequestController.cs @@ -1170,7 +1170,32 @@ namespace Milimoe.FunGame.Server.Controller /// private void GetOffer(Dictionary requestData, Dictionary resultData) { - // TODO + string msg = "无法获取报价,请稍后再试。"; + if (SQLHelper != null && requestData.Count >= 1) + { + long offerId = DataRequest.GetDictionaryJsonObject(requestData, OffersQuery.Column_Id); + bool apiQuery = DataRequest.GetDictionaryJsonObject(requestData, "apiQuery"); + Offer? offer = SQLHelper.GetOffer(offerId); + if (offer != null) + { + // 检查当前用户是否有权限查看(报价创建者或接收者)允许管理员使用 API 查询报价 + long userId = Server.User.Id; + if ((apiQuery && Server.User.IsAdmin) || offer.Offeror == userId || offer.Offeree == userId) + { + resultData.Add("offer", offer); + msg = ""; + } + else + { + msg = "您无权查看此报价。"; + } + } + else + { + msg = "报价不存在。"; + } + } + resultData.Add("msg", msg); } /// @@ -1180,7 +1205,31 @@ namespace Milimoe.FunGame.Server.Controller /// private void MakeOffer(Dictionary requestData, Dictionary resultData) { - // TODO + string msg = "无法创建报价,请稍后再试。"; + if (SQLHelper != null && requestData.Count >= 1) + { + long offeree = DataRequest.GetDictionaryJsonObject(requestData, OffersQuery.Column_Offeree); + long offeror = Server.User.Id; + if (offeror != 0 && offeree != 0 && offeror != offeree) + { + SQLHelper.AddOffer(offeror, offeree); + if (SQLHelper.Success) + { + long offerId = SQLHelper.LastInsertId; + Offer? offer = SQLHelper.GetOffer(offerId); + if (offer != null) + { + resultData.Add("offer", offer); + msg = ""; + } + } + } + else + { + msg = "无效的用户ID。"; + } + } + resultData.Add("msg", msg); } /// @@ -1190,7 +1239,154 @@ namespace Milimoe.FunGame.Server.Controller /// private void ReviseOffer(Dictionary requestData, Dictionary resultData) { - // TODO + string msg = "无法修改报价,请稍后再试。"; + if (SQLHelper != null && requestData.Count >= 3) + { + long offerId = DataRequest.GetDictionaryJsonObject(requestData, OffersQuery.Column_Id); + OfferActionType action = DataRequest.GetDictionaryJsonObject(requestData, "action"); + List offerorItems = DataRequest.GetDictionaryJsonObject>(requestData, "offerorItems") ?? []; + List offereeItems = DataRequest.GetDictionaryJsonObject>(requestData, "offereeItems") ?? []; + long userId = Server.User.Id; + + Offer? offer = SQLHelper.GetOffer(offerId); + if (offer != null && (offer.Offeror == userId || offer.Offeree == userId)) + { + try + { + SQLHelper.NewTransaction(); + + bool isOfferor = offer.Offeror == userId; + bool canProceed = false; + + // 根据 action 处理状态 + switch (action) + { + case OfferActionType.OfferorRevise: + if (isOfferor && (offer.Status == OfferState.Created || offer.Status == OfferState.Negotiating)) + { + SQLHelper.UpdateOfferStatus(offerId, OfferState.PendingOfferorConfirmation); + canProceed = true; + } + else msg = "当前状态不允许发起方修改。"; + break; + + case OfferActionType.OfferorConfirm: + if (isOfferor && offer.Status == OfferState.PendingOfferorConfirmation) + { + SQLHelper.UpdateOfferStatus(offerId, OfferState.OfferorConfirmed); + canProceed = true; + } + else msg = "当前状态不允许发起方确认。"; + break; + + case OfferActionType.OfferorSend: + if (isOfferor && offer.Status == OfferState.OfferorConfirmed) + { + SQLHelper.UpdateOfferStatus(offerId, OfferState.Sent); + canProceed = true; + } + else msg = "当前状态不允许发起方发送。"; + break; + + case OfferActionType.OfferorCancel: + if (isOfferor && offer.Status != OfferState.Completed && offer.Status != OfferState.Rejected && offer.Status != OfferState.Cancelled && offer.Status != OfferState.Expired) + { + SQLHelper.DeleteOfferItemsBackupByOfferId(offerId); + SQLHelper.UpdateOfferStatus(offerId, OfferState.Cancelled); + canProceed = true; + } + else msg = "当前状态不允许发起方取消。"; + break; + + case OfferActionType.OfferorAccept: + if (isOfferor && offer.Status == OfferState.Negotiating) + { + SQLHelper.UpdateOfferStatus(offerId, OfferState.NegotiationAccepted); + canProceed = true; + } + else msg = "当前状态不允许发起方同意。"; + break; + + case OfferActionType.OffereeRevise: + // 接收方修改报价 + if (!isOfferor && (offer.Status == OfferState.Sent || offer.Status == OfferState.NegotiationAccepted)) + { + // 备份 + SQLHelper.BackupOfferItem(offer); + SQLHelper.UpdateOfferStatus(offerId, OfferState.PendingOffereeConfirmation); + canProceed = true; + } + else msg = "当前状态不允许接收方修改。"; + break; + + case OfferActionType.OffereeConfirm: + if (!isOfferor && offer.Status == OfferState.PendingOffereeConfirmation) + { + SQLHelper.UpdateOfferStatus(offerId, OfferState.OffereeConfirmed); + canProceed = true; + } + else msg = "当前状态不允许接收方确认。"; + break; + + case OfferActionType.OffereeSend: + if (!isOfferor && (offer.Status == OfferState.Sent || offer.Status == OfferState.Negotiating)) + { + if (offer.NegotiatedTimes < 3) + { + SQLHelper.UpdateOfferStatus(offerId, OfferState.Negotiating); + SQLHelper.UpdateOfferNegotiatedTimes(offerId, offer.NegotiatedTimes + 1); + canProceed = true; + } + else msg = "协商次数已达上限(3次)。"; + } + else msg = "当前状态不允许接收方修改。"; + break; + + default: + msg = "无效的操作类型。"; + break; + } + + if (canProceed) + { + // 更新物品 + SQLHelper.DeleteOfferItemsByOfferId(offerId); + foreach (long itemId in offerorItems) + { + SQLHelper.AddOfferItem(offerId, offer.Offeror, itemId); + } + foreach (long itemId in offereeItems) + { + SQLHelper.AddOfferItem(offerId, offer.Offeree, itemId); + } + + offer = SQLHelper.GetOffer(offerId); + if (offer != null) + { + SQLHelper.Commit(); + resultData.Add("offer", offer); + msg = ""; + } + } + + if (msg != "") + { + SQLHelper.Rollback(); + } + } + catch (Exception e) + { + SQLHelper.Rollback(); + ServerHelper.Error(e); + msg = "修改报价时发生错误,请稍后再试。"; + } + } + else + { + msg = "报价不存在或您无权修改。"; + } + } + resultData.Add("msg", msg); } /// @@ -1200,7 +1396,114 @@ namespace Milimoe.FunGame.Server.Controller /// private void RespondOffer(Dictionary requestData, Dictionary resultData) { - // TODO + string msg = "无法回应报价,请稍后再试。"; + if (SQLHelper != null && requestData.Count >= 2) // 只需要 offerId 和 action + { + long offerId = DataRequest.GetDictionaryJsonObject(requestData, OffersQuery.Column_Id); + OfferActionType action = DataRequest.GetDictionaryJsonObject(requestData, "action"); + long userId = Server.User.Id; + + Offer? offer = SQLHelper.GetOffer(offerId); + if (offer != null && offer.Offeree == userId) + { + bool canProceed = false; + bool isNegotiating = false; + + try + { + SQLHelper.NewTransaction(); + + // 根据 action 处理状态 + switch (action) + { + case OfferActionType.OffereeAccept: + if (offer.Status == OfferState.Sent || offer.Status == OfferState.Negotiating || offer.Status == OfferState.NegotiationAccepted) + { + if (offer.Status == OfferState.Negotiating) + { + isNegotiating = true; + } + SQLHelper.UpdateOfferStatus(offerId, OfferState.Completed); + SQLHelper.UpdateOfferFinishTime(offerId, DateTime.Now); + canProceed = true; + } + else msg = "当前状态不允许接受。"; + break; + + case OfferActionType.OffereeReject: + if (offer.Status == OfferState.Sent || offer.Status == OfferState.Negotiating) + { + SQLHelper.UpdateOfferStatus(offerId, OfferState.Rejected); + SQLHelper.UpdateOfferFinishTime(offerId, DateTime.Now); + canProceed = true; + } + else msg = "当前状态不允许拒绝。"; + break; + + default: + msg = "无效的操作类型。"; + break; + } + + if (canProceed) + { + offer = SQLHelper.GetOffer(offerId, isNegotiating); + if (offer != null) + { + if (offer.Status == OfferState.Completed) + { + User? offeror = SQLHelper.GetUserById(offer.Offeror); + if (offeror != null) + { + foreach (Item item in offer.OffereeItems) + { + Item newItem = item.Copy(); + newItem.User = offeror; + newItem.IsSellable = false; + newItem.IsTradable = false; + newItem.NextSellableTime = DateTimeUtility.GetTradableTime(); + newItem.NextTradableTime = DateTimeUtility.GetTradableTime(); + offeror.Inventory.Items.Add(newItem); + } + SQLHelper.UpdateInventory(offeror.Inventory); + User offeree = Server.User; + foreach (Item item in offer.OfferorItems) + { + Item newItem = item.Copy(); + newItem.User = offeree; + newItem.IsSellable = false; + newItem.IsTradable = false; + newItem.NextSellableTime = DateTimeUtility.GetTradableTime(); + newItem.NextTradableTime = DateTimeUtility.GetTradableTime(); + offeree.Inventory.Items.Add(newItem); + } + SQLHelper.UpdateInventory(offeree.Inventory); + SQLHelper.Commit(); + resultData.Add("offer", offer); + msg = ""; + } + } + } + } + + if (msg != "") + { + SQLHelper.Rollback(); + } + } + catch (Exception e) + { + SQLHelper.Rollback(); + ServerHelper.Error(e); + msg = "回应报价时发生错误,请稍后再试。"; + } + } + else + { + msg = "报价不存在或您无权回应。"; + } + } + resultData.Add("msg", msg); } #endregion